Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Kopieren aus DBGrid1 in DBGrid (https://www.delphipraxis.net/132961-kopieren-aus-dbgrid1-dbgrid.html)

Dieter11 22. Apr 2009 22:08

Datenbank: MS Access 2007 • Version: 2007 • Zugriff über: ADO

Kopieren aus DBGrid1 in DBGrid
 
Hallo Zusammen,

ich versuche Daten aus einem Grid in ein 2. Grid zu kopieren:

Delphi-Quellcode:
procedure Tfrm_Testformular.DBGrid1DblClick(Sender: TObject);
var
  currentID: Integer;

begin

  with dm_Nails4You_Artikel do
  begin

    with ADOQuery_Artikel do
    Begin

       currentID := AdoQuery_Artikel.FieldValues['id'];
       ShowMessage('CurrentID: ' + IntToStr(CurrentID));

       SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung, VK_Netto, VK_Brutto) SELECT Artikel.ID, Artikel.Bezeichnung, Artikel.VK_Netto, Artikel.VK_Brutto FROM Artikel WHERE Artikel.ID = 17';
       Parameters.ParseSQL(SQL.Text, true);
       Parameters.ParamValues['ID'] := currentID;

       ExecSQL;
    End;
  end;
end;
Das Ergebnis aus ShowMessage ist immer CurrentID: 1.
Anschliessend erhalte ich die Meldung: ADOQuery_Artikel: Parameter 'ID' nicht gefunden.

Hinter dm_Nails4You_Artikel steckt je ein ADOQuery und ein DataSource beider Tabellen. Die zu kopierenden Felder der Tabellen sind identisch.

Weiss jemand Rat?

Gruss

Dieter

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 22. Apr 2009 22:22

Re: Kopieren aus DBGrid1 in DBGrid
 
Ich würde zuerst den select machen und dann in der Schleife den entsprechenden Insert

Dieter11 23. Apr 2009 20:43

Re: Kopieren aus DBGrid1 in DBGrid
 
Ich habe das SQL-Statement mit festen ID (also z.B. 16) in Access getestet, da läuft es ohne Probleme.

Das Problem liegt m.E. im Parameter.

Wenn ich die Prozedure so ändere, funktioniert diese auch.

Delphi-Quellcode:
procedure Tfrm_Testformular.DBGrid1DblClick(Sender: TObject);

var
  currentID: Integer;

begin

  with dm_Nails4You_Artikel do
  begin

    with ADOQuery_Artikel do
    Begin
       SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung, VK_Netto, VK_Brutto) SELECT Artikel.ID, Artikel.Bezeichnung, Artikel.VK_Netto, Artikel.VK_Brutto FROM Artikel WHERE Artikel.ID = 16';

       ExecSQL;
    End;
  end;
end;
Füge ich aber die Parameter ein, erhalte ich die Fehlermeldungen.

[edit=mkinzler]Delphi-Tag eingefügt. das nächste Mal bitte selber machen! Mfg, mkinzler[/edit]
[edit=mkinzler]BBCode reaktiviert Mfg, mkinzler[/edit]

mkinzler 23. Apr 2009 20:48

Re: Kopieren aus DBGrid1 in DBGrid
 
Zeig mal den nicht funktionierenden Code

Dieter11 23. Apr 2009 20:59

Re: Kopieren aus DBGrid1 in DBGrid
 
Delphi-Quellcode:
procedure Tfrm_Testformular.DBGrid1DblClick(Sender: TObject);

var
  currentID: Integer;

begin

  with dm_Nails4You_Artikel do
  begin

    with ADOQuery_Artikel do
    Begin

      currentID := AdoQuery_Artikel.FieldValues['id'];
//       ShowMessage('CurrentID: ' + IntToStr(CurrentID));

       SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung, VK_Netto, VK_Brutto) SELECT Artikel.ID, Artikel.Bezeichnung, Artikel.VK_Netto, Artikel.VK_Brutto FROM Artikel WHERE Artikel.ID = :Currentid';
       Parameters.ParseSQL(SQL.Text, true);
       Parameters.ParamValues['ID'] := currentID;

       ExecSQL;
    End;
  end;
