Symbol eXtension » Adatbázis elérés

“Adatbázis elérés” bejegyzések.

5. SQL Select futtatása

posted in: Adatbázis elérés (Tags: , , , ) - No Comments

SyX beépülőben általában nincs szükség arra, hogy általunk írt SELECT lekérdezést futtassunk, de néha elengedhetetlen. Amennyiben a SyX készítője tisztában van az adatmodellel és ismeri a Firebird SQL szintaktikáját, akkor az EntityHandler.ExecuteQuery() metódussal a futtatás megoldható.

Példa egy SELECT futtatására, ahol csak a SELECT miatt hozunk létre egy adatbáziskapcsolatot:

   using (EntityHandler handler = CreateEntityHandler(false))
                return handler.ExecuteQuery(“SELECT * FROM “”Customer”” c”);

4. Üzleti logika a beépülőkben

posted in: Adatbázis elérés (Tags: , , , ) - No Comments

A SyX beépülők entitás technológiájának előnye, hogy üzleti logika köthető hozzá és a már meglévő üzleti logikát nem kell újra megvalósítani.

Entitás osztályok kibővítése

Az SDK részét képező entitás osztályok partial class-kétn kerültek megvalósításra, így a SyX-ek maguk tartalmazhatnak további üzleti logikákat, amelyekkel a gyári funkaiconalitást bővíteni lehet. Például:

A ToString() metódus felülírható (override), ezáltal a gyáritól eltérő viselkedés hozható létre.

Új metódusokat lehet létrehozni, amelyek az adott entitás osztályhoz köthetőek. Például adatellenőrzés.

Új property-ket lehet létrehozni, amelyek nem kerülnek tárolásra, de valamilyen speciális funkcióval bírhatnak. Páldául a Customer osztályt AddressConcatenate property-vel bővítve a cím mezők egymás után fűzött szöveges mezőként is rendelkezésre állnak, például két vevő összehasonlításához vagy rendezéséhez.

Entitásgyűjtemény osztályok kibővítése

Az entitás osztályokhoz hasonlóan az entitásgyűjtemény osztályok is kibővíthetőek új metódusokkal, property-kkel.

Eredeti üzleti logika alkalmazása

Mivel az entitások a Symbol Ügyvitel alkalmazás memóriaterületén jönnek létre, az ott használt üzleti logika automatikusan alkalmazásra kerül, azt kikerülni nem is lehet. Például:

  • Rendszerbeállítástól függően, az új vevő/szállító (Customer) adatok létrehozásukkor automatikusan kapnak kódot. Ez a működés akkor is igaz, amikor CustomerAdapter.CreateNewObject() vagy CustomerAdapter.CreateEmptyCollection.AddNew() hatására egy új objektum jön létre.
  • Számla dátumainak módosításakor, számla mód (ÁFA58, gyűjtőszámla) függvényében automatikusan beállításra kerülnek a dátumok.
  • Bizonylatok tételeinek módosításakor a bizonylat fejben tárolt nettó. áfa, bruttó összegek automatikusan kiszámolásra kerülnek. A kerekítési szabályok a beállított pénznem alapján kerülnek alkalmazásra.

3. Adapter = Entitások létrehozása

posted in: Adatbázis elérés (Tags: , , ) - No Comments

Az entitások önmagukban reprezentálnak egy sort az adatbázisban, objektumként minden mezőhőz hozzáférési lehetőséget biztosítanak. Mindezt típusosan. Az entitásoknak azonban valahogy létre kell jönniük. Önállóan, a new Customer() nem alkalmas arra, hogy az entitás létrejöjjön.

