Hallo Kostas,
was der Experte erzeugt, ist ein Grundgerüst eine Standard-Multitier-RoDa-Sonstwas-Anwendung, um den Einstieg zu erleichtern.
Um Businesslogik - und damit meine ich nicht allein Datenbankzugriffe, sondern auch echte Verarbeitungslogik - in den Server zu verlagern, gehe ich in Grundzügen so vor (ich beschreibe die Schritte mal von Anfang an, da ich nicht weiß, wie es bei dir genau aussieht):
- Im Service-Builder des RODA-Servers einen neuen Service anlegen mit Anchestor DataAbstractService
- Im neuen (oder einem bestehenden) Service dann eine neue Operation erzeugen und parametrisieren (In-/Out-Variablen, Rückgabewert)
Das ist die Schnittstelle, die du später im Client aufrufst.
Nach dem Speichern wird dir für jeden definierten Service eine Reihe von Dateien erzeugt, unter anderem eine mit dem Postfix "_Impl.pas". Das ist die Datei, in der du mit dem Implementieren beginnst. In dieser Datei befinden sich dann automatisch zwei Komponenten: Einmal der DataStreamer, einmal das TDASchema. In dieser Schema-Komponente werden die Datenbankverbindungen bzw. die Zugriffsgeschichten zur Datenbank erzeugt und gepflegt - wenn ich dich richtig verstanden habe, hast du das bereits.
Um jetzt mit dem Datenbankschema direkt im Server arbeiten zu können, KANNST du die Vorgehensweise des Clients quasi kopieren:
- Ziehe dir eine Komponente des Typs TDALocalDataAdapter auf die _Impl-Datei und setze das Property "ServiceName" auf den gewünschten Service
- Rechtsklick auf den DataAdapter bringt ein lokales Menü, in dem du wie im Client nun mit "Create data tables" die gewünschten TDAMemDataTables erzeugst
Jetzt stehen dir die Datentabellen serverlokal zur Verfügung zur weiteren Bearbeitung.
Weiter geht es mit der Implementierung:
- Im Code der _Impl-Datei findet sich für jede im Service definierte Operation im Interface-Teil eine entsprechende Methode mit allen Parametern. Dies ist der Startpunkt für deine echte Implementierung der Businesslogik.
- Auf die TDAMemDatasets greifst du wie im Client über den Namen zu und arbeitest wie mit Datasets (Editieren, Löschen, Einfügen, Locate usw.)
- Auch das Einschränken der Ergebnismenge mit DynamicWhere funktioniert exakt wie auf dem Client
- Du kannst auch - zumindest lesend - auf Tabellen des Schemas zugreifen, für die du keine TDAMemDatasets angelegt hast; das machst du dynamisch z.B. über eine solche Codesequenz:
Delphi-Quellcode:
var
dsBasisEin: IDADataset;
ISEConnectionName: string;
begin
ISEConnectionName := Session.Values[sess_ISEConnectionName];
Connection := ISEPricingSchema.ConnectionManager.NewConnection(ISEConnectionName);
Connection.BeginTransaction;
try
dsBasisEin := ISEPricingSchema.NewDataset(Connection, 'BasisEin', [], []);
dsBasisEin.ParamByName('AdressID').AsInteger := AHotelID;
dsBasisEin.Open;
Ob und wie man sowas dynamisches auch für eine beschreibare Tabelle verwenden kann, habe ich nicht weiter erforscht, aber im IDataSet fehlen elementare Dinge eines DataSets - vielleicht hilft ein Cast auf den passenden Datentyp oder so.
Wenn deine Businesslogik nun fertig ist (an Threadsicherheit denken!), brauchst du noch den Aufruf im Client. Das kann z.B. so aussehen:
Result := (ISEPricingService as IISEPricing).GenerateCatalogPricesHotel(APeriode.ID, AHotelID, DaysOfWeek, ARoomRateID, DaysOfStay, ServiceIDs);
Also Typcast des im Client-Datamodule erzeugten TRORemoteService zum gewünschten Service und danach Aufruf der serverseitig im Service deklarierten Operation und deren Parametern.
Das war es in Grundzügen. Jetzt können (müssen aber nicht explizit) Businessprozessoren usw. ins Spiel, aber das hängt von deiner Anwendung ab.
Stichwort Fehlersuche/Debugging: Aus leidiger Erfahrung rate ich dir, zunächst im Server nur ein Dummy der Operation zu implementieren, die dir genau definierte Werte zurückliefert und dann zunächst den Client zu bauen, bis der damit funktioniert. Erst danach würde ich den Server Stück für Stück aufbauen - dann kannst du den Server im Debugger laufen lassen und die Anfragen über einen seperat gestarteten Client absetzen - ansonsten suchst du dich tot, wenn es Problem auftritt (und das wird es...). Vielleicht funktioniert das auch mit zwei gleichzeitig gestarteten Delphi-Instanzen, eine für den Server, eine für den Client, hab ich nicht ausprobiert.
Ich hoffe, ich konnte dir damit ein wenig die Richtung zeigen. Die Informationen dazu habe ich durch reichlich ausprobieren und intensivem Stöbern im Supportforum zusammengetragen - ich weiß nicht, ob das wirklich der Königsweg ist, aber er funktioniert bei mir, und das auch mit großen Datenmengen: durch eine solche Verlagerung der Businesslogik auf den Server konnte ich die Berechnungszeit für einige Preisberechnungen von rund vier Minuten auf unter eine Minute reduzieren, allein dadurch, dass der Netzwerkoverload weggefallen ist.
Viele Grüße + viel Erfolg!
Udo