Results 1 to 6 of 6

Thread: TDataset van Datasnap-Server tonen in DBGrid dmv procedure oid

  1. #1

    Post TDataset van Datasnap-Server tonen in DBGrid dmv procedure oid

    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:
    1. function TCustomerMethods.GetCustomers(nID: Integer;                       // Is method in Datasnap-server
    2.   nKindOfCustomersToSelect: Integer): TDataSet;
    3. begin
    4.   with CustomersDataModule.SelectCustomersFDStoredProc do
    5.   begin
    6.     Close;
    7.     ParamByName('nIDIn').Value := CheckOn0Value(nID);
    8.     ParamByName('nKindOfCustomersToSelect').Value := nKindOfCustomersToSelect;
    9.     Open;
    10.     Result := CustomersDataModule.SelectCustomersFDStoredProc;
    11.   end;
    12. 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:
    1. with GetRemoteCustomerServer.GetCustomers(CustomerID, 0) do
    2. begin
    3.     Naam = FieldByName
    4.         Adres = FieldByName etc.
    5. end


    De definities van GetRemoteCustomerServer en GetCustomers (in de client) heb ik volledigheidshalve hieronder gezet:

    Delphi Code:
    1. function GetRemoteCustomerServer: TCustomerMethodsClient;
    2. begin
    3.   if CanConnect then
    4.   begin
    5.     MainConnectionDataModule.MainSQLConnection.Open;
    6.     Result := TCustomerMethodsClient.Create(MainConnectionDataModule.MainSQLConnection.DBXConnection);
    7.   end
    8.   else
    9.     Result := nil;
    10. end;
    11.  
    12.  
    13. function TCustomerMethodsClient.GetCustomers(nID: Integer; nKindOfCustomersToSelect: Integer): TDataSet;
    14. begin
    15.   if FGetCustomersCommand = nil then
    16.   begin
    17.     FGetCustomersCommand := FDBXConnection.CreateCommand;
    18.     FGetCustomersCommand.CommandType := TDBXCommandTypes.DSServerMethod;
    19.     FGetCustomersCommand.Text := 'TCustomerMethods.GetCustomers';
    20.     FGetCustomersCommand.Prepare;
    21.   end;
    22.   FGetCustomersCommand.Parameters[0].Value.SetInt32(nID);
    23.   FGetCustomersCommand.Parameters[1].Value.SetInt32(nKindOfCustomersToSelect);
    24.   FGetCustomersCommand.ExecuteUpdate;
    25.   Result := TCustomSQLDataSet.Create(nil, FGetCustomersCommand.Parameters[2].Value.GetDBXReader(False), True);
    26.   Result.Open;
    27.   if FInstanceOwner then
    28.     FGetCustomersCommand.FreeOnExecute(Result);
    29. 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?
    Last edited by GolezTrol; 31-Jul-19 at 13:51.
    Add one binary to 1, and suddenly
    you end up with 10.

  2. #2
    Update: Momenteel doe ik dit door de Dataset in te lezen in een ClientDataset (runtime aanmaken/velddefinities overhalen van Dataset/koppelen aan DataSource), maar moet volgens mij ook handiger kunnen.
    Add one binary to 1, and suddenly
    you end up with 10.

  3. #3
    Heb je hier misschien iets aan ? Zelf gebruik ik kbmmw en daar worden velddefinities meegestuurd, je hoeft het dus op de client niet allemaal runtime aan te maken. In het lijkt alsof datasnap dat ook heeft met de dataset provider. Dat je een soort van memory dataset nodig hebt en een datasource component is praktisch onvermijdelijk volgens mij.

  4. #4
    Zoals in het laatste stukje van je link, zo doe ik het nu ook, maar ik dacht dat er misschien nog andere/betere wegen waren. Maar even verder nadenkend is het wel logisch om de dataset in Memory te krijgen en lokaal te gebruiken, per slot van rekening kan DataSnap ook ingezet worden voor databases over Internet, en dan wil je geen continue openstaande lijn. Thanks, ik houd het dus bij mijn huidige oplossing (zijn ook maar een paar regeltjes code uiteindelijk).
    Add one binary to 1, and suddenly
    you end up with 10.

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Quote Originally Posted by TheMadMan View Post
    Update: Momenteel doe ik dit door de Dataset in te lezen in een ClientDataset (runtime aanmaken/velddefinities overhalen van Dataset/koppelen aan DataSource), maar moet volgens mij ook handiger kunnen.
    Datasnap is toch gemaakt om een volledige json met velddefinities en data te transporteren naar de client. Daar heb je de Dataprovider voor. Deze maakt in runtime (hoef je dus niet zelf te doen) de hele CDS voor je.
    Delphi is great. Lazarus is more powerfull

  6. #6
    Da's ook wat ik bedoelde met Runtime aanmaken/koppelen (was inderdaad niet helemaal duidelijk). Enige wat ik daarnaast nog extra doe na CDS.Open is de Titles in de DBGrid aanpassen naar eigen Captions, afhankelijk van taal en/of het veld getoond moet worden ja/nee.
    Dit is dus mijn huidige proc, denk dat 'ie zo wel voldoet. Weet niet of Datasnap alléén JSON transporteert, volgens mij is het een keus om JSON-objects te gebruiken ipv TDatasets, maar dat weet ik dus niet zeker.

    begin
    oDsp := TDataSetProvider.Create(Self);

    try
    oDsp.DataSet := oDataSet;
    ClientDataSet.Close;
    ClientDataSet.SetProvider(oDsp);
    ClientDataSet.Open;
    finally
    ClientDataSet.SetProvider(nil);
    oDsp.Free;
    end;
    end;
    Add one binary to 1, and suddenly
    you end up with 10.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •