Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: TClientDataSet: AutoInc auch wirklich automatisch inc-en

  Alt 2. Jan 2007, 09:05
Zitat von SMALLID:
Hi nochmal. Ok vllt. habe ich dann doch was falsch verstanden. 2 Zeilen wären ja schon super! Ich setze aber am Anfang für jede Tabelle erstmal den funiqueid wert, indem ich durchiteriere mit
Na gut, die Initialisierung ist vielleicht noch dazuzurechnen.
Zitat von SMALLID:
...
aber ggf. geht es noch anders?
Bisher habe ich immer nur Paradox Tabellen benutzt und in diesem Fall nutze ich MyBase, weil ich da weder BDE noch ADO Support auf dem Zielrechner brauche. Dachte eigentlich, dass jeder das TClientDataset für lokale DBs nimmt, oder ist da ODBC/ADO nach Access doch simpler?
Erstens geht es einfacher und zweitens ist ADO sowieso auf jedem Windows-PC installiert. Ich würde persönlich (aber nur bei Einzelplatzanwendungen) Access per ADO verwenden. Für Standard-Anwendungen reicht das Dicke und macht die Entwicklung zum Kinderspiel.

Delphi-Quellcode:
Function GetMaxID (aTable : TDataset; IDField : String) : Integer;
Var
  fField : TField;
  B : TBookmark;
Begin
  Result := -maxInt;
  fField := aTable.FieldByName(IDField);
  aTable.DisableControls;
  aTable.GetBookmark (B);
  Try
    aTable.First;
    While not aTable.Eof Do Begin
      If Result < fField.AsInteger Then
        Result := fField.AsInteger;
      aTable.Next;
    End;
  Finally
    aTable.GotoBookmark (B);
    aTable.FreeBookmark (B);
    aTable.EnableControls;
  End;
End;
Im DataModuleCreate wird für alle Tabellen dann GetMaxID aufgerufen und der Wert in den privaten Feldern gespeichert. Noch einfacher ist es, die MaxID in der Tag-Eigenschaft der Tabelle zu speichern:
Delphi-Quellcode:
Procedure TMyDataModule.DataModuleCreate (Sender : TObject);
Begin
  Table1.Tag := GetMaxId (Table1);
  Table2.Tag := GetMaxId (Table2);
  Table3.Tag := GetMaxId (Table3);
  Table4.Tag := GetMaxId (Table4);
  Table1.OnNewRecord := TMyDataModuleNewRecrd;
  Table2.OnNewRecord := TMyDataModuleNewRecrd;
  Table3.OnNewRecord := TMyDataModuleNewRecrd;
  Table4.OnNewRecord := TMyDataModuleNewRecrd;
End;

Procedure TMyDataModule.DataModuleCreate (Sender : TDataset);
Begin
  Sender.Tag := Sender.Tag + 1;
  Sender[IDField] := Sender.Tag;
End;
Ich würd trotzdem Access nehmen. Ist doch schön stabil (bei einer Einzelplatzanwendung).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat