Entwickler-Ecke

Datenbanken - Frage zum "AppendRecord" - Befehl


dm - Do 17.10.02 10:53
Titel: Frage zum "AppendRecord" - Befehl
Ich möchte mit dem APPENDRECORD Befehl über ADO in einer ACCESS Datenbank einen Datensatz kopieren.

Das klappt auch wunderbar, nur bei dem Wert für NUMMER gibt er eine Fehlermeldung raus, da dieser Wert von Access automatisch vergeben wird, also den Status AUTOWERT hat, den der Anwender ja nicht ändern kann.

Mein Befehl :

Adotable1.AppendRecord ([ Adoquery1[[color=orange]'Nummer[/color]'] , Adoquery1['Händlername'] , ... , Date ,Adoquery1['Artikelnummer']]);


Wie kann ich den Befehl so abändern, dass er das Feld "Nummer" nicht zu überschreiben versucht, sondern Feld "NUMMER" von ACCESS vergeben lässt, die Inhalte der restlichen Felder aber dann mit dem APPENDRECORD Befehl ausgefüllt werden ?


Ist sicher ganz simple, nur finde ich in der Delphi-Hilfe keine entsprechende Antwort.


Gruß DM


dm - Do 17.10.02 10:55
Titel: So lautet der Befehl
Mein Befehl :

Adotable1.AppendRecord ([ Adoquery1['Nummer'] , Adoquery1['Händlername'] , ... , Date ,Adoquery1['Artikelnummer']]);


Also, wer weiss ne Lösung ?


NetSpider - Do 08.02.07 12:37

Hm... ueber 4 Jahre keine Antwort... Ich hab jetzt das selbe Problem mit diesem Auto-Wert-Feld.

Und geloest: Das Feld, welches man aussparen moechte muss mit nil gekennzeichnet werden. Dann klappts.


aladin60 - Mo 11.08.08 13:26

Ich habe folgende Lösung gefunden, die neben autoInc-Feldern auch berechnete Felder einer über ADO angesprochenen Datenmenge berücksichtigt. Ich will Euch das nicht vorenthalten:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure DuplicateCurrentRecord(aDataSet : TDataSet);
var
  i : integer;
  a : array of variant;
begin
  if aDataSet.Active then
  begin
    SetLength(a, aDataSet.FieldCount);
    for i := 0 to aDataSet.FieldCount - 1 do a[i] := aDataSet.Fields[i].AsVariant;
    aDataSet.Append;
    for i := 0 to aDataSet.FieldCount - 1 do
      if (aDataSet.Fields[i].AutoGenerateValue <> arAutoInc) and
         (aDataSet.Fields[i].FieldKind = fkData)
         then aDataSet.Fields[i].AsVariant := a[i];
  end;
end;


Eine Zuweisung von NULL (Unit Variants) an die "gefährlichen Felder" bringt auch einen Fehler. Wichtig ist nun, dass berechnete Felder in der Felddefinition (wie in der OH beschrieben) mit fkInternalCalc attributiert werden.

Viel Glück
Bernd.