![]() |
Datenbank: Interbase • Version: 2 • Zugriff über: dbExpress
Datenmenge weder im Editier noch im Einfügemodus
Sorry Soll heißen: Interbase Ver. 6.0
Nachdem ich nun mehrere Tage mit dem Fehler zugebracht habe und eigentlich alles gelesen und ausprobiert habe, komme ich nicht weiter. Ich hoffe dass mir jemand weiterhelfen kann.
Delphi-Quellcode:
Weiß jemand Rat?
sql:='Select * from Teil2710 where ART_SCHN = '''+EDSch.text+''';';
With DataModule1.CDSArtikel do begin if DataModule1.SQLDSArtikel.Active=True then DataModule1.SQLDSArtikel.Active:=False; if Active=True then Active:=False; DataModule1.SQLDSArtikel.commandText:=sql; DataModule1.SQLDSArtikel.Active:=True; Active:=True; DataModule1.SQLDSArtikel.refresh; refresh; if recordcount=1 then begin FieldByName('ART_GR').asstring:=Art_grp; //<<hier kommt der beschriebene Fehler FieldByName('ART_NR').asstring:=Art_Num; if State<>dsEdit then Edit; FieldByName('Bemerkung').asstring:=Bem; FieldByName('ART_GR').asstring:=Art_Grp; FieldByName('ART_NR').asstring:=Art_Num; Post; ApplyUpdates(-1); end else Showmessage('Die Bemerkung konnte nicht eingetragen werden'); active:=False; DataModule1.SQLDSArtikel.Active:=False; Art_Grp:=''; Art_Num:=''; edSch.Text:=''; b_merker:=False; |
AW: Datenmenge weder im Editier noch im Einfügemodus
Tja, du solltest das Edit 2 Zeilen hoch schieben...
Frank |
AW: Datenmenge weder im Editier noch im Einfügemodus
Delphi-Quellcode:
FieldByName('ART_GR').asstring:=Art_grp; //<<hier kommt der beschriebene Fehler
FieldByName('ART_NR').asstring:=Art_Num; if State<>dsEdit then Edit; // << weil du hier erst in den Editiermodus umschaltest FieldByName('Bemerkung').asstring:=Bem; FieldByName('ART_GR').asstring:=Art_Grp; FieldByName('ART_NR').asstring:=Art_Num; Post; |
AW: Datenmenge weder im Editier noch im Einfügemodus
Du versuchst zuerst, 2 Felder zu ändern, bevor Du in den Editiermodus wechselst?
[edit] Im Übrigen ist der Code ziemlich unübersichtlich, das with trägt dazu nicht unerheblich bei. Und zu Vergleichen mit true/false sollten sich reichlich Threads finden lassen, in denen erklärt wird, wieso man das nicht machen sollte. [/edit] |
AW: Datenmenge weder im Editier noch im Einfügemodus
Oh mann,
das ist ein klarer Fehler, aber so ist das wenn man auf seinen eigenen Wald schaut, sieht man nichts. Der Code sieht jetzt so aus
Delphi-Quellcode:
Was meint er mit Table unknown? Natürlich kennt er die tabelle, mit der arbeite ich weiter oben ja ständig.
sql:='Select * from Teil2710 where ART_SCHN = '''+EDSch.text+''';';
With DataModule1.CDSArtikel do begin if DataModule1.SQLDSArtikel.Active=True then DataModule1.SQLDSArtikel.Active:=False; if Active=True then Active:=False; DataModule1.SQLDSArtikel.commandText:=sql; DataModule1.SQLDSArtikel.Active:=True; Active:=True; DataModule1.SQLDSArtikel.refresh; refresh; if recordcount=1 then begin Art_grp:=FieldByName('ART_GR').asstring; Art_Num:=FieldByName('ART_NR').asstring; if State<>dsEdit then Edit; FieldByName('Bemerkung').asstring:=Bem; FieldByName('ART_GR').asstring:=Art_Grp; FieldByName('ART_NR').asstring:=Art_Num; Post; ApplyUpdates(-1);//<<hier kommt jetzt ein anderer Fehler, Table unknown end else Showmessage('Die Bemerkung konnte nicht eingetragen werden'); active:=False; DataModule1.SQLDSArtikel.Active:=False; Art_Grp:=''; Art_Num:=''; edSch.Text:=''; b_merker:=False; end; |
AW: Datenmenge weder im Editier noch im Einfügemodus
In deinem Beispiel musst du das SQL nicht jedesmal ändern, sondern kannst mit Parametern arbeiten.
Das schützt auch vor SQL-Injection:
Delphi-Quellcode:
Scheinbar gibt es zwei Komponenten:
DataModule1.SQLDSArtikel.CommandText := 'Select * from Teil2710 where ART_SCHN = :ART_SCHN;';
DataModule1.SQLDSArtikel.ParamByName('ART_SCHN').AsString := EDSch.text; SQLDSArtikel CDSArtikel Von welcher Klasse sind diese und wie sind sie miteinander verknüpft? Welche Einstellungen sind gesetzt? |
AW: Datenmenge weder im Editier noch im Einfügemodus
Erstmal danke, Blup
SQLDSArtikel ist ein TSQLDataset CDSArtikel ist ein TClientDataSet CDSArtikel ist mit deinem TDatasetProvider mit Namen DSPArtikel verbunden. Dieser ist dann mit dem SQLDSArtikel verbunden, und dieser mit der TSQLConnection der an der Datenbank hängt. DB -> SQL -> DP ->CDS Welche Einstellungen möchtest Du gerne wissen? Der Code ist nun hoffentlich übersichtlicher, mit ohne dem With...
Delphi-Quellcode:
if b_merker=True then begin
sql:='Select * from Teil2710 where ART_SCHN = '''+EDSch.text+''';'; if Datamodul.DataModule1.SQLDSArtikel.Active=True then Datamodul.DataModule1.SQLDSArtikel.Active:=False; if Datamodul.DataModule1.CDSArtikel.Active=True then Datamodul.DataModule1.CDSArtikel.Active:=False; Datamodul.DataModule1.SQLDSArtikel.commandText:=sql; Datamodul.DataModule1.SQLDSArtikel.Active:=True; Datamodul.DataModule1.CDSArtikel.Active:=True; Datamodul.DataModule1.SQLDSArtikel.refresh; Datamodul.DataModule1.CDSArtikel.refresh; if Datamodul.DataModule1.CDSArtikel.recordcount=1 then begin Art_grp:=Datamodul.DataModule1.CDSArtikel.FieldByName('ART_GR').asstring; Art_Num:=Datamodul.DataModule1.CDSArtikel.FieldByName('ART_NR').asstring; if Datamodul.DataModule1.CDSArtikel.State<>dsEdit then Datamodul.DataModule1.CDSArtikel.Edit; Datamodul.DataModule1.CDSArtikel.FieldByName('Bemerkung').asstring:=Bem; Datamodul.DataModule1.CDSArtikel.FieldByName('ART_GR').asstring:=Art_Grp; Datamodul.DataModule1.CDSArtikel.FieldByName('ART_NR').asstring:=Art_Num; Datamodul.DataModule1.CDSArtikel.Post; Datamodul.DataModule1.CDSArtikel.ApplyUpdates(-1);//<<Table unknown end else Showmessage('Die Bemerkung konnte nicht eingetragen werden'); Datamodul.DataModule1.CDSArtikel.active:=False; Datamodul.DataModule1.SQLDSArtikel.Active:=False; Art_Grp:=''; Art_Num:=''; edSch.Text:=''; b_merker:=False; end; |
AW: Datenmenge weder im Editier noch im Einfügemodus
Ok, ich habs....
Ich wusste nicht, das Interbase Groß.- und Kleinschreibung beachtet..... Vielen Dank an Alle, die versuchten mir zu helfen... |
AW: Datenmenge weder im Editier noch im Einfügemodus
Mir ist an deinem Code aufgefallen, daß du zuerst die beiden Felder ART_NR und ART_GR ausliest, um im Editmodus genau diese beiden Werte wieder in genau diese Felder reinzuschreiben. Das ergibt irgendwie keinen Sinn: Wenn du diese beiden Werte nicht ändern möchtest, mußt du diese beiden Felder auch nicht anfassen.
Delphi-Quellcode:
// Art_grp:=Datamodul.DataModule1.CDSArtikel.FieldByName('ART_GR').asstring;
// Art_Num:=Datamodul.DataModule1.CDSArtikel.FieldByName('ART_NR').asstring; if Datamodul.DataModule1.CDSArtikel.State<>dsEdit then Datamodul.DataModule1.CDSArtikel.Edit; Datamodul.DataModule1.CDSArtikel.FieldByName('Bemerkung').asstring:=Bem; // Datamodul.DataModule1.CDSArtikel.FieldByName('ART_GR').asstring:=Art_Grp; // Datamodul.DataModule1.CDSArtikel.FieldByName('ART_NR').asstring:=Art_Num; Datamodul.DataModule1.CDSArtikel.Post; |
AW: Datenmenge weder im Editier noch im Einfügemodus
Du kannst die Zeilen mit
Delphi-Quellcode:
einfach ersetzen durch
if SomeDataset.Active {= True} then
SomeDataset.Active := False;
Delphi-Quellcode:
Ist die Datenmenge geöffnet, dann wird die geschlossen, ansonsten bleibt die geschlossen.
// Dataset soll geschlossen sein
SomeDataset.Active := False; Dein Code bläht das nur um eine zusätzliche und unnötige Abfrage auf. In deinem Code ist auch die Abfrage auf den State unnötig, denn kurz vorher öffnest du die Datenmenge und dann ist die gesichert niemals im
Delphi-Quellcode:
State.
dsEdit
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 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