Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   delphi datenmenge weder im editier- noch im einfügemodus (https://www.delphipraxis.net/169222-delphi-datenmenge-weder-im-editier-noch-im-einfuegemodus.html)

RalfSi 5. Jul 2012 15:24

Datenbank: PostgreSQL • Version: 9.1 • Zugriff über: TPgTable

delphi datenmenge weder im editier- noch im einfügemodus
 
Hallo,

das leidige Thema im Betreff noch einmal, da ich einfach nicht erkennen kann, wo der Fehler liegt:

Code:
ExcelApp.Workbooks.Open(dateiname);
  dmkunden.tblkundendaten.Connection.StartTransaction;
  if not (dmkunden.tblkundendaten.State in [dsInsert]) then
        dmkunden.tblkundendaten.Insert; //das zumindest macht er

  try
  begin
       
        dmkunden.tblkundendatenanrede.AsString     := ExcelApp.Cells[5, iPers].Value;
        dmkunden.tblkundendatentitel.AsString      := ExcelApp.Cells[6, iPers].Value;
        dmkunden.tblkundendatennachname.AsString   := ExcelApp.Cells[7, iPers].Value;
        dmkunden.tblkundendatengeburtsname.AsString := ExcelApp.Cells[8, iPers].Value;
        //weitere Zuweisungen
  end;

  if dmkunden.tblkundendaten.State in [dsInsert] then dmkunden.tblkundendaten.Post;
 
  //^^State = dsInsert(!) und daher will er den Post ausführen und hierbei erscheint die im Betreff genannte Fehlermeldung.
     
  dmkunden.tblkundendaten.Connection.Commit;
  result:=true;
  [...]
Ich danke schon einmal jetzt für Tipps.

himitsu 5. Jul 2012 15:39

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
[edit]
Mist

shmia 5. Jul 2012 15:53

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
Bei deinem Code geht nicht richtig hervor, was du eigentlich tun möchtest.
Möchtest du grundsätzlich immer einen Datensatz einfügen oder möchtest du
eine Edit/Einfügen-Strategie fahren?

Diese Edit/Einfügen Strategie kommt recht häufig vor und sieht so aus:
Delphi-Quellcode:
Query.close;
query.Parameters.ParamValues['Keyfeld'] = keyfeld;
Query.Open;
// die Query liefert genau einen Datensatz oder eine leere Datenmenge zurück

if Query.IsEmpty then
begin
  Query.Append; // nicht Insert verwenden; Insert ist langsamer als Append!
  Query['Keyfeld'] := ...;
end
else
  Query.Edit;

// Datenfelder mit neuen Daten befüllen
query['Feld1'] := ...;
....

Query.Post;

Bummi 5. Jul 2012 16:01

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
irgend ein ungünstig programmiertes Event z.B. in OnBeforPost, OnCalcFields o.ä.

jobo 5. Jul 2012 16:21

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
Bin mir nicht ganz sicher, aber wie sieht es aus, wenn Du im Edit statt im Insert Modus bist. Das ist nicht Insert, die Prüfung/ Logik kommt zu einem falschen Ergebnis.
Dazu passt dann evtl. der Rest deines Ablaufs nicht. Bist Du Dir sicher, dass es genau an der Stelle knallt, wo du es einkommentiert hast?

RalfSi 7. Jul 2012 14:49

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
Danke Bummi, der Hinweis hat mich auf die Idee gebracht - machmal sieht man den Wald vor lauter Bäumen nicht - das bislang tadellos funktionierende Programm mit einer leeren DB zu prüfen. Und damit funktionierte es wieder wie gewünscht. Irgendetwas scheint nun mit der DB nicht zu stimmen, das werde ich ergründen müssen. Da in dem Projekt keine FKs etc. verwendet wurden und fortlaufende PKs manuell erzeugt werden, wird's wohl mühselig werden, die Stelle zu ergründen und wie es dazu kommen konnte.

Danke an alle für die Tipps.

Gruß

Medium 8. Jul 2012 03:30

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
Zitat:

Zitat von RalfSi (Beitrag 1173682)
Delphi-Quellcode:
if not (dmkunden.tblkundendaten.State in [dsInsert]) then

Ich weiss nicht, ob das zur Problemlösung beiträgt, aber ich würde hier dringend umdrehen:
Delphi-Quellcode:
if not (dsInsert in dmkunden.tblkundendaten.State) then
Das gleiche auch später nochmals. Grund: Bei deiner Variante wird nur "true" erzielt, wenn "State=dsInsert", du möchstet aber eigentlich "dsInsert ist Teilmenge von State". (Ich vermute in dem 2. Vorkommen dieser Prüfung ist "State" = [dsInsert, dsEditing] oder so, weswegen das einen Unterschied machen könnte.)

Sir Rufo 8. Jul 2012 07:07

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
Delphi-Referenz durchsuchenTDataSet.State ist kein SET sondern ein ENUM und kann somit immer nur in einem Zustand sein.
Delphi-Referenz durchsuchenTDataSetState

Im ersten Beitrag bin ich etwas verwundert über das Konstrukt
Delphi-Quellcode:
try
begin

end
Wenn hier schon mit Transaktionen gearbeitet wird, dann sollte das in einem try ... except Block stehen.
Delphi-Quellcode:
MyDataSet.StartTransaction;
try
  ...
  MyDataSet.Commit;
except
  MyDataSet.Rollback;
end;
Des weiteren ist es fraglich, warum überhaupt geprüft wird, ob sich die Datenmenge im Einfügemodus befindet. Wenn, dann sollte diese Prüfung vor StartTransaction erfolgen, denn sonst ist ja ein Teil der Datenänderung ausserhalb und ein anderer Teil innerhalb der Transaktion.

Auch wenn dieses Konstrukt so irgendwie funktioniert, habe ich meine Zweifel an der Zuverlässigkeit des Codes.

Es wäre gut mal die gesamte Routine zu sehen (die Zuweisungen können verkürzt sein), dann kann man da mehr zu sagen.

Furtbichler 8. Jul 2012 10:35

AW: delphi datenmenge weder im editier- noch im einfügemodus
 
Zitat:

Zitat von Medium (Beitrag 1173927)
Zitat:

Zitat von RalfSi (Beitrag 1173682)
Delphi-Quellcode:
if not (dmkunden.tblkundendaten.State in [dsInsert]) then

Ich weiss nicht, ob das zur Problemlösung beiträgt, aber ich würde hier dringend umdrehen:
Delphi-Quellcode:
if not (dsInsert in dmkunden.tblkundendaten.State) then
Das gleiche auch später nochmals. Grund: Bei deiner Variante wird nur "true" erzielt, wenn "State=dsInsert", du möchstet aber eigentlich "dsInsert ist Teilmenge von State". (Ich vermute in dem 2. Vorkommen dieser Prüfung ist "State" = [dsInsert, dsEditing] oder so, weswegen das einen Unterschied machen könnte.)

Korrekt wäre
Delphi-Quellcode:
If Not (myTable.State in dsEditModes) then


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 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