4D v14 R5 - Actualización Bienvenido a 4D v14 R5, la última versión del programa de integración continua de 4D. Este manual describe todas las nuevas funcionalidades e implementaciones que se encuentran en esta versión. Lenguaje Modo Diseño 4D Server Web Server 4D Internet Commands 4D SVG 4D Pack 4D Write Pro (preversión técnica) Optimizaciones Lenguaje Get database measures Get database parameter y SET DATABASE PARAMETER OBJECT GET COORDINATES Ventanas formularios barras de herramientas Clickcount LISTBOX GET CELL COORDINATES Get database measures Get database measures {( options )} -> Resultado Descripción A partir de 4D v14 R5, el comando Get database measures puede devolver nueva información sobre el uso de los índices, las búsquedas y las ordenaciones. Bajo ciertas condiciones (que se describe a continuación), nuevos atributos estarán disponibles en los objetos "tablas" e "índices": nuevos atributos para "tablas": "campos" y "búsquedas" nuevos atributos para "índices": "queryCount", "sortCount", "insertKeyCount", "deleteKeyCount" Estos elementos de información le permiten analizar y optimizar la configuración interna de su base de datos. Por ejemplo, para un índice, un alto número de elementos "insertKeyCount" y un bajo número de elementos "queryCount" y "sortCount" pueden indicar que el índice es innecesario. Además, el parámetro options ahora acepta un array texto como propiedad "ruta". Nuevos atributos para el objeto tablas El objeto "tables.table" ahora puede contener hasta dos nuevas propiedades, dependiendo de las búsquedas y ordenaciones reales realizadas en la tabla: "fields" "queries" fields "fields" es un objeto que contendrá tantos atributos de nombre de campo (que también son sub-objetos) como el número de campos que se utilizan para búsquedas y ordenaciones. Cada objeto nombre de campo contiene: un objeto "queryCount" (con o sin historia, en función del parámetro options) si una búsqueda se ha realizado utilizando este campo y/o un objeto "sortCount" ( en función del parámetro options) si una ordenación se ha realizado utilizando este campo. Este atributo no se basa en el uso de índices; Todos los tipos de búsquedas y ordenaciones se tienen en cuenta. Ejemplo: Desde el lanzamiento de la base, varias búsquedas y ordenaciones se han efectuado utilizando los campos CompID, Name y FirstName. El objeto devuelto contiene el sub-objeto "fields" (options con ruta y sin historial): { "DB": { "CompID": { } "tables": { }, "value": 1 "value": 3 "sortCount": { } (...) "Employees": { "queryCount": { "Name": { }, } }, "value": 2 "fields": { "value": 3 "queryCount": { "sortCount": { "FirstName": { } Nota: el atributo "fields" sólo se crea si una búsqueda u ordenación se ha realizado sobre la tabla; de lo contrario este atributo no estará presente. queries "queries"" es un array de objetos que ofrece una descripción de cada búsqueda realizada en la tabla. Cada elemento del array contendrá tres atributos: "queryStatement" (cadena): cadena de consulta que contiene los nombres de campos, pero no los valores búscados. Por ejemplo: "(Companies.PK_ID != ?)" "queryCount" (objeto): "value" (número): número de veces que la sentencia de búsqueda se ha ejecutado, sin importar los valores buscados "history" (array de objetos) (si se solicita en options): propiedades del historial estándar "value" y "time" "duration" (objeto) (si "value" es > 0) "value" (number): número de milisegundos "history" (array de objetos) (si se solicita en options): propiedades del historial estándar "value" y "time" Nota: el atributo "queries" se crea cuando al menos una búsqueda se ha realizado en la tabla. Ejemplo: Desde el lanzamiento de la base, una sola búsqueda se ha realizado en la tabla empleados (options con ruta y con historial): { "DB": { "duration": { { 2022 }, (...) "tables": { "Employees": { "queries": [ { "queryStatement": "(Employees.Name == ?)", "queryCount": { "value": 1, "history": [ { "value": 1, "time": -2022 } ] }, "value": 2, "history": [ "value": 2, "time": } ] } Nuevos atributos para el objeto indexado El objeto "indexes.table.field" ahora puede contener hasta cuatro nuevos sub-objetos en función del uso del índice de la base desde su lanzamiento: "insertKeyCount": se actualiza cuando se inserta una nueva llave de índice "deleteKeyCount": se actualiza cuando se elimina una llave de índice "queryCount": se actualiza cuando se utiliza un índice para una búsqueda "sortCount": se actualiza cuando se utiliza un índice para una ordenación Sólo existen estas llaves si sus operaciones correspondientes se han realizado en algún momento desde el lanzamiento de la base.. Ejemplo: Desde el lanzamiento de la base, 2 registros se han creado y 16 registros se han eliminado en la tabla [Companies]. Esta tabla tiene un campo "name" que está indexado. La tabla también se ha consultado y ordenado utilizando este campo. El objeto resultante contendrá: { "DB": { "indexes": { "queryCount": { "sortCount": { "value": 2 "value": 16 "Companies": { "value": 41 "value": 3 }, } (...) "Name": (...) }, }, "insertKeyCount": { "deleteKeyCount": { Array de path en el parámetro options Ahora puede pasar un array de cadenas como una propiedad "path" del objeto options. Esta propiedad contiene un array de rutas de acceso completas de las propiedades específicas que desea obtener, por ejemplo, ["DB.tables.Employee.records.diskWriteBytes", "DB.tables.Employee.records.diskReadCount","DB.dataSegment1.diskReadBytes"]. Sólo los valores correspondientes son devueltos en el objeto "DB". Get database parameter y SET DATABASE PARAMETER Get database parameter ( {aTable ;} selector {; stringValue} ) -> Resultado SET DATABASE PARAMETER ( {aTable ;} selector ; value ) Descripción Un nuevo parámetro selector está disponible para los comandos Get database parameter y SET DATABASE PARAMETER: Constante Tipo Use legacy network layer Entero largo Valor 87 Alcance: 4D en modo local y 4D Server. Se conserva entre dos sesiones: sí Descripción: define u obtiene el estado actual de la capa de red legacy para las conexiones cliente/servidor. La capa de red legacy está en desuso a partir de 4D v14 R5 y debe ser reemplazada progresivamente en sus aplicaciones con la capa de red ServerNet. ServerNet será necesario en las próximas versiones de 4D para beneficiarse de las futuras evoluciones de la red. Por razones de compatibilidad, la capa de red legacy aún se soporta para permitir una transición sin problemas para las aplicaciones existentes; (se usa por defecto en aplicaciones convertidas de una versión anterior a v14 R5). Pase 1 en este parámetro para utilizar la capa de red legacy (y desactivar ServerNet) para las conexiones cliente/servidor, y pase 0 para deshabilitar la red legacy (y utilizar ServerNet). Esta propiedad también se puede definir mediante la opción "Usar capa de red legacy" que se encuentra en la página "Compatibilidad" de las Propiedades de la base (ver Nueva capa red ServerNet). En esta sección, también puede encontrar una discusión acerca de la estrategia de migración. Le recomendamos que active ServerNet tan pronto como sea posible. Tendrá que reiniciar la aplicación para que este parámetro sea tenido en cuenta. No está disponible en versión 4D Server v14 R5 de 64 bits para OS X, que sólo soporta ServetNet; (siempre devuelve 0). Posibles valores: 0 ó 1 (0 = no utilizan capa legacy, 1 = utilizan capa legacy) Valor por defecto: 0 en bases de datos creadas con 4D v14 R5 o superior, 1 en bases de datos convertidas desde 4D v14 R4 o anterior. OBJECT GET COORDINATES OBJECT GET COORDINATES ( {* ;} objeto ; izq; arriba ; derecha ; abajo ) Descripción Tema: Objetos (Formularios) El comando OBJECT GET COORDINATES ahora puede devolver las coordenadas de partes específicas del listbox, es decir, columnas, encabezados, pies de página, y no sólo los del objeto listbox padre. En versiones anteriores, este comando siempre devolvía las coordenadas del listbox padre, independientemente de la parte del listbox a la que se aplique. A partir de 4D v14 R5, cuando el parámetro object referencia un encabezado, una columna o un pie de página del listbox, las coordenadas devueltas son las del sub-objeto listbox designado. Puede utilizar esta nueva funcionalidad, por ejemplo, para mostrar un pequeño icono en la celda de encabezado de un listbox cuando se pasa el cursor sobre ella, indicando al usuario que puede hacer clic para mostrar un menú contextual. Nota de compatibilidad: si utiliza este comando con un encabezado, una columna o un pie de list box en sus aplicaciones existentes, las coordenadas devueltas serán diferentes después de la conversión en 4D v14 R5 o superior. Si desea obtener las coordenadas de todo el list box, es necesario cambiar el código para que el comando se llame en el propio objeto listbox en lugar de un sub-objeto. Por razones de coherencia, el marco de referencia utilizado es el mismo cuando el objeto es un listbox o un sub-objeto de list box: el origen es la esquina superior izquierda del formulario que contiene el objeto. Para los sub-objetos listbox, las coordenadas devueltas son teóricas; tienen en cuenta el desplazamiento aplicado al list box antes de que ocurra un posible clipping. Como resultado, el sub-objeto puede que no sea visible (o sólo parcialmente) en sus coordenadas, y estas coordenadas pueden estar fuera de los límites del formulario (o incluso ser negativas). Para averiguar si el sub-objeto es visible (y que parte es visible) es necesario comparar las coordenadas devueltas con las coordenadas listbox, mientras considera las siguientes reglas: Los límites de los sub-objetos dependen de las coordenadas de su listbox padre (devuelto por OBJECT GET COORDINATES en el listbox). Los sub-objetos encabezado y pie de página se muestran sobre el contenido de la columna: cuando las coordenadas de una columna cruzan las coordenadas de las líneas de encabezado o pie de página, a continuación, la columna no se muestra en esta intersección. Los elementos de las columnas bloqueadas se muestran por encima de los elementos de las columnas desplazables: cuando las coordenadas de un elemento en una columna desplazable se cruzan las coordenadas de un elemento en una columna bloqueada, luego no se muestra en esta intersección. Por ejemplo, considere el siguiente gráfico, donde las coordenadas de la columna Capital son simbolizadas por un rectángulo rojo: Como puede ver en la primera imagen, la columna es más grande que el listbox, por lo que sus coordenadas van más allá del límite inferior del listbox, incluyendo el pie de página. En la segunda imagen, el listbox se ha desplazado, por lo que la columna también se ha movido "bajos" las áreas de la columna Lenguaje y de encabezado. En cualquier caso, para calcular la parte visible real (zona verde), es necesario restar las áreas rojas. Ejemplo Para las necesidades de su interfaz, usted desea rodear el área en la que el usuario hizo clic con un rectángulo rojo: En el método objeto del listbox, puede escribir: OBJECT SET VISIBLE(*;"rectangleInfo";False) //inicializar un rectángulo rojo $ptr:=OBJECT Get pointer(Object current) OBJECT GET COORDINATES($ptr->;$x1;$y1;$x2;$y2) OBJECT SET VISIBLE(*;"RedRect";True) OBJECT SET COORDINATES(*;"RedRect";$x1;$y1;$x2;$y2) OBJECT GET COORDINATES(*;"LB1";$lbx1;$lby1;$lbx2;$lby2) If($lby1>$y1)|($lby2<$y2)&NBSP; // si el área en la que se hace clic está fuera del listbox OBJECT SET VISIBLE(*;"Alert";True)&NBSP; // mostrar un alerta Else OBJECT SET VISIBLE(*;"Alert";False) End if El método devuelve las coordenadas teóricas. Si el listbox es redimensionado, puede necesitar calcular el recorte para saber qué parte es visible: Ventanas formularios barras de herramientas 4D v14 R5 incluye una serie de implementaciones destinadas a ayudar a los desarrolladores a diseñar y administrar barras de herramientas personalizadas. Las barras de herramientas son ventanas con propiedades específicas en cuanto a su posición y tamaño. Los siguientes comandos soportan la creación y la gestión de barras de herramientas: Open form window: acepta el nuevo tipo Toolbar form window Tool bar height: devuelve la altura de la barra de herramientas personalizada HIDE TOOL BAR y SHOW TOOL BAR: anteriormente obsoletos, estos comandos se han reactivado para la gestión de barras de herramientas personalizadas. Open form window Tema: Ventanas Open form window ( {aTable ;} formName {; type {; hPos {; vPos {; *}}}} ) -> Resultado El comando Open form window ahora puede crear ventanas formulario de tipo Barra de herramientas. Una nueva constante ha sido añadido al tema "Crear ventana formulario" y utilizable en el parámetro type: Constante Tipo Valor Toolbar form window Entero largo 35 Cuando se pasa la constante Toolbar form window, la ventana se crea con la ubicación, el tamaño y las propiedades gráficas de una barra de herramientas, es decir: La ventana se mostrará siempre justo debajo de la barra de menús El tamaño horizontal de la ventana se ajustará automáticamente para llenar todo el espacio disponible horizontal en el escritorio (en OS X) o dentro de la ventana principal de 4D (en Windows). El tamaño vertical de la ventana se basa en las propiedades del formulario, como todos los otros tipos de ventanas formulario. La ventana no tiene bordes, no se puede mover y no se puede redimensionar manualmente, y HPOS, los parámetros posH, PosV y * se ignoran si se pasan. No es posible crear al mismo tiempo dos ventanas de barra de herramientas diferentes. Si Crear ventana formulario se llama con el tipo Formulario ventana barra de herramientas mientras ya existe una ventana de barra de herramientas, se genera un error -10613 ("No se puede crear dos ventanas formularios de tipo barra de herramientas"). Nota sobre las ventana formulario barra de herramientas y modo pantalla completa OS X: si su aplicación muestra a la vez una ventana barra de herramientas y una ventana estándar que soporta el modo pantalla completa (opción Con modo pantalla completa Mac), las reglas de interfaz requieren que se oculte la barra de herramientas cuando una ventana estándar entra en modo pantalla completa. Para saber si una ventana ha cambiado al modo de pantalla completa, simplemente pruebe si su tamaño vertical es exactamente el mismo que la altura de la pantalla (ver abajo). Altura barra de herramientas Tema: Windows (comando desplazado desde el tema "Interfaz de usuario") Tool bar height -> Resultado Parámetro Tipo Entero Resultado largo Descripción <- Altura (expresada en píxeles) de la barra de herramientas o 0 si la barra de herramientas está oculta A partir de 4D v14 R5, este comando también funciona con las barras de herramientas personalizadas creadas por el comando Open form window utilizando el tipo Toolbar form window. Este comando devuelve la altura de la barra de herramientas visible actual, expresada en píxeles. Puede ser la barra de herramientas del modo Diseño de 4D, o una barra de herramientas creada por Open form window, dependiendo del contexto (la barra de herramientas del modo Diseño se oculta automáticamente si se muestra una barra de herramientas personalizada creada por Open form window). Si la barra de herramientas está oculta, el comando devuelve 0. HIDE TOOL BAR y SHOW TOOL BAR Tema: Ventanas (comandos desplazados desde el tema "User interface") SHOW TOOL BAR No requiere ningún parámetro HIDE TOOL BAR No requiere ningún parámetro Estos comandos ya no son obsoletos en 4D partir de la versión 14 R5: ahora se pueden usar para manejar las ventanas formulario de barras de herramientas personalizadas creadas con el comando Open form window para el proceso actual. SHOW TOOL BAR: si se ha abierto una ventana barra de herramientas (llamando Open form window con la opción Toolbar form window), el comando hace que esta ventana sea visible. Si la ventana barra de herramientas ya era visible o no existe, este comando no hace nada. HIDE TOOL BAR: si se ha abierto una ventana de la barra de herramientas (llamando Open form window con la opción Toolbar form window), el comando oculta esta ventana. Si la ventana barra de herramientas ya estaba oculta o no existe, este comando no hace nada. Ejemplo En OS X, que se ha definido una barra de herramientas personalizada y una ventana estándar con la opción Has full screen mode Mac. Cuando una ventana estándar es maximizada por un usuario mientras se muestra la ventana de barra de herramientas, usted no desea que la ventana maximizada sea solapada por la barra de herramientas. Para evitar esto, en el evento "On Resize" del formulario de la ventana estándar, es necesario detectar cuando la ventana está en modo de pantalla completa y luego llamar a HIDE TOOL BAR: Case of :(Form event=On Resize) GET WINDOW RECT($left;$top;$right;$bottom) If(Screen height=($bottom-$top)) HIDE TOOL BAR Else SHOW TOOL BAR End if End case Has toobar button Mac constant deprecated La constante Has toolbar button Mac es obsoleta, la opción correspondiente ha sido desaprobada por Apple desde OS X 10.6. La constante estaba disponible en los temas "Crear ventana", "Crear ventana formulario". Se ha cambiado el nombre _O_Has toolbar button Mac a partir de 4D v14 R5. Clickcount Clickcount -> Resultado Parámetro Resultado Tipo Entero largo Descripción Número de clics consecutivos Descripción Tema: Eventos formulario El nuevo comando Clickcount devuelve, en el contexto de un evento clic, el número de veces que el usuario ha hecho clic de manera repetida con el mismo botón del ratón. Normalmente, este comando devuelve 2 para un doble clic. Este comando le permite detectar doble clics en los encabezados o pies de página del listbox, y también para manejar las secuencias de triples clics o más. Cada clic genera un evento clic separado. Por ejemplo, si un usuario hace doble clic, un evento es generado por el primer clic en el cual Clickcount devuelve 1; luego otro evento es generado por el segundo clic, en el cual Clickcount devuelve 2. Este comando sólo debe ser utilizado en el contexto de los eventos de formulario On Clicked, On Header Click u On Footer Click. Por tanto, es necesario verificar en modo Diseño que el evento apropiado ha sido seleccionado correctamente en las propiedades del formulario y/o para el objeto específico. Cuando ambos eventos formulario On Clicked y On Double Clicked están activos, la siguiente secuencia será devuelta por Clickcount: 1 en el evento On Clicked 2 en el evento On Double Clicked 2+n en el evento On Clicked Ejemplo 1 La estructura de código siguiente se puede colocar en un encabezado de listbox para manejar clics simples y dobles: Case of :(Form event=On Header Click) Case of :(Clickcount=1) ... //single-click action :(Clickcount=2) ... //double-click action End case End case Ejemplo 2 Las etiquetas no son editables pero lo son después de un triple-clic. Si desea permitir a los usuarios editar las etiquetas, puede escribir el método objeto siguiente: If(Form event=On Clicked) Case of :(Clickcount=3) OBJECT SET ENTERABLE(*;"Label";True) EDIT ITEM(*;"Label") End case End if LISTBOX GET CELL COORDINATES LISTBOX GET CELL COORDINATES ( {* ;} objeto ; columna ; linea ; izq ; arriba ; der ; inf ) Parámetro * objeto columna linea izq arriba der inf Tipo Operador Objeto de formulario Entero largo Entero largo Entero largo Entero largo Entero largo Entero largo Descripción Si se especifica = objeto es un nombre de objeto (cadena) Si se omite, objeto es una variable Nombre de objeto (si se especifica *) o variable (si se omite *) Número de columna Número de línea Coordenada izquierda del objeto Coordenada superior del objeto Coordenada derecha del objeto Coordenada inferior del objeto Descripción El comando LISTBOX GET CELL COORDINATES devuelve en las variables o campos izq, arriba, der y inf las coordenadas (en puntos) de la celda designada por los parámetros columna y linea, en el list box definido por * y objeto. Si pasa el parámetro opcional *, indica que el parámetro objeto es un nombre de objeto (una cadena). Si no pasa el parámetro opcional *, indica que el objeto es un campo o una variable. En este caso, se pasa una referencia de campo o variable (campo o variable de tipo de objeto únicamente) en lugar de una cadena. Por coherencia con el comando OBJECT GET COORDINATES, el origen es la esquina superior izquierda del formulario que contiene la celda. Además, las coordenadas devueltas son teóricas; que tienen en cuenta el estado de desplazamiento del list box antes de que ocurra cualquier recorte. Como resultado, la celda puede ser no visible (o sólo parcialmente) en sus coordenadas, y estas coordenadas puede estar fuera de los límites del formulario (o incluso negativas). Para saber si la celda es visible (y que parte de ella es visible) es necesario comparar las coordenadas devueltas con las coordenadas del listbox, teniendo en cuenta las siguientes reglas: Todas las celdas se cortan con las coordenadas de su list box padre (como los devueltos por OBJECT GET COORDINATES en el list box). Los Sub-objetos encabezado y pie de página se muestran sobre el contenido de la columna: cuando las coordenadas de una celda se cruzan las coordenadas de las líneas de encabezado o pie de página, la celda no se muestra en esta intersección. Los elementos de las columnas bloqueadas se muestran sobre los elementos de las columnas desplazables: cuando las coordenadas de un elemento en una columna desplazable cruzan las coordenadas de una columna bloqueada, entonces que no se muestra en esta intersección. Para más información, consulte la descripción del comando OBJECT GET COORDINATES. Ejemplo Usted quiere dibujar un rectángulo rojo alrededor de la celda seleccionada de un listbox: OBJECT SET VISIBLE(*;"RedRect";False) //inicializar un rectángulo rojo //el rectángulo ya está definido en alguna parte del formulario LISTBOX GET CELL POSITION(*;"LB1";$col;$raw) LISTBOX GET CELL COORDINATES(*;"LB1";$col;$raw;$x1;$y1;$x2;$y2) OBJECT SET VISIBLE(*;"RedRect";True) OBJECT SET COORDINATES(*;"RedRect";$x1;$y1;$x2;$y2) Modo Diseño Aumento de la longitud de los nombres de objetos de formularios Aumento de la longitud de los nombres de objetos de formularios Los nombres de objetos de formulario ahora pueden contener hasta 255 bytes. En versiones anteriores, estos nombres se limitaron a 31 bytes. El uso de nombres más largos para los objetos de formularios ofrece una mayor facilidad en la definición y aplicación de las normas de denominación específicas, como "xxxx_Button" o "xxx_Mac". 4D Server Nueva capa red ServerNet 4D Server, versión 64 bits para OS X (final) Nueva capa red ServerNet A partir de 4D v14 R5, las aplicaciones 4D contienen una nueva capa red, llamada ServerNet, para manejar las comunicaciones entre 4D Server y las máquinas 4D remotas (clientes). ServerNet se basa en una API moderna y robusta. Es fácil de mantener y facilita la implementación de las últimas tecnologías red al tiempo que ofrece un alto nivel de rendimiento. La capa de red "legacy" ahora es obsoleta, pero aún se soporta por compatibilidad. ServerNet se utiliza automáticamente en las nuevas bases. Las nuevas opciones le permiten activar/desactivar ServerNet. Para asegurarse de que sus aplicaciones se beneficiarán de las futuras evoluciones de red, le recomendamos que active ServerNet tan pronto como sea posible en todas sus bases. Activar o desactivar la capa red anterior Una nueva opción de compatibilidad le permite activar o desactivar la capa red legacy en su 4D Server en cualquier momento. Puede utilizar: la opción Utilizar la capa de red legacy en la caja de diálogo Propiedades de la base (ver más abajo), o la constante Use legacy network layer en SET DATABASE PARAMETER (este punto se trata en la sección Get database parameter y SET DATABASE PARAMETER) La nueva opción de compatibilidad se encuentra en la página Compatibilidad: Nota: esta opción se ignora en 4D Server v14 R5 versión 64 bits para OS X; sólo ServerNet se puede utilizar en esta plataforma. Por defecto, esta opción está: deseleccionada para las nuevas bases creadas con 4D v14 R5 y posteriores (que utilizan la nueva capa ServerNet), seleccionada para las bases de datos existentes convertidas (utilizan la capa de red legacy). Puede activar o desactivar la opción de ser necesario, por ejemplo, durante la fase de migración de las aplicaciones clientes (ver más abajo). Tenga en cuenta que en caso de una modificación, es necesario reiniciar la aplicación para que el cambio se tenga en cuenta. Todas las aplicaciones cliente que se han conectado también se deben reiniciar para poder conectar con la nueva capa (la versión mínima del cliente para el uso de la capa ServerNet es 4D v14 R4, ver más abajo). Migración de los clientes 4D fusionados Cuando activa la capa ServerNet en su aplicación servidor, sólo las aplicaciones clientes 4D compatibles podrán conectarse: Los clientes en versión 4D v14 R4 y superior pueden conectarse sin modificación. Los clientes en versiones anteriores (v14.x y otros releases v14 'R') primero deben actualizarse para poder conectarse al servidor. Si su aplicación trabaja con clientes fusionados en versiones anteriores a v14 R4, y desea utilizar el mecanismo automático de 4D Server para distribuir sus aplicaciones clientes actualizadas través de la red, es necesario establecer una estrategia de migración. Esta estrategia debe basarse en los siguientes principios: Los clientes no compatibles sólo pueden conectarse a un 4D Server que utilice la capa red legacy. Los clientes actualizados pueden adaptar su protocolo de forma dinámica para que puedan conectarse a 4D Server v14 R5 y siguientes, independientemente de la capa red que el servidor esté utilizando. Su estrategia de migración debe seguir estos pasos: 1. Crear aplicaciones cliente actualizadas con 4D v14 R5 o superior. 2. Ejecute 4D Server v14 R5 con el parámetro "Utilizar capa red legacy" activo. Esta configuración permite que todos los clientes se conecten. Nota: tenga en cuenta que 4D Server v14 R5 versión de 64 bits para OS X no admite esta opción. 3. Espere un período de tiempo determinado hasta que cada cliente haya conectado y descargado la nueva versión. Esto puede durar un día, una semana o incluso más tiempo. Durante este período de transición, tanto los clientes antiguos y los nuevos pueden conectarse al servidor de red legacy. 4. Una vez que todos los clientes se han actualizado, puede desactivar la capa red legacy y finalmente cambiar a ServerNet en 4D Server. Esta estrategia se representa en el siguiente diagrama: Registrar las peticiones de los clientes Durante el proceso de migración, le recomendamos activar el archivo de diagnóstico de 4D. Cuando se activa, 4D Server registra cada solicitud de actualización de clientes en este archivo, lo que le permite controlar el proceso. Este registro no se activa por defecto: necesita llamar al comando SET DATABASE PARAMETER con la constante Diagnostic log recording y el valor 1. Para cada solicitud de actualización, se registra la siguiente información: IP del cliente versión del cliente evento "Update client" Controlar el archivo de diagnóstico también es útil después de que haya cambiado el servidor a la capa red ServerNet, para asegurarse de que todos los clientes se actualicen correctamente. Si un cliente no compatible intenta conectarse, el servidor registra la entrada siguiente: IP del cliente versión del cliente evento "Fail to connect" En este caso, puede decidir, por ejemplo, actualizar al cliente de forma manual. 4D Server, versión 64 bits para OS X (final) Desde 4D v14 R3, 4D ofrece una preversión operacional de 4D Server 64 bits para OS X. Esta versión se describe en el manual 4D v14 R3 - Actualización (PDF). El desarrollo de esta versión se realiza de manera continua, paso a paso, y las funciones que antes no estaban disponibles ya están activadas en la versión preliminar R5 de 4D Server 64 bits para OS X. Feature status Esta tabla ofrece el estado actual de las funcionalidades que aún no estaban disponibles en la versión preliminar inicial (v14 R3) de la versión de 64 bits de 4D Server para OS X. Funcionalidad/Tecnología Estado actual Comunicación del puerto serial Cajas de diálogo Import/Export Editor de etiquetas Los gráficos generados en el servidor Cliente HTTP (Gestión de certificados de cliente) 4D Internet Commands (plug-in) 4D Pack (plug-in) 4D ODBC Pro (plug-in) 4D For OCI (plug-in) No disponible No disponible No disponible Disponible desde la versión R4 Disponible desde la versión R4 Disponible desde la versión R4 Disponible en versión R5 (ver 4D Pack, versión 64 bits para OS X) No disponible No disponible Web Server Caché web de 4D activada por defecto Caché web de 4D activada por defecto A partir de 4D v14 R5, la caché Web de 4D para los recursos estáticos está activa por defecto en las nuevas bases. En la caja de diálogo Propiedades de la base, la opción Utilizar la caché Web de 4D ahora se selecciona automáticamente para las nuevas bases de datos: Para bases de datos convertidas de versiones anteriores, el valor de esta opción se deja intacto. 4D Internet Commands SMTP_QuickSend SMTP_QuickSend SMTP_QuickSend ( nomServidor; msgDe ; msgA ; asunto ; mensaje {; paramSesion}{; puerto}{; nomUsuario ; contrasena} ) > Resultado Parámetro nomServidor msgDe msgA asunto mensaje Tipo Cadena Texto Texto Texto Texto Entero paramSesion largo puerto nomUsuario contrasena Function result -> -> -> -> -> -> Descripción Nombre o dirección IP del servidor Correo electrónico o lista de correos Correo electrónico o lista de correos Asunto del mensaje (UTF-8 por defecto) Mensaje (UTF-8 por defecto) 0 o si se omite = No utilizar SSL sino switchover permitido, 1 = Utilizar SSL, 2 = Nunca utilizar SSL (switchover no permitido), 4 = Enviar texto HTML sin SSL, 5 = Enviar texto HTML con SSL, 8 = Enviar Mime HTML sin SSL/TLS, 9 = Enviar Mime HTML con SSL/TLS Entero largo Texto Texto -> Número de puerto a utilizar Entero <- Código del error -> Nombre de usuario para la autenticación -> Contraseña para la autenticación Descripción El comando SMTP_QuickSend ahora le permite enviar mensajes con el formato HTML MIME, con o sin el protocolo SSL/TLS. Mime HTML (.mht o extensión de archivo .mhtml) es un formato de archivo de la página Web que puede fusionar el código HTML, así como también los recursos externos, tales como imágenes en un único documento. Es soportado por varios navegadores, así como también por MS Word, por ejemplo. Dado que este formato es soportado por las áreas 4D Write Pro, usted podrá guardar y enviar áreas 4D Write Pro por correo incluyendo todos sus recursos. Pase 8 en paramSesion para formatear el mensaje en Mime HTML y enviarlo en modo estándar. Pase 9 en paramSesion para formatear el mensaje en Mime HTML y enviarlo en modo SSL/TLS. Estos valores corresponden a las combinaciones habituales, sin embargo el parámetro paramSesion es una realidad un campo de bits y permite cualquier combinación personalizada si utiliza operadores en los bits: Número de bit 0 Formato utilizado si el bit es 1 Utilizar SSL o el comportamiento predeterminado, conexión en claro, y actualización a SSL si es posible. Nunca actualizar, permanecer en modo no cifrado, incluso si la actualización es posible. Bit se ignora si SSL (bit 0) se ha seleccionado. El cuerpo del mensaje es HTML, definir el encabezado correspondiente. Mensaje MHTML, el bit 2 (HTML) se ignora. El usuario es responsable de definir todos los encabezados, excepto "A", "De", "Fecha" y "Asunto" 1 2 3 Nota: este comando no soporta bases de datos convertidas corriendo en modo "Non-Unicode". Ejemplo Usted guardó un documento .mht de su disco y desea enviarlo por correo electrónico. Para ello, puede escribir: $Message:=Document to text("c:\\documents\\invitation.mht") $Host:="smtp.gmail.com" $ToAddress:="[email protected]" $FromAddress:="[email protected]" $Subject:="Let's party" $Param:=9 //MHTML with SSL $Port:=465 //SSL port of gmail $User:="[email protected]" $Password:="xyz&@!&@" $Error:=SMTP_QuickSend($Host;$FromAddress;$ToAddress;$Subject;$Message;$Param;$Port;$User;$Password) 4D SVG Filtros con Direct2D activado en Windows Filtros con Direct2D activado en Windows Los comandos SVG_Filter_Blend, SVG_Filter_Blur y SVG_Filter_Offset ahora son soportados en Windows con Direct2D habilitado en contexto de software gráfico (contexto por defecto en 4D v14, ver la opción Direct2D Software en el comando SET DATABASE PARAMETER. En las versiones anteriores de 4D, estos comandos requieren que Direct2D esté desactivado en Windows. 4D Pack 4D Pack, versión 64 bits para OS X Comandos obsoletos renombrados 4D Pack, versión 64 bits para OS X Con la versión v14 R5, 4D ofrece una versión de 64 bits de 4D Pack para OS X. Esta versión le permitirá utilizar el plug-in 4D Pack con la versión de 64 bits de 4D Server para OS X, que fue lanzado con 4D v14 R3. La instalación y uso de la versión de 64 bits del plug-in 4D Pack para OS X es similar a las versiones existentes, a excepción de ciertas limitaciones que se enumeran a continuación. Comando no soportado Todos los comandos 4D Pack que estaban disponibles en Mac OS son soportados con la versión de 64 bits para OS X, a excepción de: _o_AP Save BMP 8 bits_o_AP Save BMP 8 bits Este comando se basa en una tecnología obsoleta y ya era obsoleta en lanzamientos anteriores 4D Pack. No se soporta en la versión de 64 bits de 4D Pack para OS X. Comandos obsoletos renombrados Varios comandos 4D Pack han quedado en desuso desde hace mucho tiempo y le recomendamos que no los utilice en nuevos proyectos. Para una identificación más clara, estos comandos tiene el prefijo "_o_" a partir de 4D Pack v14 R5: Tema Nombre anterior Nuevo nombre Estado 4D_Pack: ANSI streams AP FCLOSE _o_AP FCLOSE Obsoleto AP fopen AP FPRINT AP fread AP Save BMP 8 bits AP Add table and fields AP Create relation AP Get file MD5 digest _o_AP fopen _o_AP FPRINT _o_AP fread _o_AP Save BMP 8 bits Obsoleto Obsoleto Obsoleto AP ShellExecute _o_AP ShellExecute 4D Pack: Picture files 4D Pack: Utilities _o_AP Add table and fields _o_AP Create relation _o_AP Get file MD5 digest Obsoleto, no soportado en OS X 64-bit Obsoleto, no documentado Obsoleto, no documentado Obsoleto, remplazado por Generate digest Obsoleto, remplazado por LAUNCH EXTERNAL PROCESS 4D Write Pro (preversión técnica) 4D Write Pro es el sucesor del plug-in 4D Write. 4D Write Pro representa un desarrollo importante para 4D, por lo que se está aprovechando el programa de versiones R para entregarlo progresivamente. 4D v14 R5 incluye el primer paso con 4D Write Pro como una preversión técnica. Esta etapa inicial se centra en la compatibilidad de los documentos existentes y de los correos electrónicos con formato HTML. Para cada paso posterior, el conjunto de las funcionalidades y de los comandos del lenguaje se extenderán. Tenga en cuenta que: 4D Write Pro está utilizando la misma licencia que 4D Write, 4D Write Pro ya no es un plug-in está completamente integrado en 4D, por lo que es fácil de gestionar e implementar. Acerca de la documentación de 4D Write Pro Las funcionalidades de 4D Write, incluyendo los nuevos comandos del lenguaje, están totalmente documentadas en el nuevo manual Referencia 4D Write Pro. Sobre esta preversión técnica Esta preversión técnica de 4D Write Pro se publica para mostrarles el nivel de progreso con miras a la implementación del producto; también queremos que lo prueben y nos den retroalimentación. Por supuesto, algunas características no están aún plenamente desarrolladas y pueden experimentar cierta inestabilidad. La siguiente tabla muestra el estado actual de las principales funcionalidades: Funcionalidad Crear un área 4D Write Pro en un formulario Crear un nuevo documento 4D Write Pro vacío Importar un documento 4D Write en un objeto 4D Write Pro Exportar un objeto 4D Write Pro a un documento o variable Editar un documento con la ayuda de un menú emergente contextual Insertar expresiones (campos de base, resultados del método 4Ds Editar el contenido de un documento por programación Imprimir un documento 4D Write Pro Manejo de la paginación Acceder a las propiedades del documento por programación Almacenar un documento 4D Write Pro en un campo de la base Interfaz 4D Write Pro Estado de los comandos 4D Write Pro Importar documentos 4D Write Estado actual (Preversión técnica R5) Comentario Disponible Disponible WP New Disponible WP Import document o WP New Disponible WP EXPORT DOCUMENT y WP EXPORT VARIABLE Disponible Disponible Parcialmente disponible No disponible No disponible No disponible No disponible Uso del comando ST INSERT EXPRESSION Uso de los comandos 4D "ST" y "OBJECT" Interfaz 4D Write Pro Si la propiedad Menú contextual está seleccionada por un área 4D Write Pro (ver Crear un área 4D Write Pro), un menú contextual completo estará disponible para los usuarios en el modo Aplicación: Este menú ofrece acceso a todas las funcionalidades 4D Write Pro disponibles actualmente (en la versión final, todas las funcionalidades y propiedades también estarán disponibles por programación). Dado que ni la organización del menú contextual ni su contenido son definitivos en este momento, no vamos a describir las funcionalidades individuales en esta documentación. Lo invitamos a navegar a través de los diferentes sub-menús para tener una idea de lo que 4D Write Pro es capaz de hacer. Nota: en esta vista previa técnica, los documentos 4D Write Pro se muestra por defecto en modo vista página Web. En este modo, el texto se ajusta automáticamente y la barra de desplazamiento horizontal (si está definida) está desactivada. Si desea utilizar una barra de desplazamiento horizontal y tener texto con un ancho fijo (definido en la propiedad "Tamaño de página"), es necesario cambiar al modo de visualización de página Normal. Estado de los comandos 4D Write Pro En 4D Write Pro v14 R5, hay varios comandos nuevos en el tema "4D Write Pro" para manejar áreas 4D Write Pro. Estos comandos están documentados en el capítulo Lenguaje 4D Write Pro del manual de referencia de 4D Write Pro. La siguiente tabla muestra el estado de implementación de los comandos 4D Write Pro en la vista previa técnica de 4D v14 R5: Nombre del comando WP EXPORT VARIABLE WP EXPORT DOCUMENT WP Import document WP New Estado actual (vista previa técnica R5) Sólo dos formatos de exportación están disponibles actualmente Si no pasa el parámetro formato, debe utilizar la extensión del archivo ".htm" o ".html"; sólo un formato de exportación está disponible actualmente Para obtener una lista detallada de las funcionalidades 4D Write que actualmente son soportadas en objetos 4D Write Pro, consulte la sección Importar documentos 4D Write. Para obtener una lista detallada de las funcionalidades 4D Write que actualmente están soportadas en objetos 4D Write Pro, consulte la sección Importar documentos 4D Write. Nota: tenga en cuenta que sólo los comandos de los temas "Objectos (formularios)" y "Texto con estilo" pueden utilizarse con áreas 4D Write Pro (ver las secciones Utilizar los comandos del tema Objeto (Formularios) y Utilizar los comandos del tema Texto con estilo). Importar documentos 4D Write Una de las principales funcionalidades del nuevo 4D Write Pro es la capacidad de importar y convertir documentos 4D Write Pro existentes. Esto le permitirá migrar las aplicaciones que se basan en el plug-in 4D Write. Nota de compatibilidad: sólo los documentos 4D Write de la última generación ("4D Write v7") son soportados. Cómo importar un documento 4D Write En esta vista previa técnica, los objetos 4D Write Pro ofrecen dos maneras de importar documentos 4D Write: Para los archivos 4D Write Pro almacenados en el disco, se utiliza el comando WP Import document, Para las áreas 4D Write almacenadas en campos BLOB, se utiliza el comando WP New. Para más información, consulte la descripción de estos comandos. ¿Qué propiedades se conservan de 4D Write? Para facilitar la migración desde el plug-in 4D Write a 4D Write Pro, queremos soportar tantas funcionalidades 4D Write como sea posible en objetos 4D Write Pro. Este párrafo muestra las propiedades del plug-in 4D Write que se recuperan en un área 4D Write Pro después de una importación con los comandos WP Import document o WP New. Tenga en cuenta sin embargo, que hay algunas diferencias, que no se consideran como bugs. Esto se debe, por ejemplo, a la fuente predeterminada utilizada en 4D Write Pro para viñetas, o pequeñas conversiones en el tipo Subrayado. Información del documento Plug-in 4D Write 4D Write Pro Creación fecha y hora Modificación fecha y hora Bloqueado Título Tema Autor Empresa Notas Disponible en v14 R5 Disponible en v14 R5 No disponible (utilizar la propiedad objeto sólo lectura) Disponible en v14 R5 Disponible en v14 R5 (sólo texto plano) Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Parámetros de visualización del documento Plug-in 4D Write 4D Write Pro Vista modo página Vista reglas Vista marcos Vista encabezado Vista pie Vista encabezado de primera página Vista pie de primera página Vista imágenes Vista HScrollbar Vista VScrollbar Vista invisible characters Vista referencias Vista separadores de columna Vista H Splitter Vista V Splitter Vista Wysiwyg Vista zoom No importado (utilizar el modo de vista Documento/Página en el menú contextual) No disponible No disponible No disponible No disponible No disponible No disponible No disponible No importado (utilice la propiedad de objeto desplazable hor.) No importado (utilice la propiedad de objeto desplazable vert.) No disponible No importado (utilice ST SET OPTIONS) No disponible No disponible No disponible No disponible No importado (utilice Document/Zoom en el menú contextual) Parámetros del documento Plug-in 4D Write 4D Write Pro Unidad Lenguaje Conteo de columnas Espacio entre columnas Viudas y huérfanos Pestaña por defecto Pestaña Líder Color URL Color visitado URL No disponible No disponible No disponible No disponible No disponible Disponible en v14 R5 No disponible No disponible No disponible Parámetros de paginación de documentos Plug-in 4D Write 4D Write Pro Ancho de página Alto página Número primera página Primera página encabezado pies diferentes Página encabezado Izquierda y derecha y pie de página diferentes Encuadernación Páginas opuestas Márgenes página Encabezado margen superior Encabezado margen inferior Pie de página margen superior Pie de página margen inferior Primera página margen superior Primera página margen inferior Encabezado primera página margen superior Encabezado primera página margen inferior Pie de página primera página margen superior Pie de página primera página margen inferior Primera página es correcta No disponible No disponible No disponible No disponible No disponible No disponible No disponible Disponible en v14 R5 (implementación temporal) No disponible No disponible No disponible No disponible No disponible No disponible No disponible No disponible No disponible No disponible No disponible Parámetros de impresión de documentos Plug-in 4D Write 4D Write Pro Clase de papel Paisaje Ancho Alto Márgenes de usuario Escala Resolución X Resolución Y No disponible No disponible No disponible No disponible No disponible No disponible No disponible No disponible Imágenes Nota: 4D Write Pro aun no soporta posicionamiento absoluto para las imágenes en las páginas. Sólo las imágenes en línea son compatibles y se importan para esta vista previa técnica. Plug-in 4D Write 4D Write Pro X (izquierda) Y (arriba) Ancho Alto Número de página Detrás No en primera página Modo de visualización (escala a ajustar, etc.) Es una expresión Conservar el tamaño (para imágenes en página unicamente) (para imágenes en página unicamente) Disponible en v14 R5 Disponible en v14 R5 No disponible No disponible No disponible Disponible en v14 R5 No disponible No disponible Propiedades de caracteres Plug-in 4D Write 4D Write Pro (span) Italica Negrita Tachado Subrayado Sombra Exponente (superscript o subscript) Mayúsculas o pequeñas mayúsculas Familia de fuente Tamaño de fuente Color texto Color fondo de texto Color subrayado Color tachado Color sombra Propiedad usuario Corrección ortográfica (sintaxis y gramática) Apariencia Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 No disponible No disponible No disponible No importado (los estilos son importados pero las hojas de estilo no están disponibles) Hoja de estilo Propiedades párrafos Plug-in 4D Write 4D Write Pro Justificación Interlinea Viñetas Margen izquierdo Margen derecho Indentar texto Estilo borde linea Color borde linea Color fondo borde Borde izquierdo Borde derecho Borde superior y borde interior arriba Borde inferior y borde interior inferior Espacio de borde Hoja de estilo Tabulaciones Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Disponible en v14 R5 Hyperlinks Plug-in 4D Write 4D Write Pro Enlace URL Enlace método 4D Enlace documento abierto Disponible en v14 R5 No disponible No disponible Expresiones 4D Plug-in 4D Write 4D Write Pro Expresión 4D Fecha y hora Expresión HTML Expresión RTF Disponible en v14 R5 Disponible en v14 R5 No disponible No disponible Datos de texto Plug-in 4D Write 4D Write Pro Datos de texto principales Datos de texto encabezado Datos de texto Pie Disponible en v14 R5 No disponible No disponible Optimizaciones SQL Select Group by y Order by statements Seguridad de red SQL Select Group by y Order by statements A partir de 4D v14 R5, las sentencias SQL SELECT con cláusulas GROUP BY y ORDER BY han sido optimizadas en diferentes configuraciones: SELECT FROM GROUP BY o SELECT FROM ORDER BY aplicado a una sola tabla, SELECT FROM GROUP BY o SELECT FROM ORDER BY aplicado a varias tablas y el uso de combinaciones internas. Las optimizaciones conciernen únicamente a las referencias de columnas simples (no expresiones). Típicamente, en 4D v14 R5 y versiones posteriores, los siguientes casos se ejecutarán más rápido: Ejemplos Order by Begin SQL DROP TABLE IF EXISTS T1; DROP TABLE IF EXISTS T2; CREATE TABLE T1 (C1 INT); CREATE TABLE T2 (C2 INT); INSERT INTO T1(C1) VALUES INSERT INTO T1(C1) VALUES INSERT INTO T1(C1) VALUES INSERT INTO T2(C2) VALUES INSERT INTO T2(C2) VALUES End SQL (1); (2); (3); (2); (3); ARRAY LONGINT($result;0) ARRAY LONGINT($result1;0) ARRAY LONGINT($result2;0) // Un ejemplo simple ORDER BY con T1 y T2. // $result contendrá [2, 3]. Begin SQL SELECT C1 FROM T1, T2 WHERE C1=C2 ORDER BY C1 INTO :$result End SQL // ORDER BY también funciona si se utilizan varias columnas. // $result1 y $result2 contendrán cada uno [2, 3]. Begin SQL SELECT C1, C2 FROM T1, T2 WHERE C1=C2 ORDER BY C1, C2 INTO :$result1, :$result2 End SQL // Sólo las referencias de columnas simples se optimizan. Si una expresión // como se muestra a continuación (C1 + 1) si se utiliza para la selección, luego la ejecución no // será más rápida. $result contiene [3, 4]. Begin SQL SELECT C1 + 1 FROM T1, T2 WHERE C1=C2 ORDER BY C1 INTO :$result End SQL // Puede utilizar un índice de referencia en la selección. // Como se estableció antes, la selección sólo contiene referencias de columnas simples para una ejecución más rápida. // $result contendrá [ 2, 3 ]. Begin SQL SELECT C1 FROM T1, T2 WHERE C1=C2 ORDER BY 1 INTO :$result End SQL Ejemplo Group by Begin SQL DROP TABLE IF EXISTS T1; DROP TABLE IF EXISTS T2; CREATE TABLE T1 (C1 INT, C3 INT); CREATE TABLE T2 (C2 INT); INSERT INTO T1(C1, C3) VALUES (3, INSERT INTO T1(C1, C3) VALUES (1, INSERT INTO T1(C1, C3) VALUES (2, INSERT INTO T1(C1, C3) VALUES (3, INSERT INTO T1(C1, C3) VALUES (2, INSERT INTO T1(C1, C3) VALUES (3, INSERT INTO T2(C2) VALUES (2); INSERT INTO T2(C2) VALUES (3); End SQL 1); 1); 1); 1); 1); 1); ARRAY LONGINT($result;0) ARRAY LONGINT($result1;0) ARRAY LONGINT($result2;0) //Ejemplo simple de GROUP BY con T1 y T2 juntos. //$result contendrá [2, 3]. Note que no hay garantía de que los grupos se devuelvan.. //en orden ascendente, es decir, $result puede ser [3, 2]. Begin SQL SELECT C1 FROM T1, T2 WHERE C1=C2 GROUP BY C1 INTO :$result End SQL // Este es un ejemplo simple de una petición agregada. // Como C3 siempre es 1, para cada grupo (valor único de C1), // SUM(C3) es el número de repeticiones. // $result1 contendrá [2, 3]. // $result2 también contendrá [2, 3]. Begin SQL SELECT C1, SUM(C3) FROM T1, T2 WHERE C1=C2 GROUP BY C1 INTO :$result1, :$result2 End SQL Seguridad de red Las funciones de seguridad de red se han optimizado en 4D v14 R5 para que pueda reforzar la protección de sus aplicaciones 4D: La lista de cifrado débil se ha eliminado, La longitud de la llave de certificado 4D por defecto se ha aumentado a 2048 bits, Ahora puede utilizar sus propias llaves de cifrado para las comunicaciones seguras. Estas modificaciones se refieren a las siguientes conexiones seguras: Cliente/servidor Servidor SQL Cliente HTTP