AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client
Thema durchsuchen
Ansicht
Themen-Optionen

RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

Ein Thema von Kostas · begonnen am 20. Nov 2012 · letzter Beitrag vom 3. Dez 2012
Antwort Antwort
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
183 Beiträge
 
Delphi 12 Athens
 
#1

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 28. Nov 2012, 10:05
Der AnyDAC-Treiber wird von DA unterstützt, muss jedoch von Hand in das Framework installiert werden - siehe http://wiki.remobjects.com/wiki/Inst...tabase_drivers. Klappt zumindest mit IBDAC problemlos.

DA stülpt sich quasi über den verwendeten DB-Treiber und bietet damit eine einheitliche, treiberunabhängige Schnittstelle mit "erweiterten Möglichkeiten". Ob du trotzdem direkt auf den DB-Treiber zugreifen kannst (unter Umgehung der üblichen DA-Vorgehensweisen), entzieht sich meiner Kenntnis. Selbst wenn - irgendwie wird damit der Sinn von DA ad absurdum geführt, finde ich. Was ist z.B. beim nächsten Treiberwechsel?

Zur Zeiten von IBX war ich auch kein Freund von TIBTable - das war ja auch ne ziemliche Krücke. Aber diese Komponente darf man glaube ich nicht wirklich mit den TDAMemDataTables vergleichen...
Udo Treichel
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#2

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 28. Nov 2012, 13:22
Hallo Udo,

nachdem ich ein Projekt mit dem Wizard erzeugt habe, existiert ein DataService_Impl.pas.
Auf der Form befinden sich je ein DataStreamer, EcmaScriptProvider und ein Schema.
Zunächst die Frage, wenn ich ein weiteren Service anlege mit dem Ancestor DataAbstractService
und definiere die Methoden (items) für meine spätere Implementierung, ist die Form erst einmal
leer. Also kein DataStreamer, EcmaScriptProvider und Schema. Sollen die drei
Komponenten von DataService_Impl.pas kopieren und somit je ein eigenes Schema anlegen werden oder
ist es üblich das Schema zentral zu verwalten. Mir persönlich würde ein eigenes Schema
pro Service besser gefallen, da es bei größeren Projekten besser partitioniert werden kann.

Allgemeines zum Schema bitte:
Ich habe eine Tabelle Adressen mit 78 Feldern. Angenommen, ich möchte Adressetiketten drucken.
Somit benötige ich nur die Adresse aus der Tabelle Adressen. Zum nächsten, möchte ich ein
Auftrag anlegen. Dafür benötige ich die Anschrift, Bankdaten und weitere Felder. Es sind also
zwei unterschiedliche Selects notwendig. Wie ist es gedacht, lege ich im Schema nur eine Tabelle
Adressen mit allen Feldern an, oder zwei Tabellen und gebe mein SQL-Statement selbst ein für die
unterschiedliche Untermenge der Felder?
Ich habe gemerkt, wenn ich mein eigenes Select eingeben, findet der Modeler die Metadaten nicht. Also Feldlänge, Typ, Entitäten u.s.w. Wenn ich jedoch die komplette Tabelle per AutoSQL ansreche habe ich die Metainfos mit in das Schema. Aktuell habe ich danach die überflüssigen Felder gelöscht nachdem ich von AutoSQL auf SQL umgestellt habe und die Metadata zu konsumieren.

Gruß Kostas
  Mit Zitat antworten Zitat
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
183 Beiträge
 
Delphi 12 Athens
 
#3

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 28. Nov 2012, 14:03
Du kannst die notwendigen Komponenten (DataStreamer, Schema) selbst auf dem Servicecontainer platzieren und dann die Properties entsprechend den vom Wizard erzeugten Komponenten setzen.

Ich verwende für jeden Service ein eigenes Schema, aus rein organisatorischen Gründen. Bei Datenbanken mit vielen Tabellen geht sonst im Schemamanager leicht die Übersicht verloren. Ich habe daher meine Services funktionsbereichsorientiert strukturiert.

Ob du für eine Tabelle mehrere DataTables im Schema anlegst, ist Geschmackssache. Es ist grundsätzlich möglich, mit einer DataTable zu arbeiten und dann per Dynamic Select die Spalten einzugrenzen - siehe Wiki. Lesenswert dazu sind auch die Ausführungen zur Klasse TableRequestInfoV5, ebenfalls im Wiki. Caveat: Ziemlich viel Tipperei. Und bei nicht-AutoSQL-Datatables werden trotzdem alle im Select-Statement enthalten Felder gefetcht und erst bei der Übermittlung zum Client die nicht angeforderten Felder entfernt - bei AutoSQL dagegen werden tatsächlich nur die angegebenen Felder beim Datenbankserver abgefragt.

