You are not logged in.
Pages: 1
The TSQLTable class has some new methods dedicated to direct cursor handling, as such:
procedure WriteBabiesStartingWith(const Letters: RawUTF8; Sex: TSex);
var aList: TSQLTableJSON;
begin
aList := Client.MultiFieldValues(TSQLBaby,'ID,BirthDate',
'Name LIKE ? AND Sex = ?',[Letters+'%',ord(Sex)]);
try
while aList.Step do
writeln('ID=',aList.Field(0),' BirthDate=',aList.Field(1));
finally
aList.Free;
end;
end;
By using the TSQLTable.Step method, you do not need to check that aList<>nil, since it will return false if aList is not assigned. And you do not need to access the RowCount property, nor specify the current row number.
We may have used not the field index, but the field name, within the loop:
writeln('ID=',aList.Field('ID'),' BirthDate=',aList.Field('BirthDate'));
You can also access the field values using late-binding and a local variant, which gives some perfectly readable code:
procedure WriteBabiesStartingWith(const Letters: RawUTF8; Sex: TSex);
var baby: variant;
begin
with Client.MultiFieldValues(TSQLBaby,'ID,BirthDate',
'Name LIKE ? AND Sex = ?',[Letters+'%',ord(Sex)]) do
try
while Step(false,@baby) do
writeln('ID=',baby.ID,' BirthDate=',baby.BirthDate);
finally
Free;
end;
end;
In the above code, late-binding will search for the "ID" and "BirthDate" fields at runtime. But the ability to write baby.ID and baby.BirthDate is very readable. Using a with ... do statement makes the code shorter, but should be avoided if it leads into confusion, e.g. in case of more complex process within the loop.
Offline
Hi Arnaud
At a first glance, I would opt for a construction with an array of field names rather than a string with comma separated values.
...
with Client.MultiFieldValues(TSQLBaby,['ID','BirthDate'],
'Name LIKE ? AND Sex = ?',[Letters+'%',ord(Sex)])
...
I like the functionality though.
Last edited by h.hasenack (2013-03-28 07:27:53)
Offline
Pages: 1