![]() |
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:
Das Ergebnis aus ShowMessage ist immer CurrentID: 1.
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; 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] |
Re: Kopieren aus DBGrid1 in DBGrid
Ich würde zuerst den select machen und dann in der Schleife den entsprechenden Insert
|
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:
Füge ich aber die Parameter ein, erhalte ich die Fehlermeldungen.
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; [edit=mkinzler]Delphi-Tag eingefügt. das nächste Mal bitte selber machen! Mfg, mkinzler[/edit] [edit=mkinzler]BBCode reaktiviert Mfg, mkinzler[/edit] |
Re: Kopieren aus DBGrid1 in DBGrid
Zeig mal den nicht funktionierenden Code
|
Re: Kopieren aus DBGrid1 in DBGrid
Delphi-Quellcode:
[edit=mkinzler]Das mit dem Formatieren war ernst gemeint :warn: Mfg, mkinzler[/edit]
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; |
Re: Kopieren aus DBGrid1 in DBGrid
Der Parameter heisst auch Currentid
Delphi-Quellcode:
Parameters.ParamValues['Currentid'] := currentID;
|
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). |
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.
|
Re: Kopieren aus DBGrid1 in DBGrid
Es sind unterschiedliche Tabellen. Nur die im Select angegebenen Datenfelder sind identisch.
|
Re: Kopieren aus DBGrid1 in DBGrid
Also handelt es ich um 3 Tabellen?
|
Re: Kopieren aus DBGrid1 in DBGrid
Nein, handelt sich nur nur 2 Tabellen:
- Artikel - Preisliste |
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']; ... |
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?? |
Re: Kopieren aus DBGrid1 in DBGrid
Verzichte mal auf das with und gebe das Objekt vollständig an.
|
Re: Kopieren aus DBGrid1 in DBGrid
Dann erhalte ich das gleiche Ergebnis wie oben.
|
Re: Kopieren aus DBGrid1 in DBGrid
Hast du sowohl beim Feld wie beim Parameter das Objekt vollständig angegeben?
|
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; |
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
|
Re: Kopieren aus DBGrid1 in DBGrid
In meinem Datenmodul habe ich ja 2 ADO_Query's.
|
Re: Kopieren aus DBGrid1 in DBGrid
Aber hier im Code hast du nur einen
|
Re: Kopieren aus DBGrid1 in DBGrid
Meinst Du so:
Delphi-Quellcode:
Auch hier habe ich, beim 1. Klick auf irgendeine Zeile im GRID beim ShowMessage: CurrentID: 1ADOQuery_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; 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 |
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']; |
Re: Kopieren aus DBGrid1 in DBGrid
Du meinst:
Delphi-Quellcode:
Ergebnis:
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; - 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] |
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? |
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. |
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; |
Re: Kopieren aus DBGrid1 in DBGrid
Und CurrentID ist richtig?
Ich würde
Delphi-Quellcode:
vor die Schleife ziehen
ADOQuery_Preisliste.SQL.Text := 'INSERT INTO Preisliste(ID_Artikel, Bezeichnung) VALUES( :ID, :Bezeichnung)';
ADOQuery_Preisliste.Parameters.ParseSQL(ADOQuery_Preisliste.SQL.Text, true); |
Re: Kopieren aus DBGrid1 in DBGrid
Das hatte ich bereits probiert.
Ich denke, dass das Problem hier liegt:
Delphi-Quellcode:
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]
DBGrid1.DataSource.DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
|
Re: Kopieren aus DBGrid1 in DBGrid
Lass mal Pointer() weg.
|
Re: Kopieren aus DBGrid1 in DBGrid
dann erhalte ich folgende Fehlermeldung:
[DCC Fehler] u_frm_Testformular.pas(54): E2010 Inkompatible Typen: 'Pointer' und 'string' |
Re: Kopieren aus DBGrid1 in DBGrid
Komsich, eigentlich müsste beides vom Typ TBytes sein :gruebel:
|
Re: Kopieren aus DBGrid1 in DBGrid
Das dachte ich auch.
Der Pointer springt nur nicht auf den markierten Datensatz sondern nur auf den 1. |
Re: Kopieren aus DBGrid1 in DBGrid
Welche Delphiversion?
|
Re: Kopieren aus DBGrid1 in DBGrid
Hallo,
mach mal ganz am Anfang (vor der for-Schleife)
Delphi-Quellcode:
DBGrid1.SelectedRows.Refresh;
Heiko |
Re: Kopieren aus DBGrid1 in DBGrid
Hallo,
Delphi-Quellcode:
hat nichts gebracht.
DBGrid1.SelectedRows.Refresh;
Ich nutze die Delphi Version: 2007 [edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit] |
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 |
Re: Kopieren aus DBGrid1 in DBGrid
Ich finde es irgendwie komisch, dass
Zitat:
|
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 |
Re: Kopieren aus DBGrid1 in DBGrid
Hier noch einmal der Code:
Delphi-Quellcode:
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.
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; Aber dann wird immer nur der 1. Datensatz kopiert. |
Re: Kopieren aus DBGrid1 in DBGrid
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr. |
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