Autor Beitrag
Masterjoh
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20

Win XP Professional
D7 Architect
BeitragVerfasst: Do 16.06.05 10:53 
Einen wunderschönen...!

Habe ein Problem beim Einfügen der Daten in eine ADOTable. Sobald ich Post aufrufe, tritt die oben genannte Fehlermeldung auf. Hole mir die Daten sowohl über eine Query, als auch über den Zugriff direkt auf die einzelnen Ado-Tabellen. Da die ensprechenden Zeile bereits zuvor eingefügt wird und sich auf einem anderen Formular befindet, setze ich die Zeile zunächst über locate in den Editiermodus.

Hier mal das Code Bsp.:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
begin

  //Kommission entfernen
  SQLText := 'Update Bestellungen set Kommission = ''0'' ';
  SQLText := SQLText + 'WHERE NOT EXISTS (SELECT Kommission FROM BestellArtikel ';
  SQLText := SQLText + 'WHERE Kommission = ''1'' AND BestellArtikel.BestNr = :@lBestNr1) ';
  SQLText := SQLText + 'AND Bestellungen.BestNr = :@lBestNr2';
  dmLager.qrBestMenge.SQL.Text := SQLText;
  dmLager.qrBestMenge.Parameters.ParamByName('@lBestNr1').Value := bestellungsNr;
  dmLager.qrBestMenge.Parameters.ParamByName('@lBestNr2').Value := bestellungsNr;
  dmLager.qrBestMenge.ExecSQL;
  dmLager.qrBestMenge.Close;

//Zeile markieren und in den Editiermodus gehen
  myBestNr := Copy('0000000' + IntToStr(bestellungsNR), Length(IntToStr(bestellungsNr)) + 17);
  if dmLager.tbBestellungen.Locate('BestNr', myBestNr, [loCaseInsensitive]) then
    dmLager.tbBestellungen.Edit;

  //Mitarbeiter
  dmLager.tbBestellungen.FieldByName('MitarbName').Value := UserName;

  //Mandant
  dmLager.tbBestellungen.FieldByName('Mandant').Value := Mainform.REGMANDANT_1;

  //Filiale
  dmLager.tbBestellungen.FieldByName('Filiale').Value := MainForm.REGFILIALE;

  //LagerNr
  dmLager.tbBestellungen.FieldByName('LagerNr').Value := dbedLagerNr.Text;

  dmLager.tbBestellungen.Post;

  //Fenster schließen
  close;
end;


Für Hilfe wäre ich sehr dankbar!

Gruß,
Johannes
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 16.06.05 11:12 
ADO meint, das die Kommissionsnr noch '1' ist. Mit dem UPDATE setzt Du sie auf '0'.

Danach machst Du ein Edit/Post, was zu einem dämlichen Update führt. Dämlich deshalb, weil da steht (sinngemäß):
UPDATE Tabelle SET EinFeld='NeuerWert' WHERE ID=1234 AND EinFeld='AlterWert' AND Kommision='1'

Die Update-Bedingung besteht nicht nur aus dem Primary key, sondern aus allen Feldern. Das war auch mein Problem, weswegen ich ADO diesbezüglich auf den Mond schiessen könnte! Ich habe noch nicht rausbekommen, wie man das mit Bordmitteln hinbekommt. Ich mache das mittlerweile ohne ADO.

Du vertauscht müsstest deine tbBestellungen neu laden, bevor Du über Edit/Post die Daten änderst. Dann kannst Du aber gleich ein manuelles Update schreiben und deine tbBestellung neu laden.
Masterjoh Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20

Win XP Professional
D7 Architect
BeitragVerfasst: Do 16.06.05 11:27 
Ich fürchte ich verstehe nicht ganz. Die Query funktioniert soweit, so wie sie da steht, falls dass gemeint ist. Liegt es also daran, dass das Update nicht sofort ausgeführt wird, nachdem das "execsql" aufgerufen wird und es deshalb mit dem anderen update kolidiert?
Oder wo liegt deiner Meinung nach der Fehler?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 16.06.05 11:42 
In tbBestellungen hast Du ein Paar Daten, sagen wir, genau eine Zeile mit Kommissionsnummer = 1.
Per update (qrBestMenge) setzt Du nun im Server die Kommissionsnr auf 0. In der Tabelle tbBestellungen steht aber immer noch der alte Wert. Nun willst Du diesen Eintrag überarbeiten. Es wird ein UPDATE-Befehl erzeugt, der eben so aussieht:
ausblenden Quelltext
1:
UPDATE Tabelle SET Wert=Neu WHERE Wert=Alt and KommissionsNr=1					

Diese Zeile gibt es doch gar nicht mehr, weil Du vorher auf dem Server die Kommissionsnr auf 0 geändert hast.

Beispiel:
Du machst Ein Photo von ein Paar Menschen. Die haben blonde Haare. Einer heisst Horst. Das Photo ist deine tbBestellungen.

Nun sagst Du "Leute, färbt euch die Haare rot".

Anschließend sagst Du (anhand des Photos) "Alle Menschen, die Horst heissen und blonde(!) Haare haben, ziehen sich eine Mütze auf". Ergebnis: Keine Sau reagiert. Denn Du hast ja noch das Photo, das nicht mehr aktuell ist...
Masterjoh Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20

Win XP Professional
D7 Architect
BeitragVerfasst: Do 16.06.05 12:21 
Hallo alzaimar,

danke für die lustige und aufschlussreiche Erklärung! Du hast recht, aber nur zum Teil, es liegt tatsächlich daran, das die Table noch nicht die aktualisierten Daten hat, aber es liegt nicht daran was ich in der Query mache. Die Query setzt dort die Kommission auf null, wo die BestellungsNr(Primärschlüssel von Bestellungen) der Bestellung und der der zu bestellenden Artikel übereinstimmt und es keinen "BestellArtikel" gibt, der den Wert eins in der Kommission hat.

Ich danke dir sehr, denn du hast mich auf den eigentlichen Fehler aufmerksam gemacht, denn es muss nach der Query ein Refresh der Tabelle, bzw. weil es in dem fall nicht ging, ein Aktive := false, Active := true, gemacht werden, da er sonst ein 'bad Update' macht.

Vielen Dank nochmal!