Mehrere 4D-Datenquellen, interessiert?

Wir haben eine aufregende neue Funktion in 4D v18 anzukündigen und der Titel gibt Ihnen vielleicht schon einen Hinweis darauf!

Diese Funktion eröffnet neue Möglichkeiten für die Client/Server-Arbeit. Anstatt auf die aktuelle Datenbank beschränkt zu sein und eine permanente Netzwerkverbindung zu benötigen, kann eine Anwendung in 4D v18 Daten von einer anderen, entfernten 4D Datenbank abrufen, die auf einem 4D Server liegt!

Dank dieser Funktion stehen viele Optionen zur Verfügung. Sie können zum Beispiel Ihre Anwendungen so organisieren, dass sie offline arbeiten und lokale Daten nur dann synchronisieren, wenn die entfernten Daten erreichbar sind. Oder Sie könnten Ihre Daten auf mehreren Servern veröffentlichen und bei Bedarf von einem zum anderen wechseln. Eine andere Möglichkeit wäre die Aufteilung Ihres Datenmodells auf verschiedene Datenbanken( z. B. lokale Daten, internationale Daten). Wie wäre es, wenn Ihre Daten an verschiedenen Orten verteilt sind und dennoch über einen einzigen 4D Client Code (Projektmethoden und Formularobjekte) zugänglich sind? Alle diese Szenarien sind jetzt möglich und dieser Blogbeitrag zeigt Ihnen, wie!

HDI: Wie man mit einem Remote-Datenspeicher arbeitet

Mit 4D v18 kann Ihre 4D Datenbank als REST Server für andere 4D Client Anwendungen genutzt werden. Das bedeutet, dass ein 4D Client mit den von Ihnen freigegebenen Daten interagieren kann (erstellen, lesen, aktualisieren, löschen). Und noch eine gute Nachricht: Diese Interaktion basiert auf ORDA Konzepten, ist also vollständig objektorientiert!

Wie können Sie Ihre 4D Datenbank für den Fernzugriff freigeben?

In den Web-Einstellungen der Datenbank:

  • Konfigurieren Sie auf der Registerkarte Konfiguration einen HTTP-Port (aus Sicherheitsgründen sollten Sie für den Produktionsmodus HTTPS verwenden!)

  • Wählen Sie auf der Registerkarte REST-Ressourcen die Option„Expose as REST Server„.

blank

  • Starten Sie den Webserver. Im obigen Beispiel haben wir uns dafür entschieden, den Server beim Start der Datenbank zu starten.
  • Öffnen Sie Ihre Datenbank auf dem 4D Server.
  • Herzlichen Glückwunsch! Ihre Datenbank ist nun für den Fernzugriff über die IP Ihres Rechners und den von Ihnen konfigurierten Port erreichbar!

Hinweis: Die Verwendung des Web Servers für den Zugriff auf den REST Server erfordert keine Web Server Lizenz. Für Verbindungen werden Standard 4D Client Lizenzen verwendet.

Arbeiten mit entfernten Datenbanken

Befehl Open datastore

Wie wir bereits erwähnt haben, ist Ihre Datenbank über ORDA-Konzepte erreichbar: Eine Datenbank wird über ein Datenspeicherobjekt verwaltet. Daher besteht der erste Schritt darin, das Datastore-Objekt zu ermitteln, das der entfernten Datenbank entspricht, auf die Sie zugreifen möchten. Das ist kein Problem! Rufen Sie den Open datastore mit dem richtigen Hostnamen auf und schon kann es losgehen.

Wir verknüpfen das Datastore-Objekt mit der lokalen ID „students“. Jetzt können wir mit ORDA mit unserer entfernten Datenbank arbeiten (Abfragen ausführen, Entitäten laden/aktualisieren, usw.)

C_OBJECT($connectTo;$schoolDS;$s)
C_TEXT ($dataClass)

//The database contains a Students dataclass
$dataClass :="Students"

$connectTo :=New object("hostname"; "school.acme.com")
$schoolDS :=Open datastore($connectTo; "students") //local id of this remote datastore is "students"

//Start working with ORDA means
ALERT ("They are "+String($schoolDS[$dataClass].all().length)+" students")

//Run an ORDA query on the Students dataclass
$s:=$schoolDS[$dataClass].query("Nachname=:1"; "Smith").first()
If ( # ) ("Student "+ . +" wohnt in "+ . . )$sNull
ALERT$slastname$saddresscity
End if

Lesen Sie in der Open datastore Dokumentation, um mehr darüber zu erfahren, wie Sie über eine gesicherte Verbindung (TLS) auf eine entfernte Datenbank zugreifen können.

Verwendung mehrerer entfernter Datenbanken

Hier ist ein kurzes Beispiel, das zeigt, wie einfach es ist, mit mehreren entfernten Datenbanken zu arbeiten. Wir haben zwei Datenbanken: eine enthält französische Schüler, die andere englische Schüler.

Wir können wählen, ob wir französische oder englische Schüler sehen wollen.

blank

blank

Die Formularmethode:

Case of
: (FORM Event.code=On Load)
Form .frenchServer:="french.acme.com"
Form .englishServer:="english.acme.com"
End case

Die Objektmethode hinter dem Optionsfeld „Französische Schüler anzeigen“:

C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.frenchServer
$students :=Open datastore($connectTo; "french") //datastore containing French students

Form.students:=$students.Students.all()

Die Objektmethode hinter dem Optionsfeld „View English students“:

C_OBJECT($connectTo;$students)
$connectTo :=New object()
$connectTo .hostname:=Form.englishServer
$students :=Open datastore($connectTo; "english") //datastore containing English students

Form.students:=$students.Students.all()

Hinweis: Beim ersten Aufruf des Befehls Open datastore wird das Datenspeicherobjekt in den Speicher geladen und eine Sitzung auf dem Server eröffnet. Bei nachfolgenden Aufrufen wird einfach ein Verweis auf dieses Datenspeicherobjekt zurückgegeben.

Kontrolle des Zugriffs auf Ihre entfernte Datenbank

Um die freigelegte 4D Datenbank zu schützen, können Sie den Zugriff darauf filtern. Schauen wir uns noch einmal den Open datastore Befehl. Wie unten gezeigt, können ein Benutzer und ein Passwort übergeben werden.

C_OBJECT($connectTo;$myStudents)

ON ERR CALL ("manageErrors")

$connectTo :=New object()
$connectTo .hostname:="students.acme.com"
$connectTo .user:="mary@4d.com"
$connectTo .password:=Form.password

//local id of this remote datastore is "students"
$myStudents :=Open datastore($connectTo; "students")

ON ERR CALL ("")

4D bietet zwei Möglichkeiten, den Zugriff auf autorisierte Benutzer zu beschränken:

Verwendung einer 4D Benutzergruppe

Der Zugriff kann über eine 4D Benutzergruppe eingeschränkt werden. Wenn Sie die Datenbank freigeben, wählen Sie auf der Registerkarte REST-Ressourcen der Web-Einstellungsseite die Gruppe aus, die zugreifen darf.

blank

Wenn der Benutzer, der im Befehl Open datastore Befehl angegebene Benutzer zur ausgewählten Gruppe gehört, wird der Zugriff gewährt, andernfalls wird ein Authentifizierungsfehler erzeugt.

Verwenden Sie die Datenbank-Methode der On-Rest-Authentifizierung

Sie können auch die neue On REST-Authentifizierungsdatenbankmethode verwenden, um Ihre eigene Zugriffskontrolle auf die Datenbank zu kodieren, die Sie ausgesetzt haben. Diese Methode empfängt die Anmeldedaten des Benutzers in dem Open datastore Befehl. Geben Sie einfach zurück True zurück, wenn der Benutzer mit Ihrer Ferndatenbank arbeiten darf.

Hier ist ein Beispiel:

C_TEXT($1;$name;$2;$password)
C_BOOLEAN ($0;$result;$3;$digest)
C_OBJECT ($user)

$name :=$1 // The user to provide in Open datastore command
$password :=$2 // The password to provide in Open datastore command
$digest :=$3 // True if password is hashed

$result :=False


//Search for the user in our Users dataclass

$user:=ds.Users.query("name=:1";$name).first()

If ( # ) ( & ( . = )) := :=$userNull
// Passwords are hashed in Users dataclass
If$digest$userpassword$password
$resultTrue
End if
End if


$0$result

Hinweis: Dieds und datastore.getInfo() Befehle wurden aktualisiert und drei neue Methoden wurden hinzugefügt: datastore.startTransaction(), datastore.cancelTransaction(), und datastore.validateTransaction().

Jetzt ist es an der Zeit, den obigen HDI herunterzuladen, um mehr über diese erstaunliche Funktion zu erfahren!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert ist seit 2017 als Product Owner im 4D Produktteam tätig. Als Product Owner ist sie für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen zuständig. Ihre Aufgabe ist es auch, sicherzustellen, dass die Implementierung der Funktionen den Anforderungen des Kunden entspricht. Marie-Sophie ist Absolventin der ESIGELEC Ingenieurschule und begann ihre Karriere als Ingenieurin bei IBM im Jahr 1995. Sie nahm an verschiedenen Projekten teil (Wartungs- oder Build-Projekte) und arbeitete als Cobol-Entwicklerin. Dann arbeitete sie als UML-Designerin und Java-Entwicklerin. In letzter Zeit bestand ihre Hauptaufgabe darin, funktionale Anforderungen zu analysieren und zu schreiben sowie Geschäfts- und Entwicklungsteams zu koordinieren.