end;
[edit=mkinzler]Das mit dem Formatieren war ernst gemeint :warn: Mfg, mkinzler[/edit]

mkinzler 23. Apr 2009 21:02

Re: Kopieren aus DBGrid1 in DBGrid
 
Der Parameter heisst auch Currentid
Delphi-Quellcode:
Parameters.ParamValues['Currentid'] := currentID;

Dieter11 23. Apr 2009 21:24

Re: Kopieren aus DBGrid1 in DBGrid
 
Danke.
Jetzt habe ich folgendes Phänomen:
Es wird immer nur der 1. Datensatz aus der Tabelle "Artikel" in die Tabelle "Preisliste" kopiert, unabhängig vom angeklickten Datensatz.
Beim 2. Versuch, erhalte ich folgende Fehlermeldung: "Could not convert variant of type (Null) into type (Integer).

mkinzler 23. Apr 2009 21:27

Re: Kopieren aus DBGrid1 in DBGrid
 
Verwendet ADOQuery_Artikel die Artikeltabelle, in die du einfügen willst? Dann kannst du auf das 2. Select ja verzichten und direkt die Werte des aktuellen DS einfügen lassen.

Dieter11 23. Apr 2009 21:30

Re: Kopieren aus DBGrid1 in DBGrid
 
Es sind unterschiedliche Tabellen. Nur die im Select angegebenen Datenfelder sind identisch.

mkinzler 23. Apr 2009 21:33

Re: Kopieren aus DBGrid1 in DBGrid
 
Also handelt es ich um 3 Tabellen?

Dieter11 23. Apr 2009 21:38

Re: Kopieren aus DBGrid1 in DBGrid
 
Nein, handelt sich nur nur 2 Tabellen:
- Artikel
- Preisliste

mkinzler 23. Apr 2009 21:45

Re: Kopieren aus DBGrid1 in DBGrid
 
Dann sollte es ja so gehen:
Delphi-Quellcode:
       SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung, VK_Netto, VK_Brutto) VALUES( :ID, :Bezeichnung, :VK_Netto, :VK_Brutto;';
       Parameters.ParseSQL(SQL.Text, true);
       Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];
       Parameters.ParamValues['Bezeichnung'] := AdoQuery_Artikel.FieldValues['Bezeichnung'];
       ...

Dieter11 23. Apr 2009 22:04

Re: Kopieren aus DBGrid1 in DBGrid
 
Das würde dann so aussehen????

Delphi-Quellcode:
procedure Tfrm_Testformular.DBGrid1DblClick(Sender: TObject);
var
  currentID: Integer;
begin

  with dm_Nails4You_Artikel do
  begin

    currentID := AdoQuery_Artikel.FieldValues['id'];
    with ADOQuery_Artikel do
    Begin

//       currentID := AdoQuery_Artikel.FieldValues['id'];
       ShowMessage('CurrentID: ' + IntToStr(CurrentID));

       SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
       Parameters.ParseSQL(SQL.Text, true);
       Parameters.ParamValues['ID'] := FieldValues['id'];
       Parameters.ParamValues['Bezeichnung'] := FieldValues['Bezeichnung'];

       ExecSQL;
    End;
  end;
end;

Hier habe ich folgendes Resultat:
ShowMessage('CurrentID: ' + IntToStr(CurrentID)); zeigt immer 'CurrentID: 1' an, egal ob die Definition innerhalb oder ausserhalb der With-Anweisung liegt.

Dann habe ich folgende Meldung:
Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben.

Habe ich hier etwas vergessen??

mkinzler 23. Apr 2009 22:05

Re: Kopieren aus DBGrid1 in DBGrid
 
Verzichte mal auf das with und gebe das Objekt vollständig an.

Dieter11 23. Apr 2009 22:09

Re: Kopieren aus DBGrid1 in DBGrid
 
Dann erhalte ich das gleiche Ergebnis wie oben.

mkinzler 23. Apr 2009 22:14

Re: Kopieren aus DBGrid1 in DBGrid
 
Hast du sowohl beim Feld wie beim Parameter das Objekt vollständig angegeben?

Dieter11 23. Apr 2009 22:17

Re: Kopieren aus DBGrid1 in DBGrid
 
Ja

Delphi-Quellcode:
    currentID := AdoQuery_Artikel.FieldValues['id'];
    ShowMessage('CurrentID: ' + IntToStr(CurrentID));

       AdoQuery_Artikel.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
       AdoQuery_Artikel.Parameters.ParseSQL(AdoQuery_Artikel.SQL.Text, true);
       AdoQuery_Artikel.Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];
       AdoQuery_Artikel.Parameters.ParamValues['Bezeichnung'] := AdoQuery_Artikel.FieldValues['Bezeichnung'];

       AdoQuery_Artikel.ExecSQL;

  end;

mkinzler 23. Apr 2009 22:19

Re: Kopieren aus DBGrid1 in DBGrid
 
Ist ja klar, du benötigst auch 2 AdoQueries. Durch setzen der Abfrage wird ja die alte und damit auch das Ergebnis gelöscht

Dieter11 23. Apr 2009 22:35

Re: Kopieren aus DBGrid1 in DBGrid
 
In meinem Datenmodul habe ich ja 2 ADO_Query's.

mkinzler 23. Apr 2009 22:42

Re: Kopieren aus DBGrid1 in DBGrid
 
Aber hier im Code hast du nur einen

Dieter11 23. Apr 2009 22:52

Re: Kopieren aus DBGrid1 in DBGrid
 
Meinst Du so:
Delphi-Quellcode:

     ADOQuery_Preisliste.Active := False;
     ADOQuery_Preisliste.SQL.Clear;

     currentID := AdoQuery_Artikel.FieldValues['id'];
     ShowMessage('CurrentID: ' + IntToStr(CurrentID));

       AdoQuery_Artikel.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
       AdoQuery_Artikel.Parameters.ParseSQL(AdoQuery_Artikel.SQL.Text, true);
       AdoQuery_Artikel.Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];
       AdoQuery_Artikel.Parameters.ParamValues['Bezeichnung'] := AdoQuery_Artikel.FieldValues['Bezeichnung'];

       AdoQuery_Artikel.ExecSQL;

       ADOQuery_Preisliste.Open;

  end;
Auch hier habe ich, beim 1. Klick auf irgendeine Zeile im GRID beim ShowMessage: CurrentID: 1
anschliessend die Meldung: "Ein Parameterobjekt ..... " (wie oben)
und beim nächsten Klick auf eine Zeile die Meldung: Could not convert variant of type (Null) into type (Integer).

Die Felder ID sind Integer und Bezeichnung ist String bzw. Text

mkinzler 23. Apr 2009 23:01

Re: Kopieren aus DBGrid1 in DBGrid
 
Eher
Delphi-Quellcode:
AdoQuery_Insert.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
AdoQuery_Insert.Parameters.ParseSQL(AdoQuery_Insert.SQL.Text, true);
AdoQuery_Insert.Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];

Dieter11 23. Apr 2009 23:12

Re: Kopieren aus DBGrid1 in DBGrid
 
Du meinst:
Delphi-Quellcode:
     ADOQuery_Preisliste.Active := False;
     ADOQuery_Preisliste.SQL.Clear;

     currentID := AdoQuery_Artikel.FieldValues['id'];
     ShowMessage('CurrentID: ' + IntToStr(CurrentID));

     ADOQuery_Preisliste.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
     ADOQuery_Preisliste.Parameters.ParseSQL(ADOQuery_Preisliste.SQL.Text, true);

     ADOQuery_Preisliste.Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];
     ADOQuery_Preisliste.Parameters.ParamValues['Bezeichnung'] := AdoQuery_Artikel.FieldValues['Bezeichnung'];

     ADOQuery_Preisliste.ExecSQL;

     ADOQuery_Preisliste.Open;
  end;
