El siguiente ejemplo muestra cómo la importación de datos puede acelerarse dramáticamente en entorno cliente/servidor. El método Regular Import permite medir cuanto tiempo toma importar los registros utilizando el comando IMPORT TEXT:
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
INPUT FORM([Tabla1];"Import")
$vhStartTime:=Current time
IMPORT TEXT([Tabla1];Document)
$vhEndTime:=Current time
ALERT("La operación toma "+String(0+($vhEndTime-$vhStartTime))+" segundos.")
End if
Con la importación de datos clásica, 4D analiza el archivo de texto, luego para cada registro, crea un nuevo registro, llena los campos con los valores importados y envía el registro al equipo servidor para ser añadido a la base. Por consiguiente circulan numerosas peticiones por la red. Una manera de optimizar la operación es utilizar un procedimiento almacenado para efectuar la importación localmente en el equipo servidor. El equipo cliente carga el documento en un BLOB, luego inicia un procedimiento almacenado que pasa el BLOB como parámetro. El procedimiento almacenado guarda el BLOB en un documento en el disco, luego importa el documento localmente. Por lo tanto, la importación de los datos se realiza localmente (a una velocidad comparable con la de una versión local de 4D) porque se eliminan la mayoría de las peticiones que transitan por la red.
Este es el método de proyecto CLIENT IMPORT. Ejecutado en el equipo cliente, produce la ejecución del procedimiento almacenado SERVER IMPORT que se muestra a continuación:
C_POINTER($1)
C_TEXT($2)
C_TIME($vhDocRef)
C_BLOB($vxDatos)
C_LONGINT(spErrCode)
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
$vhStartTime:=Current time
DOCUMENT TO BLOB(Document;$vxDatos)
If(OK=1)
$spProcesoID:=Execute on server("SERVER IMPORT";32*1024;
"Servidor Import Services";Table($1);$2;$vxDatos)
CLEAR VARIABLE($vxDatos)
Repeat
DELAY PROCESS(Current process;300)
GET PROCESS VARIABLE($spProcesosID;spErrCode;spErrCode)
If(Undefined(spErrCode))
spErrCode:=1
End if
Until(spErrCode<=0)
spErrCode:=1
SET PROCESS VARIABLE($spProcesosID;spErrCode;spErrCode)
$vhEndTime:=Current time
ALERT("Tomó "+String(0+($vhEndTime-$vhStartTime))+" segundos.")
Else
ALERT("No hay suficiente memoría para cargar el documento.")
End if
End if
Este es el método de proyecto SERVER IMPORT ejecutado como un procedimiento almacenado:
C_LONGINT($1)
C_TEXT($2)
C_BLOB($3)
C_LONGINT(spErrCode)
spErrCode:=1
$vpTabla:=Table($1)
INPUT FORM($vpTabla->;$2)
$vsDocName:="Archivo Import "+String(1+Random)
If(On Windows)
$vsDocName:=$vsDocName+".txt"
End if
DELETE DOCUMENT($vsDocName)
BLOB TO DOCUMENT($vsDocName;$3)
IMPORT TEXT($vpTable->;$vsDocName)
DELETE DOCUMENT($vsDocName)
spErrCode:=0
Repeat
DELAY PROCESS(Current process;1)
Until(spErrCode>0)
Nota: el método de proyecto On Windows se lista en la sección del manual Lenguaje de 4D.
Una vez que estos dos métodos se hayan implementado en una base, puede efectuar una importación basada en un procedimiento almacenado, escribiendo por ejemplo:
CLIENT IMPORT(->[Tabla1];"Import")
Si realiza algunas pruebas comparativas, descubrirá que utilizando este método puede importar registros hasta 60 veces más rápido que con una importación regular.