diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/FunctionClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/FunctionClass.md index b6a37cdff8a6cf..a437939bd05a72 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/API/FunctionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/API/FunctionClass.md @@ -75,11 +75,11 @@ You can also execute a function using the [`apply()`](#apply) and [`call()`](#ca
-| Parámetros | Tipo | | Descripción | -| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------- | -| thisObj | Object | -> | Object to be returned by the `This` command in the function | -| params | Collection | -> | Collection of values to be passed as parameters to the function | -| Resultado | any | <- | Valor de la ejecución de la función | +| Parámetros | Tipo | | Descripción | +| ---------- | ---------- | :-------------------------: | ---------------------------------------------------------------- | +| thisObj | Object | -> | Objeto a devolver por el comando `This` en la función | +| params | Collection | -> | Colección de valores que se pasarán como parámetros a la función | +| Resultado | any | <- | Valor de la ejecución de la función |
@@ -118,11 +118,11 @@ Tenga en cuenta que `.apply()` es similar a [`.call()`](#call) excepto que los p
-| Parámetros | Tipo | | Descripción | -| ---------- | ------ | --------------------------- | ----------------------------------------------------------- | -| thisObj | Object | -> | Object to be returned by the `This` command in the function | -| params | any | -> | Valores a pasar como parámetros a la función | -| Resultado | any | <- | Valor de la ejecución de la función | +| Parámetros | Tipo | | Descripción | +| ---------- | ------ | --------------------------- | ----------------------------------------------------- | +| thisObj | Object | -> | Objeto a devolver por el comando `This` en la función | +| params | any | -> | Valores a pasar como parámetros a la función | +| Resultado | any | <- | Valor de la ejecución de la función |
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md index 808e5cb8e3c9f8..400b45f9663853 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md @@ -53,10 +53,10 @@ Dado que HTTPAgent es un objeto compartible, puede añadir uno a una clase singl
Historia -| Lanzamiento | Modificaciones | -| ----------- | ------------------------------------------------------- | -| 21 R3 | Soporte de la propiedad *storeCertificateName* en macOS | -| 21 | Support of *storeCertificateName* property on Windows | +| Lanzamiento | Modificaciones | +| ----------- | --------------------------------------------------------- | +| 21 R3 | Soporte de la propiedad *storeCertificateName* en macOS | +| 21 | Soporte de la propiedad *storeCertificateName* en Windows |
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md index 2e702405cd4f52..acaf4ea5a1d0b3 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md @@ -99,7 +99,7 @@ Los objetos HTTPRequest ofrecen las siguientes propiedades y funciones: | Lanzamiento | Modificaciones | | ----------- | ----------------------------------------------------------------- | | 21 R3 | Soporte de la propiedad *storeCertificateName* en macOS | -| 21 | Support of *storeCertificateName* property on Windows | +| 21 | Soporte de la propiedad *storeCertificateName* en Windows | | 20 | Validación TLS por defecto | | 19 R7 | Soporte de las propiedades *automaticRedirections* y *decodeData* | diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/IMAPTransporterClass.md index eabdef189781ac..7508365502d6fa 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/API/IMAPTransporterClass.md @@ -1585,7 +1585,7 @@ searchCriteria = FLAGGED FROM "SMITH" searchCriteria = OR SEEN FLAGGED ``` -... returns all messages with \Seen flag set OR \Flagged flag set +... devuelve todos los mensajes con el marcador \Seen O \Flagged ``` searchCriteria = NOT SEEN diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/MethodClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/MethodClass.md index 761f400a669d35..0e410da525192a 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/API/MethodClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/API/MethodClass.md @@ -124,7 +124,7 @@ En el parámetro opcional *name*, pase el nombre del método que se mostrará en :::tip -Giving a *name* to your method is recommended if you want to: +Se recomienda nombrar explícitamente su método si lo desea: - use persistent method name in the [Custom watch pane of the Debugger](../Debugging/debugger#custom-watch-pane) (anonymous methods are not persistent in the debugger). - handle the volatile method using commands such as [`Method get path`](../commands/method-get-path) and [`Method resolve path`](../commands/method-resolve-path) (anonymous methods don't have paths). @@ -205,7 +205,7 @@ El objeto devuelto contiene las siguientes propiedades: | Propiedad | | Tipo | Descripción | | --------- | --------------------------------------------------------------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| success | | Boolean | True if no syntax error was detected, false otherwise | +| success | | Boolean | True si no se ha detectado ningún error de sintaxis, false en caso contrario | | errors | | Colección de objetos | **Disponible sólo en caso de error o de warning**. Colección de objetos que describen errores o advertencias | | | [].isError | Boolean | Error si es True, sino warning | | | [].message | Text | Mensaje de error o advertencia | diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md index a51fadf7fd8c62..588caf62e77813 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md @@ -566,7 +566,7 @@ Dado que `.info` es una propiedad calculada, se recomienda llamarla una vez y lu :::note -This function always returns **False** with non-web sessions. +Esta función siempre devuelve **False** con sesiones no web. ::: diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Admin/tls.md b/i18n/es/docusaurus-plugin-content-docs/current/Admin/tls.md index 491ea2cffd948b..37cb5dc2dfaf68 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Admin/tls.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Admin/tls.md @@ -37,8 +37,6 @@ Los navegadores web solo autorizan los certificados emitidos por una autoridad d ::: - - ## Versión mínima Por defecto, la versión mínima del protocolo de seguridad aceptado por los servidores 4D es TLS 1.3. Puede modificar este valor utilizando el selector `Min TLS version` con el comando `SET DATABASE PARAMETER`. @@ -49,8 +47,6 @@ Puedes controlar de forma separada la [versión mínima de TLS](WebServer/webSer ::: - - ## Habilitar TLS con el servidor HTTP Para poder utilizar el protocolo TLS con el servidor HTTP de 4D, debe: @@ -72,7 +68,6 @@ Los certificados TLS gestionados por 4D deben estar en formato **PEM**. Si su pr - [**RSA**](https://en.wikipedia.org/wiki/RSA_\\(cryptosystem\\)) - [**ECDSA**](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) - :::note 4D le propone dos comandos para ayudarle a solicitar un certificado RSA, [vea el tutorial más abajo](#how-to-get-a-rsa-certificate-tutorial). @@ -101,7 +96,6 @@ El servidor web 4D también soporta [la opción HSTS](WebServer/webServerConfig. ::: - ### Perfect Forward Secrecy (PFS) [PFS](https://en.wikipedia.org/wiki/Forward_secrecy) añade una capa adicional de seguridad a sus comunicaciones. En lugar de utilizar llaves de intercambio predefinidas, PFS crea llaves de sesión de forma cooperativa entre las partes que se comunican utilizando algoritmos Diffie-Hellman (DH). La forma conjunta en que se construyen las llaves crea un "secreto compartido" que impide que partes externas puedan comprometerlas. @@ -110,8 +104,6 @@ Cuando se habilita TLS en el servidor, PFS se habilita automáticamente. Si el a Si utiliza una [lista de cifrado personalizada](WebServer/webServerConfig.md#cipher-list) y desea activar PFS, debe verificar que contiene entradas con algoritmos DH o ECDH (Elliptic-curve Diffie-Hellman). - - ## Activar TLS con los otros servidores Para utilizar TLS con el servidor de aplicaciones 4D (aplicaciones cliente-servidor de escritorio) o el servidor SQL, solo tiene que habilitar las comunicaciones TLS y el servidor configura automáticamente las conexiones al inicio. @@ -119,9 +111,6 @@ Para utilizar TLS con el servidor de aplicaciones 4D (aplicaciones cliente-servi - Con el servidor de aplicaciones, seleccione la opción **Encriptar las comunicaciones cliente-servidor** en la página ["Opciones cliente-servidor/red" del diálogo Parámetros](../settings/client-server#encrypt-client-server-communications). - Con el servidor SQL, seleccione la opción **Activar TLS** en la [página "SQL" del cuadro de diálogo Parámetros](../settings/sql#sql-server-publishing). - - - ## ¿Cómo obtener un certificado RSA? (tutorial) Un servidor que funciona en modo seguro significa que necesita un certificado digital de una autoridad de certificación. Este certificado contiene diversa información, como el ID del sitio, así como la llave pública utilizada para comunicarse con el servidor. Este certificado se transmite a los clientes (por ejemplo, los navegadores web) que se conectan a este servidor. Una vez identificado y aceptado el certificado, la comunicación se realiza en modo seguro. @@ -151,3 +140,4 @@ Para obtener un certificado digital: 5. Coloca el archivo “cert.pem” en la [ubicación apropiada](#installing-certificate-files). El servidor 4D puede ahora trabajar en modo seguro. Un certificado suele tener una validez de entre 3 meses y un año. + diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/classes.md b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/classes.md index 1ba8731908821f..d6d8d8977e53f0 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/classes.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/classes.md @@ -37,62 +37,7 @@ $person:=cs.Person.new("John";"Doe") $hello:=$person.sayHello() //"Hello John Doe" ``` -## Gestión de clases - -### Definición de una clase - -Una clase usuario en 4D está definida por un archivo [método ](methods.md) específico (.4dm), almacenado en la carpeta `/Project/Sources/Classes/`. El nombre del archivo es el nombre de la clase. - -Al nombrar las clases, debe tener en cuenta las siguientes reglas: - -- Un [nombre de clase](identifiers.md#classes) debe cumplir con [reglas de denominación de las propiedades](identifiers.md#object-properties). -- Los nombres de clases son sensibles a las mayúsculas y minúsculas. -- No se recomienda dar el mismo nombre a una clase y a una tabla de la base, para evitar conflictos. - -Por ejemplo, si quiere definir una clase llamada "Polygon", tiene que crear el siguiente archivo: - -``` -Project folder Project Sources Classes Polygon.4dm -``` - -### Borrar una clase - -Para eliminar una clase existente, puede: - -- en su disco, elimine el archivo de clase .4dm de la carpeta "Classes", -- en el Explorador 4D, seleccione la clase y haga clic ![](../assets/en/Users/MinussNew.png) o elija **Mover a la Papelera** en el menú contextual. - -### Utilizar la interfaz 4D - -Los archivos de clase se almacenan automáticamente en la ubicación adecuada cuando se crean a través de la interfaz de 4D, ya sea a través del menú **Archivo** o del Explorador. - -#### Menú Archivo y barra de herramientas - -Puede crear un nuevo archivo de clase para el proyecto seleccionando **Nueva > Clase...** en el menú **Archivo** de 4D Developer o en la barra de herramientas. - -También puede utilizar el atajo **Ctrl+Mayús+Alt+k**. - -#### Explorador - -En la página **Métodos** del Explorador, las clases se agrupan en la categoría **Clases**. - -Para crear una nueva clase, puede: - -- seleccione la categoría **Clases** y haga clic en el botón ![](../assets/en/Users/PlussNew.png). -- seleccione **Nueva clase...** en el menú de acciones de la parte inferior de la ventana del Explorador, o en el menú contextual del grupo Clases. - ![](../assets/en/Concepts/newClass.png) -- seleccione **Nueva > Clase...** en el menú contextual de la página de inicio del Explorador. - -#### Soporte del código de clase - -En las diferentes ventanas 4D (editor de código, compilador, depurador, explorador de ejecución), el código de la clase se maneja básicamente como un método proyecto con algunas especificidades: - -- En el editor de código: - - una clase no puede ser ejecutada - - una función de clase es un bloque de código - - **Ir a la definición** en un objeto miembro busca las declaraciones de función de clase; por ejemplo, "$o.f()" encontrará "Function f". - - **Buscar referencias** en la declaración de función de clase busca la función utilizada como miembro de objeto; por ejemplo, "Function f" encontrará "$o.f()". -- En el explorador de Ejecución y Depurador, las funciones clase se muestran con el formato `` constructor o `.`. +Class files are managed through the 4D Explorer (see [Creating classes](../Project/code-overview.md#creating-classes)). ## Class stores diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/dt_date.md b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/dt_date.md index 66738a9b327740..122b29c01e4e66 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/dt_date.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/dt_date.md @@ -52,7 +52,7 @@ Una fecha null es especificada por *!00-00-00!*. Como las fechas en JavaScript son objetos, se envían a 4D como texto que contiene su forma JSON como cualquier otro objeto. Este principio se aplica en particular cuando se utilizan [comandos JSON](../commands/theme/JSON) o [Áreas Web](../FormObjects/webArea_overview.md). -The JSON form of JavaScript Date objects follows the ISO 8601 standard, for example "2013-08-23T00:00:00Z". It is your responsibility to convert this text into a 4D date. Hay dos soluciones disponibles: +The JSON form of JavaScript Date objects follows the ISO 8601 standard, for example "2013-08-23T00:00:00Z". Es su responsabilidad convertir este texto en una fecha 4D. Hay dos soluciones disponibles: Utilizando el comando [`JSON Parse`](../commands/json-parse): diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/methods.md b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/methods.md index 9441b2efbc2725..5af2fa1489d7b9 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/methods.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/methods.md @@ -13,277 +13,13 @@ El tamaño máximo de un método está limitado a 2 GB de texto o 32.000 líneas En el lenguaje 4D, hay varias categorías de métodos. La categoría depende de cómo se les pueda llamar: -| Tipo | Contexto de llamada | Acepta los parámetros | Descripción | -| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Métodos proyecto** | Por demanda, cuando se llama al nombre del método proyecto (ver [Llamando a métodos proyecto](#calling-project-methods)) | Sí | Puede contener código para ejecutar acciones personalizadas. Una vez creado un método proyecto, pasa a formar parte del lenguaje del proyecto. | -| **Método objeto (widget)** | Automático, cuando un evento involucra al objeto al que se asocia el método | No | Propiedad de un objeto formulario (también llamado widget) | -| **Método formulario** | Automático, cuando un evento involucra al formulario al que se asocia el método | No | Propiedad de un formulario. Puede utilizar un método formulario para gestionar datos y objetos, pero generalmente es más sencillo y eficiente utilizar un método objeto para estos fines. | -| **Trigger** (o *método tabla*) | Automático, cada vez que se manipulan los registros de una tabla (Añadir, Eliminar y Modificar) | No | Propiedad de una tabla. Los triggers son métodos que pueden evitar operaciones "ilegales" con los registros de su base. | -| **Método base** | Automático, cuando se produce un evento de la sesión de trabajo | Sí (predefinido) | Hay 16 métodos base en 4D. | -| **Class** | [**Las funciones de clases**](classes.md#function) se llaman en el contexto de una instancia de objeto | sí | Las funciones de clases pueden estar integradas (*por ejemplo* `collection.orderBy()` o `entity.save()`), o creadas por el desarrollador 4D. Ver [**Clases**](classes.md) | +| Tipo | Contexto de llamada | Acepta los parámetros | Descripción | +| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Métodos proyecto** | Por demanda, cuando se llama al nombre del método proyecto (ver [Llamando a métodos proyecto](#calling-project-methods)) | Sí | Puede contener código para ejecutar acciones personalizadas. Una vez creado un método proyecto, pasa a formar parte del lenguaje del proyecto. | +| **Método objeto (widget)** | Automático, cuando un evento involucra al objeto al que se asocia el método | No | Propiedad de un objeto formulario (también llamado widget) | +| **Método formulario** | Automático, cuando un evento involucra al formulario al que se asocia el método | No | Propiedad de un formulario. Puede utilizar un método formulario para gestionar datos y objetos, pero generalmente es más sencillo y eficiente utilizar un método objeto para estos fines. | +| **Trigger** (o *método tabla*) | Automático, cada vez que se manipulan los registros de una tabla (Añadir, Eliminar y Modificar) | No | Propiedad de una tabla. Los triggers son métodos que pueden evitar operaciones "ilegales" con los registros de su base. | +| **Método base** | Automático, cuando se produce un evento de la sesión de trabajo | Sí (predefinido) | Hay 16 métodos base en 4D. | +| **Class** | Automatically called when an object of the class is instanciated or when a function of the class is executed on an object instance in any other methods or in a [database field](../Develop/field-properties.md#class). | yes (class functions) | A **Class** is used to declare and configure the class [constructor](./classes.md#class-constructor), [properties](./classes.md#property*), and [functions](./classes.md#function) of objects. Ver [**Clases**](classes.md) | -## Métodos proyecto - -Un método proyecto puede tener uno de los siguientes papeles, dependiendo de cómo se ejecute y utilice: - -- Subrutina -- Objeto fórmula -- Método de menú -- Método de gestión de proceso -- Métodos de gestión de eventos o errores - -También puede ejecutar los métodos de su proyecto manualmente, por ejemplo, para realizar pruebas. - -### Subrutinas - -Una subrutina es un método proyecto que puede considerarse como un ayudante. Realiza aquellas tareas que otros métodos le solicitan. Una función es una subrutina que devuelve un valor al método que la llamó. - -Cuando crea un método proyecto, éste pasa a formar parte del lenguaje del proyecto en el que lo crea. Luego puede llamar al método proyecto desde otro método (método proyecto, método objeto...) de la misma manera que llama a los comandos integrados de 4D. Un método proyecto utilizado de este manera se llama una subrutina. - -Se utilizan subrutinas para: - -- Reducción del código repetitivo -- Clarificación de los métodos -- Facilitar los cambios en sus métodos -- Modularizar el código - -Por ejemplo, supongamos que tiene un proyecto de clientes. Al personalizar el proyecto, se da cuenta de que hay algunas tareas que realiza reiteradamente, como la búsqueda de un cliente y la modificación de su registro. El código para hacer esto podría ser: - -```4d - // Búsqueda de un cliente - QUERY BY EXAMPLE([Customers]) - // Selección del formulario entrada - FORM SET INPUT([Customers];"Data Entry") - // Modificación del registro del cliente - MODIFY RECORD([Customers]) -``` - -Si no utiliza subrutinas, tendrá que escribir el código cada vez que quiera modificar el registro de un cliente. Si no utiliza subrutinas, tendrá que escribir el código cada vez que quiera modificar el registro de un cliente. Si utiliza subrutinas, sólo tendrá que escribirlas una vez. Esta es la primera ventaja de las subrutinas: reducir la cantidad de código. - -Si el código descrito anteriormente fuera un método llamado `MODIFY_CUSTOMER`, se ejecutaría simplemente utilizando el nombre del método en otro método. Por ejemplo, para modificar el registro de un cliente y luego imprimir el registro, se escribiría este método: - -```4d - MODIFY_CUSTOMER - PRINT SELECTION([Customers]) -``` - -Esta posibilidad simplifica enormemente sus métodos. En el ejemplo, no es necesario saber cómo funciona el método `MODIFY_CUSTOMER`, sólo lo que hace. Esta es la segunda razón para utilizar subrutinas: clarificar sus métodos. De este modo, sus métodos se convierten en extensiones del lenguaje 4D. - -Si necesita cambiar su método de búsqueda de clientes en este proyecto de ejemplo, tendrá que cambiar sólo un método, no diez. Esta es la siguiente razón para utilizar subrutinas: facilitar los cambios en sus métodos. - -Utilizando las subrutinas, hace que su código sea modular. Esto significa simplemente dividir el código en módulos (subrutinas), cada una de las cuales realiza una tarea lógica. Considere el siguiente código de un proyecto de de cuentas corrientes: - -```4d - FIND_CLEARED_CHECKS //Buscar los cheques emitidos - RECONCILE_ACCOUNT //Reconciliar la cuenta - PRINT_CHECK_BOOK_REPORT //Imprimir un informe de la chequera -``` - -Incluso para alguien que no conozca el proyecto, está claro lo que hace este código. No es necesario examinar cada subrutina. Cada subrutina puede tener muchas líneas y realizar algunas operaciones complejas, pero aquí sólo es importante que realice su tarea. Le recomendamos que divida su código en tareas lógicas, o módulos, siempre que sea posible. - -### Objeto fórmula - -Puede encapsular los métodos de su proyecto en objetos **fórmula** y llamarlos desde sus objetos. - -Los comandos `Formula` o `Formula from string` permiten crear objetos de fórmula nativos que se pueden encapsular en las propiedades de los objetos. Permite implementar métodos objetos personalizados. - -Para ejecutar un método almacenado en una propiedad objeto, utilice el operador **()** después del nombre de la propiedad. Por ejemplo: - -```4d -//myAlert -ALERT("Hello world!") -``` - -Luego `myAlert` puede encapsularse en cualquier objeto y llamarse: - -```4d -var $o : Object -$o:=New object("custom_Alert";Formula(myAlert)) -$o.custom_Alert() //muestra "Hello world!" -``` - -También se admite la sintaxis con paréntesis: - -```4d -$o["custom_Alert"]() //muestra "Hello world!" -``` - -También puede [pasar parámetros](Concepts/parameters.md) a su fórmula cuando la llame utilizando $1, $2… así como con los métodos proyecto 4D: - -```4d -//método fullName -C_TEXT($0;$1;$2) -$0:=$1+" "+$2 -``` - -Puede encapsular `fullName` en un objeto: - -```4d -var $o : Object -$o:=New object("full_name";Formula(fullName)) -$result:=$o.full_name("John";"Smith") -//$result = "John Smith" -//equivalente a $result:=fullName("param1";"param2") -``` - -Combinados con la función `This`, estos métodos objetos permiten escribir un código genérico muy poderoso. Por ejemplo: - -```4d -//método fullName2 -C_TEXT($0) -$0:=This.firstName+" "+This.lastName -``` - -Luego el método actúa como un nuevo atributo calculado que se puede añadir a otros atributos: - -```4d -var $o : Object -$o:=New object("firstName";"Jim";"lastName";"Wesson") -$o.fullName:=Formula(fullName2) //añade el método - -$result:=$o.fullName() -//$result = "Jim Wesson" -``` - -Tenga en cuenta que, aunque no tenga parámetros, un método objeto que vaya a ejecutarse debe llamarse con paréntesis `()`. Llamar sólo a la propiedad del objeto devolverá una nueva referencia a la fórmula (y no la ejecutará): - -```4d -$o:=$f.message //devuelve el objeto fórmula en $o -``` - -### Métodos de menú - -Un método de menú se llama cuando se selecciona el comando de menú personalizado al que está asociado. El método se asigna al comando del menú utilizando el editor de menús o un comando del tema "Menús". El método se ejecuta cuando se elige el comando del menú. Al crear menús personalizados con métodos de menú que realizan acciones específicas, usted crea interfaces personalizadas para sus aplicaciones de escritorio. - -Los comandos de menú personalizados pueden hacer que se realicen una o varias actividades. Por ejemplo, un comando de menú de entrada de registros puede llamar a un método que realice dos tareas: mostrar el formulario de entrada apropiado y llamar al comando `ADD RECORD` hasta que el usuario cancele la actividad de entrada de datos. - -La automatización de secuencias de actividades es una capacidad muy poderosa del lenguaje de programación. Utilizando los menús personalizados, se pueden automatizar las secuencias de tareas y, por lo tanto, ofrecer más orientación a los usuarios de la aplicación. - -### Métodos de gestión de proceso - -Un **método proyecto** es un método proyecto que se llama cuando se inicia un proceso. El proceso dura sólo mientras el método continúa ejecutándose, excepto si se trata de un proceso Worker. Tenga en cuenta que un método de menú asociado a un comando de menú con la propiedad *Iniciar un nuevo proceso* es también el método de gestión de proceso para el proceso recién creado. - -### Métodos de gestión de eventos y errores - -Un **método de gestión de eventos** es un método dedicado a la gestión de eventos, que se ejecuta en un proceso diferente del método de gestión de procesos. Generalmente, para la gestión de eventos, 4D se encarga de la mayor parte. Por ejemplo, durante la entrada de datos, 4D detecta las pulsaciones de las teclas y los clics, y luego llama a los métodos objeto y formulario correspondientes para que usted pueda responder adecuadamente a los eventos desde estos métodos. Para más información, consulte la descripción del comando `ON EVENT CALL`. - -Un **método de gestión de errores** es un método proyecto basado en interrupciones. Se llama cada vez que se produce un error o una excepción. Para más información, consulte la sección [Gestión de errores](error-handling.md). - -### Execution mode - -Los métodos proyecto escritos en su aplicación suelen ser llamados automáticamente durante el uso de la aplicación a través de comandos de menú, botones, otros métodos, etc. En cuanto a los métodos base, se ejecutan en relación con eventos específicos que ocurren en la aplicación. - -Sin embargo, para propósitos de prueba y depuración, 4D le permite ejecutar manualmente los métodos proyecto y ciertos métodos de la base de datos en el modo Diseño. En este caso, es posible ejecutar el método en un nuevo proceso y/o directamente en modo Depuración, para comprobar su ejecución paso a paso. - -Están disponibles los siguientes modos de ejecución: - -- El método A puede llamar al método B que puede llamar a A, por lo que A volverá a llamar a B y así sucesivamente. -- Un método puede llamarse a sí mismo. - -#### Desde el Editor de código - -Cada ventana del [**Editor de código**](../code-editor/write-class-method.md) tiene un botón que se puede utilizar para ejecutar el método actual. Mediante el menú asociado a este botón, se puede elegir el tipo de ejecución deseado. - -Este botón sólo está activo para los métodos proyecto y para los siguientes métodos base de datos: - -- On Startup -- On Exit -- On Server Startup -- On Server Shutdown - -Para más información, consulte [Barra de herramientas](../code-editor/write-class-method.md#toolbar). - -#### De la caja de diálogo Ejecutar método - -En 4D, algunos usos típicos de la recursividad son: - -Esta caja de diálogo lista todos los métodos proyecto de la base de datos, incluyendo los métodos proyecto compartidos de los componentes. Por otra parte, los métodos proyecto que han sido declarados invisibles no aparecerán. - -Para ejecutar un método proyecto, basta con seleccionar su nombre en la lista y hacer clic en **Ejecutar**. Para ejecutar un método paso a paso en modo Depuración, haga clic en **Depuración**. Para más información sobre el depurador de 4D, consulte la sección [Depuración](../Debugging/basics.md). - -Si marca la casilla **Nuevo proceso**, el método seleccionado se ejecuta en otro proceso. Si el método está realizando una tarea que requiere mucho tiempo, como la impresión de un gran conjunto de registros, puede seguir trabajando con su base de datos, añadiendo registros a una tabla, creando un gráfico para mostrar los datos, etc. Para más información sobre procesos, consulte [Procesos](../Develop/processes.md). - -**Notas Servidor 4D**: - -- Si desea que el método se ejecute en el equipo servidor y no en el equipo cliente, seleccione la opción **En 4D Server** en el menú A ejecutar. En este caso, se crea un nuevo proceso, llamado *procedimiento almacenado*, en la máquina servidor para ejecutar el método. Esta opción puede utilizarse para reducir el tráfico de red y optimizar el funcionamiento de 4D Server, en particular para los métodos que llaman a los datos almacenados en el disco. Todos los tipos de métodos pueden ejecutarse en la máquina servidor o en otra máquina cliente, excepto los que modifican la interfaz de usuario. En este caso, los procedimientos almacenados son ineficaces. -- También puede optar por ejecutar el método en otra estación de trabajo cliente. Otras estaciones de trabajo cliente no aparecerán en el menú, a menos que hayan sido previamente "registradas" (para más información, consulte la descripción de la opción [REGISTER CLIENT](../commands/register-client). - -Por defecto, está seleccionada la opción **localmente**. Con la versión 4D monousuario, esta es la única opción disponible. - -## Métodos proyecto recursivos - -Los métodos proyecto pueden llamarse a sí mismos. Por ejemplo: - -- El método A puede llamar al método B que puede llamar a A, por lo que A volverá a llamar a B y así sucesivamente. -- Un método puede llamarse a sí mismo. - -Esto se llama recursividad. El lenguaje 4D soporta totalmente la recursividad. - -Aquí un ejemplo. Digamos que tiene una tabla `[Friends and Relatives]` compuesta por este conjunto de campos extremadamente simplificado: - -- `[Friends and Relatives]Name` -- `[Friends and Relatives]ChildrensName` - -Para este ejemplo, suponemos que los valores de los campos son únicos (no hay dos personas con el mismo nombre). A partir de un nombre, quiere escribir la frase "Un amigo mío, Juan, que es hijo de Pablo, que es hijo de Juana, que es hijo de Roberto, que es hijo de Leonor, se gana la vida así": - -1. Puede proceder de esta manera: - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - $vtTheWholeStory:="A friend of mine, "+$vsName - Repeat - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) - $vlQueryResult:=Records in selection([Friends and Relatives]) - If($vlQueryResult>0) - $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name - $vsName:=[Friends and Relatives]Name - End if - Until($vlQueryResult=0) - $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" - ALERT($vtTheWholeStory) - End if - End if -``` - -2. También puede proceder así: - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") - End if - End if -``` - -con la función recursiva `Genealogy of` siguiente: - -```4d - ` Genealogy of project method - ` Genealogy of ( String ) -> Text - ` Genealogy of ( Name ) -> Part of sentence - - $0:=$1 - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$1) - If(Records in selection([Friends and Relatives])>0) - $0:=$0+" who is the child of "+Genealogy of([Friends and Relatives]Name) - End if -``` - -Note que el método `Genealogy of` se llama a sí mismo. - -La primera forma es un **algoritmo iterativo**. La segunda forma es un **algoritmo recursivo**. - -Cuando implemente el código para casos como el del ejemplo anterior, es importante tener en cuenta que siempre puede escribir métodos utilizando los algoritmos iterativos o recursivos. Normalmente, la recursividad ofrece un código más conciso, legible y mantenible, pero su uso no es obligatorio. - -En 4D, algunos usos típicos de la recursividad son: - -- Tratar los registros dentro de las tablas que se relacionan entre sí de la misma manera que en el ejemplo. -- Navegar por los documentos y las carpetas del disco, utilizando los comandos `FOLDER LIST` y `DOCUMENT LIST`. Una carpeta puede contener carpetas y documentos, las subcarpetas pueden a su vez contener carpetas y documentos, y así sucesivamente. - -**Importante:** Las llamadas recursivas deben terminar siempre en algún punto. En el ejemplo, el método `Genealogy of` deja de llamarse a sí mismo cuando la consulta no devuelve ningún registro. Sin esta prueba condicional, el método se llamaría a sí mismo indefinidamente; eventualmente, 4D devolvería un error "Pila llena" porque ya no tendría espacio para "apilar" las llamadas (así como los parámetros y las variables locales utilizadas en el método). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/ordering.md b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/ordering.md index dbb404bcbac714..62969b9f0a9003 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/ordering.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/ordering.md @@ -21,7 +21,7 @@ The 4D language provides several mechanisms that rely on sorting collection elem When a collection or entity selection containing elements of different types is sorted, a **type-based stratification** is applied according to the following algorithm: -1. **Fase de reparto**: los elementos se agrupan en clases de equivalencia en función de su tipo base. This phase establishes a partition of the entire element set. +1. **Fase de reparto**: los elementos se agrupan en clases de equivalencia en función de su tipo base. Esta fase establece una partición de todo el conjunto de elementos. 2. **Intra-class ordering phase**: Within each class, elements are sorted according to type-specific comparison rules. The default order is **ascending**. Los tipos se ordenan según la secuencia siguiente, con sus respectivas relaciones de comparación en orden ascendente: @@ -32,8 +32,8 @@ Los tipos se ordenan según la secuencia siguiente, con sus respectivas relacion | 2 | **boolean** | | orden lógico: false *antes que* true | | 3 | **string** | | orden lexicográfico (por ejemplo, "a" *antes* "ab" *antes* "b") | | 4 | **number** | time (converted to milliseconds or seconds depending on the `Time inside objects` database setting) | standard algebraic order (numeric comparison) | -| 5 | **object** | blobs, imágenes, punteros no nulos (colecciones) | internal order (consistent for collection functions, see below) | -| 6 | **collection** | | internal order (consistent for collection functions, see below) | +| 5 | **object** | blobs, imágenes, punteros no nulos (colecciones) | orden interno (coherente para las funciones de collection, ver más abajo) | +| 6 | **collection** | | orden interno (coherente para las funciones de collection, ver más abajo) | | 7 | **date** | | orden cronológico (fechas más antiguas *antes* de las más recientes, por ejemplo, ¡1990-01-01! *before* !2000-01-01!) | ### Valores numéricos especiales diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Desktop/sessions.md b/i18n/es/docusaurus-plugin-content-docs/current/Desktop/sessions.md index 2b686cb6b6c507..e017e3e2de5e99 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Desktop/sessions.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Desktop/sessions.md @@ -34,7 +34,7 @@ Este objeto se maneja a través de las funciones y propiedades de la [clase `Ses Dependiendo de dónde se ejecute el código, se dispondrá de un objeto `session` de usuario del lado del servidor o del lado del cliente. Both objects are similar, except that: - sus propiedades [`.storage`](../API/SessionClass.md#storage) no son el mismo objeto. A value stored in the `.storage` of the user session on the server will not be available in the `.storage` of the user session on the client and conversely. -- for security reasons, the client-side session cannot execute functions that **modify** [privileges](../ORDA/privileges.md) ([`setPrivileges()`](../API/SessionClass.md#setprivileges), [`clearPrivileges()`](../API/SessionClass.md#clearprivileges), [`promote()`](../API/SessionClass.md#promote), [`demote()`](../API/SessionClass.md#demote), [`restore()`](../API/SessionClass.md#restore)). Calling these functions on a client generates an error. +- for security reasons, the client-side session cannot execute functions that **modify** [privileges](../ORDA/privileges.md) ([`setPrivileges()`](../API/SessionClass.md#setprivileges), [`clearPrivileges()`](../API/SessionClass.md#clearprivileges), [`promote()`](../API/SessionClass.md#promote), [`demote()`](../API/SessionClass.md#demote), [`restore()`](../API/SessionClass.md#restore)). Llamar a estas funciones en un cliente genera un error. :::note diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Develop/async.md b/i18n/es/docusaurus-plugin-content-docs/current/Develop/async.md index aa261212d7ba35..bcc1ac2ecac569 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Develop/async.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Develop/async.md @@ -14,7 +14,7 @@ Synchronous execution follows a **sequential** flow, a step-by-step where each i Synchronous execution is used when: - La ejecución de las tareas debe seguir un orden estricto. -- Performance impact is minimal (e.g., quick operations). +- El impacto en el rendimiento es mínimo (por ejemplo, operaciones rápidas). - Se ejecuta en un contexto de un solo hilo donde el bloqueo es aceptable. - La ejecución síncrona bloquea la interfaz de usuario y es más adecuada para tareas rápidas y ordenadas en las que el bloqueo es aceptable. @@ -43,7 +43,7 @@ Elegir entre ejecución síncrona y asíncrona: 4D ofrece capacidades integradas de **ejecución asíncrona** a través de varias clases y comandos. These allow background task execution, network communication, and large data processing, while waiting other operations to complete without blocking the current process. -The general concept of asynchronous event management in 4D is based on an asynchronous messaging model using **workers** (processes that listen to events) and **callbacks** (functions or formulas automatically invoked when an event occurs). Instead of waiting for a result (synchronous mode), you provide a function that will be automatically called when the desired event occurs. Callbacks can be passed as class functions (recommended) or Formula objects. +The general concept of asynchronous event management in 4D is based on an asynchronous messaging model using **workers** (processes that listen to events) and **callbacks** (functions or formulas automatically invoked when an event occurs). Instead of waiting for a result (synchronous mode), you provide a function that will be automatically called when the desired event occurs. Las retrollamadas se pueden pasar como funciones clase (recomendado) o como objetos Formula. This model is common to [`CALL WORKER`](../commands/call-worker), [`CALL FORM`](../commands/call-form), and [classes that support aynchronous execution](#asynchronous-programming-with-4d-classes). Todos estos comandos/clases inician una operación que se ejecuta en segundo plano. La sentencia que lanza la operación retorna inmediatamente, sin esperar a que la operación finalice. @@ -51,11 +51,11 @@ This model is common to [`CALL WORKER`](../commands/call-worker), [`CALL FORM`]( Asynchronous programming relies on a system of [**workers**](../Develop/processes.md#worker-processes) (worker processes), which allows code to be executed in parallel without blocking the main process. This is particularly useful for long tasks (such as HTTP calls, executing external processes, background processing), while keeping the user interface responsive. -Using worker processes in asynchronous programming **is mandatory** since "classic" processes automatically terminate their execution when the process method ends, thus using callbacks is not possible. A worker process stays alive and can **listen to events**. +Using worker processes in asynchronous programming **is mandatory** since "classic" processes automatically terminate their execution when the process method ends, thus using callbacks is not possible. Un proceso worker permanece vivo y puede **escuchar eventos**. ### Event queue (mailbox) -Each worker (or form window for [`CALL FORM`](../commands/call-form)) has its own message queue. [`CALL WORKER`](../commands/call-worker) o [`CALL FORM`](../commands/call-form) simplemente envía un mensaje a esta cola. El worker trata los mensajes uno a uno, en el orden en que llegan, dentro de su propio contexto. Process variables, current selections, etc. are preserved. +Each worker (or form window for [`CALL FORM`](../commands/call-form)) has its own message queue. [`CALL WORKER`](../commands/call-worker) o [`CALL FORM`](../commands/call-form) simplemente envía un mensaje a esta cola. El worker trata los mensajes uno a uno, en el orden en que llegan, dentro de su propio contexto. Se conservan las variables de proceso, las selecciones actuales, etc. ### Comunicación bidireccional mediante mensajes @@ -115,7 +115,7 @@ Recomendamos la siguiente secuencia: 1. You create the user class where you declare callback functions, for example a `cs.Params` with `onError()` and `onResponse()` functions. 2. Instanciará la clase usuario (en nuestro ejemplo utilizando `cs.Params.new()`) que configurará su objeto asíncrono. -3. You call the constructor of the 4D class (for example `4D.SystemWorker.new()`) and pass the *options* object as parameter. It starts the operations passed immediately without delay. +3. You call the constructor of the 4D class (for example `4D.SystemWorker.new()`) and pass the *options* object as parameter. Inicia las operaciones pasadas inmediatamente sin demora. Here is a full example of implementation of an *options* object based upon a user class: diff --git a/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/createStylesheet.md b/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/createStylesheet.md index 7ebf85524d272e..0703577c33914e 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/createStylesheet.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/createStylesheet.md @@ -206,7 +206,7 @@ text[text|=Hello] ### Consultas de medios -Media queries allow you to apply styles based on specific conditions. 4D supports media queries for **color schemes** and **platform themes**. +Las consultas de medios permiten aplicar estilos basados en condiciones específicas. 4D supports media queries for **color schemes** and **platform themes**. Una consulta de medios está formada por características y valores de medios (por ejemplo, `:`). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/properties_JSONref.md b/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/properties_JSONref.md index 1aa2956747babf..b61c7343982757 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/properties_JSONref.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/properties_JSONref.md @@ -22,7 +22,7 @@ Esta página ofrece una lista completa de todas las propiedades de los formulari | [`entryOrder`](formEditor.md#data-entry-order) | El orden en el cual los objetos activos son seleccionados cuando la tecla **Tab** o la tecla **Retorno de carro** se utilizan en un formulario de entrada | Colección de nombres de objetos 4D Form | | [`events`](Events/overview.md) | Lista de todos los eventos seleccionados para el objeto o el formulario | Colección de nombres de eventos, por ejemplo ["onClick", "onDataChange"...]. | | **f** | | | -| [`fluentUI`](properties_FormProperties.md#form-theme-on-windows) | Use fluent UI rendering theme for the form on Windows | true, false | +| [`fluentUI`](properties_FormProperties.md#form-theme-on-windows) | Utilizar un tema de renderizado de interfaz de usuario fluido para el formulario en Windows | true, false | | [`formSizeAnchor`](./properties_FormSize.md#size-based-on) | Nombre del objeto cuya posición determina el tamaño del formulario. (longitud mínima: 1) | Nombre de un objeto 4D | | **h** | | | | [`height`](properties_FormSize.md#height) | Altura del formulario | mínimo: 0 | diff --git a/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/listbox_overview.md b/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/listbox_overview.md index ad3434f5385c78..bb439683a7b9e7 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/listbox_overview.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/listbox_overview.md @@ -514,7 +514,7 @@ Este principio se aplica a los arrays internos que se pueden utilizar para gesti *Non-hierarchical representation:* ![](../assets/en/FormObjects/hierarch7.png) -*Hierarchical representation:* +*Representación jerárquica:* ![](../assets/en/FormObjects/hierarch8.png) > Si una o más líneas están ocultas porque sus padres están contraídos, ya no se seleccionan. Sólo se pueden seleccionar las líneas visibles (directamente o por desplazamiento). En otras palabras, las líneas no pueden estar ocultas y seleccionadas a la vez. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md b/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md index ed13eb721ae326..96536ae1284a5f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md @@ -24,7 +24,7 @@ title: Notas del lanzamiento - El comando [`JSON Validate`](../commands/json-validate) ahora tiene en cuenta la llave *$schema* y genera un error si se declara una versión no soportada en el esquema. - For clarity, formula objects are now instances of a new [`4D.Formula`](../API/FormulaClass.md) class that inherits from the generic [`4D.Function`](../API/FunctionClass.md) class. - The "PHP" page has been removed from the [Settings dialog box](../settings/overview.md). Use the [PHP selectors with the `SET DATABASE PARAMETER`](../commands/set-database-parameter#php-interpreter-ip-address-55) command to configure a PHP interpeter. -- The **Legacy** network layer is no longer supported as of 4D 21 R3. Projects and binary databases that were using the Legacy network layer are automatically set to [**ServerNet**](../settings/client-server.md#network-layer) when upgraded to 4D 21 R3 and higher. +- La capa de red **Legacy** ya no es soportada desde 4D 21 R3. Projects and binary databases that were using the Legacy network layer are automatically set to [**ServerNet**](../settings/client-server.md#network-layer) when upgraded to 4D 21 R3 and higher. ## 4D 21 R2 diff --git a/i18n/es/docusaurus-plugin-content-docs/current/ORDA/entities.md b/i18n/es/docusaurus-plugin-content-docs/current/ORDA/entities.md index b4382b770c57a7..ccef5150bbb806 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/ORDA/entities.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/ORDA/entities.md @@ -435,7 +435,7 @@ $myInvoices:=$myParts.invoiceItems.invoice La última línea devolverá en *$myInvoices* una selección de entidades de todas las facturas que tengan al menos una partida de factura relacionada con una parte en la selección de entidades myParts. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades y no se devuelve ninguna entidad, el resultado es una selección de entidades vacía, no nula. -## Restricting entity selections {#restricting-entity-selections} +## Restringir la selección de entidades {#restricting-entity-selections} En ORDA, puede crear filtros para restringir el acceso a entidades de cualquiera de sus clases de datos. Una vez implementado, se aplica automáticamente un filtro siempre que se accede a las entidades de la dataclass, ya sea mediante **funciones de clase ORDA** como [`all()`](../API/DataClassClass.md#all) o [`query()`](../API/EntitySelectionClass.md#query), o por la [**API REST**](../category/api-dataclass) (que implica el [Explorador de datos](../Admin/dataExplorer.md) y [remote datastores](remoteDatastores.md)). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Project/code-overview.md b/i18n/es/docusaurus-plugin-content-docs/current/Project/code-overview.md index 89a21568cff73b..29ba4dc50445bc 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Project/code-overview.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Project/code-overview.md @@ -1,6 +1,6 @@ --- id: code-overview -title: Creación de métodos y clases +title: Managing Methods and Classes --- El código 4D utilizado en todo el proyecto está escrito en [métodos](../Concepts/methods.md) y [clases](../Concepts/classes.md). @@ -11,20 +11,87 @@ El IDE de 4D le ofrece varias funcionalidades para crear, editar, exportar o eli Un método en 4D se almacena en un archivo **.4dm** ubicado en la carpeta apropiada de la carpeta [`/Project/Sources/`](../Project/architecture.md#sources). -Puede crear [varios tipos de métodos](../Concepts/methods.md): +Puede crear [varios tipos de métodos](../Concepts/methods.md#method-types): - Todos los tipos de métodos pueden crearse o abrirse desde la ventana del **Explorador** (excepto los métodos Objeto que se gestionan desde el [editor de formularios](../FormEditor/formEditor.md)). - Los métodos proyecto también pueden crearse o abrirse desde el menú **Archivo** o desde la barra de herramientas (**Nuevo/Método...** o **Abrir/Método...**) o utilizando los accesos directos de la ventana del [editor de código](../code-editor/write-class-method.md#shortcuts). -- Los triggers también pueden crearse o abrirse desde el editor de Estructura. +- **Triggers** can also be created or opened from the [Structure editor](../Develop-legacy/triggers.md#activating-and-creating-a-trigger). - Los métodos formulario también pueden crearse o abrirse desde el [editor de formularios](../FormEditor/formEditor.md). ## Crear las clases -Una clase usuario en 4D está definida por un archivo de método específico (**.4dm**), almacenado en la carpeta [`/Project/Sources/Classes/`](../Project/architecture.md#sources). El nombre del archivo es el nombre de la clase. +### User classes -Puede crear un archivo de clase desde el menú **Archivo** o la barra de herramientas (**Nuevo/Clase...**) o en la página **Métodos** de la ventana **Explorador**. +Una clase usuario en 4D está definida por un archivo de método específico (**.4dm**), almacenado en la carpeta [`/Project/Sources/Classes/`](../Project/architecture.md#sources). El nombre del archivo es el nombre de la clase. Por ejemplo, una clase llamada "Polygon" se almacenará en el siguiente archivo: -Para más información, consulte la sección [Clases](../Concepts/classes.md). +``` +Project folder Project Sources Classes Polygon.4dm +``` + +You can create a class file from the **File** menu or toolbar (**New > Class...**) or in the **Methods** page of the **Explorer** window. También puede utilizar el atajo **Ctrl+Mayús+Alt+k**. + +En la página **Métodos** del Explorador, las clases se agrupan en la categoría **Clases**. + +Para crear una nueva clase, puede: + +- seleccione la categoría **Clases** y haga clic en el botón ![](../assets/en/Users/PlussNew.png). +- seleccione **Nueva clase...** en el menú de acciones de la parte inferior de la ventana del Explorador, o en el menú contextual del grupo Clases. + ![](../assets/en/Concepts/newClass.png) +- seleccione **Nueva > Clase...** en el menú contextual de la página de inicio del Explorador. + +Al nombrar las clases, debe tener en cuenta las siguientes reglas: + +- Un [nombre de clase](../Concepts/identifiers.md#classes) debe cumplir con [reglas de denominación de las propiedades](../Concepts/identifiers.md#object-properties). +- . +- No se recomienda dar el mismo nombre a una clase y a una tabla de la base, para evitar conflictos. + +### ORDA classes + +[ORDA data model user classes](../ORDA/ordaClasses.md) are high-level class functions created above the data model. + +An ORDA data model class is defined by adding, at the same location as regular class files (*i.e.* in the `/Sources/Classes` folder of the project folder), a .4dm file with the name of the class. Por ejemplo, una clase de entidad para la dataclass `Utilities` se definirá a través de un archivo `UtilitiesEntity.4dm`. + +4D crea previa y automáticamente las clases vacías en memoria para cada objeto del modelo de datos disponible. + +![](../assets/en/ORDA/ORDA_Classes-3.png) + +Por defecto, las clases ORDA vacías no se muestran en el Explorador. Para mostrarlas, debe seleccionar **Mostrar todas las clases de datos** en el menú de opciones del Explorador: +![](../assets/en/ORDA/showClass.png) + +Las clases de usuarios ORDA tienen un icono diferente de las otras clases. Las clases vacías se atenúan: + +![](../assets/en/ORDA/classORDA2.png) + +Para crear un archivo de clase ORDA, basta con hacer doble clic en la clase predefinida correspondiente en el Explorador. 4D creates the class file and add the [`extends`](../Concepts/classes.md#class-extends-classname) code. Por ejemplo, para una clase Entity: + +``` +Class extends Entity +``` + +Una vez definida una clase, su nombre ya no aparece atenuado en el Explorador. + +Para abrir una clase ORDA definida en el editor de código 4D, seleccione o haga doble clic en el nombre de una clase ORDA y utilice **Editar...** en el menú contextual/menú de opciones de la ventana del Explorador: + +![](../assets/en/ORDA/classORDA4.png) + +Para las clases ORDA basadas en el datastore local (`ds`), puede acceder directamente al código de la clase desde la ventana de estructura 4D: + +![](../assets/en/ORDA/classORDA5.png) + +### Soporte en IDE 4D + +En las diferentes ventanas 4D (editor de código, compilador, depurador, explorador de ejecución), el código de la clase se maneja básicamente como un método proyecto con algunas especificidades: + +- En el editor de código: + - una clase no puede ser ejecutada + - una función de clase es un bloque de código + - **Ir a la definición** en un objeto miembro busca las declaraciones de función de clase; por ejemplo, "$o.f()" encontrará "Function f". + - **Buscar referencias** en la declaración de función de clase busca la función utilizada como miembro de objeto; por ejemplo, "Function f" encontrará "$o.f()". + - variables typed as a user or ORDA class automatically benefit from autocompletion features. Ejemplo con una variable de clase Entity: + +![](../assets/en/ORDA/AutoCompletionEntity.png) + +- En el explorador de Ejecución y Depurador, las funciones clase se muestran con el formato `` constructor o `.`. ## Eliminar los métodos o las clases @@ -35,3 +102,70 @@ Para eliminar un método o clase existente, puede: > Para eliminar un método objeto, seleccione **Borrar el método de objeto** en el [editor de formularios](../FormEditor/formEditor.md) (menú **Objeto** o menú contextual). +## Design Object Access commands + +You can access the contents and paths of all methods in your applications by programming, thanks to the [**"Design Object Access" command theme**](../commands/theme/Design_Object_Access.md). This source toolkit facilitates the integration into your applications of code control tools and more particularly version control systems (VCS). It also lets you implement advanced systems for [code documentation](../Project/documentation.md), for building a custom explorer or for organizing scheduled backups of the code saved as disk files. + +The following principles are implemented: + +- Each method and form in a 4D application has its own address in the form of a pathname. For example, the trigger method for table 1 can be found at "[trigger]/table_1". Each object pathname is unique in an application. +- You can access objects in the 4D application using the commands of the **"Design Object Access"** command theme, for example [`METHOD GET NAMES`](../commands/method-get-names) or [`METHOD GET PATHS`](../commands/method-get-paths). +- Most of the commands in this theme work in both [interpreted and compiled](../Concepts/interpreted.md) mode. However, commands that modify properties or access contents executable from methods can only be used in interpreted mode (see the table below). +- Puede utilizar todos los comandos de este tema con 4D en modo local o remoto. However, keep in mind that you cannot use certain commands in compiled mode: the purpose of this theme is to create custom development support tools. You must not use these commands to dynamically change the functioning of a database that is running. For example, you cannot use [`METHOD SET ATTRIBUTE`](../commands/method-set-attribute) to change a method attribute according to the status of the current user. +- When a command of this theme is called from a [component](../Project/components.md), by default it accesses the component objects. In this case, to access objects of the host, you just pass a `*` as the last parameter. + +### Use in compiled mode + +For reasons related to the principle of the compilation process, only certain commands in this theme can be used in compiled mode. The following table indicates the available of the commands in compiled mode: + +| Comando | Can be used in compiled mode | +| ------------------------------------------------------------------------ | ---------------------------- | +| [Current method path](../commands/current-method-path) | Sí | +| [FORM GET NAMES](../commands/form-get-names) | Sí | +| [METHOD Get attribute](../commands/method-get-attribute) | Sí | +| [METHOD GET ATTRIBUTES](../commands/method-get-attributes) | Sí | +| [METHOD GET CODE](../commands/method-get-code) | No | +| [METHOD GET COMMENTS](../commands/method-get-comments) | Sí | +| [METHOD GET FOLDERS](../commands/method-get-folders) | Sí | +| [METHOD GET MODIFICATION DATE](../commands/method-get-modification-date) | Sí | +| [METHOD GET NAMES](../commands/method-get-names) | Sí | +| [METHOD Get path](../commands/method-get-path) | Sí | +| [METHOD GET PATHS](../commands/method-get-paths) | Sí | +| [METHOD GET PATHS FORM](../commands/method-get-paths-form) | Sí | +| [METHOD OPEN PATH](../commands/method-open-path) | No | +| [METHOD RESOLVE PATH](../commands/method-resolve-path) | Sí | +| [METHOD SET ACCESS MODE](../commands/method-set-access-mode) | Sí | +| [METHOD SET ATTRIBUTE](../commands/method-set-attribute) | No | +| [METHOD SET ATTRIBUTES](../commands/method-set-attributes) | No | +| [METHOD SET CODE](../commands/method-set-code) | No | +| [METHOD SET COMMENTS](../commands/method-set-comments) | No | + +:::note + +The error -9762 "The command cannot be executed in a compiled database." is generated when the command is executed in compiled mode. + +::: + +### Creation of pathnames + +Pathnames generated for 4D objects must be compatible with the file management of the operating system. Characters that are forbidden at the OS level such as ":" are automatically encoded in method names, so that generated files may be integrated automatically in a version control system. + +Here are the encoded characters: + +| Caracter | Encoding | +| ---------------------------- | -------- | +| " | %22 | +| \* | %2A | +| / | %2F | +| : | %3A | +| \< | %3C | +| \> | %3E | +| ? | %3F | +| \\| | %7C | +| \\ | %5C | +| % | %25 | + +#### Ejemplos + +`Form?1` está codificado `Form%3F1` +`Button/1` está codificado `Button%2F1` \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Project/project-method-properties.md b/i18n/es/docusaurus-plugin-content-docs/current/Project/project-method-properties.md index 66efca7466c3fd..1f77964a3af788 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/Project/project-method-properties.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/Project/project-method-properties.md @@ -1,8 +1,250 @@ --- id: project-method-properties -title: Propiedades de los métodos proyecto +title: Métodos proyecto --- +## Roles + +Un método proyecto puede tener uno de los siguientes papeles, dependiendo de cómo se ejecute y utilice: + +- Subrutina +- Objeto fórmula +- Método de menú +- Método de gestión de proceso +- Métodos de gestión de eventos o errores +- APIs a llamar desde el servidor web, etiquetas de transformación, extensiones... +- También puede ejecutar los métodos de su proyecto manualmente, por ejemplo, para realizar pruebas. + +### Subrutinas + +Una subrutina es un método proyecto que puede considerarse como un ayudante. Realiza aquellas tareas que otros métodos le solicitan. Una función es una subrutina que devuelve un valor al método que la llamó. + +Cuando crea un método proyecto, éste pasa a formar parte del lenguaje del proyecto en el que lo crea. Luego puede llamar al método proyecto desde otro método (método proyecto, método objeto...) de la misma manera que llama a los comandos integrados de 4D. Un método proyecto utilizado de este manera se llama una subrutina. + +Se utilizan subrutinas para: + +- Reducción del código repetitivo +- Clarificación de los métodos +- Facilitar los cambios en sus métodos +- Modularizar el código + +Por ejemplo, supongamos que tiene un proyecto de clientes. Al personalizar el proyecto, se da cuenta de que hay algunas tareas que realiza reiteradamente, como la búsqueda de un cliente y la modificación de su registro. El código para hacer esto podría ser: + +```4d + // Búsqueda de un cliente + QUERY BY EXAMPLE([Customers]) + // Selección del formulario entrada + FORM SET INPUT([Customers];"Data Entry") + // Modificación del registro del cliente + MODIFY RECORD([Customers]) +``` + +Si no utiliza subrutinas, tendrá que escribir el código cada vez que quiera modificar el registro de un cliente. Si no utiliza subrutinas, tendrá que escribir el código cada vez que quiera modificar el registro de un cliente. Si utiliza subrutinas, sólo tendrá que escribirlas una vez. Esta es la primera ventaja de las subrutinas: reducir la cantidad de código. + +Si el código descrito anteriormente fuera un método llamado `MODIFY_CUSTOMER`, se ejecutaría simplemente utilizando el nombre del método en otro método. Por ejemplo, para modificar el registro de un cliente y luego imprimir el registro, se escribiría este método: + +```4d + MODIFY_CUSTOMER + PRINT SELECTION([Customers]) +``` + +Esta posibilidad simplifica enormemente sus métodos. En el ejemplo, no es necesario saber cómo funciona el método `MODIFY_CUSTOMER`, sólo lo que hace. Esta es la segunda razón para utilizar subrutinas: clarificar sus métodos. De este modo, sus métodos se convierten en extensiones del lenguaje 4D. + +Si necesita cambiar su método de búsqueda de clientes en este proyecto de ejemplo, tendrá que cambiar sólo un método, no diez. Esta es la siguiente razón para utilizar subrutinas: facilitar los cambios en sus métodos. + +Utilizando las subrutinas, hace que su código sea modular. Esto significa simplemente dividir el código en módulos (subrutinas), cada una de las cuales realiza una tarea lógica. Considere el siguiente código de un proyecto de de cuentas corrientes: + +```4d + FIND_CLEARED_CHECKS //Buscar los cheques emitidos + RECONCILE_ACCOUNT //Reconciliar la cuenta + PRINT_CHECK_BOOK_REPORT //Imprimir un informe de la chequera +``` + +Incluso para alguien que no conozca el proyecto, está claro lo que hace este código. No es necesario examinar cada subrutina. Cada subrutina puede tener muchas líneas y realizar algunas operaciones complejas, pero aquí sólo es importante que realice su tarea. Le recomendamos que divida su código en tareas lógicas, o módulos, siempre que sea posible. + +### Objeto fórmula + +Puede encapsular los métodos de su proyecto en objetos **fórmula** y llamarlos desde sus objetos. + +The [`Formula`](../commands/formula) or [`Formula from string`](../commands/formula-from-string) commands allow you to create [native formula objects](../API/FormulaClass.md) that you can encapsulate in object properties. Permite implementar métodos objetos personalizados. + +Para ejecutar un método almacenado en una propiedad objeto, utilice el operador **()** después del nombre de la propiedad. Por ejemplo: + +```4d +//myAlert +ALERT("Hello world!") +``` + +Luego `myAlert` puede encapsularse en cualquier objeto y llamarse: + +```4d +var $o : Object +$o:=New object("custom_Alert";Formula(myAlert)) +$o.custom_Alert() //muestra "Hello world!" +``` + +También se admite la sintaxis con paréntesis: + +```4d +$o["custom_Alert"]() //muestra "Hello world!" +``` + +For more information, see the [`4D.Formula` class description](../API/FormulaClass.md) and the [Using object properties as named parameters](../Concepts/parameters.md#using-object-properties-as-named-parameters) paragraph. + +### Métodos de menú + +Un método de menú se llama cuando se selecciona el comando de menú personalizado al que está asociado. You assign the method to the menu command using the Menu editor or a [command of the "Menus" theme](../commands/theme/Menus.md). El método se ejecuta cuando se elige el comando del menú. Al crear menús personalizados con métodos de menú que realizan acciones específicas, usted crea interfaces personalizadas para sus aplicaciones de escritorio. + +Los comandos de menú personalizados pueden hacer que se realicen una o varias actividades. For example, a menu command for entering records might call a method that performs two tasks: displaying the appropriate input form, and calling the [`ADD RECORD`(../commands/add-record)] command until the user cancels the data entry activity. + +Automating sequences of activities is a very powerful capability of the 4D programming language. Utilizando los menús personalizados, se pueden automatizar las secuencias de tareas y, por lo tanto, ofrecer más orientación a los usuarios de la aplicación. + +### Métodos de gestión de proceso + +Un **método proyecto** es un método proyecto que se llama cuando se inicia un proceso. The process lasts only as long as the process method continues to execute, except if it is a [Worker process](../Develop/processes.md#worker-processes). Note that a menu method attached to a menu command with [*Start a New Process*](../Menus/properties.md#start-a-new-process) property is also the process method for the newly started process. + +### Métodos de gestión de eventos y errores + +Un **método de gestión de eventos** es un método dedicado a la gestión de eventos, que se ejecuta en un proceso diferente del método de gestión de procesos. Generalmente, para la gestión de eventos, 4D se encarga de la mayor parte. Por ejemplo, durante la entrada de datos, 4D detecta las pulsaciones de las teclas y los clics, y luego llama a los métodos objeto y formulario correspondientes para que usted pueda responder adecuadamente a los eventos desde estos métodos. For more information, see the description of the command [`ON EVENT CALL`](../commands/on-event-call). + +Un **método de gestión de errores** es un método proyecto basado en interrupciones. Se llama cada vez que se produce un error o una excepción. Para más información, consulte la sección [Gestión de errores](../Concepts/error-handling.md). + +### API Methods + +Project methods can be called from external contexts such as other applications, web apps, processed files, etc., in which case they can be seen as API. Such calls include: + +- calls to the web server through [http request handlers](../WebServer/http-request-handler.md) or [`4DACTION` URLs](../WebServer/httpRequests.md#4daction), +- [tag processing](../Tags/transformation-tags.md) +- expressions called from extensions ([4D Write Pro](../WritePro/commands/wp-insert-formula.md), [4D View Pro](../ViewPro/formulas.md) or form objects (e.g. [`ST INSERT EXPRESSION`](../commands/st-insert-expression)). + +External calls to project methods must be allowed in the [project method properties](../Project/project-method-properties.md). + +### Execution mode + +Los métodos proyecto escritos en su aplicación suelen ser llamados automáticamente durante el uso de la aplicación a través de comandos de menú, botones, otros métodos, etc. En cuanto a los métodos base, se ejecutan en relación con eventos específicos que ocurren en la aplicación. + +Sin embargo, para propósitos de prueba y depuración, 4D le permite ejecutar manualmente los métodos proyecto y ciertos métodos de la base de datos en el modo Diseño. En este caso, es posible ejecutar el método en un nuevo proceso y/o directamente en modo Depuración, para comprobar su ejecución paso a paso. + +Están disponibles los siguientes modos de ejecución: + +- El método A puede llamar al método B que puede llamar a A, por lo que A volverá a llamar a B y así sucesivamente. +- Un método puede llamarse a sí mismo. + +#### Desde el Editor de código + +Cada ventana del [**Editor de código**](../code-editor/write-class-method.md) tiene un botón que se puede utilizar para ejecutar el método actual. Mediante el menú asociado a este botón, se puede elegir el tipo de ejecución deseado. + +Este botón sólo está activo para los métodos proyecto y para los siguientes métodos base de datos: + +- On Startup +- On Exit +- On Server Startup +- On Server Shutdown + +Para más información, consulte [Barra de herramientas](../code-editor/write-class-method.md#toolbar). + +#### De la caja de diálogo Ejecutar método + +En 4D, algunos usos típicos de la recursividad son: + +Esta caja de diálogo lista todos los métodos proyecto de la base de datos, incluyendo los métodos proyecto compartidos de los componentes. Por otra parte, los métodos proyecto que han sido declarados invisibles no aparecerán. + +Para ejecutar un método proyecto, basta con seleccionar su nombre en la lista y hacer clic en **Ejecutar**. Para ejecutar un método paso a paso en modo Depuración, haga clic en **Depuración**. Para más información sobre el depurador de 4D, consulte la sección [Depuración](../Debugging/basics.md). + +Si marca la casilla **Nuevo proceso**, el método seleccionado se ejecuta en otro proceso. Si el método está realizando una tarea que requiere mucho tiempo, como la impresión de un gran conjunto de registros, puede seguir trabajando con su base de datos, añadiendo registros a una tabla, creando un gráfico para mostrar los datos, etc. Para más información sobre procesos, consulte [Procesos](../Develop/processes.md). + +**Notas Servidor 4D**: + +- Si desea que el método se ejecute en el equipo servidor y no en el equipo cliente, seleccione la opción **En 4D Server** en el menú A ejecutar. En este caso, se crea un nuevo proceso, llamado *procedimiento almacenado*, en la máquina servidor para ejecutar el método. Esta opción puede utilizarse para reducir el tráfico de red y optimizar el funcionamiento de 4D Server, en particular para los métodos que llaman a los datos almacenados en el disco. Todos los tipos de métodos pueden ejecutarse en la máquina servidor o en otra máquina cliente, excepto los que modifican la interfaz de usuario. En este caso, los procedimientos almacenados son ineficaces. +- También puede optar por ejecutar el método en otra estación de trabajo cliente. Otras estaciones de trabajo cliente no aparecerán en el menú, a menos que hayan sido previamente "registradas" (para más información, consulte la descripción de la opción [REGISTER CLIENT](../commands/register-client). + +Por defecto, está seleccionada la opción **localmente**. Con la versión 4D monousuario, esta es la única opción disponible. + +### Métodos proyecto recursivos + +Los métodos proyecto pueden llamarse a sí mismos. Por ejemplo: + +- El método A puede llamar al método B que puede llamar a A, por lo que A volverá a llamar a B y así sucesivamente. +- Un método puede llamarse a sí mismo. + +Esto se llama recursividad. El lenguaje 4D soporta totalmente la recursividad. + +Aquí un ejemplo. Digamos que tiene una tabla `[Friends and Relatives]` compuesta por este conjunto de campos extremadamente simplificado: + +- `[Friends and Relatives]Name` +- `[Friends and Relatives]ChildrensName` + +Para este ejemplo, suponemos que los valores de los campos son únicos (no hay dos personas con el mismo nombre). A partir de un nombre, quiere escribir la frase "Un amigo mío, Juan, que es hijo de Pablo, que es hijo de Juana, que es hijo de Roberto, que es hijo de Leonor, se gana la vida así": + +1. Puede proceder de esta manera: + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + var $vtTheWholeStory:="A friend of mine, "+$vsName + var $vlQueryResult : Integer + Repeat + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) + $vlQueryResult:=Records in selection([Friends and Relatives]) + If($vlQueryResult>0) + $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name + $vsName:=[Friends and Relatives]Name + End if + Until($vlQueryResult=0) + $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" + ALERT($vtTheWholeStory) + End if + End if +``` + +2. También puede proceder así: + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") + End if + End if +``` + +con la función recursiva `Genealogy of` siguiente: + +```4d + //Genealogy of project method + //Genealogy of ( String ) -> Text + //Genealogy of ( Name ) -> Part of sentence + + #DECLARE($name : Text) -> $result : Text + $result:=$name + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$name) + If(Records in selection([Friends and Relatives])>0) + $result:=$result+" who is the child of "+Genealogy of([Friends and Relatives]Name) + End if +``` + +Note que el método `Genealogy of` se llama a sí mismo. + +La primera forma es un **algoritmo iterativo**. La segunda forma es un **algoritmo recursivo**. + +Cuando implemente el código para casos como el del ejemplo anterior, es importante tener en cuenta que siempre puede escribir métodos utilizando los algoritmos iterativos o recursivos. Normalmente, la recursividad ofrece un código más conciso, legible y mantenible, pero su uso no es obligatorio. + +En 4D, algunos usos típicos de la recursividad son: + +- Tratar los registros dentro de las tablas que se relacionan entre sí de la misma manera que en el ejemplo. +- Browsing documents and folders on your disk, using the commands [`FOLDER LIST`](../commands/folder-list) and [`DOCUMENT LIST`](document-list). Una carpeta puede contener carpetas y documentos, las subcarpetas pueden a su vez contener carpetas y documentos, y así sucesivamente. + +:::warning + +Recursive calls should always end at some point. En el ejemplo, el método `Genealogy of` deja de llamarse a sí mismo cuando la consulta no devuelve ningún registro. Sin esta prueba condicional, el método se llamaría a sí mismo indefinidamente; eventualmente, 4D devolvería un error "Pila llena" porque ya no tendría espacio para "apilar" las llamadas (así como los parámetros y las variables locales utilizadas en el método). + +::: + +## Propiedades + Después de crear un método proyecto, puede cambiar su nombre y modificar sus propiedades. Las propiedades de los métodos proyecto se refieren principalmente a sus condiciones de acceso y de seguridad (acceso de usuarios, servidores integrados o servicios), así como a su modo de ejecución. Los otros tipos de métodos no tienen propiedades específicas. Sus propiedades están relacionadas con las de los objetos a los que están unidos. @@ -14,7 +256,7 @@ Para mostrar la caja de diálogo **Propiedades del método** para un método pro > Una función de parámetrización global permite modificar una propiedad para todos o parte de los métodos proyecto de la base en una sola operación (ver [Modificar atributos de los métodos globalmente](#batch-setting-for-method-attributes)). -## Nombre +### Nombre Puede cambiar el nombre de un método proyecto en el área **Nombre** de la ventana **Propiedades del método** o en el Explorador. @@ -34,37 +276,37 @@ Los métodos base no pueden ser renombrados. Lo mismo ocurre con los triggers, l ::: -## Atributos +### Atributos Puede controlar cómo se utilizan y/o llaman los métodos proyecto en diferentes contextos utilizando atributos. Tenga en cuenta que puede definir los atributos globalmente para una selección de métodos proyecto utilizando el Explorador (ver la sección siguiente). -### Invisible +#### Invisible Si no quiere que los usuarios puedan ejecutar un método proyecto utilizando el comando **Método...** del menú **Ejecución**, puede hacerlo Invisible marcando esta opción. Un método invisible no aparece en la caja de diálogo de ejecución del método. Cuando se hace invisible un método proyecto, sigue estando disponible para los desarrolladores de la base. Permanece en la lista de métodos del Explorador y del Editor de código. -### Compartido por los componentes y la base local +#### Compartido por los componentes y la base local Este atributo se utiliza en el marco de los componentes. Cuando está marcada, indica que el método estará disponible para los componentes cuando la aplicación se utilice como base local. Por otro lado, cuando la aplicación se utiliza como un componente, el método estará disponible para las bases locales. Para más información sobre los componentes, consulte el capítulo [Desarrollo e instalación de componentes 4D](../Extensions/develop-components.md). -### Ejecutar en el servidor +#### Ejecutar en el servidor Este atributo sólo se tiene en cuenta para una aplicación 4D en modo cliente-servidor. Cuando esta opción está marcada, el método del proyecto se ejecuta siempre en el servidor, independientemente de cómo se llame. Para más información sobre esta opción, consulte [Atributo Ejecutar en el servidor](https://doc.4d.com/4Dv20/4D/20/Execute-on-Server-attribute.300-6330555.en.html). -## Modo Ejecución +### Modo Ejecución Esta opción permite declarar el método elegible para la ejecución en modo apropiativo. Se describe en la [sección Procesos apropiativos](../Develop/preemptive.md). -## Disponibilidad +### Disponibilidad Los atributos de disponibilidad especifican los servicios externos que pueden llamar explícitamente al método. -### Web Services +#### Web Services Este atributo le permite publicar el método actual como servicio web accesible a través de peticiones SOAP. Para más información, consulte el capítulo [Publicación y uso de los servicios web](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.en.html). Cuando esta opción está marcada, se activa la opción **Publicado en WSDL**. @@ -72,13 +314,13 @@ En el explorador, los métodos proyecto que se ofrecen como Servicio web reciben **Nota:** no es posible publicar un método como servicio web si su nombre incluye caracteres que no cumplen con la nomenclatura XML (por ejemplo espacios). Si el nombre del método no cumple con esto, 4D no asigna la propiedad. -### Publicado en WSDL +#### Publicado en WSDL Este atributo sólo está disponible si el atributo "Servicio Web" está marcado. Permite incluir el método actual en el WSDL de la aplicación 4D. Para obtener más información al respecto, consulte [Generación del WSDL](https://doc.4d.com/4Dv20/4D/20.2/Publishing-a-Web-Service-with-4D.300-6750334.en.html#502689). En el Explorador, los métodos proyecto que se ofrecen como servicio web y se publican en WSDL reciben un icono específico. -### Etiquetas 4D y URLs (4DACTION...) +#### Etiquetas 4D y URLs (4DACTION...) Esta opción se utiliza para reforzar la seguridad del servidor web 4D: cuando no está marcada, el método proyecto no puede ejecutarse a través de una petición HTTP que contenga la URL especial [4DACTION](../WebServer/httpRequests.md#4daction) utilizada para llamar a los métodos 4D, ni las etiquetas especiales [4DSCRIPT, 4DTEXT y 4DHTML](../Tags/transformation-tags.md). @@ -86,7 +328,7 @@ En el Explorador, los métodos proyecto con este atributo reciben un icono espec Por razones de seguridad, esta opción está desmarcada por defecto. Cada método que pueda ejecutarse utilizando las URLs y las etiquetas especiales debe indicarse individualmente. -### SQL +#### SQL Cuando está marcada, esta opción permite que el método proyecto sea ejecutado por el motor SQL de 4D. Por defecto, no está seleccionado, lo que significa que, a menos que se autorice explícitamente, los métodos proyecto de 4D están protegidos y no pueden ser llamados por el motor SQL de 4D. @@ -99,11 +341,11 @@ This property applies to all internal and external SQL queries --- executed via Para más información, consulte [Implementación del motor SQL de 4D](https://doc.4d.com/4Dv20/4D/20/4D-SQL-engine-implementation.300-6342089.en.html) en el manual SQL de 4D. -### Servidor REST +#### Servidor REST *Esta opción es obsoleta. La llamada a código a través de llamadas REST sólo es compatible con las [funciones de clase del modelo de datos ORDA](../REST/ClassFunctions.md).* -## Modificar de atributos globalmente +### Modificar de atributos globalmente Mediante el cuadro de diálogo "Atributos de los métodos", puede modificar un atributo (Invisible, Ofrecido como servicio web, etc.) para todos o parte de los métodos proyecto base en una sola operación. Esta funcionalidad es especialmente útil para modificar los atributos de un gran número de métodos proyecto. También puede utilizarse durante el desarrollo para aplicar rápidamente los atributos comunes a grupos de métodos similares. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-delete-style-sheet.md b/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-delete-style-sheet.md index d6fa753e59a625..3711acefce89e3 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-delete-style-sheet.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-delete-style-sheet.md @@ -36,7 +36,7 @@ displayed_sidebar: docs The **WP DELETE STYLE SHEET** command removes the designated paragraph or character style sheet from the current document. When a style sheet is removed, every character or paragraph that it was applied to reverts to its original style (*i.e.* the default). -This command provides two ways to remove a style sheet. You can specify: +Este comando ofrece dos formas de eliminar una hoja de estilo. You can specify: - the style sheet object (created with the [WP New style sheet](../WritePro/commands/wp-new-style-sheet) or returned by the [WP Get style sheet](../WritePro/commands/wp-get-style-sheet) command) to remove in the *styleSheetType* parameter, or - the 4D Write Pro document along with the name of the style sheet to remove in the *wpDoc* and *styleSheetName* parameters. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-new-style-sheet.md b/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-new-style-sheet.md index f7ffca21f48848..241229531048b6 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-new-style-sheet.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/WritePro/commands/wp-new-style-sheet.md @@ -37,14 +37,14 @@ displayed_sidebar: docs El comando **WP New style sheet** crea un nuevo objeto (vacío) de hoja de estilo para el *wpDoc* designado. -In the *wpDoc* parameter, pass a 4D Write Pro document. +En el parámetro *wpDoc*, pasa un documento 4D Write Pro. The *styleSheetType* parameter lets you designate the type of the style sheet, *i.e.* the part of the *wpDoc* that will be affected by the style sheet. Hay dos tipos disponibles: -- wk type character: Applies style attributes to characters. +- wk type character: aplica atributos de estilo a los caracteres. - wk type paragraph: Applies style attributes to paragraphs (required if you want to create [hierarchical list style sheets](#hierarchical-list-style-sheet)). -Pase un nombre para la hoja de estilo en el parámetro *styleSheetName*. The style sheet's name is stored with the document and facilitates reusing or modifying the style. It can also be used with the [WP Get style sheet](../WritePro/commands/wp-get-style-sheet) and [WP DELETE STYLE SHEET](../WritePro/commands/wp-delete-style-sheet) commands. The style sheet name must comply with the following rules: +Pase un nombre para la hoja de estilo en el parámetro *styleSheetName*. The style sheet's name is stored with the document and facilitates reusing or modifying the style. It can also be used with the [WP Get style sheet](../WritePro/commands/wp-get-style-sheet) and [WP DELETE STYLE SHEET](../WritePro/commands/wp-delete-style-sheet) commands. El nombre de la hoja de estilo debe cumplir las siguientes reglas: - debe empezar por una letra - puede contener caracteres alfanuméricos, espacios en blanco, caracteres "-" o caracteres unicode >= 128 @@ -76,7 +76,7 @@ If the parameter is omitted or set to 0, a standard (non-list) paragraph style s ## Ejemplo 1 -The following code creates and defines a paragraph style sheet: +El siguiente código crea y define una hoja de estilo de párrafo: ```4d  var $styleSheet : Object @@ -119,10 +119,10 @@ Resultado: - `wk list style type` = `wk decimal` - Las hojas de estilo de los subniveles: - - have incremented `wk list level index` values (2 and 3) + - han incrementado los valores de `wk list level index` (2 y 3) - comparte la misma `wk list level count` - se indentarán automáticamente (0,75 cm × índice de nivel) - - reference the root style sheet through `wk root style` + - hacer referencia a la hoja de estilo raíz mediante `wk root style` ## Ver también diff --git a/i18n/es/docusaurus-plugin-content-docs/current/WritePro/user/user-new.md b/i18n/es/docusaurus-plugin-content-docs/current/WritePro/user/user-new.md index b1e55c95321389..5b5812a3901a64 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/WritePro/user/user-new.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/WritePro/user/user-new.md @@ -38,7 +38,7 @@ añada una parte sobre el hecho de que usted define dónde empieza su lista orde [4D Write Pro – Adding a margin automatically when bullets are set using standard actions](https://blog.4d.com/4d-write-pro-adding-a-margin-automatically-when-bullets-are-set-using-standard-actions) ::: -and the level are managed with (standard actions) +y el nivel se gestionan con (acciones estándar) ### Listas de múltiples niveles diff --git a/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md b/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md index 04268eecddeefa..2623d389a5dc99 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md @@ -51,9 +51,8 @@ Para actualizar las otras máquinas clientes que no estén conectadas, basta con - **SQL Server**: 19812 por defecto (puede modificarse a través de la página "SQL/Configuración" de las Preferencias). - **Servidor de aplicaciones**: 19813 por defecto (puede modificarse a través de la página "Cliente-Servidor/Configuración" de las Preferencias, ver arriba). -- **Servidor DB4D** (servidor de base de datos): 19814 por defecto. Este número de puerto no se puede modificar directamente, pero siempre consiste en el número de puerto del servidor de aplicaciones + 1. -Cuando un cliente 4D se conecta a 4D Server, utiliza el puerto TCP del servidor de aplicaciones (19813 o el puerto indicado después de los dos puntos ':' en la dirección IP mostrada en la caja de diálogo de conexión). La conexión a otros servidores a través de sus respectivos puertos es entonces automática; ya no es necesario especificarlos.\ -Tenga en cuenta que en caso de acceso a través de un enrutador o un cortafuegos, los tres puertos TCP deben abrirse explícitamente. +- **Servidor DB4D** (servidor de base de datos): 19814 por defecto. Este número de puerto no se puede modificar directamente, pero siempre consiste en el número de puerto del servidor de aplicaciones + 1. Cuando un cliente 4D se conecta a 4D Server, utiliza el puerto TCP del servidor de aplicaciones (19813 o el puerto indicado después de los dos puntos ':' en la dirección IP mostrada en la caja de diálogo de conexión). La conexión a otros servidores a través de sus respectivos puertos es entonces automática; ya no es necesario especificarlos.\ + Tenga en cuenta que en caso de acceso a través de un enrutador o un cortafuegos, los tres puertos TCP deben abrirse explícitamente. - [**Depurador remoto**](../Debugging/debugging-remote.md): 19815 por defecto. Este número de puerto no puede modificarse directamente, pero siempre consta del número de puerto del servidor de aplicaciones + 2. #### Autenticación del usuario con el servidor de dominio @@ -68,7 +67,7 @@ Cuando la autenticación única (SSO) está activa (ver arriba), debe llenar est This drop-down box contains the available network layers, which are used to handle communications between 4D Server and remote 4D machines (clients). -- **QUIC** (projects only): Enables the QUIC network layer on the server. +- **QUIC** (sólo proyectos): activa la capa de red QUIC en el servidor. **Notas sobre QUIC**: @@ -83,7 +82,7 @@ This drop-down box contains the available network layers, which are used to hand :::info -Using QUIC network layer is **recommended** for projects. +El uso de la capa de red QUIC es **recomendado** para los proyectos. ::: @@ -138,7 +137,6 @@ Este parámetro puede utilizarse para definir globalmente el modo de actualizaci - **Preguntar**: cuando la notificación es enviada por el servidor, se muestra una caja de diálogo en las máquinas cliente, indicando la modificación. A continuación, el usuario puede aceptar o rechazar la sincronización de la carpeta local **Resources**.\ La carpeta **Resources** centraliza los archivos personalizados necesarios para la interfaz de la base (archivos de traducción, imágenes, etc.). Se pueden utilizar mecanismos automáticos o manuales para notificar a cada cliente cuándo se ha modificado el contenido de esta carpeta. Para más información, consulte la sección [Gestión de la carpeta Resources](https://doc.4d.com/4Dv20/4D/20/Managing-the-Resources-folder.300-6330534.en.html). - ## Página Configuración IP ### Tabla de configuración Autorizar-Rechazar @@ -157,3 +155,4 @@ El funcionamiento de la tabla de configuración es el siguiente: - Autorizar \* (y permitir todas las demás direcciones) Por defecto, 4D Server no aplica ninguna restricción de conexión: la primera línea de la tabla contiene la etiqueta Autorizar y el caracter \* (todas las direcciones). + diff --git a/i18n/es/docusaurus-plugin-content-docs/current/settings/compatibility.md b/i18n/es/docusaurus-plugin-content-docs/current/settings/compatibility.md index 727366339639df..21dc3c4ba00c72 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/settings/compatibility.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/settings/compatibility.md @@ -9,6 +9,7 @@ La página Compatibilidad agrupa los parámetros relacionados con el mantenimien > Esta página enumera las opciones de compatibilidad disponibles para las bases de datos/proyectos convertidos a partir de 4D v18. Para las opciones de compatibilidad más antiguas, consulte la [página Compatibilidad](https://doc.4d.com/4Dv20/4D/20.2/Compatibility-page.300-6750362.en.html) en **doc.4d.com**. - **Utilizar XPath estándar**: por defecto, esta opción está desmarcada para las bases convertidas desde una versión 4D anterior a la v18 R3, y marcada para las bases creadas con 4D v18 R3 y superiores. A partir de la v18 R3, la implementación de XPath en 4D ha sido modificada para ser más compatible y soportar más predicados. Como consecuencia, las funcionalidades no estándar de la implementación anterior ya no funcionan. Incluyen: + - el caracter inicial "/" no es sólo el nodo raíz - la utilización del caracter / como primer caracter en una expresión XPath no declara una ruta absoluta desde el nodo raíz - no hay nodo actual implícito - el nodo actual debe incluirse en la expresión XPath - no hay búsquedas recursivas en las estructuras repetidas: sólo se analiza el primer elemento. \ diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataClassClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataClassClass.md index a629bae775debe..6275b9bca9797d 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataClassClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataClassClass.md @@ -514,9 +514,9 @@ El método de proyecto ***SearchDuplicate*** busca valores duplicados en cualqui
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|---|---| -|Result|Object|<-|Information on the dataclass| +|Resultado|Object|<-|Information on the dataclass|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataStoreClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataStoreClass.md index 41d253aec77b74..bc7294309bfae9 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataStoreClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/DataStoreClass.md @@ -481,9 +481,9 @@ Ver el ejemplo 2 de [`.startRequestLog()`](#startrequestlog).
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if the Data Explorer access is disabled, False if it is enabled (default)| +|Resultado|Boolean|<-|True if the Data Explorer access is disabled, False if it is enabled (default)|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntityClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntityClass.md index 52f95e0939e116..43a5de6f3c3b23 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntityClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntityClass.md @@ -715,9 +715,9 @@ Si la entidad no pertenece a una selección de entidades, la función devuelve N
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Integer|<-|Stamp of the entity (0 if entity has just been created)| +|Resultado|Integer|<-|Stamp of the entity (0 if entity has just been created)|
@@ -813,9 +813,9 @@ El valor resultante se incluye entre 0 y la longitud de la selección de entidad
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if entity has just been created and not yet saved. Otherwise, False.| +|Resultado|Boolean|<-|True if entity has just been created and not yet saved. Otherwise, False.|
@@ -1579,9 +1579,9 @@ Ejemplo con el tipo `relatedEntity` con una forma simple:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if at least one entity attribute has been modified and not yet saved, else False| +|Resultado|Boolean|<-|True if at least one entity attribute has been modified and not yet saved, else False|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntitySelectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntitySelectionClass.md index 43e5c2fdb1741a..cf12ec8c119aa8 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntitySelectionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/EntitySelectionClass.md @@ -912,9 +912,9 @@ El siguiente código genérico duplica todas las entidades de la entity selectio
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if the entity selection is alterable, False otherwise| +|Resultado|Boolean|<-|True if the entity selection is alterable, False otherwise|
@@ -955,9 +955,9 @@ Form.products.add(Form.product)
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if the entity selection is ordered, False otherwise| +|Resultado|Boolean|<-|True if the entity selection is ordered, False otherwise|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/FileClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/FileClass.md index 2b87fa697e8231..c6cb90a5c9a68d 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/FileClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/FileClass.md @@ -170,9 +170,9 @@ La función `4D.File.new()` crea y devuelve u
-|Parameter|Type||Description| -|---|---|---|---| -|Result|Boolean|<-|True if the file was created successfully, false otherwise| +|Parámetro|Tipo||Descripción| +|---|-|-|-|-| +|Resultado|Boolean|<-|True if the file was created successfully, false otherwise|
@@ -330,9 +330,9 @@ Desea eliminar un archivo específico en la carpeta de la base de datos:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|---|---| -|Result|Object|<-|Contents of .exe/.dll version resource or .plist file| +|Resultado|Object|<-|Contents of .exe/.dll version resource or .plist file|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/FolderClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/FolderClass.md index bf3f3ae3ed7cc6..c31149cc1d169a 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/FolderClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/FolderClass.md @@ -158,9 +158,9 @@ La función `4D.Folder.new()` crea y devuel
-|Parameter|Type||Description| -|---|---|---|---| -|Result|Boolean|<-|True if the folder was created successfully, false otherwise| +|Parámetro|Tipo||Descripción| +|---|-|-|-|-| +|Resultado|Boolean|<-|True if the folder was created successfully, false otherwise|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md index 5de5f9b51a03f4..8d35c58fc9fc51 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/IMAPTransporterClass.md @@ -1153,8 +1153,8 @@ Quiere recuperar los 20 correos electrónicos más recientes sin cambiar el esta |---------|--- |:---:|------| |msgNumber|Integer|-> |Sequence number of the message| |msgID|Text|-> |Unique ID of the message| -|updateSeen|Boolean|->|If True, the message is marked "seen" in the mailbox. If False the message is left untouched.| -|Result|BLOB|<-|Blob of the MIME string returned from the mail server| +|updateSeen|Boolean|->|If True, the message is marked "seen" in the mailbox. Si es False el mensaje se deja intacto.| +|Resultado|BLOB|<-|Blob of the MIME string returned from the mail server| diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md index 664eb18d407a99..cf6b00ee0e49f4 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/SessionClass.md @@ -161,7 +161,7 @@ $expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| |privilege|Text|<-|Name of the privilege to verify| |Result|Boolean|<-|True if session has *privilege*, False otherwise| @@ -244,9 +244,9 @@ End if
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if session is a Guest one, False otherwise| +|Resultado|Boolean|<-|True if session is a Guest one, False otherwise|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataClassClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataClassClass.md index 4f2d0a75ad6e8b..dbf6a97be9e7de 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataClassClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataClassClass.md @@ -530,9 +530,9 @@ Este ejemplo ilustra el uso de la propiedad *context*:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|---|---| -|result|Integer|<-|Number of entities in the dataclass| +|resultado|Integer|<-|Number of entities in the dataclass|
@@ -628,9 +628,9 @@ El método de proyecto ***SearchDuplicate*** busca valores duplicados en cualqui
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|---|---| -|Result|Object|<-|Information on the dataclass| +|Resultado|Object|<-|Information on the dataclass|
@@ -703,9 +703,9 @@ La función `.getInfo()` devuelve
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|---|---| -|result|Object|<-|Object describing the contents of the ORDA cache for the dataclass.| +|resultado|Object|<-|Object describing the contents of the ORDA cache for the dataclass.|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataStoreClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataStoreClass.md index 0abc8ee8aff56d..4424c9cfac2ce5 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataStoreClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/DataStoreClass.md @@ -737,9 +737,9 @@ Ver el ejemplo 2 de [`.startRequestLog()`](#startrequestlog).
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if the Data Explorer access is disabled, False if it is enabled (default)| +|Resultado|Boolean|<-|True if the Data Explorer access is disabled, False if it is enabled (default)|
@@ -773,9 +773,9 @@ Por defecto, el acceso al Explorador de Datos se concede para las sesiones `webA
-|Parameter|Type||Description| -|---|---|---|---| -|Result|Boolean|<-|True if locked| +|Parámetro|Tipo||Descripción| +|---|-|-|-|-| +|Resultado|Boolean|<-|True if locked|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntityClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntityClass.md index d44f9e8947cb8c..d393e4fbd714bf 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntityClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntityClass.md @@ -776,9 +776,9 @@ Si la entidad no pertenece a una selección de entidades, la función devuelve N
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Integer|<-|Stamp of the entity (0 if entity has just been created)| +|Resultado|Integer|<-|Stamp of the entity (0 if entity has just been created)|
@@ -874,9 +874,9 @@ El valor resultante se incluye entre 0 y la longitud de la selección de entidad
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if entity has just been created and not yet saved. Otherwise, False.| +|Resultado|Boolean|<-|True if entity has just been created and not yet saved. Otherwise, False.|
@@ -1661,9 +1661,9 @@ Ejemplo con el tipo `relatedEntity` con una forma simple:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if at least one entity attribute has been modified and not yet saved, else False| +|Resultado|Boolean|<-|True if at least one entity attribute has been modified and not yet saved, else False|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntitySelectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntitySelectionClass.md index 95aa037f0068d6..0c7042b8adb21f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntitySelectionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/EntitySelectionClass.md @@ -1235,9 +1235,9 @@ $info:=$persons.getRemoteContextAttributes()
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if the entity selection is alterable, False otherwise| +|Resultado|Boolean|<-|True if the entity selection is alterable, False otherwise|
@@ -1280,9 +1280,9 @@ Form.products.add(Form.product)
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if the entity selection is ordered, False otherwise| +|Resultado|Boolean|<-|True if the entity selection is ordered, False otherwise|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/FileClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/FileClass.md index 74a35400d4848e..40d14789fa854b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/FileClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/FileClass.md @@ -175,9 +175,9 @@ La función `4D.File.new()` crea y devuelve u
-|Parameter|Type||Description| -|---|---|---|---| -|Result|Boolean|<-|True if the file was created successfully, false otherwise| +|Parámetro|Tipo||Descripción| +|---|-|-|-|-| +|Resultado|Boolean|<-|True if the file was created successfully, false otherwise|
@@ -337,9 +337,9 @@ Desea eliminar un archivo específico en la carpeta de la base de datos:
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---|---|---|---| -|Result|Object|<-|Contents of .exe/.dll version resource or .plist file| +|Resultado|Object|<-|Contents of .exe/.dll version resource or .plist file|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/FolderClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/FolderClass.md index 2752aabce86cd9..f0fb87de0af929 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/FolderClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/FolderClass.md @@ -161,9 +161,9 @@ La función `4D.Folder.new()` crea y devuel
-|Parameter|Type||Description| -|---|---|---|---| -|Result|Boolean|<-|True if the folder was created successfully, false otherwise| +|Parámetro|Tipo||Descripción| +|---|-|-|-|-| +|Resultado|Boolean|<-|True if the folder was created successfully, false otherwise|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md index 7888648a75b22a..c5d2ea880047d1 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/IMAPTransporterClass.md @@ -1157,8 +1157,8 @@ Quiere recuperar los 20 correos electrónicos más recientes sin cambiar el esta |---------|--- |:---:|------| |msgNumber|Integer|-> |Sequence number of the message| |msgID|Text|-> |Unique ID of the message| -|updateSeen|Boolean|->|If True, the message is marked "seen" in the mailbox. If False the message is left untouched.| -|Result|BLOB|<-|Blob of the MIME string returned from the mail server| +|updateSeen|Boolean|->|If True, the message is marked "seen" in the mailbox. Si es False el mensaje se deja intacto.| +|Resultado|BLOB|<-|Blob of the MIME string returned from the mail server|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md index e1b1d5dbe5e6b2..4057e5946d5018 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/SessionClass.md @@ -177,7 +177,7 @@ $expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| |privilege|Text|<-|Name of the privilege to verify| |Result|Boolean|<-|True if session has *privilege*, False otherwise| @@ -264,9 +264,9 @@ End if
-|Parameter|Type||Description| +|Parámetro|Tipo||Descripción| |---------|--- |:---:|------| -|Result|Boolean|<-|True if session is a Guest one, False otherwise| +|Resultado|Boolean|<-|True if session is a Guest one, False otherwise|
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPAgentClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPAgentClass.md index 7fcc0d718aa86a..bf566ace05b62b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPAgentClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPAgentClass.md @@ -75,17 +75,17 @@ Las opciones de HTTPAgent se fusionarán con [opciones HTTPRequest](HTTPRequestC ::: -| Propiedad | Tipo | Por defecto | Descripción | -| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| certificatesFolder | Folder | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la carpeta activa de certificados de cliente para las solicitudes que utilizan el agente. Puede reemplazarse por "storeCertificateName" (ver abajo) | -| keepAlive | Boolean | true | Activa keep alive para el agente | -| maxSockets | Integer | 65535 | Número máximo de sockets por servidor | -| maxTotalSockets | Integer | 65535 | Número máximo de sockets para el agente | -| minTLSVersion | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la versión mínima de TLS para las solicitudes que utilizan este agente | -| protocol | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Protocolo usado para las peticiones utilizando el agente | -| storeCertificateName | Text | indefinido | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. If the certificate is not found, an error is returned. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | -| timeout | Real | indefinido | Si se define, tiempo después del cual se cierra un socket no utilizado | -| validateTLSCertificate | Boolean | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Validar el certificado Tls para las solicitudes que utilizan el agente | +| Propiedad | Tipo | Por defecto | Descripción | +| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| certificatesFolder | Folder | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la carpeta activa de certificados de cliente para las solicitudes que utilizan el agente. Puede reemplazarse por "storeCertificateName" (ver abajo) | +| keepAlive | Boolean | true | Activa keep alive para el agente | +| maxSockets | Integer | 65535 | Número máximo de sockets por servidor | +| maxTotalSockets | Integer | 65535 | Número máximo de sockets para el agente | +| minTLSVersion | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la versión mínima de TLS para las solicitudes que utilizan este agente | +| protocol | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Protocolo usado para las peticiones utilizando el agente | +| storeCertificateName | Text | indefinido | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. Si no se encuentra el certificado, se devuelve un error. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | +| timeout | Real | indefinido | Si se define, tiempo después del cual se cierra un socket no utilizado | +| validateTLSCertificate | Boolean | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Validar el certificado Tls para las solicitudes que utilizan el agente | :::note diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPRequestClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPRequestClass.md index 997c5460057775..165aa04afd1e54 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPRequestClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/HTTPRequestClass.md @@ -132,30 +132,30 @@ Por ejemplo, puede pasar las siguientes cadenas: En el parámetro *options*, pase un objeto que puede contener las siguientes propiedades: -| Propiedad | Tipo | Descripción | Por defecto | -| ---------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | -| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global | -| automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True | -| body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones `post` o `put`). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido | -| certificatesFolder | [Folder](FolderClass.md) | Define la carpeta de certificados de cliente activa. Puede reemplazarse por "storeCertificateName" (ver abajo). | indefinido | -| dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" | -| decodeData | Boolean | Si true, los datos recibidos en la retrollamada `onData` se descomprimen | False | -| encoding | Text | Se utiliza sólo en caso de peticiones con un `body` (métodos `post` o `put`). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" | -| headers | Object | Encabezados de la petición. Sintaxis: `headers.key=value` (*value* puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío | -| method | Text | "POST", "GET" u otro método | "GET" | -| minTLSVersion | Text | Define la versión mínima de TLS: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" | -| onData | [Function](FunctionClass.md) | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onError | [Function](FunctionClass.md) | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onHeaders | [Function](FunctionClass.md) | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onResponse | [Function](FunctionClass.md) | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onTerminate | [Function](FunctionClass.md) | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" | -| proxyAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del proxy de gestión de objetos | indefinido | -| returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el [objeto `response`](#response). Devuelve un error si es false y `onData` es undefined | True | -| serverAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del servidor de gestión de objetos | indefinido | -| storeCertificateName | Text | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. If the certificate is not found, an error is returned. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | indefinido | -| timeout | Real | Tiempo de espera en segundos. indefinido = sin tiempo de espera | indefinido | -| validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True | +| Propiedad | Tipo | Descripción | Por defecto | +| ---------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | +| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global | +| automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True | +| body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones `post` o `put`). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido | +| certificatesFolder | [Folder](FolderClass.md) | Define la carpeta de certificados de cliente activa. Puede reemplazarse por "storeCertificateName" (ver abajo). | indefinido | +| dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" | +| decodeData | Boolean | Si true, los datos recibidos en la retrollamada `onData` se descomprimen | False | +| encoding | Text | Se utiliza sólo en caso de peticiones con un `body` (métodos `post` o `put`). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" | +| headers | Object | Encabezados de la petición. Sintaxis: `headers.key=value` (*value* puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío | +| method | Text | "POST", "GET" u otro método | "GET" | +| minTLSVersion | Text | Define la versión mínima de TLS: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" | +| onData | [Function](FunctionClass.md) | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onError | [Function](FunctionClass.md) | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onHeaders | [Function](FunctionClass.md) | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onResponse | [Function](FunctionClass.md) | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onTerminate | [Function](FunctionClass.md) | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" | +| proxyAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del proxy de gestión de objetos | indefinido | +| returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el [objeto `response`](#response). Devuelve un error si es false y `onData` es undefined | True | +| serverAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del servidor de gestión de objetos | indefinido | +| storeCertificateName | Text | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. Si no se encuentra el certificado, se devuelve un error. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | indefinido | +| timeout | Real | Tiempo de espera en segundos. indefinido = sin tiempo de espera | indefinido | +| validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True | #### Función callback (retrollamada) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/IMAPTransporterClass.md index b21f4dd8eb317a..0e8fa4017f6428 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/API/IMAPTransporterClass.md @@ -1585,7 +1585,7 @@ searchCriteria = FLAGGED FROM "SMITH" searchCriteria = OR SEEN FLAGGED ``` -... returns all messages with \Seen flag set OR \Flagged flag set +... devuelve todos los mensajes con el marcador \Seen O \Flagged ``` searchCriteria = NOT SEEN diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Concepts/dt_date.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Concepts/dt_date.md index 6aefd6993d2115..6d34b557eb3d1f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Concepts/dt_date.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Concepts/dt_date.md @@ -52,7 +52,7 @@ Una fecha null es especificada por *!00-00-00!*. Como las fechas en JavaScript son objetos, se envían a 4D como texto que contiene su forma JSON como cualquier otro objeto. Este principio se aplica en particular cuando se utilizan [comandos JSON](../commands/theme/JSON.md) o [Áreas Web](../FormObjects/webArea_overview.md). -The JSON form of JavaScript Date objects follows the ISO 8601 standard, for example "2013-08-23T00:00:00Z". It is your responsibility to convert this text into a 4D date. Hay dos soluciones disponibles: +The JSON form of JavaScript Date objects follows the ISO 8601 standard, for example "2013-08-23T00:00:00Z". Es su responsabilidad convertir este texto en una fecha 4D. Hay dos soluciones disponibles: Utilizando el comando [`JSON Parse`](../commands-legacy/json-parse.md): diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Develop/async.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Develop/async.md index 8a87fda49db63d..0711e498222f12 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Develop/async.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/Develop/async.md @@ -14,7 +14,7 @@ Synchronous execution follows a **sequential** flow, a step-by-step where each i Synchronous execution is used when: - La ejecución de las tareas debe seguir un orden estricto. -- Performance impact is minimal (e.g., quick operations). +- El impacto en el rendimiento es mínimo (por ejemplo, operaciones rápidas). - Se ejecuta en un contexto de un solo hilo donde el bloqueo es aceptable. - La ejecución síncrona bloquea la interfaz de usuario y es más adecuada para tareas rápidas y ordenadas en las que el bloqueo es aceptable. @@ -43,7 +43,7 @@ Elegir entre ejecución síncrona y asíncrona: 4D ofrece capacidades integradas de **ejecución asíncrona** a través de varias clases y comandos. These allow background task execution, network communication, and large data processing, while waiting other operations to complete without blocking the current process. -The general concept of asynchronous event management in 4D is based on an asynchronous messaging model using **workers** (processes that listen to events) and **callbacks** (functions or formulas automatically invoked when an event occurs). Instead of waiting for a result (synchronous mode), you provide a function that will be automatically called when the desired event occurs. Callbacks can be passed as class functions (recommended) or Formula objects. +The general concept of asynchronous event management in 4D is based on an asynchronous messaging model using **workers** (processes that listen to events) and **callbacks** (functions or formulas automatically invoked when an event occurs). Instead of waiting for a result (synchronous mode), you provide a function that will be automatically called when the desired event occurs. Las retrollamadas se pueden pasar como funciones clase (recomendado) o como objetos Formula. This model is common to [`CALL WORKER`](../commands-legacy/call-worker.md), [`CALL FORM`](../commands-legacy/call-form.md), and [classes that support aynchronous execution](#asynchronous-programming-with-4d-classes). Todos estos comandos/clases inician una operación que se ejecuta en segundo plano. La sentencia que lanza la operación retorna inmediatamente, sin esperar a que la operación finalice. @@ -51,11 +51,11 @@ This model is common to [`CALL WORKER`](../commands-legacy/call-worker.md), [`CA Asynchronous programming relies on a system of [**workers**](../Develop/processes.md#worker-processes) (worker processes), which allows code to be executed in parallel without blocking the main process. This is particularly useful for long tasks (such as HTTP calls, executing external processes, background processing), while keeping the user interface responsive. -Using worker processes in asynchronous programming **is mandatory** since "classic" processes automatically terminate their execution when the process method ends, thus using callbacks is not possible. A worker process stays alive and can **listen to events**. +Using worker processes in asynchronous programming **is mandatory** since "classic" processes automatically terminate their execution when the process method ends, thus using callbacks is not possible. Un proceso worker permanece vivo y puede **escuchar eventos**. ### Event queue (mailbox) -Cada worker (o ventana de formulario para [`CALL FORM`](../commands-legacy/call-form.md)) tiene su propia cola de mensajes. [`CALL WORKER`](../commands-legacy/call-worker.md) or [`CALL FORM`](../commands-legacy/call-form.md) simply posts a message to this queue. El worker trata los mensajes uno a uno, en el orden en que llegan, dentro de su propio contexto. Process variables, current selections, etc. are preserved. +Cada worker (o ventana de formulario para [`CALL FORM`](../commands-legacy/call-form.md)) tiene su propia cola de mensajes. [`CALL WORKER`](../commands-legacy/call-worker.md) or [`CALL FORM`](../commands-legacy/call-form.md) simply posts a message to this queue. El worker trata los mensajes uno a uno, en el orden en que llegan, dentro de su propio contexto. Se conservan las variables de proceso, las selecciones actuales, etc. ### Comunicación bidireccional mediante mensajes @@ -115,7 +115,7 @@ Recomendamos la siguiente secuencia: 1. You create the user class where you declare callback functions, for example a `cs.Params` with `onError()` and `onResponse()` functions. 2. Instanciará la clase usuario (en nuestro ejemplo utilizando `cs.Params.new()`) que configurará su objeto asíncrono. -3. You call the constructor of the 4D class (for example `4D.SystemWorker.new()`) and pass the *options* object as parameter. It starts the operations passed immediately without delay. +3. You call the constructor of the 4D class (for example `4D.SystemWorker.new()`) and pass the *options* object as parameter. Inicia las operaciones pasadas inmediatamente sin demora. Here is a full example of implementation of an *options* object based upon a user class: diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/createStylesheet.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/createStylesheet.md index 5ac0a39a3e3144..b929315a0156fa 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/createStylesheet.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/createStylesheet.md @@ -206,7 +206,7 @@ text[text|=Hello] ### Consultas de medios -Media queries allow you to apply styles based on specific conditions. 4D supports media queries for **color schemes** and **platform themes**. +Las consultas de medios permiten aplicar estilos basados en condiciones específicas. 4D supports media queries for **color schemes** and **platform themes**. Una consulta de medios está formada por características y valores de medios (por ejemplo, `:`). diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/properties_JSONref.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/properties_JSONref.md index 1aa2956747babf..b61c7343982757 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/properties_JSONref.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormEditor/properties_JSONref.md @@ -22,7 +22,7 @@ Esta página ofrece una lista completa de todas las propiedades de los formulari | [`entryOrder`](formEditor.md#data-entry-order) | El orden en el cual los objetos activos son seleccionados cuando la tecla **Tab** o la tecla **Retorno de carro** se utilizan en un formulario de entrada | Colección de nombres de objetos 4D Form | | [`events`](Events/overview.md) | Lista de todos los eventos seleccionados para el objeto o el formulario | Colección de nombres de eventos, por ejemplo ["onClick", "onDataChange"...]. | | **f** | | | -| [`fluentUI`](properties_FormProperties.md#form-theme-on-windows) | Use fluent UI rendering theme for the form on Windows | true, false | +| [`fluentUI`](properties_FormProperties.md#form-theme-on-windows) | Utilizar un tema de renderizado de interfaz de usuario fluido para el formulario en Windows | true, false | | [`formSizeAnchor`](./properties_FormSize.md#size-based-on) | Nombre del objeto cuya posición determina el tamaño del formulario. (longitud mínima: 1) | Nombre de un objeto 4D | | **h** | | | | [`height`](properties_FormSize.md#height) | Altura del formulario | mínimo: 0 | diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormObjects/listbox_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormObjects/listbox_overview.md index 0367d456a74ebb..acdb611445fc20 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormObjects/listbox_overview.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/FormObjects/listbox_overview.md @@ -514,7 +514,7 @@ Este principio se aplica a los arrays internos que se pueden utilizar para gesti *Non-hierarchical representation:* ![](../assets/en/FormObjects/hierarch7.png) -*Hierarchical representation:* +*Representación jerárquica:* ![](../assets/en/FormObjects/hierarch8.png) > Si una o más líneas están ocultas porque sus padres están contraídos, ya no se seleccionan. Sólo se pueden seleccionar las líneas visibles (directamente o por desplazamiento). En otras palabras, las líneas no pueden estar ocultas y seleccionadas a la vez. diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/ORDA/entities.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/ORDA/entities.md index 2ecd2ae9fe9c7d..f4a37f969d1f0e 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/ORDA/entities.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/ORDA/entities.md @@ -435,7 +435,7 @@ $myInvoices:=$myParts.invoiceItems.invoice La última línea devolverá en *$myInvoices* una selección de entidades de todas las facturas que tengan al menos una partida de factura relacionada con una parte en la selección de entidades myParts. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades y no se devuelve ninguna entidad, el resultado es una selección de entidades vacía, no nula. -## Restricting entity selections {#restricting-entity-selections} +## Restringir la selección de entidades {#restricting-entity-selections} En ORDA, puede crear filtros para restringir el acceso a entidades de cualquiera de sus clases de datos. Una vez implementado, se aplica automáticamente un filtro siempre que se accede a las entidades de la dataclass, ya sea mediante **funciones de clase ORDA** como [`all()`](../API/DataClassClass.md#all) o [`query()`](../API/EntitySelectionClass.md#query), o por la [**API REST**](../category/api-dataclass) (que implica el [Explorador de datos](../Admin/dataExplorer.md) y [remote datastores](remoteDatastores.md)). diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md index 7fcc0d718aa86a..bf566ace05b62b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md @@ -75,17 +75,17 @@ Las opciones de HTTPAgent se fusionarán con [opciones HTTPRequest](HTTPRequestC ::: -| Propiedad | Tipo | Por defecto | Descripción | -| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| certificatesFolder | Folder | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la carpeta activa de certificados de cliente para las solicitudes que utilizan el agente. Puede reemplazarse por "storeCertificateName" (ver abajo) | -| keepAlive | Boolean | true | Activa keep alive para el agente | -| maxSockets | Integer | 65535 | Número máximo de sockets por servidor | -| maxTotalSockets | Integer | 65535 | Número máximo de sockets para el agente | -| minTLSVersion | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la versión mínima de TLS para las solicitudes que utilizan este agente | -| protocol | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Protocolo usado para las peticiones utilizando el agente | -| storeCertificateName | Text | indefinido | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. If the certificate is not found, an error is returned. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | -| timeout | Real | indefinido | Si se define, tiempo después del cual se cierra un socket no utilizado | -| validateTLSCertificate | Boolean | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Validar el certificado Tls para las solicitudes que utilizan el agente | +| Propiedad | Tipo | Por defecto | Descripción | +| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| certificatesFolder | Folder | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la carpeta activa de certificados de cliente para las solicitudes que utilizan el agente. Puede reemplazarse por "storeCertificateName" (ver abajo) | +| keepAlive | Boolean | true | Activa keep alive para el agente | +| maxSockets | Integer | 65535 | Número máximo de sockets por servidor | +| maxTotalSockets | Integer | 65535 | Número máximo de sockets para el agente | +| minTLSVersion | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la versión mínima de TLS para las solicitudes que utilizan este agente | +| protocol | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Protocolo usado para las peticiones utilizando el agente | +| storeCertificateName | Text | indefinido | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. Si no se encuentra el certificado, se devuelve un error. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | +| timeout | Real | indefinido | Si se define, tiempo después del cual se cierra un socket no utilizado | +| validateTLSCertificate | Boolean | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Validar el certificado Tls para las solicitudes que utilizan el agente | :::note diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md index 997c5460057775..165aa04afd1e54 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md @@ -132,30 +132,30 @@ Por ejemplo, puede pasar las siguientes cadenas: En el parámetro *options*, pase un objeto que puede contener las siguientes propiedades: -| Propiedad | Tipo | Descripción | Por defecto | -| ---------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | -| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global | -| automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True | -| body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones `post` o `put`). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido | -| certificatesFolder | [Folder](FolderClass.md) | Define la carpeta de certificados de cliente activa. Puede reemplazarse por "storeCertificateName" (ver abajo). | indefinido | -| dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" | -| decodeData | Boolean | Si true, los datos recibidos en la retrollamada `onData` se descomprimen | False | -| encoding | Text | Se utiliza sólo en caso de peticiones con un `body` (métodos `post` o `put`). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" | -| headers | Object | Encabezados de la petición. Sintaxis: `headers.key=value` (*value* puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío | -| method | Text | "POST", "GET" u otro método | "GET" | -| minTLSVersion | Text | Define la versión mínima de TLS: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" | -| onData | [Function](FunctionClass.md) | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onError | [Function](FunctionClass.md) | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onHeaders | [Function](FunctionClass.md) | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onResponse | [Function](FunctionClass.md) | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| onTerminate | [Function](FunctionClass.md) | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido | -| protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" | -| proxyAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del proxy de gestión de objetos | indefinido | -| returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el [objeto `response`](#response). Devuelve un error si es false y `onData` es undefined | True | -| serverAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del servidor de gestión de objetos | indefinido | -| storeCertificateName | Text | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. If the certificate is not found, an error is returned. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | indefinido | -| timeout | Real | Tiempo de espera en segundos. indefinido = sin tiempo de espera | indefinido | -| validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True | +| Propiedad | Tipo | Descripción | Por defecto | +| ---------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | +| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global | +| automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True | +| body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones `post` o `put`). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido | +| certificatesFolder | [Folder](FolderClass.md) | Define la carpeta de certificados de cliente activa. Puede reemplazarse por "storeCertificateName" (ver abajo). | indefinido | +| dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" | +| decodeData | Boolean | Si true, los datos recibidos en la retrollamada `onData` se descomprimen | False | +| encoding | Text | Se utiliza sólo en caso de peticiones con un `body` (métodos `post` o `put`). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" | +| headers | Object | Encabezados de la petición. Sintaxis: `headers.key=value` (*value* puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío | +| method | Text | "POST", "GET" u otro método | "GET" | +| minTLSVersion | Text | Define la versión mínima de TLS: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" | +| onData | [Function](FunctionClass.md) | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onError | [Function](FunctionClass.md) | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onHeaders | [Function](FunctionClass.md) | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onResponse | [Function](FunctionClass.md) | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| onTerminate | [Function](FunctionClass.md) | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido | +| protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" | +| proxyAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del proxy de gestión de objetos | indefinido | +| returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el [objeto `response`](#response). Devuelve un error si es false y `onData` es undefined | True | +| serverAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del servidor de gestión de objetos | indefinido | +| storeCertificateName | Text | (Windows only) Name of a certificate stored in the Certificate Store to use instead of one saved in the certificates folder. Si no se encuentra el certificado, se devuelve un error. Para más información, consulte [esta entrada de blog](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | indefinido | +| timeout | Real | Tiempo de espera en segundos. indefinido = sin tiempo de espera | indefinido | +| validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True | #### Función callback (retrollamada) diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md index 7f60a939196750..032fcf0ed02b11 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md @@ -1585,7 +1585,7 @@ searchCriteria = FLAGGED FROM "SMITH" searchCriteria = OR SEEN FLAGGED ``` -... returns all messages with \Seen flag set OR \Flagged flag set +... devuelve todos los mensajes con el marcador \Seen O \Flagged ``` searchCriteria = NOT SEEN diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_date.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_date.md index 6aefd6993d2115..6d34b557eb3d1f 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_date.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_date.md @@ -52,7 +52,7 @@ Una fecha null es especificada por *!00-00-00!*. Como las fechas en JavaScript son objetos, se envían a 4D como texto que contiene su forma JSON como cualquier otro objeto. Este principio se aplica en particular cuando se utilizan [comandos JSON](../commands/theme/JSON.md) o [Áreas Web](../FormObjects/webArea_overview.md). -The JSON form of JavaScript Date objects follows the ISO 8601 standard, for example "2013-08-23T00:00:00Z". It is your responsibility to convert this text into a 4D date. Hay dos soluciones disponibles: +The JSON form of JavaScript Date objects follows the ISO 8601 standard, for example "2013-08-23T00:00:00Z". Es su responsabilidad convertir este texto en una fecha 4D. Hay dos soluciones disponibles: Utilizando el comando [`JSON Parse`](../commands-legacy/json-parse.md): diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/async.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/async.md index 8a87fda49db63d..0711e498222f12 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/async.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/async.md @@ -14,7 +14,7 @@ Synchronous execution follows a **sequential** flow, a step-by-step where each i Synchronous execution is used when: - La ejecución de las tareas debe seguir un orden estricto. -- Performance impact is minimal (e.g., quick operations). +- El impacto en el rendimiento es mínimo (por ejemplo, operaciones rápidas). - Se ejecuta en un contexto de un solo hilo donde el bloqueo es aceptable. - La ejecución síncrona bloquea la interfaz de usuario y es más adecuada para tareas rápidas y ordenadas en las que el bloqueo es aceptable. @@ -43,7 +43,7 @@ Elegir entre ejecución síncrona y asíncrona: 4D ofrece capacidades integradas de **ejecución asíncrona** a través de varias clases y comandos. These allow background task execution, network communication, and large data processing, while waiting other operations to complete without blocking the current process. -The general concept of asynchronous event management in 4D is based on an asynchronous messaging model using **workers** (processes that listen to events) and **callbacks** (functions or formulas automatically invoked when an event occurs). Instead of waiting for a result (synchronous mode), you provide a function that will be automatically called when the desired event occurs. Callbacks can be passed as class functions (recommended) or Formula objects. +The general concept of asynchronous event management in 4D is based on an asynchronous messaging model using **workers** (processes that listen to events) and **callbacks** (functions or formulas automatically invoked when an event occurs). Instead of waiting for a result (synchronous mode), you provide a function that will be automatically called when the desired event occurs. Las retrollamadas se pueden pasar como funciones clase (recomendado) o como objetos Formula. This model is common to [`CALL WORKER`](../commands-legacy/call-worker.md), [`CALL FORM`](../commands-legacy/call-form.md), and [classes that support aynchronous execution](#asynchronous-programming-with-4d-classes). Todos estos comandos/clases inician una operación que se ejecuta en segundo plano. La sentencia que lanza la operación retorna inmediatamente, sin esperar a que la operación finalice. @@ -51,11 +51,11 @@ This model is common to [`CALL WORKER`](../commands-legacy/call-worker.md), [`CA Asynchronous programming relies on a system of [**workers**](../Develop/processes.md#worker-processes) (worker processes), which allows code to be executed in parallel without blocking the main process. This is particularly useful for long tasks (such as HTTP calls, executing external processes, background processing), while keeping the user interface responsive. -Using worker processes in asynchronous programming **is mandatory** since "classic" processes automatically terminate their execution when the process method ends, thus using callbacks is not possible. A worker process stays alive and can **listen to events**. +Using worker processes in asynchronous programming **is mandatory** since "classic" processes automatically terminate their execution when the process method ends, thus using callbacks is not possible. Un proceso worker permanece vivo y puede **escuchar eventos**. ### Event queue (mailbox) -Cada worker (o ventana de formulario para [`CALL FORM`](../commands-legacy/call-form.md)) tiene su propia cola de mensajes. [`CALL WORKER`](../commands-legacy/call-worker.md) or [`CALL FORM`](../commands-legacy/call-form.md) simply posts a message to this queue. El worker trata los mensajes uno a uno, en el orden en que llegan, dentro de su propio contexto. Process variables, current selections, etc. are preserved. +Cada worker (o ventana de formulario para [`CALL FORM`](../commands-legacy/call-form.md)) tiene su propia cola de mensajes. [`CALL WORKER`](../commands-legacy/call-worker.md) or [`CALL FORM`](../commands-legacy/call-form.md) simply posts a message to this queue. El worker trata los mensajes uno a uno, en el orden en que llegan, dentro de su propio contexto. Se conservan las variables de proceso, las selecciones actuales, etc. ### Comunicación bidireccional mediante mensajes @@ -115,7 +115,7 @@ Recomendamos la siguiente secuencia: 1. You create the user class where you declare callback functions, for example a `cs.Params` with `onError()` and `onResponse()` functions. 2. Instanciará la clase usuario (en nuestro ejemplo utilizando `cs.Params.new()`) que configurará su objeto asíncrono. -3. You call the constructor of the 4D class (for example `4D.SystemWorker.new()`) and pass the *options* object as parameter. It starts the operations passed immediately without delay. +3. You call the constructor of the 4D class (for example `4D.SystemWorker.new()`) and pass the *options* object as parameter. Inicia las operaciones pasadas inmediatamente sin demora. Here is a full example of implementation of an *options* object based upon a user class: diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md index 0367d456a74ebb..acdb611445fc20 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md @@ -514,7 +514,7 @@ Este principio se aplica a los arrays internos que se pueden utilizar para gesti *Non-hierarchical representation:* ![](../assets/en/FormObjects/hierarch7.png) -*Hierarchical representation:* +*Representación jerárquica:* ![](../assets/en/FormObjects/hierarch8.png) > Si una o más líneas están ocultas porque sus padres están contraídos, ya no se seleccionan. Sólo se pueden seleccionar las líneas visibles (directamente o por desplazamiento). En otras palabras, las líneas no pueden estar ocultas y seleccionadas a la vez. diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md index 2ecd2ae9fe9c7d..f4a37f969d1f0e 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md @@ -435,7 +435,7 @@ $myInvoices:=$myParts.invoiceItems.invoice La última línea devolverá en *$myInvoices* una selección de entidades de todas las facturas que tengan al menos una partida de factura relacionada con una parte en la selección de entidades myParts. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades y no se devuelve ninguna entidad, el resultado es una selección de entidades vacía, no nula. -## Restricting entity selections {#restricting-entity-selections} +## Restringir la selección de entidades {#restricting-entity-selections} En ORDA, puede crear filtros para restringir el acceso a entidades de cualquiera de sus clases de datos. Una vez implementado, se aplica automáticamente un filtro siempre que se accede a las entidades de la dataclass, ya sea mediante **funciones de clase ORDA** como [`all()`](../API/DataClassClass.md#all) o [`query()`](../API/EntitySelectionClass.md#query), o por la [**API REST**](../category/api-dataclass) (que implica el [Explorador de datos](../Admin/dataExplorer.md) y [remote datastores](remoteDatastores.md)). diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/classes.md b/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/classes.md index a3c63b907bfc65..4ba71bb4d526cc 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/classes.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/classes.md @@ -37,62 +37,7 @@ $person:=cs.Person.new("John";"Doe") $hello:=$person.sayHello() //"Hello John Doe" ``` -## Gestion des classes - -### Définition d'une classe - -Une classe utilisateur dans 4D est définie par un fichier [méthode](methods.md) (.4dm) spécifique, stocké dans le dossier `/Project/Sources/Classes/`. Le nom du fichier est le nom de la classe. - -Lorsque vous nommez des classes, gardez à l'esprit les règles suivantes : - -- Un [nom de classe](identifiers.md#classes) doit être conforme aux [règles de nommage des propriétés](identifiers.md#proprietes-des-objets). -- Les noms de classe sont sensibles à la casse. -- Il n'est pas recommandé de donner le même nom à une classe et à une table de base de données, afin d'éviter tout conflit. - -Par exemple, si vous souhaitez définir une classe nommée "Polygon", vous devez créer le fichier suivant : - -``` -Project folder Project Sources Classes Polygon.4dm -``` - -### Supprimer une classe - -Pour supprimer une classe existante, vous pouvez : - -- sur votre disque, supprimer le fichier de classe .4dm du dossier "Classes", -- dans l'explorateur 4D, sélectionner la classe et cliquez sur ![](../assets/en/Users/MinussNew.png) ou choisissez **Déplacer dans la corbeille** dans le menu contextuel. - -### Utilisation de l'interface 4D - -Les fichiers de classe sont automatiquement stockés à l'emplacement approprié lorsqu'ils sont créés via l'interface de 4D, soit via le menu **Fichier**, soit via l'Explorateur. - -#### Menu Fichier et barre d'outils - -Vous pouvez créer un nouveau fichier de classe pour le projet en sélectionnant **Nouveau> Classe...** dans le menu **Fichier** de 4D ou dans la barre d'outils. - -Vous pouvez également utiliser le raccourci **Ctrl+Maj+Alt+k**. - -#### Explorateur - -Dans la **page Méthodes** de l'Explorateur, les classes sont regroupées dans la catégorie **Classes**. - -Pour créer une nouvelle classe, vous pouvez : - -- sélectionner la catégorie **Classes** et cliquez sur le bouton ![](../assets/en/Users/PlussNew.png) . -- sélectionner **Nouvelle classe...** dans le menu d'actions en bas de la fenêtre de l'Explorateur ou dans le menu contextuel du groupe Classes. - ![](../assets/en/Concepts/newClass.png) -- sélectionnez **Nouveau> Classe...** dans le menu contextuel de la page d'accueil de l'Explorateur. - -#### Prise en charge du code de classe - -Dans les différentes fenêtres 4D (éditeur de code, compilateur, débogueur, explorateur d'exécution), le code de classe est essentiellement géré comme une méthode projet avec quelques spécificités : - -- Dans l'éditeur de code : - - une classe ne peut pas être exécutée - - une fonction de classe est un bloc de code - - **Aller à définition...** sur un objet membre permet de rechercher des déclarations de fonction de classe; par exemple, "$o.f()" donnera comme résultat de recherche "Function f". - - **Chercher les références...** sur la déclaration de fonction de classe recherche la fonction utilisée comme membre d'objet; par exemple, "Function f" donnera comme résultat "$o.f()". -- Dans l'explorateur d'exécution et le débogueur, les fonctions de classe sont affichées avec le constructeur `` ou le format `.`. +Les fichiers de classe sont gérés via l'Explorateur 4D (voir [Créer des classes](../Project/code-overview.md#creating-classes)). ## Class stores diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/methods.md b/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/methods.md index 170e88ebe73f91..8f3d2a4f5adf54 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/methods.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/methods.md @@ -13,277 +13,13 @@ La taille maximale d'une méthode est limitée à 2 Go de texte ou à 32 000 lig Dans le langage 4D, il existe plusieurs catégories de méthodes. La catégorie dépend de la façon dont on peut les appeler : -| Type | Contexte d'appel | Accepte des paramètres | Description | -| --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Méthode projet** | À la demande, lorsque le nom de la méthode projet est appelé (voir [Appel de méthodes de projet](#calling-project-methods)) | Oui | Peut contenir du code pour exécuter des actions personnalisées. Une fois que votre méthode projet est créée, elle devient partie intégrante du langage du projet. | -| **Méthode objet (widget)** | Automatique, lorsqu'un événement implique l'objet auquel la méthode est associée | Non | Propriété d'un objet formulaire (également appelé widget) | -| **Méthode formulaire** | Automatique, lorsqu'un événement implique le formulaire auquel la méthode est associée | Non | Propriété d'un formulaire. Vous pouvez utiliser une méthode formulaire pour gérer les données et les objets, mais il est généralement plus simple et plus efficace d'utiliser une méthode objet dans ces cas de figure. | -| **Trigger** (ou *méthode table*) | Automatique, chaque fois que vous manipulez les enregistrements d'une table (Ajouter, Supprimer, Modifier) | Non | Propriété d'une table. Les triggers sont des méthodes qui permettent d'éviter les opérations "illégales" sur les enregistrements de votre base de données. | -| **Méthode base** | Automatique, lorsqu'un événement se produit sur la session de travail | Oui (prédéfini) | Il existe 16 méthodes base dans 4D. | -| **Type** | [**Les fonctions de classes**](classes.md#function) sont appelées dans le contexte d'une instance d'objet | oui | Les fonctions de classes peuvent être intégrées au langage 4D (par exemple `collection.orderBy()` ou `entity.save()`), ou créées par le développeur 4D. Voir [**Classes**](classes.md) | +| Type | Contexte d'appel | Accepte des paramètres | Description | +| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Méthode projet** | À la demande, lorsque le nom de la méthode projet est appelé (voir [Appel de méthodes de projet](#calling-project-methods)) | Oui | Peut contenir du code pour exécuter des actions personnalisées. Une fois que votre méthode projet est créée, elle devient partie intégrante du langage du projet. | +| **Méthode objet (widget)** | Automatique, lorsqu'un événement implique l'objet auquel la méthode est associée | Non | Propriété d'un objet formulaire (également appelé widget) | +| **Méthode formulaire** | Automatique, lorsqu'un événement implique le formulaire auquel la méthode est associée | Non | Propriété d'un formulaire. Vous pouvez utiliser une méthode formulaire pour gérer les données et les objets, mais il est généralement plus simple et plus efficace d'utiliser une méthode objet dans ces cas de figure. | +| **Trigger** (ou *méthode table*) | Automatique, chaque fois que vous manipulez les enregistrements d'une table (Ajouter, Supprimer, Modifier) | Non | Propriété d'une table. Les triggers sont des méthodes qui permettent d'éviter les opérations "illégales" sur les enregistrements de votre base de données. | +| **Méthode base** | Automatique, lorsqu'un événement se produit sur la session de travail | Oui (prédéfini) | Il existe 16 méthodes base dans 4D. | +| **Type** | Appelée automatiquement lorsqu'un objet de la classe est instancié ou lorsqu'une fonction de la classe est exécutée sur une instance d'objet dans toute autre méthode ou dans un [champ de la base de données](../Develop/field-properties.md#class). | oui (fonctions de classe) | Une **Classe** est utilisée pour déclarer et configurer le class [constructor](./classes.md#class-constructor), les [propriétés](./classes.md#property*) et [fonctions](./classes.md#function) des objets. Voir [**Classes**](classes.md) | -## Méthodes projet - -Une méthode projet peut tenir les rôles suivants, en fonction de la manière dont elle est exécutée et utilisée : - -- Sous-routine -- Objet formule -- Méthode de menu -- Méthode de gestion de process -- Méthode de gestion d’événements et d'erreurs - -Vous pouvez également exécuter les méthodes projet manuellement, à des fins de test par exemple. - -### Sous-routines - -Une sous-routine est une méthode projet qui peut être considérée comme une méthode asservie. D’autres méthodes lui demandent d’effectuer des tâches. Une sous-routine qui retourne une valeur est appelée une fonction. - -Lorsque vous créez une méthode projet, elle devient partie intégrante du langage du projet dans lequel elle a été créée. Vous pouvez procéder de la manière suivante : Vous pouvez procéder de la manière suivante : Vous pouvez procéder de la manière suivante : de la même manière que vous appelez les commandes intégrées de 4D. Une méthode projet utilisée de cette manière est appelée une sous-routine. - -L'utilisation de sous-routines procure les avantages suivants : - -- Réduction du code répétitif, -- Clarification des méthodes, -- Modification plus facile des méthodes, -- Création de code modulaire - -Imaginons par exemple que vous travaillez sur un projet de clients. A mesure que vous construisez le projet, vous vous apercevez que vous répétez souvent certaines tâches, telles que la recherche d’un client et la modification de son enregistrement. Le code nécessaire à l’accomplissement de cette opération pourrait être : - -```4d - // Recherche d'un client - QUERY BY EXAMPLE([Clients]) - // Sélection du formulaire entrée - FORM SET INPUT([Clients];"Saisie de données") - // Modification de l'enregistrement du client - MODIFY RECORD([Clients]) -``` - -Si vous n’utilisez pas de sous-routines, vous devrez écrire ce code à chaque fois que vous voudrez modifier l’enregistrement d’un client. Si cette opération est réalisée dans dix endroits différents de votre projet, vous devrez la réécrire dix fois. Grâce aux sous-routines, vous ne l’écrirez qu’une seule fois en tout. C’est le premier avantage des sous-routines : réduire la quantité de code à écrire. - -Si le code ci-dessus était une méthode projet appelée `MODIFY_CUSTOMER`, vous l’exécuteriez simplement en inscrivant son nom dans une autre méthode. Par exemple, pour modifier l’enregistrement d’un client puis l’imprimer, vous n’auriez qu’à écrire : - -```4d - MODIFY_CUSTOMER - PRINT SELECTION([Customers]) -``` - -Cette possibilité simplifie énormément vos méthodes. Dans l’exemple ci-dessus, il n’est pas nécessaire de savoir comment fonctionne la méthode `MODIFY_CUSTOMER`, mais uniquement ce qu’elle fait. C’est le deuxième avantage que vous pouvez tirer de l’utilisation de sous-routines : la clarification de votre code. Ainsi, ces méthodes deviennent en quelque sorte des extensions du langage de 4D. - -Si vous devez modifier votre mode de recherche des clients, comme dans notre exemple, il vous suffit de modifier une seule méthode, et non dix. C’est un autre avantage des sous-routines : faciliter les modifications de votre code. - -Avec les sous-routines, vous rendez votre code modulaire. Cela signifie simplement que vous dissociez votre code en modules (sous-routines), chacun d’entre eux effectuant une tâche logique. Examinez le code suivant, tiré d’un projet de gestion de compte courant : - -```4d - FIND_CLEARED _CHECKS // Rechercher les chèques émis - RECONCILE_ACCOUNT // Rapprocher le compte -PRINT_CHECK_BOOK_REPORT // Imprimer un relevé -``` - -Même pour quelqu’un qui ne connaît pas le projet, le code est clair. Il n’est pas nécessaire d’examiner chaque sous-routine. Elles peuvent contenir de nombreuses lignes d’instructions et effectuer des opérations complexes, mais l’important est ce qu’elles font. Nous vous conseillons de découper votre code en tâches logiques, ou modules, à chaque fois que c’est possible. - -### Objet formule - -Vous pouvez encapsuler vos méthodes projets dans les objets **formule** et les appeler à partir de vos objets. - -Les commandes `Formula` ou `Formula from string` vous permettent de créer des objets formule natifs que vous pouvez encapsuler dans des propriétés d'objets. Vous pouvez ainsi implémenter des méthodes d'objets personnalisées. - -Pour exécuter une méthode stockée dans une propriété d'objet, utilisez l'opérateur **()** après le nom de la propriété. Par exemple : - -```4d -//myAlert -ALERT("Hello world!") -``` - -`myAlert` peut ensuite être encapsulé dans n'importe quel objet et peut être appelé : - -```4d -var $o : Object -$o:=New object("custom_Alert";Formula(myAlert)) -$o.custom_Alert() //affiche "Hello world!" -``` - -La syntaxe avec des crochets est également prise en charge : - -```4d -$o["custom_Alert"]() //affiche "Hello world!" -``` - -Vous pouvez également [passer des paramètres](Concepts/parameters.md) à votre formule lorsque vous l'appelez en utilisant $1, $2… tout comme avec les méthodes de projet 4D: - -```4d -//méthode fullName -C_TEXT($0;$1;$2) -$0:=$1+" "+$2 -``` - -Vous pouvez encapsuler `fullName` dans un objet : - -```4d -var $o : Object -$o:=New object("full_name";Formula(fullName)) -$result:=$o.full_name("John";"Smith") -//$result = "John Smith" -//équivalent à $result:=fullName("param1";"param2") -``` - -Lorsqu'elles sont associées à la fonction `This`, ces méthodes objet vous permettent d'écrire du code générique très puissant. Par exemple : - -```4d -//méthode fullName2 -C_TEXT($0) -$0:=This.firstName+" "+This.lastName -``` - -La méthode agit ensuite comme un nouvel attribut calculé qui peut être ajoutée aux autres attributs : - -```4d -var $o : Object -$o:=New object("firstName";"Jim";"lastName";"Wesson") -$o.fullName:=Formula(fullName2) //ajout de la méthode - -$result:=$o.fullName() -//$result = "Jim Wesson" -``` - -Notez que, même si elle n'a pas de paramètres, une méthode objet à exécuter doit être appelée avec les parenthèses `()`. Appeler uniquement la propriété retournera une nouvelle référence à la formule (elle ne sera pas exécutée) : - -```4d -$o:=$f.message //retourne l'objet formule en $o -``` - -### Méthodes de menu - -Une méthode de menu est appelée lorsque la commande de menu personnalisé à laquelle elle est associée est sélectionnée. Vous assignez la méthode à la commande de menu dans l’éditeur de menus de 4D. Lorsque l’utilisateur sélectionne la commande de menu, la méthode est exécutée. En créant des menus personnalisés qui appellent des méthodes de menu qui exécutent des actions spécifiques, vous créez des interfaces personnalisées pour vos applications de bureau. - -Les commandes de menus personnalisés peuvent déclencher une ou plusieurs actions. Par exemple, une commande de menu de saisie d’enregistrements peut appeler une méthode effectuant deux actions : afficher le formulaire entrée approprié et appeler la commande `AJOUTER ENREGISTREMENT` jusqu’à ce que l’utilisateur annule la saisie de nouve - -L’automatisation de séquences d’actions est une possibilité très puissante du langage de programmation de 4D. A l’aide des menus personnalisés, vous pouvez automatiser des séquences de tâches, vous permettez aux utilisateurs de naviguer plus facilement dans votre application. - -### Méthodes de gestion de process - -Une **méthode process** est une méthode projet appelée lorsqu’un process est démarré. Le process existera tant que la méthode sera en cours d'exécution. Le process existera tant que la méthode sera en cours d'exécution. - -### Méthodes de gestion d’événements et d'erreurs - -Une **méthode de gestion d’événements** est une méthode dédiée à la gestion des événements, qui s'exécute dans un process différent de celui de la méthode de gestion des process. Généralement, pour la gestion des événements, vous pouvez laisser 4D faire le gros du travail. Par exemple, lors de la saisie de données, 4D détecte les clics souris et les touches enfoncées, puis appelle les méthodes objet et formulaire correspondantes, vous permettant ainsi de prévoir dans ces méthodes les traitements appropriés aux événements. Pour plus d'informations, reportez-vous à la description de la commande `APPELER SUR EVENEMENT`. - -Une **méthode de gestion d’erreurs** est une méthode projet d'interruption. Elle est appelée à chaque fois qu'une erreur ou une exception se produit. Pour plus d'informations, consultez la section [Gestion des erreurs](error-handling.md). - -### Execution mode - -Les méthodes projet écrites dans votre application sont généralement appelées automatiquement lors de l'utilisation de l'application par des commandes de menu, des boutons, d'autres méthodes, etc. Quant aux méthodes base, elles sont exécutées en fonction d'événements spécifiques qui se produisent dans l'application. - -Toutefois, à des fins de test et de débogage, 4D vous permet d'exécuter manuellement des méthodes projet et certaines méthodes base en mode Développement. Dans ce cas, il est possible d'exécuter la méthode dans un nouveau process et/ou directement en mode Debug, afin de vérifier son exécution pas à pas. - -Vous pouvez exécuter les méthodes de deux manières : - -- Dans la fenêtre de l'éditeur de code, -- Dans la boîte de dialogue Exécuter la méthode (méthodes projet). - -#### Depuis l'éditeur de code - -Chaque fenêtre de l'[**Éditeur de code**](../code-editor/write-class-method.md) dispose d'un bouton qui peut être utilisé pour exécuter la méthode courante. A l'aide du menu associé à ce bouton, vous pouvez choisir le type d'exécution souhaité. - -Ce bouton est uniquement actif pour les méthodes projet et pour les méthodes base suivantes : - -- On Startup -- On Exit -- On Server Startup -- On Server Shutdown - -Pour plus d'informations, voir [Barre d'outils](../code-editor/write-class-method.md#toolbar). - -#### Dans la boîte de dialogue Exécuter la méthode - -Lorsque vous sélectionnez la commande **Méthode...** du menu **Exécution**, la boîte de dialogue **Méthode** s'affiche. - -Cette boîte de dialogue répertorie toutes les méthodes projet de la base, y compris les méthodes projet partagées des composants. En revanche, les méthodes projet qui ont été déclarées invisibles n'apparaîtront pas. - -Pour exécuter une méthode de projet, il suffit de sélectionner son nom dans la liste et de cliquer sur **Exécuter**. Pour exécuter une méthode étape par étape en mode Debug, cliquez sur **Debug**. Pour plus d'informations sur le débogueur 4D, reportez-vous à la section [Debugging](../Debugging/basics.md) . - -Si vous cochez la case **Nouveau Process** , la méthode que vous avez sélectionnée s'exécute dans un autre process. Si la méthode effectue une tâche qui prend du temps, comme l'impression d'un grand nombre d'enregistrements, vous pouvez continuer à travailler avec votre base, en ajoutant des enregistrements à une table, en créant un graphe pour afficher les données, etc. Pour plus d'informations sur les process, voir [Process](../Develop/processes.md). - -**Notes 4D Server**: - -- Si vous souhaitez que la méthode soit exécutée sur la machine serveur plutôt que sur la machine cliente, sélectionnez l'option **Sur 4D Server** dans le menu Exécuter : Dans ce cas, un nouveau process, appelé *procédure stockée*, est créé sur la machine serveur afin d'exécuter la méthode. Dans ce cas, un nouveau process, appelé *procédure stockée*, est créé sur la machine serveur afin d'exécuter la méthode. Cette option peut être utilisée pour réduire le trafic réseau et optimiser le fonctionnement de 4D Server, en particulier pour les méthodes qui appellent des données stockées sur le disque. Tous les types de méthodes peuvent être exécutés sur la machine serveur ou sur une autre machine cliente, à l'exception de celles qui modifient l'interface utilisateur. Dans ce cas, les procédures stockées sont inefficaces. -- Vous pouvez également choisir d'exécuter la méthode sur un autre poste client. Les autres postes clients n'apparaîtront pas dans le menu, sauf s'ils ont été préalablement "enregistrés" (pour plus d'informations, se référer à la description de [REGISTER CLIENT](../commands/register-client). - -Par défaut, l'option **En local** est sélectionnée. Avec la version mono-utilisateur de 4D, c'est la seule option disponible. - -## Méthode projet récursives - -Des méthodes projet peuvent s'appeler les unes les autres. Par exemple : - -- Une méthode A peut appeler une méthode B, qui appelle A, donc A appelle B de nouveau, etc. -- Une méthode peut s'appeler elle-même. - -Cela s'appelle la récursivité. Le langage de 4D supporte pleinement la récursivité. - -Examinons l'exemple suivant : Examinons l'exemple suivant : Examinons l'exemple suivant : Examinons l'exemple suivant : Supposons que vous disposiez d'une table `[Friends and Relatives]` composée de cet ensemble de champs extrêmement simplifié : - -- `[Amis et parents]Nom` -- `[Amis et parents]Enfant'Nom` - -Pour cet exemple, nous supposons que les valeurs des champs sont uniques (il n'existe pas deux personnes avec le même nom). A partir d'un nom, vous voulez écrire la phrase “Un de mes amis, Pierre, qui est le rejeton de Paul qui est le rejeton de Martine qui est le rejeton de Robert qui est le rejeton de Gertrude, fait cela pour gagner sa vie !” : - -1. Vous pouvez procéder de la manière suivante : - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - $vtTheWholeStory:="A friend of mine, "+$vsName - Repeat - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) - $vlQueryResult:=Records in selection([Friends and Relatives]) - If($vlQueryResult>0) - $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name - $vsName:=[Friends and Relatives]Name - End if - Until($vlQueryResult=0) - $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" - ALERT($vtTheWholeStory) - End if - End if -``` - -2. Vous pouvez également procéder ainsi : - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") - End if - End if -``` - -en utilisant la fonction récursive `Genealogy of` suivante : - -```4d - ` Genealogy of project method - ` Genealogy of ( String ) -> Text - ` Genealogy of ( Name ) -> Part of sentence - - $0:=$1 - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$1) - If(Records in selection([Friends and Relatives])>0) - $0:=$0+" who is the child of "+Genealogy of([Friends and Relatives]Name) - End if -``` - -Vous notez que la méthode `Genealogy of` s'appelle elle-même. - -La première manière de procéder utilise un **algorithme itératif**. La seconde manière utilise un **algorithme récursif**. - -Lorsque vous implémentez du code pour traiter des cas comme celui décrit ci-dessus, vous aurez toujours le choix entre écrire des méthodes utilisant des algorithmes itératifs ou récursifs. Typiquement, la récursivité fournit un code plus concis, plus facile à lire et à maintenir, mais elle est facultative. - -Dans 4D, la récursivité est typiquement utilisée pour : - -- Traiter les enregistrements de tables liées les unes aux autres de la même manière que décrit dans l'exemple ci-dessus. -- Naviguer parmi les documents et les dossiers de votre disque à l'aide des commandes `LISTE DES DOSSIERS` et `LISTE DES DOCUMENTS`. Un dossier peut contenir des dossiers et des documents, les sous-dossiers peuvent eux-mêmes contenir des dossiers et des documents, etc. - -**Important :** Les appels récursifs doivent toujours se terminer à un moment donné. Dans l'exemple ci-dessus, la méthode `Généalogie de` cesse de s'appeler elle-même lorsque la recherche ne trouve plus d'enregistrement. Sans ce test conditionnel, la méthode s'appellerait indéfiniment et 4D pourrait au bout d'un certain temps retourner l'erreur “La pile est pleine” car le programme n'aurait plus assez de place pour "empiler" les appels (ainsi que les paramètres et les variables locales utilisés dans la méthode). diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/quick-tour.md b/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/quick-tour.md index fc940d98e81aaa..0301c953195ce1 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/quick-tour.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Concepts/quick-tour.md @@ -428,7 +428,7 @@ Dans l'exemple suivant, le caractère **retour chariot** (séquence d'échappeme Les conventions suivantes sont utilisées dans la documentation du langage 4D : -- les caractères `{ }` (accolades) indiquent des paramètres facultatifs. For example, `.delete({ option : Integer })` means that the *option* parameter may be omitted when calling the function. +- les caractères `{ }` (accolades) indiquent des paramètres facultatifs. Par exemple, `.delete({ option : Integer })` signifie que le paramètre *option* peut être omis lors de l'appel de la fonction. - le mot-clé `any` est utilisé pour les paramètres qui peuvent être de n'importe quel type (nombre, texte, booléen, date, heure, objet, collection...). -- the `*...param* : Type` notation indicates from 0 to an unlimited number of parameters of the same type. Par exemple, `.concat( value : any { ;...valueN : any } ) : Collection` signifie qu'un nombre illimité de valeurs de n'importe quel type peut être passé à la fonction. +- la notation `*...param* : Type` indique de 0 à un nombre illimité de paramètres du même type. Par exemple, `.concat( value : any { ;...valueN : any } ) : Collection` signifie qu'un nombre illimité de valeurs de n'importe quel type peut être passé à la fonction. - la notation `...(*param* : Type ; *param2* : Type)` indique de 1 à un nombre illimité de groupes de paramètres. Par exemple, `COLLECTION TO ARRAY ( collection : Collection ; array : Array { ; propertyName : Text}{ ; ...(array : Array ; propertyName : Text) } )` signifie qu'un nombre illimité de couples de valeurs de type tableau/texte peut être passé à la commande. diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/building.md b/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/building.md index 336de551a28597..87987e8770a867 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/building.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/building.md @@ -559,7 +559,7 @@ Sélectionnez cette option pour créer une application prête à l'emploi (auton Lorsque vous sélectionnez cette option, une liste de licences s'affiche dans l'onglet. Vous devez désigner les fichiers qui contiennent vos licences. Ces fichiers ont été générés ou mis à jour lors de l'achat de la licence *4D Developer Professional* et des licences de déploiement. Votre licence *4D Developer Professional* courante est automatiquement associée à chaque licence de déploiement à utiliser dans l'application créée. Vous pouvez ajouter un autre numéro de 4D Developer Professional et ses licences associées. -Pour ajouter ou supprimer des licences, utilisez les boutons **[+]** et **[-]** situés en bas de la fenêtre. Lorsque vous cliquez sur le bouton \[+], une boîte de dialogue d’ouverture de document apparaît, affichant par défaut le contenu du dossier *[Licenses]* de votre poste. For more information about the location of this folder, refer to the [Get 4D folder](../commands/get-4d-folder) command. +Pour ajouter ou supprimer des licences, utilisez les boutons **[+]** et **[-]** situés en bas de la fenêtre. Lorsque vous cliquez sur le bouton \[+], une boîte de dialogue d’ouverture de document apparaît, affichant par défaut le contenu du dossier *[Licenses]* de votre poste. Pour plus d'informations sur l'emplacement de ce dossier, reportez-vous à la commande [Get 4D folder](../commands/get-4d-folder). Une fois que vous avez sélectionné un fichier, la liste indique les caractéristiques de la licence qu’il contient. diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/sessions.md b/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/sessions.md index bc11e924b2b6d1..4f537c3b7ee258 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/sessions.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Desktop/sessions.md @@ -5,11 +5,11 @@ title: Sessions Desktop ## Vue d’ensemble -A desktop session is a user-related execution context on 4D Server, 4D remote, or 4D single-user that **does not result from any web or REST access**. +Une session desktop est un contexte d'exécution lié à l'utilisateur sur 4D Server, 4D remote ou 4D single-user qui **ne résulte pas d'un accès web ou REST**. Les sessions desktop comprennent : -- **Remote user sessions**: In client/server applications, remote users have their own sessions, managed from the client and from the server. +- **Sessions utilisateurs distants** : Dans les applications client/serveur, les utilisateurs distants ont leurs propres sessions, gérées à partir du client et du serveur. - les **Sessions des procédures stockées** : Dans les applications client/serveur, la session utilisateur virtuelle unique qui gère toutes les procédures stockées exécutées sur le serveur. - les **Sessions autonomes**: Objet de session locale retourné dans une application mono-utilisateur (utile dans les phases de développement et de test des applications client/serveur). @@ -19,80 +19,80 @@ Le diagramme suivant montre les différents types de sessions et leur interactio Tout comme dans une [**session utilisateur web**](../WebServer/sessions.md), le code exécuté dans une session desktop a accès à un objet [`Session`](../API/SessionClass.md) qui fournit des fonctions et des propriétés permettant de stocker les valeurs de session et de les partager entre les process utilisateur, par exemple en utilisant l'objet [`session.storage`](../API/SessionClass.md#storage). -Toutefois, à la différence du code exécuté dans les sessions utilisateurs Web, le code exécuté dans les sessions desktop n'est pas soumis aux règles des [rôles et privilèges](../ORDA/privileges.md). It can access any parts of the 4D application, including ORDA and data model classes (on 4D Server, [users and groups feature](../Users/handling_users_groups.md) can manage user accesses). Note also that desktop sessions do not require [scalable sessions](../WebServer/sessions.md#enabling-web-sessions) to be enabled. +Toutefois, à la différence du code exécuté dans les sessions utilisateurs Web, le code exécuté dans les sessions desktop n'est pas soumis aux règles des [rôles et privilèges](../ORDA/privileges.md). Il peut accéder à toutes les parties de l'application 4D, y compris ORDA et les classes du modèle de données (sur le serveur 4D, la fonctionnalité [utilisateurs et groupes](../Users/handling_users_groups.md) peut gérer les accès des utilisateurs). Notez également que les sessions desktop ne nécessitent pas l'activation des [sessions évolutives](../WebServer/sessions.md#enabling-web-sessions). -You can nevertheless [**share** a remote session with a web session](#sharing-a-remote-session-for-web-accesses) so that desktop application users can access your 4D application through a web interface, using in particular **Qodly pages** and Web areas. +Vous pouvez néanmoins [**partager** une session utilisateur distant avec une session web](#sharing-a-remote-session-for-web-accesses) afin que les utilisateurs de l'application desktop puissent accéder à votre application 4D par le biais d'une interface web, en utilisant notamment les **pages Qodly** et les zones Web. ## Sessions utilisateurs distants {#remote-user-sessions} -In client/server applications, when a user connects to the server, a **remote user session object** is created and available on both the server and the client. It is returned by the [`Session`](../commands/session) command on both machines. +Dans les applications client/serveur, lorsqu'un utilisateur se connecte au serveur, un **objet de session utilisateur à distance** est créé et disponible à la fois sur le serveur et sur le client. Il est renvoyé par la commande [`Session`](../commands/session) sur les deux machines. Cet objet est géré via les fonctions et les propriétés de la classe [`Session`](../API/SessionClass.md). -### Comparing server-side and client-side user session objects {#comparing-server-side-and-client-side-user-session-objects} +### Comparaison des objets de session utilisateur côté serveur et côté client {#comparing-server-side-and-client-side-user-session-objects} -Depending on where the code is executed, a server-side or a client-side user `session` object is available. Both objects are similar, except that: +Selon l'endroit où le code est exécuté, un objet utilisateur `session` côté serveur ou un objet utilisateur `session` côté client est disponible. Les deux objets sont similaires, à l'exception de ce qui suit : -- their [`.storage`](../API/SessionClass.md#storage) properties are not the same object. A value stored in the `.storage` of the user session on the server will not be available in the `.storage` of the user session on the client and conversely. -- for security reasons, the client-side session cannot execute functions that **modify** [privileges](../ORDA/privileges.md) ([`setPrivileges()`](../API/SessionClass.md#setprivileges), [`clearPrivileges()`](../API/SessionClass.md#clearprivileges), [`promote()`](../API/SessionClass.md#promote), [`demote()`](../API/SessionClass.md#demote), [`restore()`](../API/SessionClass.md#restore)). Calling these functions on a client generates an error. +- leurs propriétés [`.storage`](../API/SessionClass.md#storage) ne sont pas le même objet. Une valeur stockée dans le `.storage` de la session utilisateur sur le serveur ne sera pas disponible dans le `.storage` de la session utilisateur sur le client et inversement. +- pour des raisons de sécurité, la session côté client ne peut pas exécuter de fonctions qui **modifient** [les privilèges](../ORDA/privileges.md) ([`setPrivileges()`](../API/SessionClass.md#setprivileges), [`clearPrivileges()`](../API/SessionClass.md#clearprivileges), [`promote()`](../API/SessionClass.md#promote), [`demote()`](../API/SessionClass.md#demote), [`restore()`](../API/SessionClass.md#restore)). L'appel de ces fonctions sur un client génère une erreur. :::note -Functions that read privileges can be called on both client and server sides ([`getPrivileges()`](../API/SessionClass.md#getprivileges), [`hasPrivilege()`](../API/SessionClass.md#hasprivilege), [`isGuest()`](../API/SessionClass.md#isguest)) +Les fonctions qui lisent les privilèges peuvent être appelées à la fois côté client et côté serveur ([`getPrivileges()`](../API/SessionClass.md#getprivileges), [`hasPrivilege()`](../API/SessionClass.md#hasprivilege), [`isGuest()`](../API/SessionClass.md#isguest)). ::: ### Utilisation -You use the remote user `session` object to manage and share session data. +Vous utilisez l'objet `session` de l'utilisateur distant pour gérer et partager les données de la session. -Within each environment, a [session `storage`](../API/SessionClass.md#storage) object is shared across all processes of the same user session. For example on the server, you can launch a user authentication and verification procedure when a client connects to the server, involving entering a code sent by e-mail or SMS into the application. Ensuite, vous ajoutez les informations de l'utilisateur au storage de session, ce qui permet au serveur d'identifier l'utilisateur. De cette façon, le serveur 4D peut accéder aux informations de l'utilisateur pour tous les process clients, permettant l'écriture de code personnalisé en fonction du rôle de l'utilisateur. +Dans chaque environnement, un objet [session `storage`](../API/SessionClass.md#storage) est partagé par tous les process de la même session utilisateur. Par exemple, sur le serveur, vous pouvez lancer une procédure d'authentification et de vérification de l'utilisateur lorsqu'un client se connecte au serveur, impliquant l'introduction dans l'application d'un code envoyé par e-mail ou par SMS. Ensuite, vous ajoutez les informations de l'utilisateur au storage de session, ce qui permet au serveur d'identifier l'utilisateur. De cette façon, le serveur 4D peut accéder aux informations de l'utilisateur pour tous les process clients, permettant l'écriture de code personnalisé en fonction du rôle de l'utilisateur. -Within each environment, you can use the remote user `session` object to [create an OTP](../API/SessionClass.md#createotp) and [share the remote session for web accesses](#sharing-a-remote-session-for-web-accesses). +Dans chaque environnement, vous pouvez utiliser l'objet "session" de l'utilisateur distant pour [créer un OTP](../API/SessionClass.md#createotp) et [partager la session distante pour les accès web](#sharing-a-remote-session-for-web-accesses). -On the server, you can also [assign privileges](../API/SessionClass.md#setprivileges) to a remote user session to control access when the session comes from [Qodly pages running in web areas](#sharing-a-remote-session-for-web-accesses). +Sur le serveur, vous pouvez également [attribuer des privilèges](../API/SessionClass.md#setprivileges) à une session d'utilisateur distant pour contrôler l'accès lorsque la session provient de [pages Qodly exécutées dans des zones web](#sharing-a-remote-session-for-web-accesses). :::note -On the client side, two distinct local storage objects are available: +Côté client, deux objets "storage" locaux distincts sont disponibles : -- the [`Storage`](../commands/storage) object of the client machine, -- the [`session.storage`](../API/SessionClass.md#storage) object of the user remote session (also returned by the [`Session storage`](../commands/session-storage) command). +- l'objet [`Storage`](../commands/storage) de la machine cliente, +- l'objet [`session.storage`](../API/SessionClass.md#storage) de la session distante de l'utilisateur (également retourné par la commande [`Session storage`](../commands/session-storage)). ::: :::tip Articles de blog sur le sujet - [Objet session distante 4D avec connexion Client/Serveur et procédure stockée](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure). -- [Client / server – Handle a session when working on a 4D client](https://blog.4d.com/client-server-handle-a-session-when-working-on-a-4d-client). +- [Client / serveur - Gérer une session lorsque l'on travaille sur un client 4D](https://blog.4d.com/client-server-handle-a-session-when-working-on-a-4d-client). ::: -### Sharing a remote session for web accesses {#sharing-a-remote-session-for-web-accesses} +### Partage d'une session distante pour les accès web {#sharing-a-remote-session-for-web-accesses} -Remote user sessions can be used to handle web accesses to the application by the same user and thus, manage their [privileges](../ORDA/privileges.md). Cette possibilité est particulièrement utile pour les applications Client/serveur dans lesquelles des [pages Qodly](https://developer.4d.com/qodly/4DQodlyPro/pageLoaders/pageLoaderOverview) sont utilisées pour l'interface, sur des machines clientes distantes. Avec cette configuration, vos applications disposent d'interfaces web modernes basées sur les CSS, tout en bénéficiant de la puissance et de la simplicité du développement intégré client/serveur. Dans ces applications, les pages Qodly sont exécutées dans des [zones Web](../FormObjects/webArea_overview.md) 4D standard. +Les sessions d'utilisateurs distants peuvent être utilisées pour contrôler les accès web à l'application par le même utilisateur et ainsi gérer leurs [privilèges](../ORDA/privileges.md). Cette possibilité est particulièrement utile pour les applications Client/serveur dans lesquelles des [pages Qodly](https://developer.4d.com/qodly/4DQodlyPro/pageLoaders/pageLoaderOverview) sont utilisées pour l'interface, sur des machines clientes distantes. Avec cette configuration, vos applications disposent d'interfaces web modernes basées sur les CSS, tout en bénéficiant de la puissance et de la simplicité du développement intégré client/serveur. Dans ces applications, les pages Qodly sont exécutées dans des [zones Web](../FormObjects/webArea_overview.md) 4D standard. -Pour gérer cette configuration en production, vous devez utiliser des sessions utilisateur distant. En fait, les requêtes provenant à la fois de l'application 4D distante et de ses pages Qodly chargées dans les zones Web doivent fonctionner au sein de la même session. You just have to share the session on the server between the remote client and its web pages so that you can have the same [session storage](../API/SessionClass.md#storage) and client license, wherever the request comes from (web or remote 4D). +Pour gérer cette configuration en production, vous devez utiliser des sessions utilisateur distant. En fait, les requêtes provenant à la fois de l'application 4D distante et de ses pages Qodly chargées dans les zones Web doivent fonctionner au sein de la même session. Il suffit de partager la session sur le serveur entre le client distant et ses pages web afin d'avoir le même [session storage](../API/SessionClass.md#storage) et la même licence client, quelle que soit l'origine de la requête (web ou 4D distant). -[Privileges](../ORDA/privileges.md) should be set in the session before executing a web request, so that the user automatically gets their privileges for web access (see example). Keep in mind that privileges only apply to requests coming from the web. +Les [privilèges](../ORDA/privileges.md) doivent être définis dans la session avant l'exécution d'une requête web, afin que l'utilisateur obtienne automatiquement ses privilèges d'accès au web (voir l'exemple). N'oubliez pas que les privilèges ne s'appliquent qu'aux requêtes provenant du web. :::note -Privileges can only be set from the remote user session on the server. For security reasons, they cannot be modified from the remote user session on the client (see [Comparing server-side and client-side user session objects](#comparing-server-side-and-client-side-user-session-objects)). +Les privilèges ne peuvent être définis qu'à partir de la session de l'utilisateur distant sur le serveur. Pour des raisons de sécurité, ils ne peuvent pas être modifiés à partir de la session de l'utilisateur distant sur le client (voir [Comparaison des objets de session utilisateur côté serveur et côté client](#comparing-server-side-and-client-side-user-session-objects)). ::: -Les sessions partagées sont gérées par des [tokens OTP](../WebServer/sessions.md#session-token-otp). After you created an OTP token for the remote session, you add the token (through the `$4DSID` parameter value) to web requests sent from Web areas containing Qodly pages (or from any web browser) so that the user session on the server is identified and shared. Du côté du serveur web, si une requête web contient un *id OTP* dans le paramètre $4DSID, la session correspondant à ce token OTP est utilisée. +Les sessions partagées sont gérées par des [tokens OTP](../WebServer/sessions.md#session-token-otp). Après avoir créé un token OTP pour la session distante, vous ajoutez le token (par l'intermédiaire de la valeur du paramètre `$4DSID`) aux requêtes Web envoyées à partir des zones Web contenant des pages Qodly (ou à partir de n'importe quel navigateur Web) afin que la session de l'utilisateur sur le serveur soit identifiée et partagée. Du côté du serveur web, si une requête web contient un *id OTP* dans le paramètre $4DSID, la session correspondant à ce token OTP est utilisée. :::note -You can execute the [OTP creation code](../API/SessionClass.md#createotp) from the server or directly from the client (on the server you can use for example the [`On Server Open Connection`](../commands/on-server-open-connection-database-method) database method). However, keep in mind that the web session `.storage` is shared with the server-side user session `.storage` that and privileges can only be set from the user session on the server. +Vous pouvez exécuter le [code de création d'OTP](../API/SessionClass.md#createotp) à partir du serveur ou directement à partir du client (sur le serveur, vous pouvez utiliser par exemple la méthode base [`On Server Open Connection`](../commands/on-server-open-connection-database-method)). Cependant, gardez à l'esprit que le `.storage` de la session web est partagée avec le `.storage` de la session utilisateur côté serveur et que les privilèges ne peuvent être définis qu'à partir de la session utilisateur sur le serveur. ::: :::tip -For development and testing purposes, you can use a [standalone session](#standalone-sessions) to code and test all features related to web access sharing, whether your application is intended for single-user or client/server deployment. +À des fins de développement et de test, vous pouvez utiliser une [session autonome](#standalone-sessions) pour coder et tester toutes les fonctionnalités liées au partage de l'accès au web, que votre application soit destinée à un déploiement mono-utilisateur ou client/serveur. ::: diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop/preemptive.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop/preemptive.md index 0a53f09aa07f8b..4f897dcfae1a19 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Develop/preemptive.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop/preemptive.md @@ -155,7 +155,7 @@ Pour être thread-safe, une méthode doit respecter les règles suivantes : - Elle ne doit pas utiliser de variables interprocess(1) - Elle ne doit pas appeler d'objets d'interface (2) (il y a cependant des exceptions, voir ci-dessous). -(1) To exchange data between preemptive processes (and between all processes), you can pass [shared collections or shared objects](../Concepts/shared.md) as parameters to processes, and/or use the [`Storage`](../commands/storage) catalog. +(1) Pour échanger des données entre process préemptifs (et entre tous les process), vous pouvez passer des [collections partagées ou objets partagés](../Concepts/shared.md) comme paramètres aux process, et/ou utiliser le catalogue [`Storage`](../commands/storage). (1) Pour échanger des données entre process préemptifs (et entre tous les process), vous pouvez passer des [collections partagées ou objets partagés](../Concepts/shared.md) comme paramètres aux process, et/ou utiliser le catalogue [`Storage`](../commands-legacy/storage.md). (2) La commande [`CALL FORM`](../commands/call-form) fournit une solution élégante pour appeler des objets d'interface à partir d'un process préemptif. diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop/processes.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop/processes.md index 514aed6172aa51..454ca1f0a45ab9 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Develop/processes.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop/processes.md @@ -33,7 +33,7 @@ Un process peut être effacé dans les conditions suivantes (les deux premières - Lorsque l'exécution de la méthode du process est terminée - Lorsque l'utilisateur quitte l'application - Si vous arrêtez le process de manière procédurale ou si vous utilisez le bouton **Abort** dans le débogueur ou dans l'Explorateur d'exécution -- If you call the [`KILL WORKER`](../commands/kill-worker) command (to delete a worker process only). +- Si vous appelez la commande [`KILL WORKER`](../commands/kill-worker) (pour supprimer un process worker uniquement). Un process peut créer un autre process. Les process ne sont pas organisés de manière hiérarchique - tous les process sont égaux, quel que soit le process à partir duquel ils ont été créés. Une fois que le process "parent" a créé un process "enfant", le process enfant se poursuit, que le process parent soit toujours en cours d'exécution ou non. diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Project/code-overview.md b/i18n/fr/docusaurus-plugin-content-docs/current/Project/code-overview.md index fbec99036769c0..e43b5d81ace165 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Project/code-overview.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Project/code-overview.md @@ -1,6 +1,6 @@ --- id: code-overview -title: Création de méthodes et de classes +title: Managing Methods and Classes --- Le code 4D utilisé dans votre projet est écrit dans des [méthodes](../Concepts/methods.md) et des [classes](../Concepts/classes.md). @@ -11,20 +11,87 @@ L'IDE de 4D vous offre diverses fonctionnalités pour créer, modifier, exporter Une méthode dans 4D est stockée dans un fichier **.4dm** situé dans le dossier approprié du dossier [`/Project/Sources/`](../Project/architecture.md#sources). -Vous pouvez créer [plusieurs types de méthodes](../Concepts/methods.md) : +Vous pouvez créer [plusieurs types de méthodes](../Concepts/methods.md#method-types) : - Tous les types de méthodes peuvent être créés ou ouverts à partir de la fenêtre de l'**Explorateur** (à l'exception des méthodes objet qui sont gérées à partir de l'[éditeur de formulaires](../FormEditor/formEditor.md)). - Les méthodes projet peuvent également être créées ou ouvertes à partir du menu **Fichier** ou de la barre d'outils (**Nouveau/Méthode...** ou **Ouvrir/Méthode...**) ou à l'aide de raccourcis dans la [fenêtre de l'éditeur de code](../code-editor/write-class-method.md#shortcuts). -- Les triggers peuvent également être créés ou ouverts à partir de l'éditeur de Structure. +- **Triggers** can also be created or opened from the [Structure editor](../Develop-legacy/triggers.md#activating-and-creating-a-trigger). - Les méthodes formulaire peuvent également être créées ou ouvertes à partir de l'[éditeur de formulaires](../FormEditor/formEditor.md). ## Créer des classes -Une classe utilisateur dans 4D est définie par un fichier de méthode spécifique (**.4dm**), stocké dans le dossier [`/Project/Sources/Classes/`](../Project/architecture.md#sources). Le nom du fichier est le nom de la classe. +### User classes -Vous pouvez créer un fichier de classe à partir du menu ou de la barre d'outils **Fichier** (**Nouveau/Classe...**) ou dans la page **Méthodes** de la fenêtre de l'**Explorateur** . +Une classe utilisateur dans 4D est définie par un fichier de méthode spécifique (**.4dm**), stocké dans le dossier [`/Project/Sources/Classes/`](../Project/architecture.md#sources). Le nom du fichier est le nom de la classe. For example, a class named "Polygon" will be stored in the following file: -Pour plus d'informations, reportez-vous à la section [Classes](../Concepts/classes.md). +``` +Project folder Project Sources Classes Polygon.4dm +``` + +You can create a class file from the **File** menu or toolbar (**New > Class...**) or in the **Methods** page of the **Explorer** window. Vous pouvez également utiliser le raccourci **Ctrl+Maj+Alt+k**. + +Dans la **page Méthodes** de l'Explorateur, les classes sont regroupées dans la catégorie **Classes**. + +Pour créer une nouvelle classe, vous pouvez : + +- sélectionner la catégorie **Classes** et cliquez sur le bouton ![](../assets/en/Users/PlussNew.png) . +- sélectionner **Nouvelle classe...** dans le menu d'actions en bas de la fenêtre de l'Explorateur ou dans le menu contextuel du groupe Classes. + ![](../assets/en/Concepts/newClass.png) +- sélectionnez **Nouveau> Classe...** dans le menu contextuel de la page d'accueil de l'Explorateur. + +Lorsque vous nommez des classes, gardez à l'esprit les règles suivantes : + +- A [class name](../Concepts/identifiers.md#classes) must be compliant with [property naming rules](../Concepts/identifiers.md#object-properties). +- Les noms de classe sont sensibles à la casse. +- Il n'est pas recommandé de donner le même nom à une classe et à une table de base de données, afin d'éviter tout conflit. + +### ORDA classes + +[ORDA data model user classes](../ORDA/ordaClasses.md) are high-level class functions created above the data model. + +An ORDA data model class is defined by adding, at the same location as regular class files (*i.e.* in the `/Sources/Classes` folder of the project folder), a .4dm file with the name of the class. Par exemple, une classe d'entité pour la dataclass `Utilities` sera définie via un fichier `UtilitiesEntity.4dm`. + +4D crée préalablement et automatiquement des classes vides en mémoire pour chaque objet de modèle de données disponible. + +![](../assets/en/ORDA/ORDA_Classes-3.png) + +Par défaut, les classes ORDA vides ne sont pas affichées dans l'Explorateur. Pour les afficher, vous devez sélectionner **Afficher toutes les dataclasses** dans le menu d'options de l'Explorateur : +![](../assets/en/ORDA/showClass.png) + +Les classes utilisateurs ORDA ont une icône différente des autres classes. Les classes vides sont grisées : + +![](../assets/en/ORDA/classORDA2.png) + +Pour créer un fichier de classe ORDA, il vous suffit de double-cliquer sur la classe prédéfinie correspondante dans l'Explorateur. 4D creates the class file and add the [`extends`](../Concepts/classes.md#class-extends-classname) code. Par exemple, pour une classe Entity : + +``` +Class extends Entity +``` + +Une fois qu'une classe est définie, son nom n'est plus grisé dans l'Explorateur. + +Pour ouvrir une classe ORDA définie dans l'éditeur de code de 4D, sélectionnez ou double-cliquez sur un nom de classe ORDA et utilisez **Edit...** depuis le menu contextuel/options de la fenêtre de l'Explorateur: + +![](../assets/en/ORDA/classORDA4.png) + +Pour les classes ORDA basées sur le datastore local (`ds`), vous pouvez accéder directement au code de la classe depuis la fenêtre de structure de 4D : + +![](../assets/en/ORDA/classORDA5.png) + +### Prise en charge dans l'IDE 4D + +Dans les différentes fenêtres 4D (éditeur de code, compilateur, débogueur, explorateur d'exécution), le code de classe est essentiellement géré comme une méthode projet avec quelques spécificités : + +- Dans l'éditeur de code : + - une classe ne peut pas être exécutée + - une fonction de classe est un bloc de code + - **Aller à définition...** sur un objet membre permet de rechercher des déclarations de fonction de classe; par exemple, "$o.f()" donnera comme résultat de recherche "Function f". + - **Chercher les références...** sur la déclaration de fonction de classe recherche la fonction utilisée comme membre d'objet; par exemple, "Function f" donnera comme résultat "$o.f()". + - variables typed as a user or ORDA class automatically benefit from autocompletion features. Exemple avec une variable de classe Entity : + +![](../assets/en/ORDA/AutoCompletionEntity.png) + +- Dans l'explorateur d'exécution et le débogueur, les fonctions de classe sont affichées avec le constructeur `` ou le format `.`. ## Supprimer des méthodes ou des classes @@ -35,3 +102,70 @@ Pour supprimer une méthode ou une classe existante, vous pouvez : > Pour supprimer une méthode objet, choisissez **Supprimer la méthode objet** dans l'[éditeur de formulaires](../FormEditor/formEditor.md) (menu **Objet** ou menu contextuel). +## Design Object Access commands + +You can access the contents and paths of all methods in your applications by programming, thanks to the [**"Design Object Access" command theme**](../commands/theme/Design_Object_Access.md). This source toolkit facilitates the integration into your applications of code control tools and more particularly version control systems (VCS). It also lets you implement advanced systems for [code documentation](../Project/documentation.md), for building a custom explorer or for organizing scheduled backups of the code saved as disk files. + +The following principles are implemented: + +- Each method and form in a 4D application has its own address in the form of a pathname. For example, the trigger method for table 1 can be found at "[trigger]/table_1". Each object pathname is unique in an application. +- You can access objects in the 4D application using the commands of the **"Design Object Access"** command theme, for example [`METHOD GET NAMES`](../commands/method-get-names) or [`METHOD GET PATHS`](../commands/method-get-paths). +- Most of the commands in this theme work in both [interpreted and compiled](../Concepts/interpreted.md) mode. However, commands that modify properties or access contents executable from methods can only be used in interpreted mode (see the table below). +- You can use all the commands of this theme with 4D in local or remote mode. However, keep in mind that you cannot use certain commands in compiled mode: the purpose of this theme is to create custom development support tools. You must not use these commands to dynamically change the functioning of a database that is running. For example, you cannot use [`METHOD SET ATTRIBUTE`](../commands/method-set-attribute) to change a method attribute according to the status of the current user. +- When a command of this theme is called from a [component](../Project/components.md), by default it accesses the component objects. In this case, to access objects of the host, you just pass a `*` as the last parameter. + +### Use in compiled mode + +For reasons related to the principle of the compilation process, only certain commands in this theme can be used in compiled mode. The following table indicates the available of the commands in compiled mode: + +| Command | Can be used in compiled mode | +| ------------------------------------------------------------------------ | ---------------------------- | +| [Current method path](../commands/current-method-path) | Oui | +| [FORM GET NAMES](../commands/form-get-names) | Oui | +| [METHOD Get attribute](../commands/method-get-attribute) | Oui | +| [METHOD GET ATTRIBUTES](../commands/method-get-attributes) | Oui | +| [METHOD GET CODE](../commands/method-get-code) | Non | +| [METHOD GET COMMENTS](../commands/method-get-comments) | Oui | +| [METHOD GET FOLDERS](../commands/method-get-folders) | Oui | +| [METHOD GET MODIFICATION DATE](../commands/method-get-modification-date) | Oui | +| [METHOD GET NAMES](../commands/method-get-names) | Oui | +| [METHOD Get path](../commands/method-get-path) | Oui | +| [METHOD GET PATHS](../commands/method-get-paths) | Oui | +| [METHOD GET PATHS FORM](../commands/method-get-paths-form) | Oui | +| [METHOD OPEN PATH](../commands/method-open-path) | Non | +| [METHOD RESOLVE PATH](../commands/method-resolve-path) | Oui | +| [METHOD SET ACCESS MODE](../commands/method-set-access-mode) | Oui | +| [METHOD SET ATTRIBUTE](../commands/method-set-attribute) | Non | +| [METHOD SET ATTRIBUTES](../commands/method-set-attributes) | Non | +| [METHOD SET CODE](../commands/method-set-code) | Non | +| [METHOD SET COMMENTS](../commands/method-set-comments) | Non | + +:::note + +The error -9762 "The command cannot be executed in a compiled database." is generated when the command is executed in compiled mode. + +::: + +### Creation of pathnames + +Pathnames generated for 4D objects must be compatible with the file management of the operating system. Characters that are forbidden at the OS level such as ":" are automatically encoded in method names, so that generated files may be integrated automatically in a version control system. + +Here are the encoded characters: + +| Caractère | Encoding | +| ---------------------------- | -------- | +| " | %22 | +| \* | %2A | +| / | %2F | +| : | %3A | +| \< | %3C | +| \> | %3E | +| ? | %3F | +| \\| | %7C | +| \\ | %5C | +| % | %25 | + +#### Exemples + +`Form?1` is encoded `Form%3F1` +`Button/1` is encoded `Button%2F1` \ No newline at end of file diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Project/project-method-properties.md b/i18n/fr/docusaurus-plugin-content-docs/current/Project/project-method-properties.md index 1fb81bf86299c6..fdadd2ba57b273 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/Project/project-method-properties.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Project/project-method-properties.md @@ -1,8 +1,250 @@ --- id: project-method-properties -title: Propriétés des méthodes projet +title: Méthodes projet --- +## Roles + +Une méthode projet peut tenir les rôles suivants, en fonction de la manière dont elle est exécutée et utilisée : + +- Sous-routine +- Objet formule +- Méthode de menu +- Méthode de gestion de process +- Méthode de gestion d’événements et d'erreurs +- APIs to be called from the web server, transformation tags, extensions... +- Vous pouvez également exécuter les méthodes projet manuellement, à des fins de test par exemple. + +### Sous-routines + +Une sous-routine est une méthode projet qui peut être considérée comme une méthode asservie. D’autres méthodes lui demandent d’effectuer des tâches. Une sous-routine qui retourne une valeur est appelée une fonction. + +Lorsque vous créez une méthode projet, elle devient partie intégrante du langage du projet dans lequel elle a été créée. Vous pouvez procéder de la manière suivante : Vous pouvez procéder de la manière suivante : Vous pouvez procéder de la manière suivante : de la même manière que vous appelez les commandes intégrées de 4D. Une méthode projet utilisée de cette manière est appelée une sous-routine. + +L'utilisation de sous-routines procure les avantages suivants : + +- Réduction du code répétitif, +- Clarification des méthodes, +- Modification plus facile des méthodes, +- Création de code modulaire + +Imaginons par exemple que vous travaillez sur un projet de clients. A mesure que vous construisez le projet, vous vous apercevez que vous répétez souvent certaines tâches, telles que la recherche d’un client et la modification de son enregistrement. Le code nécessaire à l’accomplissement de cette opération pourrait être : + +```4d + // Recherche d'un client + QUERY BY EXAMPLE([Clients]) + // Sélection du formulaire entrée + FORM SET INPUT([Clients];"Saisie de données") + // Modification de l'enregistrement du client + MODIFY RECORD([Clients]) +``` + +Si vous n’utilisez pas de sous-routines, vous devrez écrire ce code à chaque fois que vous voudrez modifier l’enregistrement d’un client. Si cette opération est réalisée dans dix endroits différents de votre projet, vous devrez la réécrire dix fois. Grâce aux sous-routines, vous ne l’écrirez qu’une seule fois en tout. C’est le premier avantage des sous-routines : réduire la quantité de code à écrire. + +Si le code ci-dessus était une méthode projet appelée `MODIFY_CUSTOMER`, vous l’exécuteriez simplement en inscrivant son nom dans une autre méthode. Par exemple, pour modifier l’enregistrement d’un client puis l’imprimer, vous n’auriez qu’à écrire : + +```4d + MODIFY_CUSTOMER + PRINT SELECTION([Customers]) +``` + +Cette possibilité simplifie énormément vos méthodes. Dans l’exemple ci-dessus, il n’est pas nécessaire de savoir comment fonctionne la méthode `MODIFY_CUSTOMER`, mais uniquement ce qu’elle fait. C’est le deuxième avantage que vous pouvez tirer de l’utilisation de sous-routines : la clarification de votre code. Ainsi, ces méthodes deviennent en quelque sorte des extensions du langage de 4D. + +Si vous devez modifier votre mode de recherche des clients, comme dans notre exemple, il vous suffit de modifier une seule méthode, et non dix. C’est un autre avantage des sous-routines : faciliter les modifications de votre code. + +Avec les sous-routines, vous rendez votre code modulaire. Cela signifie simplement que vous dissociez votre code en modules (sous-routines), chacun d’entre eux effectuant une tâche logique. Examinez le code suivant, tiré d’un projet de gestion de compte courant : + +```4d + FIND_CLEARED _CHECKS // Rechercher les chèques émis + RECONCILE_ACCOUNT // Rapprocher le compte +PRINT_CHECK_BOOK_REPORT // Imprimer un relevé +``` + +Même pour quelqu’un qui ne connaît pas le projet, le code est clair. Il n’est pas nécessaire d’examiner chaque sous-routine. Elles peuvent contenir de nombreuses lignes d’instructions et effectuer des opérations complexes, mais l’important est ce qu’elles font. Nous vous conseillons de découper votre code en tâches logiques, ou modules, à chaque fois que c’est possible. + +### Objet formule + +Vous pouvez encapsuler vos méthodes projets dans les objets **formule** et les appeler à partir de vos objets. + +The [`Formula`](../commands/formula) or [`Formula from string`](../commands/formula-from-string) commands allow you to create [native formula objects](../API/FormulaClass.md) that you can encapsulate in object properties. Vous pouvez ainsi implémenter des méthodes d'objets personnalisées. + +Pour exécuter une méthode stockée dans une propriété d'objet, utilisez l'opérateur **()** après le nom de la propriété. Par exemple : + +```4d +//myAlert +ALERT("Hello world!") +``` + +`myAlert` peut ensuite être encapsulé dans n'importe quel objet et peut être appelé : + +```4d +var $o : Object +$o:=New object("custom_Alert";Formula(myAlert)) +$o.custom_Alert() //affiche "Hello world!" +``` + +La syntaxe avec des crochets est également prise en charge : + +```4d +$o["custom_Alert"]() //affiche "Hello world!" +``` + +For more information, see the [`4D.Formula` class description](../API/FormulaClass.md) and the [Using object properties as named parameters](../Concepts/parameters.md#using-object-properties-as-named-parameters) paragraph. + +### Méthodes de menu + +Une méthode de menu est appelée lorsque la commande de menu personnalisé à laquelle elle est associée est sélectionnée. You assign the method to the menu command using the Menu editor or a [command of the "Menus" theme](../commands/theme/Menus.md). Lorsque l’utilisateur sélectionne la commande de menu, la méthode est exécutée. En créant des menus personnalisés qui appellent des méthodes de menu qui exécutent des actions spécifiques, vous créez des interfaces personnalisées pour vos applications de bureau. + +Les commandes de menus personnalisés peuvent déclencher une ou plusieurs actions. For example, a menu command for entering records might call a method that performs two tasks: displaying the appropriate input form, and calling the [`ADD RECORD`(../commands/add-record)] command until the user cancels the data entry activity. + +Automating sequences of activities is a very powerful capability of the 4D programming language. A l’aide des menus personnalisés, vous pouvez automatiser des séquences de tâches, vous permettez aux utilisateurs de naviguer plus facilement dans votre application. + +### Méthodes de gestion de process + +Une **méthode process** est une méthode projet appelée lorsqu’un process est démarré. The process lasts only as long as the process method continues to execute, except if it is a [Worker process](../Develop/processes.md#worker-processes). Note that a menu method attached to a menu command with [*Start a New Process*](../Menus/properties.md#start-a-new-process) property is also the process method for the newly started process. + +### Méthodes de gestion d’événements et d'erreurs + +Une **méthode de gestion d’événements** est une méthode dédiée à la gestion des événements, qui s'exécute dans un process différent de celui de la méthode de gestion des process. Généralement, pour la gestion des événements, vous pouvez laisser 4D faire le gros du travail. Par exemple, lors de la saisie de données, 4D détecte les clics souris et les touches enfoncées, puis appelle les méthodes objet et formulaire correspondantes, vous permettant ainsi de prévoir dans ces méthodes les traitements appropriés aux événements. For more information, see the description of the command [`ON EVENT CALL`](../commands/on-event-call). + +Une **méthode de gestion d’erreurs** est une méthode projet d'interruption. Elle est appelée à chaque fois qu'une erreur ou une exception se produit. Pour plus d'informations, consultez la section [Gestion des erreurs](../Concepts/error-handling.md). + +### API Methods + +Project methods can be called from external contexts such as other applications, web apps, processed files, etc., in which case they can be seen as API. Such calls include: + +- calls to the web server through [http request handlers](../WebServer/http-request-handler.md) or [`4DACTION` URLs](../WebServer/httpRequests.md#4daction), +- [tag processing](../Tags/transformation-tags.md) +- expressions called from extensions ([4D Write Pro](../WritePro/commands/wp-insert-formula.md), [4D View Pro](../ViewPro/formulas.md) or form objects (e.g. [`ST INSERT EXPRESSION`](../commands/st-insert-expression)). + +External calls to project methods must be allowed in the [project method properties](../Project/project-method-properties.md). + +### Execution mode + +Les méthodes projet écrites dans votre application sont généralement appelées automatiquement lors de l'utilisation de l'application par des commandes de menu, des boutons, d'autres méthodes, etc. Quant aux méthodes base, elles sont exécutées en fonction d'événements spécifiques qui se produisent dans l'application. + +Toutefois, à des fins de test et de débogage, 4D vous permet d'exécuter manuellement des méthodes projet et certaines méthodes base en mode Développement. Dans ce cas, il est possible d'exécuter la méthode dans un nouveau process et/ou directement en mode Debug, afin de vérifier son exécution pas à pas. + +Vous pouvez exécuter les méthodes de deux manières : + +- Dans la fenêtre de l'éditeur de code, +- Dans la boîte de dialogue Exécuter la méthode (méthodes projet). + +#### Depuis l'éditeur de code + +Chaque fenêtre de l'[**Éditeur de code**](../code-editor/write-class-method.md) dispose d'un bouton qui peut être utilisé pour exécuter la méthode courante. A l'aide du menu associé à ce bouton, vous pouvez choisir le type d'exécution souhaité. + +Ce bouton est uniquement actif pour les méthodes projet et pour les méthodes base suivantes : + +- On Startup +- On Exit +- On Server Startup +- On Server Shutdown + +Pour plus d'informations, voir [Barre d'outils](../code-editor/write-class-method.md#toolbar). + +#### Dans la boîte de dialogue Exécuter la méthode + +Lorsque vous sélectionnez la commande **Méthode...** du menu **Exécution**, la boîte de dialogue **Méthode** s'affiche. + +Cette boîte de dialogue répertorie toutes les méthodes projet de la base, y compris les méthodes projet partagées des composants. En revanche, les méthodes projet qui ont été déclarées invisibles n'apparaîtront pas. + +Pour exécuter une méthode de projet, il suffit de sélectionner son nom dans la liste et de cliquer sur **Exécuter**. Pour exécuter une méthode étape par étape en mode Debug, cliquez sur **Debug**. Pour plus d'informations sur le débogueur 4D, reportez-vous à la section [Debugging](../Debugging/basics.md) . + +Si vous cochez la case **Nouveau Process** , la méthode que vous avez sélectionnée s'exécute dans un autre process. Si la méthode effectue une tâche qui prend du temps, comme l'impression d'un grand nombre d'enregistrements, vous pouvez continuer à travailler avec votre base, en ajoutant des enregistrements à une table, en créant un graphe pour afficher les données, etc. Pour plus d'informations sur les process, voir [Process](../Develop/processes.md). + +**Notes 4D Server**: + +- Si vous souhaitez que la méthode soit exécutée sur la machine serveur plutôt que sur la machine cliente, sélectionnez l'option **Sur 4D Server** dans le menu Exécuter : Dans ce cas, un nouveau process, appelé *procédure stockée*, est créé sur la machine serveur afin d'exécuter la méthode. Dans ce cas, un nouveau process, appelé *procédure stockée*, est créé sur la machine serveur afin d'exécuter la méthode. Cette option peut être utilisée pour réduire le trafic réseau et optimiser le fonctionnement de 4D Server, en particulier pour les méthodes qui appellent des données stockées sur le disque. Tous les types de méthodes peuvent être exécutés sur la machine serveur ou sur une autre machine cliente, à l'exception de celles qui modifient l'interface utilisateur. Dans ce cas, les procédures stockées sont inefficaces. +- Vous pouvez également choisir d'exécuter la méthode sur un autre poste client. Les autres postes clients n'apparaîtront pas dans le menu, sauf s'ils ont été préalablement "enregistrés" (pour plus d'informations, se référer à la description de [REGISTER CLIENT](../commands/register-client). + +Par défaut, l'option **En local** est sélectionnée. Avec la version mono-utilisateur de 4D, c'est la seule option disponible. + +### Méthode projet récursives + +Des méthodes projet peuvent s'appeler les unes les autres. Par exemple : + +- Une méthode A peut appeler une méthode B, qui appelle A, donc A appelle B de nouveau, etc. +- Une méthode peut s'appeler elle-même. + +Cela s'appelle la récursivité. Le langage de 4D supporte pleinement la récursivité. + +Examinons l'exemple suivant : Examinons l'exemple suivant : Examinons l'exemple suivant : Examinons l'exemple suivant : Supposons que vous disposiez d'une table `[Friends and Relatives]` composée de cet ensemble de champs extrêmement simplifié : + +- `[Amis et parents]Nom` +- `[Amis et parents]Enfant'Nom` + +Pour cet exemple, nous supposons que les valeurs des champs sont uniques (il n'existe pas deux personnes avec le même nom). A partir d'un nom, vous voulez écrire la phrase “Un de mes amis, Pierre, qui est le rejeton de Paul qui est le rejeton de Martine qui est le rejeton de Robert qui est le rejeton de Gertrude, fait cela pour gagner sa vie !” : + +1. Vous pouvez procéder de la manière suivante : + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + var $vtTheWholeStory:="A friend of mine, "+$vsName + var $vlQueryResult : Integer + Repeat + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) + $vlQueryResult:=Records in selection([Friends and Relatives]) + If($vlQueryResult>0) + $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name + $vsName:=[Friends and Relatives]Name + End if + Until($vlQueryResult=0) + $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" + ALERT($vtTheWholeStory) + End if + End if +``` + +2. Vous pouvez également procéder ainsi : + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") + End if + End if +``` + +en utilisant la fonction récursive `Genealogy of` suivante : + +```4d + //Genealogy of project method + //Genealogy of ( String ) -> Text + //Genealogy of ( Name ) -> Part of sentence + + #DECLARE($name : Text) -> $result : Text + $result:=$name + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$name) + If(Records in selection([Friends and Relatives])>0) + $result:=$result+" who is the child of "+Genealogy of([Friends and Relatives]Name) + End if +``` + +Vous notez que la méthode `Genealogy of` s'appelle elle-même. + +La première manière de procéder utilise un **algorithme itératif**. La seconde manière utilise un **algorithme récursif**. + +Lorsque vous implémentez du code pour traiter des cas comme celui décrit ci-dessus, vous aurez toujours le choix entre écrire des méthodes utilisant des algorithmes itératifs ou récursifs. Typiquement, la récursivité fournit un code plus concis, plus facile à lire et à maintenir, mais elle est facultative. + +Dans 4D, la récursivité est typiquement utilisée pour : + +- Traiter les enregistrements de tables liées les unes aux autres de la même manière que décrit dans l'exemple ci-dessus. +- Browsing documents and folders on your disk, using the commands [`FOLDER LIST`](../commands/folder-list) and [`DOCUMENT LIST`](document-list). Un dossier peut contenir des dossiers et des documents, les sous-dossiers peuvent eux-mêmes contenir des dossiers et des documents, etc. + +:::warning + +Recursive calls should always end at some point. Dans l'exemple ci-dessus, la méthode `Généalogie de` cesse de s'appeler elle-même lorsque la recherche ne trouve plus d'enregistrement. Sans ce test conditionnel, la méthode s'appellerait indéfiniment et 4D pourrait au bout d'un certain temps retourner l'erreur “La pile est pleine” car le programme n'aurait plus assez de place pour "empiler" les appels (ainsi que les paramètres et les variables locales utilisés dans la méthode). + +::: + +## Propriétés + Après avoir créé une méthode projet, vous pouvez la renommer et modifier ses propriétés. Les propriétés des méthodes projet définissent principalement leurs conditions d’accès et de sécurité (accès par les utilisateurs, les serveurs intégrés ou les services) ainsi que leur mode d'exécution. Les autres types de méthodes n'ont pas de propriétés spécifiques. Leurs propriétés sont liées à celles des objets auxquels elles sont attachées. @@ -14,7 +256,7 @@ Pour afficher la boîte de dialogue **Propriétés de la méthode** pour une mé > Une fonction de paramétrage global vous permet de modifier une propriété pour tout ou partie des méthodes projet en une seule opération (voir [Modifier attributs globalement](#modifier-attributs-globalement)). -## Nom +### Nom Vous pouvez changer le nom d'une méthode projet dans la zone **Nom** de la fenêtre **Propriétés de la méthode** ou dans l'Explorateur. @@ -34,37 +276,37 @@ Les méthodes base ne peuvent pas être renommées. Il en va de même pour les t ::: -## Attributs +### Attributs Vous pouvez contrôler comment les méthodes projet sont utilisées et/ou appelées dans différents contextes en utilisant des attributs. Notez que vous pouvez définir des attributs globalement pour une sélection de méthodes projet en utilisant l'Explorateur (voir la section suivante). -### Invisible +#### Invisible Si vous ne voulez pas que les utilisateurs puissent exécuter une méthode projet à l'aide de la commande **Méthode...** du menu **Exécution**, vous pouvez la rendre invisible en cochant cette option. Une méthode invisible n'apparaît pas dans la boîte de dialogue d'exécution de méthode. Lorsque vous rendez une méthode projet invisible, elle est toujours disponible pour le développeur. Elle reste listée dans l'Explorateur et de l'éditeur de code. -### Partagée entre composants et projet hôte +#### Partagée entre composants et projet hôte Cet attribut est utilisé dans le cadre des composants. Quand il est coché, il indique que la méthode sera disponible pour les composants lorsque l'application sera utilisée comme projet hôte. A l'inverse, lorsque l'application sera utilisée en tant que composant, la méthode sera disponible pour les projets hôtes. Pour plus d'informations sur les composants, reportez-vous au chapitre [Développer et installer des composants 4D](../Extensions/develop-components.md) . -### Exécuter sur serveur +#### Exécuter sur serveur Cet attribut est pris en compte uniquement dans le cadre d’une application 4D en client/serveur. Lorsque cette option est cochée, la méthode du projet est toujours exécutée sur le serveur, quelle que soit la manière dont elle est appelée. Pour plus d'informations sur cette option, reportez-vous à [Attribut Exécuter sur serveur](https://doc.4d.com/4Dv20/4D/20/Execute-on-Server-attribute.300-6330555.en.html). -## Mode d’exécution +### Mode d’exécution Cette option vous permet de déclarer la méthode éligible à l'exécution en mode préemptif. Elle est décrite dans la section [Process préemptifs](../Develop/preemptive.md). -## Disponibilité +### Disponibilité Les attributs de disponibilité précisent les services externes autorisés à appeler explicitement la méthode. -### Web Services +#### Web Services Cet attribut vous permet de publier la méthode courante comme service Web accessible via des requêtes SOAP. Pour plus d’informations, reportez-vous au chapitre [Publication et utilisation de Services Web](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.en.html). Lorsque cette option est cochée, l’option **Publié dans WSDL** est active. @@ -72,13 +314,13 @@ Dans l'explorateur, les méthodes projet qui sont proposées en tant que service **Note :** Il n'est pas possible de publier en tant que Web service une méthode dont le nom comporte des caractères non conformes à la nomenclature XML (par exemple des espaces). Si le nom de la méthode n'est pas conforme, 4D refuse l'affectation de la propriété. -### Publié dans WSDL +#### Publié dans WSDL Cet attribut est actif uniquement si l'attribut "Web service" est coché. Il permet d’inclure la méthode courante dans le fichier WSDL de l’application 4D. Pour plus d’informations sur ce point, reportez-vous au paragraphe [Génération du WSDL](https://doc.4d.com/4Dv20/4D/20.2/Publishing-a-Web-Service-with-4D.300-6750334.en.html#502689). Dans l'explorateur, les méthodes projet proposées en tant que service Web et publiées dans le WSDL sont dotées d'une icône spécifique. -### Balises HTML et URLs 4D (4DACTION...) +#### Balises HTML et URLs 4D (4DACTION...) Cette option permet de renforcer la sécurité du serveur Web 4D : lorsqu'elle n'est pas cochée, la méthode projet ne peut pas être exécutée via une requête HTTP contenant l'URL spéciale [4DACTION](../WebServer/httpRequests.md#4daction) utilisée pour appeler les méthodes 4D, ni les balises spéciales [4DSCRIPT, 4DTEXT et 4DHTML](../Tags/transformation-tags.md). @@ -86,7 +328,7 @@ Dans l'explorateur, les méthodes projet ayant cet attribut sont dotées d'une i Pour des raisons de sécurité, cette option est désélectionnée par défaut. Vous devez désigner individuellement chaque méthode pouvant être exécutée via les URLs et les balises spéciales. -### SQL +#### SQL Lorsqu’elle est cochée, cette option autorise l’exécution de la méthode projet par le moteur SQL de 4D. Elle est désélectionnée par défaut, ce qui signifie que, sauf autorisation explicite, les méthodes projet de 4D sont protégées et ne peuvent pas être appelées par le moteur SQL de 4D. @@ -99,11 +341,11 @@ Cette propriété s'applique à toutes les requêtes SQL internes et externes -- Pour plus d’informations, reportez-vous à la section [Implémentations du moteur SQL de 4D](https://doc.4d.com/4Dv20/4D/20/4D-SQL-engine-implementation.300-6342089.en.html) in dans le manuel SQL de 4D. -### Serveur REST +#### Serveur REST _Cette option est obsolète. L'appel de code par le biais d'appels REST n'est possible qu'avec les [fonctions de classe du modèle de données ORDA](../REST/ClassFunctions.md).\* -## Modifier attributs globalement +### Modifier attributs globalement La boîte de dialogue "Attributs des méthodes" permet de modifier un attribut (Invisible, Disponible via Web Services etc.) pour tout ou partie des méthodes projet de la base de données en une seule opération. Cette fonction est très utile pour modifier les attributs d’un grand nombre de méthodes projet. Elle peut également être utilisée en cours de développement pour appliquer rapidement des attributs communs à des groupes homogènes de méthodes. diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/code-editor/write-class-method.md b/i18n/fr/docusaurus-plugin-content-docs/current/code-editor/write-class-method.md index 21043f554395d4..4c2bebf6b92ad3 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/code-editor/write-class-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/code-editor/write-class-method.md @@ -701,7 +701,7 @@ Les macro-commandes de 4D sont écrites au format XML. Vous pouvez utiliser “t Le dossier “Macros v2” peut être situé : - Dans le dossier 4D actif de la machine. Les macros sont alors partagées pour toutes les bases. - **Note :** L’emplacement du dossier 4D actif varie en fonction du système d’exploitation. For more information, refer to the description of the [Get 4D folder](../commands/get-4d-folder) command in the 4D *Language Reference* manual. + **Note :** L’emplacement du dossier 4D actif varie en fonction du système d’exploitation. Pour plus d’informations, reportez-vous à la description de la commande [Get 4D folder](../commands/get-4d-folder). - A côté du fichier de structure de la base. Les macros ne sont chargées que pour cette structure. - Pour les composants : dans le dossier **Components** de la base. Les macros ne sont alors chargées que si le composant est installé. @@ -838,7 +838,7 @@ La prise en charge des macros peut changer d'une version de 4D à l'autre. Afin #### Variables de sélection de texte pour les méthodes -Il est recommandé de gérer les sélections de texte à l'aide des commandes [GET MACRO PARAMETER](../commands/get-macro-parameter) et [SET MACRO PARAMETER](../commands/set-macro-parameter) . Ces commandes peuvent être utilisées pour surmonter le cloisonnement des espaces d'exécution du projet hôte/composant et ainsi permettre la création de composants dédiés à la gestion des macros. Afin d'activer ce mode pour une macro, vous devez déclarer l'attribut Version avec la valeur 2 dans l'élément Macro. In this case, 4D no longer manages the predefined variables _textSel,_textReplace, etc. and the [GET MACRO PARAMETER](../commands/get-macro-parameter) and [SET MACRO PARAMETER](../commands/set-macro-parameter) commands are used. Cet attribut doit être déclaré comme suit : +Il est recommandé de gérer les sélections de texte à l'aide des commandes [GET MACRO PARAMETER](../commands/get-macro-parameter) et [SET MACRO PARAMETER](../commands/set-macro-parameter) . Ces commandes peuvent être utilisées pour surmonter le cloisonnement des espaces d'exécution du projet hôte/composant et ainsi permettre la création de composants dédiés à la gestion des macros. Afin d'activer ce mode pour une macro, vous devez déclarer l'attribut Version avec la valeur 2 dans l'élément Macro. Dans ce cas, 4D ne gère plus les variables prédéfinies _textSel, _textReplace, etc. et les commandes [GET MACRO PARAMETER](../commands/get-macro-parameter) et [SET MACRO PARAMETER](../commands/set-macro-parameter) sont utilisées. Cet attribut doit être déclaré comme suit : ``
`--- Text of the macro ---`
`
` diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md index b8651abfbf5d76..32ef5b8ff9cc31 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPAgentClass.md @@ -53,10 +53,10 @@ HTTPAgent オブジェクトは共有可能なため、 シングルトンクラ
履歴 -| リリース | 内容 | -| ----- | ----------------------------------------------------- | -| 21 R3 | Support of *storeCertificateName* property on macOS | -| 21 | Support of *storeCertificateName* property on Windows | +| リリース | 内容 | +| ----- | -------------------------------------------- | +| 21 R3 | macOS での *storeCertificateName* プロパティのサポート | +| 21 | Windows での *storeCertificateName* プロパティのサポート |
@@ -76,21 +76,21 @@ HTTPAgent のオプションは [HTTPRequest のオプション](HTTPRequestClas ::: -| プロパティ | 型 | デフォルト | 説明 | -| ---------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| certificatesFolder | Folder | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使ったリクエストに使用するクライアント証明書フォルダー。 "storeCertificateName" によって上書き可能(下記参照) | -| keepAlive | Boolean | true | 当該エージェントについて keep-alive を有効にします | -| maxSockets | Integer | 65535 | サーバーあたりの最大ソケット数 | -| maxTotalSockets | Integer | 65535 | エージェントの最大ソケット数 | -| minTLSVersion | Text | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使ったリクエストに設定する TLS の最小バージョン | -| protocol | Text | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使ったリクエストに使用されるプロトコル | -| storeCertificateName | Text | undefined | Name of a certificate stored in the Certificate Store (Windows) or in the *keychain* (macOS) to use instead of one saved in the certificates folder. If the certificate is not found in the store, an error is returned. For more information, see [this blog post for Windows](https://blog.4d.com/https-requests-now-support-windows-certificate-store) and [this blog post for macOS](https://blog.4d.com/https-requests-macos-keychain-support-is-here). | -| timeout | Real | undefined | 定義されている場合、未使用のソケットが閉じられるまでのタイムアウト | -| validateTLSCertificate | Boolean | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使用したリクエストについて、TLS 証明書の検証をおこなうか | +| プロパティ | 型 | デフォルト | 説明 | +| ---------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| certificatesFolder | Folder | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使ったリクエストに使用するクライアント証明書フォルダー。 "storeCertificateName" によって上書き可能(下記参照) | +| keepAlive | Boolean | true | 当該エージェントについて keep-alive を有効にします | +| maxSockets | Integer | 65535 | サーバーあたりの最大ソケット数 | +| maxTotalSockets | Integer | 65535 | エージェントの最大ソケット数 | +| minTLSVersion | Text | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使ったリクエストに設定する TLS の最小バージョン | +| protocol | Text | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使ったリクエストに使用されるプロトコル | +| storeCertificateName | Text | undefined | 証明書フォルダに保存されているものの代わりに使用する、証明書ストア(Windows) または *keychain* (macOS) に保存されている証明書の名前。 証明書がストアに見つからなかった場合、エラーが返されます。 より詳細な情報については、[Windows についてはこちらのblog 記事を](https://blog.4d.com/https-requests-now-support-windows-certificate-store) 、また [macOS についてはこちらのblog 記事を](https://blog.4d.com/https-requests-macos-keychain-support-is-here)を参照してください。 | +| timeout | Real | undefined | 定義されている場合、未使用のソケットが閉じられるまでのタイムアウト | +| validateTLSCertificate | Boolean | undefined (デフォルト値は [HTTPRequest.new()](HTTPRequestClass.md#options-引数) 参照) | 当該エージェントを使用したリクエストについて、TLS 証明書の検証をおこなうか | :::note -On macOS, when a new application (new [UUID](./FileClass.md#setappinfo)) requests access to the keychain for the first time, a password can be requested to the user, depending on the local keychain configuration. +macOS では、新しいアプリケーション(新しい [UUID](./FileClass.md#setappinfo)) がキーチェーンへのアクセスを最初にリクエストする場合、ローカルのキーチェーン設定によっては、ユーザーに対してパスワードが要求される可能性があります。 ::: diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md index 0fc164b55ac9c6..7d7fa9d83e2c16 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/HTTPRequestClass.md @@ -15,9 +15,9 @@ title: HTTPRequest `HTTPRequest` クラスは、`4D` クラスストアにて提供されています。 HTTPリクエストを作成・送信するには、[`HTTPRequest オブジェクト`](#httprequest-オブジェクト) を返す [4D.HTTPRequest.new()](#4dhttprequestnew) 関数を使用します。 -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### 例題 @@ -96,12 +96,12 @@ HTTPRequest オブジェクトは次のプロパティや関数を提供しま
履歴 -| リリース | 内容 | -| ----- | ----------------------------------------------------- | -| 21 R3 | Support of *storeCertificateName* property on macOS | -| 21 | Support of *storeCertificateName* property on Windows | -| 20 | TLS検証がデフォルトに | -| 19 R7 | *automaticRedirections* および *decodeData* プロパティをサポート。 | +| リリース | 内容 | +| ----- | ---------------------------------------------------- | +| 21 R3 | macOS での *storeCertificateName* プロパティのサポート | +| 21 | Windows での *storeCertificateName* プロパティのサポート | +| 20 | TLS検証がデフォルトに | +| 19 R7 | *automaticRedirections* および *decodeData* プロパティをサポート。 |
@@ -137,34 +137,34 @@ HTTPRequest オブジェクトは次のプロパティや関数を提供しま *options* に渡すオブジェクトは、次のプロパティを持つことができます: -| プロパティ | 型 | 説明 | デフォルト | -| ---------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPRequest で使用する HTTPAgent。 エージェントオプションはリクエストオプションと統合されます (リクエストオプションが優先されます)。 特定のエージェントが定義されていない場合、デフォルト値を持つグローバルエージェントが使用されます。 | グローバルエージェントオブジェクト | -| automaticRedirections | Boolean | true の場合、リダイレクトは自動的に実行されます (最大 5回までのリダイレクトが処理され、もしあれば 6回目のリダイレクトレスポンスが返されます) | true | -| body | Variant | リクエストの本文 (`post` または `put` リクエストの場合に必須)。 テキスト、BLOB、またはオブジェクトを指定できます。 ヘッダー内で設定されていない限り、content-type は当プロパティの型によって決定されます。 | undefined | -| certificatesFolder | [Folder](FolderClass.md) | アクティブクライアント証明書フォルダを設定します。 "storeCertificateName" によって上書き可能です(下記参照)。 | undefined | -| dataType | Text | レスポンス本文のデータ型。 値: "text", "blob", "object", または "auto"。 "auto" の場合、本文の型は MIMEタイプから推定されます (JSON ならオブジェクト、テキスト・javascript・xml・httpメッセージ・URLエンコードされたフォームなどはテキスト、それ以外は BLOB)。 | "auto" | -| decodeData | Boolean | true の場合、`onData` コールバックが受け取るデータは非圧縮です | false | -| encoding | Text | `body` のあるリクエストの場合にのみ使用 (`post` または `put` メソッド)。 本文がテキストの場合のエンコーディング。ヘッダーにて content-type が指定されている場合は無視されます。 | "UTF-8" | -| headers | Object | リクエストのヘッダー。 シンタックス: `headers.key=value` (同じ key に対して *value* を複数指定する場合、*value* にコレクションを使用できます) | 空のオブジェクト | -| method | Text | "POST"、"GET"、またはその他のメソッド | "GET" | -| minTLSVersion | Text | TLS の最小バージョンを指定します: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" | -| onData | [Function](FunctionClass.md) | 本文のデータ受信時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | -| onError | [Function](FunctionClass.md) | エラー発生時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | -| onHeaders | [Function](FunctionClass.md) | ヘッダー受信時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | -| onResponse | [Function](FunctionClass.md) | レスポンス受信時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | -| onTerminate | [Function](FunctionClass.md) | リクエスト終了時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | -| protocol | Text | "auto" または "HTTP1"。 "auto" は現在の実装における HTTP1 を意味します。 | "auto" | -| proxyAuthentication | [authentication オブジェクト](#authentication-オブジェクト) | プロキシ認証のためのオブジェクト | undefined | -| returnResponseBody | Boolean | false の場合、レスポンス本文は[`response` オブジェクト](#response) に返されません。 false かつ `onData` が未定義の場合にエラーを返します。 | true | -| serverAuthentication | [authentication オブジェクト](#authentication-オブジェクト) | サーバー認証のためのオブジェクト | undefined | -| storeCertificateName | Text | Name of a certificate stored in the Certificate Store (Windows) or in the *keychain* (macOS) to use instead of one saved in the certificates folder. If the certificate is not found in the store, an error is returned. For more information, see [this blog post for Windows](https://blog.4d.com/https-requests-now-support-windows-certificate-store) and [this blog post for macOS](https://blog.4d.com/https-requests-macos-keychain-support-is-here). | undefined | -| timeout | Real | タイムアウト (秒単位) タイムアウト (秒単位) 未定義 = タイムアウトなし | undefined | -| validateTLSCertificate | Boolean | false の場合、4D は TLS証明書の検証をおこなわず、無効 (期限切れ、自己署名など) であってもエラーを返しません。 重要: 現在の実装では、認証局そのものは検証されません。 | true | +| プロパティ | 型 | 説明 | デフォルト | +| ---------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | +| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPRequest で使用する HTTPAgent。 エージェントオプションはリクエストオプションと統合されます (リクエストオプションが優先されます)。 特定のエージェントが定義されていない場合、デフォルト値を持つグローバルエージェントが使用されます。 | グローバルエージェントオブジェクト | +| automaticRedirections | Boolean | true の場合、リダイレクトは自動的に実行されます (最大 5回までのリダイレクトが処理され、もしあれば 6回目のリダイレクトレスポンスが返されます) | true | +| body | Variant | リクエストの本文 (`post` または `put` リクエストの場合に必須)。 テキスト、BLOB、またはオブジェクトを指定できます。 ヘッダー内で設定されていない限り、content-type は当プロパティの型によって決定されます。 | undefined | +| certificatesFolder | [Folder](FolderClass.md) | アクティブクライアント証明書フォルダを設定します。 "storeCertificateName" によって上書き可能です(下記参照)。 | undefined | +| dataType | Text | レスポンス本文のデータ型。 値: "text", "blob", "object", または "auto"。 "auto" の場合、本文の型は MIMEタイプから推定されます (JSON ならオブジェクト、テキスト・javascript・xml・httpメッセージ・URLエンコードされたフォームなどはテキスト、それ以外は BLOB)。 | "auto" | +| decodeData | Boolean | true の場合、`onData` コールバックが受け取るデータは非圧縮です | false | +| encoding | Text | `body` のあるリクエストの場合にのみ使用 (`post` または `put` メソッド)。 本文がテキストの場合のエンコーディング。ヘッダーにて content-type が指定されている場合は無視されます。 | "UTF-8" | +| headers | Object | リクエストのヘッダー。 シンタックス: `headers.key=value` (同じ key に対して *value* を複数指定する場合、*value* にコレクションを使用できます) | 空のオブジェクト | +| method | Text | "POST"、"GET"、またはその他のメソッド | "GET" | +| minTLSVersion | Text | TLS の最小バージョンを指定します: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" | +| onData | [Function](FunctionClass.md) | 本文のデータ受信時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | +| onError | [Function](FunctionClass.md) | エラー発生時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | +| onHeaders | [Function](FunctionClass.md) | ヘッダー受信時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | +| onResponse | [Function](FunctionClass.md) | レスポンス受信時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | +| onTerminate | [Function](FunctionClass.md) | リクエスト終了時のコールバック。 コールバックは 2つのオブジェクトを引数として受け取ります (後述参照) | undefined | +| protocol | Text | "auto" または "HTTP1"。 "auto" は現在の実装における HTTP1 を意味します。 | "auto" | +| proxyAuthentication | [authentication オブジェクト](#authentication-オブジェクト) | プロキシ認証のためのオブジェクト | undefined | +| returnResponseBody | Boolean | false の場合、レスポンス本文は[`response` オブジェクト](#response) に返されません。 false かつ `onData` が未定義の場合にエラーを返します。 | true | +| serverAuthentication | [authentication オブジェクト](#authentication-オブジェクト) | サーバー認証のためのオブジェクト | undefined | +| storeCertificateName | Text | 証明書フォルダに保存されているものの代わりに使用する、証明書ストア(Windows) または *keychain* (macOS) に保存されている証明書の名前。 証明書がストアに見つからなかった場合、エラーが返されます。 より詳細な情報については、[Windows についてはこちらのblog 記事を](https://blog.4d.com/https-requests-now-support-windows-certificate-store) 、また [macOS についてはこちらのblog 記事を](https://blog.4d.com/https-requests-macos-keychain-support-is-here)を参照してください。 | undefined | +| timeout | Real | タイムアウト (秒単位) タイムアウト (秒単位) 未定義 = タイムアウトなし | undefined | +| validateTLSCertificate | Boolean | false の場合、4D は TLS証明書の検証をおこなわず、無効 (期限切れ、自己署名など) であってもエラーを返しません。 重要: 現在の実装では、認証局そのものは検証されません。 | true | :::note -On macOS, when a new application (new [UUID](./FileClass.md#setappinfo)) requests access to the keychain for the first time, a password can be requested to the user, depending on the local keychain configuration. +macOS では、新しいアプリケーション(新しい [UUID](./FileClass.md#setappinfo)) がキーチェーンへのアクセスを最初にリクエストする場合、ローカルのキーチェーン設定によっては、ユーザーに対してパスワードが要求される可能性があります。 ::: diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md index df58ec7cd20f1f..82126431346141 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/MethodClass.md @@ -3,14 +3,14 @@ id: MethodClass title: メソッド --- -A `4D.Method` object contains a piece of code that is created from text source and can be executed. `4D.Method` methods always execute in interpreted mode, regardless of the project running mode (interpreted/compiled). This feature is especially designed to support dynamic, on-the-fly execution of code snippets. +`4D.Method` オブジェクトには、ソーステキストから作成され、実行可能なコードの一部分が格納されています。 `4D.Method` のメソッドは、プロジェクトの実行モード(インタープリター/コンパイル)に関わらず、常にインタープリターモードで実行されます。 この機能は特に、ダイナミックなコードスニペットのオン・ザ・フライな実行をサポートするように設計されてます。 -A `4D.Method` object is created with the `4D.Method.new()` function. +`4D.Method` オブジェクトは、`4D.Method.new()` 関数で作成されます。 -`4D.Method` objects inherit from the [`4D.Function`](./FunctionClass.md) class. Thus, to execute the method object, you can: +`4D.Method` オブジェクトは、 [`4D.Function`](./FunctionClass.md) クラスを継承します。 そのため、メソッドオブジェクトを実行するためには、以下のような方法があります: -- store a `4D.Method` object in an object property and use the `()` operator after the property name, -- or directly call the `4D.Method` object using the [`call()`](#call) or [`apply()`](#apply) function on it. +- オブジェクトプロパティに`4D.Method` オブジェクトを入れ、プロパティ名の後に `()` 演算子を使用する +- または、 [`call()`](#call) あるいは [`apply()`](#apply) 関数を使用して `4D.Method` オブジェクトを呼び出す。 [Function オブジェクト内のコードを実行する](../API/FunctionClass.md#executing-code-in-function-objects) の段落の例題を参照してください。 @@ -22,20 +22,20 @@ A `4D.Method` object is created with the `4D.Method.new()` function. ### 例題 -#### Basic dynamic method creation +#### 基本的なダイナミックメソッド作成 ```4d var $myCode : Text $myCode:="#DECLARE ($number1:Integer;$number2:Integer):Integer"+Char(13)+"return $number1*$number2" var $o:={} -$o.multiplication:=4D.Method.new($myCode) //put object in a property +$o.multiplication:=4D.Method.new($myCode) // オブジェクトをプロパティにいれる var $result2:=$o.multiplication(2;3) // 6 var $result3:=4D.Method.new($myCode).call(Null; 10; 5) // 50 ``` -#### Using `This` inside method code +#### メソッドコード内で `This` を使用する ```4d var $myCode:="#DECLARE ($str1:text):text"+Char(13)+"return $str1+This.name" @@ -44,13 +44,13 @@ var $o:={name: "John"} $o.concat:=4D.Method.new($myCode) var $result : Text -$result:=$o.concat("Hello ") // $result is "Hello John" +$result:=$o.concat("Hello ") // $result は "Hello John" ``` -#### Using a text file with syntax checking +#### テキストファイルをシンタックスチェックにかける ```text -//4d method stored in a text file +// テキストファイル内に保存されている4D メソッド var $newBusinessRules:=New shared object Use ($newBusinessRules) $newBusinessRules.taxRate:=0.2 @@ -65,21 +65,21 @@ Use (Storage) End use ``` -This method is called in the code: +このメソッドは以下のようなコード内で呼び出されます: ```4d var $myFile:=File("/DATA/BusinessRules.4dm") var $myMethod:=4D.Method.new($myFile.getText()) -// Syntax errors verification +// シンタックスエラーの検証 If ($myMethod.checkSyntax().success) $myMethod.call() End if ``` -### Method Object +### メソッドオブジェクト -4D.Method objects provide the following properties and functions: +4D.Method オブジェクトは以下のプロパティと関数を提供します: | | | -------------------------------------------------------------------------------------------------------------------------- | @@ -105,22 +105,22 @@ End if
-| 引数 | 型 | | 説明 | -| ------ | ------------------------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------- | -| source | Text | -> | Textual representation of a 4D method to be encapsuled as an object | -| name | Text | -> | Name of the method to display in the debugger. If omitted, the method name will be displayed as "anonymous" | -| 戻り値 | 4D.Method | <- | New Method shared object | +| 引数 | 型 | | 説明 | +| ------ | ------------------------- | :-------------------------: | -------------------------------------------------- | +| source | Text | -> | テキストとして表現された、オブジェクトとしてカプセル化される4D メソッド | +| name | Text | -> | デバッガに表示するメソッド名。 省略した場合、メソッド名は "anonymous" と表示されます。 | +| 戻り値 | 4D.Method | <- | 新規メソッド共有オブジェクト |
#### 説明 -The `4D.Method.new()` function creates and returns a new `4D.Method` object built from the *source* code. +`4D.Method.new()` 関数は、 *source* 引数のコードからビルドされた新しい `4D.Method` 型のオブジェクトを作成して返します。 -In the *source* parameter, pass the 4D source code of the method as text. All end-of-line characters are supported (LF, CR, CRLF) using the [`Char`](../commands/char) command or an [escape sequence](../Concepts/quick-tour.md#escape-sequences). +*source* 引数には、メソッドの4D ソースコードをテキストとして渡します。 [`Char`](../commands/char) コマンドまたは [エスケープシークエンス](../Concepts/quick-tour.md#エスケープシークエンス)を使用することで、全ての行末文字(LF、CR、CRLF)がサポートされています。 -In the optional *name* parameter, pass the name of the method to be displayed in the 4D debugger or Runtime explorer. If you omit this parameter, the method name will appear as "anonymous". +オプションの *name* 引数には、4D デバッガーあるいはランタイムエクスプローラーに表示されるメソッドの名前を渡します。 この引数を省略した場合、メソッド名は、 "anonymous" として表示されます。 :::tip diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/SystemWorkerClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/SystemWorkerClass.md index 329b28c6e29db0..ff883a6987f2b4 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/SystemWorkerClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/SystemWorkerClass.md @@ -7,9 +7,9 @@ title: SystemWorker `SystemWorker` クラスは、`4D` クラスストアにて提供されています。 -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### 例題 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPConnectionClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPConnectionClass.md index 410f0013ec5514..44bd5154090f54 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPConnectionClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPConnectionClass.md @@ -28,9 +28,9 @@ TCP 接続に関連したイベントを記録する[4DTCPUDPLog.txt ログフ ::: -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### 例題 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPListenerClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPListenerClass.md index f8c5efacd779d9..a9c7ebe081ec9c 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPListenerClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/TCPListenerClass.md @@ -17,9 +17,9 @@ title: TCPListener 全ての`TCPListener` クラス関数はスレッドセーフです。 -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### 例題 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/UDPSocketClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/UDPSocketClass.md index fee9e992f09b7a..d9a2c156bd1414 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/UDPSocketClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/UDPSocketClass.md @@ -23,9 +23,9 @@ UDP ソケットに関連したイベントを記録する[4DTCPUDPLog.txt ロ ::: -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### UDPSocket オブジェクト diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketClass.md index 47c062ce29e109..17c6dff37c89e0 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketClass.md @@ -15,9 +15,9 @@ WebSocketクライアント接続は、たとえばリアルタイムで財務 -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### 例題 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketServerClass.md b/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketServerClass.md index 3270f26dff43c9..f7ed1456d4eeeb 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketServerClass.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/API/WebSocketServerClass.md @@ -41,9 +41,9 @@ WebSocketプロトコルは、WebSocketサーバーとクライアント (Webブ [4D Webサーバー](WebServerClass.md) を起動しておく必要があります。 -### Aynchronous programming +### 非同期プログラミング -This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page. +このクラスは、[非同期実行](../Develop/async.md) のページで説明されているように、4D 内での非同期プログライミングをサポートしています。 ### 例題 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/classes.md b/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/classes.md index 158121debfb0c2..207464f2c6df8d 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/classes.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/classes.md @@ -37,62 +37,7 @@ $person:=cs.Person.new("John";"Doe") $hello:=$person.sayHello() // "Hello John Doe" ``` -## クラスの管理 - -### クラス定義 - -4D においてユーザークラスとは、`/Project/Sources/Classes/` フォルダーに保存された専用の [メソッド](methods.md) ファイル (.4dm) によって定義されます。 ファイル名がクラス名になります。 - -クラスを命名する際には、次のルールに留意してください: - -- [クラス名](identifiers.md#クラス) は [プロパティ名の命名規則](identifiers.md#オブジェクトプロパティ) に準拠している必要があります。 -- クラス名の大文字・小文字は区別されます。 -- 競合防止のため、データベースのテーブルと同じ名前のクラスを作成するのは推奨されないこと - -たとえば、"Polygon" という名前のクラスを定義するには、次のファイルを作成する必要があります: - -``` -Project フォルダー Project Sources Classes Polygon.4dm -``` - -### クラスの削除 - -既存のクラスを削除するには: - -- ディスク上で "Classes" フォルダーより .4dm クラスファイルを削除します。 -- 4D エクスプローラーでは、クラスを選択した状態で ![](../assets/en/Users/MinussNew.png) をクリックするか、コンテキストメニューより **移動** > **ゴミ箱** を選択します。 - -### 4D インターフェースの使用 - -**ファイル** メニューまたはエクスプローラーなど、4D インターフェースを介してクラスを作成した場合には、クラスファイルは自動的に適切な場所に保存されます。 - -#### ファイルメニューとツールバー - -4D 開発の **ファイル** メニューまたはツールバーより **新規** > **クラス...** を選択することで、開いているプロジェクトにクラスファイルを新規作成することができます。 - -**Ctrl+Shift+Alt+k** ショートカットも使用できます。 - -#### エクスプローラー - -エクスプローラーの **メソッド** ページにおいて、クラスは **クラス** カテゴリに分類されています。 - -クラスを新規作成するには次の方法があります: - -- **クラス** カテゴリを選択し、![](../assets/en/Users/PlussNew.png) ボタンをクリックします。 -- エクスプローラーウィンドウの下部にあるアクションメニュー、またはクラスグループのコンテキストメニューから **新規クラス...** を選択します。 - ![](../assets/en/Concepts/newClass.png) -- エクスプローラーのホームページのコンテキストメニューより **新規** > **クラス...** を選択します。 - -#### クラスのコードサポート - -各種 4Dウィンドウ (コードエディター、コンパイラー、デバッガー、ランタイムエクスプローラー) において、クラスコードは "特殊なプロジェクトメソッド" のように扱われます: - -- コードエディター: - - クラスは実行できません - - クラスメソッドはコードのブロックです - - オブジェクトメンバーに対する **定義に移動** 操作はクラスの Function 宣言を探します。例: "$o.f()" の場合、"Function f" を見つけます。 - - クラスのメソッド宣言に対する **参照箇所を検索** 操作は、そのメソッドがオブジェクトメンバーとして使われている箇所を探します。例: "Function f" の場合 "$o.f()" を見つけます。 -- ランタイムエクスプローラーおよびデバッガーにおいて、クラスメソッドは `` コンストラクターまたは `.` 形式で表示されます。 +Class files are managed through the 4D Explorer (see [Creating classes](../Project/code-overview.md#creating-classes)). ## クラスストア diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/methods.md b/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/methods.md index 91993e3f5a3020..37bf34233fb671 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/methods.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Concepts/methods.md @@ -13,277 +13,13 @@ title: メソッド 4D ランゲージにおいて、数種類のメソッドが存在します。 その呼び出し方によって、メソッドは区別されます: -| 型 | 自動呼び出しのコンテキスト | 引数の受け取り | 説明 | -| ------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | -| **プロジェクトメソッド** | 呼び出しに応じて ([プロジェクトメソッドの呼び出し](#calling-project-methods) 参照) | ◯ | 任意のアクションを実行するためのコードです。 作成されたプロジェクトメソッドは、そのプロジェクトのランゲージの一部となります。 | -| **オブジェクト (ウィジェット) メソッド** | メソッドが設定されたフォームオブジェクトに関連したイベント発生時に | × | フォームオブジェクト (ウィジェットとも呼びます) のプロパティです。 | -| **フォームメソッド** | メソッドが設定されたフォームに関連したイベント発生時に | × | フォームのプロパティです。 フォームメソッドを使用してデータとオブジェクトを管理することができます。ただし、これら目的には、オブジェクトメソッドを使用する方が通常は簡単であり、より効果的です。 | -| **トリガー** (別名 *テーブルメソッド*) | テーブルのレコード操作 (追加・削除・修正) の度に | × | テーブルのプロパティです。 トリガーは、データベースのレコードに対して「不正な」操作がおこなわれることを防ぎます。 | -| **データベースメソッド** | 作業セッションのイベント発生時に | ○ (既定) | 4D には 16のデータベースメソッドがあります。 | -| **クラス** | [**クラス関数**](classes.md#function) は、オブジェクトインスタンスのコンテキストにおいて呼び出されます。 | ◯ | クラス関数にはビルトインのものと (*例:* `collection.orderBy()` や `entity.save()`)、開発者によって作成されるものがあります。 [**クラス**](classes.md) 参照。 | +| 型 | 自動呼び出しのコンテキスト | 引数の受け取り | 説明 | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **プロジェクトメソッド** | 呼び出しに応じて ([プロジェクトメソッドの呼び出し](#calling-project-methods) 参照) | ◯ | 任意のアクションを実行するためのコードです。 作成されたプロジェクトメソッドは、そのプロジェクトのランゲージの一部となります。 | +| **オブジェクト (ウィジェット) メソッド** | メソッドが設定されたフォームオブジェクトに関連したイベント発生時に | × | フォームオブジェクト (ウィジェットとも呼びます) のプロパティです。 | +| **フォームメソッド** | メソッドが設定されたフォームに関連したイベント発生時に | × | フォームのプロパティです。 フォームメソッドを使用してデータとオブジェクトを管理することができます。ただし、これら目的には、オブジェクトメソッドを使用する方が通常は簡単であり、より効果的です。 | +| **トリガー** (別名 *テーブルメソッド*) | テーブルのレコード操作 (追加・削除・修正) の度に | × | テーブルのプロパティです。 トリガーは、データベースのレコードに対して「不正な」操作がおこなわれることを防ぎます。 | +| **データベースメソッド** | 作業セッションのイベント発生時に | ○ (既定) | 4D には 16のデータベースメソッドがあります。 | +| **クラス** | Automatically called when an object of the class is instanciated or when a function of the class is executed on an object instance in any other methods or in a [database field](../Develop/field-properties.md#class). | yes (class functions) | A **Class** is used to declare and configure the class [constructor](./classes.md#class-constructor), [properties](./classes.md#property*), and [functions](./classes.md#function) of objects. [**クラス**](classes.md) 参照。 | -## プロジェクトメソッドの呼び出し - -その実行方法や使用方法に応じて、プロジェクトメソッドは次のような役割を果たします: - -- サブルーチン -- オブジェクトフォーミュラ -- メニューメソッド -- プロセスメソッド -- イベントまたはエラー処理メソッド - -また、テスト目的などで、プロジェクトメソッドを手動で実行することもできます。 - -### サブルーチン - -サブルーチンは、処理の下請け的なプロジェクトメソッドです。 他のメソッドから呼ばれて、要求された処理を実行します。 関数は、呼び出し元のメソッドに値を返すサブルーチンのことです。 - -プロジェクトメソッドを作成すると、それは同データベースのランゲージの一部となります。 プロジェクトメソッドは、4Dのビルトインコマンドと同様に、ほかのメソッド (プロジェクトメソッドやオブジェクトメソッド) から呼び出すことができます。 このように使用されるプロジェクトメソッドをサブルーチンと呼びます。 - -サブルーチンは、以下のような目的で使います: - -- 重複コードの削減 -- メソッドの役割の明確化 -- メソッド改変の容易化 -- コードのモジュール化 - -たとえば、顧客データベースがあるとします。 プロジェクトをカスタマイズしていくうちに、顧客を検索してレコードを修正するという一連の作業を繰り返しおこなっていることに気づいたとします。 そのコーディングは以下のようになっています: - -```4d - // 顧客を検索します - QUERY BY EXAMPLE([Customers]) - // 入力フォームを選択します - FORM SET INPUT([Customers];"Data Entry") - // 顧客レコードを修正します - MODIFY RECORD([Customers]) -``` - -サブルーチンを使用しなければ、顧客レコード修正のたびにコードを作成しなければなりません。 プロジェクトの 10箇所で同じ処理が必要であれば、同じコーディングを 10回も書かねばなりません。 サブルーチンを使用すれば 1回コーディングするだけですみます。 これがコーディングの重複を減らすというサブルーチンの第一の利点です。 - -先ほど説明したコードが `MODIFY_CUSTOMER` と呼ばれるメソッドであるとすれば、他のメソッド内でそのメソッド名を使うことで実行できます。 たとえば、顧客のレコードを修正し、それからレコードをプリントするために、以下のようなメソッドを書くことができます: - -```4d - MODIFY_CUSTOMER - PRINT SELECTION([Customers]) -``` - -この機能はメソッドを劇的にに簡素化します。 さきほどの例で言えば、`MODIFY_CUSTOMER` メソッドがどのように動作するかは知る必要がなく、何をおこなうかだけ知っていればよいのです。 これはメソッドをサブルーチン化することの2番目の理由、役割の明確化です。 このように、作成されたメソッドは 4Dランゲージを拡張します。 - -このプロジェクトの例で顧客の検索方法を変える場合、10箇所ではなく、たった1つのメソッドを変更するだけですみます。 これがサブルーチンを使うもう一つの理由、改変の容易化です。 - -また、サブルーチンの利用はコードをモジュール化します。 これはコードをモジュール (サブルーチン) に分割することを意味し、それぞれは論理的な処理を実行します。 小切手振り出し口座のプロジェクトから、以下のコードを見てみましょう: - -```4d - FIND_CLEARED_CHECKS // 決済された小切手の検索 - RECONCILE_ACCOUNT // 口座の照合 - PRINT_CHECK_BOOK_REPORT // レポートの印刷 -``` - -プロジェクトの詳細を知らない人でも、このプログラムが何をしているかはわかります。 各サブルーチンの処理手順を知る必要はありません。 各サブルーチンは長く、複雑な処理で構成されていることもありますが、それらが何を実行するのかだけを知っていれば十分なのです。 プログラムを論理的な処理単位やモジュールにできるだけ分割することをお勧めします。 - -### オブジェクトフォーミュラ - -プロジェクトメソッドは、**フォーミュラ** オブジェクトにカプセル化して、オブジェクトから呼び出すことができます。 - -`Formula` または `Formula from string` コマンドを使用すると、オブジェクトプロパティに格納可能な、ネイティブなフォーミュラオブジェクトを作成することができます: つまり、カスタムなオブジェクトメソッドを実装することが可能です。 - -オブジェクトプロパティに保存されているメソッドを実行するには、プロパティ名のあとに **()** をつけます。 例: - -```4d -// myAlert プロジェクトメソッド -ALERT("Hello world!") -``` - -この `myAlert` プロジェクトメソッドを任意のオブジェクトに格納し、呼び出すことができます: - -```4d -var $o : Object -$o:=New object("custom_Alert";Formula(myAlert)) -$o.custom_Alert() // "Hello world!" と表示します -``` - -大カッコを使用したシンタックスもサポートされます: - -```4d -$o["custom_Alert"]() // "Hello world!" と表示します -``` - -$1, $2, .... を使用して呼び出すことで、[フォーミュラに 引数を渡す](Concepts/parameters.md) こともできます (4D プロジェクトメソッドと同様): - -```4d -//fullName メソッド -C_TEXT($0;$1;$2) -$0:=$1+" "+$2 -``` - -`fullName` メソッドをオブジェクトに格納し、呼び出します: - -```4d -var $o : Object -$o:=New object("full_name";Formula(fullName)) -$result:=$o.full_name("John";"Smith") -//$result = "John Smith" -// $result:=fullName("param1";"param2") と同義です -``` - -`This` 関数と組み合わせることで、オブジェクトメソッドを利用した汎用的なコードを書くことができます。 例: - -```4d -//fullName2 メソッド -C_TEXT($0) -$0:=This.firstName+" "+This.lastName -``` - -このメソッドをオブジェクトに格納すると、オブジェクトの新しい計算属性のように使えます: - -```4d -var $o : Object -$o:=New object("firstName";"Jim";"lastName";"Wesson") -$o.fullName:=Formula(fullName2) // メソッドをオブジェクトに追加します - -$result:=$o.fullName() -// $result = "Jim Wesson" -``` - -たとえ引数を受け取らなかったとしても、オブジェクトメソッドを実行するためにはカッコ `()` をつけて呼び出す必要があるという点に注意してください。 オブジェクトプロパティのみを呼び出した場合、フォーミュラへの新しい参照が返されます (そしてフォーミュラは実行はされません): - -```4d -$o:=$f.message // $o にはフォーミュラオブジェクトが返されます -``` - -### メニューメソッド - -メニューメソッドは、カスタムメニューから呼び出されるプロジェクトメソッドです。 メニューエディターまたは "メニュー" テーマのコマンドを使用して、メニューにメソッドを割り当てます。 メニューが選択されると、それに対応するメニューメソッドが実行されます。 特定の処理を実行するメニューメソッドを割り当てたカスタムメニューを作成することで、デスクトップアプリケーションのユーザーインターフェースをカスタマイズすることができます。 - -メニューメソッドにより、単一または複数の処理を実行することができます。 たとえば、データ入力のメニューに、以下の2つの処理を実行するメソッドを割り当てられます。まず適切な入力フォームを表示し、次にユーザーがキャンセルするまでの間 `ADD RECORD` コマンドによるデータ入力を繰り返します。 - -連続した処理の自動化は、プログラミング言語の強力な機能の 1つです。 カスタムメニューを使用することで処理を自動化することができ、アプリケーションのユーザーにより多くのガイダンスを提供することができます。 - -### プロセスメソッド - -**プロセスメソッド** とは、プロセスの開始時に呼び出されるプロジェクトメソッドのことです。 ワーカープロセスの場合を除いて、プロセスはプロセスメソッドが実行されている間だけ存続します。 メニューに属するメニューメソッドのプロパティとして *新規プロセス開始* をチェックしている場合、そのメニューメソッドは新規プロセスのプロセスメソッドでもあります。 - -### イベント・エラー処理メソッド - -**イベント処理メソッド** は、イベントを処理するプロセスメソッドとして、分離されたプロセス内で実行されます。 通常、開発者はイベント管理の大部分を 4Dに任せます。 たとえば、データ入力中にキーストロークやクリックを検出した 4Dは、正しいオブジェクトとフォームメソッドを呼び出します。このため開発者は、これらのメソッド内でイベントに対し適切に応答できるのです。 詳細については `ON EVENT CALL` コマンドの説明を参照してください。 - -**エラー処理メソッド** は、割り込みを実行するプロジェクトメソッドです。 エラーや例外が発生するたびに呼び出されます。 詳細については、[エラー処理](error-handling.md) を参照ください。 - -### 手動での実行 - -アプリケーションに定義されたプロジェクトメソッドは通常、アプリケーションの使用中にボタンやメニュー、他のメソッドなどから自動的に呼び出されます。 データベースメソッドについては、アプリケーションで発生する特定のイベントに反応して実行されます。 - -しかし、テストやデバッグの目的で、プロジェクトメソッドや特定のデータベースメソッドをデザインモードで実行することができます。 この場合、メソッドを新規プロセスで実行するか、または直接デバッグモードで一行ごと実行できます。 - -メソッド実行は 2つの方法でおこなえます: - -- コードエディターウィンドウからメソッド実行 -- メソッド実行ダイアログボックスから実行 (プロジェクトメソッドのみ) - -#### コードエディターからメソッド実行 - -[**コードエディター**](../code-editor/write-class-method.md) ウィンドウには、そのエディターで開かれているメソッドを実行するためのボタンがあります。 このボタンに関連付けられているメニューから実行オプションを選択できます。 - -このボタンは、プロジェクトメソッドと以下のデータベースメソッドでのみ利用できます: - -- On Startup -- On Exit -- On Server Startup -- On Server Shutdown - -詳細は [ツールバー](../code-editor/write-class-method.md#ツールバー) を参照ください。 - -#### メソッド実行ダイアログボックスから実行 - -**実行** メニューから **メソッド...** コマンドを選択すると、**メソッド実行** ダイアログボックスが表示されます。 - -このダイアログボックスには、データベースのプロジェクトメソッド (コンポーネントの共有メソッドを含む) が表示されます。 一方、非表示属性が設定されたプロジェクトメソッドは表示されません。 - -プロジェクトメソッドを実行するには、リストからメソッドを選択し、**実行** をクリックします。 デバッグモードでメソッドを実行するには **デバッグ** をクリックします。 デバッガーに関する詳細は、[デバッガー](../Debugging/basics.md) の章を参照ください。 - -**新規プロセス** チェックボックスを選択すると、選択したメソッドは新規に作成されたプロセス内で実行されます。 大量の印刷など時間のかかる処理をメソッドがおこなう場合でもこのオプションを使用すれば、レコードの追加、グラフの作成などの処理をアプリケーションプロセスで継続できます。 プロセスに関するより詳細な情報については、[プロセス](../Develop/processes.md) を参照してください。 - -**4D Serverに関する注記**: - -- クライアントではなくサーバー上でメソッドを実行したい場合、実行モードメニューで **4D Server** を選択します。 この場合 *ストアドプロシージャー* と呼ばれるプロセスが新規にサーバー上で作成され、メソッドが実行されます。 このオプションを使用して、ネットワークトラフィックを減らしたり、4D Serverの動作を最適化したりできます (特にディスクに格納されたデータにアクセスする場合など)。 すべてのタイプのメソッドをサーバー上や他のクライアント上で実行できますが、ユーザーインターフェースを変更するものは例外です。 この場合、ストアドプロシージャーは効果がありません。 -- 他のクライアントマシン上でメソッドを実行するよう選択することもできます。 他のクライアントマシンは、事前に登録されていなければメニューに表示されません (詳細な情報については [REGISTER CLIENT](../commands/register-client) の説明を参照ください)。 - -デフォルトでは、**ローカル** オプションが選択されています。 4D シングルユーザーの場合、このオプションしか選択できません。 - -## プロジェクトメソッドの再帰呼び出し - -プロジェクトメソッドは、自分自身を呼び出すことができます。 例: - -- メソッドAがメソッドBを呼び出し、メソッドBはメソッドAを呼び出します。 -- メソッドAは自身を呼び出すことができます。 - -これは再帰呼び出しと呼ばれています。 4D ランゲージは再帰呼び出しを完全にサポートしています。 - -次に例を示します。 以下のフィールドから成る `[Friends and Relatives]` テーブルがあります: - -- `[Friends and Relatives]Name` -- `[Friends and Relatives]ChildrensName` - -この例題では、フィールドの値は重複しない、つまり同じ名前の人間はいないとします。 名前を指定することで、以下のような文を作成します: “A friend of mine, John who is the child of Paul who is the child of Jane who is the child of Robert who is the child of Eleanor, does this for a living!”: - -1. この文を以下のように作成できます: - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - $vtTheWholeStory:="A friend of mine, "+$vsName - Repeat - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) - $vlQueryResult:=Records in selection([Friends and Relatives]) - If($vlQueryResult>0) - $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name - $vsName:=[Friends and Relatives]Name - End if - Until($vlQueryResult=0) - $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" - ALERT($vtTheWholeStory) - End if - End if -``` - -2. 以下の方法でも作成できます: - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") - End if - End if -``` - -再帰関数 `Genealogy of` は以下の通りです: - -```4d - ` Genealogy of project method - ` Genealogy of ( String ) -> Text - ` Genealogy of ( Name ) -> Part of sentence - - $0:=$1 - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$1) - If(Records in selection([Friends and Relatives])>0) - $0:=$0+" who is the child of "+Genealogy of([Friends and Relatives]Name) - End if -``` - -`Genealogy of` メソッドが自分自身を呼び出していることに注目してください。 - -最初に挙げた方法は **反復性のアルゴリズム** です。 2番目に挙げた方法は **再帰呼び出しのアルゴリズム** です。 - -前述の例題のようなコードを実装する場合、反復性や再帰呼び出しを使用してメソッドを書くことができるということに留意してください。 再帰呼び出しは一般的に、より明瞭で読みやすく、維持しやすいコードを提供します。ただし、この使用は必須ではありません。 - -4D内での再帰呼び出しの代表的な使用方法は以下のとおりです: - -- 例題と同じく、互いに関連するテーブル内でのレコードの取り扱い。 -- `FOLDER LIST` と `DOCUMENT LIST` コマンドを使用して、ディスク上にあるドキュメントとフォルダーをブラウズする。 フォルダーにはフォルダーとドキュメントが含まれており、サブフォルダーはまたフォルダーとドキュメントを含むことができます。 - -**重要:** 再帰呼び出しは、必ずある時点で終了する必要があります。 たとえば、`Genealogy of` メソッドが自身の呼び出しを止めるのは、クエリがレコードを返さないときです。 この条件のテストをしないと、メソッドは際限なく自身を呼び出します。 (メソッド内で使用される引数やローカル変数の蓄積を含む) 再帰呼び出しによって容量が一杯になると、最終的に 4Dは “スタックがいっぱいです” エラーを返します 。 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Project/code-overview.md b/i18n/ja/docusaurus-plugin-content-docs/current/Project/code-overview.md index e3ef08ea72e50f..d52239d1488e2c 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/Project/code-overview.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Project/code-overview.md @@ -1,6 +1,6 @@ --- id: code-overview -title: メソッドとクラスの作成 +title: Managing Methods and Classes --- プロジェクトで使用される 4D コードは、 [メソッド](../Concepts/methods.md) および [クラス](../Concepts/classes.md) に記述されます。 @@ -11,20 +11,86 @@ title: メソッドとクラスの作成 4D のメソッドは、[`/Project/Sources/`](../Project/architecture.md#sources) フォルダーの適切なフォルダー内の **.4dm** ファイルに格納されます。 -[いくつかの種類のメソッド](../Concepts/methods.md) を作成することができます: +[いくつかの種類のメソッド](../Concepts/methods.md#method-types) を作成することができます: - すべてのメソッドは、**エクスプローラー** ウィンドウから作成または開くことができます ([フォームエディター](../FormEditor/formEditor.md) から管理されるオブジェクトメソッドを除く)。 - プロジェクトメソッドは、**ファイル** メニューやツールバー (**新規/メソッド...** または **開く/メソッド...**)、[コードエディターウィンドウ](../code-editor/write-class-method.md#ショートカット) のショートカットを使っても作成したり開いたりできます。 -- トリガーは、ストラクチャーエディターからも作成したり開いたりできます。 +- **Triggers** can also be created or opened from the [Structure editor](../Develop-legacy/triggers.md#activating-and-creating-a-trigger). - フォームメソッドは、[フォームエディター](../FormEditor/formEditor.md) からも作成したり開いたりできます。 ## クラスの作成 -4D においてユーザークラスとは、[`/Project/Sources/Classes/`](../Project/architecture.md#sources) フォルダーに保存された専用のメソッドファイル (**.4dm**) によって定義されます。 ファイル名がクラス名になります。 +### User classes -クラスファイルは、**ファイル** メニューやツールバー (**新規/クラス...**)、あるいは **エクスプローラー** ウィンドウの **メソッド** ページにて作成可能です。 +4D においてユーザークラスとは、[`/Project/Sources/Classes/`](../Project/architecture.md#sources) フォルダーに保存された専用のメソッドファイル (**.4dm**) によって定義されます。 ファイル名がクラス名になります。 For example, a class named "Polygon" will be stored in the following file: -詳細については、[クラス](../Concepts/classes.md) を参照してください。 +``` +Project フォルダー Project Sources Classes Polygon.4dm +``` + +You can create a class file from the **File** menu or toolbar (**New > Class...**) or in the **Methods** page of the **Explorer** window. **Ctrl+Shift+Alt+k** ショートカットも使用できます。 + +エクスプローラーの **メソッド** ページにおいて、クラスは **クラス** カテゴリに分類されています。 + +クラスを新規作成するには次の方法があります: + +- **クラス** カテゴリを選択し、![](../assets/en/Users/PlussNew.png) ボタンをクリックします。 +- エクスプローラーウィンドウの下部にあるアクションメニュー、またはクラスグループのコンテキストメニューから **新規クラス...** を選択します。 + ![](../assets/en/Concepts/newClass.png) +- エクスプローラーのホームページのコンテキストメニューより **新規** > **クラス...** を選択します。 + +クラスを命名する際には、次のルールに留意してください: + +- A [class name](../Concepts/identifiers.md#classes) must be compliant with [property naming rules](../Concepts/identifiers.md#object-properties). +- クラス名の大文字・小文字は区別されます。 +- 競合防止のため、データベースのテーブルと同じ名前のクラスを作成するのは推奨されないこと + +### ORDA classes + +[ORDA data model user classes](../ORDA/ordaClasses.md) are high-level class functions created above the data model. + +An ORDA data model class is defined by adding, at the same location as regular class files (*i.e.* in the `/Sources/Classes` folder of the project folder), a .4dm file with the name of the class. たとえば、`Utilities` データクラスのエンティティクラスは、`UtilitiesEntity.4dm` ファイルによって定義されます。 + +各データモデルオブジェクトに関わるクラスは、4D によってあらかじめ自動的にメモリ内に作成されます。 + +![](../assets/en/ORDA/ORDA_Classes-3.png) + +空の ORDA クラスは、デフォルトではエクスプローラーに表示されません。 表示するにはエクスプローラーのオプションメニューより **データクラスを全て表示** を選択します: ![](../assets/en/ORDA/showClass.png) + +ORDA ユーザークラスは通常のクラスとは異なるアイコンで表されます。 空のクラスは薄く表示されます: + +![](../assets/en/ORDA/classORDA2.png) + +ORDA クラスファイルを作成するには、エクスプローラーで任意のクラスをダブルクリックします。 4D creates the class file and add the [`extends`](../Concepts/classes.md#class-extends-classname) code. たとえば、Entity クラスを継承するクラスの場合は: + +``` +Class extends Entity +``` + +定義されたクラスはエクスプローラー内で濃く表示されます。 + +定義された ORDA クラスファイルを 4Dコードエディターで開くには、ORDA クラス名を選択してエクスプローラーのオブションメニュー、またはコンテキストメニューの **編集...** を使用するか、ORDA クラス名をダブルクリックします: + +![](../assets/en/ORDA/classORDA4.png) + +ローカルデータストア (`ds`) に基づいた ORDA クラスの場合には、4D ストラクチャーウィンドウからも直接クラスコードにアクセスできます: + +![](../assets/en/ORDA/classORDA5.png) + +### 4D IDE (統合開発環境) におけるサポート + +各種 4Dウィンドウ (コードエディター、コンパイラー、デバッガー、ランタイムエクスプローラー) において、クラスコードは "特殊なプロジェクトメソッド" のように扱われます: + +- コードエディター: + - クラスは実行できません + - クラスメソッドはコードのブロックです + - オブジェクトメンバーに対する **定義に移動** 操作はクラスの Function 宣言を探します。例: "$o.f()" の場合、"Function f" を見つけます。 + - クラスのメソッド宣言に対する **参照箇所を検索** 操作は、そのメソッドがオブジェクトメンバーとして使われている箇所を探します。例: "Function f" の場合 "$o.f()" を見つけます。 + - variables typed as a user or ORDA class automatically benefit from autocompletion features. Entity クラス変数の例です: + +![](../assets/en/ORDA/AutoCompletionEntity.png) + +- ランタイムエクスプローラーおよびデバッガーにおいて、クラスメソッドは `` コンストラクターまたは `.` 形式で表示されます。 ## メソッドやクラスの削除 @@ -35,3 +101,70 @@ title: メソッドとクラスの作成 > オブジェクトメソッドを削除するには、[フォームエディター](../FormEditor/formEditor.md) で、**オブジェクト** メニューから **オブジェクトメソッド消去** を選択します。 +## Design Object Access commands + +You can access the contents and paths of all methods in your applications by programming, thanks to the [**"Design Object Access" command theme**](../commands/theme/Design_Object_Access.md). This source toolkit facilitates the integration into your applications of code control tools and more particularly version control systems (VCS). It also lets you implement advanced systems for [code documentation](../Project/documentation.md), for building a custom explorer or for organizing scheduled backups of the code saved as disk files. + +The following principles are implemented: + +- Each method and form in a 4D application has its own address in the form of a pathname. For example, the trigger method for table 1 can be found at "[trigger]/table_1". Each object pathname is unique in an application. +- You can access objects in the 4D application using the commands of the **"Design Object Access"** command theme, for example [`METHOD GET NAMES`](../commands/method-get-names) or [`METHOD GET PATHS`](../commands/method-get-paths). +- Most of the commands in this theme work in both [interpreted and compiled](../Concepts/interpreted.md) mode. However, commands that modify properties or access contents executable from methods can only be used in interpreted mode (see the table below). +- You can use all the commands of this theme with 4D in local or remote mode. However, keep in mind that you cannot use certain commands in compiled mode: the purpose of this theme is to create custom development support tools. You must not use these commands to dynamically change the functioning of a database that is running. For example, you cannot use [`METHOD SET ATTRIBUTE`](../commands/method-set-attribute) to change a method attribute according to the status of the current user. +- When a command of this theme is called from a [component](../Project/components.md), by default it accesses the component objects. In this case, to access objects of the host, you just pass a `*` as the last parameter. + +### Use in compiled mode + +For reasons related to the principle of the compilation process, only certain commands in this theme can be used in compiled mode. The following table indicates the available of the commands in compiled mode: + +| コマンド | Can be used in compiled mode | +| ------------------------------------------------------------------------ | ---------------------------- | +| [Current method path](../commands/current-method-path) | ◯ | +| [FORM GET NAMES](../commands/form-get-names) | ◯ | +| [METHOD Get attribute](../commands/method-get-attribute) | ◯ | +| [METHOD GET ATTRIBUTES](../commands/method-get-attributes) | ◯ | +| [METHOD GET CODE](../commands/method-get-code) | × | +| [METHOD GET COMMENTS](../commands/method-get-comments) | ◯ | +| [METHOD GET FOLDERS](../commands/method-get-folders) | ◯ | +| [METHOD GET MODIFICATION DATE](../commands/method-get-modification-date) | ◯ | +| [METHOD GET NAMES](../commands/method-get-names) | ◯ | +| [METHOD Get path](../commands/method-get-path) | ◯ | +| [METHOD GET PATHS](../commands/method-get-paths) | ◯ | +| [METHOD GET PATHS FORM](../commands/method-get-paths-form) | ◯ | +| [METHOD OPEN PATH](../commands/method-open-path) | × | +| [METHOD RESOLVE PATH](../commands/method-resolve-path) | ◯ | +| [METHOD SET ACCESS MODE](../commands/method-set-access-mode) | ◯ | +| [METHOD SET ATTRIBUTE](../commands/method-set-attribute) | × | +| [METHOD SET ATTRIBUTES](../commands/method-set-attributes) | × | +| [METHOD SET CODE](../commands/method-set-code) | × | +| [METHOD SET COMMENTS](../commands/method-set-comments) | × | + +:::note + +The error -9762 "The command cannot be executed in a compiled database." is generated when the command is executed in compiled mode. + +::: + +### Creation of pathnames + +Pathnames generated for 4D objects must be compatible with the file management of the operating system. Characters that are forbidden at the OS level such as ":" are automatically encoded in method names, so that generated files may be integrated automatically in a version control system. + +Here are the encoded characters: + +| 文字 | Encoding | +| ---------------------------- | -------- | +| " | %22 | +| \* | %2A | +| / | %2F | +| : | %3A | +| \< | %3C | +| \> | %3E | +| ? | %3F | +| \\| | %7C | +| \\ | %5C | +| % | %25 | + +#### 例題 + +`Form?1` is encoded `Form%3F1` +`Button/1` is encoded `Button%2F1` \ No newline at end of file diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Project/project-method-properties.md b/i18n/ja/docusaurus-plugin-content-docs/current/Project/project-method-properties.md index 7cb2e9caac3340..6d3d269c960f2b 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/Project/project-method-properties.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Project/project-method-properties.md @@ -1,8 +1,250 @@ --- id: project-method-properties -title: プロジェクトメソッドプロパティ +title: プロジェクトメソッド --- +## Roles + +その実行方法や使用方法に応じて、プロジェクトメソッドは次のような役割を果たします: + +- サブルーチン +- オブジェクトフォーミュラ +- メニューメソッド +- プロセスメソッド +- イベントまたはエラー処理メソッド +- APIs to be called from the web server, transformation tags, extensions... +- また、テスト目的などで、プロジェクトメソッドを手動で実行することもできます。 + +### サブルーチン + +サブルーチンは、処理の下請け的なプロジェクトメソッドです。 他のメソッドから呼ばれて、要求された処理を実行します。 関数は、呼び出し元のメソッドに値を返すサブルーチンのことです。 + +プロジェクトメソッドを作成すると、それは同データベースのランゲージの一部となります。 プロジェクトメソッドは、4Dのビルトインコマンドと同様に、ほかのメソッド (プロジェクトメソッドやオブジェクトメソッド) から呼び出すことができます。 このように使用されるプロジェクトメソッドをサブルーチンと呼びます。 + +サブルーチンは、以下のような目的で使います: + +- 重複コードの削減 +- メソッドの役割の明確化 +- メソッド改変の容易化 +- コードのモジュール化 + +たとえば、顧客データベースがあるとします。 プロジェクトをカスタマイズしていくうちに、顧客を検索してレコードを修正するという一連の作業を繰り返しおこなっていることに気づいたとします。 そのコーディングは以下のようになっています: + +```4d + // 顧客を検索します + QUERY BY EXAMPLE([Customers]) + // 入力フォームを選択します + FORM SET INPUT([Customers];"Data Entry") + // 顧客レコードを修正します + MODIFY RECORD([Customers]) +``` + +サブルーチンを使用しなければ、顧客レコード修正のたびにコードを作成しなければなりません。 プロジェクトの 10箇所で同じ処理が必要であれば、同じコーディングを 10回も書かねばなりません。 サブルーチンを使用すれば 1回コーディングするだけですみます。 これがコーディングの重複を減らすというサブルーチンの第一の利点です。 + +先ほど説明したコードが `MODIFY_CUSTOMER` と呼ばれるメソッドであるとすれば、他のメソッド内でそのメソッド名を使うことで実行できます。 たとえば、顧客のレコードを修正し、それからレコードをプリントするために、以下のようなメソッドを書くことができます: + +```4d + MODIFY_CUSTOMER + PRINT SELECTION([Customers]) +``` + +この機能はメソッドを劇的にに簡素化します。 さきほどの例で言えば、`MODIFY_CUSTOMER` メソッドがどのように動作するかは知る必要がなく、何をおこなうかだけ知っていればよいのです。 これはメソッドをサブルーチン化することの2番目の理由、役割の明確化です。 このように、作成されたメソッドは 4Dランゲージを拡張します。 + +このプロジェクトの例で顧客の検索方法を変える場合、10箇所ではなく、たった1つのメソッドを変更するだけですみます。 これがサブルーチンを使うもう一つの理由、改変の容易化です。 + +また、サブルーチンの利用はコードをモジュール化します。 これはコードをモジュール (サブルーチン) に分割することを意味し、それぞれは論理的な処理を実行します。 小切手振り出し口座のプロジェクトから、以下のコードを見てみましょう: + +```4d + FIND_CLEARED_CHECKS // 決済された小切手の検索 + RECONCILE_ACCOUNT // 口座の照合 + PRINT_CHECK_BOOK_REPORT // レポートの印刷 +``` + +プロジェクトの詳細を知らない人でも、このプログラムが何をしているかはわかります。 各サブルーチンの処理手順を知る必要はありません。 各サブルーチンは長く、複雑な処理で構成されていることもありますが、それらが何を実行するのかだけを知っていれば十分なのです。 プログラムを論理的な処理単位やモジュールにできるだけ分割することをお勧めします。 + +### オブジェクトフォーミュラ + +プロジェクトメソッドは、**フォーミュラ** オブジェクトにカプセル化して、オブジェクトから呼び出すことができます。 + +The [`Formula`](../commands/formula) or [`Formula from string`](../commands/formula-from-string) commands allow you to create [native formula objects](../API/FormulaClass.md) that you can encapsulate in object properties. つまり、カスタムなオブジェクトメソッドを実装することが可能です。 + +オブジェクトプロパティに保存されているメソッドを実行するには、プロパティ名のあとに **()** をつけます。 例: + +```4d +// myAlert プロジェクトメソッド +ALERT("Hello world!") +``` + +この `myAlert` プロジェクトメソッドを任意のオブジェクトに格納し、呼び出すことができます: + +```4d +var $o : Object +$o:=New object("custom_Alert";Formula(myAlert)) +$o.custom_Alert() // "Hello world!" と表示します +``` + +大カッコを使用したシンタックスもサポートされます: + +```4d +$o["custom_Alert"]() // "Hello world!" と表示します +``` + +For more information, see the [`4D.Formula` class description](../API/FormulaClass.md) and the [Using object properties as named parameters](../Concepts/parameters.md#using-object-properties-as-named-parameters) paragraph. + +### メニューメソッド + +メニューメソッドは、カスタムメニューから呼び出されるプロジェクトメソッドです。 You assign the method to the menu command using the Menu editor or a [command of the "Menus" theme](../commands/theme/Menus.md). メニューが選択されると、それに対応するメニューメソッドが実行されます。 特定の処理を実行するメニューメソッドを割り当てたカスタムメニューを作成することで、デスクトップアプリケーションのユーザーインターフェースをカスタマイズすることができます。 + +メニューメソッドにより、単一または複数の処理を実行することができます。 For example, a menu command for entering records might call a method that performs two tasks: displaying the appropriate input form, and calling the [`ADD RECORD`(../commands/add-record)] command until the user cancels the data entry activity. + +Automating sequences of activities is a very powerful capability of the 4D programming language. カスタムメニューを使用することで処理を自動化することができ、アプリケーションのユーザーにより多くのガイダンスを提供することができます。 + +### プロセスメソッド + +**プロセスメソッド** とは、プロセスの開始時に呼び出されるプロジェクトメソッドのことです。 The process lasts only as long as the process method continues to execute, except if it is a [Worker process](../Develop/processes.md#worker-processes). Note that a menu method attached to a menu command with [*Start a New Process*](../Menus/properties.md#start-a-new-process) property is also the process method for the newly started process. + +### イベント・エラー処理メソッド + +**イベント処理メソッド** は、イベントを処理するプロセスメソッドとして、分離されたプロセス内で実行されます。 通常、開発者はイベント管理の大部分を 4Dに任せます。 たとえば、データ入力中にキーストロークやクリックを検出した 4Dは、正しいオブジェクトとフォームメソッドを呼び出します。このため開発者は、これらのメソッド内でイベントに対し適切に応答できるのです。 For more information, see the description of the command [`ON EVENT CALL`](../commands/on-event-call). + +**エラー処理メソッド** は、割り込みを実行するプロジェクトメソッドです。 エラーや例外が発生するたびに呼び出されます。 詳細については、[エラー処理](../Concepts/error-handling.md) を参照ください。 + +### API Methods + +Project methods can be called from external contexts such as other applications, web apps, processed files, etc., in which case they can be seen as API. Such calls include: + +- calls to the web server through [http request handlers](../WebServer/http-request-handler.md) or [`4DACTION` URLs](../WebServer/httpRequests.md#4daction), +- [tag processing](../Tags/transformation-tags.md) +- expressions called from extensions ([4D Write Pro](../WritePro/commands/wp-insert-formula.md), [4D View Pro](../ViewPro/formulas.md) or form objects (e.g. [`ST INSERT EXPRESSION`](../commands/st-insert-expression)). + +External calls to project methods must be allowed in the [project method properties](../Project/project-method-properties.md). + +### 手動での実行 + +アプリケーションに定義されたプロジェクトメソッドは通常、アプリケーションの使用中にボタンやメニュー、他のメソッドなどから自動的に呼び出されます。 データベースメソッドについては、アプリケーションで発生する特定のイベントに反応して実行されます。 + +しかし、テストやデバッグの目的で、プロジェクトメソッドや特定のデータベースメソッドをデザインモードで実行することができます。 この場合、メソッドを新規プロセスで実行するか、または直接デバッグモードで一行ごと実行できます。 + +メソッド実行は 2つの方法でおこなえます: + +- コードエディターウィンドウからメソッド実行 +- メソッド実行ダイアログボックスから実行 (プロジェクトメソッドのみ) + +#### コードエディターからメソッド実行 + +[**コードエディター**](../code-editor/write-class-method.md) ウィンドウには、そのエディターで開かれているメソッドを実行するためのボタンがあります。 このボタンに関連付けられているメニューから実行オプションを選択できます。 + +このボタンは、プロジェクトメソッドと以下のデータベースメソッドでのみ利用できます: + +- On Startup +- On Exit +- On Server Startup +- On Server Shutdown + +詳細は [ツールバー](../code-editor/write-class-method.md#ツールバー) を参照ください。 + +#### メソッド実行ダイアログボックスから実行 + +**実行** メニューから **メソッド...** コマンドを選択すると、**メソッド実行** ダイアログボックスが表示されます。 + +このダイアログボックスには、データベースのプロジェクトメソッド (コンポーネントの共有メソッドを含む) が表示されます。 一方、非表示属性が設定されたプロジェクトメソッドは表示されません。 + +プロジェクトメソッドを実行するには、リストからメソッドを選択し、**実行** をクリックします。 デバッグモードでメソッドを実行するには **デバッグ** をクリックします。 デバッガーに関する詳細は、[デバッガー](../Debugging/basics.md) の章を参照ください。 + +**新規プロセス** チェックボックスを選択すると、選択したメソッドは新規に作成されたプロセス内で実行されます。 大量の印刷など時間のかかる処理をメソッドがおこなう場合でもこのオプションを使用すれば、レコードの追加、グラフの作成などの処理をアプリケーションプロセスで継続できます。 プロセスに関するより詳細な情報については、[プロセス](../Develop/processes.md) を参照してください。 + +**4D Serverに関する注記**: + +- クライアントではなくサーバー上でメソッドを実行したい場合、実行モードメニューで **4D Server** を選択します。 この場合 *ストアドプロシージャー* と呼ばれるプロセスが新規にサーバー上で作成され、メソッドが実行されます。 このオプションを使用して、ネットワークトラフィックを減らしたり、4D Serverの動作を最適化したりできます (特にディスクに格納されたデータにアクセスする場合など)。 すべてのタイプのメソッドをサーバー上や他のクライアント上で実行できますが、ユーザーインターフェースを変更するものは例外です。 この場合、ストアドプロシージャーは効果がありません。 +- 他のクライアントマシン上でメソッドを実行するよう選択することもできます。 他のクライアントマシンは、事前に登録されていなければメニューに表示されません (詳細な情報については [REGISTER CLIENT](../commands/register-client) の説明を参照ください)。 + +デフォルトでは、**ローカル** オプションが選択されています。 4D シングルユーザーの場合、このオプションしか選択できません。 + +### プロジェクトメソッドの再帰呼び出し + +プロジェクトメソッドは、自分自身を呼び出すことができます。 例: + +- メソッドAがメソッドBを呼び出し、メソッドBはメソッドAを呼び出します。 +- メソッドAは自身を呼び出すことができます。 + +これは再帰呼び出しと呼ばれています。 4D ランゲージは再帰呼び出しを完全にサポートしています。 + +次に例を示します。 以下のフィールドから成る `[Friends and Relatives]` テーブルがあります: + +- `[Friends and Relatives]Name` +- `[Friends and Relatives]ChildrensName` + +この例題では、フィールドの値は重複しない、つまり同じ名前の人間はいないとします。 名前を指定することで、以下のような文を作成します: “A friend of mine, John who is the child of Paul who is the child of Jane who is the child of Robert who is the child of Eleanor, does this for a living!”: + +1. この文を以下のように作成できます: + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + var $vtTheWholeStory:="A friend of mine, "+$vsName + var $vlQueryResult : Integer + Repeat + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) + $vlQueryResult:=Records in selection([Friends and Relatives]) + If($vlQueryResult>0) + $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name + $vsName:=[Friends and Relatives]Name + End if + Until($vlQueryResult=0) + $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" + ALERT($vtTheWholeStory) + End if + End if +``` + +2. 以下の方法でも作成できます: + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") + End if + End if +``` + +再帰関数 `Genealogy of` は以下の通りです: + +```4d + //Genealogy of project method + //Genealogy of ( String ) -> Text + //Genealogy of ( Name ) -> Part of sentence + + #DECLARE($name : Text) -> $result : Text + $result:=$name + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$name) + If(Records in selection([Friends and Relatives])>0) + $result:=$result+" who is the child of "+Genealogy of([Friends and Relatives]Name) + End if +``` + +`Genealogy of` メソッドが自分自身を呼び出していることに注目してください。 + +最初に挙げた方法は **反復性のアルゴリズム** です。 2番目に挙げた方法は **再帰呼び出しのアルゴリズム** です。 + +前述の例題のようなコードを実装する場合、反復性や再帰呼び出しを使用してメソッドを書くことができるということに留意してください。 再帰呼び出しは一般的に、より明瞭で読みやすく、維持しやすいコードを提供します。ただし、この使用は必須ではありません。 + +4D内での再帰呼び出しの代表的な使用方法は以下のとおりです: + +- 例題と同じく、互いに関連するテーブル内でのレコードの取り扱い。 +- Browsing documents and folders on your disk, using the commands [`FOLDER LIST`](../commands/folder-list) and [`DOCUMENT LIST`](document-list). フォルダーにはフォルダーとドキュメントが含まれており、サブフォルダーはまたフォルダーとドキュメントを含むことができます。 + +:::warning + +Recursive calls should always end at some point. たとえば、`Genealogy of` メソッドが自身の呼び出しを止めるのは、クエリがレコードを返さないときです。 この条件のテストをしないと、メソッドは際限なく自身を呼び出します。 (メソッド内で使用される引数やローカル変数の蓄積を含む) 再帰呼び出しによって容量が一杯になると、最終的に 4Dは “スタックがいっぱいです” エラーを返します 。 + +::: + +## プロパティ + プロジェクトメソッドを作成した後、その名称やプロパティを変更することができます。 プロジェクトメソッドのプロパティは主に、実行アクセスやセキュリティ条件 (ユーザー、統合されたサーバーやサービスからのアクセスの可否) に加えて、実行モードに関する設定が含まれます。 他のタイプのメソッドには専用のプロパティがありません。 これらのメソッドのプロパティは、それらが関連付けられているオブジェクトに基づいて決定されます。 @@ -14,7 +256,7 @@ title: プロジェクトメソッドプロパティ > 一回の処理で複数のプロジェクトメソッドの属性を設定するために、属性の一括設定を使用できます ([属性の一括設定](#属性の一括設定) 参照)。 -## 名称 +### 名称 **メソッドプロパティ** ウィンドウの **名称** エリア、またはエクスプローラーでプロジェクトメソッド名を変更できます。 @@ -34,37 +276,37 @@ title: プロジェクトメソッドプロパティ ::: -## 属性 +### 属性 属性を使用して、プロジェクトメソッドがどのコンテキストにおいて利用可能かを指定できます。 エクスプローラーを使用して複数のプロジェクトメソッドに対し、属性を一括して設定することもできます (後述参照)。 -### 非表示 +#### 非表示 ユーザーに対し、**実行** メニューの **メソッド...** から特定のメソッドを実行させたくない場合、このオプションを選択すればそのメソッドを非表示にできます。 非表示のメソッドは、メソッド実行ダイアログボックスに表示されません。 プロジェクトメソッドを非表示にしても、データベースプログラマーはそれを使用することができます。 これらは、エクスプローラーやコードエディターのメソッドリストには引き続き表示されます。 -### コンポーネントとホストプロジェクト間で共有 +#### コンポーネントとホストプロジェクト間で共有 この属性は、コンポーネントのフレームワークで使用されます。 このオプションが選択されていると、アプリケーションがホストデータベースとして実行されている場合、そのメソッドがコンポーネントから実行可能になります。 また、アプリケーションがコンポーネントとして実行されている場合、そのメソッドはホストデータベースから実行可能となります。 コンポーネントについては [4Dコンポーネントの開発とインストール](../Extensions/develop-components.md) を参照ください。 -### サーバー上で実行 +#### サーバー上で実行 この属性は、クライアント/サーバーモードの 4Dアプリケーションでのみ考慮されます。 このオプションが選択されていると、そのプロジェクトメソッドは呼び出し方に関わらず常にサーバー上で実行されます。 このオプションに関する詳細は、4D Serverリファレンスマニュアルの [サーバー上で実行属性](https://doc.4d.com/4Dv20/4D/20/Execute-on-Server-attribute.300-6330555.ja.html) を参照ください。 -## 実行モード +### 実行モード このオプションを使用すると、メソッドのプリエンプティブ実行が可能であることを宣言できます。 これについては、[プリエンプティブプロセス](../Develop/preemptive.md) の章で説明されています。 -## 公開オプション +### 公開オプション 公開オプション属性は、当該メソッドの呼び出しが明示的に許可された外部サービスを指定します。 -### Webサービス +#### Webサービス この属性を使用して、SOAPリクエストでアクセス可能な Webサービスとして当該メソッドを公開することができます。 詳細は [Web サービスの公開と使用](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.ja.html) を参照ください。 このオプションを選択すると、**WSDL を公開** オプションを選択できるようになります。 @@ -72,13 +314,13 @@ title: プロジェクトメソッドプロパティ **注:** メソッド名が XML の命名規則に準拠しない文字 (たとえばスペース) を含む場合、そのメソッドは Webサービスとして公開できません。 この場合、設定は保存できません。 -### WSDL を公開 +#### WSDL を公開 この属性は "Webサービス" 属性が設定されている場合にのみ利用可能です。 この属性を設定すると、当該メソッドが 4Dアプリケーションの WSDLに 含まれます。 詳細については [WSDL ファイルを生成する](https://doc.4d.com/4Dv20/4D/20.2/Publishing-a-Web-Service-with-4D.300-6750334.ja.html#502689) を参照ください。 エクスプローラーでは、Webサービスとして提供され、WSDLで公開されたプロジェクトメソッドには専用のアイコンが表示されます。 -### 4D タグと URL(4DACTION...) +#### 4D タグと URL(4DACTION...) このオプションは、4D Webサーバーのセキュリティを強化するために使用されます。このオプションが選択されていない場合、[4DACTION URL](../WebServer/httpRequests.md#4daction) を使用した HTTPリクエスト、および [4DSCRIPT、4DTEXT、4DHTML タグ](../Tags/transformation-tags.md) から当該メソッドを直接呼び出すことができません。 @@ -86,7 +328,7 @@ title: プロジェクトメソッドプロパティ セキュリティのため、このオプションはデフォルトで選択されていません。 Web機能から直接呼び出されるメソッドには、このオプションを明示的に選択しなければなりません。 -### SQL +#### SQL この属性が選択されていると、当該プロジェクトメソッドは 4D の SQLエンジンから実行可能となります。 デフォルトでは選択されておらず、明示的に許可されない限り 4Dメソッドは保護されており、4D SQLエンジンから呼び出すことはできません。 @@ -99,11 +341,11 @@ title: プロジェクトメソッドプロパティ 詳細については、SQLマニュアルの [4Dと4D SQLエンジン統合の原則](https://doc.4d.com/4Dv20/4D/20/4D-SQL-engine-implementation.300-6342089.ja.html) を参照ください。 -### REST サーバー +#### REST サーバー *このオプションは廃止されます。 RESTコールによるコードの呼び出しは、[ORDAデータモデルクラス関数](../REST/ClassFunctions.md) でのみサポートされます。* -## 属性の一括設定 +### 属性の一括設定 "メソッド属性" ダイアログボックスを使用して、一回の操作で複数のプロジェクトメソッドに対して属性 (非表示、Webサービスで公開、等) を設定することができます。 この機能は、多数のプロジェクトメソッドの属性を一括して変更する場合に便利です。 また、開発の段階で、類似のメソッド群に共通の属性を素早く適用するのに使用することもできます。 diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/classes.md b/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/classes.md index 6ec401c0534a6a..cd98d51e011cc2 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/classes.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/classes.md @@ -37,62 +37,7 @@ $person:=cs. Person.new("John";"Doe") $hello:=$person.sayHello() //"Hello John Doe" ``` -## Gestão de classes - -### Definição de classe - -Uma classe de usuário em 4D é definida por um arquivo [method](methods.md) (.4dm), armazenado na pasta `/Project/Sources/Classes/` específico. O nome do arquivo é o nome da classe. - -Ao nomear classes, deve ter em mente as seguintes regras: - -- Um [nome de classe](identifiers.md#classes) deve estar em conformidade com as [regras de nomenclatura das propriedades](identifiers.md#object-properties). -- Nomes de classe diferenciam minúsculas de maiúsculas. -- Não se recomenda dar o mesmo nome a uma classe e a uma tabela de base de dados, a fim de evitar qualquer conflito. - -Por exemplo, se quiser definir uma classe chamada "Polígono", precisa criar o seguinte arquivo: - -``` -Project folder -``` - -### Eliminação de uma classe - -Para eliminar uma classe existente, pode: - -- no seu disco, remover o arquivo de classe .4dm da pasta "Classes", -- no Explorador 4D, selecione a classe e clique ![](../assets/en/Users/MinussNew.png) ou escolha **Mover para Lixo** no menu contextual. - -### Using 4D interface - -Os arquivos de classe são automaticamente armazenados no local apropriado quando criados através da interface 4D, quer através do menu **File**, quer através do Explorer. - -#### Menu Arquivo e barra de ferramentas - -Você pode criar um novo arquivo de classe para o projeto selecionando **Nova > Classe...** no menu **File** do 4D Developer ou na barra de ferramentas. - -Você também pode usar o atalho **Ctrl+Shift+Alt+k**. - -#### Explorador - -Na página de **Métodos** do Explorador, as classes são agrupadas na categoria **Classes**. - -Para criar uma nova classe, pode: - -- selecione a categoria **Classes** e clique no botão ![](../assets/en/Users/PlussNew.png). -- selecione **Nova Classe...** no menu de ação na parte inferior da janela do Explorer, ou no menu contextual do grupo Classes. - ![](../assets/en/Concepts/newClass.png) -- selecione **Novo > Classe...** a partir do menu contextual da página inicial do Explorador. - -#### Suporte de código de classe - -Nas várias janelas 4D (editor de código, compilador, depurador, explorador de tempo de execução), o código de classe é basicamente tratado como um método de projecto com algumas especificidades: - -- No editor de código: - - uma aula não pode ser executada - - uma função de classe é um bloco de código - - **Ir para a definição** em um membro do objeto procura por declarações da classe Função; por exemplo, "$o.f()" encontrará "Função f". - - **Procurar referências** na declaração de função da classe procura a função utilizada como membro do objeto; por exemplo, "Função f" irá encontrar "$o.f()". -- No explorador e Depurador de Runtime, as funções de classe são exibidas com o formato `` construtor ou `.`. +Class files are managed through the 4D Explorer (see [Creating classes](../Project/code-overview.md#creating-classes)). ## Lojas de classe diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/methods.md b/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/methods.md index 18a0fda81a58a2..0df331f61c7328 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/methods.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Concepts/methods.md @@ -13,275 +13,13 @@ O tamanho máximo de um método de projecto é limitado a 2 GB de texto ou 32.00 Na Linguagem 4D, existem várias categorias de métodos. A categoria depende da forma como podem ser chamados: -| Tipo | Contexto de chamada | Aceita parâmetros | Descrição | -| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Métodos projeto** | Por demanda, quando chamar ao nome do método projeto (ver [Chamando a métodos projeto](#chamando-metodos-projeto)) | Sim | Pode conter qualquer código para executar ações personalizadas Quando um método projeto for criado, se torna parte parte da linguagem do banco de dados na qual foi criado. | -| **Método objeto (widget)** | Automático, quando um evento envolve a forma a que o método está ligado | Não | Propriedade de um objecto de formulário (também chamado widget) | -| **Método formulário** | Automático, quando um evento envolve o objecto ao qual o método está ligado | Não | Propriedade de um formulário. Pode-se utilizar um método de formulário para gerir dados e objectos, mas é geralmente mais simples e mais eficiente utilizar um método de objecto para estes fins. | -| **Trigger** (o *método tabla*) | Automático, cada vez que manipula os registos de uma tabela (Adicionar, Apagar e Modificar) | Não | Propriedade de uma tabela. Os gatilhos/triggers são métodos que podem prevenir operações "ilegais" com os registos da sua base de dados. | -| **Método base** | Automático, quando ocorre um evento de sessão de trabalho | Sim (pré-definido) | Existem 16 métodos base em 4D. | -| **Class** | [**Funções de classe**](classes.md#function) são chamadas no contexto de uma instância de objeto | sim | As funções de classe podem ser incorporadas (*por exemplo* `collection.orderBy()` ou `entity.save()`), ou criadas pelo desenvolvedor do 4D. Veja [**Classes**](classes.md) | +| Tipo | Contexto de chamada | Aceita parâmetros | Descrição | +| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Métodos projeto** | Por demanda, quando chamar ao nome do método projeto (ver [Chamando a métodos projeto](#chamando-metodos-projeto)) | Sim | Pode conter qualquer código para executar ações personalizadas Quando um método projeto for criado, se torna parte parte da linguagem do banco de dados na qual foi criado. | +| **Método objeto (widget)** | Automático, quando um evento envolve a forma a que o método está ligado | Não | Propriedade de um objecto de formulário (também chamado widget) | +| **Método formulário** | Automático, quando um evento envolve o objecto ao qual o método está ligado | Não | Propriedade de um formulário. Pode-se utilizar um método de formulário para gerir dados e objectos, mas é geralmente mais simples e mais eficiente utilizar um método de objecto para estes fins. | +| **Trigger** (o *método tabla*) | Automático, cada vez que manipula os registos de uma tabela (Adicionar, Apagar e Modificar) | Não | Propriedade de uma tabela. Os gatilhos/triggers são métodos que podem prevenir operações "ilegais" com os registos da sua base de dados. | +| **Método base** | Automático, quando ocorre um evento de sessão de trabalho | Sim (pré-definido) | Existem 16 métodos base em 4D. | +| **Class** | Automatically called when an object of the class is instanciated or when a function of the class is executed on an object instance in any other methods or in a [database field](../Develop/field-properties.md#class). | yes (class functions) | A **Class** is used to declare and configure the class [constructor](./classes.md#class-constructor), [properties](./classes.md#property*), and [functions](./classes.md#function) of objects. Veja [**Classes**](classes.md) | -## Métodos projeto recursivos - -Um método de projecto pode ter uma das seguintes funções, dependendo de como é executado e utilizado: - -- Constantes -- Objeto fórmula -- Método do menu -- Método de gerenciamento de processos -- Método de captura de eventos ou erros - -Também pode executar os seus métodos projeto manualmente, por exemplo, para fins de teste. - -### Sugestões - -Uma sub-rotina é um método de projecto que pode ser pensado como um servo. Executa as tarefas que outros métodos lhe pedem para executar. Uma função é uma sub-rotina que devolve um valor ao método que a chamou. - -Quando criar um método projeto, este passa a formar parte da lingagem do banco de dados no qual foi criado. Você pode então chamar o método projeto a partir de outro método (método projeto, método de objeto...) da mesma forma que você chama os comandos internos do 4D. Um método de projecto utilizado desta forma é chamado de sub-rotina. - -Utiliza sub-rotinas para: - -- Reduzir a codificação repetitiva -- Esclareça os seus métodos -- Facilitar mudanças nos seus métodos -- Modularize o seu código - -Por exemplo, suponha que tenha um banco de dados de clientes. Ao personalizar o banco de dados, pode perceber que ha'tarefas que tem que realizar repetidamente, como achar um cliente e modificar seu registro. O código para fazer isso parece-se com o seguinte: - -```4d - // Procure um cliente - QUERY BY EXAMPLE([Customers]) - // Selecione o formulário de entrada - FORMULÁRIO DE ENTRADA([Customers]; "Data Entry") - // Modifique o registo do cliente - MODIFY RECORD([Customers]) -``` - -Se não utilizar sub-rotinas, terá de escrever o código cada vez que quiser modificar o registo de um cliente. Se houver dez lugares na sua base de dados personalizada onde precise fazer isso, terá de escrever o código dez vezes. Se utilizar sub-rotinas, só terá de o escrever uma vez. Esta é a primeira vantagem das sub-rotinas - reduzir a quantidade de código. - -Se o código descrito anteriormente fosse um método chamado `MODIFY_CUSTOMER`, você o executaria simplesmente usando o nome do método em outro método. Por exemplo, para modificar o registo de um cliente e depois imprimir o registo, escrever-se-ia este método: - -```4d - MODIFY CUSTOMER - PRINT SELECTION([Customers]) -``` - -Esta capacidade simplifica dramaticamente os seus métodos. No exemplo, você não precisa saber como o método `MODIFY_CUSTOMER` funciona, apenas o que ele faz. Esta é a segunda razão para a utilização de sub-rotinas para esclarecer os seus métodos. Desta forma, os seus métodos tornam-se extensões à linguagem 4D. - -Se precisar mudar seu método de pesquisa de clientes nesse banco de dados de exemplo, terá que mudar apenas um método, não dez. Este é o próximo motivo para utilizar sub-rotinas para facilitar mudanças nos seus métodos. - -Usando sub-rotinas, você torna o seu código modular. Isto significa simplesmente a divisão do seu código em módulos (sub-rotinas), cada um dos quais executa uma tarefa lógica. Considere o código abaixo de um banco de dados de contas correntes: - -```4d - FIND CLEARED CHECKS ` Buscar os cheques emitidos - RECONCILE ACCOUNT ` Reconciliar a conta - PRINT CHECK BOOK REPORT ` Imprimir um relatório da conta -``` - -Mesmo para alguém que não conheça o banco de dados, é claro o que o código faz. Não é necessário examinar cada sub-rotina. Cada sub-rotina pode ter muitas linhas e realizar algumas operações complexas, mas aqui é apenas importante que desempenhe a sua tarefa. Recomendamos que divida o seu código em tarefas lógicas, ou módulos, sempre que possível. - -### Objeto fórmula - -Você pode encapsular os métodos do seu projeto em objetos **fórmula** e chamá-los a partir dos seus objetos. - -Os comandos `Formula` ou `Formula from string` permitem-lhe criar objetos de fórmula nativa que você pode encapsular em propriedades de objeto. Permite-lhe implementar métodos de objectos personalizados. - -Para executar um método armazenado em uma propriedade de objeto, use o operador **()** depois do nome da propriedade. Por exemplo: - -```4d -//myAlert ALERT("Hello world!") -``` - -Então `myAlert` pode ser encapsulado em qualquer objeto e chamado: - -```4d -C_OBJECT($o) -$o:=New object("custom_Alert";Formula(myAlert)) -$o.custom_Alert() //displays "Hello world!" -``` - -Também se admite a sintaxe com parênteses: - -```4d -$o["custom_Alert"]() //exibe "Hello world!" -``` - -Você também pode [passar parâmetros](Concepts/parameters.md) para sua fórmula quando você a chamar usando $1, $2… assim como nos métodos do projeto 4D: - -```4d -//fullName method C_TEXT($0;$1;$2) -$0:=$1+" "+$2 -``` - -Você pode encapsular `fullName` em um objeto: - -```4d -C_OBJECT($o) -$o:=New object("full_name";Formula(fullName)) -$result:=$o.full_name("John";"Smith") -//$result = "John Smith" -// equivalent to $result:=fullName("param1";"param2") -``` - -Combinado com a função `This`, tais métodos de objectos permitem escrever um poderoso código genérico. Por exemplo: - -```4d -//fullName2 method C_TEXT($0) -$0:=This.firstName+" "+This.lastName -``` - -Então o método atua como um novo atributo calculado que pode ser adicionado a outros atributos: - -```4d -C_OBJECT($o) -$o:=New object("firstName";"Jim";"lastName";"Wesson") -$o.fullName:=Formula(fullName2) //add the method - -$result:=$o.fullName() -//$result = "Jim Wesson" -``` - -Note-se que, mesmo que não tenha parâmetros, um método de objeto a ser executado deve ser chamado com `()` parênteses. Chamar só a propriedade de objeto devolverá uma nova referência à fórmula (e não a executará): - -```4d -$o:=$f.message //devolve o objeto fórmula em $o -``` - -### Métodos de menu - -Um método de menu é invocado quando se selecciona o comando do menu personalizado ao qual está anexado. Atribui-se o método ao comando menu usando o editor de menu ou um comando do tema "Menus". O método executa-se quando o comando do menu é escolhido. Ao criar menus personalizados com métodos de menu que realizam ações específicas, pode personalizar seu banco de dados. - -Os comandos personalizados do menu podem causar a realização de uma ou mais actividades. Por exemplo, um comando de menu para inserir registros pode chamar um método que realiza duas tarefas: exibir o formulário de entrada apropriado e chamar o comando `ADD RECORD` até que o usuário cancele a atividade de entrada de dados. - -A automatização de sequências de actividades é uma capacidade muito poderosa da linguagem de programação. Usando menus personalizados, pode automatizar sequências de tarefa e fornecer mais orientação aos usuários do banco de dados. - -### Métodos Processo - -Um **método de processo** é um método de projeto que é chamado quando um processo é iniciado. O processo dura apenas enquanto o método do processo continuar a ser executado, excepto se for um processo de Worker. Note-se que um método de menu anexado a um comando de menu com a propriedade *Start a New Process* é também o método de processo para o processo recentemente iniciado. - -### Métodos de captura de eventos e erros - -Um **método de captação de eventos** é executado em um processo separado como o método de processo para capturar eventos. Normalmente, deixa a 4D fazer a maior parte do tratamento do evento por si. Por exemplo, durante a introdução de dados, 4D detecta toques no teclado e cliques, depois chama os métodos corretos de objetos e formulários para que possa responder adequadamente aos eventos a partir destes métodos. Para mais informações, veja a descrição do comando `ON EVENT CALL`. - -Um **método de apanhar erros** é um método de projecto baseado na interrupção. Cada vez que ocorre um erro ou uma exceção, este é executado dentro do processo em que foi instalado. Para mais informações, consulte a seção [Error handling](error-handling.md). - -### Execution mode - -Os métodos projeto escritos em sua aplicação costumam ser chamados automaticamente durante o uso da aplicação através de comandos de menu, botões, outros métodos, etc. Para métodos de banco de dados, são executados em relação à eventos específicos que ocorrem na aplicação. - -Entretanto, para teste e depuração, 4D deixa que execute métodos de projeto manualmente e certos métodos de banco de dados em modo Design. -Neste caso é possível executar o método em um novo processo ou diretamente no modo Debug, para verificar sua execução passo a passo. - -Pode executar métodos de duas formas: - -- Na janela Editor de código, -- Na caixa de diálogo Executar método (apenas métodos de projecto). - -#### No editor de código - -Cada janela do [**Editor de Código**](../code-editor/write-class-method.md) possui um botão que pode ser usado para executar o método atual. Usar o menu associado com o botão, pode escolher o tipo de execução desejado. - -Esse botão é ativo para métodos projeto e para os métodos database: - -- On Startup -- On Exit -- On Server Startup -- On Server Shutdown - -Para obter mais informações, consulte [Toolbar](../code-editor/write-class-method.md#toolbar). - -#### Na caixa de diálogo Executar método - -Quando você selecionar o comando **Method...** do menu **Run**, exibe o diálogo **Execute Method**. - -Esta caixa de diálogo lista todos os métodos de projecto da base de dados, incluindo métodos de projecto partilhados de componentes. Por outro lado, os métodos de projecto que foram declarados invisíveis não aparecerão. - -Para executar um método projeto, basta selecionar o seu nome na lista e clicar em **Executar**. Para executar um método passo a passo no modo Debug, clique em **Debug**. Para mais informações sobre o depurador 4D, consulte a seção [Depuração](../Debugging/basics.md). - -Se você marcar a caixa de seleção de **Novo Processo**, o método que você selecionou é executado em outro processo. Se o método estiver executando uma tarefa demorada, como a impressão de um grande conjunto de registos, pode continuar trabalhando com a base de dados, adicionando registos a uma tabela, criando um gráfico para apresentar dados, etc. Para mais informações sobre processos, consulte [Processes](../Develop/processes.md). - -**Notas Servidor 4D**: - -- Se quiser que o método seja executado na máquina do servidor e não na máquina do cliente, selecione a opção On 4D Server no menu To be executed. Neste caso, é criado um novo processo, chamado stored procedure, na máquina do servidor para executar o método. Essa opção pode ser usada para reduzir o tráfego de rede e otimizar o funcionamento do 4D Server, em particular para métodos que chamam dados armazenados no disco. Todos os tipos de métodos podem ser executados na máquina servidor ou noutra máquina cliente, excepto os que modificam a interface do utilizador. Neste caso, os procedimentos armazenados são ineficazes. -- Também pode optar por executar o método noutra estação de trabalho cliente. Other client workstations will not appear in the menu, unless they have been previously "registered" (for more information, refer to the description of the [REGISTER CLIENT](../commands/register-client). - -Por padrão, a opção **local** está selecionada. Com a versão 4D para um único utilizador, esta é a única opção disponível. - -## Métodos associados aos objetos - -Os métodos de projecto podem chamar-se a si próprios. Por exemplo: - -- O método A pode chamar o método B que pode chamar A, por isso A chamará novamente B e assim por diante. -- Um método pode chamar-se a si próprio. - -A isto chama-se recorrência. A linguagem 4D suporta plenamente a recorrência. - -Aqui um exemplo simples. Digamos que você tenha uma tabela `[Amigos e Relativas]` composta por este conjunto extremamente simplificado de campos: - -- `[Friends and Relatives]Name` -- `[Friends and Relatives]ChildrensName` - -Para este exemplo, assumimos que os valores nos campos são únicos (não há duas pessoas com o mesmo nome). Dado um nome, quer construir a frase "Um amigo meu, João que é o filho de Paulo que é o filho de Jane que é o filho de Robert que é o filho de Eleanor, faz isto para viver": - -1. Pode construir a frase desta forma: - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - $vtTheWholeStory:="A friend of mine, "+$vsName - Repeat - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) - $vlQueryResult:=Records in selection([Friends and Relatives]) - If($vlQueryResult>0) - $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name - $vsName:=[Friends and Relatives]Name - End if - Until($vlQueryResult=0) - $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" - ALERT($vtTheWholeStory) - End if - End if -``` - -2. Também se pode construir desta forma: - -```4d - $vsName:=Request("Enter the name:";"John") - If(OK=1) - QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) - If(Records in selection([Friends and Relatives])>0) - ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") - End if - End if -``` - -com a função recursiva `Genealogy de` listada aqui: - -```4d - ` Genealogy of project method - ` Genealogy of ( String ) -> Text - ` Genealogy of ( Name ) -> Part of sentence - - $0:=$1 - QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$1) - If(Records in selection([Friends and Relatives])>0) - $0:=$0+" who is the child of "+Genealogy of([Friends and Relatives]Name) - End if -``` - -Observe o método `Genealogy of` que chama a si mesmo. - -A primeira forma é um **algoritmo iterativo**. A segunda via é um **algoritmo recursivo**. - -Ao implementar código para casos como o exemplo anterior, é importante notar que é sempre possível escrever métodos usando iteração ou recursividade. Tipicamente, a recursão fornece um código mais conciso, legível e de fácil manutenção, mas a sua utilização não é obrigatória. - -Alguns usos típicos da recursividade em 4D são: - -- Tratar os registos dentro de tabelas que se relacionam entre si da mesma forma que no exemplo. -- Navegação de documentos e pastas em seu disco, usando os comandos `FOLDER LIST` e `DOCUMENT LIST`. Uma pasta pode conter pastas e documentos, as próprias subpastas podem conter pastas e documentos, e assim por diante. - -**Importante:** Las llamadas recursivas deben terminar siempre en algún punto. No exemplo, o método `Genealogia de` deixa de chamar a si próprio quando a consulta não devolve registos. Sem este teste de condição, o método chamar-se-ia indefinidamente; eventualmente, 4D retornaria um erro "Stack Full" porque deixaria de ter espaço para "empilhar" as chamadas (bem como os parâmetros e variáveis locais utilizados no método). diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Project/code-overview.md b/i18n/pt/docusaurus-plugin-content-docs/current/Project/code-overview.md index c601602e7302b9..2e402e8b92f193 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/Project/code-overview.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Project/code-overview.md @@ -1,6 +1,6 @@ --- id: code-overview -title: Creating Methods and classes +title: Managing Methods and Classes --- O código 4D usado em seu projeto está escrito em [métodos](../Concepts/methods.md) e [classes](../Concepts/classes.md). @@ -11,20 +11,87 @@ O IDE 4D fornece vários recursos para criar, editar, exportar ou excluir seu c Um método em 4D é armazenado em um arquivo **.4dm** localizado na pasta apropriada da pasta [`/Project/Sources/`](../Project/architecture.md#sources). -Você pode criar [vários tipos de métodos](../Concepts/methods.md): +Você pode criar [vários tipos de métodos](../Concepts/methods.md#method-types): - All types of methods can be created or opened from the **Explorer** window (except Object methods which are managed from the [Form editor](../FormEditor/formEditor.md)). - Os métodos projeto também podem ser criados ou abertos no menu **File**, ou na barra de ferramentas (\*\*Novo/Método.. \*\* ou **Abrir/Método...**) ou usando atalhos na [janela do editor de código](../code-editor/write-class-method.md#shortcuts). -- Os triggers também podem ser criados ou abertos a partir do editor de Estrutura. +- **Triggers** can also be created or opened from the [Structure editor](../Develop-legacy/triggers.md#activating-and-creating-a-trigger). - Los métodos formulario también pueden crearse o abrirse desde el [editor de formularios](../FormEditor/formEditor.md). ## Criação de classes -Uma classe usuário no 4D é definida por um arquivo de método específico (**.4dm**), armazenado na pasta [`/Project/Sources/Classes/`](../Project/architecture.md#sources). O nome do arquivo é o nome da classe. +### User classes -You can create a class file from the **File** menu or toolbar (**New/Class...**) or in the **Methods** page of the **Explorer** window. +Uma classe usuário no 4D é definida por um arquivo de método específico (**.4dm**), armazenado na pasta [`/Project/Sources/Classes/`](../Project/architecture.md#sources). O nome do arquivo é o nome da classe. For example, a class named "Polygon" will be stored in the following file: -Para más información, consulte la sección [Clases](../Concepts/classes.md). +``` +Project folder +``` + +You can create a class file from the **File** menu or toolbar (**New > Class...**) or in the **Methods** page of the **Explorer** window. Você também pode usar o atalho **Ctrl+Shift+Alt+k**. + +Na página de **Métodos** do Explorador, as classes são agrupadas na categoria **Classes**. + +Para criar uma nova classe, pode: + +- selecione a categoria **Classes** e clique no botão ![](../assets/en/Users/PlussNew.png). +- selecione **Nova Classe...** no menu de ação na parte inferior da janela do Explorer, ou no menu contextual do grupo Classes. + ![](../assets/en/Concepts/newClass.png) +- selecione **Novo > Classe...** a partir do menu contextual da página inicial do Explorador. + +Ao nomear classes, deve ter em mente as seguintes regras: + +- Um [nome de classe](../Concepts/identifiers.md#classes) deve estar em conformidade com as [regras de nomenclatura das propriedades](../Concepts/identifiers.md#object-properties). +- Nomes de classe diferenciam minúsculas de maiúsculas. +- Não se recomenda dar o mesmo nome a uma classe e a uma tabela de base de dados, a fim de evitar qualquer conflito. + +### ORDA classes + +[ORDA data model user classes](../ORDA/ordaClasses.md) are high-level class functions created above the data model. + +An ORDA data model class is defined by adding, at the same location as regular class files (*i.e.* in the `/Sources/Classes` folder of the project folder), a .4dm file with the name of the class. Por exemplo, uma classe de entidade para o dataclass `Utilities` será definida através de um arquivo `UtilitiesEntity.4dm`. + +4D pré-criou automaticamente classes vazias na memória para cada objeto de modelo de dados disponível. + +![](../assets/en/ORDA/ORDA_Classes-3.png) + +Por padrão, as classes ORDA vazias não são exibidas no Explorer. Para mostrar a eles, você precisa selecionar **Mostrar todas as classes de dados** do menu de opções do Explorador: +![](../assets/en/ORDA/showClass.png) + +As classes de utilizadores ORDA têm um ícone diferente das classes normais. As classes vazias são escurecidas: + +![](../assets/en/ORDA/classORDA2.png) + +Para criar um arquivo de classe ORDA, basta fazer duplo clique na classe predefinida correspondente no Explorador. 4D creates the class file and add the [`extends`](../Concepts/classes.md#class-extends-classname) code. Por exemplo, para uma classe Entity: + +``` +Class extends Entity +``` + +Quando uma classe for definida, o seu nome deixa de estar obscurecido no Explorador. + +Para abrir una clase ORDA definida en el editor de código 4D, seleccione o haga doble clic en el nombre de una clase ORDA y utilice **Editar...** en el menú contextual/menú de opciones de la ventana del Explorador: + +![](../assets/en/ORDA/classORDA4.png) + +Para as classes ORDA baseadas no armazenamento de dados local (`ds`), é possível acessar diretamente o código da classe pela janela 4D Structure: + +![](../assets/en/ORDA/classORDA5.png) + +### Support in 4D projects + +Nas várias janelas 4D (editor de código, compilador, depurador, explorador de tempo de execução), o código de classe é basicamente tratado como um método de projecto com algumas especificidades: + +- No editor de código: + - uma aula não pode ser executada + - uma função de classe é um bloco de código + - **Ir para a definição** em um membro do objeto procura por declarações da classe Função; por exemplo, "$o.f()" encontrará "Função f". + - **Procurar referências** na declaração de função da classe procura a função utilizada como membro do objeto; por exemplo, "Função f" irá encontrar "$o.f()". + - variables typed as a user or ORDA class automatically benefit from autocompletion features. Exemplo com uma variável de classe Entity: + +![](../assets/en/ORDA/AutoCompletionEntity.png) + +- No explorador e Depurador de Runtime, as funções de classe são exibidas com o formato `` construtor ou `.`. ## Excluir os métodos ou as classes @@ -35,3 +102,70 @@ Para eliminar um método ou classe existente, pode: > To delete an object method, choose **Clear Object Method** from the [Form editor](../FormEditor/formEditor.md) (**Object** menu or context menu). +## Design Object Access commands + +You can access the contents and paths of all methods in your applications by programming, thanks to the [**"Design Object Access" command theme**](../commands/theme/Design_Object_Access.md). This source toolkit facilitates the integration into your applications of code control tools and more particularly version control systems (VCS). It also lets you implement advanced systems for [code documentation](../Project/documentation.md), for building a custom explorer or for organizing scheduled backups of the code saved as disk files. + +The following principles are implemented: + +- Each method and form in a 4D application has its own address in the form of a pathname. For example, the trigger method for table 1 can be found at "[trigger]/table_1". Each object pathname is unique in an application. +- You can access objects in the 4D application using the commands of the **"Design Object Access"** command theme, for example [`METHOD GET NAMES`](../commands/method-get-names) or [`METHOD GET PATHS`](../commands/method-get-paths). +- Most of the commands in this theme work in both [interpreted and compiled](../Concepts/interpreted.md) mode. However, commands that modify properties or access contents executable from methods can only be used in interpreted mode (see the table below). +- You can use all the commands of this theme with 4D in local or remote mode. However, keep in mind that you cannot use certain commands in compiled mode: the purpose of this theme is to create custom development support tools. You must not use these commands to dynamically change the functioning of a database that is running. For example, you cannot use [`METHOD SET ATTRIBUTE`](../commands/method-set-attribute) to change a method attribute according to the status of the current user. +- When a command of this theme is called from a [component](../Project/components.md), by default it accesses the component objects. In this case, to access objects of the host, you just pass a `*` as the last parameter. + +### Use in compiled mode + +For reasons related to the principle of the compilation process, only certain commands in this theme can be used in compiled mode. The following table indicates the available of the commands in compiled mode: + +| Comando | Can be used in compiled mode | +| ------------------------------------------------------------------------ | ---------------------------- | +| [Current method path](../commands/current-method-path) | Sim | +| [FORM GET NAMES](../commands/form-get-names) | Sim | +| [METHOD Get attribute](../commands/method-get-attribute) | Sim | +| [METHOD GET ATTRIBUTES](../commands/method-get-attributes) | Sim | +| [METHOD GET CODE](../commands/method-get-code) | Não | +| [METHOD GET COMMENTS](../commands/method-get-comments) | Sim | +| [METHOD GET FOLDERS](../commands/method-get-folders) | Sim | +| [METHOD GET MODIFICATION DATE](../commands/method-get-modification-date) | Sim | +| [METHOD GET NAMES](../commands/method-get-names) | Sim | +| [METHOD Get path](../commands/method-get-path) | Sim | +| [METHOD GET PATHS](../commands/method-get-paths) | Sim | +| [METHOD GET PATHS FORM](../commands/method-get-paths-form) | Sim | +| [METHOD OPEN PATH](../commands/method-open-path) | Não | +| [METHOD RESOLVE PATH](../commands/method-resolve-path) | Sim | +| [METHOD SET ACCESS MODE](../commands/method-set-access-mode) | Sim | +| [METHOD SET ATTRIBUTE](../commands/method-set-attribute) | Não | +| [METHOD SET ATTRIBUTES](../commands/method-set-attributes) | Não | +| [METHOD SET CODE](../commands/method-set-code) | Não | +| [METHOD SET COMMENTS](../commands/method-set-comments) | Não | + +:::note + +The error -9762 "The command cannot be executed in a compiled database." is generated when the command is executed in compiled mode. + +::: + +### Creation of pathnames + +Pathnames generated for 4D objects must be compatible with the file management of the operating system. Characters that are forbidden at the OS level such as ":" are automatically encoded in method names, so that generated files may be integrated automatically in a version control system. + +Here are the encoded characters: + +| Caracteres | Encoding | +| ---------------------------- | -------- | +| " | %22 | +| \* | %2A | +| / | %2F | +| : | %3A | +| \< | %3C | +| \> | %3E | +| ? | %3F | +| \\| | %7C | +| \\ | %5C | +| % | %25 | + +#### Exemplos + +`Form?1` is encoded `Form%3F1` +`Button/1` is encoded `Button%2F1` \ No newline at end of file diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Project/project-method-properties.md b/i18n/pt/docusaurus-plugin-content-docs/current/Project/project-method-properties.md index 73e017d3a36e38..dd025b35d18d25 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/Project/project-method-properties.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Project/project-method-properties.md @@ -1,8 +1,250 @@ --- id: project-method-properties -title: Project Method Properties +title: Project Methods --- +## Roles + +Um método de projecto pode ter uma das seguintes funções, dependendo de como é executado e utilizado: + +- Constantes +- Objeto fórmula +- Método do menu +- Método de gerenciamento de processos +- Método de captura de eventos ou erros +- APIs to be called from the web server, transformation tags, extensions... +- Também pode executar os seus métodos projeto manualmente, por exemplo, para fins de teste. + +### Sugestões + +Uma sub-rotina é um método de projecto que pode ser pensado como um servo. Executa as tarefas que outros métodos lhe pedem para executar. Uma função é uma sub-rotina que devolve um valor ao método que a chamou. + +Quando criar um método projeto, este passa a formar parte da lingagem do banco de dados no qual foi criado. Você pode então chamar o método projeto a partir de outro método (método projeto, método de objeto...) da mesma forma que você chama os comandos internos do 4D. Um método de projecto utilizado desta forma é chamado de sub-rotina. + +Utiliza sub-rotinas para: + +- Reduzir a codificação repetitiva +- Esclareça os seus métodos +- Facilitar mudanças nos seus métodos +- Modularize o seu código + +Por exemplo, suponha que tenha um banco de dados de clientes. Ao personalizar o banco de dados, pode perceber que ha'tarefas que tem que realizar repetidamente, como achar um cliente e modificar seu registro. O código para fazer isso parece-se com o seguinte: + +```4d + // Procure um cliente + QUERY BY EXAMPLE([Customers]) + // Selecione o formulário de entrada + FORMULÁRIO DE ENTRADA([Customers]; "Data Entry") + // Modifique o registo do cliente + MODIFY RECORD([Customers]) +``` + +Se não utilizar sub-rotinas, terá de escrever o código cada vez que quiser modificar o registo de um cliente. Se houver dez lugares na sua base de dados personalizada onde precise fazer isso, terá de escrever o código dez vezes. Se utilizar sub-rotinas, só terá de o escrever uma vez. Esta é a primeira vantagem das sub-rotinas - reduzir a quantidade de código. + +Se o código descrito anteriormente fosse um método chamado `MODIFY_CUSTOMER`, você o executaria simplesmente usando o nome do método em outro método. Por exemplo, para modificar o registo de um cliente e depois imprimir o registo, escrever-se-ia este método: + +```4d + MODIFY CUSTOMER + PRINT SELECTION([Customers]) +``` + +Esta capacidade simplifica dramaticamente os seus métodos. No exemplo, você não precisa saber como o método `MODIFY_CUSTOMER` funciona, apenas o que ele faz. Esta é a segunda razão para a utilização de sub-rotinas para esclarecer os seus métodos. Desta forma, os seus métodos tornam-se extensões à linguagem 4D. + +Se precisar mudar seu método de pesquisa de clientes nesse banco de dados de exemplo, terá que mudar apenas um método, não dez. Este é o próximo motivo para utilizar sub-rotinas para facilitar mudanças nos seus métodos. + +Usando sub-rotinas, você torna o seu código modular. Isto significa simplesmente a divisão do seu código em módulos (sub-rotinas), cada um dos quais executa uma tarefa lógica. Considere o código abaixo de um banco de dados de contas correntes: + +```4d + FIND CLEARED CHECKS ` Buscar os cheques emitidos + RECONCILE ACCOUNT ` Reconciliar a conta + PRINT CHECK BOOK REPORT ` Imprimir um relatório da conta +``` + +Mesmo para alguém que não conheça o banco de dados, é claro o que o código faz. Não é necessário examinar cada sub-rotina. Cada sub-rotina pode ter muitas linhas e realizar algumas operações complexas, mas aqui é apenas importante que desempenhe a sua tarefa. Recomendamos que divida o seu código em tarefas lógicas, ou módulos, sempre que possível. + +### Objeto fórmula + +Você pode encapsular os métodos do seu projeto em objetos **fórmula** e chamá-los a partir dos seus objetos. + +The [`Formula`](../commands/formula) or [`Formula from string`](../commands/formula-from-string) commands allow you to create [native formula objects](../API/FormulaClass.md) that you can encapsulate in object properties. Permite-lhe implementar métodos de objectos personalizados. + +Para executar um método armazenado em uma propriedade de objeto, use o operador **()** depois do nome da propriedade. Por exemplo: + +```4d +//myAlert ALERT("Hello world!") +``` + +Então `myAlert` pode ser encapsulado em qualquer objeto e chamado: + +```4d +C_OBJECT($o) +$o:=New object("custom_Alert";Formula(myAlert)) +$o.custom_Alert() //displays "Hello world!" +``` + +Também se admite a sintaxe com parênteses: + +```4d +$o["custom_Alert"]() //exibe "Hello world!" +``` + +For more information, see the [`4D.Formula` class description](../API/FormulaClass.md) and the [Using object properties as named parameters](../Concepts/parameters.md#using-object-properties-as-named-parameters) paragraph. + +### Métodos de menu + +Um método de menu é invocado quando se selecciona o comando do menu personalizado ao qual está anexado. You assign the method to the menu command using the Menu editor or a [command of the "Menus" theme](../commands/theme/Menus.md). O método executa-se quando o comando do menu é escolhido. Ao criar menus personalizados com métodos de menu que realizam ações específicas, pode personalizar seu banco de dados. + +Os comandos personalizados do menu podem causar a realização de uma ou mais actividades. For example, a menu command for entering records might call a method that performs two tasks: displaying the appropriate input form, and calling the [`ADD RECORD`(../commands/add-record)] command until the user cancels the data entry activity. + +Automating sequences of activities is a very powerful capability of the 4D programming language. Usando menus personalizados, pode automatizar sequências de tarefa e fornecer mais orientação aos usuários do banco de dados. + +### Métodos Processo + +Um **método de processo** é um método de projeto que é chamado quando um processo é iniciado. The process lasts only as long as the process method continues to execute, except if it is a [Worker process](../Develop/processes.md#worker-processes). Note that a menu method attached to a menu command with [*Start a New Process*](../Menus/properties.md#start-a-new-process) property is also the process method for the newly started process. + +### Métodos de captura de eventos e erros + +Um **método de captação de eventos** é executado em um processo separado como o método de processo para capturar eventos. Normalmente, deixa a 4D fazer a maior parte do tratamento do evento por si. Por exemplo, durante a introdução de dados, 4D detecta toques no teclado e cliques, depois chama os métodos corretos de objetos e formulários para que possa responder adequadamente aos eventos a partir destes métodos. For more information, see the description of the command [`ON EVENT CALL`](../commands/on-event-call). + +Um **método de apanhar erros** é um método de projecto baseado na interrupção. Cada vez que ocorre um erro ou uma exceção, este é executado dentro do processo em que foi instalado. Para mais informações, consulte a seção [Error handling](../Concepts/error-handling.md). + +### API Methods + +Project methods can be called from external contexts such as other applications, web apps, processed files, etc., in which case they can be seen as API. Such calls include: + +- calls to the web server through [http request handlers](../WebServer/http-request-handler.md) or [`4DACTION` URLs](../WebServer/httpRequests.md#4daction), +- [tag processing](../Tags/transformation-tags.md) +- expressions called from extensions ([4D Write Pro](../WritePro/commands/wp-insert-formula.md), [4D View Pro](../ViewPro/formulas.md) or form objects (e.g. [`ST INSERT EXPRESSION`](../commands/st-insert-expression)). + +External calls to project methods must be allowed in the [project method properties](../Project/project-method-properties.md). + +### Execution mode + +Os métodos projeto escritos em sua aplicação costumam ser chamados automaticamente durante o uso da aplicação através de comandos de menu, botões, outros métodos, etc. Para métodos de banco de dados, são executados em relação à eventos específicos que ocorrem na aplicação. + +Entretanto, para teste e depuração, 4D deixa que execute métodos de projeto manualmente e certos métodos de banco de dados em modo Design. +Neste caso é possível executar o método em um novo processo ou diretamente no modo Debug, para verificar sua execução passo a passo. + +Pode executar métodos de duas formas: + +- Na janela Editor de código, +- Na caixa de diálogo Executar método (apenas métodos de projecto). + +#### No editor de código + +Cada janela do [**Editor de Código**](../code-editor/write-class-method.md) possui um botão que pode ser usado para executar o método atual. Usar o menu associado com o botão, pode escolher o tipo de execução desejado. + +Esse botão é ativo para métodos projeto e para os métodos database: + +- On Startup +- On Exit +- On Server Startup +- On Server Shutdown + +Para obter mais informações, consulte [Toolbar](../code-editor/write-class-method.md#toolbar). + +#### Na caixa de diálogo Executar método + +Quando você selecionar o comando **Method...** do menu **Run**, exibe o diálogo **Execute Method**. + +Esta caixa de diálogo lista todos os métodos de projecto da base de dados, incluindo métodos de projecto partilhados de componentes. Por outro lado, os métodos de projecto que foram declarados invisíveis não aparecerão. + +Para executar um método projeto, basta selecionar o seu nome na lista e clicar em **Executar**. Para executar um método passo a passo no modo Debug, clique em **Debug**. Para mais informações sobre o depurador 4D, consulte a seção [Depuração](../Debugging/basics.md). + +Se você marcar a caixa de seleção de **Novo Processo**, o método que você selecionou é executado em outro processo. Se o método estiver executando uma tarefa demorada, como a impressão de um grande conjunto de registos, pode continuar trabalhando com a base de dados, adicionando registos a uma tabela, criando um gráfico para apresentar dados, etc. Para mais informações sobre processos, consulte [Processes](../Develop/processes.md). + +**Notas Servidor 4D**: + +- Se quiser que o método seja executado na máquina do servidor e não na máquina do cliente, selecione a opção On 4D Server no menu To be executed. Neste caso, é criado um novo processo, chamado stored procedure, na máquina do servidor para executar o método. Essa opção pode ser usada para reduzir o tráfego de rede e otimizar o funcionamento do 4D Server, em particular para métodos que chamam dados armazenados no disco. Todos os tipos de métodos podem ser executados na máquina servidor ou noutra máquina cliente, excepto os que modificam a interface do utilizador. Neste caso, os procedimentos armazenados são ineficazes. +- Também pode optar por executar o método noutra estação de trabalho cliente. Other client workstations will not appear in the menu, unless they have been previously "registered" (for more information, refer to the description of the [REGISTER CLIENT](../commands/register-client). + +Por padrão, a opção **local** está selecionada. Com a versão 4D para um único utilizador, esta é a única opção disponível. + +### Métodos associados aos objetos + +Os métodos de projecto podem chamar-se a si próprios. Por exemplo: + +- O método A pode chamar o método B que pode chamar A, por isso A chamará novamente B e assim por diante. +- Um método pode chamar-se a si próprio. + +A isto chama-se recorrência. A linguagem 4D suporta plenamente a recorrência. + +Aqui um exemplo simples. Digamos que você tenha uma tabela `[Amigos e Relativas]` composta por este conjunto extremamente simplificado de campos: + +- `[Friends and Relatives]Name` +- `[Friends and Relatives]ChildrensName` + +Para este exemplo, assumimos que os valores nos campos são únicos (não há duas pessoas com o mesmo nome). Dado um nome, quer construir a frase "Um amigo meu, João que é o filho de Paulo que é o filho de Jane que é o filho de Robert que é o filho de Eleanor, faz isto para viver": + +1. Pode construir a frase desta forma: + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + var $vtTheWholeStory:="A friend of mine, "+$vsName + var $vlQueryResult : Integer + Repeat + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$vsName) + $vlQueryResult:=Records in selection([Friends and Relatives]) + If($vlQueryResult>0) + $vtTheWholeStory:=$vtTheWholeStory+" who is the child of "+[Friends and Relatives]Name + $vsName:=[Friends and Relatives]Name + End if + Until($vlQueryResult=0) + $vtTheWholeStory:=$vtTheWholeStory+", does this for a living!" + ALERT($vtTheWholeStory) + End if + End if +``` + +2. Também se pode construir desta forma: + +```4d + var $vsName:=Request("Enter the name:";"John") + If(OK=1) + QUERY([Friends and Relatives];[Friends and Relatives]Name=$vsName) + If(Records in selection([Friends and Relatives])>0) + ALERT("A friend of mine, "+Genealogy of($vsName)+", does this for a living!") + End if + End if +``` + +com a função recursiva `Genealogy de` listada aqui: + +```4d + //Genealogy of project method + //Genealogy of ( String ) -> Text + //Genealogy of ( Name ) -> Part of sentence + + #DECLARE($name : Text) -> $result : Text + $result:=$name + QUERY([Friends and Relatives];[Friends and Relatives]ChildrensName=$name) + If(Records in selection([Friends and Relatives])>0) + $result:=$result+" who is the child of "+Genealogy of([Friends and Relatives]Name) + End if +``` + +Observe o método `Genealogy of` que chama a si mesmo. + +A primeira forma é um **algoritmo iterativo**. A segunda via é um **algoritmo recursivo**. + +Ao implementar código para casos como o exemplo anterior, é importante notar que é sempre possível escrever métodos usando iteração ou recursividade. Tipicamente, a recursão fornece um código mais conciso, legível e de fácil manutenção, mas a sua utilização não é obrigatória. + +Alguns usos típicos da recursividade em 4D são: + +- Tratar os registos dentro de tabelas que se relacionam entre si da mesma forma que no exemplo. +- Browsing documents and folders on your disk, using the commands [`FOLDER LIST`](../commands/folder-list) and [`DOCUMENT LIST`](document-list). Uma pasta pode conter pastas e documentos, as próprias subpastas podem conter pastas e documentos, e assim por diante. + +:::warning + +Recursive calls should always end at some point. No exemplo, o método `Genealogia de` deixa de chamar a si próprio quando a consulta não devolve registos. Sem este teste de condição, o método chamar-se-ia indefinidamente; eventualmente, 4D retornaria um erro "Stack Full" porque deixaria de ter espaço para "empilhar" as chamadas (bem como os parâmetros e variáveis locais utilizados no método). + +::: + +## Propriedades + Após criar um método projeto, pode mudar-lhe o nome e modificar as suas propriedades. As propriedades dos métodos projeto referem-se principalmente às suas condições de acesso e segurança (acesso de usuários, servidores integrados ou serviços), bem como ao seu modo de execução. Os outros tipos de métodos não têm propriedades específicas. As suas propriedades estão relacionadas com as dos objetos a que estão ligados. @@ -14,7 +256,7 @@ Para mostrar la caja de diálogo **Propiedades del método** para un método pro > Una función de parámetrización global permite modificar una propiedad para todos o parte de los métodos proyecto de la base en una sola operación (ver [Modificar atributos de los métodos globalmente](#batch-setting-for-method-attributes)). -## Nome +### Nome Puede cambiar el nombre de un método proyecto en el área **Nombre** de la ventana **Propiedades del método** o en el Explorador. @@ -34,37 +276,37 @@ Os métodos base de dados não podem ser renomeados. O mesmo se aplica aos trigg ::: -## Atributos +### Atributos É possível controlar como os métodos projeto são utilizados e/ou chamados em diferentes contextos utilizando atributos. Note-se que é possível definir atributos para toda uma seleção de métodos projeto utilizando o Explorador (ver secção seguinte). -### Invisível +#### Invisível Si no quiere que los usuarios puedan ejecutar un método proyecto utilizando el comando **Método...** del menú **Ejecución**, puede hacerlo Invisible marcando esta opción. Um método invisível não aparece na caixa de diálogo de execução do método. Quando se torna invisível um método projeto, este continua a estar disponível para os programadores da base de dados. Permanece listado na lista de métodos do Explorador e do Editor de Código. -### Partilhada pelos componentes e pela base de dados host +#### Partilhada pelos componentes e pela base de dados host Este atributo é utilizado no âmbito dos componentes. Quando estiver selecionada, indica que o método estará disponível para os componentes quando a aplicação for utilizada como base de dados do anfitrião. Por outro lado, quando a aplicação for utilizada como um componente, o método estará disponível para as bases de dados do anfitrião. Para más información sobre los componentes, consulte el capítulo [Desarrollo e instalación de componentes 4D](../Extensions/develop-components.md). -### Executar no servidor +#### Executar no servidor Este atributo só é levado em consideração para uma aplicação 4D em modo cliente-servidor. Quando esta opção estiver selecionada, o método do projeto é sempre executado no servidor, independentemente da forma como é chamado. Para más información sobre esta opción, consulte [Atributo Ejecutar en el servidor](https://doc.4d.com/4Dv20/4D/20/Execute-on-Server-attribute.300-6330555.en.html). -## Modo Execução +### Modo Execução Esta opção permite-lhe declarar o método elegível para execução em modo preemptivo. Se describe en la [sección Procesos apropiativos](../Develop/preemptive.md). -## Disponível através de +### Disponível através de Os atributos de disponibilidade especificam os serviços externos que estão autorizados a chamar explicitamente o método. -### Serviços Web +#### Serviços Web Este atributo permite-lhe publicar o método atual como um serviço Web acessível através de pedidos SOAP. Para más información, consulte el capítulo [Publicación y uso de los servicios web](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.en.html). Cuando esta opción está marcada, se activa la opción **Publicado en WSDL**. @@ -72,13 +314,13 @@ No Explorer, métodos de projeto oferecidos como um Serviço Web recebem um íco **Nota:** no es posible publicar un método como servicio web si su nombre incluye caracteres que no cumplen con la nomenclatura XML (por ejemplo espacios). Se o nome do método não estiver de acordo com isso, 4D não atribui a propriedade. -### Publicado em WSDL +#### Publicado em WSDL Este atributo só está disponível quando o atributo "Serviço Web" está selecionado. Permite-lhe incluir o método atual no WSDL da aplicação 4D. Para obtener más información al respecto, consulte [Generación del WSDL](https://doc.4d.com/4Dv20/4D/20.2/Publishing-a-Web-Service-with-4D.300-6750334.en.html#502689). No Explorer, os métodos do projeto que são oferecidos como um serviço da Web e publicados no WSDL recebem um ícone específico. -### Etiquetas 4D e URLs (4DACTION...) +#### Etiquetas 4D e URLs (4DACTION...) This option is used to reinforce 4D Web server security: when it is not checked, the project method cannot be executed via an HTTP request containing the special [4DACTION URL](../WebServer/httpRequests.md#4daction) used for calling 4D methods, nor the special [4DSCRIPT, 4DTEXT and 4DHTML tags](../Tags/transformation-tags.md). @@ -86,7 +328,7 @@ No Explorer, os métodos de projeto com esse atributo recebem um ícone específ Por razões de segurança, esta opção está desmarcada por padrão. Cada método que pode ser executado utilizando o URL ou as etiquetas especiais da Web deve ser indicado individualmente. -### SQL +#### SQL Quando está marcada, esta opção permite que o método do projeto seja executado pelo motor SQL de 4D. Por padrão, não está selecionado, o que significa que, a menos que explicitamente autorizado, os métodos do projeto 4D são protegidos e não podem ser chamados pelo motor SQL de 4D. @@ -99,11 +341,11 @@ Esta propriedade se aplica a todas as consultas SQL internas e externas --- exec Para más información, consulte [Implementación del motor SQL de 4D](https://doc.4d.com/4Dv20/4D/20/4D-SQL-engine-implementation.300-6342089.en.html) en el manual SQL de 4D. -### Servidor REST +#### Servidor REST *Esta opção está obsoleta. Calling code through REST calls is only supported with [ORDA data model class functions](../REST/ClassFunctions.md).* -## Definição de lotes para atributos de métodos +### Definição de lotes para atributos de métodos Usando a caixa de diálogo "Atributos para métodos", você pode modificar um atributo (Invisível, oferecido como um serviço Web, etc.) for all or part of the database project methods in a single operation. Esta caraterística é especialmente útil para modificar os atributos de um grande número de métodos de projeto. Também pode ser utilizado durante o desenvolvimento para aplicar rapidamente atributos comuns a grupos de métodos semelhantes.