Autor Beitrag
Grave_digger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 800

win98, winXP
D4 Standard; D6 Personal
BeitragVerfasst: 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..

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 800

win98, winXP
D4 Standard; D6 Personal
BeitragVerfasst: 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

ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
wolfman
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 04.01.05 09:06 
Ich benutze folgende Routine:
ausblenden volle Höhe Delphi-Quelltext
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; // prüft, ob eine geöffnete Tabelle leer ist
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 // Quelle geöffnet und nicht leer ?
// Daten ins Zwischen-Array schreiben
    SetLength(arr, qQuelle.FieldCount);
    for cnt := 0 to qQuelle.FieldCount - 1 do begin
      arr[cnt] := qQuelle.Fields[cnt].AsVariant;
    end;
// Im Ziel einen neuen Datensatz anlegen
    qZiel.Append;
// und füllen
    for cnt := 0 to qZiel.FieldCount - 1 do begin
      qZiel.Fields[cnt].AsVariant := arr[cnt];
    end;
// Soll gleich gespeichert werden oder der Datensatz zur Bearbeitung "offen" bleiben?
    if Speichern then begin
      qZiel.Post;
    end;
  end;
end;
jaevencooler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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



BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.