18. Februar 2009 

Immer häufiger werde ich beauftragt, bestehende Datenbanken um Module, die ich habe oder gezielt entwickle zu ergänzen. Eine große Hürde stellt die Weiterentwicklung der Datenbank-Struktur dar. Bisher, also bis zur 4D V2004, wurde die Struktur inhouse eingefroren sobald Felder oder Tabellen ergänzt werden mußten. Das ist machbar aber umständlich.

Meine Experimente mit 4D Pack und dem Befehl AP Add table and fields habe ich in Struct_Synro beschrieben. Nicht schlecht aber noch nicht das Gelbe vom Ei.

4D V11 SQL

In der V11 kann ich mit SQL-Befehlen die Daten-Struktur ergänzen. Das geht so:

Zuerst fülle ich mein Array $t_fieldNames mit den vorhandenen Feldnamen der Tabelle. Dann prüfe ich ob ein Feld mit dem Namen bereits existiert, wenn nicht lege ich es an. Das sieht dann z.B. so aus:

If (Find in array($t_fieldNames;"KLASS_Sort_L")<1)
  Begin SQL
    ALTER TABLE KLASSIFIZIERUNG
    ADD KLASS_Sort_L INT32;

  End SQL
End if

Oder ich lege eine neue Tabelle an, wenn sie noch nicht existiert und erzeuge die Felder mit diesem SQL-Statement zwischen Begin SQL und End SQL.
CREATE TABLE IF NOT EXISTS KLASSIFICATION
(KL_ID_L INT32, KL_crea TIMESTAMP, KL_creaVon_A15 VARCHAR(15), KL_mod TIMESTAMP, KL_modVon_A15 VARCHAR(15));

Klappt einwandfrei.

Am 4. Juni 2009 ist eine Technote zu diesem Thema erschienen: SQL Data Types in 4D v11 SQL

Sie werden sich wundern über die Datentypen VARCHAR(15) oder TIMESTAMP. Wo hat er die her? *
Nicht von hier. Dort finden Sie z.B. diese Entsprechung:
C_DATE entspricht SQL_C_TYPE_DATE.
So schlau als wie zuvor?

Auch hier werden Sie nicht glücklich. Dort steht für 4D SQL
Timestamp Date&Time in Day Month Year Hours:Minutes:Seconds: Milliseconds format
und für 4D V11
Date and Time parts handled separately (automatic conversion)

Die Datentypen, die ich zwischen Begin SQL und End SQL brauche, sind unter sql_data_type_name aufgelistet. Was 4D daraus macht habe ich in keinem Handbuch gefunden. Deshalb baue ich mir jetzt meine eigene Tabelle nach der Methode trial & error **

datatypesSQL
Ich brauche in 4Dund typisiere in SQL92 so oder so oder so
TextVARCHAR oder ALPHA_NUMERIC oder TEXT oder CLOB
Alpha nnVARCHAR(nn) für nn von 2 .. 255
DatumTIMESTAMP
ZeitINTERVAL oder DURATION
BooleanBOOLEAN
BildPICTURE
IntegerINT16
LongIntINT32
LongInt64INT64 oder NUMERIC, BIGINT habe ich auch gesehen
RealREAL
FließkommaFLOAT oder DOUBLE PRECISION
BlobBLOB oder BIT VARYING

Summa summarum gefällt mir die Entwicklung die 4D mit der V11 eingeschlagen hat. Es wird immer mehr auf offene und gescheite Standards gesetzt. Zu nennen wären PNG, SVG, XML, SQL92. Das Marketing hat SQL sogar in den Produktnamen gezwungen. Jetzt hilft mir und meinen Kunden der Weg über SQL bis irgendwann die 4D-Komponenten eigene Tabellen haben können.

Ich habe mir einen Wolf in den Dokumentationen gesucht. Ich weiß warum ich die PDF-Doku vorziehe, ohne Spotlight wäre ich verloren. Habe ich es gefunden, kann es in der HTML-Doku auch finden.

* Danke an Rolf und die 4D Werkstatt, alleine wäre ich zu blind gewesen.

** für den eigenen Versuch:
Begin SQL
CREATE TABLE IF NOT EXISTS DATATYPES
(DT_L INT32, DT_I INT16, DT_LL INT64, DT_Alphanumeric ALPHA_NUMERIC, DT_Varchar VARCHAR, DT_Alpha25 VARCHAR(25), DT_Text TEXT, DT_Date TIMESTAMP, DT_ZeitIntervall INTERVAL, DT_ZeitDuration DURATION, DT_Bool BOOLEAN, DT_Numeric NUMERIC, DT_real REAL, DT_Float FLOAT, DT_DoublePrecision DOUBLE PRECISION, DT_Blob BLOB, DT_CLOB CLOB, DT_Picture PICTURE, DT_BitVarying BIT VARYING);

End SQL

4D Themen: Berichte in Arbeit