Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenmenge weder im Editier noch im Einfügemodus (https://www.delphipraxis.net/179913-datenmenge-weder-im-editier-noch-im-einfuegemodus.html)

hirsch 10. Apr 2014 11:59

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:
       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;
Weiß jemand Rat?

dataspider 10. Apr 2014 12:20

AW: Datenmenge weder im Editier noch im Einfügemodus
 
Tja, du solltest das Edit 2 Zeilen hoch schieben...

Frank

baumina 10. Apr 2014 12:21

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;

DeddyH 10. Apr 2014 12:21

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]

hirsch 10. Apr 2014 12:32

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:
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;
Was meint er mit Table unknown? Natürlich kennt er die tabelle, mit der arbeite ich weiter oben ja ständig.

Blup 10. Apr 2014 12:46

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:
  DataModule1.SQLDSArtikel.CommandText := 'Select * from Teil2710 where ART_SCHN = :ART_SCHN;';

  DataModule1.SQLDSArtikel.ParamByName('ART_SCHN').AsString := EDSch.text;
Scheinbar gibt es zwei Komponenten:
SQLDSArtikel
CDSArtikel
Von welcher Klasse sind diese und wie sind sie miteinander verknüpft?
Welche Einstellungen sind gesetzt?

hirsch 10. Apr 2014 12:52

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;

hirsch 10. Apr 2014 13:18

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...

Perlsau 10. Apr 2014 14:22

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;

Sir Rufo 10. Apr 2014 15:22

AW: Datenmenge weder im Editier noch im Einfügemodus
 
Du kannst die Zeilen mit
Delphi-Quellcode:
if SomeDataset.Active {= True} then
  SomeDataset.Active := False;
einfach ersetzen durch
Delphi-Quellcode:
// Dataset soll geschlossen sein
SomeDataset.Active := False;
Ist die Datenmenge geöffnet, dann wird die geschlossen, ansonsten bleibt die geschlossen.
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:
dsEdit
State.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.
Seite 1 von 2  1 2      

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