Delphi firedac firebird dbgrid

Delphi firedac firebird dbgrid
2022-02-16T21:10:05+01:00
2022-02-18T20:48:29+01:00
2022-10-15T21:21:39+02:00
csanesz
Sziasztok!

Létrehoztam egy firebird adatbázist, benne egy táblát. Az első mező a táblában egy rowid mely primary key not null jellemzőkkel bír. Létrehoztam hozzá triggert és generátort is before insert eseménnyel. Ha a db gridben fel akarok vinni egy új rekordot akkor szól hogy a rowid nem lehet null. Ha before inserttel hoztam létre akkor miért nem ad neki értéket?
Fdconnection, datasource, fdquery, dbgrid vannak a formon. Lehet ott van a gond hogy fdtable kellene fdquery helyett?
Mondjuk queryben jobb egy sql összedobni mint a table filterjeben.

Köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Ez azért van, mert az fdquery-ben, azaz a táblában az első mező, azaz az ID "required" tulajdonsága alapból = True.
Tehát érzékeli, hogy ennek nem szabadna NULL-nak lennie, ezért már a Delphi nem engedi elmenteni.

Két dolgot tudsz csinálni:
1. Kikapcsolod, hogy False legyen. (Dupla klikk a komponensen > feldobja a mezőlistát > ott az ID > properties > Required = False -ra állítod.)

2. Beállítod az ID mezőnél a Generatot- azaz a Delphi létrehozáskor fogja külön lekérni a generátor soron következő értékét, és nem a trigger fogja adatbázis szinten hozzáadni.

- Ez utóbbi annyival jobb, hogy rögtön látszódni fog mentéskor az érték, nem csak Commit + open után, azaz tudod, milyen azonosítót kapott a sor.
- Egyben annyival rosszabb, hogy plusz 1 SQL műveletet végez.
 (Ha hálózaton dolgozol, bizonytalan kapcsolattal, akkor minden művelet sql 1-1 probléma forrása.)
Mutasd a teljes hozzászólást!

  • Azt gondolom, hogy a rácsban lévő új sor rögzítése nem jut el a db-ig.

    Egyébként pedig tessék nem dbcontrol-okra bízni az adatrögzítést, hanem rendes, szerveroldali megoldást használni.
    Mutasd a teljes hozzászólást!
  • Ez azért van, mert az fdquery-ben, azaz a táblában az első mező, azaz az ID "required" tulajdonsága alapból = True.
    Tehát érzékeli, hogy ennek nem szabadna NULL-nak lennie, ezért már a Delphi nem engedi elmenteni.

    Két dolgot tudsz csinálni:
    1. Kikapcsolod, hogy False legyen. (Dupla klikk a komponensen > feldobja a mezőlistát > ott az ID > properties > Required = False -ra állítod.)

    2. Beállítod az ID mezőnél a Generatot- azaz a Delphi létrehozáskor fogja külön lekérni a generátor soron következő értékét, és nem a trigger fogja adatbázis szinten hozzáadni.

    - Ez utóbbi annyival jobb, hogy rögtön látszódni fog mentéskor az érték, nem csak Commit + open után, azaz tudod, milyen azonosítót kapott a sor.
    - Egyben annyival rosszabb, hogy plusz 1 SQL műveletet végez.
     (Ha hálózaton dolgozol, bizonytalan kapcsolattal, akkor minden művelet sql 1-1 probléma forrása.)
    Mutasd a teljes hozzászólást!
  • Amúgy NEM javasolt, hogy egy rácsba közvetlenül automatikusan szúrj be adatokat!

    Gyakorolni a kezdetben ez jó, de ha "ipari", azaz stabil alkalmazást akarsz csinálni, akkor inkább:
    - Csinálj egy külön Panelt ,
    - ahol "üresen" kitöltik az adatokat,
    - majd ezeket összegyűjtve a Mentés gombra kattintva meghívsz egy közvetlen adatbázis művelettel egy INSERT sql utasítást.

    Hivatalosan nem javasolt egy tranzakciót sokáig nyitva hagyni.
    Tehát :
    1. kapcsoat + tranzakció megnyit
    2. Insert
    3. Bezár.
    4. Megnyit + olvas + megjelenít + Bezár.

    Több meló, de hosszútávon MEGÉRI !

     (Ha grid-et használsz, akkor az nem zárja be, azaz folyamatosan nyitva van a kapcsolat.

     Tehát ha megszakad a Wifi, vagy a net, vagy megáll a switch, mert ráraktak egy zacskót és túlmelegedett, akkor lefagy az egész program.)
    Mutasd a teljes hozzászólást!
  • Köszönöm a hasznos tanácsokat!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd