AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDac CopyDataSet kopiert nicht den PK
Thema durchsuchen
Ansicht
Themen-Optionen

FireDac CopyDataSet kopiert nicht den PK

Ein Thema von Kostas · begonnen am 4. Aug 2015 · letzter Beitrag vom 4. Aug 2015
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.063 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 10:56
Hallo Uwe, in der Form sind alle vier Querys enthalten. Was könntest du meinen?

Auch coStructure hab ich versucht leider ohne Erfolg.
FDQuery2.CopyDataSet(FDQuery1, [coStructure, coRestart, coAppend, coEdit]); Gruß Kostas

[Edit]
oh, muss ich revidieren. coStructure scheint zu funktionieren wenn der PK ein Integer ist.
Bei BigInt funktioniert es nicht. Ich habe es vorhin immer nur mit BigInt ausprobiert.
Angehängte Grafiken
Dateityp: png Bild4.png (9,6 KB, 2x aufgerufen)

Geändert von Kostas ( 4. Aug 2015 um 11:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.051 Beiträge
 
Delphi 12 Athens
 
#2

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 11:04
in der Form sind alle vier Querys enthalten.
In dem Download aber nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.063 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 11:11
Sorry Uwe,
ich habe das Zip mit allen Files angehängt.

[Edit] in dem aktuellen Projekt benötige ich leider BigInt.
Die PKs auf Integer setzt ist nicht möglich.
Eine Alternative ist natürlich dynamisch das SQL für UPDATE OR INSERT INTO
zu generieren und auf CopyDataSet zu verzichten.
Angehängte Dateien
Dateityp: zip CopyDataSet.zip (105,9 KB, 9x aufgerufen)

Geändert von Kostas ( 4. Aug 2015 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.051 Beiträge
 
Delphi 12 Athens
 
#4

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 13:08
So sollte es sowohl mit Integer als auch BigInt gehen (auch ohne coStructure):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fld: TField;
begin
  fld := FDQuery2.FieldByName('KONTAKTID');
  PrepareAutoIncField(fld);
  FDQuery2.CopyDataSet(FDQuery1, [coRestart, coAppend, coEdit]);
  RestoreAutoIncField(fld);
  FDQuery2.refresh;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fld: TField;
begin
  fld := FDQuery4.FieldByName('KONTAKTID');
  PrepareAutoIncField(fld);
  FDQuery4.CopyDataSet(FDQuery3, [coRestart, coAppend, coEdit]);
  RestoreAutoIncField(fld);
  FDQuery4.refresh;
end;

procedure TForm1.PrepareAutoIncField(AField: TField);
begin
  if AField is TFDAutoIncField then begin
    (AField as TFDAutoIncField).IdentityInsert := true;
  end
  else begin
    AField.AutoGenerateValue := TAutoRefreshFlag.arNone;
    AField.ProviderFlags := [pfInUpdate, pfInWhere, pfInKey];
  end;
end;

procedure TForm1.RestoreAutoIncField(AField: TField);
begin
  if AField is TFDAutoIncField then begin
    (AField as TFDAutoIncField).IdentityInsert := false;
  end
  else begin
    AField.AutoGenerateValue := TAutoRefreshFlag.arAutoInc;
    AField.ProviderFlags := [pfInWhere, pfInKey];
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.063 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 14:00
Tausend Dank Uwe,

so funktioniert es.

Ich habe in dem Projekt mehrere Stellen in denen ich CopyDataSet
nutze. Es ist bis jetzt nicht aufgefallen. Würdest du das als Bug
bezeichnen? Oder warum gibt es keine Option dieses Verhalten zu steuern? Zumindest habe ich jetzt verstanden dass das zusammenhängt
mit den AutoInc Feldern.

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.051 Beiträge
 
Delphi 12 Athens
 
#6

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 14:07
Würdest du das als Bug
bezeichnen?
Formell ist es kein Bug, denn die Felder werden ja korrekt in das lokale DataSet geschrieben. Daß dieses die Felder nicht in die DB zurückschreibt hat mit CopyDataSet gar nichts zu tun, sondern trifft ja auch für andere Änderungen an diesen Feldern zu.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.063 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: FireDac CopyDataSet kopiert nicht den PK

  Alt 4. Aug 2015, 14:44
Hallo Uwe,

ich konnte jetzt nachstellen das die Ursache wie du schon sagtest nicht CopyDataSet ist sondern FireDac und dessen Query.
Ich habe in meinem Code nachgeschaut wo ich CopyDataSet verwende.
Es ist immer so das ich ein DataSet über einen DataSnap Server bekomme
und diesen in einer MemTable oder direkt verarbeite. Ich schreibe
also nie über die Query in die DB. Deshalb hat es bis jetzt funktioniert.
Dass die Query mein übergebener PK einfach ignoriert war mir nicht
klar. Ich habe all die Jahre IBO verwendet und da ist es nicht so.
Wenn ich ein PK(AutoInc) Feld ein Wert übergebe, wird dieser auch zur
Datenbank transportiert, ansonsten feuert er selbst den Generator
unmittelbar vor dem Schrieben in die DB.

Das war jetzt für mich eine sehr sehr wichtige Lehrstunde.
Tausend Dank nochmals Uwe.



Delphi-Quellcode:
function TForm1.MyCopyDataSet(Qu,Zi:TFDQuery):Boolean;
var n:Integer;
begin
  Qu.First;
  while not Qu.Eof do
  begin
    Zi.Insert;
    for n:=0 to Qu.FieldCount-1 do
    begin
      Zi.FieldByName(Qu.Fields[n].FieldName).value := Qu.Fields[n].value;
    end;
    Zi.Post;
    Qu.next;
  end;
  result:=true;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06: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