4D incluye un motor SQL integrado. El programa también incluye un servidor SQL que puede ser consultado por otras aplicaciones 4D o de terceras partes (vía el piloto OBDC de 4D).
La documentación SQL de 4D está compuesta de dos partes:
- La Guía de referencia SQL de 4D (Manual de SQL). Este manual describe los diferentes modos de acceso al motor SQL de 4D, la configuración del servidor SQL como también los comandos y palabras claves utilizables en las peticiones SQL (por ejemplo SELECT o UPDATE). Consulte este manual para mayor información sobre la utilización del lenguaje SQL en 4D.
- El tema SQL del manual "Lenguaje" de 4D (SQL). Este tema agrupa los diferentes comandos internos de 4D relativos al uso de SQL en 4D:
- Control del servidor SQL: START SQL SERVER y STOP SQL SERVER
- Acceso directo al motor SQL integrado: SET FIELD VALUE NULL, Is field value Null, QUERY BY SQL
- Gestión de las conexiones a fuentes de datos externas o internas (SQL pass-through): GET DATA SOURCE LIST, Get current data source, SQL LOGIN, SQL LOGOUT.
- Comandos de alto nivel para la manipulación de datos en el marco de conexiones SQL directas o vía ODBC: 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.
Los comandos SQL integrados de 4D comienzan con el prefijo "SQL" e implementan los siguientes principios:
- A menos de que se indique lo contrario, puede utilizar estos comandos con el motor SQL interno 4D o en una conexión externa que se abre directamente o vía ODBC. El comando SQL LOGIN permite definir el tipo de conexión a abrir.
- El alcance de una conexión es el proceso. Si quiere administrar simultáneamente varias conexiones, debe iniciar un proceso por SQL LOGIN.
El comando SQL CANCEL LOAD permite ejecutar varias solicitudes SELECT en la misma conexión. - Puede interceptar los errores ODBC generados durante la ejecución de uno de los comandos SQL de alto nivel utilizando el comando ON ERR CALL. El comando SQL GET LAST ERROR puede utilizarse en este caso para obtener información adicional.
El estándar ODBC (Open DataBase Connectivity) define una librería de funciones estandarizadas. Estas funciones permiten a una aplicación como 4D acceder a través del lenguaje SQL a todos los sistemas de gestión de datos compatibles con ODBC (bases de datos, hojas de cálculo, otras aplicaciones 4D, etc.).
Nota: 4D también permite importar y exportar datos en una fuente ODBC vía los comandos IMPORT ODBC and EXPORT ODBC o manualmente en modo Diseño. Para mayor información, consulte el Manual de Diseño 4D.
Nota: los comandos SQL de alto nivel de 4D permiten implementar soluciones simples para la comunicación entre las aplicaciones 4D y las fuentes de datos ODBC. Si sus aplicaciones necesitan un soporte más extenso del estándar ODBC, necesitará el plug-in ODBC “bajo nivel” de 4D, 4D ODBC Pro.
La siguiente tabla lista las correspondencias establecidas automáticamente por 4D entre los tipos de datos 4D y SQL:
4D Tipo | SQL Tipo |
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 |
Nota: los datos de tipo objeto (
C_OBJECT) no son soportados por el motor SQL de 4D.
4D ofrece dos maneras de insertar expresiones 4D (variables, arrays, campos, expresiones válidas) en las solicitudes SQL: la asociación directa y la definición de parámetros utilizando SQL SET PARAMETER.
La asociación directa se puede efectuar de dos formas:
- Insertando el nombre del objeto 4D a utilizar entre los caracteres << y >> en el texto de la solicitud.
- Precediendo la referencia con dos puntos":".
Ejemplos:
SQL EXECUTE("INSERT INTO emp (empnum,enombre) VALUES (<<vEmpnum>>,<<vEnombre>>)")
SQL EXECUTE("SELECT edad FROM Persona WHERE nombre= :vNombre")
Nota: en modo compilado, no puede utilizar referencias a variables locales (que comienzan por $).
En estos ejemplos, los valores actuales de las variables 4D vEmpnum, vEnombre y Vnombre reemplazarán los parámetros cuando la petición se ejecute. Esta solución también funciona con campos y arrays 4D.
Esta sintaxis de fácil utilización, presenta el inconveniente de no cumplir el estándar SQL y de no permitir la utilización de parámetros de salida. Para remediar esto, puede utilizar el comando SQL SET PARAMETER. Este comando permite definir cada objeto 4D a integrar en una solicitud así como también su modo de utilización (entrada, salida o ambos). Entonces la sintaxis producida es estándar. Para mayor información, consulte la descripción del comando SQL SET PARAMETER.
1. Este ejemplo ejecuta una solicitud SQL que utiliza directamente los arrays 4D asociados:
ARRAY TEXT(MiArrayText;10)
ARRAY LONGINT(MiArrayEnteroLargo;10)
For(vContador;1;Size of array(MiArrayText))
MiArrayText{vContador}:="Text"+String(vContador)
MiArrayEnteroLargo{vContador}:=vContador
End for
SQL LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (campo_alfa, campo_enterolargo) VALUES (<<MiArrayText>>, <<MiArrayEnteroLargo>>)"
SQL EXECUTE(SQLStmt)
2. Este ejemplo permite ejecutar una petición SQL utilizando directamente los campos 4D asociados:
ALL RECORDS([Tabla 2])
SQL LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (campo_alfa, campo_enterolargo) VALUES (<<[Tabla 2]Campo1>"+">,<<[Tabla2]Campo2>>)"
SQL EXECUTE(SQLStmt)
3. Este ejemplo permite ejecutar una búsqueda SQL pasando directamente una variable utilizando un puntero derreferenciado:
C_LONGINT($vLong)
C_POINTER($vPuntero)
$vLong:=1
$vPuntero:=->$vLong
SQL LOGIN("mysql";"root";"")
SQLStmt:="SELECT Col1 FROM TEST WHERE Col1=:$vPuntero"
SQL EXECUTE(SQLStmt)
En modo compilado, puede utilizar referencias de variables locales (comenzando por el carácter $) en instrucciones SQL bajo ciertas condiciones:
- Puede utilizar variables locales dentro de una secuencia Begin SQL / End SQL, excepto con el comando EXECUTE IMMEDIATE;
- Puede utilizar variables locales con el comando SQL EXECUTE cuando estas variables se utilizan directamente en el parámetro de petición SQL y no vía las referencias.
Por ejemplo, el siguiente código funciona en modo compilado:
El siguiente código generará un error en modo compilado:
C_TEXT(tRequest)
tRequest:="select * from t1 into :$myvar"
SQL EXECUTE(tRequest)
La recuperación de los valores en el lenguaje 4D que resulta de las de las consultas SQL se lleva a cabo de dos formas:
- Utilizando los parámetros adicionales del comando SQL EXECUTE (solución recomendada).
- Utilizando la cláusula INTO en la búsqueda SQL misma (solución reservada para casos especiales).
Es posible poner directamente el resultado de una petición SQL en un list box de tipo array. Esta función ofrece un medio rápido de visualizar el resultado de peticiones SQL. Sólo pueden utilizarse las peticiones de tipo SELECT. Este mecanismo no puede utilizarse con una base SQL externa.
Esto funciona de acuerdo a los siguientes principios:
- Cree el list box que recibirá los resultados de la petición. La fuente de datos del list box debe ser Arrays.
- Ejecute la petición SQL de tipo SELECT y asigne el resultado a la
variable asociada al list box. Puede utilizar las palabras claves Begin SQL/End SQL (ver el manual de Lenguaje de 4D). - Las columnas del list box son ordenables y modificables por el usuario.
- Cada nueva ejecución de una petición SELECT con la list box provoca la reinicialización de las columnas (no es posible llenar el mismo list box progresivamente utilizando varias peticiones SELECT).
- Se recomienda dar al list box el mismo número de columnas que las que tendrá en el resultado de petición SQL. Si el número de columnas del list box es inferior al del necesario para la petición SELECT, las columnas se añaden automáticamente. Si el número de columnas del list box es superior al necesario para la petición SELECT, se
ocultan las columnas innecesarias.
Nota: las columnas añadidas automáticamente están relacionadas con las Variables dinámicas de tipo array. Estos arrays dinámicos permanecen siempre y cuando el formulario exista. Una variable dinámica se crea igualmente para cada encabezado. Cuando se llama el comando LISTBOX GET ARRAYS, el parámetro arrVarCols contiene los punteros a los arrays dinámicos y el parámetro arrVarEncabezados contiene los punteros a las variables de encabezados dinámicos. Si una columna añadida es por ejemplo la quinta columna, su nombre es sql_column5 y su nombre de encabezado es sql_header5. - En modo interpretado, los arrays existentes utilizados por el list box pueden redigitarse automáticamente de acuerdo a los datos enviados por la petición SQL
Ejemplo
Queremos recuperar todos los campos de la tabla PERSONAS y ubicar su contenido en el list box cuyo nombre de variable es vlistbox. En el método de objeto de un botón (por ejemplo), es suficiente escribir:
Begin SQL
SELECT * FROM PEOPLE INTO <<vlistbox>>
End SQL