Autor |
Beitrag |
Grave_digger
      
Beiträge: 33
|
Verfasst: Di 04.03.03 16:06
wie die Überschrift es schon sagt ich möchte einen datensatz bis auf den Index kopieren aber innerhalb der Datenbank
ich bitte wieder um etwas Quelltext weil ich damit das meiste anfangen kann
mfg
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: Di 04.03.03 17:26
hallo grave_digger!
wo willst denn den datensatz duplizieren? in der selben tabelle
oder in eine andere tabelle in derselben datenbank?
wenn es in der selben tabelle sein soll, dann sieh dir mal 'AppendRecord' an..
Quelltext 1:
| Customer.AppendRecord([CustNoEdit.Text,CoNameEdit.Text, AddrEdit.Text, Null, Null, Null, Null, Null, Null, DiscountEdit.Text]); |
nur solltest vorher deinen primär-index anpassen, sonst.....
mfg, stefan
|
|
Grave_digger 
      
Beiträge: 33
|
Verfasst: Di 04.03.03 17:37
in die selbe tabelle brauch ich die daten aber die Datenbank hat ca. 65 Felder wer soll das alles schreiben gibt es noch eine andere loesung?
mfg
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: Di 04.03.03 17:47
die anzahl der felder in der datenbank ist ja dabei egal, es geht lediglich um die feldanzahl in der tabelle, in welcher du herumkopieren willst.
na ok... du könntest dir eine temporäre tabelle mit derselben struktur anlegen, den/die zu duplizierenden sätze dorthinein kopieren, und nach anpassung des indices die daten zurückkopieren
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i := 0 to Table1.FieldCount - 1 do begin TempTable.Append; TempTable.Fields.Fields[i].AsString := Table1.Fields.Fields[i].AsString; TempTable.Post; end; |
und dann satz für satz, in der benötigten anzahl, zurückkopieren
mfg, stefan
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|
wolfman
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 04.01.05 02:14
Aha !!! Und danach das eigentliche "Append" in der Orig.Tabelle aufrufen und dorthin kopieren, einige Felder ggf. ändern und dann "Refresh".
O.K.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 04.01.05 09:06
Ich benutze folgende Routine:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| Function DBEmpty(dts : TDataSet) : Boolean; begin Result := not dts.Active; if not Result then begin Result := dts.eof and dts.bof; end; end;
procedure KopiereAktuellenDatensatzMitAppend(qQuelle, qZiel : TDataset; Speichern : Boolean); var cnt : Integer; arr : array of variant; begin if qQuelle.Active and (not DBEmpty(qQuelle)) then begin SetLength(arr, qQuelle.FieldCount); for cnt := 0 to qQuelle.FieldCount - 1 do begin arr[cnt] := qQuelle.Fields[cnt].AsVariant; end; qZiel.Append; for cnt := 0 to qZiel.FieldCount - 1 do begin qZiel.Fields[cnt].AsVariant := arr[cnt]; end; if Speichern then begin qZiel.Post; end; end; end; |
|
|
jaevencooler
      
Beiträge: 166
Erhaltene Danke: 6
MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
|
Verfasst: Di 04.01.05 10:30
Hallo,
also Ich würde das mit einem Insert Statement abarbeiten, ist auf einer datenbank eigentlich der schnellste Weg.
also etwa so:
Quelltext 1: 2: 3: 4:
| insert into Zieltabelle select * from Quellentabelle where Bedingung1 = Bedingung1 and Bedingung2 = Bedingung2 |
Wenn Du alle Felder kopieren willst, dann brauchst Du nach dem Insert into keine Feldauswahl treffen. Wenn Du nur eine bestimmte feldauswahl kopieren möchtest, dann die entsprechenden Felder wie folgt kopieren:
Quelltext 1: 2: 3: 4: 5:
| insert into Zieltabelle (Feld1,Feld2,Feld3...) select (Feld1,Feld2,Feld3...) from Quellentabelle where Bedingung1 = Bedingung1 and Bedingung2 = Bedingung2 |
Gruß
Michael
_________________ Wissen ist Macht, nichts wissen macht auch nichts...
|
|
wolfman
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 06.01.05 00:52
(Habe oben wohl Mist verstanden.) Im Source-Vorschlag ganz oben sind aber wohl zwei Fehler: Append und Post müssen doch wohl aus der Schleife heraus. Also im Prinzip: Recordwerte in Array, Append, im Array Wert für Indexfield auf eindeutigen Wert ändern, Array-Inhalt in "appendeten" neuen Record kopieren und dann Post.
Ich habe das mal für alle Felder mittls Typumwandlung probiert, ich bleibe aber immer an der oft erwähnten Meldung "EDBError Indexfehler" mit Runtime-Fehler hängen und am verzweifeln.
Da ist der neue Weg über Feldindex und Varianten sehr viel eleganter (aber im Prinzip ja ebenso)!! Danke. 
|
|
wolfman
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 06.01.05 16:16
Wenn in dem o.a. Source Ein- und Ausgabe-Datei identisch sind, gibt's im Primärindex natürlich einen Fehler (Doppelter Wert), wenn der record geschrieben werden soll. Abhilfe schafft ein weiterer Parameter z.B. String und Eintrag via .AsString vor abschließendem Post.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 06.01.05 16:24
Oder bei meiner Variante für den Parameter Speichern False übergeben. Dann kann man noch das Index-Feld verändern, bevor man dann manuell speichert, also den Post-Befehl gibt.
|
|