RECEIVE RECORD
RECEIVE RECORD {( tabla )}
Parámetro | Tipo | Descripción | |
---|---|---|---|
tabla | Table | → | Tabla en la cual recibir el registro o Tabla por defecto, si se omite |
Descripción
RECEIVE RECORD recibe un registro en tabla del puerto serial o de un documento abierto por el comando SET CHANNEL. El registro debe haber sido envíado con SEND RECORD. Cuando ejecuta RECEIVE RECORD, se crea automáticamente un nuevo registro en tabla. Si el registro se recibe correctamente, entonces debe utilizar SAVE RECORD para guardar el nuevo registro.
Se recibe el registro completo. Esto significa que también se reciben todos los subregistros, imágenes y BLOBs almacenados en el registro.
Importante: cuando los registros se envía y reciben utilizando SEND RECORD y RECEIVE RECORD, la estructura de la tabla fuente y la estructura de la tabla de destino deben ser compatibles. Si no lo son, 4D convertirá los valores de acuerdo a las definiciones de las tablas cuando se ejecute RECEIVE RECORD.
Notas:
- Si recibe un registro de un documento utilizando este comando, el documento debe haber sido abierto utilizando el comando SET CHANNEL. No puede utilizar RECEIVE RECORD con un documento abierto con Open document, Append document o Create document.
- Durante la ejecución de RECEIVE RECORD, el usuario puede interrumpir la recepción presionando Ctrl-Alt-Mayús (Windows) o Comando-Opción-Mayús (Macintosh). Esta interrupción genera un error -9994 que puede interceptar con el método instalado por el comando ON ERR CALL. Generalmente, sólo debe manejar la interrupción de una recepción durante una comunicación sobre puerto serial.
Ejemplo
El uso combinado de SEND VARIABLE, SEND RECORD, RECEIVE VARIABLE y RECEIVE RECORD es ideal para archivar datos o intercambiar datos entre bases monopuesto idénticas utilizada en diferentes lugares. Puede intercambiar datos entre bases 4D utilizando los comandos de importación/exportación como EXPORT TEXT y IMPORT TEXT. Sin embargo, si sus datos contienen imágenes o tablas relacionadas, utilizar SEND RECORD y RECEIVE RECORD es mucho más conveniente.
Por ejemplo, la documentación que está leyendo ha sido creada utilizando 4D y 4D Write. Como varios escritores en diferentes lugares del mundo estaban trabajando en este proyecto, necesitábamos una forma simple de intercambiar datos entre las diferentes bases de datos. Esta es una vista simplificada de la estructura de la base:
La tabla [Commands] contiene la descripción de cada comando o sección. Las tablas [CM US Params] y [CM FR Params] contienen respectivamente los parámetros de cada comandos en Inglés y Francés. La tabla [CM See also] contiene los comandos indicados como referencias para cada comando o sección. El intercambio de la documentación entre las bases consiste en enviar los registros de [Commands] así como sus registros relacionados. Para hacerlo, utilizamos SEND RECORD y RECEIVE RECORD. Adicionalmente, utilizamos SEND VARIABLE y RECEIVE VARIABLE para marcar los documentos de importación/exportación con etiquetas.
Este es el método de proyecto (simplificado) para exportar la documentación:
// Método de proyecto CM_EXPORT_SEL
// Este método funciona con la selección actual de la tabla [Commands]
SET CHANNEL(12;"") // Permitimos al usuario crear y abrir un documento channel
If(OK=1)
// Marcamos el documento con un variable que indique su contenido
// Nota: la variable de proceso BUILD_LANG indica si los datos US (Inglés) o FR (Francés) son enviados
$vsTag:="4DV6COMMAND"+BUILD_LANG
SEND VARIABLE($vsTag)
// Enviar una variable indicando cuántos [Commands] son enviados
$vlNbCmd:=Records in selection([Commands])
SEND VARIABLE($vlNbCmd)
FIRST RECORD([Commands])
// Para cada comando
For($vlCmd;1;$vlNbCmd)
// Enviar el registro [Commands]
SEND RECORD([Comands])
// Selección de todos los registros seleccionados
RELATE MANY([Commands])
// Dependiendo del lenguaje, enviar una variable indicando
// el número de parámetros que sigue
Case of
:(BUILD_LANG="US")
$vlNbParm:=Records in selection([CM US Params])
:(BUILD_LANG="FR")
$vlNbParm:=Records in selection([CM FR Params])
End case
SEND VARIABLE($vlNbParm)
// Enviar los registros de los parámetros (si hay)
For($vlParm;1;$vlNbParm)
Case of
:(BUILD_LANG="US")
SEND RECORD([CM US Params])
NEXT RECORD([CM US Params])
:(BUILD_LANG="FR")
SEND RECORD([CM FR Params])
NEXT RECORD([CM FR Params])
End case
End for
// Enviar una variable indicando cuántos “See Also” siguen
$vlNbSee:=Records in selection([CM See Also])
SEND VARIABLE($vlNbSee)
// Enviar los registros [See Also] (si hay)
For($vlSee;1;$vlNbSee)
SEND RECORD([CM See Also])
NEXT RECORD([CM See Also])
End for
// Ir al siguiente registro [Commands] y continuar la exportación
NEXT RECORD([Commands])
End for
SET CHANNEL(11) // Cerrar el documento
End if
Este es el método de proyecto (simplificado) de importación de la documentación:
// Método de proyecto CM_IMPORT_SEL
SET CHANNEL(10;"") // Permitimos al usuario abrir un documento existente
If(OK=1) // Si un documento estaba abierto
RECEIVE VARIABLE($vsTag) // Tratamos de recibir la variable marcada esperada
If($vsTag="4DV6COMMAND@") // ¿Recibimos la etiqueta correcta?
$CurLang:=Substring($vsTag;Length($vsTag)-1) // Extraemos el lenguaje de la etiqueta
If(($CurLang="US") | ($CurLang="FR")) // ¿Recibimos un lenguaje válido
RECEIVE VARIABLE($vlNbCmd) // ¿Cuántos comandos hay en este documento?
If($vlNbCmd>0) // Si hay al menos uno
For($vlCmd;1;$vlNbCmd) // Para cada registro [Commands] archivado
// Recepción del registro
RECEIVE RECORD([Commands])
// Llamar una subrutina que guarde el nuevo registro o copie sus valores
// en un registro existente
CM_IMP_CMD($CurLang)
// Recibir el número de parámetros (si hay)
RECEIVE VARIABLE($vlNbParm)
If($vlNbParm>=0)
// Llamar una subrutina que llama RECEIVE RECORD luego guarda los nuevos registros
// o los copia en registros existentes
CM_IMP_PARM($vlNbParm;$CurLang)
End if
// Recepción dle número de “See Also” (si hay)
RECEIVE VARIABLE($vlNbSee)
If($vlNbSee>0)
// Llamar una subrutina que llame RECEIVE RECORD luego guarde los nuevos registros
// o los copies en registros existentes
CM_IMP_SEEA($vlNbSee;$CurLang)
End if
End for
Else
ALERT("El número de comandos en este documento de exportación es inválido.")
End if
Else
ALERT("El lenguaje de este documento de exportación es desconocido.")
End if
Else
ALERT("Este documento NO es un documento de exportación de comandos.")
End if
SET CHANNEL(11) // Cerrar documento
End if
Note que no probamos la variable OK mientras recibimos los datos ni tratamos de interceptar los eventuales errores. Sin embargo, como almacenamos variables en el documento que describe el documento en sí mismo, si estas variables, una vez recibidas, tienen sentido, la probabilidad de error es muy baja. Si por ejemplo un usuario abre mal un documento, la primera prueba detiene la operación de inmediato.
Variables y conjuntos del sistema
La variable sistema OK toma el valor 1 si se recibe el registro. De lo contrario, toma el valor 0.