Delphi-PRAXiS

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

Kevin11 15. Nov 2011 14:20

Datenbank: Firebird • Version: 2 • Zugriff über: dbX

clientdataset datenmenge weder im editier noch im einfügemodus
 
Hallo,

ich bekomme den Fehler, der im Titel steht in folgender Funktion:

Delphi-Quellcode:
function AddPELehrg(_Bereich: string;_ID: Integer; _Nr, _Name, _Lehrgang, _Von, _Bis, _Ort: String; _Best :integer): Boolean;
var
  VZqLehrgänge      : TClientDataSet;
  VZqTemp           : TADOQuery;
begin
Result := True;

  Form2.Memo1.Lines.Add(#9#9#9+'Lehrgänge');


  Result := False;

  VZqLehrgänge       := Form2.ClientDataSet1;
  with VZqLehrgänge do
  begin
    Close;
//    Connection := FFBConnection;
    CommandText   := 'SELECT * FROM '+_Bereich+'_LEHRG';
    Open;

    if not Active then
      Active := True;

    if (State <> dsEdit) or (State <> dsInsert) then
    begin
      Edit;
    end
    else
    begin
      Insert;
    end;
          FieldByName(_Bereich+'_ID').Value             := GetMaxID(_Bereich+'_LEHRG', Form2.SQLConnection);

          FieldByName(_Bereich+'_INDEX').Value          := _ID;
          FieldByName(_Bereich+'_NR').Value             := GetString(_Nr,  15);
          FieldByName(_Bereich+'_NAME').Value           := GetString(_Name, 30);

          FieldByName(_Bereich+'_LEHRG_LANG').Value      := _Lehrgang;

          try
//            if _Von <> '' then
            if Length(_Von) = 10 then
            begin
              FieldByName(_Bereich+'_ZEITRAUM_VD').AsString    := _Von;
            end;
          except
          end;
          try
            if Length(_Bis) = 10 then
              FieldByName(_Bereich+'_ZEITRAUM_BD').AsString    := _Bis;
          except
          end;

          FieldByName(_Bereich+'_LEHRG_ORT').Value      := _Ort;


          FieldByName(_Bereich+'_LEHRG_OK').Value     := _Best;

        ApplyUpdates(0);
        Post;

    Close;
  end;
  Result := True;

  FreeAndNil(VZqTemp);
  FreeAndNil(VZqLehrgänge);
end;
Ich find keinen Fehler. :(

ergeka 15. Nov 2011 14:34

AW: clientdataset datenmenge weder im editier noch im einfügemodus
 
Müsste das 'ApplyUpdates' nicht nach dem 'Post' stehen ?

Ralf

FrankJ28 15. Nov 2011 14:39

AW: clientdataset datenmenge weder im editier noch im einfügemodus
 
Hallo Kevin,
mir ist dein Code nicht so ganz klar:

1. Dataset wird geschlossen (close)
2. neues SQL und dann öffnen (open)
3. Active??? nach dem open ist das DS active
4. edit/insert. Soll etwas neu eingefügt oder der erste Satz überschrieben werden?
5. Felder füllen ...
6. Post zum Speichern. Aber nochmals überlegen, ob der erste Satz überschrieben (Edit) oder ein neuer eingefügt (insert) werden soll. Da du dir eine MaxId holst, tippe ich einmal auf neuen Satz

Frage: warum immer result true?

Ciao
Frank

Kevin11 15. Nov 2011 14:41

AW: clientdataset datenmenge weder im editier noch im einfügemodus
 
Doch natürlich. Immer diese Leichtsinnsfehler. :/

Vielen Dank, jetzt geht es. :thumb:

Kevin11 15. Nov 2011 14:44

AW: clientdataset datenmenge weder im editier noch im einfügemodus
 
Zitat:

Zitat von FrankJ28 (Beitrag 1136317)
Hallo Kevin,
mir ist dein Code nicht so ganz klar:

1. Dataset wird geschlossen (close)
2. neues SQL und dann öffnen (open)
3. Active??? nach dem open ist das DS active
4. edit/insert. Soll etwas neu eingefügt oder der erste Satz überschrieben werden?
5. Felder füllen ...
6. Post zum Speichern. Aber nochmals überlegen, ob der erste Satz überschrieben (Edit) oder ein neuer eingefügt (insert) werden soll. Da du dir eine MaxId holst, tippe ich einmal auf neuen Satz

Frage: warum immer result true?

Ciao
Frank

Hi Frank,

ich prüf immer ob die Funktion auch wirrklich ausgeführt wurde. Das mit dem Edit hatte ich nur testweiße in meiner Funktion, ich habe es aber schon wieder entfernt.

shmia 15. Nov 2011 15:56

AW: clientdataset datenmenge weder im editier noch im einfügemodus
 
Ich sehe da noch einige Fehler in dem Code.
Delphi-Quellcode:
...
    Close;
// Connection := FFBConnection;
    CommandText := 'SELECT * FROM '+_Bereich+'_LEHRG';
    Open;


    // überflüssiger Code, da durch "Open" die Datenmenge automatisch auf aktiv gesetzt wird
    // *********
    if not Active then
      Active := True;
    // *********

Nachdem der Tabellenname schon vom Bereich abhängt, ist es eine ganze schlechte Idee auch noch die Feldnamen vom Bereich abhängig zu machen:
Delphi-Quellcode:
...
    CommandText := 'SELECT * FROM '+_Bereich+'_LEHRG';
    Open;
...
    // Feldnamen sollten für alle Tabellen gleich sein!
    FieldByName(_Bereich+'_ID').Value := GetMaxID(_Bereich+'_LEHRG', Form2.SQLConnection);
    FieldByName(_Bereich+'_INDEX').Value := _ID;

Man sollte auch nicht Komponenten auf einem Formular mit FreeAndNil() freigeben:
Delphi-Quellcode:
...
  VZqLehrgänge := Form2.ClientDataSet1;
...
  // nicht gut - beim nächsten Mal ist das ClientDataSet weg und dann gibt es eine Zugriffsverletzung
  FreeAndNil(VZqTemp);
  FreeAndNil(VZqLehrgänge);


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