Mit den Metadaten hatte ich auch bei eigenen Selects keine Probleme, ich muss nur manchmal auf Recreate bei den Feldern und Parametern des DataTables klicken. Im Client-MemDataTable muss ich die Tabellenstruktur nach jeder Änderung im Schema neu abfragen, da findet kein automatisches Sync statt. Bei den Feldern habe ich mir angewöhnt, die erzeugten Einträge zu prüfen, insbesondere bei Blobs mit SubType 1 für Text (in Firebird) kommt es hier gelegentlich zu Problemen. Und für Felder des Primary Keys, für die es in Firebird keine echten AutoIncs gibt, muss der Generator (falls verwendet) von Hand gesetzt werden.
Udo Treichel
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#4

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 29. Nov 2012, 17:00
Hallo Udo,

bitte noch zwei Fragen:
Du schreibst, du hast mit dem Schema Modeler keine Probleme wenn du eine SQLs verwendest. Die Metadaten werden immer korrekt
erstellt. Ich verwende für mein Testprojekt eine Datenbank Firebird in der Version 1.5 Dialekt 1. Wenn ich über den Modeler
eine neue Tabelle anlege und verwende Statement Type = SQL und nicht AutoSQL werden keine Parameter erkannt und angelegt, auch nicht die Feld-Metadate wie FK, Required u.s.w. Wie gehst du vor? Du verwendest do auch Firebird oder?

Ich würde gerne mein Projekt Server und Client auf unterschiedlichen Maschinen testen. Wass muss ich bitte alles veröffentlichen und wie kann
ich den Connection String anpassen?


Gruß Kostas
  Mit Zitat antworten Zitat
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
183 Beiträge
 
Delphi 12 Athens
 
#5

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 3. Dez 2012, 14:35
Hallo Kosta,

in der Tat habe ich auch bei "eigenem" SQL wenig bis keine Probleme im Schema-Modeller: Wann immer ich da was eingebe oder ändere, werde ich beim Verlassen des SQL-Editors gefragt, ob Felder und/oder Parameter geändert werden sollen (was ich in der Regel mit ja beantworte). Die Probleme, wo ich von Hand nachregeln muss, hatte ich schon geschildert. Allerdings arbeite ich nicht - und das ist vielleicht der signifikante Unterschied - mit dem "neuen" Schemamodeller, der seit dem Autumn-2012-Release verwendet wird, sondern mit dem alten Modeller - weniger aus technischen Gründen, sondern aus Gewohnheit. Ob deine Probleme mit dem neuen Modeller zusammen hängen, weiß ich nicht. Ansonsten das Supportforum bemühen.

Hallo Udo,
Ich würde gerne mein Projekt Server und Client auf unterschiedlichen Maschinen testen. Wass muss ich bitte alles veröffentlichen und wie kann
ich den Connection String anpassen?
Ich verwende für Entwicklung, Test und Produktion auch verschiedene Einstellungen. Dafür habe ich mir mal die Einstellungen aus dem Connection Manager des Server-Datamodules per rechten Mausklick auf Platte schreiben lassen und dann die darin aufgeführten Connections per Hand an die notwendigen Gegebenheiten des jeweiligen Servers angepaßt - ist trival, da ne XML-Datei. Beim Start des Server lese ich dann die jeweilige Datei(en) in den Connection Manager ein - fertig. Vom Client aus lasse ich noch beim Anmelden mit übergeben, welche Connection (als Connectionname) er denn verwenden möchte. Serverseitig prüfe ich dann beim Login, ob der Client die gewünschte Connection überhaupt verwenden darf - wenn nicht, gibt es ne Fehlermeldung, wenn ja, wird der Connectionname in der Session gespeichert, wie es die mitgelieferten Beispiele zeigen.

Viele Grüße

Udo

Ansonsten: Was meinst du mit veröffentlichen? Bei mir ist es nur die Server-Exe und die Dateien mit den Connections, die ich auf die jeweilige Server-Maschine schiebe. Wenn du den Server als Windows-Service laufen läßt, ist darauf zu achten, dass die Connection-Datei im Pfad liegt. Bei Remote-Servern noch den notwendigen Port freischalten, das ist eigentlich alles.
Udo Treichel
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#6

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 3. Dez 2012, 16:29
Hallo Udo,

danke für die Infos.
Ich teste gerade mit der aktuellen Testversion. Ich kenne den "alten" Modeler nicht.
Vermutlich ist hier das Problem. Sobald ich mein eigenes SQL eingebe, werde ich auch
gefragt ob ich die Felder anlegen möchte. Die Felder werden angelegt jedoch ohne das Attribut
PK, required u.s.w. Werde mal den Support bemühen. Als Anfänger geht man immer davon aus
dass man ein Bedienerfehler macht.
Das mit dem veröffentlichen, ich dachte es werden noch irgendwelche DLLs benötigt oder so.
Es wird also allen in der EXE includiert. Das ist mir am liebsten.

Udo, ich habe dich jetzt wirklich ordentlich strapaziert, sorry dafür. Nur, ich dachte ich
habe das verstanden wie ich im RODA-Server eine Dataset bereitstellen kann um im Client
die "Remote"-Methode aufrufen zu können like GetAdress(const adressnr: Integer): Binary;

Ich habe im Service Manager ein neuen Service angelegt und die Methode GetAdress als Item
mit den Parameter und ein Result vom Typ Binary angelegt. Danach die Implementierung der Methode vorgenommen.


Delphi-Quellcode:
function TMobileService.GetAdress(const adressnr: Integer): Binary;

  procedure ProcessDataset(aDataset: IDADataset);
  begin
    aDataset.ParamByName('adressnr').AsInteger := adressnr;
    aDataset.Open;
    DataStreamer.WriteDataset(aDataset, [woRows], -1);
  end;

begin
  result := Binary.Create;
  DataStreamer.Initialize(result, aiWrite);
  try
//Die Schema.Table = Adresse serialisieren
    ProcessDataset(DASchema.NewDataset(Connection, 'Adresse'));
  finally
    DataStreamer.Finalize;
  end;
end;
Was ich noch nicht verstanden habe, wie kann ich jetzt die Methode GetAdress im Client
Einbinden und aufrufen und das result als dataset ausgeben?
Was ich gemacht habe ist, mein Service MobileService_Impl vom Server im Client in Uses
einzubinden. Die Methode GetAdress wurde in MobileService_Impl automatisch als protected angelegt.

Result := (ISEPricingService as IISEPricing).GenerateCatalogPricesHotel(APeriode.ID, AHotelID, DaysOfWeek, ARoomRateID, DaysOfStay, ServiceIDs); Wenn ich den cast richtig verstanden habe, greift du damit auf die Methode zu. Doch wie bekomme ich die in den Client? Vermutlich irgendwie über den RemoteDataAdapter, doch meine Methode wird nicht angezeigt. Den Server habe ich natürlich gestartet. RemoteDataAdapter zeigt mir nur die Tabellen vom Scheme Modeler. Übrigens, im Scheme Modeler habe ich auch eine StoredProc auf die ich per Commands zugreife. Die StoredProc liefert eine Select. Die Commands werden jedoch nicht angezeigt im RemoteDataAdapter.

Wenn es deine Zeit erlaubt, würde ich dich bitten mich aus diesem Wirrwarr zu leiten.

Gruß Kostas.
  Mit Zitat antworten Zitat
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
183 Beiträge
 
Delphi 12 Athens
 
#7

AW: RemObjects Data Abstract, Schema Modeler erzeugt alles auf dem Client

  Alt 3. Dez 2012, 17:17
Hallo Kostas,

mal das zweite zuerst:

Was ich noch nicht verstanden habe, wie kann ich jetzt die Methode GetAdress im Client
Einbinden und aufrufen und das result als dataset ausgeben?
Was ich gemacht habe ist, mein Service MobileService_Impl vom Server im Client in Uses
einzubinden. Die Methode GetAdress wurde in MobileService_Impl automatisch als protected angelegt.
Grundsätzlich: Die Methode bzw. das Interface ist in der _Intf-Datei der Service Library deklariert. Das sieht dann z.B. so aus:

Delphi-Quellcode:
{ IISEPricing }
  IISEPricing = interface(IDataAbstractService)
    ['{906729C2-F241-4435-8A63-0281F6B1C2F1}']
    function GenerateCatalogPricesHotel(const APeriodID: Integer; const AHotelID: Integer; const AWeekdays: StringArray; const ARoomRateID: Integer;
                                        const ADaysOfStay: TROIntegerArray; const AServices: TROIntegerArray): Boolean;
  end;
Das wird so vom Service Builder gebaut. Du musst daher nicht die _Impl-Datei in deinen Client aufnehmen, sondern die _Intf-Datei der Service Lib (nicht zu verwechseln mit der/den _Intf-Datei/en des/der Schemas...).

Für den ersten Teil deiner Frage muss ich dich vertrösten, da muss ich mal in Source gucken, den ich nicht hier habe. Diese Art der Datenübertragung habe ich nur selten angewandt, vor allem für FetchAll über mehrere Tabellen. Was mir spontan auffällt: Muss der Rückgabewert deiner Methode GetAdress nicht vom Typ TROBinaryMemoryStream sein? Der Aufruf erfolgt in solchem Fall auch nicht wie in meinem Beispiel, sondern mit einem Aufruf von GetDataCall des RemoteDataAdapters, glaube ich mich zu erinnern. Schau am besten mal in das mitgelieferte FetchAll-Beispiel.
Udo Treichel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz