Autor Beitrag
hirsch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 21.09.11 16:05 
Meine Modify bringt immer die Fehlermeldung, dass der Parametername nicht definiert sei.
RadStudio2007/Delphi per IBX auf die Interbase6.0

Was fehlt mir hier?

Mein Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
with Datamodule1 do begin
        cds.First;
        CDS.Active:=False;
        CDS.SelectSQL.Clear;
        CDS.SelectSQL.Add('Select * From Teil2710 WHERE ART_NR='+art+'');
        CDS.Active:=True;
        CDS.ModifySQL.Clear;
        CDS.ModifySQL.Add('UPDATE TEIL270 SET:ART_SCHN = :'''+SCHArt+''' WHERE ART_NR = '''+art+'''');
        Showmessage(CDS.ModifySQL.Text); //Zum gucken was wirklich drin steht
        CDS.ExecSQL;  //Hier erscheint die Fehlermeldung
        CDS.ApplyUpdates;
        CDS.Refresh;
      end;



SQL Analysefehler:
Parametername' erwartet aufgetreten


Danke für alle Antworten.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 434
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mi 21.09.11 16:36 
UPDATE TEIL270 SET:ART_SCHN ...

Der Doppelpunkt muß weg, und der danach (vor den Quotes) auch
hirsch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 22.09.11 08:26 
Hallo Mandras,
vielen Dank für Deinen Tipp.
Nun habe ich das da:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
      with Datamodule1 do begin
        cds.First;
        CDS.Active:=False;
        CDS.SelectSQL.Clear;
        CDS.SelectSQL.Add('Select * From Teil2710 WHERE ART_NR='+art+'');
        CDS.Active:=True;
        CDS.ModifySQL.Clear;
        CDS.ModifySQL.Add('UPDATE TEIL2710 SET ART_SCHN = '''+SCHArt+''' WHERE ART_NR = '''+art+'''');
        CDS.Open;
        if cds.CanModify=True then
          Showmessage ('Canmodify ist True')
        else
          Showmessage ('Canmodify ist False');
        CDS.ExecSQL;  //<- hier kommt: 'Verwenden Sie Open für eine Selectanweisung'
        CDS.ApplyUpdates;
        CDS.Refresh;
        Showmessage('Art: '+cds.FieldByName('ART_NR').AsString+' |Grp: '+cds.FieldByName('ART_GR').AsString+' |SchnorrNr: '+cds.FieldByName('ART_SCHN').AsString);
      end;


Nun bin ich etwas verwirrt, denn da ist doch das Modify, aber keine Select.
Vorher kommt aber noch, dass das canModify TRUE ist.
Das CDS.Open habe ich nur mal so zum testen reingemacht, ich denke es kann nicht schaden.
Warum ist Interbase so böse zu mir?
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 434
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Fr 23.09.11 11:48 
Ein CDS ist sozusagen eine IBQuery mit integriertem IBUpdate (ganz stark vereinfacht).
Das bedeutet:
Wenn es geöffnet wird wird SELECTSQL zum holen der Daten genommen,
beim Löschen eines Satzes DELETESQL etc.

In Deinem Fall würde ich die Statements mit dem DatasetEditor erzeugen
(evtl. Dein SelectSQL vorher sichern und später wieder verwenden), das Modify sieht dann etwa so aus:

"Update Teil2710 set F1 = :F1, F2 = :F2, ... where ART_NR= :ART_NR"

Dann kannst Du mittels
CDS.Edit; CDS.FieldByName ('ART_GR').AsString := "abc"; ...; CDS.Post;

den aktuellen Satz ändern. Intern bastelt das CDS dann durch Parametersubstitution aus dem ModifySQL
die passenden SQL-Befehle