Az EntityHandler példány annyi Adaptert tartalmaz, ahány féle táblánk van az adatbázisban. A Customer entitás kezeléséhez az EntityHandler.CustomerAdapter, a Product entitás-hoz pedig az EntityHandler.ProductAdapter lesz segítségünkre. Az adapterek az alábbi metódusokat tartalmazzák (a metódushívások a using (EntityHandler handler = CreateEntityHandler()) blokkon belül értendőek):

  • CustomerCollection CreateEmptyCollection(): Üres entitásgyűjtemény létrehozása, amelyhez entitásokat adhatunk hozzá vagy a gyűjtemény AddNew() metódusát meghívva új entitást hozhatunk létre benne.
  • Customer CreateNewObject(): Új entitás példány létrehozása önállóan. Az entitás nem egy gyűjteményben jön létre, önállóan létezik.
  • CustomerCollection SelectAll(): Összes entitás lekérdezése és elhelyezése egy entitás gyűjteménybe. (WHERE nélküli SELECT). Amennyiben az entitásnak van Deleted mezője, úgy a SelectAll() paramétere a ShowDeleted, amely alapján eldől, hogy minden elemet vagy csak a nem törölteket jelenítsük meg.
  • Customer SelectByPK(long id): Adott ID-jú elem beolvasása és létrehozása önálló entitásként.
  • CustomerCollection SelectByCondition(WhereClause whereclause): Megadott SQL WHERE szűrőfeltételeknek megfelelő adatbázis sorok kiolvasása a táblából.

 

WhereClause?

A WhereClause egy típusos WHERE feltétel megírását támogató eszköz. Amennyiben a tábla és mezőneveket pontosan kívánjuk megadni, úgy célszerű használni az XXXField konstansokat.

Például:

                    WhereClause wc = CustomerField.Phone == “20-555-7845” | CustomerField.Name == “Csaba”;
                    CustomerCollection cc = handler.CustomerAdapter.SelectByCondition(wc & CustomerField.PaymentMethod != 12);

2. Minden adat = entitás

posted in: Adatbázis elérés (Tags: , , , , ) - No Comments

Az entitás jellegű megközelítési mód minden adatot típusos formában enged kezelni. Ennek elsődleges célja és előnye, hogy nem tudunk mezőnév elírás miatt nem létező adatra hivatkozni, a projekt fordítésa során pedig már a fejlesztőkörnyezetben hibát kapunk, ha nem létező mezőre hivatkozunk. Külön kiemelendő, hogy az idegen kulcsokon való kapcsolódás is erősen típusos formában valósul meg.

 

Entitások
Minden adat egy-egy entitás objektum. Egy létrehozott vagy betöltött vevő egy Customer objektum példányként kezelhető. A Customer objektumban megtalálható minden mező, amely az adatbázisban rendelkezésre áll. Ezek a mezők a megfelelő típussal rendelkeznek.

  

Például:

    Customer c = handler.CustomerAdapter.CreateNewObject();
    c.Name = “Sample”; // string mező, mert az adatbázisban VARCHAR(100)
    c.SaveChanges(); // adatok mentése, csak implicit módban van rá szükség

Minden entitás rendelkezik az alábbi metódusokkal:

  • Delete(); // adat törlése; a rendszer figyelembe veszi, hogy az entitást fizikailag kell törölni, vagy csak logikailag (deleted=0)
  • Display(); // adat megjelenítése a szerkesztőablakában (nem minden entitásra érhető el)
  • DisplayAsDialog(); // adat megjelenítése a szerkesztőablakában modálisan (nem minden entitásra érhető el)

Az entitáshoz kapcsolódó idegen kulcsok elérhetőek objektumok szintjén (entitás) is. Például a Customer.PaymentMethod tartalmazza a vevő fizetési módjának ID-ját, míg a Customer.PaymentMethodObj a fizetési módot objektumként engedi elérni. Így láncoltan érhetőek el az adatok: Customer.PaymentMethodObj.DiscountPercent => vevő fizetési módjának kedvezmény mértéke.

 

Entitásgyűjtemények

