delphiuser2009
asked on
Copy selected row from one ADOQuery to an other
I have 2 adoquery's, (connected to an access database), when I select a record in adoquery1 I want it to be copied to adoquery2 when I click on a button.
I already have this code, but it doesnt work.
I already have this code, but it doesnt work.
procedure TForm1.Button2Click(Sender: TObject);
var teller : Integer;
Enabled : Boolean;
begin
ADOQuery2.Append;
for teller := 1 to ADOQuery1.fieldcount - 1 do
ADOQuery2.fields[teller].Value := ADOQuery1.fields[teller].Value;
ADOQuery2.Post;
Enabled := ADOQuery2.RecordCount > 0;
RemoveSongButton.Enabled := Enabled;
RemoveSongfromsonglist.Enabled := Enabled;
DBGrid2.Enabled := True;
Button4.Enabled := True;
Button5.Enabled := True;
Button6.Enabled := True;
end;
ASKER
Thanks, I have the first ADOQuery (is linked to a DBGrid with two columns in). But in the second ADOQuery (second DBGrid), it only shows the second column (columns are: Songtitle and Genre). The second ADOQuery should also show the first column, but now it displays only the second column.
Why?
Why?
1. Have you used proper SQL syntax for it. Probably should be:
ADOQuery2.SQL:='SELECT * FROM Table_Name;';
it looks that in your case is
ADOQuery2.SQL:='SELECT Songtitle FROM Table_Name;';
Change Table_Name with the name of your table
2. Also it can be a case if you defined DBGrid to show only specific columns. Double click on DBGrid in design time and clear all the columns defined in Editing dialog.
Regards,
B.
ADOQuery2.SQL:='SELECT * FROM Table_Name;';
it looks that in your case is
ADOQuery2.SQL:='SELECT Songtitle FROM Table_Name;';
Change Table_Name with the name of your table
2. Also it can be a case if you defined DBGrid to show only specific columns. Double click on DBGrid in design time and clear all the columns defined in Editing dialog.
Regards,
B.
ASKER
Thanks I've changed it to ADOQuery.SQL :='SELECT Songtitle, Genre FROM songs2
Now the Genre column is on its place, but the first column is not visible.
It looks like the code is not taking the column Songtitle for the copy, only the Genre column.
Now the Genre column is on its place, but the first column is not visible.
It looks like the code is not taking the column Songtitle for the copy, only the Genre column.
If is more possible that you have defined only Genre column for DBGrid, try double clicking on DBGrid and deleting all the columns from the list. This way DBGrid will have default settings.
ASKER
Nope this doesnt work also.
Hmm, I don't know what is the problem with DBGrid. I really haven't similar problems. Do you remember changing it somehow in the meantime. If I was you I would delete problematic DBGrid. Put a new on the form, name it like the old one and reconnect it to the same datasource.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks that did the trick.
I will reward you the points, but I have a small question (not really this topic but still SQL).
I have this code which I use to get all the columns (single row) and put them into 2 richedit fields and a edit field.
1 column is a songtext column and the text inside that field should be put into the richedit field. The other two are the songtitle and id column.
It now shows (when I press a button) not the selected row in the fields I described earlier. But some other row.
This is the code I use for it.
Please can you look at it?
I'll raise the point for you if you can help me with it.
Thanks.
I will reward you the points, but I have a small question (not really this topic but still SQL).
I have this code which I use to get all the columns (single row) and put them into 2 richedit fields and a edit field.
1 column is a songtext column and the text inside that field should be put into the richedit field. The other two are the songtitle and id column.
It now shows (when I press a button) not the selected row in the fields I described earlier. But some other row.
This is the code I use for it.
Please can you look at it?
I'll raise the point for you if you can help me with it.
Thanks.
procedure TForm1.Button3Click(Sender: TObject);
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM songs');
Open;
RichEdit1.Lines.Text := ADOQuery1.FieldByName('SongText').AsString;
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Songtitle').AsString;
Edit3.Text := ADOQuery1.FieldByName('Id').AsString;
RichEdit1.Enabled := True;
RichEdit2.Enabled := True;
Button8.Enabled := True;
end;
end;
Off course that you can not get the selected record.
Why: when you close and open ADOQuery1 pointer moves from selected row to first row.
As I can see now original code should be stripped to:
procedure TForm1.Button3Click(Sender : TObject);
begin
RichEdit1.Lines.Text := ADOQuery1.FieldByName('Son gText').As String;
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Son gtitle').A sString;
Edit3.Text := ADOQuery1.FieldByName('Id' ).AsString ;
RichEdit1.Enabled := True;
RichEdit2.Enabled := True;
Button8.Enabled := True;
end;
Why: when you close and open ADOQuery1 pointer moves from selected row to first row.
As I can see now original code should be stripped to:
procedure TForm1.Button3Click(Sender
begin
RichEdit1.Lines.Text := ADOQuery1.FieldByName('Son
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Son
Edit3.Text := ADOQuery1.FieldByName('Id'
RichEdit1.Enabled := True;
RichEdit2.Enabled := True;
Button8.Enabled := True;
end;
ASKER
I get the message: Exception class EDatabaseError with message 'ADOQuery1: Field 'SongText' not found'.
This is why, when you execute query previously you are not including these two fields (SongText, Songtitle):
ADOQuery1.SQL:='SELECT Songtitle, Genre FROM songs2';
in order to function you should change the query to:
ADOQuery1.SQL:='SELECT Songtitle, Genre, SongText, Songtitle FROM songs2';
ADOQuery1.SQL:='SELECT Songtitle, Genre FROM songs2';
in order to function you should change the query to:
ADOQuery1.SQL:='SELECT Songtitle, Genre, SongText, Songtitle FROM songs2';
ASKER
I see in the Query that you use songs table, but like you said in a previous post:
procedure TForm1.Button3Click(Sender : TObject);
begin
RichEdit1.Lines.Text := ADOQuery1.FieldByName('Son gText').As String;
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Son gtitle').A sString;
Edit3.Text := ADOQuery1.FieldByName('Id' ).AsString ;
RichEdit1.Enabled := True;
RichEdit2.Enabled := True;
Button8.Enabled := True;
end;
This is a query that is related to table songs, the query for ADOQuery1 looks like this now: ADOQuery1.SQL :='SELECT Id, Songtitle, Genre, Songtext FROM songs';
But I still get the error that field 'Songtext' can't be found.
procedure TForm1.Button3Click(Sender
begin
RichEdit1.Lines.Text := ADOQuery1.FieldByName('Son
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Son
Edit3.Text := ADOQuery1.FieldByName('Id'
RichEdit1.Enabled := True;
RichEdit2.Enabled := True;
Button8.Enabled := True;
end;
This is a query that is related to table songs, the query for ADOQuery1 looks like this now: ADOQuery1.SQL :='SELECT Id, Songtitle, Genre, Songtext FROM songs';
But I still get the error that field 'Songtext' can't be found.
Ttry changing column names with numbers
from
RichEdit1.Lines.Text := ADOQuery1.FieldByName('Son gText').As String;
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Son gtitle').A sString;
to
RichEdit1.Lines.Text := ADOQuery1.Fields[3].AsStri ng;
RichEdit2.Lines.Text := ADOQuery1.Fields[1].AsStri ng;
from
RichEdit1.Lines.Text := ADOQuery1.FieldByName('Son
RichEdit2.Lines.Text := ADOQuery1.FieldByName('Son
to
RichEdit1.Lines.Text := ADOQuery1.Fields[3].AsStri
RichEdit2.Lines.Text := ADOQuery1.Fields[1].AsStri
ASKER
Now I get the error: 'list index out of bounds (3)'.
ASKER
I've got the solution: With button1 I open the database, but forgot to add songtext in the SELECT query.
I will reward you the points and I'll raise it to 100 for you help.
I will reward you the points and I'll raise it to 100 for you help.
ASKER
Thanks you very much for your help. This helped me alot.
Glad that it helped, I suspected too on SQL syntax, but since you posted good Query earlier, I got confused.
Have a good day,
B.
Have a good day,
B.
var
teller : Integer;
Enbld : Boolean;
begin
ADOQuery2.Insert;
for teller := 1 to ADOQuery1.fieldcount - 1 do begin
ADOQuery2.Fields[teller].v
end;
ADOQuery2.Post;
if ADOQuery2.RecordCount > 0 then Enbld:=true else Enbld:=false;
RemoveSongButton.Enabled := Enbld;
RemoveSongfromsonglist.Ena
DBGrid2.Enabled := True;
Button4.Enabled := True;
Button5.Enabled := True;
Button6.Enabled := True;
end;