![]() |
Integerwert wird nicht korrekt in DB geschrieben
Hallo,
ich habe folgendes Problem: Der Code
Code:
sollte eigentlich in das Feld 'ID_Link' eine 1 schreiben, wenn in der Variablen intCustID auch eine 1 steht. Tut er aber nicht.
Showmessage('intCustID: ' + intToStr(intCustID));
Append; FieldByName('ID_Link').AsInteger := intCustID; FieldByName('strShortName').AsString := cbxWSheet.Text; Post; Der Showmessage-Befehl zeigt eine 1, aber in der Tabelle steht nachher im Feld 'ID_Link' eine 0. Der Wert für 'strShortname' hingegen wird korrekt übertragen. Das Feld 'ID_Link' ist ein Integer-Feld, kein Index, gar nix und trotzdem steht jedesmal eine 0 drinnen. Warum nur? Hat vielleicht jemand eine Erklärung dafür? Grüsse Frank |
Hallo Frank,
der Code ist in Ordnung. Offensichtlich benutzt du noch einen with Block, da du den Namen des TTable Objektes weglässt. Benutzt du ein TTable oder ein TQuery Objekt? Welche Datenbank? Ist ID auch wirklich kein AutoInc oder Zähler Feld? Welche ID hat der zweite Satz, den du einfügst? |
Hallo MrSpock,
ich hab poste hier mal den ganzen Code (wg. Übersichtlichkeit und so...)
Code:
Zu Deinen anderen Fragen:
with dmGeneral.tblSD_Buildings do begin
if Active then Active := False; Filtered := False; Active := True; //----Prüfen, ob bereits ein Gebäude für diesen Kunden mit diesem // Namen existiert: blBuilding := Locate('strShortName;ID_Link',VarArrayOf([cbxWSheet.Text,intCustID]),[]); if blBuilding then begin //------Fehlerroutine: Es muss nachgefragt werden, ob die Räume dem bereits // vorhandenen Gebäude hinzugefügt werden sollen oder ob ein neues Gebäude // erzeugt werden soll. strMsgText := 'Achtung: Das Gebäude "' + cbxWSheet.Text + '" '; strMsgText := strMsgText + 'ist für diesen Kunden bereits vorhanden!'; strMsgText := strMsgText + #13#10#13#10; strMsgText := strMsgText + 'Mit Klick auf JA werden die Räume dem '; strMsgText := strMsgText + 'bereits bestehenden Gebäude hinzugefügt.'; strMsgText := strMsgText + #13#10#13#10; strMsgText := strMsgText + 'Mit Klick auf NEIN wird ein neues Gebäude '; strMsgText := strMsgText + 'mit dem gleichen Namen angelegt.'; strMsgText := strMsgText + 'Sie sollten dieses Gebäude später '; strMsgText := strMsgText + 'zur besseren Unterscheidung umbenennen.'; intAnswer := Application.MessageBox(PChar(strMsgText), PChar('Wichtiger Hinweis'), MB_YESNOCANCEL + MB_ICONQUESTION); case intAnswer of IDYES: ; IDNO : begin //-----------------Neues Gebäude hinzufügen und ID feststellen: Append; FieldByName('ID_Link').AsInteger := intCustID; FieldByName('strShortName').AsString := cbxWSheet.Text; Post; end; IDCANCEL: exit; end; end else begin //------Neues Gebäude hinzufügen und ID feststellen: Showmessage('intCustID: ' + intToStr(intCustID)); Append; FieldByName('ID_Link').AsInteger := intCustID; FieldByName('strShortName').AsString := cbxWSheet.Text; Post; end; - Es ist eine TTable - Die Datenbank ist Paradox 7 (BDE) - intCustID ist wirklich nur ein Integer-Feld, kein AutoInc, Index o. ä. - Welcher zweite Satz? Meinst Du das zweite Feld (strShortname)? Grüsse Frank |
Hallo Frank,
das ist wirklich komisch. Also zunächst einmal solltest du sicherstellen, dass auch der else Pfad durchlaufen wird (Debugger mit Breakpoint). Sollte er wirklich diese Stelle durchlaufen, prüfe den Wert von intCustID mit dem Debugger. Mit zweitem Satz meinte ich: wenn du einen weiteren Datensatz in die Tabelle einfügst, welche ID bekommt dieser? Da die DB keinen Fehler meldet, sind auch noch andere Ideen, die ich habe nicht möglich... |
Hallo MrSpock,
gestern abend kurz vorm Einschlafen kam ich auf die Lösung: Normalerweise wird das Feld ID_Link im BeforePost-Ereignis der Tabelle mit dem ID-Wert des übergeordneten Kundendatensatzes besetzt (sozusagen handgemachte Relationalität). Da in diesem speziellen Fall zu diesem Zeitpunkt die Kundentabelle geschlossen ist, ist der Wert, der in ID_Link geschrieben wird, eben 0. Also wird zuerst die FieldByName...-Anweisung aus dem obigen Code ausgeführt und dann die aus der BeforePost-Routine. Zur Lösung muss nur zum Zeitpunkt des Abspeicherns des Datensatzes im obigen Beispiel die Kundentabelle geöffnet sein und der Datensatzzeiger auf dem passenden Kundendatensatz stehen, den Rest erledigt die BeforePost-Routine. Tja, das ist, denke ich, einer der Haken bei OOP á la Delphi: In jeder Ecke kann ein Stück Code liegen, dass man längst vergessen hat, weil es ja seit längerem funktioniert, das aber dann zu undurchsichtigen Ereignissen führt. Wie dokumentiert man eigentlich solchen Code? Viele Grüsse Frank |
Hallo Frank,
gut, dass du die Lösung gefunden hast. Ich hatte mir schon eine Blase ans Gehirn gedacht und sah schon fast aus wie ein Klingone :mrgreen: . |
Hallo MrSpock,
bei den Gefahren, die Dir da drohten, bin ich auch froh über die Lösung. Denn aussehen wie ein Klingone, das kann man einem Vulkanier nun wirklich nicht antun... :wink: Bis dann Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz