Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datansatz alle Felder kopieren (https://www.delphipraxis.net/56246-datansatz-alle-felder-kopieren.html)

needatip 2. Nov 2005 19:42

Datenbank: SQL Server • Zugriff über: ADO

Datansatz alle Felder kopieren
 
Hallo,
wie kann ich alle Felder eines Datensatzes kopieren und in einen bereits bestehenden Datensatz kopieren ?
Ich möchte keinen neuen Datensatz anfügen, sondern die Feldinhalte sollen wie gesagt in den bestehenden Datensatz kopiert werden ?

Union 2. Nov 2005 19:44

Re: Datansatz alle Felder kopieren
 
Wie wärs denn mit einem Array of variant, in das Du alle Feldinhalte reinschreibst und in den anderen Satz überträgst?

Sharky 2. Nov 2005 19:57

Re: Datansatz alle Felder kopieren
 
Hai needatip,

ich stelle ersteinmal die Frage nach dem Sinn der Aktion ;-)

Wenn Du zwei exakt gleiche Datensätze in der Tabelle hast kannst Du diese auch nicht mehr selektiv abfragen da es ja keinen Unterschied gibt. Du hast also zweimal die selben Daten in der Tabelle und kannst doch nichts damit anfangen.

needatip 2. Nov 2005 20:08

Re: Datansatz alle Felder kopieren
 
Nein, es sind keine Datensätze mit gleichen Feldinhalten.
Ich möchte lediglich beim Eintrag eines bestehenden Datensatzes erreichen, dass nicht alle Felder erneut eingegeben werden müssen, sondern dass nur nach dem Kopieren der Felder ein paar abgeändert werden müssen.

Sharky 2. Nov 2005 20:14

Re: Datansatz alle Felder kopieren
 
Zitat:

Zitat von needatip
Nein, es sind keine Datensätze mit gleichen Feldinhalten.

*g* So war es aber in deiner ursprünglichen Frage gefordert ;-)

Zitat:

Ich möchte lediglich beim Eintrag eines bestehenden Datensatzes erreichen ...
Wir müssen uns ersteinmal einigen was Du, wie meinst.
Ein bestehender Datensatz wird ja in der Tabelle nicht eingetragen. Dieser wurde schon eingetragen.

Gerade beim formulieren einer Frage zum Thema "programmieren" ist es sehr wichtig das Problem so zu beschreiben das es "jeder" verstehen und nachvollziehen kann.

Beschreibe doch mal was aus der Sicht des Anwenders passieren soll. Dann finden wir sicher auch eine Lösung für dich als Entwickler.

needatip 2. Nov 2005 20:14

Re: Datansatz alle Felder kopieren
 
Kann ich das so in etwa machen ?

Delphi-Quellcode:
var
  Felder: array of variant;
  i : integer;
  FAnzahl : integer;
begin
    FAnzahl := Table1.fields.count -1;
    for i := 0 to FAnzahl do
    Felder[i] := Table1.fields[i].value;
end;
..und wie kriege ich dann die Felder in den bestehenden Datensatz ?

Geht es vielleicht auch mit SQL ?

needatip 2. Nov 2005 20:22

Re: Datansatz alle Felder kopieren
 
Also nochmals ganz von vorne.
Ich möchte Daten in eine Tabelle eintragen, die ca. 100 Datenfelder hat.
Ein anderer User trägt vorab nur die wichtigsten Daten in einen neuen Datensatz ein.
Dieser Datensatz wird dann schon mal in die Datenbank geschrieben.
Nach einer gewissen Zeit werden dann weitere Daten gesammelt.
Da nun Datensätze mit ähnlichen Daten vorkommen, sollen die Felder halt eben in den nächsten, aber bereits bestehenden Datensatz kopiert werden. Das soll halt Tipparbeit oder Kopierarbeit sparen !

Hansa 2. Nov 2005 20:31

Re: Datansatz alle Felder kopieren
 
Gehen wir mal von Table1 (Dataset1) aus und die hat ein Feld Name. Dieser Name soll in Table2 (Dataset2) rein und zwar von allen Datensätzen. Ist das richtig ?

Also brauche ich zumindest alle Namen aus Table 1 :

Delphi-Quellcode:
Dataset1.close;
Dataset1.SelectSQL.Text := 'SELECT NAME FROM TABLE1'; // oder * für alle
Dataset1.open;
Somit stehen die Daten bereit und ich gehe sie durch :

Delphi-Quellcode:
Dataset1.First;
while not Dataset1.EOF do begin
  Dataset2.Insert; // Daten einfügen und in DB Trigger für AutoID anlegen !
  Dataset2.FieldByName ('Name') := Dataset1.FieldByName ('Name');
... notfalls andere Felder auch noch besetzen
  Dataset1.Next;
end;

needatip 2. Nov 2005 20:38

Re: Datansatz alle Felder kopieren
 
Hab ich verstanden. Ich möchte aber die Feldinhalte vom aktuellen Datensatz kopieren, dann zu einem bestimmten Datensatz gehen und dann diese Feldinhalte in diesen Datensatz einfügen.

Hansa 2. Nov 2005 21:52

Re: Datansatz alle Felder kopieren
 