Egynél több entitás gyűjteménybe szervezhető. A CustomerCollection például több vevőt fog össze. A gyűjtemények mentésekor a gyűjtemény minden elemének mentése megtörténik. A gyűjtemények felhasználási módjai:
 

  • Üres gyűjtemény létrehozása új adat hozzáadása céljából: CustomerCollection.AddNew();
  • Minden adat lekérdezése: Minden fizetési mód lekérdezésekor PaymentMethodCollection típusú objektum jön létre.
  • Szűrt adathalmaz lekérdezése: “A” betűvel kezdődő nevű vevők lekérdezéskor CustomerCollection jön létre.
  • Kapcsolódó gyermekobjektum gyűjtemények: Egy entitás objektum gyermek objektumaihoz való hozzáférés során is gyűjteményeket kapunk. Customer.ChildDocumentByCustomer a Document tábla azon entitás sorait adja vissza, amelyek ehhez a vevőhöz tartoznak. Fontos kiemelni, hogy a gyerekgyűjteményekhez való hozzáadás esetén a szülőre mutató hivatkozás beállítása kerül, a Customer.ChildDocumentByCustomer.AddNew() metódushívás során egy olyan dokumentum entitás jön létre, amelynek mentésekor a vevőhöz fog tartozni.

Gyűjtemények műveletei:

  • Indexelés: A gyűjtemény tömbként indexelhető.
  • AddNew(): új objektum létrehozása a gyűjteményben.
  • Count: elemek száma.
  • Filter és Find: adott feltételnek megfelelő elemek (Find esetén első elem) kiválasztása a gyűjtemény szűkítésével.

 

 

1. Adatbázis kapcsolat kiépítése

posted in: Adatbázis elérés (Tags: , ) - No Comments

A SyX beépülők nem kell, hogy “kézzel” hozzanak létre adatbázis kapcsolatot. Minden adat elérhető típusos, entitás jellegű formában. Ehhez elég egy metódus meghívni és felépül az adatbázis kapcsolat.

A CreateEntityHandler metódus hasznlatával az alábbi módon hozhatunk létre adatbázis kapcsolatot:

                using (EntityHandler handler = CreateEntityHandler())
                {
                     …

                }

A létrehozozz adatbázis kapcsolatot minden esetben using kulcsszóval kell használni, hogy szigorúan vezéreljük a kapcsolat bezárását. A Microsoft Entity Framework-höz hasonlóan az EntityHandler példány ideje alatt minden adatbázis elemhez hozzáférhetünk, azokat módosíthatjuk, majd az EntityHandler megszűnésekor a változások rögzítésre kerülnek az adatbázisban.

Az EntityHandler használata során létrehozott adatok csak addig érhetőek el, amíg az EntityHandler létezik!

Meddig tartsam nyitva az adatbázis kapcsolatot?

Az adatbázis kapcsolatot addig kell és szabad nyitva tartani, amíg arra szükség van. Az alábbi ökölszabélyokat célszerű figyelembe venni:

  • Adatbázis kapcsolatot az első adat elérése előtt létre kell hozni
  • Adatbázis kapcsolatot az utolsó adathoz való hozzáférés után meg kell szüntetni
  • Egy metódushíváson belül nem célszerű több alkalommal létrehozni az adatbázis kapcsolatot, inkább a using blokkot kell úgy szervezni, hogy az hosszabb ideig legyen nyitva.
  • Nem szabad egymásba ágyazott adatbázis kapcsolatot létrehozni
  • Egy adatbázis kapcsolaton belüli adatmentés (kivéve az implicit esetet) egy tranzakcióban valósul meg

Nem akarok minden adatok menteni

Lehetőség van arra is, hogy az EntityHandler használata során betöltött és megváltoztatott adatok ne kerüljenek mentésre. Ilyenkor a CreateEntityHandler(false) hívási módot kell használnunk. Az adatok mentését implicit módon, a SaveChanges() meghívásával kell elvégeznünk.

A using nélkül használt EntityHandler-re a Symbol Tech Kft. nem adja ki a SyX tanúsítványt!