Ik heb een Datasnap-server die allerlei datasets ophaalt. Deze datasets worden in de datasnap-server opgehaald dmv methods die StoredProcs met parameters aanroepen (zie bijv. hieronder).
Delphi Code:
function TCustomerMethods.GetCustomers(nID: Integer; // Is method in Datasnap-server
nKindOfCustomersToSelect: Integer): TDataSet;
begin
with CustomersDataModule.SelectCustomersFDStoredProc do
begin
Close;
ParamByName('nIDIn').Value := CheckOn0Value(nID);
ParamByName('nKindOfCustomersToSelect').Value := nKindOfCustomersToSelect;
Open;
Result := CustomersDataModule.SelectCustomersFDStoredProc;
end;
end;
Om nu bijv. van Klant x de gegevens op te halen roep ik in de client zo'n procedure aan als volgt:
(Deze geeft als resultaat een recordset terug, en in dit geval een recordset met slechts 1 record, omdat CustomerID een waarde heeft))
Delphi Code:
with GetRemoteCustomerServer.GetCustomers(CustomerID, 0) do
begin
Naam = FieldByName
Adres = FieldByName etc.
end
De definities van GetRemoteCustomerServer en GetCustomers (in de client) heb ik volledigheidshalve hieronder gezet:
Delphi Code:
function GetRemoteCustomerServer: TCustomerMethodsClient;
begin
if CanConnect then
begin
MainConnectionDataModule.MainSQLConnection.Open;
Result := TCustomerMethodsClient.Create(MainConnectionDataModule.MainSQLConnection.DBXConnection);
end
else
Result := nil;
end;
function TCustomerMethodsClient.GetCustomers(nID: Integer; nKindOfCustomersToSelect: Integer): TDataSet;
begin
if FGetCustomersCommand = nil then
begin
FGetCustomersCommand := FDBXConnection.CreateCommand;
FGetCustomersCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FGetCustomersCommand.Text := 'TCustomerMethods.GetCustomers';
FGetCustomersCommand.Prepare;
end;
FGetCustomersCommand.Parameters[0].Value.SetInt32(nID);
FGetCustomersCommand.Parameters[1].Value.SetInt32(nKindOfCustomersToSelect);
FGetCustomersCommand.ExecuteUpdate;
Result := TCustomSQLDataSet.Create(nil, FGetCustomersCommand.Parameters[2].Value.GetDBXReader(False), True);
Result.Open;
if FInstanceOwner then
FGetCustomersCommand.FreeOnExecute(Result);
end;
Deze datasets wil ik nu ook koppelen aan een DBGrid in de Client-applicatie. Ik wil echter in de Client-applicatie geen Query-statements gebruiken, omdat dit al gebeurt in de StoredProc zelf. Wat ik eigenlijk wil is het statement wat ik gebruik om 1 record op te halen (with GetRemoteCustomerServer.GetCustomers(CustomerID, 0) do) ook gebruiken om de gehele dataset op te halen, en deze in de DBGrid te tonen. De StoredProc houdt hier al rekening mee, als ik als CustomerID een 0 meegeef wordt de gehele dataset opgehaald van alle klanten. Ik wil dus geen Query gebruiken in de client-applicatie, maar het GetRemoteCustomerServer.GetCustomers(0,0)-statement koppelen aan een DBGrid/Datasource, waarbij ik in de Grid, net als wanneer ik een Query gebruik, heen en weer kan gaan tussen de records (dus de dataset mag niet unidirectional zijn).
Iemand enig idee hoe dit te doen?
Bookmarks