[Delhi] Beginners probleem met triggers

Pagina: 1
Acties:

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04-2025
Ik ben pas geleden gevraagd om delphi te gaan doen, dus heb er nog niet heel veel verstand uit maar gelukkig kan ik veel vinden op internet. Alleen hier kom ik niet goed uit.

Ik heb als eerste een trigger die een ID voor mij genereerd de code hiervan is :

code:
1
2
3
4
begin
  if ( (new.DEBID is null) or (new.DEBID = 0) )
  then new.DEBID = gen_id(DEBITEUREN_GEN, 1);
end


nu gebruik ik in delphi Ttabels. Als ik daar nu een nieuw record wil hebben gebruik ik tabelnaam.insert maar als ik nu naar dat id kijk heeft die geen waarde. Als ik nu het record wil toevoegen krijg ik een fout melding. Het DEBID mag geen null zijn. Ik snap niet wat ik fout doe of waar ik moet zoeken. Kan een van jullie helpen?

Windsoft


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-04 22:35

Creepy

Tactical Espionage Splatterer

Je zult het veld in de database moeten definieren als zijnde een autonummering veld o.i.d. Hoe dit precies moet verschilt per database.

Dat een veld niet null mag zijn en jij hem leeg laat betekent niet automatisch dat de DB hem maar voor je gaat invullen ;). Je krijgt dan (terecht) een melding dat je het veld leeg laat.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 00:45

Delphi32

Heading for the gates of Eden

@Creepy: zo te zien is dit een Interbase/Firebird trigger die het autoincrement-getal ophaalt. Veel meer kan je daar niet aan doen met IB :)

@JoostMartijn: maak persistent fields op je TTable (rechtsklik TTable component -> Fields Editor -> rechtsklik -> Add All Fields) en zet bij je DEBID veld de fieldtype op ftAutoInc en het zou geregeld moeten zijn. Op die manier vertel je Delphi dat die het veld DEBID niet zelf moet vullen (in jouw geval leeglaten) maar dat de database dat verder afhandelt.

Verwijderd

Even een algemene opmerking: een Delphi TTable in combinatie met een Client/Server database is "not done" Beter is het om queries te gebruiken om enkel de data die relevant is binnen te halen.

Wat dat betreft ben ik het ook oneens met Delphi32. Beter is het een insert in twee delen te doen
1) Haal een nieuw record ID op via GEN_ID
2) Sla het record wat je wilt opslaan inclusief record ID op in de database.

Of gebruik een trigger om het record ID toe te voegen aan het record. In dat geval weet je client applicatie niet welk record ID wordt toegevoegd.

Dat laatste heeft voor en nadelen. Het voordeel is dat het onafhankelijk is van de client, het nadeel dus dat de client van niets weet.

In praktijk lijkt dit meestal wel te werken

Definieer een trigger als volgt

(Pseudocode)
if recordID- null then
RecordID - gen_id(tabel,1)
end if

Definieer dus in je trigger alleen een nieuw record ID als het huidig record ID = null

Dit laat zowel applicaties volgens methode 1 als 2 toe.