Was verstanden ? Sieht eher nach unvollständigem SQL-Wissen aus. Ich würde mich in der Richtung mal etwas schlauer machen. 8) Soll nur ein DS gesucht werden, dann muß WHERE her. Und dann geht es wie gesagt weiter :

Delphi-Quellcode:
Dataset1.close;
Dataset1.SelectSQL.Text := 'SELECT NAME FROM TABLE1 WHERE ...'; // oder * für alle
Dataset1.open;
Delphi-Quellcode:
Dataset2.FieldByName ('Name') := Dataset1.FieldByName ('Name');

marabu 3. Nov 2005 06:31

Re: Datansatz alle Felder kopieren
 
Hallo needatip.

Technisch gesehen ist es kein Problem bestimmte Felder eines Datensatzes mit den Feldwerten eines anderen Datensatzes der gleichen Tabelle zu initialiseren. Du hast nach SQL gefragt:

SQL-Code:
UPDATE tbl SET
  fld = (SELECT fld FROM tbl WHERE id = :src)
WHERE id = :tgt
Es ist aber nicht üblich Felder auf diese Art prophylaktisch zu initialisieren. Da du keine allgemeinen Standardwerte definieren, sondern die Feldwerte eines beliebigen Datensatzes zur Vorbelegung verwenden möchtest, empfehle ich dir den folgenden Ansatz.

Du führst eine Name-Value-Liste in deiner Form mit, in der die Vorbelegungswerte für einen neuen Satz zwischengespeichert werden. Wenn der Benutzer einen Datensatz markiert hat und der DataSet in den Insert-Modus schaltet, dann werden die gewünschten Feldwerte des aktuellen Datensatzes zwischengespeichert. Im Ereignis OnNewRecord() des DataSet werden dann diese Werte übernommen.

Delphi-Quellcode:
unit DemoFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, DB, ADODB, Grids, DBGrids;

type
  TDemoForm = class(TForm)
    DBGrid: TDBGrid;
    ADOConnection: TADOConnection;
    DataSource: TDataSource;
    ADOTable: TADOTable;
    DBNavigator: TDBNavigator;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ADOTableBeforeInsert(DataSet: TDataSet);
    procedure ADOTableNewRecord(DataSet: TDataSet);
  private
    Defaults: TStrings;
    procedure SaveDefaults(Dataset: TDataSet);
    procedure LoadDefaults(Dataset: TDataSet);
  public
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

const
  FN_NAME = 'NACHNAME';

procedure TDemoForm.SaveDefaults(Dataset: TDataSet);

begin
  Defaults.Values[FN_NAME] := DataSet.FieldValues[FN_NAME];
end;

procedure TDemoForm.LoadDefaults(Dataset: TDataSet);
begin
  DataSet.FieldValues[FN_NAME] := Defaults.Values[FN_NAME];
end;

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  Defaults := TStringList.Create;
end;

procedure TDemoForm.FormDestroy(Sender: TObject);
begin
  Defaults.Free;
end;

procedure TDemoForm.ADOTableBeforeInsert(DataSet: TDataSet);
begin
  SaveDefaults(DataSet);
end;

procedure TDemoForm.ADOTableNewRecord(DataSet: TDataSet);
begin
  LoadDefaults(DataSet);
end;

end.
Grüße vom marabu

needatip 3. Nov 2005 10:46

Re: Datansatz alle Felder kopieren
 
Hey, genial.
Genau das hab ich gesucht.
Kannst Du mir bitte noch beschreiben wie ich die Werte mit einem ButtonClick kopiere und dann in einen beliebigen Datensatz einfüge ?


so geht das nicht, weil das Dataset nicht vorhanden ist.
Bin halt nicht so geübt im programmieren.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SaveDefaults(DataSet);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  LoadDefaults(DataSet);
end;

marabu 3. Nov 2005 11:19

Re: Datansatz alle Felder kopieren
 
Ich arbeite in meinem Beispiel mit DataSet, weil ich dessen Ereignisse benutze. Du wirst eine Table- oder Query-Komponente haben, die du an Stelle von DataSet angeben kannst. Viel wichtiger aber ist es, dass du dir ein Konzept für die Benutzerschnittstelle überlegst. Wie legt der Benutzer die beteiligten Datensätze fest? Sollen ein oder mehrere Datensätze mit den Feldwerten belegt werden? Warum willst du in existierende Datensätze schreiben?

Grüße vom marabu

needatip 3. Nov 2005 17:20

Re: Datansatz alle Felder kopieren
 
Danke für die Tips. Hab jetzt alles so hinbekommen, wie ich wollte.

Warum ich in existierende Datensätze schreiben will hat folgenden Grund:
Für eine Lagernummer wird von der Datenbank durch einen eindeutigen Schlüssel bereits eine Nummer vergeben. Diese Nummer wird für die Lagerhaltung benötigt. Zu einem späteren Zeitpunkt werden die Daten erfasst und dann in die Datenbank eingetragen. Da es nun viele Datensätze mit ähnlichen Daten gibt sollen diese dann mit den Daten eines anderen Datensatzes gefüllt(kopiert) werden und dann halt eben nur die Felder manuell geändert werden wo es Differenzen gibt.

Na, ja. Nochmals vielen Dank für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 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