Avatar billede hrc Mester
23. juni 2008 - 10:17 Der er 5 kommentarer og
1 løsning

Opdatering af ClientDataSet

Jeg har et SQL-script der joiner mellem flere tabeller. Det betyder at nogle felter er R/O mens andre skal skrives til databasen. Jeg har en primærnøgle og behøver ikke lede efter recorden der skal opdateres.

Konstruktionen er: TwwDataSource.DataSet := TClientDataSet.Provider := TDataSetProvider.DataSet := TADOQuery

TDataSetProvider.UpdateMode = upWhereKeyOnly

og i TClienDataSet'ets felter er TField.ProviderFlags = [pfInUpdate] for de der skal opdateres, mens primærnøglefeltets står til [pfInUpdate,pfInWhere,pfInKey]. Resten af felterne er [] for de skal ikke med i scriptet der genereres.

Sådan jeg læser den sparsomme dokumentation så er det måden at gøre det på - men det fejler. Primærnøglen er et autoinc-felt og når jeg debugger så er Field.Value = Null og sammenligner jeg adressen på feltet i TClientDataSettet før ApplyUpdate og inde i Provider-unitten, så er adressen forskellig. Desuden er ProviderFlaget pludselig [pfInUpdate,pfInWhere]. Noget kunne tyde på at felterne kopieres, men at der er fejl i kopieringen.

Hvis der sidder en ClientDataSet ekspert kan jeg godt bruge et svar (et brugbart et altså)
Avatar billede hrc Mester
23. juni 2008 - 10:19 #1
Fejlmeddelelsen er: "Unable to find record. No key specified" og det skyldes at scriptet mangler "where ID = :ID)"
Avatar billede hrc Mester
23. juni 2008 - 10:47 #2
Scriptet der genereres er (har fjernet linjeskiftene):
  'update historik set tekst = ? where'
Avatar billede hrc Mester
23. juni 2008 - 15:36 #3
Det virker afgjort som en fejl i D2007 - må ind på QC og se om der er postet på denne.

Hvis man går ind i BeforeUpdateRecord kan det løses:

procedure TfrmTest.dspTestTabelBeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
begin
  case UpdateKind of
    ukModify: DeltaDS.FieldByName('ID').ProviderFlags := [pfInWhere,pfInKey];
    ukInsert: ;
    ukDelete: ;
  end;
end;

Nu skal jeg så finde ud af hvordan jeg håndterer oprettelse af en record hvor primærnøglen er et auto-inc felt. Jvf. et gammelt dokument (dn.codegear.com/print/20487) skal jeg sætte den til et negativt tal og autorefreshe - men lad os nu se om det stemmer med virkeligheden...
Avatar billede hrc Mester
23. juni 2008 - 15:37 #4
Errata: Dokumentet hedder 20847.
Avatar billede kroning Nybegynder
23. juni 2008 - 16:19 #5
Det med at sætte primærnøglen som er auto-inc til <0 er noget jeg altid har/skulle brugt i D7 med TClienDataSet inden jeg kan poste, så derfor benytter jeg denne linie i TClientDataSet´s AfterInsert:
DataSet.FieldByName('MinID').AsInteger:=-1;
Avatar billede kroning Nybegynder
23. juni 2008 - 18:33 #6
Glem min post, det er noget andet jeg bruger det til.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester