'Retrieve values from database to StringGrid
In connection with my previous question
I've successfully save string values in StringGrid to my database in one column.
Now I want to retrieved the values from database and put it back from StringGrid.
This is what I've tried :
procedure TForm1.BitBtn1Click(Sender: TObject);
var i, iRow, iCol: integer ;
s : string;
Grid2: TStringGrid;
strArray : Array of String;
charArray : Array[0..0] of Char;
begin
getRecords;
with SqlQuery4 do
begin
if RecordCount <> 0 then
begin
names := FieldByName('names').AsString;
s := names;
charArray[0] := '|';
strArray := s.Split(charArray);
Grid2 := Form7.StringGrid1;
i := 0;
iCol:= 0;
iRow:=0;
for iRow := 1 to 19 do // increment rows
begin
for iCol := 0 to 5 do // increment cols / max 5 cols
begin
if iCol = 5 then iCol := 0; // reset column so that it will go on next row
for i := 0 to Length(strArray)-1 do // get string one by one
begin
Grid2.RowCount := Grid2.RowCount + 1; // add row
Grid2.Cells[iCol, iRow] := strArray[i]; // this value always overwrite, how to save this previous data?
end;
end;
end;
end;
end;
end;
It adds row but doesn't get the values in database..
Solution 1:[1]
You are missing the First and Next methods for moving in a TDataSet of the query object SqlQuery4 This code could work:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i, iRow, iCol: integer ;
s : string;
Grid2: TStringGrid;
strArray : Array of String;
charArray : Array[0..0] of Char;
begin
getRecords;
with SqlQuery4 do
begin
First; //SqlQuery4 goes to the first row returned by the SQL query
if RecordCount <> 0 then
begin
names := FieldByName('names').AsString;
s := names;
charArray[0] := '|';
strArray := s.Split(charArray);
Grid2 := Form7.StringGrid1;
i := 0;
iCol:= 0;
iRow:=0;
for iRow := 1 to 19 do // increment rows
begin
for iCol := 0 to 5 do // increment cols / max 5 cols
begin
if iCol = 5 then iCol := 0; // reset column so that it will go on next row
for i := 0 to Length(strArray)-1 do // get string one by one
begin
Grid2.RowCount := Grid2.RowCount + 1; // add row
Grid2.Cells[iCol, iRow] := strArray[i]; // this value always overwrite, how to save this previous data?
end;
end;
Next; //SQLQuery goes to the next row available of the data set reurned by the SQL query
end;
end;
end;
end;
The basic way when you open a set of rows (a data set in Delphi) using a SQL query is something like this:
Procedure TForm1.ProcessData;
begin
{
The SQL query may look like:
SELECT *
FROM TABLE
WHERE
COLUMN1 = :PARAMETER1 AND /*Column1 is a VARCHAR */
COLUMN2 = :PARAMETER2 /*Column2 is a Integer*/
}
//If already open, the close it
if Query1.Active then
Query1.Close;
//Load some parameters from some components
Query1.ParamByName('PARAMETER1').AsString := Edit1.Text;
Query1.ParamByName('PARAMETER2').AsInteger := ComboBox1.ItemIndex;
//Open the SQL query
Query1.Open;
Query1.First; //We assure that the we are on the first record
while Not Query1.Eof do //Get into a whiile loop, exit when gets the end of the rows list returned by the Query1 object
begin
{
Your processing code goes here
}
Query1.Next; //Now you advance to the next row to process it, if there is no more rows EOF become TRUE (EOF(stans for End Of File)
end
Query1.Close; //is a good idea to close the query if you not longer need it to save resources
end;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Ever |