AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Integerwert wird nicht korrekt in DB geschrieben
Thema durchsuchen
Ansicht
Themen-Optionen

Integerwert wird nicht korrekt in DB geschrieben

Ein Thema von FBrust · begonnen am 30. Okt 2002 · letzter Beitrag vom 1. Nov 2002
Antwort Antwort
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#1

Integerwert wird nicht korrekt in DB geschrieben

  Alt 30. Okt 2002, 21:05
Hallo,

ich habe folgendes Problem:

Der Code
Code:
        Showmessage('intCustID: ' + intToStr(intCustID));
        Append;
        FieldByName('ID_Link').AsInteger := intCustID;
        FieldByName('strShortName').AsString := cbxWSheet.Text;
        Post;
sollte eigentlich in das Feld 'ID_Link' eine 1 schreiben, wenn in der Variablen intCustID auch eine 1 steht. Tut er aber nicht.

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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2
  Alt 31. Okt 2002, 08:48
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?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#3
  Alt 31. Okt 2002, 19:25
Hallo MrSpock,

ich hab poste hier mal den ganzen Code (wg. Übersichtlichkeit und so...)

Code:
 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;
Zu Deinen anderen Fragen:

- 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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4
  Alt 31. Okt 2002, 20:43
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...
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#5
  Alt 1. Nov 2002, 11:47
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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#6
  Alt 1. Nov 2002, 17:23
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 .
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#7
  Alt 1. Nov 2002, 22:37
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...

Bis dann
Frank
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz