4D bietet eine integrierte SQL Engine. Das Programm enthält auch einen SQL Server, den andere 4D Anwendungen oder third-party Anwendungen über den 4D ODBC Treiber abfragen können.
Die SQL Dokumentation in 4D besteht aus zwei Bereichen:
- 4D SQL Reference Guide (4D - SQL Reference): Dieses Handbuch beschreibt die verschiedenen Wege, um auf die 4D SQL Engine zuzugreifen, die Konfiguration des SQL Server sowie die Befehle und Schlüsselwörter für SQL Anfragen, z.B. SELECT oder UPDATE. Hier finden Sie ausführliche Informationen zur Implementierung der SQL Sprache in 4D
- Kapitel SQL im Handbuch 4D Programmiersprache (SQL): Es beschreibt die verschiedenen 4D high level Befehle zur Verwendung von SQL in 4D:
- SQL Server steuern: START SQL SERVER und STOP SQL SERVER
- Direkt auf die integrierte SQL Engine zugreifen: SET FIELD VALUE NULL, Is field value Null, QUERY BY SQL.
- Verbindungen an externe oder interne Datenquellen (SQL pass-through) verwalten: GET DATA SOURCE LIST, Get current data source, SQL LOGIN, SQL LOGOUT.
- High-level Befehle, um Daten im Rahmen direkter SQL Verbindungen oder via ODBC zu verwalten: Begin SQL, End SQL, SQL CANCEL LOAD, SQL LOAD RECORD, SQL EXECUTE, SQL End selection, SQL SET OPTION, SQL SET PARAMETER, SQL GET LAST ERROR, SQL GET OPTION.
Die integrierten SQL Befehle beginnen mit der Vorsilbe SQL. Sie führen folgendes aus:
- Sie können diese Befehle mit der 4D internen SQL Engine oder in einer externen Verbindung verwenden, die direkt oder via ODBC geöffnet wird. Über den Befehl SQL LOGIN können Sie die Art der zu öffnenden Verbindung angeben.
- Die Reichweite einer Verbindung ist der Prozess. Wollen Sie mehrere gleichzeitige Verbindungen verwalten, müssen Sie mit dem Befehl SQL LOGIN einen Prozess starten.
- Mit dem Befehl ON ERR CALL können Sie jeden ODBC Fehler abfangen, der während der Ausführung eines high-level SQL Befehls auftritt. Über den Befehl SQL GET LAST ERROR erhalten Sie zusätzliche Informationen.
Der ODBC Standard (Open DataBase Connectivity) spezifiziert eine Library mit standardisierten Funktionen. Damit kann eine Anwendung wie 4D via SQL Programmiersprache auf jedes ODBC-kompatible Datenmanagement-System, wie Datenbanken, Tabellenkalkulation, andere 4D Programme, etc. zugreifen.
4D ermöglicht auch, Daten in eine ODBC Quelle zu importieren bzw. daraus zu exportieren, entweder über die Befehle IMPORT ODBC oder EXPORT ODBC oder "manuell" im Designmodus. Weitere Informationen dazu finden Sie im Abschnitt Import und Export über ODBC Datenquelle des Handbuchs 4D Designmodus.
Hinweis: Die high-level SQL Befehle von 4D eignen sich für einfache Vorgehensweisen, über die 4D Anwendungen mit ODBC Datenquellen kommunizieren können. Für eine komplexere Unterstützung von ODBC Standards benötigen Sie 4D ODBC Pro,das “low level” ODBC Plug-In für 4D.
Nachfolgende Tabelle zeigt die Entsprechungen, die 4D automatisch zwischen 4D und SQL Datentypen herstellt:
4D Typ | SQL Typ |
C_STRING | SQL_C_CHAR |
C_TEXT | SQL_C_CHAR |
C_REAL | SQL_C_DOUBLE |
C_DATE | SQL_C_TYPE_DATE |
C_TIME | SQL_C_TYPE_TIME |
C_BOOLEAN | SQL_C_BIT |
C_INTEGER | SQL_C_SHORT |
C_LONGINT | SQL_C_SLONG |
C_BLOB | SQL_C_BINARY |
C_PICTURE | SQL_C_BINARY |
C_GRAPH | SQL_C_BINARY |
Hinweis: Der SQL Kernel von 4D unterstützt nicht Daten vom Typ Objekt (C_OBJECT).
4D bietet zwei Wege, um 4D Ausdrücke (Variablen, Arrays, Felder, Zeiger, gültige Ausdrücke) in SQL Anfragen einzufügen: Direkte Assoziation und Parameter setzen über den Befehl SQL SET PARAMETER.
Bei der direkten Assoziation sind 2 Wege möglich:
- Sie setzen den Namen des 4D Objekts im Anfragetext zwischen spitze Klammern
- Sie setzen einen Doppelpunkt vor die Referenz:
SQL EXECUTE("INSERT INTO emp (empnum,ename) VALUES (<<vEmpnum>>,<<vEname>>)")
SQL EXECUTE("SELECT age FROM People WHERE name= :vName")
Hinweis: Im kompilierten Modus können Sie keine Referenzen auf lokale Variablen verwenden (mit vorangestellten Symbol $).
In diesen Beispielen ersetzen die aktuellen Werte der 4D Variablen vEmpnum, vEname und vName die Parameter, wenn die Anfrage ausgeführt wird. Das funktioniert auf dieselbe Art mit 4D Feldern und Arrays.
Diese einfache Syntax hat jedoch den Nachteil, dass sie nicht mit den SQL Standards im Einklang ist und keine Ausgabeparameter zulässt. Um dem abzuhelfen, verwenden Sie den Befehl SQL SET PARAMETER. Damit integrieren Sie jedes 4D Objekt in eine Anfrage und definieren seine Verwendungsart (Eingabe, Ausgabe oder beides). Auf diese Weise wird eine standardmäßige Syntax erstellt.
Beispiele:
1. Dieses Beispiel führt eine SQL Anfrage aus, die direkt die zugewiesenen 4D Arrays verwendet:
ARRAY TEXT(MyTextArray;10)
ARRAY LONGINT(MyLongintArray;10)
For(vCounter;1;Size of array(MyTextArray))
MyTextArray{vCounter}:="Text"+String(vCounter)
MyLongintArray{vCounter}:=vCounter
End for
SQL LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES (<<MyTextArray>>, <<MyLongintArray>>)"
SQL EXECUTE(SQLStmt)
2. Dieses Beispiel führt eine SQL Anfrage aus, die direkt die zugewiesenen 4D Felder verwendet:
ALL RECORDS([Table 2])
SQL LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES (<<[Table 2]Field1>"+">,<<[Table 2]Field2>>)"
SQL EXECUTE(SQLStmt)
3. Dieses Beispiel führt eine SQL Anfrage aus, die direkt Variableninhalt über einen dereferenzierten Zeiger übergibt:
C_LONGINT($vLong)
C_POINTER($vPointer)
$vLong:=1
$vPointer:=->$vLong
SQL LOGIN("mysql";"root";"")
SQLStmt:="SELECT Col1 FROM TEST WHERE Col1=:$vPointer";
SQL EXECUTE(SQLStmt)
Im kompilierten Modus können Sie unter bestimmten Bedingungen in SQL Statements lokale Variablenreferenzen (mit vorangestelltem Zeichen $) verwenden:
- Sie können lokale Variablen innerhalb einer Sequenz Begin SQL / End SQL einsetzen, außer für den Befehl EXECUTE IMMEDIATE;
- Sie können lokale Variablen mit dem Befehl SQL EXECUTE einsetzen, wenn diese Variablen direkt im Parameter der SQL Anfrage und nicht über Referenzen verwendet werden.
So funktioniert z.B. folgender Code im kompilierten Modus:
während folgender Code einen Fehler im kompilierten Modus generiert:
C_TEXT(tRequest)
tRequest:="select * from t1 into :$myvar"
SQL EXECUTE(tRequest)
In 4D gibt es zwei Möglichkeiten, Werte in der 4D Programmiersprache wiederzufinden, die sich aus SQL Abfragen ergeben:
- Über den zusätzlichen Parameter im Befehl SQL EXECUTE (empfohlene Lösung)
- Über die INTO Klausel in der SQL Anfrage selbst (Alternativ-Lösung für spezifische Fälle)
Sie können die Ergebnisse einer SQL-Anfrage direkt in ein Array vom Typ Listbox setzen. So können Sie sich rasch die Ergebnisse von SQL Anfragen ansehen. Es sind nur Suchläufe vom Typ SELECT möglich (siehe Handbuch 4D SQL Reference). Dieser Mechanismus lässt sich nicht mit einer externen SQL Datenbank verwenden.
Dabei gilt folgendes:
- Sie erstellen die Listbox zum Empfangen des Suchergebnisses. Die Datenquelle der Listbox muss vom Typ Array sein.
- Führen Sie eine SQL-Suche vom Typ SELECT aus und weisen Sie das Ergebnis der mit der Listbox verknüpften Variablen zu. Sie können die 4D Tags Begin SQL/End SQL verwenden.
- Listbox-Spalten lassen sich vom Benutzer sortieren oder ändern.
- Bei erneuter Ausführung einer Anfrage mit SELECT werden die Spalten neu gefüllt. Es ist nicht möglich, dieselbe Listbox mit mehreren SELECT Anfragen nacheinander zu füllen.
- Es wird empfohlen, der Listbox die gleiche Anzahl Spalten zu geben wie im Ergebnis der SQL Anfrage sind. Gibt es weniger Listbox-Spalten als für die SELECT Anfrage erforderlich, werden automatisch Spalten hinzugefügt. Gibt es mehr Spalten als für die SELECT Anfrage erforderlich, werden die nicht benötigten Spalten automatisch ausgeblendet.
Hinweis: Den automatisch hinzugefügten Spalten werden Variablen vom Typ Dynamische Variablen zugewiesen, d.h. sie bestehen solange wie das Formular. Eine dynamische Variable wird auch für jeden Kopfteil erstellt. Beim Aufrufen des 4D Befehls LISTBOX GET ARRAYS enthält der Parameter arrColVars Zeiger auf die dynamischen Arrays und der Parameter arrHeaderVars Zeiger auf die dynamischen Kopfteilvariablen. Ist die hinzugefügte Spalte z.B. die fünfte Spalte, lautet ihr Name sql_column5 und ihr Kopfteil sql_header5. - Im interpretierten Modus lassen sich vorhandene Arrays, welche die Listbox verwendet, automatisch entsprechend der von der SQL-Anfrage gesendeten Daten erneut tippen.
Beispiel:
Wir wollen nach allen Datenfeldern der Tabelle [PEOPLE] suchen und den Inhalt mit der Variablen vlistbox in die Listbox setzen. Für die Objektmethode einer Schaltfläche (als eine Möglichkeit) schreiben Sie:
Begin SQL
SELECT * FROM PEOPLE INTO <<vlistbox>>
End SQL