Ergebnis:
- ShowMessage zeigt wieder den 1. Datensatz
- der 1. Datensatz wird kopiert
- folgende Fehlermeldung wird angezeit: ADOQuery_Preisliste: CommandText gibt keine Ergebnismenge zurück

[edit=mkinzler]Delphi-Tag gefixt Mfg, mkinzler[/edit]

mkinzler 23. Apr 2009 23:16

Re: Kopieren aus DBGrid1 in DBGrid
 
Lass mal das Open weg, den ein Insert liefert keine Ergebnismenge.

Ist das Grid mit AdoQuery_Artikel verknüpft?

Dieter11 23. Apr 2009 23:29

Re: Kopieren aus DBGrid1 in DBGrid
 
Jetzt erscheint keine Fehlermeldung mehr, aber kopiert wird immer nur der 1. Datensatz.
Also der gewünschte Datensatz wird markiert, aber nicht kopiert

Grid1 ist mit ADOQuery_Artikel und Grid2 mit ADO_Query_Preisliste verknüpft.

Dieter11 28. Apr 2009 21:47

Re: Kopieren aus DBGrid1 in DBGrid
 
Hallo mkinzler,
Danke für Deine Hilfe.

Ein Problem habe ich leider noch:
Es wird immer der 1. Datensatz in die Zieltabelle geschrieben, egal welchen ich im Grid1 markiere.
Vielleicht kannst Du mir nocheinmal einen Tip geben.

Delphi-Quellcode:
procedure Tfrm_Testformular.Button1Click(Sender: TObject);
var
  i, currentID: Integer;

begin
  inherited;

  with dm_Nails4You_Artikel do
  BEGIN
     ADOQuery_Preisliste.Active := False;
     ADOQuery_Preisliste.SQL.Clear;

     for i := 0 to DBGrid1.SelectedRows.Count - 1 do
     BEGIN

       DBGrid1.DataSource.DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));

       currentID := AdoQuery_Artikel.FieldValues['id'];

       ShowMessage('CurrentID: ' + IntToStr(CurrentID));
       ShowMessage('i: ' + InttoStr(i));

       ADOQuery_Preisliste.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
       ADOQuery_Preisliste.Parameters.ParseSQL(ADOQuery_Preisliste.SQL.Text, true);

       ADOQuery_Preisliste.Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];
       ADOQuery_Preisliste.Parameters.ParamValues['Bezeichnung'] := AdoQuery_Artikel.FieldValues['Bezeichnung'];

       ADOQuery_Preisliste.ExecSQL;
       ADOQuery_Preisliste.Refresh;

    End;
  end;

end;

mkinzler 28. Apr 2009 21:58

Re: Kopieren aus DBGrid1 in DBGrid
 
Und CurrentID ist richtig?

Ich würde
Delphi-Quellcode:
       ADOQuery_Preisliste.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
       ADOQuery_Preisliste.Parameters.ParseSQL(ADOQuery_Preisliste.SQL.Text, true);
vor die Schleife ziehen

Dieter11 28. Apr 2009 22:08

Re: Kopieren aus DBGrid1 in DBGrid
 
Das hatte ich bereits probiert.

Ich denke, dass das Problem hier liegt:
Delphi-Quellcode:
      DBGrid1.DataSource.DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 28. Apr 2009 22:09

Re: Kopieren aus DBGrid1 in DBGrid
 
Lass mal Pointer() weg.

Dieter11 28. Apr 2009 22:16

Re: Kopieren aus DBGrid1 in DBGrid
 
dann erhalte ich folgende Fehlermeldung:
[DCC Fehler] u_frm_Testformular.pas(54): E2010 Inkompatible Typen: 'Pointer' und 'string'

mkinzler 28. Apr 2009 22:20

Re: Kopieren aus DBGrid1 in DBGrid
 
Komsich, eigentlich müsste beides vom Typ TBytes sein :gruebel:

Dieter11 28. Apr 2009 22:50

Re: Kopieren aus DBGrid1 in DBGrid
 
Das dachte ich auch.
Der Pointer springt nur nicht auf den markierten Datensatz sondern nur auf den 1.

mkinzler 28. Apr 2009 22:51

Re: Kopieren aus DBGrid1 in DBGrid
 
Welche Delphiversion?

hoika 29. Apr 2009 14:01

Re: Kopieren aus DBGrid1 in DBGrid
 
Hallo,

mach mal ganz am Anfang (vor der for-Schleife)

Delphi-Quellcode:
DBGrid1.SelectedRows.Refresh;

Heiko

Dieter11 29. Apr 2009 19:58

Re: Kopieren aus DBGrid1 in DBGrid
 
Hallo,
Delphi-Quellcode:
DBGrid1.SelectedRows.Refresh;
hat nichts gebracht.
Ich nutze die Delphi Version: 2007

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

hoika 29. Apr 2009 20:17

Re: Kopieren aus DBGrid1 in DBGrid
 
Hallo,

stimmen denn die SelectedRows.Count mit den tatsächlich
markierten Zeilen überhaupt überein.

Nimm doch zur Not völlig separate Queries zum DB-Update.
Ich habe DBGrid nie benutzt.


Heiko

mkinzler 29. Apr 2009 20:26

Re: Kopieren aus DBGrid1 in DBGrid
 
Ich finde es irgendwie komisch, dass
Zitat:

Delphi-Quellcode:
DBGrid1.DataSource.DataSet.GotoBookmark(DBGrid1.SelectedRows.Items[i]);

fehlerhaft sein soll

hoika 29. Apr 2009 20:47

Re: Kopieren aus DBGrid1 in DBGrid
 
Hallo,

ist es nicht
das ist aus der Hilfe zu SelectedRows -> Beispiele

DBGrid1.DataSource.DataSet.GotoBookmark(Pointer(DB Grid1.SelectedRows.Items[i]));

klar hätte man auch statt DBGrid1.DataSource.DataSet
das direkte AdoQuery nehmen können.

Die Hilfe bezieht sich aber AFAIK auf die BDE
(wobei TDataSet ja BDE-unabhängig ist)


Heiko

Dieter11 29. Apr 2009 20:53

Re: Kopieren aus DBGrid1 in DBGrid
 
Hier noch einmal der Code:
Delphi-Quellcode:
begin
  inherited;

  with dm_Nails4You_Artikel do
  BEGIN
     ADOQuery_Preisliste.Active := False;
     ADOQuery_Preisliste.SQL.Clear;

     ADOQuery_Preisliste.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
     ADOQuery_Preisliste.Parameters.ParseSQL(ADOQuery_Preisliste.SQL.Text, true);

     with DBGrid1.DataSource.DataSet do
     begin

//     DBGrid1.SelectedRows.Refresh;
     for i := 0 to DBGrid1.SelectedRows.Count - 1 do
     BEGIN

       DBGrid1.DataSource.DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));

       ShowMessage('i: ' + InttoStr(i) );

       ADOQuery_Preisliste.Parameters.ParamValues['ID'] := AdoQuery_Artikel.FieldValues['id'];
       ADOQuery_Preisliste.Parameters.ParamValues['Bezeichnung'] := AdoQuery_Artikel.FieldValues['Bezeichnung'];

       ADOQuery_Preisliste.ExecSQL;
    End;

  end;
end;
Die Schleife for i := 0 to DBGrid1.SelectedRows.Count - 1 do funktioniert. Es wird tatsächlich zu jedem Datensatz im Grid gesprungen. D.h., dass auch DBGrid1.DataSource.DataSet.GotoBookmark(pointer(DB Grid1.SelectedRows.Items[i])); funktioniert.
Aber dann wird immer nur der 1. Datensatz kopiert.

mkinzler 29. Apr 2009 20:56

Re: Kopieren aus DBGrid1 in DBGrid
 
Zitat:

Zitat von Delphi-Hilfe
Anmerkung: Unidirektionale Datenmengen unterstützen keine Bookmarks. Wenn Sie GotoBookmark für eine solche Datenmenge aufrufen, ändert sich der aktive Datensatz nicht.



Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz