From 64e16127008b2a6ff91e0a6b6cc714ac7721b19f Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 9 Apr 2026 18:41:17 +0200 Subject: [PATCH 01/25] all xml done --- docs/commands/theme/XML.md | 60 ++++++++++++++++++++++++++++++++ docs/commands/theme/XML_DOM.md | 62 ++++++++++++++++++++++++++++++++++ docs/commands/theme/XML_SAX.md | 31 +++++++++++++++++ 3 files changed, 153 insertions(+) diff --git a/docs/commands/theme/XML.md b/docs/commands/theme/XML.md index ca199ba7db0504..c4cac82e9e7d1d 100644 --- a/docs/commands/theme/XML.md +++ b/docs/commands/theme/XML.md @@ -5,6 +5,66 @@ sidebar_label: XML slug: /commands/theme/XML --- +## Overview of XML Commands + +:::note + +For XML support, 4D uses a library named Xerces.dll developed by the Apache Foundation company. + +::: + + +### XML, DOM, and SAX + +The **XML** theme groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. + +4D also offers two separate sets of XML commands: [DOM](../theme/XML_DOM.md) (Document Object Model) and [SAX](../theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. + +- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. +- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. + +#### See also + +http://www.saxproject.org/?selected=event
+http://www.w3schools.com/xml/ + +### Preemptive mode + +XML references created by a [preemptive process](../../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. + + +### Character Sets + +The following character sets are supported by the XML DOM and XML SAX commands of 4D: + +- ASCII +- UTF-8 +- UTF-16 (Big/Small Endian) +- UCS4 (Big/Small Endian) +- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, +- ISO-8859-1 (or Latin1) +- Windows-1252. + + +### Glossary + +This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. + +- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. +- **Child**: In an XML structure, an element in a level directly below another. +- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. +- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. +- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. +- **Parent**: In an XML structure, an element in a level directly above another. +- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. +- **Root**: An element located at the first level of an XML structure. +- **Sibling**: An element at the same level as another. +- **Structure**: structured XML object. This object can be a document, a variable, or an element. +- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. +- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. +- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. +- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. + || |---| diff --git a/docs/commands/theme/XML_DOM.md b/docs/commands/theme/XML_DOM.md index df18f4c44be734..dabf19701d806d 100644 --- a/docs/commands/theme/XML_DOM.md +++ b/docs/commands/theme/XML_DOM.md @@ -5,6 +5,68 @@ sidebar_label: XML DOM slug: /commands/theme/XML-DOM --- +## Overview of XML DOM Commands + +See [XML, DOM, and SAX](../theme/XML.md#xml-dom-and-sax) section for a definition of XML DOM. + +### Creating, opening and closing XML documents via DOM + +Objects created, modified or parsed by the 4D DOM commands can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../../commands/dom-parse-xml-variable). + +Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../../commands/dom-close-xml) command to close the source in the end. + +Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. + + +### Support of XPath notation + +Several XML DOM commands ([`DOM Create XML element`](../../commands/dom-create-xml-element), [`DOM Find XML element`](../../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. + +XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. + +For example, given the following structure: + +```xml + + + + + + + +``` + +XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. + +4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: + +```xml + + + aaa + bbb + ccc + + +``` + +XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. + +For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../../commands/dom-find-xml-element) command description. + +:::note Compatibility + +Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../../settings/compatibility.md). + +::: + +### Error Handling + +Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. + +In addition, the reference returned in this case is a sequence of 32 zero "0" characters. + + || |---| diff --git a/docs/commands/theme/XML_SAX.md b/docs/commands/theme/XML_SAX.md index 6d5c3979213b4f..0bd973753cc699 100644 --- a/docs/commands/theme/XML_SAX.md +++ b/docs/commands/theme/XML_SAX.md @@ -5,6 +5,37 @@ sidebar_label: XML SAX slug: /commands/theme/XML-SAX --- +## Overview of XML SAX Commands + +See [XML, DOM, and SAX](../theme/XML.md#xml-dom-and-sax) section for a definition of XML SAX. + +### Creating, opening and closing XML documents via SAX + +The SAX commands work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../../commands/send-packet) or [`Append document`](../../commands/append-document). + +The creation and opening of XML documents by programming is carried out using the [`Create document`](../../commands/create-document) and [`Open document`](../../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. + +:::note + +Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. + +::: + +Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../../commands/close-document) command. If any XML elements were open, they will be closed automatically. + +### About end-of-line characters and BOM management + +When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: + +- CRLF characters on Windows and LF on macOS for end-of-line characters +- files are written without BOM. + +:::note Compatibility + +In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../../commands/xml-set-options) command and a [Compatibility setting](../../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../../commands/xml-set-options) command before the first SAX writing command. + +::: + || |---| From 75daef02eca894fb8a35f724356f93a5c4f6d42a Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 10 Apr 2026 17:47:28 +0200 Subject: [PATCH 02/25] forms started --- docs/FormEditor/forms.md | 22 ++++++++++ docs/commands/theme/XML.md | 17 ++++---- docs/commands/theme/XML_DOM.md | 80 +++++++++++++++++----------------- docs/commands/theme/XML_SAX.md | 43 +++++++++--------- 4 files changed, 94 insertions(+), 68 deletions(-) diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md index 1752c59a143b15..363a933f46d0b8 100644 --- a/docs/FormEditor/forms.md +++ b/docs/FormEditor/forms.md @@ -67,6 +67,28 @@ You can add or modify 4D forms using the following elements: } ``` +## Using forms + +In your 4D desktop applications, forms are called using specific commands of the 4D Language. Basically to display a form, your code has to execute the following sequence: + +1. Open a window or select an already opened window. +2. Select the form to be displayed in the window. +3. Select the datasource of the form. + +All these steps require to use commands of both the [**Windows**](../commands/theme/Windows.md) and [**Forms**](../commands/theme/Forms.md) themes. + +::note Compatibility + +All-in-one commands such as [`ADD RECORD`](../commands/add-record) or [`MODIFY RECORD`](../commands/add-record) merge all steps in a single call. These legacy commands can still be used for prototyping or basic developments but are not adapted to modern, fully controlled interfaces. + +::: + +### Opening a form window + +The main way to open a window for your form is to call the [`Open form window`](../commands/open-form-window) command. This command takes a form name as parameter, so that the window size will automatically fit the form size, taking its [size properties](../FormEditor/properties_FormSize.md) into account. For example: + + + ## Project form and Table form There are two categories of forms: diff --git a/docs/commands/theme/XML.md b/docs/commands/theme/XML.md index c4cac82e9e7d1d..b592bec6d156ea 100644 --- a/docs/commands/theme/XML.md +++ b/docs/commands/theme/XML.md @@ -5,6 +5,14 @@ sidebar_label: XML slug: /commands/theme/XML --- +|| +|---| +|[](../../commands/xml-decode)
| +|[](../../commands/xml-get-error)
| +|[](../../commands/xml-get-options)
| +|[](../../commands/xml-set-options)
| + + ## Overview of XML Commands :::note @@ -18,7 +26,7 @@ For XML support, 4D uses a library named Xerces.dll developed by the Apache Foun The **XML** theme groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. -4D also offers two separate sets of XML commands: [DOM](../theme/XML_DOM.md) (Document Object Model) and [SAX](../theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. +4D also offers two separate sets of XML commands: [**DOM**](../theme/XML_DOM.md) (Document Object Model) and [**SAX**](../theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. - The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. - The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. @@ -65,10 +73,3 @@ This non-exhaustive list details the main XML concepts used by the commands and - **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. - **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. - -|| -|---| -|[](../../commands/xml-decode)
| -|[](../../commands/xml-get-error)
| -|[](../../commands/xml-get-options)
| -|[](../../commands/xml-set-options)
| diff --git a/docs/commands/theme/XML_DOM.md b/docs/commands/theme/XML_DOM.md index dabf19701d806d..35952a7bf19560 100644 --- a/docs/commands/theme/XML_DOM.md +++ b/docs/commands/theme/XML_DOM.md @@ -5,6 +5,47 @@ sidebar_label: XML DOM slug: /commands/theme/XML-DOM --- + + +|| +|---| +|[](../../commands/dom-append-xml-child-node)
| +|[](../../commands/dom-append-xml-element)
| +|[](../../commands/dom-close-xml)
| +|[](../../commands/dom-count-xml-attributes)
| +|[](../../commands/dom-count-xml-elements)
| +|[](../../commands/dom-create-xml-element)
| +|[](../../commands/dom-create-xml-element-arrays)
| +|[](../../commands/dom-create-xml-ref)
| +|[](../../commands/dom-export-to-file)
| +|[](../../commands/dom-export-to-var)
| +|[](../../commands/dom-find-xml-element)
| +|[](../../commands/dom-find-xml-element-by-id)
| +|[](../../commands/dom-get-first-child-xml-element)
| +|[](../../commands/dom-get-last-child-xml-element)
| +|[](../../commands/dom-get-next-sibling-xml-element)
| +|[](../../commands/dom-get-parent-xml-element)
| +|[](../../commands/dom-get-previous-sibling-xml-element)
| +|[](../../commands/dom-get-root-xml-element)
| +|[](../../commands/dom-get-xml-attribute-by-index)
| +|[](../../commands/dom-get-xml-attribute-by-name)
| +|[](../../commands/dom-get-xml-child-nodes)
| +|[](../../commands/dom-get-xml-document-ref)
| +|[](../../commands/dom-get-xml-element)
| +|[](../../commands/dom-get-xml-element-name)
| +|[](../../commands/dom-get-xml-element-value)
| +|[](../../commands/dom-get-xml-information)
| +|[](../../commands/dom-insert-xml-element)
| +|[](../../commands/dom-parse-xml-source)
| +|[](../../commands/dom-parse-xml-variable)
| +|[](../../commands/dom-remove-xml-attribute)
| +|[](../../commands/dom-remove-xml-element)
| +|[](../../commands/dom-set-xml-attribute)
| +|[](../../commands/dom-set-xml-declaration)
| +|[](../../commands/dom-set-xml-element-name)
| +|[](../../commands/dom-set-xml-element-value)
| + + ## Overview of XML DOM Commands See [XML, DOM, and SAX](../theme/XML.md#xml-dom-and-sax) section for a definition of XML DOM. @@ -66,42 +107,3 @@ Many functions in this theme return an XML element reference. If an error occurs In addition, the reference returned in this case is a sequence of 32 zero "0" characters. - - -|| -|---| -|[](../../commands/dom-append-xml-child-node)
| -|[](../../commands/dom-append-xml-element)
| -|[](../../commands/dom-close-xml)
| -|[](../../commands/dom-count-xml-attributes)
| -|[](../../commands/dom-count-xml-elements)
| -|[](../../commands/dom-create-xml-element)
| -|[](../../commands/dom-create-xml-element-arrays)
| -|[](../../commands/dom-create-xml-ref)
| -|[](../../commands/dom-export-to-file)
| -|[](../../commands/dom-export-to-var)
| -|[](../../commands/dom-find-xml-element)
| -|[](../../commands/dom-find-xml-element-by-id)
| -|[](../../commands/dom-get-first-child-xml-element)
| -|[](../../commands/dom-get-last-child-xml-element)
| -|[](../../commands/dom-get-next-sibling-xml-element)
| -|[](../../commands/dom-get-parent-xml-element)
| -|[](../../commands/dom-get-previous-sibling-xml-element)
| -|[](../../commands/dom-get-root-xml-element)
| -|[](../../commands/dom-get-xml-attribute-by-index)
| -|[](../../commands/dom-get-xml-attribute-by-name)
| -|[](../../commands/dom-get-xml-child-nodes)
| -|[](../../commands/dom-get-xml-document-ref)
| -|[](../../commands/dom-get-xml-element)
| -|[](../../commands/dom-get-xml-element-name)
| -|[](../../commands/dom-get-xml-element-value)
| -|[](../../commands/dom-get-xml-information)
| -|[](../../commands/dom-insert-xml-element)
| -|[](../../commands/dom-parse-xml-source)
| -|[](../../commands/dom-parse-xml-variable)
| -|[](../../commands/dom-remove-xml-attribute)
| -|[](../../commands/dom-remove-xml-element)
| -|[](../../commands/dom-set-xml-attribute)
| -|[](../../commands/dom-set-xml-declaration)
| -|[](../../commands/dom-set-xml-element-name)
| -|[](../../commands/dom-set-xml-element-value)
| diff --git a/docs/commands/theme/XML_SAX.md b/docs/commands/theme/XML_SAX.md index 0bd973753cc699..de16e6c401d184 100644 --- a/docs/commands/theme/XML_SAX.md +++ b/docs/commands/theme/XML_SAX.md @@ -5,6 +5,28 @@ sidebar_label: XML SAX slug: /commands/theme/XML-SAX --- + +|| +|---| +|[](../../commands/sax-add-processing-instruction)
| +|[](../../commands/sax-add-xml-cdata)
| +|[](../../commands/sax-add-xml-comment)
| +|[](../../commands/sax-add-xml-doctype)
| +|[](../../commands/sax-add-xml-element-value)
| +|[](../../commands/sax-close-xml-element)
| +|[](../../commands/sax-get-xml-cdata)
| +|[](../../commands/sax-get-xml-comment)
| +|[](../../commands/sax-get-xml-document-values)
| +|[](../../commands/sax-get-xml-element)
| +|[](../../commands/sax-get-xml-element-value)
| +|[](../../commands/sax-get-xml-entity)
| +|[](../../commands/sax-get-xml-node)
| +|[](../../commands/sax-get-xml-processing-instruction)
| +|[](../../commands/sax-open-xml-element)
| +|[](../../commands/sax-open-xml-element-arrays)
| +|[](../../commands/sax-set-xml-declaration)
| + + ## Overview of XML SAX Commands See [XML, DOM, and SAX](../theme/XML.md#xml-dom-and-sax) section for a definition of XML SAX. @@ -35,24 +57,3 @@ When writing SAX documents, 4D uses the following default settings for end-of-li In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../../commands/xml-set-options) command and a [Compatibility setting](../../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../../commands/xml-set-options) command before the first SAX writing command. ::: - - -|| -|---| -|[](../../commands/sax-add-processing-instruction)
| -|[](../../commands/sax-add-xml-cdata)
| -|[](../../commands/sax-add-xml-comment)
| -|[](../../commands/sax-add-xml-doctype)
| -|[](../../commands/sax-add-xml-element-value)
| -|[](../../commands/sax-close-xml-element)
| -|[](../../commands/sax-get-xml-cdata)
| -|[](../../commands/sax-get-xml-comment)
| -|[](../../commands/sax-get-xml-document-values)
| -|[](../../commands/sax-get-xml-element)
| -|[](../../commands/sax-get-xml-element-value)
| -|[](../../commands/sax-get-xml-entity)
| -|[](../../commands/sax-get-xml-node)
| -|[](../../commands/sax-get-xml-processing-instruction)
| -|[](../../commands/sax-open-xml-element)
| -|[](../../commands/sax-open-xml-element-arrays)
| -|[](../../commands/sax-set-xml-declaration)
| From c25acffe8beebdbcf5460e16a061022ce89a4903 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 15 Apr 2026 18:05:07 +0200 Subject: [PATCH 03/25] Update forms.md --- docs/FormEditor/forms.md | 47 +++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md index 363a933f46d0b8..cb931948f48ea7 100644 --- a/docs/FormEditor/forms.md +++ b/docs/FormEditor/forms.md @@ -69,24 +69,55 @@ You can add or modify 4D forms using the following elements: ## Using forms -In your 4D desktop applications, forms are called using specific commands of the 4D Language. Basically to display a form, your code has to execute the following sequence: +In your 4D desktop applications, forms can be used in various ways, depending on their status within your interface needs. A form can be: -1. Open a window or select an already opened window. -2. Select the form to be displayed in the window. -3. Select the datasource of the form. +- used in its own window for data viewing, processing, editing, or to display on-screen information to the user, +- used embedded in another form (subform), +- used a template for printing. -All these steps require to use commands of both the [**Windows**](../commands/theme/Windows.md) and [**Forms**](../commands/theme/Forms.md) themes. + +### Using project forms in windows + +Forms are called using specific commands of the 4D Language. The straighforward steps to display a form on screen are: + +1. Call the [`Open form window`](../commands/open-form-window) command to open a window tailored for your project form. +2. Call the [`DIALOG`](../commands/dialog) command to actually load the form in the window, ready for user interaction. +3. (optional) Use the [`Form`](../commands/form) command from within the form context to access form data. You can also use [`CALL FORM`](../commands/call-form) to control the form execution. + +Example: + +```4d +var $win:=Open form window("Edit_Customer";Movable form dialog box) +DIALOG("Edit_Children";$mydata) //displays dialog filled with values +``` ::note Compatibility -All-in-one commands such as [`ADD RECORD`](../commands/add-record) or [`MODIFY RECORD`](../commands/add-record) merge all steps in a single call. These legacy commands can still be used for prototyping or basic developments but are not adapted to modern, fully controlled interfaces. +All-in-one commands such as [`ADD RECORD`](../commands/add-record) or [`MODIFY RECORD`](../commands/add-record) merge all steps in a single call. These legacy commands can still be used for prototyping or basic developments but are not adapted to modern, fully controlled interfaces. They directly rely on the 4D database and legacy features such as [table forms](#project-form-and-table-form) and do not benefit from the power and flexibility of [ORDA features](../ORDA/overview.md). Unless specific needs, it is recommended to use project forms for your 4D desktop application interfaces. ::: -### Opening a form window +### Using forms to be printed + +You can use forms to print data, either as page or as list. To print a form in your 4D application: + +1. Call the [`Print form`](../commands/print-form) command. +2. (optional) Use commands of the [Printing](../commands/theme/Printing.md) theme to control printing area and page breaks. + +### Using forms as subforms + +A form can be embedded within another form, in which case it becomes a subform. A subform is actually a [form object](../FormObjects/subform_overview.md) and follow specific rules. + +A subform is automatically used when its parent form is [displayed in a window](#using-project-forms-in-windows). + + +### Other form usages -The main way to open a window for your form is to call the [`Open form window`](../commands/open-form-window) command. This command takes a form name as parameter, so that the window size will automatically fit the form size, taking its [size properties](../FormEditor/properties_FormSize.md) into account. For example: +There are several other ways to use forms in the 4D applications, including: +- a form can be [inherited](#inherited-forms) from another form, +- a form can be [associated to a listbox](../FormObjects/properties_ListBox.md#detail-form-name) in response to a user action to display a row using an edit button or a double-click, +- the [label editor can use a form](../Desktop/labels.md#form-to-use) as template to print labels. ## Project form and Table form From 609d2e1742e0fbf0b2ea8db518b714df5b7972de Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 10:53:48 +0200 Subject: [PATCH 04/25] example with screenshots --- docs/FormEditor/forms.md | 42 +++++++++++++------ docs/assets/en/FormEditor/example-form-1.png | Bin 0 -> 3173 bytes docs/assets/en/FormEditor/example-form-2.png | Bin 0 -> 5884 bytes 3 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 docs/assets/en/FormEditor/example-form-1.png create mode 100644 docs/assets/en/FormEditor/example-form-2.png diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md index cb931948f48ea7..98ccb60e7ffd27 100644 --- a/docs/FormEditor/forms.md +++ b/docs/FormEditor/forms.md @@ -72,8 +72,9 @@ You can add or modify 4D forms using the following elements: In your 4D desktop applications, forms can be used in various ways, depending on their status within your interface needs. A form can be: - used in its own window for data viewing, processing, editing, or to display on-screen information to the user, +- used as template for printing, - used embedded in another form (subform), -- used a template for printing. +- or called by specific features like the Label editor. ### Using project forms in windows @@ -84,33 +85,48 @@ Forms are called using specific commands of the 4D Language. The straighforward 2. Call the [`DIALOG`](../commands/dialog) command to actually load the form in the window, ready for user interaction. 3. (optional) Use the [`Form`](../commands/form) command from within the form context to access form data. You can also use [`CALL FORM`](../commands/call-form) to control the form execution. -Example: - -```4d -var $win:=Open form window("Edit_Customer";Movable form dialog box) -DIALOG("Edit_Children";$mydata) //displays dialog filled with values -``` - ::note Compatibility All-in-one commands such as [`ADD RECORD`](../commands/add-record) or [`MODIFY RECORD`](../commands/add-record) merge all steps in a single call. These legacy commands can still be used for prototyping or basic developments but are not adapted to modern, fully controlled interfaces. They directly rely on the 4D database and legacy features such as [table forms](#project-form-and-table-form) and do not benefit from the power and flexibility of [ORDA features](../ORDA/overview.md). Unless specific needs, it is recommended to use project forms for your 4D desktop application interfaces. ::: -### Using forms to be printed -You can use forms to print data, either as page or as list. To print a form in your 4D application: +#### Simple example + +You create the following form in the [Form editor](./formEditor.md): + +![](../assets/en/FormEditor/example-form-1.png) + +If you execute the following project method: + +```4d +var $mydata:={name: "Smith"; age: 42} +var $win:=Open form window("myForm"; Movable form dialog box) +SET WINDOW TITLE("My First 4D Form") +DIALOG("myForm"; $mydata) //displays dialog filled with values +``` + +4D displays: + +![](../assets/en/FormEditor/example-form-1.png) -1. Call the [`Print form`](../commands/print-form) command. -2. (optional) Use commands of the [Printing](../commands/theme/Printing.md) theme to control printing area and page breaks. ### Using forms as subforms -A form can be embedded within another form, in which case it becomes a subform. A subform is actually a [form object](../FormObjects/subform_overview.md) and follow specific rules. +A form can be embedded within another form, in which case it becomes a [subform object](../FormObjects/subform_overview.md) which follows specific rules. A subform is automatically used when its parent form is [displayed in a window](#using-project-forms-in-windows). +### Using forms to be printed + +You can use forms to print data, either as page or as list. To print a form in your 4D application: + +1. Call the [`Print form`](../commands/print-form) command. +2. (optional) Use commands of the [Printing](../commands/theme/Printing.md) theme to control printing area and page breaks. + + ### Other form usages There are several other ways to use forms in the 4D applications, including: diff --git a/docs/assets/en/FormEditor/example-form-1.png b/docs/assets/en/FormEditor/example-form-1.png new file mode 100644 index 0000000000000000000000000000000000000000..450212bbde995ba7a79a943038fab33f9eba6def GIT binary patch literal 3173 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 bj=6~C#7`SV)@0$&004j+TV5_Oa=Z6$^%wEw literal 0 HcmV?d00001 diff --git a/docs/assets/en/FormEditor/example-form-2.png b/docs/assets/en/FormEditor/example-form-2.png new file mode 100644 index 0000000000000000000000000000000000000000..edd1a0ad5b48c47fd2b28dd38646c502cd2c3e27 GIT binary patch literal 5884 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 Date: Thu, 16 Apr 2026 10:56:31 +0200 Subject: [PATCH 05/25] Update forms.md --- docs/FormEditor/forms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md index 98ccb60e7ffd27..53ac7cb8b8c7bf 100644 --- a/docs/FormEditor/forms.md +++ b/docs/FormEditor/forms.md @@ -109,7 +109,7 @@ DIALOG("myForm"; $mydata) //displays dialog filled with values 4D displays: -![](../assets/en/FormEditor/example-form-1.png) +![](../assets/en/FormEditor/example-form-2.png) ### Using forms as subforms From 289aa06d4ff0042a49ae07fcf041c9c20fc27819 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 16 Apr 2026 18:40:46 +0200 Subject: [PATCH 06/25] after proofreads --- docs/Develop/async.md | 2 +- docs/FormEditor/forms.md | 74 +++++++++++++--- docs/assets/en/FormEditor/Subform-example.png | Bin 0 -> 15559 bytes docs/assets/en/FormEditor/example-form-1.png | Bin 3173 -> 3698 bytes docs/assets/en/FormEditor/example-form-2.png | Bin 5884 -> 6409 bytes docs/commands/theme/System_Documents.md | 82 ++++++++++++++++++ docs/language-legacy/Data Entry/dialog.md | 8 +- .../Windows/open-form-window.md | 5 +- 8 files changed, 153 insertions(+), 18 deletions(-) create mode 100644 docs/assets/en/FormEditor/Subform-example.png diff --git a/docs/Develop/async.md b/docs/Develop/async.md index 3b0e4335599517..9d49f86305fe69 100644 --- a/docs/Develop/async.md +++ b/docs/Develop/async.md @@ -61,7 +61,7 @@ The calling process posts a message then the worker executes it. The worker can ### Event listening -In event-driven development, it is obvious that some code must be able to listen for incoming events. Events can be generated by the user interface (such as a mouse click on an object or a keyboard key pressed) or by any other interaction such as an http request or the end of another action. For example, when a form is displayed using the `DIALOG` command, user actions can trigger events that your code can process. A click on a button will trigger the code associated to the button. +In event-driven development, it is obvious that some code must be able to listen for incoming events. Events can be generated by the user interface (such as a mouse click on an object or a keyboard key pressed) or by any other interaction such as an http request or the end of another action. For example, when a form is displayed using the [`DIALOG`](../commands/dialog) command, user actions can trigger events that your code can process. A click on a button will trigger the code associated to the button. In the context of asynchronous execution, the following features place your code in listening mode: diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md index 53ac7cb8b8c7bf..9ade252eef8c42 100644 --- a/docs/FormEditor/forms.md +++ b/docs/FormEditor/forms.md @@ -77,13 +77,14 @@ In your 4D desktop applications, forms can be used in various ways, depending on - or called by specific features like the Label editor. -### Using project forms in windows +### Using a project form in a window Forms are called using specific commands of the 4D Language. The straighforward steps to display a form on screen are: -1. Call the [`Open form window`](../commands/open-form-window) command to open a window tailored for your project form. -2. Call the [`DIALOG`](../commands/dialog) command to actually load the form in the window, ready for user interaction. -3. (optional) Use the [`Form`](../commands/form) command from within the form context to access form data. You can also use [`CALL FORM`](../commands/call-form) to control the form execution. +1. Call the [`Open form window`](../commands/open-form-window) command to configure a window tailored for your project form. Note that the command itself does not display anything. +2. Call the [`DIALOG`](../commands/dialog) command to actually load the form in the form window, ready for user interaction. [`DIALOG`](../commands/dialog) loads form data and places your code in listening mode to user events (see also ["Event listening" paragraph](../Develop/async.md#event-listening). +3. (optional) Use the [`Form`](../commands/form) command from within the form context to access form data. + ::note Compatibility @@ -94,17 +95,33 @@ All-in-one commands such as [`ADD RECORD`](../commands/add-record) or [`MODIFY R #### Simple example -You create the following form in the [Form editor](./formEditor.md): +You create the following basic form in the [Form editor](./formEditor.md): ![](../assets/en/FormEditor/example-form-1.png) +The form is [associated with a "Person" class](./properties_FormProperties.md#form-class), defined as follow: + +```4d + //cs.Person +property name : Text +property age : Integer + +Class constructor + This.name:="" + This.age:=0 +``` + If you execute the following project method: ```4d var $mydata:={name: "Smith"; age: 42} var $win:=Open form window("myForm"; Movable form dialog box) -SET WINDOW TITLE("My First 4D Form") DIALOG("myForm"; $mydata) //displays dialog filled with values +CLOSE WINDOW($win) //releases reference +If (OK=1) //the user clicked OK + var $name : Text:=Form.name //gets data + var $age : Integer:=Form.age +End if ``` 4D displays: @@ -114,17 +131,52 @@ DIALOG("myForm"; $mydata) //displays dialog filled with values ### Using forms as subforms -A form can be embedded within another form, in which case it becomes a [subform object](../FormObjects/subform_overview.md) which follows specific rules. +A form can be embedded within another form, in which case it becomes a [subform object](../FormObjects/subform_overview.md) which follows specific rules. A subform is automatically used when its parent form is [displayed in a window](#using-a-project-form-in-a-window). + +In the same way that you pass an object to a form with the [`DIALOG`](../commands/dialog) command, you can also pass an object to a subform area using the property list. Then, you can use it in the subform with the [`Form`](../commands/form) command. In this example, the "InvoiceAddress" object is bound to the subform: + +![](../assets/en/FormEditor/subform-example.png) -A subform is automatically used when its parent form is [displayed in a window](#using-project-forms-in-windows). ### Using forms to be printed -You can use forms to print data, either as page or as list. To print a form in your 4D application: +You can use forms to print data, either as page or as list. + +- To simply print some part of a form, use the [`Print form`](../commands/print-form) command. For example: -1. Call the [`Print form`](../commands/print-form) command. -2. (optional) Use commands of the [Printing](../commands/theme/Printing.md) theme to control printing area and page breaks. +```4d +var $formData:={} +$formData.lastname:="Smith" +$formData.firstname:="john" +$formData.request:="I need more COFFEE" +var $h:=Print form("Request_var";$formData;Form detail) +``` + +- To print a form within a printing job to process data during printing, use [`FORM LOAD`](../commands/form-load) and [`Print object`](../commands/print-object) commands. For example: + +```4d + var $formData : Object + var $over : Boolean + var $full : Boolean + + OPEN PRINTING JOB + $formData:={} + $formData.LBcollection:=[] + ... //fill the collection with data + + FORM LOAD("GlobalForm";$formData) + $over:=False + Repeat + $full:=Print object(*;"LB") // the datasource of this "LB" listbox is Form.LBcollection + LISTBOX GET PRINT INFORMATION(*;"LB";lk printing is over;$over) + If(Not($over)) + PAGE BREAK + End if + Until($over) + FORM UNLOAD + CLOSE PRINTING JOB + ``` ### Other form usages diff --git a/docs/assets/en/FormEditor/Subform-example.png b/docs/assets/en/FormEditor/Subform-example.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1cd6b7e973b8c557d957727430f34172499483 GIT binary patch literal 15559 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 literal 0 HcmV?d00001 diff --git a/docs/assets/en/FormEditor/example-form-1.png b/docs/assets/en/FormEditor/example-form-1.png index 450212bbde995ba7a79a943038fab33f9eba6def..ce157014371ec1b5c1cb5701e4fd650bde6926e7 100644 GIT binary patch literal 3698 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 literal 3173 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 bj=6~C#7`SV)@0$&004j+TV5_Oa=Z6$^%wEw diff --git a/docs/assets/en/FormEditor/example-form-2.png b/docs/assets/en/FormEditor/example-form-2.png index edd1a0ad5b48c47fd2b28dd38646c502cd2c3e27..592ae7d506e652325822925d2809eed5c8a84229 100644 GIT binary patch literal 6409 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 literal 5884 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](../../commands/text-to-document)
| |[](../../commands/volume-attributes)
| |[](../../commands/volume-list)
| + + +:::info Compatibility + +Legacy commands from this theme can usually be usefully replaced by commands of the [*File and Folder*](./File_and_Folder.md) theme and their associated [File](../../API/FileClass.md), [Folder](../../API/FolderClass.md), [ZipFile](../../API/ZipFileClass.md) and [ZipFolder](../../API/ZipFolderClass.md) classes, allowing you to handle files and folders as objects. + +::: + + +## Document reference number + +You open a document with the [`Open document`](../../commands/open-document), [`Create document`](../../commands/create-document) and [`Append document`](../../commands/append-document) commands. Once a document is open, you can read and write characters from and to the document using commands such as [`RECEIVE PACKET`](../../commands/receive-packet) and [`SEND PACKET`](../../commands/send-packet). When you are finished with the document, you usually close it using the `CLOSE DOCUMENT` command. + +All open documents returned by these commands are referred to using a **document reference number** (*DocRef*). A *DocRef* uniquely identifies an open document. It is formally an expression of the **Time** type. All commands working with open documents expect *DocRef* as a parameter. If you pass an incorrect *DocRef* to one of these commands, a file manager error occurs. + +A document can be opened in **read/write** mode by only one process at a time. In **read-only** mode, one process can open several documents, several processes can open multiple documents, you can open the same document as many times as necessary, but you cannot open the same document in read/write mode twice at a time. The `Create document` and `Append document` commands automatically open documents in read/write mode. Only the `Open document` command lets you choose the opening mode. + +:::note + +When it is called from a [preemptive process](../../Develop/preemptive.md), a *DocRef* reference can only be used from this preemptive process. When it is called from a cooperative process, a *DocRef* reference can be used from any other cooperative process. + +::: + + +## The Document system variable + +`Open document`, `Create document`, `Append document` and `Select document` enable you to access a document using the standard Open or Save file dialog boxes. When you access a document through a standard dialog, 4D returns the full pathname of the document in the [`Document` system variable](../../Concepts/variables.md#system-variables). This system variable has to be distinguished from the *document* parameter that appears in the parameter list of the commands. + + + +## Absolute or relative pathname + +Most of the routines of this section accept document names, relative pathnames or absolute pathnames: + +Relative pathnames define a location with respect to a folder located on disk. Passing only a document name is considered as using a relative pathname. In 4D, a relative pathname is usually expressed with respect to the database folder, i.e. the folder containing the structure file. Relative pathnames are especially useful when deploying applications in heterogenous environments. +Absolute pathnames define a location with respect to the root of the volume and so they do not depend on the current location of the database folder. +To determine whether a pathname passed to a command must be interpreted as absolute or relative, 4D applies a specific algorithm on each platform. + +Windows +If the parameter contains only two characters and if the second one is a ':', + or if the text contains ':' and '\' as the second and third character, + or if the text starts with "\\", +then the pathname is absolute. + +In all other cases, the pathname is relative. + +Examples with the CREATE FOLDER command: + + CREATE FOLDER("lundi") // relative path + CREATE FOLDER("\Monday") // relative path + CREATE FOLDER("\Monday\Tuesday") // relative path + CREATE FOLDER("c:") // absolute path + CREATE FOLDER("d:\Monday") // absolute path + CREATE FOLDER("\\srv-Internal\temp") // absolute path + +macOS +If the text starts with a folder separator ':', + or if does not contain any, +then the path is relative. + +In all other cases, it is absolute. + +Examples with the CREATE FOLDER command: + + CREATE FOLDER("Monday") // relative path + CREATE FOLDER("macintosh hd:") // absolute path + CREATE FOLDER("Monday:Tuesday") // absolute path (a volume must be called Monday) + CREATE FOLDER(":Monday:Tuesday") // relative path + +:::note + +See also [**Absolute and relative pathnames** in the Concepts section](../../Concepts/paths.md#absolute-and-relative-pathnames). + +::: + +## Extracting pathname contents + +You can handle pathname contents using the Path to object and Object to path commands. In particular, using these commands, you can extract from a pathname: + +a file name, +the parent folder path, +the file or folder extension. \ No newline at end of file diff --git a/docs/language-legacy/Data Entry/dialog.md b/docs/language-legacy/Data Entry/dialog.md index fc5405d48bf146..7c5a8845635065 100644 --- a/docs/language-legacy/Data Entry/dialog.md +++ b/docs/language-legacy/Data Entry/dialog.md @@ -33,11 +33,11 @@ displayed_sidebar: docs ## Description -The **DIALOG** command presents the *form* to the user, along with *formData* parameter(s) (optional). +The **DIALOG** command presents the *form* to the user, along with *formData* parameter(s) (optional), in the last opened window. This command is designed to work with customized and advanced user interfaces based on forms. You can use it to display information coming from the database or other locations, or to provide data entry features. Unlike [ADD RECORD](../commands/add-record) or [MODIFY RECORD](../commands/modify-record), **DIALOG** gives you full control over the form, its contents and the navigation and validation buttons. -This command is typically called along with the [Open form window](../commands/open-form-window) to display sophisticated forms, as shown in the following example: +This command must be called along with the [Open form window](../commands/open-form-window) to display sophisticated forms, as shown in the following example: ![](../../assets/en/commands/pict3541609.en.png) @@ -69,7 +69,7 @@ To fill the "form data" object, you have two possibilities: ::: -The dialog is closed by the user either with an "accept" action (triggered by the ak accept standard action, the Enter key, or the [ACCEPT](../commands/accept) command), or with a "cancel" action (triggered by the ak cancel standard action, the Escape key, or the [CANCEL](../commands/cancel) command). An accept action will set the OK system variable to 1, while a cancel action will set OK to 0\. +The dialog is closed by the user either with an "accept" action (triggered by the `ak accept` standard action, the Enter key, or the [ACCEPT](../commands/accept) command), or with a "cancel" action (triggered by the `ak cancel` standard action, the Escape key, or the [CANCEL](../commands/cancel) command). An accept action will set the OK [system variable](../../Concepts/variables.md#system-variables) to 1, while a cancel action will set OK to 0. Keep in mind that validation does not equal saving: if the dialog includes fields, you must explicitly call the [SAVE RECORD](../commands/save-record) command to save any data that has been modified. @@ -78,7 +78,7 @@ This form then reacts “normally” to user actions and is closed using a stand **Notes:** -* You can combine the use of the **DIALOG**(form;\*) syntax with the [CALL FORM](../commands/call-form) command to establish communication between the forms. +* You can combine the use of the **DIALOG**(form;\*) syntax with the [`CALL FORM`](../commands/call-form) command to establish communication between the forms. * You must create a window before calling the **DIALOG**(form;\*) statement. It is not possible to use the current dialog window in the process nor the window created by default for each process. Otherwise, error -9909 is generated. * When the *\** parameter is used, the window is closed automatically following a standard action or a call to the [CANCEL](../commands/cancel) or [ACCEPT](../commands/accept) command. You do not have to manage the closing of the window itself. diff --git a/docs/language-legacy/Windows/open-form-window.md b/docs/language-legacy/Windows/open-form-window.md index 3e974daf0ce230..c58bbc1639b8a1 100644 --- a/docs/language-legacy/Windows/open-form-window.md +++ b/docs/language-legacy/Windows/open-form-window.md @@ -173,7 +173,7 @@ These window types have the following properties: |Suitable for scroll bars|No|No|No| |Modal|Yes|Yes, but can be moved|Yes, but can be moved| -**Usage**: `DIALOG`, `ADD RECORD(...;...*)` or equivalent. +**Usage**: [`DIALOG`](../commands/dialog), `ADD RECORD(...;...*)` or equivalent. #### Palette form window {#palette-form-window} @@ -225,7 +225,7 @@ Sheet windows are specific to macOS. These windows are displayed above the main - Since a sheet window must be drawn above a form, its display is pushed back in the [`On Load` event](../../Events/onLoad.md) of the first form loaded in the window ([see example 3](#example-3)). -**Usage**: `DIALOG`, `ADD RECORD(...;...*)` or equivalent, under macOS (not standard under Windows). +**Usage**: [`DIALOG`](../commands/dialog), `ADD RECORD(...;...*)` or equivalent, under macOS (not standard under Windows). #### Toolbar form window {#toolbar-form-window} @@ -299,6 +299,7 @@ which displays: ## See also +[DIALOG](../commands/dialog) [FORM GET PROPERTIES](../commands/form-get-properties) [Open window](../commands/open-window) From 41231c48cdb1c615104a2d9960c1a07d1ffcf98b Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Fri, 17 Apr 2026 12:48:11 +0200 Subject: [PATCH 07/25] Update forms.md --- docs/FormEditor/forms.md | 41 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md index 9ade252eef8c42..6211a78bfa96d5 100644 --- a/docs/FormEditor/forms.md +++ b/docs/FormEditor/forms.md @@ -69,7 +69,7 @@ You can add or modify 4D forms using the following elements: ## Using forms -In your 4D desktop applications, forms can be used in various ways, depending on their status within your interface needs. A form can be: +Forms are called using specific commands of the 4D Language. In your 4D desktop applications, forms can be used in various ways, depending on their status within your interface needs. A form can be: - used in its own window for data viewing, processing, editing, or to display on-screen information to the user, - used as template for printing, @@ -79,10 +79,10 @@ In your 4D desktop applications, forms can be used in various ways, depending on ### Using a project form in a window -Forms are called using specific commands of the 4D Language. The straighforward steps to display a form on screen are: +When you want to use a form as on-screen dialog, you need to (1) create a window and (2) load the form within the window, along with an event loop to process user actions. The straighforward steps to display a form on screen are: -1. Call the [`Open form window`](../commands/open-form-window) command to configure a window tailored for your project form. Note that the command itself does not display anything. -2. Call the [`DIALOG`](../commands/dialog) command to actually load the form in the form window, ready for user interaction. [`DIALOG`](../commands/dialog) loads form data and places your code in listening mode to user events (see also ["Event listening" paragraph](../Develop/async.md#event-listening). +1. Call the [`Open form window`](../commands/open-form-window) command to create and preconfigure a window tailored for your form. Note that the command only draw aan empty window, it does not display anything. +2. In the same method, call the [`DIALOG`](../commands/dialog) command to actually load the form in the opened form window, ready for user interaction. [`DIALOG`](../commands/dialog) loads form data and places your code in listening mode to user events. When you call this command without asterisk (\*), the dialog will stay on screen and the code execution is frozen until an event occurs (see also ["Event listening" paragraph](../Develop/async.md#event-listening)). 3. (optional) Use the [`Form`](../commands/form) command from within the form context to access form data. @@ -99,10 +99,10 @@ You create the following basic form in the [Form editor](./formEditor.md): ![](../assets/en/FormEditor/example-form-1.png) -The form is [associated with a "Person" class](./properties_FormProperties.md#form-class), defined as follow: +The form is [associated with a "myForm" class](./properties_FormProperties.md#form-class), defined as follow: ```4d - //cs.Person + //cs.myForm property name : Text property age : Integer @@ -111,17 +111,30 @@ Class constructor This.age:=0 ``` -If you execute the following project method: +The form class is automatically instantiated by 4D once the form is loaded. If you execute the following project method: ```4d -var $mydata:={name: "Smith"; age: 42} -var $win:=Open form window("myForm"; Movable form dialog box) -DIALOG("myForm"; $mydata) //displays dialog filled with values + // Instantiate a form object that will host form data and UI logic +var $formObject:=cs.myForm.new() + + //Prepare default value within the form object +$formObject.name:="Smith" +$formObject.age:=42 + + // Create an empty window with ad-hoc settings that fits the desired form dimensions, resizing properties, + // and window type (this does not render the form) +var $win:=Open form window("myForm"; Movable form dialog box; Horizontally centered; Vertically centered) + + //Render the form, and provide $formObject's data. Dialog also activates the form event loop +DIALOG("myForm"; $formObject) + + //Without asterisk to Dialog statement, the form waits for a closing action from the user + //before executing the rest of the code. Calling Close window is just a good practice CLOSE WINDOW($win) //releases reference -If (OK=1) //the user clicked OK - var $name : Text:=Form.name //gets data - var $age : Integer:=Form.age -End if + + //Display data modified by the user, if any/ +ALERT($formObject.name+" is "+String($formObject.age)+" years old!") + ``` 4D displays: From 1c9be4351f18146188c05f88d0893b34557822a0 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Mon, 11 May 2026 18:50:46 +0200 Subject: [PATCH 08/25] supported tags (en cours) --- docs/FormObjects/properties_Text.md | 91 ++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/docs/FormObjects/properties_Text.md b/docs/FormObjects/properties_Text.md index fe10e060cdd6fe..d0f687d2109097 100644 --- a/docs/FormObjects/properties_Text.md +++ b/docs/FormObjects/properties_Text.md @@ -427,6 +427,7 @@ This property enables the possibility of using [specific styles](https://doc.4d. By default, this option is not enabled. + #### JSON Grammar |Name|Data Type|Possible Values| @@ -439,7 +440,95 @@ By default, this option is not enabled. #### Commands -[LISTBOX Get property](../commands/listbox-get-property) - [LISTBOX SET PROPERTY](../commands/listbox-set-property) - [OBJECT Is styled text](../commands/object-is-styled-text) - +[LISTBOX Get property](../commands/listbox-get-property) - [LISTBOX SET PROPERTY](../commands/listbox-set-property) - [OBJECT Is styled text](../commands/object-is-styled-text) + +### Supported tags + +You can use the following tags in 4D multi-style text areas. + +#### 4D Expression + +```html + +``` + +This tag inserts a 4D expression (expression, method, field, variable, command, etc.) in the text. The expression is tokenized and evaluated: + +- when the expression is inserted +- when the object is loaded +- when the `computeExpressions` standard action is called from an interface object or by the [`INVOKE ACTION`](../commands/invoke-action) command +- when the [`ST COMPUTE EXPRESSIONS`](../commands/st-compute-expressions) command is executed +- when the [`ST FREEZE EXPRESSIONS`](../commands/st-freeze-expressions) command is executed, if the second `*` parameter is passed. + +The evaluated value of the expression is not saved in the `` tag, only its reference is. + +Note: To ensure that expressions will be evaluated correctly regardless of the 4D language or version used, we recommend using the token syntax for elements whose name might vary between different versions (commands, tables, fields, constants). For example, to insert the `Current time` command, enter `Current time:C178`. For more information about this, refer to *Using tokens in formulas*. + +#### URL + +```html +
Visible label +``` + +This tag inserts a URL in the text. Example: + +```html +4D Web Site +``` + +#### User link + +```html +Click here +``` + +"User links" look the same as URLs, but when you click them, they do not automatically open the source. You can pass any string you want as reference, and it is up to the developer to program any custom actions that occur when it is clicked. This means you can create links which are not URLs but references to files, 4D methods, and so on, that you can open or execute when they are clicked. The [`ST Get content type`](../commands/st-get-content-type) command detects if a user link has been clicked. + +User links are defined using the [`ST SET TEXT`](../commands/st-set-text) command. For example: + +```4d +ST SET TEXT(txtVar;"This is a user link: User Label";$start;$end) + ``` + +#### Custom tags + +You can insert any tag in plain text, for example ``. It is stored in the code of the plain text without being interpreted or displayed. This is particularly useful in the context of e-mails in HTML format and including pictures for example. + +#### Style tags + +This paragraph lists the attributes of \ tags that are supported by 4D in rich text areas. You can use these tags to implement custom style handling. Only the tags listed below are supported by 4D for style variations. + +Font name + ... + +Font size + ... + +Font style +Bold + ... +Italic or normal + ... + ... +Underline + ... +Strikethrough +... +Note : The "strikethrough" style is not supported under Mac OS, but this tag can still be managed by programming. +Font colors + ... +or +... + +Background colors + ... +or +... + +Color values +For font color and background color attributes, the color value can be either the hexadecimal code for an RGB color, or the name of one of the 16 HTML colors defined for standard CSS by the W3C: + + --- From ae5aa3a7f6be28eddc32aa0f492b77d009e897a7 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 28 May 2026 16:28:59 +0200 Subject: [PATCH 09/25] supported tags (finished) --- docs/FormObjects/properties_Text.md | 47 ++++----- docs/assets/en/FormObjects/colors1.png | Bin 0 -> 32632 bytes docs/assets/en/FormObjects/colors2.png | Bin 0 -> 34897 bytes docs/assets/en/FormObjects/multistyle-ex1.png | Bin 0 -> 906 bytes docs/assets/en/FormObjects/multistyle-ex2.png | Bin 0 -> 777 bytes docs/commands/theme/Styled_Text.md | 93 ++++++++++++++++++ 6 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 docs/assets/en/FormObjects/colors1.png create mode 100644 docs/assets/en/FormObjects/colors2.png create mode 100644 docs/assets/en/FormObjects/multistyle-ex1.png create mode 100644 docs/assets/en/FormObjects/multistyle-ex2.png diff --git a/docs/FormObjects/properties_Text.md b/docs/FormObjects/properties_Text.md index d0f687d2109097..4d0d7726e11f01 100644 --- a/docs/FormObjects/properties_Text.md +++ b/docs/FormObjects/properties_Text.md @@ -498,36 +498,27 @@ You can insert any tag in plain text, for example ` ... - -Font size - ... - -Font style -Bold - ... -Italic or normal - ... - ... -Underline - ... -Strikethrough -... -Note : The "strikethrough" style is not supported under Mac OS, but this tag can still be managed by programming. -Font colors - ... -or -... - -Background colors - ... -or -... - -Color values +- Font name: ` ... ` +- Font size: ` ... ` +- Font style: + - Bold ` ... ` + - Italic ` ... ` + - Normal ` ... ` + - Underline ` ... ` + - Strikethrough `...` + +*Note: The "strikethrough" style is not supported under macOS, but this tag can still be managed by programming.* + +- Font colors: ` ... ` or `...` +- Background colors: ` ... ` or `...` + +#### Color values + For font color and background color attributes, the color value can be either the hexadecimal code for an RGB color, or the name of one of the 16 HTML colors defined for standard CSS by the W3C: +![](../assets/en/FormObjects/colors1.png) +![](../assets/en/FormObjects/colors2.png) + diff --git a/docs/assets/en/FormObjects/colors1.png b/docs/assets/en/FormObjects/colors1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0759ba0abc00f5ddc4acc7c728808e9ed24d0e GIT binary patch literal 32632 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 literal 0 HcmV?d00001 diff --git a/docs/assets/en/FormObjects/colors2.png b/docs/assets/en/FormObjects/colors2.png new file mode 100644 index 0000000000000000000000000000000000000000..48d25eafd9007107f8a4632a171ae8a3620bd941 GIT binary patch literal 34897 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 literal 0 HcmV?d00001 diff --git a/docs/assets/en/FormObjects/multistyle-ex2.png b/docs/assets/en/FormObjects/multistyle-ex2.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea1e2de1b9d124717c988f4f1d7c5dbfe708e4a GIT binary patch literal 777 zcmV+k1NQuhP)Tcjp6q#ZVxY5S2fj@csDSd*^rWy#tidXapZG#=)*P@Sh-PKRTVx zu6MHE2+n%CuJ3v?dyJrSaDDxC*ZbL5`1R2n_=}ta?(_Fs>fO|GzZJp zhs)r7I54K8eqay|-oH5%L&wZO+sco{G8zP=g>F%LB|0c3KnQEKw43A-LX98~R7_Dx zTurD^|$Q8OIV2(5wScATU%$2I?jS_Ad_Z& z)1uBq#``OaoX}vj+n31-o;UXlJy^2>qqjZ5O$G@_>Fh)%hvqqq91CIE*RN>2@o?r+ zx_w|4%GxwGooc(d;smSep4S3zaRg07cy*2#rkKVxdqc`yV=neh=Ua%^8RtaL+00000NkvXX Hu0mjfqik$x literal 0 HcmV?d00001 diff --git a/docs/commands/theme/Styled_Text.md b/docs/commands/theme/Styled_Text.md index 669252bc519127..2c9583e9ae1f9b 100644 --- a/docs/commands/theme/Styled_Text.md +++ b/docs/commands/theme/Styled_Text.md @@ -23,3 +23,96 @@ slug: /commands/theme/Styled-Text |[](../../commands/st-set-options)
| |[](../../commands/st-set-plain-text)
| |[](../../commands/st-set-text)
| + + +## Working with text handling commands + +### User interface + +The commands that can be used to manipulate text objects by programming do not take any style tags integrated into the text into account. They act upon displayed text only. This concerns the following commands: + +- [User Interface](./User_Interface.md) theme commands +- [`HIGHLIGHT TEXT`](../../commands/highlight-text) +- [`GET HIGHLIGHT`](../../commands/get-highlight) + +When you use these commands with commands that manipulate character strings, it is necessary to filter the formatting characters using the [`ST Get plain text`](../../commands/st-get-plain-text) command: + +```4d + HIGHLIGHT TEXT([Products]Notes;1;Length(ST Get plain text([Products]Notes))+1) +``` + +### Objects (Forms) + +The commands that can be used to modify the style of objects (for example, [`OBJECT SET FONT`](../../commands/object-set-font)) apply to the whole object and not to the selection. + +If the object does not have the focus when the command is executed, the modification is applied simultaneously to the object (the text area) and to its associated variable. If the object does have the focus, the modification is carried out on the object but not on the associated variable. The modification is only applied to the variable when the object loses the focus. Keep this principle in mind when programming text areas. + +:::note + +If the [**Store with default style tags**](../../FormObjects/properties_Text.md#store-with-default-style-tags) option is checked for the object, the use of these commands will cause a modification of the tags saved with each object. + +::: + + +Note also that only default properties are affected by these commands (as well as any properties saved by means of default tags). Custom style tags remain as they are. For example, given a multi-style area where default tags were saved: + +![](../../assets/en/FormObjects/multistyle-ex1.png) + +The plain text of the area is as follows: + +```html +This is the word red +``` + +If you execute the following code: + +```4d +OBJECT SET COLOR(*;"myArea";-(Blue+(256*Yellow))) +``` + +The red color remains: + +![](../../assets/en/FormObjects/multistyle-ex2.png) + +and code is: + +```html +This is the word red +``` + +The following commands are concerned: + +- [`OBJECT SET RGB COLORS`](../../commands/object-set-rgb-colors) +- [`OBJECT SET FONT`](../../commands/object-set-font) +- [`OBJECT SET FONT STYLE`](../../commands/object-set-font-style) +- [`OBJECT SET FONT SIZE`](../../commands/object-set-font-size) + +In the context of multi-style areas, such commands should be used to set default styles only. To manage styles during database execution, we recommend using the commands of the "Styled Text" theme. + +### Get edited text + +When it is used with a rich text area, the [`Get edited text`](../../commands/get-edited-text) command returns the text of the current area including any style tags. + +To retrieve the "plain" text (text without tags) being edited, you must use the [`ST Get plain text`](../../commands/st-get-plain-text) command: + +```4d +ST Get plain text(Get edited text) +``` + +### Query and order by commands + +Queries and sorts carried out among multi-style objects take into account any style tags saved in the object. If a style modification has been made within a word, searching for the word will not be successful. + +To be able to carry out valid searches and sorts, you must use the [`ST Get plain text`](../../commands/st-get-plain-text) command. For example: + +```4d +QUERY BY FORMULA([MyTable];ST Get plain text([MyTable]MyFieldStyle)="very well") +``` + +## Automatic normalization of line endings + +In order to ensure multi-platform compatibility of texts handled in the database, 4D automatically normalizes line endings so that they occupy a single character: `\r` (carriage return). This normalization is carried out at the level of form objects (variables or fields) hosting plain or multi-style text. Line endings that are not native, or that use a mix of several characters (for example `\r\n`), are considered as a single `\r`. + +Note that in compliance with the XML standard (multi-style text format), the multi-style text commands also normalize line endings for text variables that are not associated with objects. + +This principle makes it easier to use multi-style text commands or commands such as [`HIGHLIGHT TEXT`](../../commands/highlight-text) in a multi-platform context. However, you must take this into account in your processing when you work with texts from heterogeneous sources. \ No newline at end of file From f65ba4f9078abd7f2ce3d3122698d8caeb894219 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 28 May 2026 17:49:29 +0200 Subject: [PATCH 10/25] web services et system documents --- docs/commands/theme/System_Documents.md | 56 ++++++++++++++-------- docs/commands/theme/Web_Services_Client.md | 7 +++ docs/commands/theme/Web_Services_Server.md | 5 ++ 3 files changed, 49 insertions(+), 19 deletions(-) diff --git a/docs/commands/theme/System_Documents.md b/docs/commands/theme/System_Documents.md index 66efd631190f9a..9bcf5380e29c9a 100644 --- a/docs/commands/theme/System_Documents.md +++ b/docs/commands/theme/System_Documents.md @@ -67,48 +67,66 @@ When it is called from a [preemptive process](../../Develop/preemptive.md), a *D ## The Document system variable -`Open document`, `Create document`, `Append document` and `Select document` enable you to access a document using the standard Open or Save file dialog boxes. When you access a document through a standard dialog, 4D returns the full pathname of the document in the [`Document` system variable](../../Concepts/variables.md#system-variables). This system variable has to be distinguished from the *document* parameter that appears in the parameter list of the commands. +[`Open document`](../../commands/open-document), [`Create document`](../../commands/create-document), [`Append document`](../../commands/append-document`) and [`Select document`](../../commands/select-document) commands enable you to access a document using the standard Open or Save file dialog boxes. When you access a document through a standard dialog, 4D returns the full pathname of the document in the [`Document` system variable](../../Concepts/variables.md#system-variables). This system variable has to be distinguished from the *document* parameter that appears in the parameter list of the commands. ## Absolute or relative pathname -Most of the routines of this section accept document names, relative pathnames or absolute pathnames: +Most of the routines of this section accept **document names**, **relative pathnames** or **absolute pathnames**. + +- **Relative pathnames** define a location with respect to a folder located on disk. Passing only a document name is considered as using a relative pathname. In 4D, a relative pathname is usually expressed with respect to the [project folder](../../Project/architecture.md#project-folder), i.e. the folder containing the .project file. Relative pathnames are especially useful when deploying applications in heterogenous environments. +- **Absolute pathnames** define a location with respect to the root of the volume and so they do not depend on the current location of the project folder. -Relative pathnames define a location with respect to a folder located on disk. Passing only a document name is considered as using a relative pathname. In 4D, a relative pathname is usually expressed with respect to the database folder, i.e. the folder containing the structure file. Relative pathnames are especially useful when deploying applications in heterogenous environments. -Absolute pathnames define a location with respect to the root of the volume and so they do not depend on the current location of the database folder. To determine whether a pathname passed to a command must be interpreted as absolute or relative, 4D applies a specific algorithm on each platform. -Windows -If the parameter contains only two characters and if the second one is a ':', - or if the text contains ':' and '\' as the second and third character, - or if the text starts with "\\", -then the pathname is absolute. +### Windows + +- If the parameter contains only two characters and if the second one is a ':' +- or if the text contains ':' and '\' as the second and third character, +- or if the text starts with "\\", +- then the pathname is absolute. In all other cases, the pathname is relative. -Examples with the CREATE FOLDER command: +Examples with the [`CREATE FOLDER`](../../commands/create-folder) command: +```4d CREATE FOLDER("lundi") // relative path CREATE FOLDER("\Monday") // relative path CREATE FOLDER("\Monday\Tuesday") // relative path CREATE FOLDER("c:") // absolute path CREATE FOLDER("d:\Monday") // absolute path CREATE FOLDER("\\srv-Internal\temp") // absolute path +``` + +:::note + +The code editor of 4D allows the use of [escape sequences](../../Concepts/quick-tour.md#escape-sequences). An escape sequence begins with a backslash `\`, followed by a character. For example, `\t` is the escape sequence for the Tab character. + +The `\` character is also used as the separator in pathnames in Windows. In general, 4D will correctly interpret Windows pathnames that are entered in the method editor by replacing single backslashes `\` with double backslashes `\\`. For example, `C:\Folder` will become `C:\\Folder`. -macOS -If the text starts with a folder separator ':', - or if does not contain any, -then the path is relative. +However, if you write `C:\MyDocuments\New`, 4D will display `C:\\MyDocuments\New`. In this case, the second `\` is incorrectly interpreted as `\N` (an existing escape sequence). You must therefore enter a double `\\` when you want to insert a backslash before a character that is used in one of the escape sequences recognized by 4D. + +::: + +### macOS + +- If the text starts with a folder separator ':', +- or if does not contain any, +- then the path is relative. In all other cases, it is absolute. -Examples with the CREATE FOLDER command: +Examples with the [`CREATE FOLDER`](../../commands/create-folder) command: + +```4d CREATE FOLDER("Monday") // relative path CREATE FOLDER("macintosh hd:") // absolute path CREATE FOLDER("Monday:Tuesday") // absolute path (a volume must be called Monday) CREATE FOLDER(":Monday:Tuesday") // relative path +``` :::note @@ -118,8 +136,8 @@ See also [**Absolute and relative pathnames** in the Concepts section](../../Con ## Extracting pathname contents -You can handle pathname contents using the Path to object and Object to path commands. In particular, using these commands, you can extract from a pathname: +You can handle pathname contents using the [`Path to object`](../../commands/path-to-object) and [`Object to path`](../../commands/object-to-path) commands. In particular, using these commands, you can extract from a pathname: -a file name, -the parent folder path, -the file or folder extension. \ No newline at end of file +- a file name, +- the parent folder path, +- the file or folder extension. \ No newline at end of file diff --git a/docs/commands/theme/Web_Services_Client.md b/docs/commands/theme/Web_Services_Client.md index 683fc77569c1ca..052b6283b0839b 100644 --- a/docs/commands/theme/Web_Services_Client.md +++ b/docs/commands/theme/Web_Services_Client.md @@ -14,3 +14,10 @@ slug: /commands/theme/Web-Services-Client |[](../../commands/web-service-get-result)
| |[](../../commands/web-service-set-option)
| |[](../../commands/web-service-set-parameter)
| + + +A Web Service is a set of functions published on a network. These functions can be called and used by any application compatible with Web Services and connected to the network. Web Services can carry out all types of tasks, such as supervising the routing of packages at a transporter’s, e-commerce, monitoring market values, etc. + +Subscription to Web Services with 4D is easy to carry out using the [Web Services Wizard](https://doc.4d.com/4Dv21/4D/21/Subscribing-to-a-Web-Service-in-4D.300-7676804.en.html). In most cases, this Wizard will be sufficient for you to be able to use Web Services. However, if you want to customize certain mechanisms, you must use the client SOAP commands of 4D. + +Note: By convention, the terms “SOAP” and “Web Service” have been used to differentiate between command (and constant) names on the server and client side, respectively. These two concepts refer to the same technology. \ No newline at end of file diff --git a/docs/commands/theme/Web_Services_Server.md b/docs/commands/theme/Web_Services_Server.md index f5ae3fd7397f47..cdcf0ff83dbddb 100644 --- a/docs/commands/theme/Web_Services_Server.md +++ b/docs/commands/theme/Web_Services_Server.md @@ -13,3 +13,8 @@ slug: /commands/theme/Web-Services-Server |[](../../commands/soap-reject-new-requests)
| |[](../../commands/soap-request)
| |[](../../commands/soap-send-fault)
| + + +Publication of Web Services with 4D is carried out easily using [options in the method properties](../../Project/project-method-properties.md#web-services). In most cases, this operation will be sufficient to enable you to publish Web Services. However, if you want to customize certain mechanisms, use data arrays, etc., you must use the server SOAP commands of 4D. + +Note: By convention, the terms “SOAP” and “Web Service” have been used to differentiate between command (and constant) names on the server and client side, respectively. These two concepts refer to the same technology. \ No newline at end of file From a67567b35ff5f81c5e988932b400d47e2fcede00 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 3 Jun 2026 10:28:03 +0200 Subject: [PATCH 11/25] fixed Form FR --- .../current/language-legacy/Forms/form.md | 2 +- .../version-21-R3/language-legacy/Forms/form.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Forms/form.md b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Forms/form.md index 0da9db082c7eb4..76b6d3f3792996 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Forms/form.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Forms/form.md @@ -1,7 +1,7 @@ --- id: form slug: /commands/form -title: Formulaire +title: Form displayed_sidebar: docs --- diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Forms/form.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Forms/form.md index 0da9db082c7eb4..76b6d3f3792996 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Forms/form.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Forms/form.md @@ -1,7 +1,7 @@ --- id: form slug: /commands/form -title: Formulaire +title: Form displayed_sidebar: docs --- From 06cd4c921614ebcb18ddf4ba2f8012d36d9d6ecc Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 3 Jun 2026 10:57:55 +0200 Subject: [PATCH 12/25] fix OWC glitch --- docs/commands-legacy/on-web-connection-database-method.md | 2 +- docs/language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../current/language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21-R2/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../current/language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21-R2/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../current/language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21-R2/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../current/language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21-R2/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21-R2/commands-legacy/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../language-legacy/Web Server/web-validate-digest.md | 2 +- .../commands-legacy/on-web-connection-database-method.md | 2 +- .../version-21/commands-legacy/web-validate-digest.md | 2 +- 40 files changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/commands-legacy/on-web-connection-database-method.md b/docs/commands-legacy/on-web-connection-database-method.md index 9fc4c87ddcf86f..f514efb2440d66 100644 --- a/docs/commands-legacy/on-web-connection-database-method.md +++ b/docs/commands-legacy/on-web-connection-database-method.md @@ -43,7 +43,7 @@ You must declare these parameters as shown below: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Code for the method ``` diff --git a/docs/language-legacy/Web Server/web-validate-digest.md b/docs/language-legacy/Web Server/web-validate-digest.md index 14e206d49b6f53..0c9f9d0974d6f3 100644 --- a/docs/language-legacy/Web Server/web-validate-digest.md +++ b/docs/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Example using *On Web Authentication Database Method* in Digest mode: ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //For security reasons, refuse names containing @ diff --git a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md index b6cb73307c1cff..d80d53e51e71c0 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Debe declarar estos seis parámetros de esta manera: ```4d   // Método de base On Web Connection   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Código para el método ``` diff --git a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md index cef1d4d747a6c0..e95b4725cd2ffa 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Ejemplo de método de base On Web Authentication en modo Digest: ```4d   // Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md index 77a590e7b47c29..ee8a847c39edb0 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Debe declarar estos seis parámetros de esta manera: ```4d   // Método de base On Web Connection   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Código para el método ``` diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md index b680eef20f3d6b..62d08a287b815b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Ejemplo de método de base On Web Authentication en modo Digest: ```4d   // Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md index b6cb73307c1cff..d80d53e51e71c0 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Debe declarar estos seis parámetros de esta manera: ```4d   // Método de base On Web Connection   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Código para el método ``` diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md index cef1d4d747a6c0..e95b4725cd2ffa 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Ejemplo de método de base On Web Authentication en modo Digest: ```4d   // Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md b/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md index 77a590e7b47c29..ee8a847c39edb0 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Debe declarar estos seis parámetros de esta manera: ```4d   // Método de base On Web Connection   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Código para el método ``` diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md b/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md index bb24cfcc764d90..3c8d863063fe7a 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Ejemplo de método de base On Web Authentication en modo Digest: ```4d   // Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md index 733ba0fadc64b7..38e9843440b452 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Vous devez déclarer ces six paramètres de la manière suivante : ```4d   // Méthode base Sur connexion Web   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Code pour la méthode ``` diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md index b6245ce6a06444..2f3a9a2e8bfb33 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Exemple de *Méthode base Sur authentification Web* en mode Digest ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $utilisateur : Text  var $0 : Boolean diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md index 8e5bf1f19c4b43..2c7cabbf4ebc9d 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Vous devez déclarer ces six paramètres de la manière suivante : ```4d   // Méthode base Sur connexion Web   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Code pour la méthode ``` diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md index 86ddf242c03f66..665573d752b534 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Exemple de *Méthode base Sur authentification Web* en mode Digest ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $utilisateur : Text  var $0 : Boolean diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md index 733ba0fadc64b7..38e9843440b452 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Vous devez déclarer ces six paramètres de la manière suivante : ```4d   // Méthode base Sur connexion Web   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Code pour la méthode ``` diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md index b6245ce6a06444..2f3a9a2e8bfb33 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Exemple de *Méthode base Sur authentification Web* en mode Digest ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $utilisateur : Text  var $0 : Boolean diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md index 8e5bf1f19c4b43..2c7cabbf4ebc9d 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md @@ -47,7 +47,7 @@ Vous devez déclarer ces six paramètres de la manière suivante : ```4d   // Méthode base Sur connexion Web   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean     // Code pour la méthode ``` diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md b/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md index ec01eb1535db96..7d4e3338a2f909 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Exemple de *Méthode base Sur authentification Web* en mode Digest ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $utilisateur : Text  var $0 : Boolean diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md index 12d4d623f01530..ebfd475005dc2d 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Connection データベースメソッド -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean   // メソッドコード ``` diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md index 9a1c2afb9cebf7..562e3442db3046 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //セキュリティに関する理由のため、@を含む名前を拒否する diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md index a8990929daf9df..090cabe87a3922 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Connection データベースメソッド -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean   // メソッドコード ``` diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md index 0949e4df4c72a6..3928930835d721 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //セキュリティに関する理由のため、@を含む名前を拒否する diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md index 12d4d623f01530..ebfd475005dc2d 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Connection データベースメソッド -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean   // メソッドコード ``` diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md index 9a1c2afb9cebf7..562e3442db3046 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //セキュリティに関する理由のため、@を含む名前を拒否する diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md index a8990929daf9df..090cabe87a3922 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Connection データベースメソッド -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean   // メソッドコード ``` diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md b/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md index 3a9ed6a06c7d42..62928bde6c0225 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //セキュリティに関する理由のため、@を含む名前を拒否する diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md index 1bf6e4a4fd3196..5ab24e3cd89ed6 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-connection-database-method.md @@ -49,7 +49,7 @@ Você deve declarar esses parâmetros da seguinte maneira: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Código para o método ``` diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md index 888f98104d3aa3..1fcbaf9e73c404 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Exemplo de método de base On Web Authentication em modo Digest: ```4d   // Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md index a4b10d43ffe734..3300834e4ddd81 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-connection-database-method.md @@ -49,7 +49,7 @@ Você deve declarar esses parâmetros da seguinte maneira: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Código para o método ``` diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md index 02b2ab7e6c67c5..114164d4d245e3 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Exemplo de método de base On Web Authentication em modo Digest: ```4d   // Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md index 1bf6e4a4fd3196..5ab24e3cd89ed6 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-connection-database-method.md @@ -49,7 +49,7 @@ Você deve declarar esses parâmetros da seguinte maneira: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Código para o método ``` diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md index 888f98104d3aa3..1fcbaf9e73c404 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Exemplo de método de base On Web Authentication em modo Digest: ```4d   // Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md index a4b10d43ffe734..3300834e4ddd81 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-connection-database-method.md @@ -49,7 +49,7 @@ Você deve declarar esses parâmetros da seguinte maneira: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Código para o método ``` diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md b/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md index 3e2c5d9e5b1dd1..322fad990562fe 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Exemplo de método de base On Web Authentication em modo Digest: ```4d   // Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  var $usuario : Text  var $0 : Boolean diff --git a/versioned_docs/version-21-R2/commands-legacy/on-web-connection-database-method.md b/versioned_docs/version-21-R2/commands-legacy/on-web-connection-database-method.md index a9f02b0a7cf7de..abafad99bb8fc7 100644 --- a/versioned_docs/version-21-R2/commands-legacy/on-web-connection-database-method.md +++ b/versioned_docs/version-21-R2/commands-legacy/on-web-connection-database-method.md @@ -43,7 +43,7 @@ You must declare these parameters as shown below: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Code for the method ``` diff --git a/versioned_docs/version-21-R2/commands-legacy/web-validate-digest.md b/versioned_docs/version-21-R2/commands-legacy/web-validate-digest.md index 533c32fbe38fb5..4b7bdf7dc0f126 100644 --- a/versioned_docs/version-21-R2/commands-legacy/web-validate-digest.md +++ b/versioned_docs/version-21-R2/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Example using *On Web Authentication Database Method* in Digest mode: ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //For security reasons, refuse names containing @ diff --git a/versioned_docs/version-21-R3/commands-legacy/on-web-connection-database-method.md b/versioned_docs/version-21-R3/commands-legacy/on-web-connection-database-method.md index 9fc4c87ddcf86f..f514efb2440d66 100644 --- a/versioned_docs/version-21-R3/commands-legacy/on-web-connection-database-method.md +++ b/versioned_docs/version-21-R3/commands-legacy/on-web-connection-database-method.md @@ -43,7 +43,7 @@ You must declare these parameters as shown below: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Code for the method ``` diff --git a/versioned_docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md b/versioned_docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md index 14e206d49b6f53..0c9f9d0974d6f3 100644 --- a/versioned_docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md +++ b/versioned_docs/version-21-R3/language-legacy/Web Server/web-validate-digest.md @@ -46,7 +46,7 @@ Example using *On Web Authentication Database Method* in Digest mode: ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //For security reasons, refuse names containing @ diff --git a/versioned_docs/version-21/commands-legacy/on-web-connection-database-method.md b/versioned_docs/version-21/commands-legacy/on-web-connection-database-method.md index a9f02b0a7cf7de..abafad99bb8fc7 100644 --- a/versioned_docs/version-21/commands-legacy/on-web-connection-database-method.md +++ b/versioned_docs/version-21/commands-legacy/on-web-connection-database-method.md @@ -43,7 +43,7 @@ You must declare these parameters as shown below: ```4d   // On Web Connection Database Method   -#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) +#DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text)     // Code for the method ``` diff --git a/versioned_docs/version-21/commands-legacy/web-validate-digest.md b/versioned_docs/version-21/commands-legacy/web-validate-digest.md index bb841821b0fda6..f4ecfa769683ad 100644 --- a/versioned_docs/version-21/commands-legacy/web-validate-digest.md +++ b/versioned_docs/version-21/commands-legacy/web-validate-digest.md @@ -46,7 +46,7 @@ Example using *On Web Authentication Database Method* in Digest mode: ```4d   // On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ;\ $user : Text ; $pw : Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $ipBrowser : Text ; $ipServer : Text ; $user : Text ; $pw : Text) -> $result : Boolean  $result:=False  $user:=$5   //For security reasons, refuse names containing @ From 3b465fe23b403b96247c4d9e7886c2cf7ad7c49d Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 3 Jun 2026 12:17:18 +0200 Subject: [PATCH 13/25] adde ref to && operator --- docs/Concepts/flow-control.md | 8 ++++++++ versioned_docs/version-20/Concepts/flow-control.md | 8 ++++++++ versioned_docs/version-21-R2/Concepts/flow-control.md | 8 ++++++++ versioned_docs/version-21-R3/Concepts/flow-control.md | 8 ++++++++ versioned_docs/version-21/Concepts/flow-control.md | 8 ++++++++ 5 files changed, 40 insertions(+) diff --git a/docs/Concepts/flow-control.md b/docs/Concepts/flow-control.md index 51a18d47d67092..26c792d28e63f0 100644 --- a/docs/Concepts/flow-control.md +++ b/docs/Concepts/flow-control.md @@ -59,6 +59,14 @@ The expression is TRUE only if both methods are TRUE. However, even if _MethodA_ End if ``` +However, the most elegant solution is then to use the [`&&` short-circuit operator](./operators.md#short-circuit-and-operator-) and to write: + +```4d +If (MethodA && MethodB) + ... +End if +``` + The result is similar and _MethodB_ is evaluated only if necessary. > **Note:** The [ternary operator](operators.md#ternary-operator) allows writing one-line conditional expressions and can replace a full sequence of If..Else statements. diff --git a/versioned_docs/version-20/Concepts/flow-control.md b/versioned_docs/version-20/Concepts/flow-control.md index 364d2baae08fb9..e02b9205e19cea 100644 --- a/versioned_docs/version-20/Concepts/flow-control.md +++ b/versioned_docs/version-20/Concepts/flow-control.md @@ -59,6 +59,14 @@ The expression is TRUE only if both methods are TRUE. However, even if _MethodA_ End if ``` +However, the most elegant solution is then to use the [`&&` short-circuit operator](./operators.md#short-circuit-and-operator-) and to write: + +```4d +If (MethodA && MethodB) + ... +End if +``` + The result is similar and _MethodB_ is evaluated only if necessary. > **Note:** The [ternary operator](operators.md#ternary-operator) allows writing one-line conditional expressions and can replace a full sequence of If..Else statements. diff --git a/versioned_docs/version-21-R2/Concepts/flow-control.md b/versioned_docs/version-21-R2/Concepts/flow-control.md index 51a18d47d67092..26c792d28e63f0 100644 --- a/versioned_docs/version-21-R2/Concepts/flow-control.md +++ b/versioned_docs/version-21-R2/Concepts/flow-control.md @@ -59,6 +59,14 @@ The expression is TRUE only if both methods are TRUE. However, even if _MethodA_ End if ``` +However, the most elegant solution is then to use the [`&&` short-circuit operator](./operators.md#short-circuit-and-operator-) and to write: + +```4d +If (MethodA && MethodB) + ... +End if +``` + The result is similar and _MethodB_ is evaluated only if necessary. > **Note:** The [ternary operator](operators.md#ternary-operator) allows writing one-line conditional expressions and can replace a full sequence of If..Else statements. diff --git a/versioned_docs/version-21-R3/Concepts/flow-control.md b/versioned_docs/version-21-R3/Concepts/flow-control.md index 51a18d47d67092..26c792d28e63f0 100644 --- a/versioned_docs/version-21-R3/Concepts/flow-control.md +++ b/versioned_docs/version-21-R3/Concepts/flow-control.md @@ -59,6 +59,14 @@ The expression is TRUE only if both methods are TRUE. However, even if _MethodA_ End if ``` +However, the most elegant solution is then to use the [`&&` short-circuit operator](./operators.md#short-circuit-and-operator-) and to write: + +```4d +If (MethodA && MethodB) + ... +End if +``` + The result is similar and _MethodB_ is evaluated only if necessary. > **Note:** The [ternary operator](operators.md#ternary-operator) allows writing one-line conditional expressions and can replace a full sequence of If..Else statements. diff --git a/versioned_docs/version-21/Concepts/flow-control.md b/versioned_docs/version-21/Concepts/flow-control.md index 51a18d47d67092..26c792d28e63f0 100644 --- a/versioned_docs/version-21/Concepts/flow-control.md +++ b/versioned_docs/version-21/Concepts/flow-control.md @@ -59,6 +59,14 @@ The expression is TRUE only if both methods are TRUE. However, even if _MethodA_ End if ``` +However, the most elegant solution is then to use the [`&&` short-circuit operator](./operators.md#short-circuit-and-operator-) and to write: + +```4d +If (MethodA && MethodB) + ... +End if +``` + The result is similar and _MethodB_ is evaluated only if necessary. > **Note:** The [ternary operator](operators.md#ternary-operator) allows writing one-line conditional expressions and can replace a full sequence of If..Else statements. From 81c1d40b1924e01a81a3e88cecdcfdf4175f715c Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 3 Jun 2026 17:44:24 +0200 Subject: [PATCH 14/25] fix glitch --- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- .../on-web-authentication-database-method.md | 6 +++--- 20 files changed, 60 insertions(+), 60 deletions(-) diff --git a/docs/commands-legacy/on-web-authentication-database-method.md b/docs/commands-legacy/on-web-authentication-database-method.md index ac669a182f81ef..49a6ad45b9e1da 100644 --- a/docs/commands-legacy/on-web-authentication-database-method.md +++ b/docs/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ You must declare these parameters as follows: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code for the method ``` @@ -127,7 +127,7 @@ Example of the On Web Authentication database method in BASIC mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $ipServerDuser : Boolean  ARRAY TEXT($users;0)  ARRAY LONGINT($nums;0) @@ -172,7 +172,7 @@ Example of the On Web Authentication database method in DIGEST mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //For security reasons, refuse names that contain @  If(WithWildcard($user)) diff --git a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md index 5ea538f2bfa3c7..91b5449b11bbec 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md @@ -44,7 +44,7 @@ Debe declarar estos parámetros de esta forma: ```4d   // Método de base On Web Authentication   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para el método ``` @@ -123,7 +123,7 @@ Ejemplo del *Método de base On Web Authentication* en modo BASIC: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario;$contraseña;$IPNavegador;$IPServidor : Text  var $ipServerDusuario : Boolean  ARRAY TEXT($usuarios;0) @@ -172,7 +172,7 @@ Ejemplo del en modo DIGEST: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md index ac56979e7c2b60..6f41c8be96d579 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md @@ -44,7 +44,7 @@ Debe declarar estos parámetros de esta forma: ```4d   // Método de base On Web Authentication   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para el método ``` @@ -123,7 +123,7 @@ Ejemplo del *Método de base On Web Authentication* en modo BASIC: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario;$contraseña;$IPNavegador;$IPServidor : Text  var $ipServerDusuario : Boolean  ARRAY TEXT($usuarios;0) @@ -172,7 +172,7 @@ Ejemplo del en modo DIGEST: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md index 5ea538f2bfa3c7..91b5449b11bbec 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md @@ -44,7 +44,7 @@ Debe declarar estos parámetros de esta forma: ```4d   // Método de base On Web Authentication   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para el método ``` @@ -123,7 +123,7 @@ Ejemplo del *Método de base On Web Authentication* en modo BASIC: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario;$contraseña;$IPNavegador;$IPServidor : Text  var $ipServerDusuario : Boolean  ARRAY TEXT($usuarios;0) @@ -172,7 +172,7 @@ Ejemplo del en modo DIGEST: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md b/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md index ac56979e7c2b60..6f41c8be96d579 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md @@ -44,7 +44,7 @@ Debe declarar estos parámetros de esta forma: ```4d   // Método de base On Web Authentication   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para el método ``` @@ -123,7 +123,7 @@ Ejemplo del *Método de base On Web Authentication* en modo BASIC: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario;$contraseña;$IPNavegador;$IPServidor : Text  var $ipServerDusuario : Boolean  ARRAY TEXT($usuarios;0) @@ -172,7 +172,7 @@ Ejemplo del en modo DIGEST: ```4d   //Método de base On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md index f7816af934b52e..b9f3e6551a18d7 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Vous devez déclarer ces paramètres de la manière suivante : ```4d   // Méthode base Sur authentification Web   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code pour la méthode ``` @@ -127,7 +127,7 @@ Exemple de **On Web Authentication database method** en mode BASIC : ```4d   //Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur;$motPasse;$IPBrowser;$IPServer : Text  var $utilisateur4D : Boolean  ARRAY TEXT($utilisateurs;0) @@ -176,7 +176,7 @@ Exemple de méthode base Sur authentification Web en mode DIGEST : ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur : Text  $result:=False  $utilisateur:=$user diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md index 1c40114e62c47d..aa2c8daa460c17 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Vous devez déclarer ces paramètres de la manière suivante : ```4d   // Méthode base Sur authentification Web   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code pour la méthode ``` @@ -127,7 +127,7 @@ Exemple de **On Web Authentication database method** en mode BASIC : ```4d   //Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur;$motPasse;$IPBrowser;$IPServer : Text  var $utilisateur4D : Boolean  ARRAY TEXT($utilisateurs;0) @@ -176,7 +176,7 @@ Exemple de méthode base Sur authentification Web en mode DIGEST : ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur : Text  $result:=False  $utilisateur:=$user diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md index f7816af934b52e..b9f3e6551a18d7 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Vous devez déclarer ces paramètres de la manière suivante : ```4d   // Méthode base Sur authentification Web   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code pour la méthode ``` @@ -127,7 +127,7 @@ Exemple de **On Web Authentication database method** en mode BASIC : ```4d   //Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur;$motPasse;$IPBrowser;$IPServer : Text  var $utilisateur4D : Boolean  ARRAY TEXT($utilisateurs;0) @@ -176,7 +176,7 @@ Exemple de méthode base Sur authentification Web en mode DIGEST : ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur : Text  $result:=False  $utilisateur:=$user diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md b/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md index 3100b0b6825ee1..94c9b7c03c8f41 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Vous devez déclarer ces paramètres de la manière suivante : ```4d   // Méthode base Sur authentification Web   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code pour la méthode ``` @@ -127,7 +127,7 @@ Exemple de **On Web Authentication database method** en mode BASIC : ```4d   //Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur;$motPasse;$IPBrowser;$IPServer : Text  var $utilisateur4D : Boolean  ARRAY TEXT($utilisateurs;0) @@ -176,7 +176,7 @@ Exemple de méthode base Sur authentification Web en mode DIGEST : ```4d   // Méthode base Sur authentification Web - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $utilisateur : Text  $result:=False  $utilisateur:=$user diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md index fa6fe52f28184a..2786d8ea34f4c8 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md @@ -52,7 +52,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean   // メソッドコード ``` @@ -132,7 +132,7 @@ BASIC認証モードの**On Web Authenticationデータベースメソッド** ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean    var $ipServerDuser : Boolean  ARRAY TEXT($users;0) @@ -178,7 +178,7 @@ DIGESTモードのの例題: ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //セキュリティのため@を含むユーザ名とパスワードは拒否  If(WithWildcard($user)) diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md index 8bff52dd55abf3..6e95cb7005b717 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md @@ -52,7 +52,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean   // メソッドコード ``` @@ -132,7 +132,7 @@ BASIC認証モードの**On Web Authenticationデータベースメソッド** ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean    var $ipServerDuser : Boolean  ARRAY TEXT($users;0) @@ -178,7 +178,7 @@ DIGESTモードのの例題: ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //セキュリティのため@を含むユーザ名とパスワードは拒否  If(WithWildcard($user)) diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md index fa6fe52f28184a..2786d8ea34f4c8 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md @@ -52,7 +52,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean   // メソッドコード ``` @@ -132,7 +132,7 @@ BASIC認証モードの**On Web Authenticationデータベースメソッド** ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean    var $ipServerDuser : Boolean  ARRAY TEXT($users;0) @@ -178,7 +178,7 @@ DIGESTモードのの例題: ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //セキュリティのため@を含むユーザ名とパスワードは拒否  If(WithWildcard($user)) diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md b/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md index 386b2187979570..6d36db4cf55cbf 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md @@ -52,7 +52,7 @@ displayed_sidebar: docs ```4d   // On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean   // メソッドコード ``` @@ -132,7 +132,7 @@ BASIC認証モードの**On Web Authenticationデータベースメソッド** ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean    var $ipServerDuser : Boolean  ARRAY TEXT($users;0) @@ -178,7 +178,7 @@ DIGESTモードのの例題: ```4d   //On Web Authentication データベースメソッド - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //セキュリティのため@を含むユーザ名とパスワードは拒否  If(WithWildcard($user)) diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md index e7e5887db2d0f6..891fa35a60bba9 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Deve declarar esses parâmetros desta forma: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para o método ``` @@ -129,7 +129,7 @@ Exemplo do On Web Authentication database method*Licenses* em modo BASIC: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuário;$senha;$IPNavegador;$IPServidor : Text  var $ipServerDusuário : Boolean  ARRAY TEXT($usuários;0) @@ -178,7 +178,7 @@ Exemplo do On Web Authentication database method em modo DIGEST: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md index 5bb42097d5f785..b5405521c4e556 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Deve declarar esses parâmetros desta forma: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para o método ``` @@ -129,7 +129,7 @@ Exemplo do On Web Authentication database method*Licenses* em modo BASIC: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuário;$senha;$IPNavegador;$IPServidor : Text  var $ipServerDusuário : Boolean  ARRAY TEXT($usuários;0) @@ -178,7 +178,7 @@ Exemplo do On Web Authentication database method em modo DIGEST: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md index e7e5887db2d0f6..891fa35a60bba9 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Deve declarar esses parâmetros desta forma: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para o método ``` @@ -129,7 +129,7 @@ Exemplo do On Web Authentication database method*Licenses* em modo BASIC: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuário;$senha;$IPNavegador;$IPServidor : Text  var $ipServerDusuário : Boolean  ARRAY TEXT($usuários;0) @@ -178,7 +178,7 @@ Exemplo do On Web Authentication database method em modo DIGEST: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md b/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md index 49bf1810c873e6..b561f8a26a8825 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ Deve declarar esses parâmetros desta forma: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Código para o método ``` @@ -129,7 +129,7 @@ Exemplo do On Web Authentication database method*Licenses* em modo BASIC: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuário;$senha;$IPNavegador;$IPServidor : Text  var $ipServerDusuário : Boolean  ARRAY TEXT($usuários;0) @@ -178,7 +178,7 @@ Exemplo do On Web Authentication database method em modo DIGEST: ```4d   //Método de banco On Web Authentication - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $usuario : Text  $result:=False  $usuario:=$user diff --git a/versioned_docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md b/versioned_docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md index 4d2d2ebfefb369..59467e6b33c5dc 100644 --- a/versioned_docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md +++ b/versioned_docs/version-21-R2/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ You must declare these parameters as follows: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code for the method ``` @@ -127,7 +127,7 @@ Example of the On Web Authentication database method in BASIC mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $ipServerDuser : Boolean  ARRAY TEXT($users;0)  ARRAY LONGINT($nums;0) @@ -172,7 +172,7 @@ Example of the On Web Authentication database method in DIGEST mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //For security reasons, refuse names that contain @  If(WithWildcard($user)) diff --git a/versioned_docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md b/versioned_docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md index ac669a182f81ef..49a6ad45b9e1da 100644 --- a/versioned_docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md +++ b/versioned_docs/version-21-R3/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ You must declare these parameters as follows: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code for the method ``` @@ -127,7 +127,7 @@ Example of the On Web Authentication database method in BASIC mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $ipServerDuser : Boolean  ARRAY TEXT($users;0)  ARRAY LONGINT($nums;0) @@ -172,7 +172,7 @@ Example of the On Web Authentication database method in DIGEST mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //For security reasons, refuse names that contain @  If(WithWildcard($user)) diff --git a/versioned_docs/version-21/commands-legacy/on-web-authentication-database-method.md b/versioned_docs/version-21/commands-legacy/on-web-authentication-database-method.md index 8ed590085ea8d2..cef7b17c95f663 100644 --- a/versioned_docs/version-21/commands-legacy/on-web-authentication-database-method.md +++ b/versioned_docs/version-21/commands-legacy/on-web-authentication-database-method.md @@ -53,7 +53,7 @@ You must declare these parameters as follows: ```4d   // On Web Authentication Database Method   - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean     // Code for the method ``` @@ -127,7 +127,7 @@ Example of the On Web Authentication database method in BASIC mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  var $ipServerDuser : Boolean  ARRAY TEXT($users;0)  ARRAY LONGINT($nums;0) @@ -172,7 +172,7 @@ Example of the On Web Authentication database method in DIGEST mode: ```4d   //On Web Authentication Database Method - #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ;\ $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean + #DECLARE($url : Text ; $http : Text ; $BrowserIP : Text ; $ServerIP : Text ; $user : Text ; $password: Text) -> $result : Boolean  $result:=False   //For security reasons, refuse names that contain @  If(WithWildcard($user)) From 087d3c7c15602e0aa335ddbc3ee56c2466aa1885 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Mon, 8 Jun 2026 16:12:39 +0200 Subject: [PATCH 15/25] sets --- docs/Develop-legacy/sets.md | 168 ++++++++++++++++++ .../Structure Access/is-field-number-valid.md | 18 ++ .../Structure Access/is-table-number-valid.md | 3 +- 3 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 docs/Develop-legacy/sets.md diff --git a/docs/Develop-legacy/sets.md b/docs/Develop-legacy/sets.md new file mode 100644 index 00000000000000..7ff4340906a944 --- /dev/null +++ b/docs/Develop-legacy/sets.md @@ -0,0 +1,168 @@ +--- +id: sets +title: Sets +slug: /Develop/sets +displayed_sidebar: docs +--- + + +Sets offer you a powerful, swift means for manipulating record selections. Besides the ability to create sets, relate them to the current selection, and store, load, and clear sets, 4D offers three standard set operations: + +- Intersection +- Union +- Difference. + + +## Sets and the Current Selection + +A set is a compact representation of a selection of records. The idea of sets is closely bound to the idea of the current selection. Sets are generally used for the following purposes: + +- To save and later restore a selection when the order does not matter +- To access the selection a user made on screen (the `UserSet`) +- To perform a logical operation between selections. + +The current selection is a list of references that points to each record that is currently selected. The list exists in memory. Only currently selected records are in the list. A selection doesn’t actually contain the records, but only a list of references to the records. Each reference to a record takes 4 bytes in memory. When you work on a table, you always work with the records in the current selection. When a selection is sorted, only the list of references is rearranged. There is only one current selection for each table inside a process. + +Like a current selection, a set represents a selection of records. A set does this by using a very compact representation for each record. Each record is represented by one bit (one-eighth of a byte). Operations using sets are very fast, because computers can perform operations on bits very quickly. A set contains one bit for every record in the table, whether or not the record is included in the set. In fact, each bit is equal to 1 or 0, depending on whether or not the record is in the set. + +Sets are very economical in terms of RAM space. The size of a set, in bytes, is always equal to the total number of records in the table divided by 8. For example, if you create a set for a table containing 10,000 records, the set takes up 1,250 bytes, which is about 1.2K in RAM. + +There can be many sets for each table. In fact, sets can be saved to disk separately from the database. To change a record belonging to a set, first you must use the set as the current selection, then modify the record or records. + +A set is never in a sorted order—the records are simply indicated as belonging to the set or not. On the other hand, a named selection is in sorted order, but it requires more memory in most cases. For more information about named selections, see the Named Selections section. + +A set "remembers" which record was the current record at the time the set was created. The following table compares the concepts of the current selection and of sets: + +|Comparison|Current Selection|Sets| +|---|---|---| +|Number per table|1|0 to many| +|Sortable|Yes|No| +|Can be saved on disk|No|Yes| +|RAM per record(in bytes)|Number of selected records * 4|Total number of records/8| +|Combinable| No| Yes| +|Contains current record| Yes| Yes, as of the time the set was created| + +When you create a set, it belongs to the table from which you created it. Set operations can be performed only between sets belonging to the same table. + +Sets are independent from the data. This means that after changes are made to a file, a set may no longer be accurate. There are many operations that can cause a set to be inaccurate. For example, if you create a set of all the people from New York City, and then change the data in one of those records to “Boston” the set would not change, because the set is just a representation of a selection of records. Deleting records and replacing them with new ones also changes a set, as well as compacting the data. Sets can be guaranteed to be accurate only as long as the data in the original selection has not been changed. + +## Process and Interprocess Sets + +You can have the following three types of sets: + +- **Process sets**: A process set can only be accessed by the process in which it has been created. `LockedSet` is a process set. Process sets are cleared as soon as the process method ends. Process sets do not need any special prefix in the name. +- **Interprocess sets**: A set is an interprocess set if the name of the set is preceded by the symbols (<>) — a “less than” sign followed by a “greater than” sign. An interprocess set is “visible” to all the processes of the database. +In client/server mode, an interprocess set is “visible” to processes of the machine where it was created (client or server). +The name of an interprocess set must be unique in the database. +- **Local Sets/Client Sets**: Local/client sets are intended for use in client/server mode. The name of a local/client set is always preceded by the dollar sign ($) -- except for the UserSet system set. Unlike other types of sets, a local/client set is stored on the client machine. + +:::note Notes + +- The maximum size of a set name is 255 characters (excluding <> and $ symbols). +- For more information about the use of sets in client/server mode, please refer to 4D Server, Sets and Named Selections. + +::: + + +## Visibility of Sets + +The following table indicates the principles concerning the visibility of sets depending on their scope and where they were created: + + + +||Client Process|Other processes on the same client|Other clients|Server process|Other processes on the server| +|---|---|---|---|---|---| +|Creation in a client process |||||| +|$test|X ||||| +|test | X||| X(Trigger) || +|<>test | X|X |||| +|Creation in a server process|||||| +|$test|||| X|| +|test ||||X|| +|<>test||||X| X| + + +## Sets and Transactions + +A set can be created inside a [transaction](./transactions.md). It is possible to create a set of the records created inside a transaction and a set of records created or modified outside of a transaction. When the transaction ends, the set created during the transaction should be cleared, because it may not be an accurate representation of the records, especially if the transaction was canceled. + +## Example + +The following example deletes duplicate records from a table which contains information about people. A For...End for loop moves through all the records, comparing the current record to the previous record. If the name, address, and zip code are the same, then the record is added to a set. At the end of the loop, the set is made the current selection and the (old) current selection is deleted: + +```4d + CREATE EMPTY SET([People];"Duplicates") + // Create an empty set for duplicate records + ALL RECORDS([People]) + // Select all records + // Sort the records by ZIP, address, and name so + // that the duplicates will be next to each other + ORDER BY([People];[People]ZIP;>;[People]Address;>;[People]Name;>) + // Initialize variables that hold the fields from the previous record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + // Go to second record to compare with first + NEXT RECORD([People]) + For($i;2;Records in table([People])) + // Loop through records starting at 2 + // If the name, address, and ZIP are the same as the + // previous record then it is a duplicate record. + If(([People]Name=$Name) & ([People]Address=$Address) & ([People]ZIP=$ZIP)) + // Add current record (the duplicate) to set + ADD TO SET([People];"Duplicates") + Else + // Save this record’s name, address, and ZIP for comparison with the next record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + End if + // Move to the next record + NEXT RECORD([People]) + End for + // Use duplicate records that were found + USE SET("Duplicates") + // Delete the duplicate records + DELETE SELECTION([People]) + // Remove the set from memory + CLEAR SET("Duplicates") +``` + +As an alternative to immediately deleting records at the end of the method, you could display them on screen or print them, so that a more detailed comparison can be made. + + +## The UserSet System Set + +4D maintains a system set named `UserSet`, which automatically stores the most recent selection of records highlighted on screen by the user. Thus, you can display a group of records with [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection), ask the user to select from among them and turn the results of that manual selection into a selection or into a set that you name. + +::info 4D Server + +Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection.md), [`UNION`](../commands/union.md) and [`DIFFERENCE`](../commands/difference.md), make sure you compare `UserSet` only to client sets. + +::: + +There is only one `UserSet` for a process. Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. + +4D manages the `UserSet` set for list forms displayed in Design mode or using the [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection) commands. However, this mechanism is not active for [subforms](../FormObjects/subform_overview.md). + +The following method illustrates how you can display records, allow the user to select some of them, and then use UserSet to display the selected records: + +```4d + // Display all records and allow user to select any number of them. + // Then display this selection by using UserSet to change the current selection. + FORM SET OUTPUT([People];"Display") // Set the output layout + ALL RECORDS([People]) // Select all people + ALERT("Press Ctrl or Command and Click to select the people required.") + DISPLAY SELECTION([People]) // Display the people + USE SET("UserSet") // Use the people that were selected + ALERT("You chose the following people.") + DISPLAY SELECTION([People]) // Display the selected people +``` + +## The LockedSet System Set + +The [`APPLY TO SELECTION`], [`DELETE SELECTION`], [`ARRAY TO SELECTION`] and [`JSON TO SELECTION`] commands create a set named `LockedSet` when used in a multi-processing environment. + +Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the `SET QUERY AND LOCK` command). + +`LockedSet` indicates which records were locked during the execution of the command. \ No newline at end of file diff --git a/docs/language-legacy/Structure Access/is-field-number-valid.md b/docs/language-legacy/Structure Access/is-field-number-valid.md index 7e503daec18c0b..b4b1bbb5d59dbc 100644 --- a/docs/language-legacy/Structure Access/is-field-number-valid.md +++ b/docs/language-legacy/Structure Access/is-field-number-valid.md @@ -34,6 +34,24 @@ displayed_sidebar: docs This command can be used to detect any field deletions, which create gaps in the sequence of field numbers. +## Example + +It is possible to delete 4D tables and fields. You must take this possibility into account in algorithms used for counting tables and fields. It is necessary to use algorithms combining the `Get last table number` and `Get last field number`, as well as `Is table number valid` and `Is field number valid` commands. The following is an example of this type of algorithm: + +```4d + var $thetable; $thefield : Integer + For($thetable;1;Get last table number) + If(Is table number valid($thetable)) + For($thefield;1;Get last field number($thetable)) + If(Is field number valid($thetable;$thefield)) + ... `The field exists and is valid + End if + End for + End if + End for +``` + + ## See also [Last table number](../commands/last-table-number) diff --git a/docs/language-legacy/Structure Access/is-table-number-valid.md b/docs/language-legacy/Structure Access/is-table-number-valid.md index ca12ed69fc9168..bf31d1a90a399b 100644 --- a/docs/language-legacy/Structure Access/is-table-number-valid.md +++ b/docs/language-legacy/Structure Access/is-table-number-valid.md @@ -28,10 +28,11 @@ displayed_sidebar: docs ## Description -The Is table number valid command returns True if the table whose number is passed in the *tableNum* parameter exists in the database and False otherwise. Keep in mind that the command returns False if the table is in the Trash of the Explorer. +The **Is table number valid** command returns True if the table whose number is passed in the *tableNum* parameter exists in the database and False otherwise. Keep in mind that the command returns False if the table is in the Trash of the Explorer. This command can be used to detect any table deletions, which create gaps in the sequence of table numbers. + ## See also [Last table number](../commands/last-table-number) From e9243b76d10c929232bde284d0bd9a58be225ceb Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Mon, 22 Jun 2026 19:27:38 +0200 Subject: [PATCH 16/25] records --- docs/Develop-legacy/records.md | 308 +++++++++++++++++++++++++++++++++ docs/Develop-legacy/sets.md | 4 +- sidebars.js | 18 ++ 3 files changed, 328 insertions(+), 2 deletions(-) create mode 100644 docs/Develop-legacy/records.md diff --git a/docs/Develop-legacy/records.md b/docs/Develop-legacy/records.md new file mode 100644 index 00000000000000..25e1705847e48e --- /dev/null +++ b/docs/Develop-legacy/records.md @@ -0,0 +1,308 @@ +--- +id: records +title: Records +slug: /Develop/records +displayed_sidebar: docs +--- + + +## Record numbers + +There are three numbers associated with a record: + +- Record number +- Selected record number +- Sequence number + +### Record Number + +The record number is the absolute/physical record number for a record. A record number is automatically assigned to each new record and remains constant for the record until the record is deleted. Record numbers start at zero. They are not unique because record numbers of deleted records are reused for new records. They also change when the database is [compacted](../MSC/compact.md) or [repaired](../MSC/repair.md). + +### Selected Record Number + +The selected record number is the position of the record in the current selection, and so depends on the current selection. If the selection is changed or sorted, the selected record number will probably change. Numbering for the selected record number starts at one (1). + +### Sequence Number + +The sequence number is a unique non-repeating number that may be assigned to a field of a record (via the Autoincrement property, the SQL AUTO_INCREMENT attribute or the [`Sequence number`](../commands/sequence-number) command). It is not automatically stored with each record. It starts by default at 1 and is incremented for each new record that is created. Unlike record numbers, a sequence number is not reused when a record is deleted or when a database is compacted or repaired. Sequence numbers provide a way to have unique ID numbers for records. If a sequence number is incremented during a transaction, the number is not decremented if the transaction is canceled. + +:::note Notes + +- 4D does not carry out any check when you modify the automatic number internal counter of a table using the [`SET DATABASE PARAMETER`](../commands/set-database-parameter) command. If you decrement this counter, the new records created may have numbers that have already been assigned. +- Sequence numbers are not recommended to fill unique ID primary key fields for records. To create unique record IDs, it is strongly recommended to use UUIDs. + +::: + +### Example + +The following tables illustrate the numbers that are associated with records. Each line in the table represents information about a record. The order of the lines is the order in which records would be displayed in an output form. + +- **Data**: The data from a field in each record. For our example, it contains a person’s name. +- **Record Number**: The record’s absolute record number. This is the number returned by the [`Record number`](../commands/record-number) command. +- **Selected Record Number**: The record’s position in the current selection. This is the number returned by the [`Selected record number`](../commands/selected-record-number) command. +- **Sequence Number**: The record’s unique sequence number. This is the number returned by the [`Sequence number`](../commands/sequence-number) command when the record was created. This number is stored in a field. + +#### After the Records Are Entered + +The first table shows the records after they are entered. + +- The default order for the records is by record number. +- The record number starts at 0. +- The selected record number and the sequence number start at 1. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Sam| 3 |4 |4| +|Lisa| 4| 5 |5| + +Note: The records remain in the default order after a command changes the current selection without reordering it; for example, after the **Show All** menu command is chosen in the Design environment, or after the [`ALL RECORDS`](../commands/all-records) command is executed. + +#### After the Records Are Sorted + +The next table shows the same records sorted by name. + +- The same record number remains associated with each record. +- The selected record numbers reflect the new position of the records in the sorted selection. +- The sequence numbers never change, since they were assigned when each record was created and are stored in the record. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Sam| 3 |3 |4| +|Terri| 1 |4 |2| +|Tess |0| 5| 1| + + +#### After a Record Is Deleted + +The following table shows the records after Sam is deleted. + +- Only the selected record numbers have changed. Selected record numbers reflect the order in which the records are displayed. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Terri| 1 |3 |2| +|Tess |0| 4| 1| + + +#### After a Record Is Added + +The next table shows the records after a new record has been added for Liz. + +- A new record is added to the end of the current selection. +- Sam’s record number is reused for the new record. +- The sequence number continues to increment. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Lisa| 4| 4 |5| +|Liz |3| 5| 6| + +#### After the Selection is Changed and Sorted + +The following table shows the records after the selection was reduced to three records and then sorted. + +- Only the selected record number associated with each record changes. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Sabra| 2|1| 3| +|Liz |3| 2| 6| +|Terri| 1 |3 |2| + +## Record Stack + +The [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) commands allow you to put (“push”) records onto the record stack, and to remove (“pop”) them from the stack. + +Each process has its own record stack for each table. 4D maintains the record stacks for you. Each record stack is a last-in-first-out (LIFO) stack. Stack capacity is limited by memory. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) should be used with discretion. Each record that is pushed uses part of free memory. Pushing too many records can cause an out-of-memory or stack full condition. + +4D clears the stack of any unpopped records when you return to the menu at the end of execution of your method. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) are useful when you want to examine records in the same file during data entry. To do this, you push the record, search and examine records in the file (copy fields into variables, for example), and finally pop the record to restore the record. + +While entering a record, if you have to check a multiple field unique value, use the [`SET QUERY DESTINATION`](../commands/set-quer-destination) command. This will save you the calls to [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) that you were making before and after the call to QUERY in order to preserve the data entered in the current record. [`SET QUERY DESTINATION`](../commands/set-quer-destination) allows you to make a query that does not change the selection nor the current record. + +## Record locking + +4D and 4D Server automatically manage databases by preventing multi-user or multi-process conflicts. Two users or two processes cannot modify the same record or object at the same time. However, the second user or process can have read-only access to the record or object at the same time. + +There are several reasons for using the multi-user commands: + +- Modifying records by using the language. +- Using a custom user interface for multi-user operations. +- Saving related modifications inside a transaction. + +There are three important concepts to be aware of when using commands in a multi-processing database: + +1. In a process, each table is in either a read-only or a read/write state. +2. Records become locked when they are loaded and unlocked when they are unloaded. +3. A locked record cannot be modified. + +As a convention in the following sections, the person performing an operation on the multi-user database is referred to as the **local user**. Other people using the database are referred to as the **other users**. The discussion is from the perspective of the local user. Also, from a multi-process perspective, the process executing an operation on the database is the **current process**. Any other executing process is referred to as **other processes**. The discussion is from the point of view of the current process. + +### Locked Records + +A locked record cannot be modified by the local user or the current process. A locked record can be loaded, but cannot be modified. A record is locked when one of the other users or processes has successfully loaded the record for modification, or when the record is stacked. Only the user who is modifying the record sees that record as unlocked. All other users and processes see the record as locked, and therefore unavailable for modification. A table must be in a read/write state for a record to be loaded unlocked. + +### Read-Only and Read/Write States + +Each table in a database is in either a read/write or a read-only state for each user and process of the database. **Read-only** means that records for the table can be loaded but not modified. **Read/write** means that records for the table can be loaded and modified if no other user has locked the record first. + +Note that if you change the status of a table, the change takes effect for the next record loaded. If there is a record currently loaded when you change the table’s status, that record is not affected by the status change. + +#### Read-Only State + +When a table is read-only and a record is loaded, this record is always locked. In other words, locked records can be displayed, printed, and otherwise used, but they cannot be modified. + +Note that the read-only state applies only to editing existing records. A read-only state does not affect the creation of new records. You can still add records to a read-only table using [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record), or the menu commands of the Design environment (in this case, the records being created are locked for all other users/processes). Note that the [`ARRAY TO SELECTION`](../commands/array-to-selection) command is not affected by the read-only state since it can both create and modify records. + +4D automatically sets a table to read-only for commands that do not require write access to records. These commands are: [`DISPLAY SELECTION`](../commands/display-selection), [`DISTINCT VALUES`](../commands/distinct-values), [`EXPORT DIF`](../commands/export-dif), [`EXPORT SYLK`](../commands/export-sylk), [`EXPORT TEXT`](../commands/export-text), [`PRINT SELECTION`](../commands/print-selection), [`PRINT LABEL`](../commands/print-label), [`QR REPORT`](../commands/qr-report), [`SELECTION TO ARRAY`](../commands/selection-to-array), [`SELECTION RANGE TO ARRAY`](../commands/selection-range-to-array). + +You can find out the state of a table at any time using the [`Read only state`](../commands/read-only-state) function. + +Before executing any of these commands, 4D saves the current state of the table (read-only or read/write) for the current process. After the command has executed, this state is restored. + +#### Read/Write State + +When a table is read/write and a record is loaded, the record will become unlocked if no other user has locked the record first. If the record is locked by another user, the record is loaded as a locked record that cannot be modified by the local user. + +A table must be set to read/write and the record loaded for it to become unlocked and thus modifiable. + +If a user loads a record from a table in read/write mode, no other users can load that record for modification. However, other users can add records to the table, either through the [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record) commands or manually in the Design environment. + +Read/write is the default state for all tables when a database is opened and a new process is started. + +#### Changing the Status of a Table + +You can use the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands to change the state of a table. If you want to change the state of a table in order to make a record read-only or read/write, you must execute the command before this record is loaded. Any record that is already loaded is not affected by the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands. + +Each process has its own state (read-only or read/write) for each table in the database. + +By default, if you do not use the READ ONLY command, all tables are in read/write mode. + +### Loading, Modifying and Unloading Records + +Before the local user can modify a record, the table must be in the read/write state and the record must be loaded and unlocked. + +Any of the commands that loads a current record (if there is one) — such as [`NEXT RECORD`](../commands/next-record), [`QUERY`](../commands/query), [`ORDER BY`](../commands/order-by), [`RELATE ONE`](../commands/relate-one), etc. — sets the record state as locked or unlocked. The record is loaded according to the current state of its table (read-only or read/write) and its availability. A record may also be loaded for a related table by any of the commands that cause an automatic relation to be established. + +If a table is in the read-only state for a process or a user, then this table's records are loaded in read-only mode, which means they cannot be modified or deleted by this process or user. This is recommended for viewing or retrieving data because it does not prevent other users or processes from accessing the records of this table in read/write mode if necessary. + +If a table is in the read/write state for a process or a user, then any record from this table is also loaded in read/write mode, but only if no other user or process has already locked this record. If a record is successfully loaded in read/write mode, it is unlocked for the current process or user (it can be modified and saved) and is locked for all other users or processes. A table must be put into the read/write state before loading a record for modification and then saving it. + +If the record is to be modified, you use the Locked function to test whether or not a record is locked by another user. If a record is locked (Locked returns True), load the record with the [`LOAD RECORD`](../commands/load-record) command and again test whether or not the record is locked. This sequence must be continued until the record becomes unlocked (Locked returns False). + +When modifications to be made to a record are finished, the record must be released (and therefore unlocked for the other users) with [`UNLOAD RECORD`](../commands/unload-record). If a record is not unloaded, it will remain locked for all other users until a different current record is selected. Changing the current record of a table automatically unlocks the previous current record. You need to explicitly call [`UNLOAD RECORD`](../commands/unload-record) if you do not change the current record. This discussion applies to existing records. When a new record is created, it can be saved regardless of the state of the table to which it belongs. + +:::note + +When it is used in a transaction, the [`UNLOAD RECORD`](../commands/unload-record) command unloads the current record only for the process that manages the transaction. For other processes, the record stays locked as long as the transaction has not been validated (or cancelled). + +::: + +Use the [`LOCKED BY`](../commands/locked-by) command to see which user and/or process have locked a record. + +::: + +A good practice is to place all tables in read-only mode when each process is started (using the syntax [`READ ONLY(*)`](../commands/read-only)) then put each table in read/write mode only when necessary. Access to tables in read-only mode is faster and more memory-efficient. Moreover, changing the state of a table is optimized in client/server mode because it does not cause any additional network traffic: information is only sent to the server when executing a command that requires adequate access to the table. + +::: + +### Loops to Load Unlocked Records + +The following example shows the simplest loop with which to load an unlocked record: + +```4d + READ WRITE([Customers])//Set the table’s state to read/write + Repeat//Loop until the record is unlocked + LOAD RECORD([Customers])//Load record and set locked status + Until(Not(Locked([Customers]))) + //Do something to the record here + READ ONLY([Customers])//Set the table’s state to read-only +``` + +The loop continues until the record is unlocked. + +A loop like this is used only if the record is unlikely to be locked by anyone else, since the user would have to wait for the loop to terminate. Thus, it is unlikely that the loop would be used as is unless the record could only be modified by means of a method. + +The following example uses the previous loop to load an unlocked record and modify the record: + +```4d + READ WRITE([Inventory]) + Repeat //Loop until the record is unlocked + LOAD RECORD([Inventory]) //Load record and set it to locked + Until(Not(Locked([Inventory]))) + [Inventory]Part Qty:=[Inventory]Part Qty 1 //Modify the record + SAVE RECORD([Inventory]) //Save the record + UNLOAD RECORD([Inventory]) //Let other users modfiy it + READ ONLY([Inventory]) +``` + + +The [`MODIFY RECORD`](../commands/modify-record) command automatically notifies the user if a record is locked, and prevents the record from being modified. The following example avoids this automatic notification by first testing the record with the Locked function. If the record is locked, the user can cancel. + +This example efficiently checks to see if the current record is locked for the table [Commands]. If it is locked, the process is delayed by the procedure for one second. This technique can be used both in a multi-user or multi-process situation: + +```4d + Repeat + READ ONLY([Commands])//You do not need read/write right now + QUERY([Commands]) + //If the search was completed and some records were returned + If((OK=1) & (Records in selection([Commands])>0)) + READ WRITE([Commands])//Set the table to read/write state + LOAD RECORD([Commands]) + While(Locked([Commands]) & (OK=1)) `If the record is locked, + //loop until the record is unlocked + //Who is the record locked by? + LOCKED BY([Commands];$Process;$User;$SessionUser;$Name) + If($Process=-1)//Has the record been deleted? + ALERT("The record has been deleted in the meantime.") + OK:=0 + Else + If($User="")//Are you in single-user mode + $User:="you" + End if + CONFIRM("The record is already used by "+$User+" in the "+$Name+" Process.") + If(OK=1)//If you want to wait for a few seconds + DELAY PROCESS(Current process;120)//Wait for a few seconds + LOAD RECORD([Commands])//Try to load the record + End if + End if + End while + If(OK=1)//The record is unlocked + MODIFY RECORD([Commands])//You can modify the record + UNLOAD RECORD([Commands]) + End if + READ ONLY([Commands])//Switch back to read-only + OK:=1 + End if + Until(OK=0) +``` + + +### Using Commands in Multi-user or Multi-process Environment + +A number of commands in the language perform specific actions when they encounter a locked record. They behave normally if they do not encounter a locked record. + +Here is a list of these commands and their actions when a locked record is encountered. + +- [`MODIFY RECORD`](../commands/modify-record): Displays a dialog box stating that the record is in use. The record is not displayed, therefore the user cannot modify the record. In the Design environment, the record is shown in read-only state. +- [`MODIFY SELECTION`](../commands/modify-selection): Behaves normally except when the user double-clicks a record to modify it. [`MODIFY SELECTION`](../commands/modify-selection) displays dialog box stating that the record is in use and then allows read-only access to the record. +- [`APPLY TO SELECTION`](../commands/apply-to-selection): Loads a locked record, but does not modify it. [`APPLY TO SELECTION`](../commands/apply-to-selection) can be used to read information from the table without special care. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE SELECTION`](../commands/delete-selection): Does not delete any locked records; it skips them. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE RECORD`](../commands/delete-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`SAVE RECORD`](../commands/save-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`ARRAY TO SELECTION`](../commands/array-to-selection): Does not save any locked records. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`GOTO RECORD`](../commands/goto-record): Records in a multi-user/multi-process database may be deleted and added by other users, therefore the record numbers may change. Use caution when directly referencing a record by number in a multi-user database. +- [**Sets**](./sets.md): Take special care with sets, as the information that the set was based on may be changed by another user or process. diff --git a/docs/Develop-legacy/sets.md b/docs/Develop-legacy/sets.md index 7ff4340906a944..bfcb69b41f8f6f 100644 --- a/docs/Develop-legacy/sets.md +++ b/docs/Develop-legacy/sets.md @@ -141,7 +141,7 @@ Although its name does not begin with the character "$", the `UserSet` system se ::: -There is only one `UserSet` for a process. Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. +There is only one `UserSet` for a [process](../Develop/processes.md). Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. 4D manages the `UserSet` set for list forms displayed in Design mode or using the [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection) commands. However, this mechanism is not active for [subforms](../FormObjects/subform_overview.md). @@ -163,6 +163,6 @@ The following method illustrates how you can display records, allow the user to The [`APPLY TO SELECTION`], [`DELETE SELECTION`], [`ARRAY TO SELECTION`] and [`JSON TO SELECTION`] commands create a set named `LockedSet` when used in a multi-processing environment. -Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the `SET QUERY AND LOCK` command). +Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the [`SET QUERY AND LOCK`](../commands/set-query-and-lock) command). `LockedSet` indicates which records were locked during the execution of the command. \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 46db56c26ce731..80c07ad10c3b31 100644 --- a/sidebars.js +++ b/sidebars.js @@ -331,6 +331,24 @@ module.exports = "Develop/async" ] }, + { + type: "category", + label: "Records & selections", + link: { + type: "generated-index", + title: "Records & selections", + description: "Legacy development objects and concepts for 4D databases", + slug: "/category/records-selections", + keywords: [ + "records", + "selections" + ], + image: "/img/docusaurus.png" }, + items: [ + "Develop-legacy/sets", + "Develop-legacy/records" + ] + }, "Develop-legacy/transactions", "Tags/transformation-tags", "Project/date-time-formats" From 5869fe1f00901018cfbed36817bdcf0afc91f3a6 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Tue, 23 Jun 2026 18:43:21 +0200 Subject: [PATCH 17/25] up to drag and drop --- docs/API/SignalClass.md | 12 +- docs/Concepts/dt_string.md | 9 + docs/Desktop/drag-drop.md | 223 +++++++++++++ docs/Develop-legacy/legacy-to-import.md | 91 ++++++ docs/Develop-legacy/sets.md | 4 +- docs/Develop-legacy/xml.md | 157 +++++++++ docs/Develop/processes.md | 2 + docs/FormObjects/properties_Text.md | 87 ++++- docs/assets/en/API/signal.png | Bin 23256 -> 32677 bytes docs/assets/en/Desktop/dragdrop1.png | Bin 0 -> 8516 bytes docs/assets/en/Desktop/dragdrop2.png | Bin 0 -> 38143 bytes docs/assets/en/Desktop/dragdrop3.png | Bin 0 -> 23914 bytes docs/assets/en/Desktop/dragdrop4.png | Bin 0 -> 7102 bytes docs/assets/en/Desktop/dragdrop5.png | Bin 0 -> 9034 bytes docs/assets/en/Desktop/dragdrop6.png | Bin 0 -> 142244 bytes docs/assets/en/Desktop/dragdrop7.png | Bin 0 -> 247194 bytes docs/commands/theme/XML.md | 60 ---- docs/commands/theme/XML_DOM.md | 61 ---- docs/commands/theme/XML_SAX.md | 30 -- .../Objects (Forms)/object-is-styled-text.md | 8 +- .../Develop-legacy/legacy-to-import.md | 91 ++++++ .../current/Develop-legacy/overview.md | 7 + .../current/Develop-legacy/records.md | 308 ++++++++++++++++++ .../current/Develop-legacy/sets.md | 168 ++++++++++ .../current/Develop-legacy/xml.md | 157 +++++++++ .../Develop-legacy/legacy-to-import.md | 91 ++++++ .../current/Develop-legacy/overview.md | 7 + .../current/Develop-legacy/records.md | 308 ++++++++++++++++++ .../current/Develop-legacy/sets.md | 168 ++++++++++ .../current/Develop-legacy/xml.md | 157 +++++++++ .../Develop-legacy/legacy-to-import.md | 91 ++++++ .../current/Develop-legacy/overview.md | 7 + .../current/Develop-legacy/records.md | 308 ++++++++++++++++++ .../current/Develop-legacy/sets.md | 168 ++++++++++ .../current/Develop-legacy/xml.md | 157 +++++++++ .../Develop-legacy/legacy-to-import.md | 95 ++++++ .../current/Develop-legacy/overview.md | 7 + .../current/Develop-legacy/records.md | 308 ++++++++++++++++++ .../current/Develop-legacy/sets.md | 168 ++++++++++ .../current/Develop-legacy/xml.md | 157 +++++++++ sidebars.js | 24 +- .../commands-legacy/component-list.md | 8 +- .../commands-legacy/component-list.md | 8 +- 43 files changed, 3529 insertions(+), 183 deletions(-) create mode 100644 docs/Desktop/drag-drop.md create mode 100644 docs/Develop-legacy/legacy-to-import.md create mode 100644 docs/Develop-legacy/xml.md create mode 100644 docs/assets/en/Desktop/dragdrop1.png create mode 100644 docs/assets/en/Desktop/dragdrop2.png create mode 100644 docs/assets/en/Desktop/dragdrop3.png create mode 100644 docs/assets/en/Desktop/dragdrop4.png create mode 100644 docs/assets/en/Desktop/dragdrop5.png create mode 100644 docs/assets/en/Desktop/dragdrop6.png create mode 100644 docs/assets/en/Desktop/dragdrop7.png create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/records.md create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md create mode 100644 i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/records.md create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md create mode 100644 i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/records.md create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md create mode 100644 i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/records.md create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md create mode 100644 i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md diff --git a/docs/API/SignalClass.md b/docs/API/SignalClass.md index b5b4ce8fffe945..e466bc9588088f 100644 --- a/docs/API/SignalClass.md +++ b/docs/API/SignalClass.md @@ -5,20 +5,16 @@ title: Signal Signals are tools provided by the 4D language to manage interactions and avoid conflicts between processes in a multiprocess application. Signals allow you to make sure one or more process(es) will wait for a specific task to be completed before continuing execution. Any process can wait and/or release a signal. -> Semaphores can also be used to manage interactions. Semaphores allow you to make sure that two or more processes do not modify the same resource (file, record...) at the same time. Only the process that sets the semaphore can remove it. +:::note +[Semaphores](../Develop/processes.md#semaphores) can also be used to manage interactions. Semaphores allow you to make sure that two or more processes do not modify the same resource (file, record...) at the same time. Only the process that sets the semaphore can remove it. + +::: ### Signal Object A signal is a shared object that must be passed as a parameter to commands that call or create workers or processes. -A `4D.Signal` object contains the following built-in methods and properties: - -- [`.wait()`](#wait) -- [`.trigger()`](#trigger) -- [`.signaled`](#signaled) -- [`.description`](#description). - Any worker/process calling the `.wait()` method will suspend its execution until the `.signaled` property is true. While waiting for a signal, the calling process does not use any CPU. This can be very interesting for performance in multiprocess applications. The `.signaled` property becomes true when any worker/process calls the `.trigger()` method. Note that to avoid blocking situations, the `.wait()` can also return after a defined timeout has been reached. diff --git a/docs/Concepts/dt_string.md b/docs/Concepts/dt_string.md index 7c999d4f48aae0..c1ac293ed35819 100644 --- a/docs/Concepts/dt_string.md +++ b/docs/Concepts/dt_string.md @@ -34,6 +34,15 @@ The following escape sequences can be used within strings: **Note:** The \ (backslash) character is used as a separator in pathnames under Windows. You must therefore use a double backslash \\\ in paths when you want to have a backslash in front of a character used in one of the escape sequences recognized by 4D (e.g. "C:\\\MyDocuments\\\New.txt"). + +### Automatic normalization of line endings + +In order to ensure multi-platform compatibility of texts handled in the database, 4D automatically normalizes line endings so that they occupy a single character: `\r` (carriage return). This normalization is carried out at the level of form objects (variables or fields) hosting plain or multi-style text. Line endings that are not native, or that use a mix of several characters (for example `\r\n`), are considered as a single `\r`. Note that in compliance with the XML standard (multi-style text format), the [multi-style text commands](../commands/theme/Styled_Text.md) also normalize line endings for text variables that are not associated with objects. + +This principle makes it easier to use multi-style text commands or commands such as [`HIGHLIGHT TEXT`](../commands/highlight-text) in a multi-platform context. However, you must take this into account in your processing when you work with texts from heterogeneous sources. + + + ## String operators |Operation |Syntax |Returns |Expression |Value| diff --git a/docs/Desktop/drag-drop.md b/docs/Desktop/drag-drop.md new file mode 100644 index 00000000000000..3de222703276bc --- /dev/null +++ b/docs/Desktop/drag-drop.md @@ -0,0 +1,223 @@ +--- +id: drag-and-drop +title: Drag and drop +--- + +## Overview + +4D allows built-in drag and drop capability between objects in your forms and applications. You can drag and drop one object to another, in the same window or in another window. In other words, drag and drop can be performed within a process or from one process to another. + +You can also drag and drop objects between 4D forms and other applications, and vice versa. For example, it is possible to drag and drop a .png picture file onto a 4D picture field. It is also possible to select text in a word processing application and drop it onto a 4D text variable or a list box. + +Finally, it is possible to drop objects directly onto the application without necessarily having a form in the foreground. The [`On Drop` Database Method](../commands-legacy/on-drop-database-method.md) can be used to manage the drag and drop action in this case. This means, for example, that you can open a 4D Write Pro document by dropping it onto the 4D application icon. + +4D provides two drag-and-drop modes: + +- a **custom mode**, where the whole drag-and-drop operation is handled by the programmer. This mode lets you implement any interface based upon drag-on-drop, including interfaces that do not necessarily transport data, but can perform any action like opening files or triggering a calculation. +- an **automatic mode**, where a drag-and-drop operation automatically copies or moves data from an object to another. This mode is available to text-based objects and (partially) pictures, and can be enabled by simply selecting a property. + + +## Draggable and Droppable Objects + +Several form objects can be draggable and/or droppable, in custom and/or automatic mode (see below). By default, newly created form objects can be neither dragged nor dropped ("none" value). It is up to you to set these properties. + +To drag and drop an object to another object, you must set its [**Draggable** property](../FormObjects/properties_Action.md#draggable) to "Automatic" or "Custom". In a drag-and-drop operation, the object that you drag is the source object. + +To make an object the destination of a drag and drop operation, you must set its [**Droppable** property](../FormObjects/properties_Action.md#droppable) to "Automatic" or "Custom". In a drag-and-drop operation, the object that receives data is the destination object. + +The following table lists the available properties for draggable and/or droppable objects: + +|Form object|Draggable "Custom"|Droppable "Custom"|Draggable "Auto"|Droppable "Auto"| +|----|----|----|----|----| +|[4D Write Pro areas](writeProArea_overview.md)|x|x|x|x| +|[Combo Box](comboBox_overview.md)||x|x|x| +|[Input](input_overview.md)|x|x|x|x| +|[Hierarchical List](list_overview.md)|x|x||| +|[List Box](listbox_overview.md)|x|x||| +|[Plug-in Area](pluginArea_overview.md)|||x|x| +|[Button](button_overview.md)||x||| +|[Picture button](pictureButton_overview.md)||x||| + + +Items of a hierarchical list or rows in a list box can be dragged and dropped. Conversely, you can drag and drop an object onto an item of a hierarchical list or a list box row. However, you cannot drag and drop objects from the detail area of an output form. You can also manage dragging and dropping onto the application, outside of any form, using the [`On Drop` database method](../commands-legacy/on-drop-database-method.md). + +:::note Notes + +- By default, in the case of picture fields and variables, the picture and its reference are both dragged. If you only want to drag the reference, first hold down the **Alt** (Windows) or **Option** (macOS) key. +- When the "Custom" Draggable and ["Movable Rows"](../FormObjects/properties_Action.md#movable-rows) properties are both set for an array list box object, the "Movable Rows" property takes priority when a row is moved. Dragging is not possible in this case. +- An object that is capable of being both dragged and dropped can also be dropped onto itself, unless you reject the operation. + +::: + + +## Custom Drag and Drop + +Implementing a custom drag-and-drop interface means combining properties, events, and commands from the [*Pasteboard* theme](../commands/theme/Pasteboard.md). The following diagram illustrates the key points of a custom drag-and-drop sequence: + +![](../assets/en/Desktop/dragdrop1.png) + +Your implementation will be based upon the following scenario: + +1. In the [`On Begin Drag Over`](../Events/onBeginDragOver.md) event of the source object (with ["Custom" **Draggable** property](../FormObjects/properties_Action.md#draggable)), put appropriate data in the pasteboard using [`APPEND DATA TO PASTEBOARD`](../commands/append-data-to-pasteboard), [`SET FILE TO PASTEBOARD`](../commands/set-file-to-pasteboard) or other commands from the [Pasteboard theme](../commands/theme/Pasteboard.md). You can also define a specific cursor icon using [`SET DRAG ICON`](../commands/set-drag-icon) command. +2. In the [`On Drag Over`](../Events/onDragOver.md) event of the destination object (with ["Custom" **Droppable** property](../FormObjects/properties_Action.md#droppable)), get the data types or data signatures found in the pasteboard using [`GET PASTEBOARD DATA TYPE`](../commands/get-pasteboard-data-type) or [`GET PASTEBOARD DATA`](../commands/get-pasteboard-data) and check if they are compatible with the destination object. +The [`Drop position`](../commands/drop-position) command returns the element number or the item position of the target element or list item, if the destination object is an array (i.e., scrollable area), a hierarchical list, a text or a combo box, as well as the column number if the object is a list box. +If the destination object or element is compatible, return **0** to accept the drop, otherwise **-1** in its [object method](../Concepts/methods.md#method-types). +3. In the [`On Drop`](../Events/onDrop.md) event of the destination object (with ["Custom" **Droppable** property](../FormObjects/properties_Action.md#droppable)), execute any action in response to the drop. If the drag-and-drop operation is intended to copy the dragged data, you simply assign the data to destination object. If the drag and drop is not intended to move data, but is instead a user interface metaphor for a particular operation, you can perform whatever you want, for example getting file paths using [`Get file from pasteboard`](../commands/get-file-from-pasteboard) command. + + +Note that the [`On Begin Drag Over`](../Events/onBeginDragOver.md) event is generated **in the context of the source object of the drag** while [`On Drag Over`](../Events/onDragOver.md) and [`On Drop`](../Events/onDrop.md) events are only sent to the destination object. + +In order for the application to process these events, they must be selected in an appropriate manner in the Property List for both the source and destination objects: + +![](../assets/en/Desktop/dragdrop2.png) + + +## Automatic Drag and Drop + +Automatic drag and drop is the movement or copy of a text or picture selection from one area to another by a single click. It can be used in the same 4D area, between two 4D areas, or between 4D and another application. + +:::note + +In the case of automatic drag and drop between two 4D areas, the data are moved, in other words, they are removed from the source area. If you want to copy the data, hold down the **Ctrl** (Windows) or **Option** (macOS) key during the action (under macOS, you need to hit the **Option** key *after* you start to drag the item(s)). + +::: + + +[Automatic Draggable](../FormObjects/properties_Action.md#draggable) property and [Automatic Droppable](../FormObjects/properties_Action.md#droppable) property can be configured separately for each form object. + +- **Draggable: Automatic**: When this option is selected, the automatic drag mode is activated for the object. In this mode, the [`On Begin Drag`](../Events/onBeginDragOver.md) form event is NOT generated. +If you want to "force" the use of the custom drag while automatic drag is enabled, hold down the **Alt** (Windows) or **Option** (macOS) key during the action (under macOS, you need to hit the **Option** key *before* you start to drag the item(s)). This option is not available for pictures. +- **Droppable: Automatic**: In this mode, 4D automatically manages — if possible — the insertion of dragged data of the text or picture type that is dropped onto the object (the data are pasted into the object). The [`On Drag Over`](../Events/onDragOver.md) and [`On Drop`](../Events/onDrop.md) form events are not generated in this case. On the other hand, the [`On After Edit`](../Events/onAfterEdit.md) (during a drop) and [`On Data Change`](../Events/onDataChange.md) (when the object loses the focus) events are generated. + +In the case of data other than text or pictures (another 4D object, file, etc.) or complex data being dropped, the application refers to the value of the "Droppable" option: if it is not "none", the [`On Drag Over`](../Events/onDragOver.md) and [`On Drop`](../Events/onDrop.md) form events are generated; otherwise, the drop is refused. + + +## Examples + +### Example: Array based list box to input text area + + +In this simple example, we want to fill an input text area with data dragged from an array-based list box: + +![](../assets/en/Desktop/dragdrop3.png) + +The list box object method: + +```4d + //Object Method: ListBox + If(Form event code=On Begin Drag Over) + SET TEXT TO PASTEBOARD(arrFirstname{arrFirstname}+" "+arrLastname{arrFirstname}) + End if +``` + +The input text area object method contains: + +```4d + + // Object Method: label1 +If(Form event code=On Drop) //Requires Droppable Action enabled from Property List + ARRAY TEXT($signatures_at;0) + ARRAY TEXT($nativeTypes_at;0) + ARRAY TEXT($formatNames_at;0) + GET PASTEBOARD DATA TYPE($signatures_at;$nativeTypes_at;$formatNames_at) + If(Find in array($signatures_at;"com.4d.private.text.native")#-1) // there is 4D text in pasteboard + OBJECT Get pointer(Object current)->:=Get text from pasteboard + End if + End if +``` + + +### Example: Selection based list box to input text area + +Combining custom and automatic drag and drop features allows simple and powerful interfaces. In this example, we want to fill an input text area with data dragged from a list box: + +![](../assets/en/Desktop/dragdrop4.png) + +- List box: "Custom" Draggable property and "On Begin Drag Over" event +- Input text area: "Automatic" Droppable property. + +```4d + //list box object method + Case of + :(Form event code=On Begin Drag Over) + LOAD RECORD([Clients]) + $label:=[Clients]Name+Char(CR ASCII code)+[Clients]Contact+Char(CR ASCII code)+\ + [Clients]Address1+Char(CR ASCII code)+[Clients]City+", "+[Clients]State+" "+[Clients]ZipCode) + SET TEXT TO PASTEBOARD($label) + End case +``` + + +Moving and formatting data is done through drag and drop: + +![](../assets/en/Desktop/dragdrop5.png) + + +### Example: File path to text area + + +You want the user to select a file on the disk, then drag and drop it on an enterable variable (of type object) so that it displays a json description of the file. + +![](../assets/en/Desktop/dragdrop6.png) + +In the object method of the variable, you just write: + +```4d + #DECLARE -> $result : Integer + Case of + + :(Form event code=On Drag Over) + // Accept On Drop event only if the pasteboard contains files, reject otherwise. + If(Get file from pasteboard(1)="") //no file in pasteboard + $result:=-1 //reject drop + End if + + :(Form event code=On Drop) //Requires Droppable action enabled from Property List + var $path_t : Text + var path_o : Object + $path_t:=Get file from pasteboard(1) + If($path_t#"") + path_o:=Path to object($path_t) + End if + + End case +``` + + +### Example: File paths to list box + +You want the user to select files on the disk, then drag and drop them on a list box so that it displays file paths. + +![](../assets/en/Desktop/dragdrop7.png) + + +In the list box object method, you just write: + +```4d + #DECLARE -> $result : Integer + Case of + + :(Form event code=On Drag Over) + // Accept On Drop event only if the pasteboard contains files, reject otherwise. + If(Get file from pasteboard(1)#"") //at least one file dropped + $result:=0 //accept drop + Else //no file in pasteboard + $result:=-1 //reject drop + End if + + :(Form event code=On Drop) //Requires Droppable action enabled from Property List + ARRAY TEXT(importedPath_at;0) + var $path_t :Text + var $index_l:=1 + Repeat + $path_t:=Get file from pasteboard($index_l) + If($path_t#"") + APPEND TO ARRAY(importedPath_at;$path_t) + End if + $index_l:=$index_l+1 + Until($path_t="") + End case +``` + + +## Pasteboard commands \ No newline at end of file diff --git a/docs/Develop-legacy/legacy-to-import.md b/docs/Develop-legacy/legacy-to-import.md new file mode 100644 index 00000000000000..89f9256f4f8c49 --- /dev/null +++ b/docs/Develop-legacy/legacy-to-import.md @@ -0,0 +1,91 @@ +--- +id: legacy-to-import +title: develop-legacy +draft: true +--- + + + + +## Semaphores + +Semaphores allow you to make sure that two or more processes do not modify the same resource (file, record...) at the same time. Only the process that sets the semaphore can remove it. + +:::info + +[Signals](../API/SignalClass.md) can also be used to manage interactions. Signals allow you to make sure one or more process(es) will wait for a specific task to be completed before continuing execution. Any process can wait and/or release a signal. + +::: + +### What is a semaphore? + +In a computer program, a semaphore is a tool used to protect actions that need to be performed by only one process or user at a time. + +In 4D, the conventional need for using semaphores is for modifying an interprocess array: if one process is modifying the values of the array, another process must not be able to do the same thing at the same time. The developer uses a semaphore to indicate to a process that it can only perform its sequence of operations if no other process is already performing the same tasks. When a process encounters a semaphore, there are three possibilities: + +- It immediately gets the right to pass +- It waits for its turn until it gets the right to pass +- It continues on its way, abandoning the idea of performing the tasks. + +The semaphore therefore protects parts of the code. It allows only one process through at a time and blocks access until the process currently holding the right of use relinquishes this right by releasing the semaphore. + +### Commands for working with semaphores + +In 4D, you set a semaphore by calling the [`Semaphore`](../commands/sempahore) command. To release a semaphore, you call the [`CLEAR SEMAPHORE`](../commands/clear-sempahore) command. + +The [`Semaphore`](../commands/sempahore) command has a very special behavior since it potentially performs two actions simultaneously: + +- If the semaphore is already assigned, the function returns **True** +- If the semaphore is not assigned, the function assigns it to the process and returns **False** at the same time. + +This double action performed by the same command ensures that no external operation can be inserted between the semaphore test and its assignment. + +You can use the [`Test semaphore`](../commands/test-semaphore) command to find out whether a semaphore is already assigned or not. This command is mainly used as part of long operations, such as the annual closing of accounts, where [`Test semaphore`](../commands/test-semaphore) lets you control the interface to prevent access to certain operations such as the addition of accounting data. + +### How to use semaphores + +Semaphores should be used according to the following principles: + +- A semaphore must be set and released in the same method, +- The execution of code protected by the semaphore must be as short as possible, +- The code must be timed by means of the tickCount parameter of the [`Semaphore`](../commands/sempahore) command to wait for the release of the semaphore. + +Here is typical code for using a semaphore: + +```4d + While(Semaphore("MySemaphore";300)) + IDLE + End while + // place code protected by semaphore here + CLEAR SEMAPHORE("MySemaphore") +``` + +A semaphore that is not released can block part of the database. Setting and releasing semaphores in the same method helps to eliminate this risk. + +Minimizing the code protected by the semaphore increases the fluidity of the application and avoids the semaphore acting as a bottleneck. + +Finally, using the optional *tickCount* parameter of the [`Semaphore`](../commands/sempahore) command is essential for optimizing the wait for the semaphore to be released. Using this parameter, the commands works as follows: + +- The process waits a maximum of the specified number of ticks (300 in the example) for the semaphore to be available, without the code execution moving on to the next line, +- If the semaphore is released before the end of this limit, it is immediately assigned to the process (Semaphore returns False) and code execution resumes, +- If the semaphore is not released before the end of this limit, then code execution resumes. + +The command also prioritizes requests by establishing a queue. This way, the first process requesting a semaphore will be the first to get one. Note that the wait time is set depending on the specifics of the application. + +### Local or global semaphores + +There are two types of semaphores in 4D: local semaphores and global semaphores. + +- A local semaphore is accessible by all processes on the same workstation and only on the workstation. A local semaphore can be created by prefixing the name of the semaphore with a dollar sign ($). You use local semaphores to monitor operations among processes executing on the same workstation. For example, a local semaphore can be used to monitor access to an interprocess array shared by all the processes in your single-user database or on the workstation. +- A global semaphore is accessible to all users and all their processes. You use global semaphores to monitor operations among users of a multi-user database. + +Global and local semaphores are identical in their logic. The difference resides in their scope. + +In client/server, global semaphores are shared among all the processes running on all clients and servers. A local semaphore is only shared among the processes running on the machine where it has been created. + +In single-user 4D applications, global or local semaphores have the same scope because you are the only user. However, if your database is being used in both setups, make sure to use global or local semaphores depending on what you want to do. + +**Note:** We recommend using local semaphores when you need a semaphore to manage a local aspect for a client of the application, such as the interface or an array of interprocess variables. If you use a global semaphores in this case, it would not only cause unnecessary network exchanges but could also affect other client machines unnecessarily. Using a local semaphore would avoid these undesirable side effects. + + + \ No newline at end of file diff --git a/docs/Develop-legacy/sets.md b/docs/Develop-legacy/sets.md index bfcb69b41f8f6f..f1e42b3cc1c863 100644 --- a/docs/Develop-legacy/sets.md +++ b/docs/Develop-legacy/sets.md @@ -137,7 +137,7 @@ As an alternative to immediately deleting records at the end of the method, you ::info 4D Server -Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection.md), [`UNION`](../commands/union.md) and [`DIFFERENCE`](../commands/difference.md), make sure you compare `UserSet` only to client sets. +Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection), [`UNION`](../commands/union) and [`DIFFERENCE`](../commands/difference), make sure you compare `UserSet` only to client sets. ::: @@ -161,7 +161,7 @@ The following method illustrates how you can display records, allow the user to ## The LockedSet System Set -The [`APPLY TO SELECTION`], [`DELETE SELECTION`], [`ARRAY TO SELECTION`] and [`JSON TO SELECTION`] commands create a set named `LockedSet` when used in a multi-processing environment. +The [`APPLY TO SELECTION`](../commands/apply-to-selection), [`DELETE SELECTION`](../commands/delete-selection), [`ARRAY TO SELECTION`](../commands/array-to-selection) and [`JSON TO SELECTION`](../commands/json-to-selection) commands create a set named `LockedSet` when used in a multi-processing environment. Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the [`SET QUERY AND LOCK`](../commands/set-query-and-lock) command). diff --git a/docs/Develop-legacy/xml.md b/docs/Develop-legacy/xml.md new file mode 100644 index 00000000000000..6691cfcb0e545c --- /dev/null +++ b/docs/Develop-legacy/xml.md @@ -0,0 +1,157 @@ +--- +id: xml +title: XML Processing +slug: /Develop/XML +displayed_sidebar: docs +--- + + +## Overview of XML Commands + +### XML, DOM, and SAX + +The [**XML** theme](../commands/theme/XML.md) groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. + +4D also offers two separate sets of XML commands: [**DOM**](../commands/theme/XML_DOM.md) (Document Object Model) and [**SAX**](../commands/theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. + +- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. +- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. + +### References + +http://www.saxproject.org/?selected=event
+http://www.w3schools.com/xml/ + +:::note + +For XML support, 4D uses the [Xerces.dll library](../Notes/updates.md#library-table) developed by the Apache Foundation company. + +::: + + +### Preemptive mode + +XML references created by a [preemptive process](../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. + + +### Character Sets + +The following character sets are supported by the XML DOM and XML SAX commands of 4D: + +- ASCII +- UTF-8 +- UTF-16 (Big/Small Endian) +- UCS4 (Big/Small Endian) +- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, +- ISO-8859-1 (or Latin1) +- Windows-1252. + + +### Glossary + +This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. + +- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. +- **Child**: In an XML structure, an element in a level directly below another. +- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. +- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. +- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. +- **Parent**: In an XML structure, an element in a level directly above another. +- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. +- **Root**: An element located at the first level of an XML structure. +- **Sibling**: An element at the same level as another. +- **Structure**: structured XML object. This object can be a document, a variable, or an element. +- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. +- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. +- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. +- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. + + +## XML DOM Commands + +### Creating, opening and closing XML documents via DOM + +Objects created, modified or parsed by the [4D XML DOM commands](../commands/theme/XML_DOM.md) can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../commands/dom-parse-xml-variable). + +Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../commands/dom-close-xml) command to close the source in the end. + +Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. + + +### Support of XPath notation + +Several XML DOM commands ([`DOM Create XML element`](../commands/dom-create-xml-element), [`DOM Find XML element`](../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. + +XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. + +For example, given the following structure: + +```xml + + + + + + + +``` + +XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. + +4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: + +```xml + + + aaa + bbb + ccc + + +``` + +XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. + +For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../commands/dom-find-xml-element) command description. + +:::note Compatibility + +Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../settings/compatibility.md). + +::: + +### Error Handling + +Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. + +In addition, the reference returned in this case is a sequence of 32 zero "0" characters. + + +## XML SAX Commands + +### Creating, opening and closing XML documents via SAX + +The [XML SAX commands](../commands/theme/XML_SAX.md) work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../commands/send-packet) or [`Append document`](../commands/append-document). + +The creation and opening of XML documents by programming is carried out using the [`Create document`](../commands/create-document) and [`Open document`](../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. + +:::note + +Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. + +::: + +Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../commands/close-document) command. If any XML elements were open, they will be closed automatically. + +### About end-of-line characters and BOM management + +When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: + +- CRLF characters on Windows and LF on macOS for end-of-line characters +- files are written without BOM. + +:::note Compatibility + +In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../commands/xml-set-options) command and a [Compatibility setting](../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../commands/xml-set-options) command before the first SAX writing command. + +::: diff --git a/docs/Develop/processes.md b/docs/Develop/processes.md index a4ed67f95058b1..6ae3a245c496ee 100644 --- a/docs/Develop/processes.md +++ b/docs/Develop/processes.md @@ -145,3 +145,5 @@ All worker processes, except the main process, have the process type `Worker pro For more information, please see [this blog post](https://blog.4d.com/4d-summit-2016-laurent-esnault-presents-workers-and-ui-in-preemptive-mode/) about how to use workers. + + diff --git a/docs/FormObjects/properties_Text.md b/docs/FormObjects/properties_Text.md index 4d0d7726e11f01..fddb8e84f72dee 100644 --- a/docs/FormObjects/properties_Text.md +++ b/docs/FormObjects/properties_Text.md @@ -440,7 +440,7 @@ By default, this option is not enabled. #### Commands -[LISTBOX Get property](../commands/listbox-get-property) - [LISTBOX SET PROPERTY](../commands/listbox-set-property) - [OBJECT Is styled text](../commands/object-is-styled-text) +[LISTBOX Get property](../commands/listbox-get-property) - [LISTBOX SET PROPERTY](../commands/listbox-set-property) - [OBJECT Is styled text](../commands/object-is-styled-text) - ["Styled Text" theme](../ommands/theme/Styled_Text.md) ### Supported tags @@ -520,6 +520,91 @@ For font color and background color attributes, the color value can be either th ![](../assets/en/FormObjects/colors2.png) +### Working with text handling commands + +#### User interface + +The commands that can be used to manipulate text objects by programming do not take any style tags integrated into the text into account. They act upon displayed text only. This concerns the following commands: + +- [User Interface](../commands/theme/User_Interface.md) theme commands +- [`HIGHLIGHT TEXT`](../commands/highlight-text) +- [`GET HIGHLIGHT`](../commands/get-highlight) + +When you use these commands with commands that manipulate character strings, it is necessary to filter the formatting characters using the [`ST Get plain text`](../commands/st-get-plain-text) command: + +```4d + HIGHLIGHT TEXT([Products]Notes;1;Length(ST Get plain text([Products]Notes))+1) +``` + +#### Objects (Forms) + +The commands that can be used to modify the style of objects (for example, [`OBJECT SET FONT`](../commands/object-set-font)) apply to the whole object and not to the selection. + +If the object does not have the focus when the command is executed, the modification is applied simultaneously to the object (the text area) and to its associated variable. If the object does have the focus, the modification is carried out on the object but not on the associated variable. The modification is only applied to the variable when the object loses the focus. Keep this principle in mind when programming text areas. + +:::note + +If the [**Store with default style tags**](#store-with-default-style-tags) option is checked for the object, the use of these commands will cause a modification of the tags saved with each object. + +::: + + +Note also that only default properties are affected by these commands (as well as any properties saved by means of default tags). Custom style tags remain as they are. For example, given a multi-style area where default tags were saved: + +![](../assets/en/FormObjects/multistyle-ex1.png) + +The plain text of the area is as follows: + +```html +This is the word red +``` + +If you execute the following code: + +```4d +OBJECT SET COLOR(*;"myArea";-(Blue+(256*Yellow))) +``` + +The red color remains: + +![](../assets/en/FormObjects/multistyle-ex2.png) + +and code is: + +```html +This is the word red +``` + +The following commands are concerned: + +- [`OBJECT SET RGB COLORS`](../commands/object-set-rgb-colors) +- [`OBJECT SET FONT`](../commands/object-set-font) +- [`OBJECT SET FONT STYLE`](../commands/object-set-font-style) +- [`OBJECT SET FONT SIZE`](../commands/object-set-font-size) + +In the context of multi-style areas, such commands should be used to set default styles only. To manage styles during database execution, we recommend using the [commands of the "Styled Text" theme](../commands/theme/Styled_Text.md). + +#### Get edited text + +When it is used with a rich text area, the [`Get edited text`](../commands/get-edited-text) command returns the text of the current area including any style tags. + +To retrieve the "plain" text (text without tags) being edited, you must use the [`ST Get plain text`](../commands/st-get-plain-text) command: + +```4d +ST Get plain text(Get edited text) +``` + +#### Query and order by commands + +Queries and sorts carried out among multi-style objects take into account any style tags saved in the object. If a style modification has been made within a word, searching for the word will not be successful. + +To be able to carry out valid searches and sorts, you must use the [`ST Get plain text`](../commands/st-get-plain-text) command. For example: + +```4d +QUERY BY FORMULA([MyTable];ST Get plain text([MyTable]MyFieldStyle)="very well") +``` + + --- diff --git a/docs/assets/en/API/signal.png b/docs/assets/en/API/signal.png index 60e7ac67d13398e544812545ca3b944a7cb51320..2f84ccaadd6c544e69e021dd9c952c9835b8c7ac 100644 GIT binary patch literal 32677 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 K`}5zdg8vV}!?Az> diff --git a/docs/assets/en/Desktop/dragdrop1.png b/docs/assets/en/Desktop/dragdrop1.png new file mode 100644 index 0000000000000000000000000000000000000000..69d86f478af2c8d6a112691b950d1e5f1f09429b GIT binary patch literal 8516 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 literal 0 HcmV?d00001 diff --git a/docs/assets/en/Desktop/dragdrop2.png b/docs/assets/en/Desktop/dragdrop2.png new file mode 100644 index 0000000000000000000000000000000000000000..669e20441b7e5faf21c9dcf2cc9bac0c7283c5da GIT binary patch literal 38143 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 literal 0 HcmV?d00001 diff --git a/docs/assets/en/Desktop/dragdrop4.png b/docs/assets/en/Desktop/dragdrop4.png new file mode 100644 index 0000000000000000000000000000000000000000..b398386d8f07bc50b7d09b58b506c97d4955a04f GIT binary patch literal 7102 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Μ9vd?zU`-#zf+;DMBx4r!FEPrQD3=(zz2GAmq6+j-XT4Ywy9K-HoL zHYorSY~3m0SYSYVvy_ha?%I#fj$mN(A^&>@O}M@u%Z_40WwZbU`>l&MAiS4Q0{SChf{FLX<{8Yf< zZsB%1!OukGxnku&9V@L#EndZ4$FP?i9+$x8V*wtd<`KjH4RH}ysK62*5qjDo+(KGN z3Csow?rUcC$Ay#ur(m6Ku72BatkItMj@tyVE%N0$jfS^6-!Eb1)#>;h0;mLU0ox|r z@aeS)Xs_bc1$2j7LC*nH4$%a#%Y%R(TlQfUiQ5_2V_`XaVhM9Vz-vG2otf;Z5zxuF)DKE%n(E zlj_tk!Ct*&m6c(qHE6t_xYi_{?6@~D#F0DpxNUH6aAz|Ha}{}<*6h)PqH*}XP55II z@q9cZLKY{#VfgOG`PC3^OVO2z`*|g$i|nxwE7YDq+(HA>P_`q{J+;1PxkB4oA0u78IWLB;&Ty=G(`m_URHm>r!VkFGI_nI0=V8R5(5a4Jl@S%Q&5_Zz3JWo&2 z{Zg3^ehyAmzMWxNa^9v>I6!-(4#{ zgHes#X$RP}hC+gOFPM)0lIa)D4Je;7;?1Ux+1q6CB8u0-sRqNp0gE zz#Q}DPD4TxWRFx}t=5DrD~>e`dGPTbJK;@Dx(*|wRw2n|V>n=vn_#&*T22rzSC@B| zyO$j@q>;?s@f+E<9=qx5YVzkhmGwEWUZ-NDt1QSW zZQpL=h_+4lnspuGPG)!Vpml8y*a;j951rwDEtF(@oYMA6?=m@i zy3t;Pl7}Q&2IXyZ)49;!l@S2!uzIF8WoG2%8Vxs_zd&-L=M{|fGZ?c720nNqi7{!O zzvd&>y!1E`<^ki<;%#|tw!F#IUnzu~PoF0*STxE?e`d}iX!yhS+(Nu5+8$WBp0iP| ze9Z&9A4=OuP6nA%dh_Vqb+jP%#v*%57aLUwx8WmRMY+x4xQ!ep>Uhw)0F9g~(?|_-U!9jfm!C z3=Z86w2hUfm>U%!TU$nN=OBXn9U#4dK)0xkZcn=Je7}|AgiuinKcpov9!-|CW2Re( zb?1H*?w-VCU3pp3Nf^>$mhc5N8@$o z`{(C+nW=MP5^`(rdiC1FRO3TKu6$njz2KQ^uptv*$ZQsD_H&uJ-vzo$U{;2SR(^xk z6R#*HLd_W9{rVJy>(WA*lfzaEBr5fzM7zT&Z7&zj>x&Xx?f#%tdzd7!hj$%wl zMNFO5nV-;s&5Xwr=W0E!_unY$0zy)g6OktG%>xl$ZtxIpGD~UdRLy$qg|&L#d8tAe z1=mI6<(ybXrz*&m*r{X8m>2CRY@g2sAcp!(xC1sF0rQ{fnkx63p)+`NlHl%Oyzv@- zyL8aN|9H)ReiMj!zHDw5H9y-MA2Jv(r!%3b<2}8 z731-|2H(W~pB(RWMBb8J5ZLQzV(+kB%%fy{Z2*))BES6dq%VYG$_yYwPO%^pY19Bf z|1H>DkF?I*ZjMFycq|FUqoR7v#}52x(96Q>`gH?wCW$!nEu~*PV3U}Mil7eJX} zu5`aoBnMRg(DtvcEpk_ zd)5K|Dqd^YhZoc^ZBY$5>i}Y%_*}L&f^wZH;{-3Ax+&Z9#2mDbyN>Fe!EJG=EvbRz z%%tw1Fe>@86k@{x?Ec$71IIAc&`?nnkxL)7ne;=kO(K{cw#+iq1ry0lhPJ*2nfF** zsJ19L&Hqzx#ocEYDJ1?KT`TH^d|u$a>xb|!F*TYM^AyLDWOZqF=tjrEIy zN}mtfUV~|1yP#FrG1{{OEyM`k5&rws;<*gsq(G;*Xq_ZLb;NgcSOeewhlTjvV*Kv$ z(Rm(`IJfYxJaIabI6e3ovS`GpR;V?cX4+LSm#fyGrjZD8^TtB^9aX$JY8AVGS%V8< zNxw{YLzJBtP*F>u2hy1iWzouv2pTc6VmS&(m&4N(_nFp00>6aQ7m{CT&XcF7lAXPII>j-~|G)ra*0P|8+f?xe5k`x!)A#Y^S zw$G_STe$ttw`4cLI-57)<1Egn4@7{zkr0FJ`bDBPnziLyH1>F&=4bfroj}fOVqQfQw|9p z-_nST3RbMcC&a07v57b4-_Cr6yDB%Ri{=|`6#0&wo;$4C)2UA)he)gz?G`1pWark(aT0s4mL{f>`>sg>Jq9eJDo&I0LNjbQlsBg&v zXCdJiWuXYwhX{)#E#>%vxkq#hNDVfZ|@{3;l>_IDs zS6#VkSoU1RJCkyS27Vnu72Ky*p|bt>8pARY8u4mUO)BsXO%|&fWL66p3g#;FCOZRp zJzm+e=Acm^0__M?9KWpQa&dl`_6k= z*vpDNE<=i?m|cUSu7DdZ63J>^IUlV?>#0cA>{Ya2c}KL9uj+zx@>(OV&P#Svp6=$V zB$kxG(OX(LU2Cy|`wLZ-b)kkYcpIY&ZG>ye-)LaX8X`z3PskAD6=+|JpOGtWx(fhA zS6dxa=3*0YDrle_W@z+1FskTNuU5>sBJY3H#X0S-7h*s$lfD?Uq^bn82b|Z=C;%F{ zj`PNbA5C1Q&LVvKPg9umd#tq~GcWO$o4oLrStAKW|MGn3Qd z*C1TeJdxjC&a@zVJ3=*-;gBMa#vDv}R_irGTjgjlLT$t?%RyQI67PQiiLj0XcA}|m z^|w)6fw%b7mFgA+jX_=!&_A5BT1^Bg2ZD|rbw!UpVjwWDORCL5+;Q!fhFTcvHD)2X z1b}&|IPPuxdauua*i}W+nf+orV}?tZ8m}Ep`T^)RDHe%}8#x6gci`&F6Z$$WH8ir3 ziZQL^E;H-VsSCqa07Ne-1cPMdDT(Hv3tPi1yB#+Wg#FQYOLyN;Rz3HIwU_oES)(t> zwSkS<0izc&9AHub)RI!$7&EI7H+oDgk$|W6w?j3wav{mQVd)tgxK*RoAQEj>1_gkk zH3-emDQ)$5N1Fyq!=$ntnr$zT(g6r01UUa!?21BjDPKl}`1Asov-LPpB`S1YLmkQMfM`HA{I|=TvI2S-lrIL*P+9 z-dMv?-2Yrwn-ORzE2%!h-X$6%K7+08n9^3nW~u`pGHdX8Vv%L{K^cH&sTky7-q2N@ z<|L>_2oPSK_{3^9K~UC(TgS&|l0d-M%qe7F3bL!@H75lfjWp8wjuXqyr$T6Mq;gEw zR|QUDIU@_${CyVi;5NsC+X<+Ucmtm;}Rx3o=Ni;u3^Awj)f35WaXVw)$PyLdJjw6FiW$gumABu)f zv;5nhMRcSjCvp*g8|zR8T@^=Xkj&c{$KL@aN#&FaM&+o30aK<)imq}!bo}t!|N41N ziwz+gl zmqk3<9HcNZm(cezPY&^^qxGwIsO;9Y5t-`FcC89p4%2l663P;GV0@Dy+qgz4k6!bA zQP3%ZfnU7knJ$zJqd1TDF0-04d)?X+F0_wEF%U4TRT{LiU;EK&RwZz zE7A~Z@FT+CJ<&2J^=}XwB0Q#-`9htFs6EA2EYKS>;Fy7T6r$g0SkL8u(e>>CN#E=L zUG_blYwq5$rS6=z+E(e=2u%^)Sv%QIsi&C|DAKZIf|n@)34(QYwzlPEt(o(J?99r^ zwInb>z@05E5m+i97*LszAW$kGAozRJ)@7^TfBloZKcDye{XDPd^}Jrs2k$-G*5rvM zq(Kg1^4Z!^YEH`ipaunx1)u7|8ElY3on>**m1NV^(#Ex`*n#?OZ$x2Gl195quevyxNK{5 zZgw`NoSuC7=tXBIG?FX}9B6P^4uUs!WjZ6XWD+JXkgP5e&xH7c$I7gn(LI!o9+_dS z&^yf)eDcu6`WX&me>X~An`T)v<-oCX3LF=kxnAp-h)palge1&1u)$*C_)>S!w8JyK zv3#ag|Hs+g>3*mx&z*LTh(ssOvU-1f7VuuL?RoH`jeE)9wQoIpgEdu{ zHQUT1Uj6&73?g#GH*6cAX`yCWNk?Krm!K_qnnzUCT1XVtcC#>>kjDk{gG{4>xZrfA z)RW}IZEL35R%_K`R8^871^!6%S^CuNz~|H-zf#&NU?@=CwRrzF%yM2348KdxgYsK^ zO?*G)cCnJAUHo$*7uM3^gV1$r(;KzvEiyvH|1qn|50^as>($@Avzg^!9}XZL-{tHb zPWYD7DZ^F8RBkUuCt4lj6j>n2jv7zW`6JoLe1Y9HLkxnjhdUFD8rPi4pwd9v6Ml+bTpIOMWEa?0vh>mAcKh)?chG<*|2gXR*x$2D)evTN~7u{q2}; zqpPVK#ecmk&7$^jTCq`g(Bt~G%{Tzc|L>Qe{O3T!p9LApAwD1HBUXO~X{@vs1Mq51 zJjsPNz2Fl>$7~y~E3BEjGR?wP{Xi};%n9Q#o)UH&O%-*e3p|@>Nxyg&`m^BThUA!;TlJ zYNwmpT2Iqmuew!g;V_~kd{>(s6`k4gWA*Q|lnU>cD632R|6TUZpO#HJ&zS-tE)Sd4 z;$yeYxYy>Ve9i08J?EN!2WrCjhu?5k;YH5!*7zV#<%_HKDJqWYR;4W5{yx*J@|~{X zil@n>Q>SC)$GB>aR<|QwcWLq3hY_(Z`C@4DF%(vx`XGBUe3|c7JCjDTS=tMbIx`e} zk=wA?{${!NY>6=kiuyicP^3~Mm2FT0G>R5Y<(_a`|2x0l-Kp<(*jfeLqssho-+5s? z0aCqLV1sIR;zbP0)ge;PC<{}--yqFL^G0x(RZNGy@G;;zKjBCfqGEp>8q-l(XcJQsav^U-YtFREC=d~*L<`?sHACDzyAu=* zPyVWCSl-JJ^R}%R3kw7$9o^>8+)~U7DHQ-=D^Xj|LCw7d))GdeaGjm)uRAb8mJ_*H zvq-y#sTaUuN5|XsogI8yVX+*gL-NB>L^YnTSw+zvOvH8%__u|7CipTXT(zlPp{TJk*mN=@|SgqQWIm5@WVYTfywS%_- ztL|<>%Y9h8;t<;qTkTq2Z05v#4LPZGdK|;EGkJ}E9zV2D;+i8D)@WUGqrZsB*iW1749lgTK|5~kLW;t4rQDm7TYOEe3y)6 zzR0jts!lhg2ENrD9Ztk*Cwxvjj!>$!CapE&FX)JX0tB@>e{DLV7RF^)z8|`*d#zd& zAGrM}z9@TosXR`vpJjkTiGjY0>$5IYQ9DwivA7E+J;QQkLbkMKt)}! zHv-?)8FL2>3zw>M(p5!|0=v333zPfWWh`bQ5FVDH0)`K1NUrW;C)KPS9`qha<y!P2DFDfsuimib4ks87gR(xGs9P%kyolZiWKc zM4cWllnbL;pi|U*+{~ldx)t8n;y&QihGWmT?PJIInKQ!EW*m`S5)TU8K z%sJ#w#ZGu%@>?dwkvxz!Xo9Aj57D=+$ z$e1L}q!k|6l=2ANyVmo}pQSNV9x014Dai{5q=*f2OO(3UGVG-cFMwNR6{JD~&K})& zB5S3rM1$vuN2kZNiQ4)xj?rx%TV8DZI)95VA#K0=dcxU%eEi@clHo@*?_GO8jh$k} zt{7`S>S*Hi_?~nIkpz>r66xv$%rizS3jo~i9V=uC&zpAO7^%%8QyY|(xqR!P{n?E@ zbBrC18h$i7(Z%YWZ=1{$W=$9xq*jgwb@S1iy>=NL^TuGz6>^~xC(grRgS^aUcT<$+ zKs~hc`WYyka{7(1`gD_)gS(6dGW6654u@=W}p81 zo^0l<1axStd7pg}qlKA&SojwM1lX3J9-&K3)KETl*Q7Pi`7g`n(7K{FS2GT;-l)p6 z=Cb3xU$^p_KxX6bQ)i>4g^4=n=mpXNS0Y~ceC31svg2hY)pO`M+$&{k;DA z%ER0hIPQrEE%^G-i>?jCBA#oZ*?!~r8Dg?PU`lH|p>;DgSFyR)Tz%w=n}_yg=uVPB)`gf_vB=I`(yUnU;ZLx;h7u$@&^r!Bf7L})7MQbwa>W(wwQL< znRlnj+?T`DUaka-N4hq+M_KY0BpD*Vwpi#HB%9)?+fdxdi=AW{G?$A_1*ztp5{oWx zRsH5EafOooMkwW7Sle5_c{B`OgOWfNbmI|&Wr9xxBXxqbp7qu|UtU(l%LcBuj}+(zG=J=t2^3_0F?Zx#Tg ztYn~28U7LedS`9;yRhB(k$CC@aKy-oU(rG}Az_*u?ZfJN7iX z?yN@3VUFz}m12}iRMn#=p0NIdo5AfS1&gn6y^kdP;KFf<@j?jQF?HkkI@*`d6j(<{ z6wMnMa^7TXiG>?=4k@uqoI5c7FRos9e-x3raC-zZb$dr-E>RDVYnCZSU6IF~1(OEN zJ{39EykJSt{O_S+@AlhI%q@@rc1&D!fFAseQ{u`u(F2a7)$8(BXnZf0EViu}Yo2mT zs9B}EPta!YoXTvw?Og$e>jlFpqQ-Ni{VYJucuMfJj@%QP1~|Iaz{A*|wa=h*xBSMU zrbc;I7F9f-PY~-LQ?pW^x(#c{wK|5TaG>~0yde>xjCjqn9q}{9+*$P1B0ax1HJg9V zPQn&0Ug8V#61tFP%_&kpS&aqX5RE&U5}Kb-0RP7a*O%m`=0B*mZ=Zic6|Hr6rV`H5 z4hOZlWx@!rc!IIK7+#D=>#J^y3M+VoA=ij3gMRoZS8y$78GTiSeT~~S)T}w! z12B98_(MJ3q1pu$UyRBv@LmvExH|D_3D3?K3bqiYta)~kpcOxS#$_74X-7?N>62C5 zc;Ug_ytZu_Ho{5@l)?d!I>$*t>13sFX!}{qmJ(%Uz9|zogP*Q+mZ#f5Ihu`jXAv^u z-E(+ezW`-rDI*7`ScX?rhNJzrxQXgpw!*tGh{zba{%Glz!hd3}bicJ(L+oK4NS+ba z$6`zN3o@bY;%56kwXGtt+s})cB9)kQg4`*O@C;4w>~b2w|7`1QO{vUQp5thVoajIoRCJQ! zcXACIP0AjgLEO>ox-qJnx7}&5tIvZVP%P1_9%h|?Mi@-uGCHD*z!Vr_bw#N4Zh3{28HON&tF65tq-U@pIZz?}S^nJ6I8&b;8}93u{jgLNKfS69!j{(ugRW|3^;>y; z4_YC8&pdNs;5$?C#}Q}El~zXhGDJ9xA5w8|T@#Nwu(IzblN>ujL)uX9s(`*Moi-CS zex_7O6d~7Q8VM3OkLfPt&2se?!|*}Cm^bd=`mr~7X(;lfOuVoiHlEOYbmgPOD&vWT zjGMQjNdd8#74@k=E8{x9qYI&k*+`c^&4zPi^s?^2J9*k9ET}|E0d)gDV>AiHf_`bl zxAPBD^ph7F`rs>X7ebtX8(XnI*C<%1Ir05=^=hA~+vdpa&T-eEH>5KS1x9#et|D@+ zS*T|Up{`cPYi7+mBMs8X4j14i!43c+|M*87snNBWiw3Em?jb_8#dxV(b>^fDdurX{`>h1ADMQgVCm@}w$L;3t@bUV4 zj()=&tv%nAqF^NTY2TDrHR)p;o2#mmN6HPzSo_=yV=(~DP6oYZd00KP`-NYE*&hjd zuCDmwm1oVs2&otcz2@Pvz19!sZhdE75{9)?bliRX z3A$HbSnU_45CBVsg9~gw#VqlmQ}1{i0_Sra8R-uFr!jb^$}oCQxN=XC(PypiYa*|K zeMz$LaAMGQD7WOuW;M3_)7jEvS>tXjagaOHBS+;K0ocn)Au_Nd1UrF?ru{~%e0;-lTMC(kJ0qE7g;Z>KlHzNu_0;T4tauOF=|{QA*b zZrZ)fDEZ=wbb6Eo-N3a#L}hkqVl-0oYQkU#JyWhiUF=b#V1uVi&7zholbp-8L0Jts zh(b)H!TYrPDBn#qCNok;a7=vK$>qgQSs$D`{?WrsV=0mrKQV3&dBSX((f_Au=U-5$ z4!m3|C0{h`uyrQtkm}Esy;T^Gq?h1C6mw@83jcAJp;YzlfVf0;HiwI6nJx|=B*Gz5 z%d_^uM8u>YK8%Iyg!C~GS6%z2?3qMKx4vcX*o;MB`Z8P_iL1 ze>l%Z3<0X8XYHsysYnWRkMR(Zf4=J9;{ zn%Nh|{@VW_S?5PAg`Y4|l!Zfpn_05aUhnCeki>eOmFQS|62|*=I2ttxERmn3HM=>T zbcSFA!n(pK4Q(d`>m0au*`cOAaB)?&?v}=tO~>}LvvxgNurXtn`Bok{sAD(plG)O3 zaD-)Snjy77(greFQ>voUEL=CivwUmuN3}pDbgq3LsM0=qP~g0IE%pi0$|taYQ2Ohm z_wu7n3>}@cATD#iFV_^JEq3Xv&Y88!pi?o1PwLn*i=8XorcwQ%KOysONY`!T_3%RP zZHEl_IqUH(GZ&42Of!U;9bTX}8VhgF>*zQs^Su69ma7VnE!IJXqqnM?rdrZ)Q)JK+ zk+dk1eBxfZTe4^Muif`C3BiF+xDE#o7JI`=Ii?c^GwdY3( z9|v=bbzv~t6B}JLO!S#}R}^N!RYk+Zt!PO9$mL&0hb2$6oqRKTOB=c}e&T(eR()fL z2slXRCk`CI&>NrY$eG}D5>B_(d89DgGj8r@~cXp?}NKklYLt|q>?&Newl&=js z*x}SmP+W3vfuwn~kgg=&+1@fWI5iW*v`bwOIQ2y5gTQ%@_)D%{MmbtBhjQ1E-7L*2yjY{p7% z2>`teSCw@pBJ^GAp&xw@{n#Pt6LTBMb2duoa;k5AV_DV23#%4?BZ|2M?yDqI8^cYQ zB`mTCG$9h<`U^h0;}AmOSA{$CXQF&Cx3FIT;&a-04mXr>RkMAhfhv2APj`*>8r)qK z^^tLzFFo{AKOd^zlx38~a=Q>xuzO?*=v3PCY@QOL+>@q-w)f5j=vD^I9Pz&<1!@Y#SCHqrWQyEb_yrSwPdC>M2;deO>y^M72{>;wRzS(goBB^NZ?md^yL8n)~rCko!R&xB_uCjhF!Tt5*@Wy9&k$dfZL#4aHn;T zN9_$Py&%XQ`6J#Vj4ATpH04=)x&AIyxrbb-yKJjS$FfQ1Wu6Vr^QEO78WZOoGZ6sZ zhMv12fvpmR`FNf|KqIbv{ZR@p{jb-&FQ$R{Xf0t1ukHt)P$NAk6M}mVdQ#P+5cX6B zBM0jm9c`-_@p69Zv@{6B7jSC8d$o)xzIH+sJ*MjAEz66q+<0)L)gJ=-NM`6J9OfQ< zuX?o19C5ksAM1oQuvBa%#)**5&d?4p7C7Y`l=AWzu}cijv$56SO0n0eQR*qsZ~;`b z7}V~T=+AZpcaC3<>MVC`5}C}K1h*cQR<^$UxofjZH8wSl#O91lg8KL!43$*eg7T}z zRp9+2t;qxBSXfDi8Y*fN0RAVZF;D^^D4wwoohUeF{sh3yyf|u342aF2J+vQj%etct zJ&U)Nie9~SWGtqL{$?~%_X=N##-g=i{3+i*l|$_G*64V{B{^Lz`Nq3&p1=`Tp+9F(a+#(|@ zk))yucOc`!Fx8OinR@10?EYv2Z;DsPRMQn|($&0c<(WWbtXL(VznB@(8vJ|%;9nAmMZykkQMzu_-%M}~`J=ne;OgM11#a#>wbRBD zLHM36P6`5LnY7z1Xh@v34##U$Lf_?wz!Tmz1{~23{v(K^de*M1v|f@WX%lw8NyaI>z#9>q z@jFjw4%nN*rB*E-D{6tT)oz?|qt(E92ee_p*E`2Q4J&(W95yA`Hrb^LU7>g%Ls~p} zE8-Pw-dsw-!P*Lt>(`cR4c!`3k{KmLVhH>VCViIns!d0~D6U$(%c2eTf?{hEXVq3; zC#qJUjcZ_8%zgC5px5`O;-xnqicg2bHJJXh!dpuMpa3hWUY;8vVIAkjaP3Fmv-YkU z5Vakz^y>0Du(dQjMS0#}H8i+a!-(wWX5DlX=_QP}=Y@J(j=$7I)c9rWj6XiYQXK9( zMvhHG&ZCvzmVIf~;Efwqt+ZSRKb$Alwm{OL-eD}B*aHFul2IY6%B(v8OZT6M+KYc( zx^U+YF9tvYx_Uyuxmo~fAh$y=Qlp{ zBkYS@9wUTIZv<-Lbu{A+z**McG#0c-wRHvvq!2FY;Q(D3EpwQtng7J|w`(W(SkNO- zPF?(0u;!rdmo+0;?*-ivvkesN14WbAjc;i83%hqsqjWE2t9L48)+CX;wJr@OR3+vr zPhckUbUnx2HGuKjuxVDqKj&SCM%40g{FqL6tE$d&P`JU-2IPH@LAS~ANA!~Vc6%OzpLzV%$z#O1fXO=uTJ4=?S|I^1kO7_1nW}fd)__%ucc*IOs z=$4kvY_2dM5EDsA3`?;gaGIK9-9ZSxQnn5FGrGiiji5^c?d)I@PT9Lo(mM{&E&K{7 ze+F3wkCtX8a_~V2au%+_c z#Q(k5f!!@&>%^dSwKl{ODRS943oOh0`?2;Bm*s#AXbVHlSsb=DPXjl)0#~yfouFdf zx-gs;PqV(umQm|$Yxe45VjkeKL-Z#WYRCt%Mo@46CwQe-AoJ{|vMoVYM&qouq`?cX zTZnZvwG{xl9!IdQC1As;-q#b@n1E#dlXzA`ejI`2nrQdQv|r7X(cSSqjILWqz^ z+r=5?E4cK2uSZe|aTI4P81Votv3qgES{sgcEX}~9H-b27Sp|c%^fdAFl({WaYxdgL zKV&y)OIVt!jxtV$uePQOCex}>1ERqqej@uA+7+mvX$|CB3P<0lIUv<0dH*$cLOj}Q z9vx0iileIMg;)S;PE8F4F%7HCf>t&Omj@Ggn<2R$KDcT3k5Lb}3iY|(ZU{C9GDxI^ zi&rY>_Fx*%Ff~p?sE6c6^HkBAHJa{~XQ88UxZ-zSvxFE;r2l-ZG3cCy-?Q%1?5o99ADo!3*o9NxFreWJ-D#I9l5ZFfW?3D;UhIs z^7BjO5k208wFImX)DHaf&FU?*a~~ArQ|d|t@xj>YW1?n;FBkaRK#Y=yV^oqIt;WN^ z<(~UufLSvF+Wsuiio5wR@3HP{>;*{U&m6q`2se`QW;E@5hO%eCjx{yozf|C#r7}3~ z8og8;ho8o83N#-ui$?0^4hB0Jcd&5Ka6_2XpoO@LOC`n7^KILF;2eP@aqjXwM{a|iz_@RkfT0W2PvHtN9bx=FTT0hmy}rD- z_Rg_Y;~9k562J4E^iW1J3s~#Ix4CTZAO7|b!~5|Q3%%rn_@q8MkmJRITTnRl_ip<6 z930Z>W{_j4EbYa%iB=AFj2!ENkxEtA-c&@Edp`;q;N)R5a@xbUVST%JKu2kMcgJF}3Q~+EturAXFv&)MEFnMQ zSdoXU-aI1XYJsCC$@ShTNk*mmavLkrD$`2~%e2aaYBH#M5VM~F^ARMK)k&$vLU7!D zXd(6#{Mp5uY1SvKlsAfn!WP* zrQoYaKfk0S)_?Y?%O!!?r6fRU6yAETJMcb_$iKcPezxsIGnJ#KnA@&sCX**2ykK1# zQF{PzjM+W(4%vhbiKW}tm66Z8)y|M1 zm9OZgvL!F8Ovm}K=*j3@CKpZkj5yf_8b8W|lLs|=gxfEr9p=tdox7`1(hlAAK7}vB zLo%U5kl)VhONHZ3AmSGL&f3RvAS3+pMqq&ObR-Q#s4`_7Y^|N-+TrGDk^`LzKv}RW zf*HYYG1fXi-k8ywJED0lBxuz4n>PiyWA zjaLWC*fqaM5Wp#tys&EV2Bvo=;jH_teTC_~mVHLp`pik&3)!BY0k^1AqSgjw-LWJU zJdv+Bz^GCViRT*Bhi)>tY#O@i?H4rv)HMX;KU06i?9!bF{dDMV5;4>Nr^Fb%i`zafR5xnaBVVOPva@&dBn`!DOE`kp#`2_uV3n=CwM zrEC)dXAt^(DRMn<4X3i%VG1d-2tsSfG9gSYLNs-U%ei{={^`6QGE&N(m@!_wLNz-W z8c?Un+BMC{-j;FhGjdLp59kr~h%ld~x@EhP4bCDaB(pCSZ3|3hVqr>n(~0VJp1YJ- zS&%Dt&oG{T=B7o=!_oR!_+z89BD|J*?u72tfu)1W~U$2p0#uiP_ z@o{&v8cuoqP)=a9=ZYFDs$WRdCRw+ItG$khv(UacN-<2?a~EO&Y1Pz{zzPt8CcEkO z?%3+tvXHW6@z{IYAJ*6oti6Vn=zq`hAr@^IG~JD;cF%am%TgC0Z&6-U)dQE5D6Zw4 zC9zRVvw{wJ%J3=O4t%E$QF~gaM>6SLM@9aCunv4eRUp2L^PFs_j$&Xmb21lCnp!`M zxW5zkL0{ijhs}zb4gF0F6Sx)TDVTwE#)7@Gas6venTy+bTGAb^;aiNDFRr$0Sf$y4 zkHRMGi!GwebvJhak1?t*^i+#bllruMN#JPe!u3gsIq00!(H*+z{8DYpx{n{=nnU>@ zXD5s|gfc%1yY4G}z*kQ9*${I7)KU>;;a?lr$VgpPKN1h;R-x&8MN*JOn@)NslkiYg z)0D)7s^u!QdHqv-9C-$<{3$#dUD-4rwZk%5x9Z9!kP5FobSCZrkq`cJ*nD)&RJkL= z#VP#KJ|{pqU{9y!aOb&&WN6y?UEG5hVuTjPHe?5Z4)Wu`%RgQcpHXy(?7F0jNqwO^ z_0?5AhdJa>Fny3}%k>fCmWN81yJdx>6uan_hjhnMPd4ne>8%8L;F<%9f!JyV}k7(;tqRWlNT(S~c8I3pl3H zE4hm|nF}Wx!~PIvbh7YHk`XeskO-hIQ-d?x>n@UoM|u6JjRrhT zJJF2f<87_kY5)*7U0d~bSc;uaua$0VyvshB114{*d=@4r_!QN?I1Jr`t@uz73A){QfFcY^pGl`{Ju(4&JgSBIYhVr#Ljpl(WWW|>0)K8dI2T};b@b$!i zi63A)_lUGfIi&|R%{9_OTr&aR3uy-t4=@`vw8rk;XcaS7>kMsE<*tG;tB5&pA+7L{ z*7Ypt1pHoopabgxZDe+0v)u-~XW({m?=&^R;ON@TXrdbAOSpnd!4ggq$RLqFf2r|x z&s`-WprC1U>Q5F;uAu4rvZ;jz`3zzvbmt*~YTN5eQ_YjlFFNGG?ubRPO1-$CPF5N(N;ODOSp1uuXkmq9-C#tLF8;Nt>{IHBDvpRsPgpc_lpTRrWgiHg^ zRO#3hbH<^t$hcH(9kJSjB2?Gf#Vj_Ik%Pxwb=RDy+L|ZX<0l9VILfU2b5VUF_58ZW zFz)Gp`P}t}Q)+D&kZpj1`%w~^oqKWL{2r)r`gr^ZqKDCotI`A-OhvrvORng>?6Ej< zIMkn?lB^fnbX%xjj#y97QWvsrfGH3d|7pyPCv!i4s1SPr^q~kzy`k{)PfPg|J* zLUo<|QwMY7gLweSSrIZqx+ zUPd`NGHX~|U@p#HPvFVDQWrWb@l>dTSJm)j{!{{=c!;|rf*%^XF?89RO+6hrvW39o zR}Roa2l@8rU{;j%l#Vi)$4taKh3QhBMss!RNKKv&g7t6eX_Yr;;ql1^GI#Am+4DZj z;eP58`LAi@@>Ap->beBm)EpJi<>mIdjIcU4eA}9Pw^6f{8@-?F%JwQQH>OV2S0D?j z2MW{u`Rk!RFc8B^{5*L5D3~r1o`yuf{b5XU6+JvN=Y2m_&udZ6T)pe&3^MjW#k~Xg z(Q4P|9OK)2fI6AHjD0l0QN26Mjcf&jHhMk=u9iIab8?^pXk_|3nc}L+4VcO;7qr)f zRYksB9g7<@DK=VHBhf-FN=P{~LxFZ&un5j5602__xoqJ{s^AQ?%7J6ag(Q(B>?twk z14)G1Q)`LRV7&e`?~X?u>wCAoXod~hqBoF9L8A<5Y|7J(6y4BFW&XET>rtN_|30G> z3gjy)t)a;aB$Tgl;`YCh?^6N$M+q*>7jHDiMD4ft8DcJ~YW?sI14o?)B;8#9PyK3M zf#Z3qtFn9gqx_#Lw?1rbpY8het)R*Rq@2ndL;7w_ilZaFx?`K$59YnB(1+%)86Xv< zZv0jEp0H@QeUJKWVJv>qI*G!6W+yb@Sv+9D7l?k0NSzJOOaET zS{VkU^6nPy`*Dg9&ysfVkm7B2jKJP&FGkFg>?!cRoUODe;9&wyI56AjwCB$<7X(|s z*$!yOp9XvM_UcAU@3`QulhPl5mNLw9o*JWVAD6l`y|EY||40n1Wy7(tG;0pZ;*jXH z;^{g}07&9YNDj6g)#9G9Pg3l38B09V-bz%T73O1+WJXB`x!INmu4OiVrc&wooXDu& zQI-(#xaa9u|1Wdp8vS?2P1%l()$4TbgUwFwIk$eb1#b9o76$3^Y!BibEufZvO8)k0 zJ!(Y5JwFuVmeM^+@Ko`4RT|R@Dj_e7+0yPvEj5<*dkxCl|L(K>W%?hJS96t-lkB!T zPnm@P1R;x5$No*zN15SBe0okJVG8id>VImxQfR4}2N*MKwn{}&?<}#@+gzuqjw{KN z*hFtkr=l&_Z);t9#|e*WdS}xk70$Kvmp_;@4#1tW)6EhZ7_E`vjUSZ9(nKA(6*di2 z%*TrsQ-%dB>G)ES$kv#WR*V3gaQ<3hl-w>L^%tstQmcpfKP$WV+q&muNq_pkdsGGW z$vyC|l-jS{B%q20er!kNI8gi3;PUM|&^uY8LCL`E8ge|;S6LZVG-bWYlcgNhn5NHR zsHY@+#jDl3nQl%6%x7G!@vSy~IGg5>TBFd+M>Mn`Ugr0XTv+u7`C2`rJ4?=LnpEH1 z249QzCJolkA?x)@O8w{sEeXrRA3(U{favEh82_o%!2`9lT<;cBc;*W%RBW6k8$o>| zk=YJbI`9XB&dpYAqOJyvz-e!~b?@d}-L}`gH@+psezzS36tHVWY~z(5-XtPh=#AZ4 z;8O7pWsDGZTLeI}!fAjvWuk*kS*<`t7U)`!y$t48xt$>S;zbcU&NRG`qkZww{C&7@ z1kkB)6(^kIJSP`8Cx^er@J(|2(CfCu7i)qJF4s-u>^Vl~H=1Hz{I_#_86uc^# z10wE^=`S_nHKAQs-50c4>IYRnn1-qQqj2}YKXrT|Dip z&dpw|N>(Ap@n^y0IQ5}FdrrjZ4)8|0*5kR@dS=hN1mnhz)mAh!r>E4Cfl<9vEzH-F zLY!1P;3CpOdRdb7{ROcWF3z;w`>A_bY{@eIhkdt#KNPqor^ON)j3{WfemSDPF-@Pb zZfQAAoMKMxT4cF?Tq^pF#EI$>Z*Sv z-79JLJO$2|aoDWn8SXlyU_fixRJfAWq#-7{3z-FKPC4UvWol+mKLp1SvwBDa6hL|R z##+UKM7Nqko`F$6NH=K2NXdkmYEm^nqF4qc?FTi7&4e}f)rc5Icdnczc{$Y%Z+Ygw zNLPmGO9UYgOFeI*iP)h@u>Q$o{|)bmV=UY#)y$-fj<_QY$MYOh`_u##>C}c)MNf5M znS-fZcW*REU*a2+fgbvOoI%ShU>~y19c`_P}qZNIfw0t2g52F zbv*woq@c|=RH?HjTi+F=DmpFN1=Sy2lkb;!^caVZsJ%ig;7M``Ys zgsCY>sWEUo#4uzlH~EmRjUCLv*W|f`QyD@rNh`~#lOrJciGA8{{Wo5oSS!Pq5Ja2p zApT5k=D)7!DGVo*S&qe@KK-byJ9F+n>v_HdmfxB zuBUMEd6=Es(~ft}tuN47lNd~Owthr8Xh_;ouC&%fRcos8p-a&SJkd)y)6oJMY1>z; z_uss?%MVTx6T7UPyxzONqOjK3#t>&K32Li)pHRmUR-YM=irA4y0Tr_a^ZTEKqYRCz z!eq~=JyMH46mi#a{F1wp^dxgL*MqMv!~)L; zZZ3JPRMF!C6YYGmWK6jq>Y)Q)8+9g;W4U?)3gj~iiHej>z|+Z5Iz3NIG!B~ZDqPge zy?}9#nFy1T^ku&Mn;AZKU4z~(k;8vNN)@-(7}Y9?k&SNubeD1mGv_NX>NoyI1s;XE)V_dm7R zse^ST+>aFxz4qt8YhPVYtj6kK!`)fb`ey3TlU7DzsB%rG^z?v~fp%Q~LwL~PdKWQd z-XQ&Xp4N9j6eDDdW6ecv-33@^6Yu~67nhe5R??7OVhS1ZX0!Y2do<4N3s2-k6tXpl zAex@0Xl`)zay`Y1HE8!&?`ZX@T_l8EFG@_XOM00?92nb$QsydWngx0<>&j}Fz?QF? z8;z`UB`P2fa~t<|Avtpy+xyov60J~Ms?IQGX+Ke@C~3CW>_(rk?0J6SN^op8V^*I| z1#~TKd|Kf7GYLw-#)J#?Hq2dgT+yFh>7zDO_xLrpv?0X$Z|-gE2OI8gL5NlTCEvd> zdh*@w)Gl%Tt_=Ui1e->nydo>j!FhsLZ~BIb2U3Uo_K_!JwKh&lMBH&shDsp>w=b&zNK?oI7>n zZ4ScXC7uPiBiKFE&MW|ddcbsu7Cee-jQ4&i^ELqS!u%&^480Y~QF1UhK-T^DUgPTs z?QRS@#RvgMrJ@<&K8Ma&yVmdhu~$382mo*T*zz_Ghsl`vu&ZZ|A=r2yW-x{h5#~a7aJmsG!VNzTqe<8L^nd2>3%+FD8 zVIz&=@H{u$q&tU_Qe8`_*rwgVbdMTZvw{OGC9#fkoVIq+G`r3I7<>YEzbNd!bFPVsGl7n%f|8`&eaii*L*x$}l(nhbo(&j$c6V`@1fHq@Nn%^Fx zcARllA*H(3#*X{lf)76KJHFz)eu0tL-pq>mR3MtghAn)W&;Fr#)}A;(L7WKNEp4j@ z1A{`YKFK?#-iNiMX4fNkQwxJhA3iGaU2;U7uvAX%S@97>(Dse>*6K9-21#zf-W!|J z)xQHoZ>@AU3dnNGtz;C>Q6=owf^K?km1}DyntcJxktn8c$F+KG*}3}HXHN$27ca?A zZJF6CQXGI1zI4s8YHy4p0GKRfQ-!Hr?A56g7v$_rF3^o64o-bxA@T-~(O|rI>!=B3 z-$Fg*@boOcA8dm5o^&)pjgo>GYDg9R?W4NuH?I}_7EHqO=DW2%tiRr~hMUkXpxNZ7 zb#~WSyS*5w%&z;FO>J)#dP)eMov;?Wg)HbQ4LhG>uIz3>I5)Ye^Yw{==s>}5eu_@l z1aDuvwN-zdYHl)Wrr!tNmM~lZL|h5X@qTPik1pPd0NyqAuEbQGt1yWf)D~lB3u#Wi zXJ>t3E2zr+L{-5>uUI``h#}lV4-d|Tx~Xp(-cK0wN3LQ{$ zW(Svwo}bFMO#`2=*5xlWY;5#)CfUP>Le zR(5-+8NzyKH*f3Xw0+p4eJa?O5Hi(%RS?WHHWsUR3q>? z_sXv&LXuO?zB2?k9Ht|PHbnMIZ&2LHV@(Yn^M#q z>RB1S%)z%`rRFmh^KPgWw3Jn*>E*u;zfNF$B|quae>bwT$4fIMxrp9lelB&3|Ad4n zy$-ym!_u$xKw=V1f)G3wOluL<_z}hQDAlr3+CdPJvQ;6E6=7#1RTAR&~(MINl2ZBSRZ5e zeet&MFCTbPR6?IX z;g5pjRr5xQDbQ5u>=~#T_-e8#%>j2=Zy84Kkq7szmY{ICz2yn9_pkMW;X^jK_k(&Q zI2;nGb)&jfPvw#46V3|HIsflnP2rtV6;VWV4E%`2kGAf^^sK^ntu;c~z4jbWJ|V~c z`Mu8cHTn}y_rJQEA%h3ZUDHdJJQaNB?Z5AK*^rI0?fVzL3aO^WO#g|&$aVv2B66+N zQlET+TNvFmNjnJsj%|9NIagO1d&laaGyg#LEd6zNvVQAccm9p?92zYv#!h!Zz4?T< z=i3CN>V4o}AaSMF=8uBT7g#N@>&ZuKGC|?V7ENa+f(x3_pq*>v;4L6jSk~k=;O?DH z=ijg8N08Zx?NuGF_mPm9i&)SS%ou09&YC5>tKtbiBWjx2Nm^_r-`n9>B@B!rCZ_v_~E<(heivsv?kK&E&DgmWyJ zmM|3%5z);HLj+R<6fc~w3SC@3{^F1C^L;*-_viUM&+~ad&v!AV{1(V$2#)f@6lJ@t z27hllb&c*)%P6Fg1`|cUCzNREP%J!ZA|BV(P3#XrDLwb_C*p_RH@d{DsYcI!*^tAF zojvocbalC52Wn!TYDwef)#>7%32+dR)T*5up{H&Zx87E7I=^}if-WJMJFFrJSEXwx zrk2r|)(D2~o@~gi%FI$5(ONc-{~K9}UXO4_i)$Ki;xIFCPh|`$Gq=W#9#BW4iogTG zGJ5pjOfpI7)5x zR$Jyiu9pDUQQkpJ;oPOT5cZl7^I6@&Qd2* z2P2S%J|A(Bb^h~`J*u2rHZ zcwew1y)-Xw?Y+LTr7YuknKpZs{czdeVDJSN06}9*qz`DN{BY5QxYesysALfewSzuk zHxtLVSIwkRyd*pRSfc`92L)vsX9egLu@a(NvW(lNxW1uh#R zb_>BKk{ve~H^b^;S6$$Dy)2_ZhAnbWd`yM=ECkRbPBXRoB%ZOlNDJ_h5y;S{p!z=a zSa@A&6WLqniJZ(#*ZbR=N6=RSfR@J@(7WW(M=K@#Ad2hgoB(@G@mA#CNS3r@^}G;V zN-1^&D))$$M5HRTmdxAp)s837g-OgONPH7d`;r3jkF8UXlT_fGOE^Ubq+#{=7tETW z;!wn-CM@cdHiI%79=RNj90GRz&`Sd45W0nx7MTp_TGPb1Dd__a-3f)!t{Pz4>-tDt3mqICD4sJfKvVV-xS1n^ zGLu`GMNcL6R+2@x*WZGVG}c7_4l z(fIlj)G=eL$X2CEQ_Bm014XIwC&H?UThR!6FSVLN9WaX{&9~{NP9-^$qhGG-EI~=dRS(qt@*d$RS>0{OWj#PAK-|m@ zXM!z~Gg71qTi|hqq-MxQ>DXA(Bb;}P!g}H6-gTeUW*4yN_y(G=HLn<-i^V)!yzKr4 ziy-X?k;9!QI&7g_Zv}+(wCx6f-m%I56MPKqN;3c_o#0Xxy7DLGUZBvPhN2ZK^?xJL z6(rTuJul-4vZV}HbV1ua8>Oyo>ockEODT`nYPPJ$(3SxTfe-K4Q$hED@s_|HshYlz>AxLMvdY$I(bpriEUFQ z+R9(n=@My5+GKyQUD7)iYEoE~{bA9)89 z{>W=b{*Gtw{t{TTrNIy#7q5@WcbN?%6YEh?ZY!0dUk%krQR|kS`%ixT*4rQp;Lr0Y z(DZTg{GWbxY?0xpL))h2K0Uo19^pc7%hv@?6*r1n|DLA7hf&({i}pog&vaCe!yVTf zLxN(TbbJz6VHE^8()kJTD?cRT`(gOB_QA>=tXlmugz~+SF{?G&73;P2t_Rk;d(rR7 z5ikhtso8T5+r>O(E&l4){C8*}&k|#t+5~o25R{7Z4(#V4G30ojvp3ew4=gdu>_jMj zFVVSD7_-*tJxOn?pXxzl(y>A7PMAyn@&&~9j54&hg9hI(&Gs`ZY3{Z8E~lJ-?LYvm z)Y!Xi%0l3^g{;kM$a^fBI8Q#81ye1MLXvaA5TDV!76&%XCgD=R#jR_$B0S;*mv;1A z#mrDv0%NM3Zf66n8sTz}bL7HBjjK)Q;J2qWnrr9`kq8A`rLcLUvayAnAU+Ci2aAHu zgS?zhV2XrUWG$P_YHE})qoFqvr3l%~w3S<~cIiWtbzy*YT_Y;2Jo-YP4h#|5-$;(P zK%o^^!4U7f#pdFrI0|D0LY<+ajybP6(ySxk+LL}GLHsMZh)jdc%_9%{{!?)?gw-5^ zryzr|NL%{VTxWsr-6b z4cmc#|0QPDy6WHhIUi3g?V&s1x(qj+AMQfU{iDXZf0Cpq?Yv!E8Qe5Ckke5JZ;+(- zBXcNu>u?hveu%vbj$m64uRZ6BykB6g;3Mgwj$AsCYooj3R87LwW@6^EOz<>mb-kW5 zbA7zj_5i~8Ik|e<)c?Aras*kxwU=}B)B~vLae3Y$o5Il;Qi3K%xlp>^c0QU=zgL); z>73liF7OyEY`YPnR`!2lxmZ$aOcp-WKmEHNgK^el?Bh?ph7-MIVtJYr@zbzdDGcx2 zXDwE^{slaxctTVl#~TelB7PTswCw0|H>jq*Ld8Q3)QU7+-V9C+DOJx9Qt>QY$B5n;rOi*5k&D5xD%8 zxmgFdz_SL&KqdN;ariJo>$B_AbwRIx$LY#JG=vWpn>*0kqi~JNAo{rM-Sd6@(ospU-F@F=mq zt$b3Zf}LU6_;B;ZaWds}aN5*gV=gcIZ+!9m5kj#1EG#54l~DfnneEa8b*!Rjd`W*z z5wjz)JMQ{4`cf{-#$XDg=?}tKKiE>NZ^yh}|6|9@w%Y=)j;2gnt=2Oa_Z#^Zd;PIj zj6^#0P?Myn4m2)#e&A>PxYYOsB{At>a`4$3w**h?xbh@f-HqW@{Q#g4%0cy|zvVN( zn5rqdWK~_@?{g6qplW#(awR*C!J0VNj@%e19E}AP0>co0q1Cs=+>A92Mbl2ayO&~> zllS=a#onwt9pi+nRS?ahcBz>Y&=-jlyG0-m zW`-tZ`a5V%`oF6(o2Y`*<*zwQ$uEnl>x{dv>!IneX)MWcFNw1f3Bba%EIpl&nwqR? zsffQ)OCD6Y(sp~;z2eqYaZ)@8Fvwy{Y1$PCJ}S17W4k%D-pxmIW;B$Fj-Qfb^#qty z75~pexC108;aI{k2%~#qe5n`Z)7^U$xW!gEZwB$tAcn_C!X$r;H+C>{K1Utg_ULN z27DBn9nG;bVo(m2ua2S|lto$A33(K*_bdZQfpq|DgD3F5%ZT$&kZXMH3+Sdi&EFZe z4BelgEboNg9mGU3CL22hJ{xhc|Kv#Nrq6)*PLyv_4M-9+Xc}#fKq*31Q{7D-!fv9r zB}KW&25b^Ekugts63SKWACS6b=X^Zj`KI*GBsfLuk1Ka<7QPJ&Kiofe(1gzu=VHe% ztM5b{hBwIC)dou4|MQ9;fCQWN|RIX&Rxxmo0Pc=s;cnbHh5XD_{BuS z6ftX$%{!z_g1ib^W`9i6hcT4KFZJg9^gM|$WZlM4+G}b1l*g%N1z&^ul2eKS<{BS}?_#fPY)pgRUpF62E*4`1zg=_?-G#>^J`f1ojR4 literal 0 HcmV?d00001 diff --git a/docs/assets/en/Desktop/dragdrop7.png b/docs/assets/en/Desktop/dragdrop7.png new file mode 100644 index 0000000000000000000000000000000000000000..7bed26ebeb18593496d5615bda1a0bce8cd7cd8a GIT binary patch literal 247194 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ð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

-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](../../commands/xml-set-options)
| -## Overview of XML Commands - -:::note - -For XML support, 4D uses the [Xerces.dll library](../../Notes/updates.md#library-table) developed by the Apache Foundation company. - -::: - - -### XML, DOM, and SAX - -The **XML** theme groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. - -4D also offers two separate sets of XML commands: [**DOM**](../theme/XML_DOM.md) (Document Object Model) and [**SAX**](../theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. - -- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. -- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. - -#### See also - -http://www.saxproject.org/?selected=event
-http://www.w3schools.com/xml/ - -### Preemptive mode - -XML references created by a [preemptive process](../../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. - - -### Character Sets - -The following character sets are supported by the XML DOM and XML SAX commands of 4D: - -- ASCII -- UTF-8 -- UTF-16 (Big/Small Endian) -- UCS4 (Big/Small Endian) -- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, -- ISO-8859-1 (or Latin1) -- Windows-1252. - - -### Glossary - -This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. - -- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. -- **Child**: In an XML structure, an element in a level directly below another. -- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. -- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. -- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. -- **Parent**: In an XML structure, an element in a level directly above another. -- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. -- **Root**: An element located at the first level of an XML structure. -- **Sibling**: An element at the same level as another. -- **Structure**: structured XML object. This object can be a document, a variable, or an element. -- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. -- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. -- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. -- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. - diff --git a/docs/commands/theme/XML_DOM.md b/docs/commands/theme/XML_DOM.md index 35952a7bf19560..a5417ee344c1c3 100644 --- a/docs/commands/theme/XML_DOM.md +++ b/docs/commands/theme/XML_DOM.md @@ -46,64 +46,3 @@ slug: /commands/theme/XML-DOM |[](../../commands/dom-set-xml-element-value)
| -## Overview of XML DOM Commands - -See [XML, DOM, and SAX](../theme/XML.md#xml-dom-and-sax) section for a definition of XML DOM. - -### Creating, opening and closing XML documents via DOM - -Objects created, modified or parsed by the 4D DOM commands can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../../commands/dom-parse-xml-variable). - -Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../../commands/dom-close-xml) command to close the source in the end. - -Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. - - -### Support of XPath notation - -Several XML DOM commands ([`DOM Create XML element`](../../commands/dom-create-xml-element), [`DOM Find XML element`](../../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. - -XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. - -For example, given the following structure: - -```xml - - - - - - - -``` - -XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. - -4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: - -```xml - - - aaa - bbb - ccc - - -``` - -XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. - -For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../../commands/dom-find-xml-element) command description. - -:::note Compatibility - -Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../../settings/compatibility.md). - -::: - -### Error Handling - -Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. - -In addition, the reference returned in this case is a sequence of 32 zero "0" characters. - diff --git a/docs/commands/theme/XML_SAX.md b/docs/commands/theme/XML_SAX.md index de16e6c401d184..39ae1effae4e5b 100644 --- a/docs/commands/theme/XML_SAX.md +++ b/docs/commands/theme/XML_SAX.md @@ -27,33 +27,3 @@ slug: /commands/theme/XML-SAX |[](../../commands/sax-set-xml-declaration)
| -## Overview of XML SAX Commands - -See [XML, DOM, and SAX](../theme/XML.md#xml-dom-and-sax) section for a definition of XML SAX. - -### Creating, opening and closing XML documents via SAX - -The SAX commands work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../../commands/send-packet) or [`Append document`](../../commands/append-document). - -The creation and opening of XML documents by programming is carried out using the [`Create document`](../../commands/create-document) and [`Open document`](../../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. - -:::note - -Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. - -::: - -Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../../commands/close-document) command. If any XML elements were open, they will be closed automatically. - -### About end-of-line characters and BOM management - -When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: - -- CRLF characters on Windows and LF on macOS for end-of-line characters -- files are written without BOM. - -:::note Compatibility - -In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../../commands/xml-set-options) command and a [Compatibility setting](../../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../../commands/xml-set-options) command before the first SAX writing command. - -::: diff --git a/docs/language-legacy/Objects (Forms)/object-is-styled-text.md b/docs/language-legacy/Objects (Forms)/object-is-styled-text.md index 71af510dbe98be..5b9d5047f5a7ad 100644 --- a/docs/language-legacy/Objects (Forms)/object-is-styled-text.md +++ b/docs/language-legacy/Objects (Forms)/object-is-styled-text.md @@ -31,13 +31,13 @@ displayed_sidebar: docs The **OBJECT Is styled text** command returns **True** when the "Multi-style" option is checked for the object(s) designated by the *object* and *\** parameters. -The "Multi-style" option lets you use rich test areas including individual style variations. For more information, refer to *Multi-style (Rich text area)* in the *Design Reference* manual. +The ["Multi-style" form object property](../../FormObjects/properties_Text.md#multi-style) lets you use rich text areas including individual style variations. -Multi-style objects can be managed by programming using the commands of the "*Styled Text*" theme. +Multi-style objects can be managed by programming using the [commands of the *Styled Text* theme](../../commands/theme/Styled_Text.md). Passing the optional *\** parameter indicates that the *object* parameter is an object name (string). If you do not pass this parameter, it indicates that the *object* parameter is a field or variable. In this case, you pass a field or variable reference instead of a string (field or variable object only). -**Note:** The **OBJECT Is styled text** command returns **True** when it is applied to a 4D Write Pro area. +**Note:** The **OBJECT Is styled text** command returns **True** when it is applied to a [4D Write Pro area](../../FormObjects/writeProArea_overview.md). ## Example @@ -53,7 +53,7 @@ A form contains a field represented by two different objects; one of the objects ## See also -*Styled Text* +[*Styled Text* commands](../../commands/theme/Styled_Text.md) ## Properties diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md new file mode 100644 index 00000000000000..bada589d97d8f0 --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md @@ -0,0 +1,91 @@ +--- +id: legacy-to-import +title: develop-legacy +draft: true +--- + + + + +## Semáforos + +Los semáforos le permiten asegurarse de que dos o más procesos no modifiquen el mismo recurso (archivo, registro...) al mismo tiempo. Solo el proceso que coloca el semáforo puede eliminarlo. + +:::info + +Las [señales](../API/SignalClass.md) también pueden utilizarse para gestionar las interacciones. Las señales le permiten asegurarse de que uno o varios procesos esperarán a que se complete una tarea específica antes de continuar su ejecución. Cualquier proceso puede esperar y/o liberar una señal. + +::: + +### ¿Qué es un semáforo? + +En un programa informático, un semáforo es una herramienta utilizada para proteger acciones que solo deben ser ejecutadas por un único proceso o usuario a la vez. + +En 4D, la necesidad habitual de utilizar semáforos es para modificar un array interproceso: si un proceso está modificando los valores del array, otro proceso no debe poder hacer lo mismo al mismo tiempo. El desarrollador utiliza un semáforo para indicar a un proceso que solo puede ejecutar su secuencia de operaciones si ningún otro proceso está realizando ya las mismas tareas. Cuando un proceso encuentra un semáforo, existen tres posibilidades: + +- Obtiene de inmediato el derecho a pasar +- Espera su turno hasta que obtiene el derecho a pasar +- Continúa su camino, renunciando a ejecutar las tareas. + +Por lo tanto, el semáforo protege partes del código. Solo permite el paso de un proceso a la vez y bloquea el acceso hasta que el proceso que actualmente tiene el derecho de uso renuncia a este derecho liberando el semáforo. + +### Comandos para trabajar con semáforos + +En 4D, usted coloca un semáforo llamando al comando [`Semaphore`](../commands/sempahore). Para liberar un semáforo, llame al comando [`CLEAR SEMAPHORE`](../commands/clear-sempahore). + +El comando [`Semaphore`](../commands/sempahore) tiene un comportamiento muy particular ya que potencialmente realiza dos acciones simultáneamente: + +- Si el semáforo ya está asignado, la función devuelve **True** +- Si el semáforo no está asignado, la función lo asigna al proceso y devuelve **False** al mismo tiempo. + +Esta doble acción realizada por el mismo comando garantiza que ninguna operación externa pueda insertarse entre la prueba del semáforo y su asignación. + +Puede utilizar el comando [`Test semaphore`](../commands/test-semaphore) para saber si un semáforo ya está asignado o no. Este comando se utiliza principalmente como parte de operaciones largas, como el cierre anual de cuentas, donde [`Test semaphore`](../commands/test-semaphore) le permite controlar la interfaz para impedir el acceso a ciertas operaciones, como la adición de datos contables. + +### Cómo utilizar los semáforos + +Los semáforos deben utilizarse según los siguientes principios: + +- Un semáforo debe colocarse y liberarse en el mismo método, +- La ejecución del código protegido por el semáforo debe ser lo más corta posible, +- El código debe temporizarse mediante el parámetro tickCount del comando [`Semaphore`](../commands/sempahore) para esperar la liberación del semáforo. + +Aquí tiene un código típico para utilizar un semáforo: + +```4d + While(Semaphore("MySemaphore";300)) + IDLE + End while + // coloque aquí el código protegido por el semáforo + CLEAR SEMAPHORE("MySemaphore") +``` + +Un semáforo que no se libera puede bloquear parte de la base de datos. Colocar y liberar los semáforos en el mismo método ayuda a eliminar este riesgo. + +Minimizar el código protegido por el semáforo aumenta la fluidez de la aplicación y evita que el semáforo actúe como un cuello de botella. + +Por último, el uso del parámetro opcional *tickCount* del comando [`Semaphore`](../commands/sempahore) es esencial para optimizar la espera de la liberación del semáforo. Con este parámetro, el comando funciona de la siguiente manera: + +- El proceso espera como máximo el número de ticks especificado (300 en el ejemplo) a que el semáforo esté disponible, sin que la ejecución del código pase a la línea siguiente, +- Si el semáforo se libera antes del final de este límite, se asigna inmediatamente al proceso (Semaphore devuelve False) y la ejecución del código se reanuda, +- Si el semáforo no se libera antes del final de este límite, entonces la ejecución del código se reanuda. + +El comando también prioriza las solicitudes estableciendo una cola de espera. De esta manera, el primer proceso que solicite un semáforo será el primero en obtenerlo. Tenga en cuenta que el tiempo de espera se define en función de las particularidades de la aplicación. + +### Semáforos locales o globales + +Existen dos tipos de semáforos en 4D: los semáforos locales y los semáforos globales. + +- Un semáforo local es accesible por todos los procesos de la misma estación de trabajo y únicamente en esa estación. Un semáforo local puede crearse anteponiendo al nombre del semáforo un signo de dólar ($). Los semáforos locales se utilizan para supervisar operaciones entre procesos que se ejecutan en la misma estación de trabajo. Por ejemplo, un semáforo local puede utilizarse para supervisar el acceso a un array interproceso compartido por todos los procesos de su base de datos monousuario o de la estación de trabajo. +- Un semáforo global es accesible para todos los usuarios y todos sus procesos. Los semáforos globales se utilizan para supervisar operaciones entre los usuarios de una base de datos multiusuario. + +Los semáforos globales y locales son idénticos en su lógica. La diferencia reside en su alcance. + +En cliente/servidor, los semáforos globales se comparten entre todos los procesos que se ejecutan en todos los clientes y servidores. Un semáforo local solo se comparte entre los procesos que se ejecutan en la máquina donde se creó. + +En las aplicaciones 4D monousuario, los semáforos globales o locales tienen el mismo alcance porque usted es el único usuario. No obstante, si su base de datos se utiliza en ambas configuraciones, asegúrese de utilizar semáforos globales o locales según lo que desee hacer. + +**Nota:** Recomendamos utilizar semáforos locales cuando necesite un semáforo para gestionar un aspecto local de un cliente de la aplicación, como la interfaz o un array de variables interproceso. Si utiliza un semáforo global en este caso, no solo provocaría intercambios de red innecesarios, sino que también podría afectar innecesariamente a otras máquinas cliente. El uso de un semáforo local evitaría estos efectos secundarios indeseables. + + + \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md new file mode 100644 index 00000000000000..793f5e5c9dbd03 --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md @@ -0,0 +1,7 @@ +--- +id: overview +title: 4D database overview +--- + +## Description + diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/records.md b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/records.md new file mode 100644 index 00000000000000..25e1705847e48e --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/records.md @@ -0,0 +1,308 @@ +--- +id: records +title: Records +slug: /Develop/records +displayed_sidebar: docs +--- + + +## Record numbers + +There are three numbers associated with a record: + +- Record number +- Selected record number +- Sequence number + +### Record Number + +The record number is the absolute/physical record number for a record. A record number is automatically assigned to each new record and remains constant for the record until the record is deleted. Record numbers start at zero. They are not unique because record numbers of deleted records are reused for new records. They also change when the database is [compacted](../MSC/compact.md) or [repaired](../MSC/repair.md). + +### Selected Record Number + +The selected record number is the position of the record in the current selection, and so depends on the current selection. If the selection is changed or sorted, the selected record number will probably change. Numbering for the selected record number starts at one (1). + +### Sequence Number + +The sequence number is a unique non-repeating number that may be assigned to a field of a record (via the Autoincrement property, the SQL AUTO_INCREMENT attribute or the [`Sequence number`](../commands/sequence-number) command). It is not automatically stored with each record. It starts by default at 1 and is incremented for each new record that is created. Unlike record numbers, a sequence number is not reused when a record is deleted or when a database is compacted or repaired. Sequence numbers provide a way to have unique ID numbers for records. If a sequence number is incremented during a transaction, the number is not decremented if the transaction is canceled. + +:::note Notes + +- 4D does not carry out any check when you modify the automatic number internal counter of a table using the [`SET DATABASE PARAMETER`](../commands/set-database-parameter) command. If you decrement this counter, the new records created may have numbers that have already been assigned. +- Sequence numbers are not recommended to fill unique ID primary key fields for records. To create unique record IDs, it is strongly recommended to use UUIDs. + +::: + +### Example + +The following tables illustrate the numbers that are associated with records. Each line in the table represents information about a record. The order of the lines is the order in which records would be displayed in an output form. + +- **Data**: The data from a field in each record. For our example, it contains a person’s name. +- **Record Number**: The record’s absolute record number. This is the number returned by the [`Record number`](../commands/record-number) command. +- **Selected Record Number**: The record’s position in the current selection. This is the number returned by the [`Selected record number`](../commands/selected-record-number) command. +- **Sequence Number**: The record’s unique sequence number. This is the number returned by the [`Sequence number`](../commands/sequence-number) command when the record was created. This number is stored in a field. + +#### After the Records Are Entered + +The first table shows the records after they are entered. + +- The default order for the records is by record number. +- The record number starts at 0. +- The selected record number and the sequence number start at 1. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Sam| 3 |4 |4| +|Lisa| 4| 5 |5| + +Note: The records remain in the default order after a command changes the current selection without reordering it; for example, after the **Show All** menu command is chosen in the Design environment, or after the [`ALL RECORDS`](../commands/all-records) command is executed. + +#### After the Records Are Sorted + +The next table shows the same records sorted by name. + +- The same record number remains associated with each record. +- The selected record numbers reflect the new position of the records in the sorted selection. +- The sequence numbers never change, since they were assigned when each record was created and are stored in the record. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Sam| 3 |3 |4| +|Terri| 1 |4 |2| +|Tess |0| 5| 1| + + +#### After a Record Is Deleted + +The following table shows the records after Sam is deleted. + +- Only the selected record numbers have changed. Selected record numbers reflect the order in which the records are displayed. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Terri| 1 |3 |2| +|Tess |0| 4| 1| + + +#### After a Record Is Added + +The next table shows the records after a new record has been added for Liz. + +- A new record is added to the end of the current selection. +- Sam’s record number is reused for the new record. +- The sequence number continues to increment. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Lisa| 4| 4 |5| +|Liz |3| 5| 6| + +#### After the Selection is Changed and Sorted + +The following table shows the records after the selection was reduced to three records and then sorted. + +- Only the selected record number associated with each record changes. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Sabra| 2|1| 3| +|Liz |3| 2| 6| +|Terri| 1 |3 |2| + +## Record Stack + +The [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) commands allow you to put (“push”) records onto the record stack, and to remove (“pop”) them from the stack. + +Each process has its own record stack for each table. 4D maintains the record stacks for you. Each record stack is a last-in-first-out (LIFO) stack. Stack capacity is limited by memory. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) should be used with discretion. Each record that is pushed uses part of free memory. Pushing too many records can cause an out-of-memory or stack full condition. + +4D clears the stack of any unpopped records when you return to the menu at the end of execution of your method. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) are useful when you want to examine records in the same file during data entry. To do this, you push the record, search and examine records in the file (copy fields into variables, for example), and finally pop the record to restore the record. + +While entering a record, if you have to check a multiple field unique value, use the [`SET QUERY DESTINATION`](../commands/set-quer-destination) command. This will save you the calls to [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) that you were making before and after the call to QUERY in order to preserve the data entered in the current record. [`SET QUERY DESTINATION`](../commands/set-quer-destination) allows you to make a query that does not change the selection nor the current record. + +## Record locking + +4D and 4D Server automatically manage databases by preventing multi-user or multi-process conflicts. Two users or two processes cannot modify the same record or object at the same time. However, the second user or process can have read-only access to the record or object at the same time. + +There are several reasons for using the multi-user commands: + +- Modifying records by using the language. +- Using a custom user interface for multi-user operations. +- Saving related modifications inside a transaction. + +There are three important concepts to be aware of when using commands in a multi-processing database: + +1. In a process, each table is in either a read-only or a read/write state. +2. Records become locked when they are loaded and unlocked when they are unloaded. +3. A locked record cannot be modified. + +As a convention in the following sections, the person performing an operation on the multi-user database is referred to as the **local user**. Other people using the database are referred to as the **other users**. The discussion is from the perspective of the local user. Also, from a multi-process perspective, the process executing an operation on the database is the **current process**. Any other executing process is referred to as **other processes**. The discussion is from the point of view of the current process. + +### Locked Records + +A locked record cannot be modified by the local user or the current process. A locked record can be loaded, but cannot be modified. A record is locked when one of the other users or processes has successfully loaded the record for modification, or when the record is stacked. Only the user who is modifying the record sees that record as unlocked. All other users and processes see the record as locked, and therefore unavailable for modification. A table must be in a read/write state for a record to be loaded unlocked. + +### Read-Only and Read/Write States + +Each table in a database is in either a read/write or a read-only state for each user and process of the database. **Read-only** means that records for the table can be loaded but not modified. **Read/write** means that records for the table can be loaded and modified if no other user has locked the record first. + +Note that if you change the status of a table, the change takes effect for the next record loaded. If there is a record currently loaded when you change the table’s status, that record is not affected by the status change. + +#### Read-Only State + +When a table is read-only and a record is loaded, this record is always locked. In other words, locked records can be displayed, printed, and otherwise used, but they cannot be modified. + +Note that the read-only state applies only to editing existing records. A read-only state does not affect the creation of new records. You can still add records to a read-only table using [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record), or the menu commands of the Design environment (in this case, the records being created are locked for all other users/processes). Note that the [`ARRAY TO SELECTION`](../commands/array-to-selection) command is not affected by the read-only state since it can both create and modify records. + +4D automatically sets a table to read-only for commands that do not require write access to records. These commands are: [`DISPLAY SELECTION`](../commands/display-selection), [`DISTINCT VALUES`](../commands/distinct-values), [`EXPORT DIF`](../commands/export-dif), [`EXPORT SYLK`](../commands/export-sylk), [`EXPORT TEXT`](../commands/export-text), [`PRINT SELECTION`](../commands/print-selection), [`PRINT LABEL`](../commands/print-label), [`QR REPORT`](../commands/qr-report), [`SELECTION TO ARRAY`](../commands/selection-to-array), [`SELECTION RANGE TO ARRAY`](../commands/selection-range-to-array). + +You can find out the state of a table at any time using the [`Read only state`](../commands/read-only-state) function. + +Before executing any of these commands, 4D saves the current state of the table (read-only or read/write) for the current process. After the command has executed, this state is restored. + +#### Read/Write State + +When a table is read/write and a record is loaded, the record will become unlocked if no other user has locked the record first. If the record is locked by another user, the record is loaded as a locked record that cannot be modified by the local user. + +A table must be set to read/write and the record loaded for it to become unlocked and thus modifiable. + +If a user loads a record from a table in read/write mode, no other users can load that record for modification. However, other users can add records to the table, either through the [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record) commands or manually in the Design environment. + +Read/write is the default state for all tables when a database is opened and a new process is started. + +#### Changing the Status of a Table + +You can use the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands to change the state of a table. If you want to change the state of a table in order to make a record read-only or read/write, you must execute the command before this record is loaded. Any record that is already loaded is not affected by the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands. + +Each process has its own state (read-only or read/write) for each table in the database. + +By default, if you do not use the READ ONLY command, all tables are in read/write mode. + +### Loading, Modifying and Unloading Records + +Before the local user can modify a record, the table must be in the read/write state and the record must be loaded and unlocked. + +Any of the commands that loads a current record (if there is one) — such as [`NEXT RECORD`](../commands/next-record), [`QUERY`](../commands/query), [`ORDER BY`](../commands/order-by), [`RELATE ONE`](../commands/relate-one), etc. — sets the record state as locked or unlocked. The record is loaded according to the current state of its table (read-only or read/write) and its availability. A record may also be loaded for a related table by any of the commands that cause an automatic relation to be established. + +If a table is in the read-only state for a process or a user, then this table's records are loaded in read-only mode, which means they cannot be modified or deleted by this process or user. This is recommended for viewing or retrieving data because it does not prevent other users or processes from accessing the records of this table in read/write mode if necessary. + +If a table is in the read/write state for a process or a user, then any record from this table is also loaded in read/write mode, but only if no other user or process has already locked this record. If a record is successfully loaded in read/write mode, it is unlocked for the current process or user (it can be modified and saved) and is locked for all other users or processes. A table must be put into the read/write state before loading a record for modification and then saving it. + +If the record is to be modified, you use the Locked function to test whether or not a record is locked by another user. If a record is locked (Locked returns True), load the record with the [`LOAD RECORD`](../commands/load-record) command and again test whether or not the record is locked. This sequence must be continued until the record becomes unlocked (Locked returns False). + +When modifications to be made to a record are finished, the record must be released (and therefore unlocked for the other users) with [`UNLOAD RECORD`](../commands/unload-record). If a record is not unloaded, it will remain locked for all other users until a different current record is selected. Changing the current record of a table automatically unlocks the previous current record. You need to explicitly call [`UNLOAD RECORD`](../commands/unload-record) if you do not change the current record. This discussion applies to existing records. When a new record is created, it can be saved regardless of the state of the table to which it belongs. + +:::note + +When it is used in a transaction, the [`UNLOAD RECORD`](../commands/unload-record) command unloads the current record only for the process that manages the transaction. For other processes, the record stays locked as long as the transaction has not been validated (or cancelled). + +::: + +Use the [`LOCKED BY`](../commands/locked-by) command to see which user and/or process have locked a record. + +::: + +A good practice is to place all tables in read-only mode when each process is started (using the syntax [`READ ONLY(*)`](../commands/read-only)) then put each table in read/write mode only when necessary. Access to tables in read-only mode is faster and more memory-efficient. Moreover, changing the state of a table is optimized in client/server mode because it does not cause any additional network traffic: information is only sent to the server when executing a command that requires adequate access to the table. + +::: + +### Loops to Load Unlocked Records + +The following example shows the simplest loop with which to load an unlocked record: + +```4d + READ WRITE([Customers])//Set the table’s state to read/write + Repeat//Loop until the record is unlocked + LOAD RECORD([Customers])//Load record and set locked status + Until(Not(Locked([Customers]))) + //Do something to the record here + READ ONLY([Customers])//Set the table’s state to read-only +``` + +The loop continues until the record is unlocked. + +A loop like this is used only if the record is unlikely to be locked by anyone else, since the user would have to wait for the loop to terminate. Thus, it is unlikely that the loop would be used as is unless the record could only be modified by means of a method. + +The following example uses the previous loop to load an unlocked record and modify the record: + +```4d + READ WRITE([Inventory]) + Repeat //Loop until the record is unlocked + LOAD RECORD([Inventory]) //Load record and set it to locked + Until(Not(Locked([Inventory]))) + [Inventory]Part Qty:=[Inventory]Part Qty 1 //Modify the record + SAVE RECORD([Inventory]) //Save the record + UNLOAD RECORD([Inventory]) //Let other users modfiy it + READ ONLY([Inventory]) +``` + + +The [`MODIFY RECORD`](../commands/modify-record) command automatically notifies the user if a record is locked, and prevents the record from being modified. The following example avoids this automatic notification by first testing the record with the Locked function. If the record is locked, the user can cancel. + +This example efficiently checks to see if the current record is locked for the table [Commands]. If it is locked, the process is delayed by the procedure for one second. This technique can be used both in a multi-user or multi-process situation: + +```4d + Repeat + READ ONLY([Commands])//You do not need read/write right now + QUERY([Commands]) + //If the search was completed and some records were returned + If((OK=1) & (Records in selection([Commands])>0)) + READ WRITE([Commands])//Set the table to read/write state + LOAD RECORD([Commands]) + While(Locked([Commands]) & (OK=1)) `If the record is locked, + //loop until the record is unlocked + //Who is the record locked by? + LOCKED BY([Commands];$Process;$User;$SessionUser;$Name) + If($Process=-1)//Has the record been deleted? + ALERT("The record has been deleted in the meantime.") + OK:=0 + Else + If($User="")//Are you in single-user mode + $User:="you" + End if + CONFIRM("The record is already used by "+$User+" in the "+$Name+" Process.") + If(OK=1)//If you want to wait for a few seconds + DELAY PROCESS(Current process;120)//Wait for a few seconds + LOAD RECORD([Commands])//Try to load the record + End if + End if + End while + If(OK=1)//The record is unlocked + MODIFY RECORD([Commands])//You can modify the record + UNLOAD RECORD([Commands]) + End if + READ ONLY([Commands])//Switch back to read-only + OK:=1 + End if + Until(OK=0) +``` + + +### Using Commands in Multi-user or Multi-process Environment + +A number of commands in the language perform specific actions when they encounter a locked record. They behave normally if they do not encounter a locked record. + +Here is a list of these commands and their actions when a locked record is encountered. + +- [`MODIFY RECORD`](../commands/modify-record): Displays a dialog box stating that the record is in use. The record is not displayed, therefore the user cannot modify the record. In the Design environment, the record is shown in read-only state. +- [`MODIFY SELECTION`](../commands/modify-selection): Behaves normally except when the user double-clicks a record to modify it. [`MODIFY SELECTION`](../commands/modify-selection) displays dialog box stating that the record is in use and then allows read-only access to the record. +- [`APPLY TO SELECTION`](../commands/apply-to-selection): Loads a locked record, but does not modify it. [`APPLY TO SELECTION`](../commands/apply-to-selection) can be used to read information from the table without special care. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE SELECTION`](../commands/delete-selection): Does not delete any locked records; it skips them. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE RECORD`](../commands/delete-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`SAVE RECORD`](../commands/save-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`ARRAY TO SELECTION`](../commands/array-to-selection): Does not save any locked records. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`GOTO RECORD`](../commands/goto-record): Records in a multi-user/multi-process database may be deleted and added by other users, therefore the record numbers may change. Use caution when directly referencing a record by number in a multi-user database. +- [**Sets**](./sets.md): Take special care with sets, as the information that the set was based on may be changed by another user or process. diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md new file mode 100644 index 00000000000000..f1e42b3cc1c863 --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md @@ -0,0 +1,168 @@ +--- +id: sets +title: Sets +slug: /Develop/sets +displayed_sidebar: docs +--- + + +Sets offer you a powerful, swift means for manipulating record selections. Besides the ability to create sets, relate them to the current selection, and store, load, and clear sets, 4D offers three standard set operations: + +- Intersection +- Union +- Difference. + + +## Sets and the Current Selection + +A set is a compact representation of a selection of records. The idea of sets is closely bound to the idea of the current selection. Sets are generally used for the following purposes: + +- To save and later restore a selection when the order does not matter +- To access the selection a user made on screen (the `UserSet`) +- To perform a logical operation between selections. + +The current selection is a list of references that points to each record that is currently selected. The list exists in memory. Only currently selected records are in the list. A selection doesn’t actually contain the records, but only a list of references to the records. Each reference to a record takes 4 bytes in memory. When you work on a table, you always work with the records in the current selection. When a selection is sorted, only the list of references is rearranged. There is only one current selection for each table inside a process. + +Like a current selection, a set represents a selection of records. A set does this by using a very compact representation for each record. Each record is represented by one bit (one-eighth of a byte). Operations using sets are very fast, because computers can perform operations on bits very quickly. A set contains one bit for every record in the table, whether or not the record is included in the set. In fact, each bit is equal to 1 or 0, depending on whether or not the record is in the set. + +Sets are very economical in terms of RAM space. The size of a set, in bytes, is always equal to the total number of records in the table divided by 8. For example, if you create a set for a table containing 10,000 records, the set takes up 1,250 bytes, which is about 1.2K in RAM. + +There can be many sets for each table. In fact, sets can be saved to disk separately from the database. To change a record belonging to a set, first you must use the set as the current selection, then modify the record or records. + +A set is never in a sorted order—the records are simply indicated as belonging to the set or not. On the other hand, a named selection is in sorted order, but it requires more memory in most cases. For more information about named selections, see the Named Selections section. + +A set "remembers" which record was the current record at the time the set was created. The following table compares the concepts of the current selection and of sets: + +|Comparison|Current Selection|Sets| +|---|---|---| +|Number per table|1|0 to many| +|Sortable|Yes|No| +|Can be saved on disk|No|Yes| +|RAM per record(in bytes)|Number of selected records * 4|Total number of records/8| +|Combinable| No| Yes| +|Contains current record| Yes| Yes, as of the time the set was created| + +When you create a set, it belongs to the table from which you created it. Set operations can be performed only between sets belonging to the same table. + +Sets are independent from the data. This means that after changes are made to a file, a set may no longer be accurate. There are many operations that can cause a set to be inaccurate. For example, if you create a set of all the people from New York City, and then change the data in one of those records to “Boston” the set would not change, because the set is just a representation of a selection of records. Deleting records and replacing them with new ones also changes a set, as well as compacting the data. Sets can be guaranteed to be accurate only as long as the data in the original selection has not been changed. + +## Process and Interprocess Sets + +You can have the following three types of sets: + +- **Process sets**: A process set can only be accessed by the process in which it has been created. `LockedSet` is a process set. Process sets are cleared as soon as the process method ends. Process sets do not need any special prefix in the name. +- **Interprocess sets**: A set is an interprocess set if the name of the set is preceded by the symbols (<>) — a “less than” sign followed by a “greater than” sign. An interprocess set is “visible” to all the processes of the database. +In client/server mode, an interprocess set is “visible” to processes of the machine where it was created (client or server). +The name of an interprocess set must be unique in the database. +- **Local Sets/Client Sets**: Local/client sets are intended for use in client/server mode. The name of a local/client set is always preceded by the dollar sign ($) -- except for the UserSet system set. Unlike other types of sets, a local/client set is stored on the client machine. + +:::note Notes + +- The maximum size of a set name is 255 characters (excluding <> and $ symbols). +- For more information about the use of sets in client/server mode, please refer to 4D Server, Sets and Named Selections. + +::: + + +## Visibility of Sets + +The following table indicates the principles concerning the visibility of sets depending on their scope and where they were created: + + + +||Client Process|Other processes on the same client|Other clients|Server process|Other processes on the server| +|---|---|---|---|---|---| +|Creation in a client process |||||| +|$test|X ||||| +|test | X||| X(Trigger) || +|<>test | X|X |||| +|Creation in a server process|||||| +|$test|||| X|| +|test ||||X|| +|<>test||||X| X| + + +## Sets and Transactions + +A set can be created inside a [transaction](./transactions.md). It is possible to create a set of the records created inside a transaction and a set of records created or modified outside of a transaction. When the transaction ends, the set created during the transaction should be cleared, because it may not be an accurate representation of the records, especially if the transaction was canceled. + +## Example + +The following example deletes duplicate records from a table which contains information about people. A For...End for loop moves through all the records, comparing the current record to the previous record. If the name, address, and zip code are the same, then the record is added to a set. At the end of the loop, the set is made the current selection and the (old) current selection is deleted: + +```4d + CREATE EMPTY SET([People];"Duplicates") + // Create an empty set for duplicate records + ALL RECORDS([People]) + // Select all records + // Sort the records by ZIP, address, and name so + // that the duplicates will be next to each other + ORDER BY([People];[People]ZIP;>;[People]Address;>;[People]Name;>) + // Initialize variables that hold the fields from the previous record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + // Go to second record to compare with first + NEXT RECORD([People]) + For($i;2;Records in table([People])) + // Loop through records starting at 2 + // If the name, address, and ZIP are the same as the + // previous record then it is a duplicate record. + If(([People]Name=$Name) & ([People]Address=$Address) & ([People]ZIP=$ZIP)) + // Add current record (the duplicate) to set + ADD TO SET([People];"Duplicates") + Else + // Save this record’s name, address, and ZIP for comparison with the next record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + End if + // Move to the next record + NEXT RECORD([People]) + End for + // Use duplicate records that were found + USE SET("Duplicates") + // Delete the duplicate records + DELETE SELECTION([People]) + // Remove the set from memory + CLEAR SET("Duplicates") +``` + +As an alternative to immediately deleting records at the end of the method, you could display them on screen or print them, so that a more detailed comparison can be made. + + +## The UserSet System Set + +4D maintains a system set named `UserSet`, which automatically stores the most recent selection of records highlighted on screen by the user. Thus, you can display a group of records with [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection), ask the user to select from among them and turn the results of that manual selection into a selection or into a set that you name. + +::info 4D Server + +Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection), [`UNION`](../commands/union) and [`DIFFERENCE`](../commands/difference), make sure you compare `UserSet` only to client sets. + +::: + +There is only one `UserSet` for a [process](../Develop/processes.md). Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. + +4D manages the `UserSet` set for list forms displayed in Design mode or using the [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection) commands. However, this mechanism is not active for [subforms](../FormObjects/subform_overview.md). + +The following method illustrates how you can display records, allow the user to select some of them, and then use UserSet to display the selected records: + +```4d + // Display all records and allow user to select any number of them. + // Then display this selection by using UserSet to change the current selection. + FORM SET OUTPUT([People];"Display") // Set the output layout + ALL RECORDS([People]) // Select all people + ALERT("Press Ctrl or Command and Click to select the people required.") + DISPLAY SELECTION([People]) // Display the people + USE SET("UserSet") // Use the people that were selected + ALERT("You chose the following people.") + DISPLAY SELECTION([People]) // Display the selected people +``` + +## The LockedSet System Set + +The [`APPLY TO SELECTION`](../commands/apply-to-selection), [`DELETE SELECTION`](../commands/delete-selection), [`ARRAY TO SELECTION`](../commands/array-to-selection) and [`JSON TO SELECTION`](../commands/json-to-selection) commands create a set named `LockedSet` when used in a multi-processing environment. + +Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the [`SET QUERY AND LOCK`](../commands/set-query-and-lock) command). + +`LockedSet` indicates which records were locked during the execution of the command. \ No newline at end of file diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md new file mode 100644 index 00000000000000..6691cfcb0e545c --- /dev/null +++ b/i18n/es/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md @@ -0,0 +1,157 @@ +--- +id: xml +title: XML Processing +slug: /Develop/XML +displayed_sidebar: docs +--- + + +## Overview of XML Commands + +### XML, DOM, and SAX + +The [**XML** theme](../commands/theme/XML.md) groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. + +4D also offers two separate sets of XML commands: [**DOM**](../commands/theme/XML_DOM.md) (Document Object Model) and [**SAX**](../commands/theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. + +- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. +- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. + +### References + +http://www.saxproject.org/?selected=event
+http://www.w3schools.com/xml/ + +:::note + +For XML support, 4D uses the [Xerces.dll library](../Notes/updates.md#library-table) developed by the Apache Foundation company. + +::: + + +### Preemptive mode + +XML references created by a [preemptive process](../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. + + +### Character Sets + +The following character sets are supported by the XML DOM and XML SAX commands of 4D: + +- ASCII +- UTF-8 +- UTF-16 (Big/Small Endian) +- UCS4 (Big/Small Endian) +- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, +- ISO-8859-1 (or Latin1) +- Windows-1252. + + +### Glossary + +This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. + +- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. +- **Child**: In an XML structure, an element in a level directly below another. +- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. +- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. +- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. +- **Parent**: In an XML structure, an element in a level directly above another. +- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. +- **Root**: An element located at the first level of an XML structure. +- **Sibling**: An element at the same level as another. +- **Structure**: structured XML object. This object can be a document, a variable, or an element. +- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. +- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. +- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. +- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. + + +## XML DOM Commands + +### Creating, opening and closing XML documents via DOM + +Objects created, modified or parsed by the [4D XML DOM commands](../commands/theme/XML_DOM.md) can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../commands/dom-parse-xml-variable). + +Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../commands/dom-close-xml) command to close the source in the end. + +Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. + + +### Support of XPath notation + +Several XML DOM commands ([`DOM Create XML element`](../commands/dom-create-xml-element), [`DOM Find XML element`](../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. + +XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. + +For example, given the following structure: + +```xml + + + + + + + +``` + +XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. + +4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: + +```xml + + + aaa + bbb + ccc + + +``` + +XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. + +For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../commands/dom-find-xml-element) command description. + +:::note Compatibility + +Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../settings/compatibility.md). + +::: + +### Error Handling + +Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. + +In addition, the reference returned in this case is a sequence of 32 zero "0" characters. + + +## XML SAX Commands + +### Creating, opening and closing XML documents via SAX + +The [XML SAX commands](../commands/theme/XML_SAX.md) work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../commands/send-packet) or [`Append document`](../commands/append-document). + +The creation and opening of XML documents by programming is carried out using the [`Create document`](../commands/create-document) and [`Open document`](../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. + +:::note + +Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. + +::: + +Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../commands/close-document) command. If any XML elements were open, they will be closed automatically. + +### About end-of-line characters and BOM management + +When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: + +- CRLF characters on Windows and LF on macOS for end-of-line characters +- files are written without BOM. + +:::note Compatibility + +In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../commands/xml-set-options) command and a [Compatibility setting](../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../commands/xml-set-options) command before the first SAX writing command. + +::: diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md new file mode 100644 index 00000000000000..4c033be35c91ad --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md @@ -0,0 +1,91 @@ +--- +id: legacy-to-import +title: develop-legacy +draft: true +--- + + + + +## Sémaphores + +Les sémaphores vous permettent de vous assurer que deux processus ou plus ne modifient pas la même ressource (fichier, enregistrement...) en même temps. Seul le processus qui pose le sémaphore peut le retirer. + +:::info + +Les [signaux](../API/SignalClass.md) peuvent également être utilisés pour gérer les interactions. Les signaux vous permettent de vous assurer qu'un ou plusieurs processus attendront qu'une tâche spécifique soit terminée avant de poursuivre leur exécution. Tout processus peut attendre et/ou libérer un signal. + +::: + +### Qu'est-ce qu'un sémaphore ? + +Dans un programme informatique, un sémaphore est un outil utilisé pour protéger des actions qui ne doivent être exécutées que par un seul processus ou utilisateur à la fois. + +En 4D, le besoin classique d'utiliser des sémaphores concerne la modification d'un tableau interprocess : si un processus modifie les valeurs du tableau, un autre processus ne doit pas pouvoir faire la même chose en même temps. Le développeur utilise un sémaphore pour indiquer à un processus qu'il ne peut effectuer sa séquence d'opérations que si aucun autre processus n'effectue déjà les mêmes tâches. Lorsqu'un processus rencontre un sémaphore, trois possibilités se présentent : + +- Il obtient immédiatement le droit de passer +- Il attend son tour jusqu'à obtenir le droit de passer +- Il poursuit son chemin, renonçant à exécuter les tâches. + +Le sémaphore protège donc des parties du code. Il ne laisse passer qu'un seul processus à la fois et bloque l'accès jusqu'à ce que le processus détenant actuellement le droit d'utilisation abandonne ce droit en libérant le sémaphore. + +### Commandes pour travailler avec les sémaphores + +En 4D, vous posez un sémaphore en appelant la commande [`Semaphore`](../commands/sempahore). Pour libérer un sémaphore, vous appelez la commande [`CLEAR SEMAPHORE`](../commands/clear-sempahore). + +La commande [`Semaphore`](../commands/sempahore) a un comportement très particulier car elle effectue potentiellement deux actions simultanément : + +- Si le sémaphore est déjà attribué, la fonction retourne **True** +- Si le sémaphore n'est pas attribué, la fonction l'attribue au processus et retourne **False** en même temps. + +Cette double action effectuée par la même commande garantit qu'aucune opération externe ne peut s'insérer entre le test du sémaphore et son attribution. + +Vous pouvez utiliser la commande [`Test semaphore`](../commands/test-semaphore) pour savoir si un sémaphore est déjà attribué ou non. Cette commande est principalement utilisée dans le cadre d'opérations longues, telles que la clôture annuelle des comptes, où [`Test semaphore`](../commands/test-semaphore) vous permet de contrôler l'interface afin d'empêcher l'accès à certaines opérations, comme l'ajout de données comptables. + +### Comment utiliser les sémaphores + +Les sémaphores doivent être utilisés selon les principes suivants : + +- Un sémaphore doit être posé et libéré dans la même méthode, +- L'exécution du code protégé par le sémaphore doit être aussi courte que possible, +- Le code doit être temporisé au moyen du paramètre tickCount de la commande [`Semaphore`](../commands/sempahore) pour attendre la libération du sémaphore. + +Voici un code type pour utiliser un sémaphore : + +```4d + While(Semaphore("MySemaphore";300)) + IDLE + End while + // placer ici le code protégé par le sémaphore + CLEAR SEMAPHORE("MySemaphore") +``` + +Un sémaphore qui n'est pas libéré peut bloquer une partie de la base de données. Poser et libérer les sémaphores dans la même méthode permet d'éliminer ce risque. + +Minimiser le code protégé par le sémaphore augmente la fluidité de l'application et évite que le sémaphore ne devienne un goulot d'étranglement. + +Enfin, l'utilisation du paramètre optionnel *tickCount* de la commande [`Semaphore`](../commands/sempahore) est essentielle pour optimiser l'attente de la libération du sémaphore. Avec ce paramètre, la commande fonctionne de la manière suivante : + +- Le processus attend au maximum le nombre de ticks spécifié (300 dans l'exemple) que le sémaphore soit disponible, sans que l'exécution du code ne passe à la ligne suivante, +- Si le sémaphore est libéré avant la fin de cette limite, il est immédiatement attribué au processus (Semaphore retourne False) et l'exécution du code reprend, +- Si le sémaphore n'est pas libéré avant la fin de cette limite, alors l'exécution du code reprend. + +La commande priorise également les requêtes en établissant une file d'attente. Ainsi, le premier processus à demander un sémaphore sera le premier à l'obtenir. Notez que le temps d'attente est défini en fonction des spécificités de l'application. + +### Sémaphores locaux ou globaux + +Il existe deux types de sémaphores en 4D : les sémaphores locaux et les sémaphores globaux. + +- Un sémaphore local est accessible par tous les processus du même poste de travail et uniquement sur ce poste. Un sémaphore local peut être créé en préfixant le nom du sémaphore par un signe dollar ($). Vous utilisez les sémaphores locaux pour surveiller les opérations entre des processus s'exécutant sur le même poste de travail. Par exemple, un sémaphore local peut être utilisé pour surveiller l'accès à un tableau interprocess partagé par tous les processus de votre base de données mono-utilisateur ou du poste de travail. +- Un sémaphore global est accessible à tous les utilisateurs et à tous leurs processus. Vous utilisez les sémaphores globaux pour surveiller les opérations entre les utilisateurs d'une base de données multi-utilisateurs. + +Les sémaphores globaux et locaux sont identiques dans leur logique. La différence réside dans leur portée. + +En client/serveur, les sémaphores globaux sont partagés entre tous les processus s'exécutant sur tous les clients et serveurs. Un sémaphore local n'est partagé qu'entre les processus s'exécutant sur la machine où il a été créé. + +Dans les applications 4D mono-utilisateur, les sémaphores globaux ou locaux ont la même portée car vous êtes le seul utilisateur. Toutefois, si votre base de données est utilisée dans les deux configurations, veillez à utiliser des sémaphores globaux ou locaux selon ce que vous souhaitez faire. + +**Note :** Nous recommandons d'utiliser des sémaphores locaux lorsque vous avez besoin d'un sémaphore pour gérer un aspect local d'un client de l'application, tel que l'interface ou un tableau de variables interprocess. Si vous utilisez un sémaphore global dans ce cas, cela provoquerait non seulement des échanges réseau inutiles, mais pourrait aussi affecter inutilement d'autres machines clientes. L'utilisation d'un sémaphore local éviterait ces effets secondaires indésirables. + + + \ No newline at end of file diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md new file mode 100644 index 00000000000000..793f5e5c9dbd03 --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md @@ -0,0 +1,7 @@ +--- +id: overview +title: 4D database overview +--- + +## Description + diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/records.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/records.md new file mode 100644 index 00000000000000..25e1705847e48e --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/records.md @@ -0,0 +1,308 @@ +--- +id: records +title: Records +slug: /Develop/records +displayed_sidebar: docs +--- + + +## Record numbers + +There are three numbers associated with a record: + +- Record number +- Selected record number +- Sequence number + +### Record Number + +The record number is the absolute/physical record number for a record. A record number is automatically assigned to each new record and remains constant for the record until the record is deleted. Record numbers start at zero. They are not unique because record numbers of deleted records are reused for new records. They also change when the database is [compacted](../MSC/compact.md) or [repaired](../MSC/repair.md). + +### Selected Record Number + +The selected record number is the position of the record in the current selection, and so depends on the current selection. If the selection is changed or sorted, the selected record number will probably change. Numbering for the selected record number starts at one (1). + +### Sequence Number + +The sequence number is a unique non-repeating number that may be assigned to a field of a record (via the Autoincrement property, the SQL AUTO_INCREMENT attribute or the [`Sequence number`](../commands/sequence-number) command). It is not automatically stored with each record. It starts by default at 1 and is incremented for each new record that is created. Unlike record numbers, a sequence number is not reused when a record is deleted or when a database is compacted or repaired. Sequence numbers provide a way to have unique ID numbers for records. If a sequence number is incremented during a transaction, the number is not decremented if the transaction is canceled. + +:::note Notes + +- 4D does not carry out any check when you modify the automatic number internal counter of a table using the [`SET DATABASE PARAMETER`](../commands/set-database-parameter) command. If you decrement this counter, the new records created may have numbers that have already been assigned. +- Sequence numbers are not recommended to fill unique ID primary key fields for records. To create unique record IDs, it is strongly recommended to use UUIDs. + +::: + +### Example + +The following tables illustrate the numbers that are associated with records. Each line in the table represents information about a record. The order of the lines is the order in which records would be displayed in an output form. + +- **Data**: The data from a field in each record. For our example, it contains a person’s name. +- **Record Number**: The record’s absolute record number. This is the number returned by the [`Record number`](../commands/record-number) command. +- **Selected Record Number**: The record’s position in the current selection. This is the number returned by the [`Selected record number`](../commands/selected-record-number) command. +- **Sequence Number**: The record’s unique sequence number. This is the number returned by the [`Sequence number`](../commands/sequence-number) command when the record was created. This number is stored in a field. + +#### After the Records Are Entered + +The first table shows the records after they are entered. + +- The default order for the records is by record number. +- The record number starts at 0. +- The selected record number and the sequence number start at 1. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Sam| 3 |4 |4| +|Lisa| 4| 5 |5| + +Note: The records remain in the default order after a command changes the current selection without reordering it; for example, after the **Show All** menu command is chosen in the Design environment, or after the [`ALL RECORDS`](../commands/all-records) command is executed. + +#### After the Records Are Sorted + +The next table shows the same records sorted by name. + +- The same record number remains associated with each record. +- The selected record numbers reflect the new position of the records in the sorted selection. +- The sequence numbers never change, since they were assigned when each record was created and are stored in the record. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Sam| 3 |3 |4| +|Terri| 1 |4 |2| +|Tess |0| 5| 1| + + +#### After a Record Is Deleted + +The following table shows the records after Sam is deleted. + +- Only the selected record numbers have changed. Selected record numbers reflect the order in which the records are displayed. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Terri| 1 |3 |2| +|Tess |0| 4| 1| + + +#### After a Record Is Added + +The next table shows the records after a new record has been added for Liz. + +- A new record is added to the end of the current selection. +- Sam’s record number is reused for the new record. +- The sequence number continues to increment. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Lisa| 4| 4 |5| +|Liz |3| 5| 6| + +#### After the Selection is Changed and Sorted + +The following table shows the records after the selection was reduced to three records and then sorted. + +- Only the selected record number associated with each record changes. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Sabra| 2|1| 3| +|Liz |3| 2| 6| +|Terri| 1 |3 |2| + +## Record Stack + +The [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) commands allow you to put (“push”) records onto the record stack, and to remove (“pop”) them from the stack. + +Each process has its own record stack for each table. 4D maintains the record stacks for you. Each record stack is a last-in-first-out (LIFO) stack. Stack capacity is limited by memory. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) should be used with discretion. Each record that is pushed uses part of free memory. Pushing too many records can cause an out-of-memory or stack full condition. + +4D clears the stack of any unpopped records when you return to the menu at the end of execution of your method. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) are useful when you want to examine records in the same file during data entry. To do this, you push the record, search and examine records in the file (copy fields into variables, for example), and finally pop the record to restore the record. + +While entering a record, if you have to check a multiple field unique value, use the [`SET QUERY DESTINATION`](../commands/set-quer-destination) command. This will save you the calls to [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) that you were making before and after the call to QUERY in order to preserve the data entered in the current record. [`SET QUERY DESTINATION`](../commands/set-quer-destination) allows you to make a query that does not change the selection nor the current record. + +## Record locking + +4D and 4D Server automatically manage databases by preventing multi-user or multi-process conflicts. Two users or two processes cannot modify the same record or object at the same time. However, the second user or process can have read-only access to the record or object at the same time. + +There are several reasons for using the multi-user commands: + +- Modifying records by using the language. +- Using a custom user interface for multi-user operations. +- Saving related modifications inside a transaction. + +There are three important concepts to be aware of when using commands in a multi-processing database: + +1. In a process, each table is in either a read-only or a read/write state. +2. Records become locked when they are loaded and unlocked when they are unloaded. +3. A locked record cannot be modified. + +As a convention in the following sections, the person performing an operation on the multi-user database is referred to as the **local user**. Other people using the database are referred to as the **other users**. The discussion is from the perspective of the local user. Also, from a multi-process perspective, the process executing an operation on the database is the **current process**. Any other executing process is referred to as **other processes**. The discussion is from the point of view of the current process. + +### Locked Records + +A locked record cannot be modified by the local user or the current process. A locked record can be loaded, but cannot be modified. A record is locked when one of the other users or processes has successfully loaded the record for modification, or when the record is stacked. Only the user who is modifying the record sees that record as unlocked. All other users and processes see the record as locked, and therefore unavailable for modification. A table must be in a read/write state for a record to be loaded unlocked. + +### Read-Only and Read/Write States + +Each table in a database is in either a read/write or a read-only state for each user and process of the database. **Read-only** means that records for the table can be loaded but not modified. **Read/write** means that records for the table can be loaded and modified if no other user has locked the record first. + +Note that if you change the status of a table, the change takes effect for the next record loaded. If there is a record currently loaded when you change the table’s status, that record is not affected by the status change. + +#### Read-Only State + +When a table is read-only and a record is loaded, this record is always locked. In other words, locked records can be displayed, printed, and otherwise used, but they cannot be modified. + +Note that the read-only state applies only to editing existing records. A read-only state does not affect the creation of new records. You can still add records to a read-only table using [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record), or the menu commands of the Design environment (in this case, the records being created are locked for all other users/processes). Note that the [`ARRAY TO SELECTION`](../commands/array-to-selection) command is not affected by the read-only state since it can both create and modify records. + +4D automatically sets a table to read-only for commands that do not require write access to records. These commands are: [`DISPLAY SELECTION`](../commands/display-selection), [`DISTINCT VALUES`](../commands/distinct-values), [`EXPORT DIF`](../commands/export-dif), [`EXPORT SYLK`](../commands/export-sylk), [`EXPORT TEXT`](../commands/export-text), [`PRINT SELECTION`](../commands/print-selection), [`PRINT LABEL`](../commands/print-label), [`QR REPORT`](../commands/qr-report), [`SELECTION TO ARRAY`](../commands/selection-to-array), [`SELECTION RANGE TO ARRAY`](../commands/selection-range-to-array). + +You can find out the state of a table at any time using the [`Read only state`](../commands/read-only-state) function. + +Before executing any of these commands, 4D saves the current state of the table (read-only or read/write) for the current process. After the command has executed, this state is restored. + +#### Read/Write State + +When a table is read/write and a record is loaded, the record will become unlocked if no other user has locked the record first. If the record is locked by another user, the record is loaded as a locked record that cannot be modified by the local user. + +A table must be set to read/write and the record loaded for it to become unlocked and thus modifiable. + +If a user loads a record from a table in read/write mode, no other users can load that record for modification. However, other users can add records to the table, either through the [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record) commands or manually in the Design environment. + +Read/write is the default state for all tables when a database is opened and a new process is started. + +#### Changing the Status of a Table + +You can use the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands to change the state of a table. If you want to change the state of a table in order to make a record read-only or read/write, you must execute the command before this record is loaded. Any record that is already loaded is not affected by the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands. + +Each process has its own state (read-only or read/write) for each table in the database. + +By default, if you do not use the READ ONLY command, all tables are in read/write mode. + +### Loading, Modifying and Unloading Records + +Before the local user can modify a record, the table must be in the read/write state and the record must be loaded and unlocked. + +Any of the commands that loads a current record (if there is one) — such as [`NEXT RECORD`](../commands/next-record), [`QUERY`](../commands/query), [`ORDER BY`](../commands/order-by), [`RELATE ONE`](../commands/relate-one), etc. — sets the record state as locked or unlocked. The record is loaded according to the current state of its table (read-only or read/write) and its availability. A record may also be loaded for a related table by any of the commands that cause an automatic relation to be established. + +If a table is in the read-only state for a process or a user, then this table's records are loaded in read-only mode, which means they cannot be modified or deleted by this process or user. This is recommended for viewing or retrieving data because it does not prevent other users or processes from accessing the records of this table in read/write mode if necessary. + +If a table is in the read/write state for a process or a user, then any record from this table is also loaded in read/write mode, but only if no other user or process has already locked this record. If a record is successfully loaded in read/write mode, it is unlocked for the current process or user (it can be modified and saved) and is locked for all other users or processes. A table must be put into the read/write state before loading a record for modification and then saving it. + +If the record is to be modified, you use the Locked function to test whether or not a record is locked by another user. If a record is locked (Locked returns True), load the record with the [`LOAD RECORD`](../commands/load-record) command and again test whether or not the record is locked. This sequence must be continued until the record becomes unlocked (Locked returns False). + +When modifications to be made to a record are finished, the record must be released (and therefore unlocked for the other users) with [`UNLOAD RECORD`](../commands/unload-record). If a record is not unloaded, it will remain locked for all other users until a different current record is selected. Changing the current record of a table automatically unlocks the previous current record. You need to explicitly call [`UNLOAD RECORD`](../commands/unload-record) if you do not change the current record. This discussion applies to existing records. When a new record is created, it can be saved regardless of the state of the table to which it belongs. + +:::note + +When it is used in a transaction, the [`UNLOAD RECORD`](../commands/unload-record) command unloads the current record only for the process that manages the transaction. For other processes, the record stays locked as long as the transaction has not been validated (or cancelled). + +::: + +Use the [`LOCKED BY`](../commands/locked-by) command to see which user and/or process have locked a record. + +::: + +A good practice is to place all tables in read-only mode when each process is started (using the syntax [`READ ONLY(*)`](../commands/read-only)) then put each table in read/write mode only when necessary. Access to tables in read-only mode is faster and more memory-efficient. Moreover, changing the state of a table is optimized in client/server mode because it does not cause any additional network traffic: information is only sent to the server when executing a command that requires adequate access to the table. + +::: + +### Loops to Load Unlocked Records + +The following example shows the simplest loop with which to load an unlocked record: + +```4d + READ WRITE([Customers])//Set the table’s state to read/write + Repeat//Loop until the record is unlocked + LOAD RECORD([Customers])//Load record and set locked status + Until(Not(Locked([Customers]))) + //Do something to the record here + READ ONLY([Customers])//Set the table’s state to read-only +``` + +The loop continues until the record is unlocked. + +A loop like this is used only if the record is unlikely to be locked by anyone else, since the user would have to wait for the loop to terminate. Thus, it is unlikely that the loop would be used as is unless the record could only be modified by means of a method. + +The following example uses the previous loop to load an unlocked record and modify the record: + +```4d + READ WRITE([Inventory]) + Repeat //Loop until the record is unlocked + LOAD RECORD([Inventory]) //Load record and set it to locked + Until(Not(Locked([Inventory]))) + [Inventory]Part Qty:=[Inventory]Part Qty 1 //Modify the record + SAVE RECORD([Inventory]) //Save the record + UNLOAD RECORD([Inventory]) //Let other users modfiy it + READ ONLY([Inventory]) +``` + + +The [`MODIFY RECORD`](../commands/modify-record) command automatically notifies the user if a record is locked, and prevents the record from being modified. The following example avoids this automatic notification by first testing the record with the Locked function. If the record is locked, the user can cancel. + +This example efficiently checks to see if the current record is locked for the table [Commands]. If it is locked, the process is delayed by the procedure for one second. This technique can be used both in a multi-user or multi-process situation: + +```4d + Repeat + READ ONLY([Commands])//You do not need read/write right now + QUERY([Commands]) + //If the search was completed and some records were returned + If((OK=1) & (Records in selection([Commands])>0)) + READ WRITE([Commands])//Set the table to read/write state + LOAD RECORD([Commands]) + While(Locked([Commands]) & (OK=1)) `If the record is locked, + //loop until the record is unlocked + //Who is the record locked by? + LOCKED BY([Commands];$Process;$User;$SessionUser;$Name) + If($Process=-1)//Has the record been deleted? + ALERT("The record has been deleted in the meantime.") + OK:=0 + Else + If($User="")//Are you in single-user mode + $User:="you" + End if + CONFIRM("The record is already used by "+$User+" in the "+$Name+" Process.") + If(OK=1)//If you want to wait for a few seconds + DELAY PROCESS(Current process;120)//Wait for a few seconds + LOAD RECORD([Commands])//Try to load the record + End if + End if + End while + If(OK=1)//The record is unlocked + MODIFY RECORD([Commands])//You can modify the record + UNLOAD RECORD([Commands]) + End if + READ ONLY([Commands])//Switch back to read-only + OK:=1 + End if + Until(OK=0) +``` + + +### Using Commands in Multi-user or Multi-process Environment + +A number of commands in the language perform specific actions when they encounter a locked record. They behave normally if they do not encounter a locked record. + +Here is a list of these commands and their actions when a locked record is encountered. + +- [`MODIFY RECORD`](../commands/modify-record): Displays a dialog box stating that the record is in use. The record is not displayed, therefore the user cannot modify the record. In the Design environment, the record is shown in read-only state. +- [`MODIFY SELECTION`](../commands/modify-selection): Behaves normally except when the user double-clicks a record to modify it. [`MODIFY SELECTION`](../commands/modify-selection) displays dialog box stating that the record is in use and then allows read-only access to the record. +- [`APPLY TO SELECTION`](../commands/apply-to-selection): Loads a locked record, but does not modify it. [`APPLY TO SELECTION`](../commands/apply-to-selection) can be used to read information from the table without special care. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE SELECTION`](../commands/delete-selection): Does not delete any locked records; it skips them. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE RECORD`](../commands/delete-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`SAVE RECORD`](../commands/save-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`ARRAY TO SELECTION`](../commands/array-to-selection): Does not save any locked records. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`GOTO RECORD`](../commands/goto-record): Records in a multi-user/multi-process database may be deleted and added by other users, therefore the record numbers may change. Use caution when directly referencing a record by number in a multi-user database. +- [**Sets**](./sets.md): Take special care with sets, as the information that the set was based on may be changed by another user or process. diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md new file mode 100644 index 00000000000000..f1e42b3cc1c863 --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md @@ -0,0 +1,168 @@ +--- +id: sets +title: Sets +slug: /Develop/sets +displayed_sidebar: docs +--- + + +Sets offer you a powerful, swift means for manipulating record selections. Besides the ability to create sets, relate them to the current selection, and store, load, and clear sets, 4D offers three standard set operations: + +- Intersection +- Union +- Difference. + + +## Sets and the Current Selection + +A set is a compact representation of a selection of records. The idea of sets is closely bound to the idea of the current selection. Sets are generally used for the following purposes: + +- To save and later restore a selection when the order does not matter +- To access the selection a user made on screen (the `UserSet`) +- To perform a logical operation between selections. + +The current selection is a list of references that points to each record that is currently selected. The list exists in memory. Only currently selected records are in the list. A selection doesn’t actually contain the records, but only a list of references to the records. Each reference to a record takes 4 bytes in memory. When you work on a table, you always work with the records in the current selection. When a selection is sorted, only the list of references is rearranged. There is only one current selection for each table inside a process. + +Like a current selection, a set represents a selection of records. A set does this by using a very compact representation for each record. Each record is represented by one bit (one-eighth of a byte). Operations using sets are very fast, because computers can perform operations on bits very quickly. A set contains one bit for every record in the table, whether or not the record is included in the set. In fact, each bit is equal to 1 or 0, depending on whether or not the record is in the set. + +Sets are very economical in terms of RAM space. The size of a set, in bytes, is always equal to the total number of records in the table divided by 8. For example, if you create a set for a table containing 10,000 records, the set takes up 1,250 bytes, which is about 1.2K in RAM. + +There can be many sets for each table. In fact, sets can be saved to disk separately from the database. To change a record belonging to a set, first you must use the set as the current selection, then modify the record or records. + +A set is never in a sorted order—the records are simply indicated as belonging to the set or not. On the other hand, a named selection is in sorted order, but it requires more memory in most cases. For more information about named selections, see the Named Selections section. + +A set "remembers" which record was the current record at the time the set was created. The following table compares the concepts of the current selection and of sets: + +|Comparison|Current Selection|Sets| +|---|---|---| +|Number per table|1|0 to many| +|Sortable|Yes|No| +|Can be saved on disk|No|Yes| +|RAM per record(in bytes)|Number of selected records * 4|Total number of records/8| +|Combinable| No| Yes| +|Contains current record| Yes| Yes, as of the time the set was created| + +When you create a set, it belongs to the table from which you created it. Set operations can be performed only between sets belonging to the same table. + +Sets are independent from the data. This means that after changes are made to a file, a set may no longer be accurate. There are many operations that can cause a set to be inaccurate. For example, if you create a set of all the people from New York City, and then change the data in one of those records to “Boston” the set would not change, because the set is just a representation of a selection of records. Deleting records and replacing them with new ones also changes a set, as well as compacting the data. Sets can be guaranteed to be accurate only as long as the data in the original selection has not been changed. + +## Process and Interprocess Sets + +You can have the following three types of sets: + +- **Process sets**: A process set can only be accessed by the process in which it has been created. `LockedSet` is a process set. Process sets are cleared as soon as the process method ends. Process sets do not need any special prefix in the name. +- **Interprocess sets**: A set is an interprocess set if the name of the set is preceded by the symbols (<>) — a “less than” sign followed by a “greater than” sign. An interprocess set is “visible” to all the processes of the database. +In client/server mode, an interprocess set is “visible” to processes of the machine where it was created (client or server). +The name of an interprocess set must be unique in the database. +- **Local Sets/Client Sets**: Local/client sets are intended for use in client/server mode. The name of a local/client set is always preceded by the dollar sign ($) -- except for the UserSet system set. Unlike other types of sets, a local/client set is stored on the client machine. + +:::note Notes + +- The maximum size of a set name is 255 characters (excluding <> and $ symbols). +- For more information about the use of sets in client/server mode, please refer to 4D Server, Sets and Named Selections. + +::: + + +## Visibility of Sets + +The following table indicates the principles concerning the visibility of sets depending on their scope and where they were created: + + + +||Client Process|Other processes on the same client|Other clients|Server process|Other processes on the server| +|---|---|---|---|---|---| +|Creation in a client process |||||| +|$test|X ||||| +|test | X||| X(Trigger) || +|<>test | X|X |||| +|Creation in a server process|||||| +|$test|||| X|| +|test ||||X|| +|<>test||||X| X| + + +## Sets and Transactions + +A set can be created inside a [transaction](./transactions.md). It is possible to create a set of the records created inside a transaction and a set of records created or modified outside of a transaction. When the transaction ends, the set created during the transaction should be cleared, because it may not be an accurate representation of the records, especially if the transaction was canceled. + +## Example + +The following example deletes duplicate records from a table which contains information about people. A For...End for loop moves through all the records, comparing the current record to the previous record. If the name, address, and zip code are the same, then the record is added to a set. At the end of the loop, the set is made the current selection and the (old) current selection is deleted: + +```4d + CREATE EMPTY SET([People];"Duplicates") + // Create an empty set for duplicate records + ALL RECORDS([People]) + // Select all records + // Sort the records by ZIP, address, and name so + // that the duplicates will be next to each other + ORDER BY([People];[People]ZIP;>;[People]Address;>;[People]Name;>) + // Initialize variables that hold the fields from the previous record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + // Go to second record to compare with first + NEXT RECORD([People]) + For($i;2;Records in table([People])) + // Loop through records starting at 2 + // If the name, address, and ZIP are the same as the + // previous record then it is a duplicate record. + If(([People]Name=$Name) & ([People]Address=$Address) & ([People]ZIP=$ZIP)) + // Add current record (the duplicate) to set + ADD TO SET([People];"Duplicates") + Else + // Save this record’s name, address, and ZIP for comparison with the next record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + End if + // Move to the next record + NEXT RECORD([People]) + End for + // Use duplicate records that were found + USE SET("Duplicates") + // Delete the duplicate records + DELETE SELECTION([People]) + // Remove the set from memory + CLEAR SET("Duplicates") +``` + +As an alternative to immediately deleting records at the end of the method, you could display them on screen or print them, so that a more detailed comparison can be made. + + +## The UserSet System Set + +4D maintains a system set named `UserSet`, which automatically stores the most recent selection of records highlighted on screen by the user. Thus, you can display a group of records with [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection), ask the user to select from among them and turn the results of that manual selection into a selection or into a set that you name. + +::info 4D Server + +Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection), [`UNION`](../commands/union) and [`DIFFERENCE`](../commands/difference), make sure you compare `UserSet` only to client sets. + +::: + +There is only one `UserSet` for a [process](../Develop/processes.md). Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. + +4D manages the `UserSet` set for list forms displayed in Design mode or using the [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection) commands. However, this mechanism is not active for [subforms](../FormObjects/subform_overview.md). + +The following method illustrates how you can display records, allow the user to select some of them, and then use UserSet to display the selected records: + +```4d + // Display all records and allow user to select any number of them. + // Then display this selection by using UserSet to change the current selection. + FORM SET OUTPUT([People];"Display") // Set the output layout + ALL RECORDS([People]) // Select all people + ALERT("Press Ctrl or Command and Click to select the people required.") + DISPLAY SELECTION([People]) // Display the people + USE SET("UserSet") // Use the people that were selected + ALERT("You chose the following people.") + DISPLAY SELECTION([People]) // Display the selected people +``` + +## The LockedSet System Set + +The [`APPLY TO SELECTION`](../commands/apply-to-selection), [`DELETE SELECTION`](../commands/delete-selection), [`ARRAY TO SELECTION`](../commands/array-to-selection) and [`JSON TO SELECTION`](../commands/json-to-selection) commands create a set named `LockedSet` when used in a multi-processing environment. + +Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the [`SET QUERY AND LOCK`](../commands/set-query-and-lock) command). + +`LockedSet` indicates which records were locked during the execution of the command. \ No newline at end of file diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md new file mode 100644 index 00000000000000..6691cfcb0e545c --- /dev/null +++ b/i18n/fr/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md @@ -0,0 +1,157 @@ +--- +id: xml +title: XML Processing +slug: /Develop/XML +displayed_sidebar: docs +--- + + +## Overview of XML Commands + +### XML, DOM, and SAX + +The [**XML** theme](../commands/theme/XML.md) groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. + +4D also offers two separate sets of XML commands: [**DOM**](../commands/theme/XML_DOM.md) (Document Object Model) and [**SAX**](../commands/theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. + +- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. +- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. + +### References + +http://www.saxproject.org/?selected=event
+http://www.w3schools.com/xml/ + +:::note + +For XML support, 4D uses the [Xerces.dll library](../Notes/updates.md#library-table) developed by the Apache Foundation company. + +::: + + +### Preemptive mode + +XML references created by a [preemptive process](../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. + + +### Character Sets + +The following character sets are supported by the XML DOM and XML SAX commands of 4D: + +- ASCII +- UTF-8 +- UTF-16 (Big/Small Endian) +- UCS4 (Big/Small Endian) +- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, +- ISO-8859-1 (or Latin1) +- Windows-1252. + + +### Glossary + +This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. + +- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. +- **Child**: In an XML structure, an element in a level directly below another. +- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. +- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. +- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. +- **Parent**: In an XML structure, an element in a level directly above another. +- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. +- **Root**: An element located at the first level of an XML structure. +- **Sibling**: An element at the same level as another. +- **Structure**: structured XML object. This object can be a document, a variable, or an element. +- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. +- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. +- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. +- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. + + +## XML DOM Commands + +### Creating, opening and closing XML documents via DOM + +Objects created, modified or parsed by the [4D XML DOM commands](../commands/theme/XML_DOM.md) can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../commands/dom-parse-xml-variable). + +Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../commands/dom-close-xml) command to close the source in the end. + +Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. + + +### Support of XPath notation + +Several XML DOM commands ([`DOM Create XML element`](../commands/dom-create-xml-element), [`DOM Find XML element`](../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. + +XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. + +For example, given the following structure: + +```xml + + + + + + + +``` + +XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. + +4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: + +```xml + + + aaa + bbb + ccc + + +``` + +XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. + +For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../commands/dom-find-xml-element) command description. + +:::note Compatibility + +Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../settings/compatibility.md). + +::: + +### Error Handling + +Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. + +In addition, the reference returned in this case is a sequence of 32 zero "0" characters. + + +## XML SAX Commands + +### Creating, opening and closing XML documents via SAX + +The [XML SAX commands](../commands/theme/XML_SAX.md) work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../commands/send-packet) or [`Append document`](../commands/append-document). + +The creation and opening of XML documents by programming is carried out using the [`Create document`](../commands/create-document) and [`Open document`](../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. + +:::note + +Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. + +::: + +Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../commands/close-document) command. If any XML elements were open, they will be closed automatically. + +### About end-of-line characters and BOM management + +When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: + +- CRLF characters on Windows and LF on macOS for end-of-line characters +- files are written without BOM. + +:::note Compatibility + +In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../commands/xml-set-options) command and a [Compatibility setting](../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../commands/xml-set-options) command before the first SAX writing command. + +::: diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md new file mode 100644 index 00000000000000..f4c532758ef675 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md @@ -0,0 +1,91 @@ +--- +id: legacy-to-import +title: develop-legacy +draft: true +--- + + + + +## セマフォ + +セマフォを使用すると、2つ以上のプロセスが同じリソース (ファイル、レコードなど) を同時に変更しないようにできます。セマフォを設定したプロセスのみが、それを解除できます。 + +:::info + +[シグナル](../API/SignalClass.md) もインタラクションの管理に使用できます。シグナルを使用すると、1つ以上のプロセスが特定のタスクの完了を待ってから実行を続行するようにできます。任意のプロセスがシグナルを待機したり、解放したりできます。 + +::: + +### セマフォとは何か? + +コンピュータープログラムにおいて、セマフォは、一度に1つのプロセスまたはユーザーのみが実行する必要のあるアクションを保護するために使用されるツールです。 + +4Dにおいてセマフォを使用する一般的なニーズは、プロセス間配列を変更することにあります。あるプロセスが配列の値を変更している場合、別のプロセスが同時に同じことをできてはなりません。開発者はセマフォを使用して、他のプロセスがすでに同じタスクを実行していない場合にのみ、プロセスが一連の処理を実行できることを示します。プロセスがセマフォに遭遇したとき、3つの可能性があります: + +- ただちに通過する権利を得る +- 通過する権利を得るまで順番を待つ +- タスクの実行をあきらめて、そのまま進む。 + +したがって、セマフォはコードの一部を保護します。一度に1つのプロセスのみを通過させ、現在使用権を保持しているプロセスがセマフォを解放してその権利を手放すまでアクセスをブロックします。 + +### セマフォを操作するためのコマンド + +4Dでは、[`Semaphore`](../commands/sempahore) コマンドを呼び出してセマフォを設定します。セマフォを解放するには、[`CLEAR SEMAPHORE`](../commands/clear-sempahore) コマンドを呼び出します。 + +[`Semaphore`](../commands/sempahore) コマンドは、潜在的に2つのアクションを同時に実行するため、非常に特殊な動作をします: + +- セマフォがすでに割り当てられている場合、関数は **True** を返します +- セマフォが割り当てられていない場合、関数はそれをプロセスに割り当て、同時に **False** を返します。 + +同じコマンドによっておこなわれるこの二重のアクションは、セマフォのテストとその割り当てのあいだに外部の操作が挿入されないことを保証します。 + +[`Test semaphore`](../commands/test-semaphore) コマンドを使用すると、セマフォがすでに割り当てられているかどうかを知ることができます。このコマンドは主に、年次の決算処理などの長時間にわたる操作の一環として使用され、[`Test semaphore`](../commands/test-semaphore) を使うことで、会計データの追加などの特定の操作へのアクセスを防ぐようにインターフェースを制御できます。 + +### セマフォの使用方法 + +セマフォは、次の原則に従って使用する必要があります: + +- セマフォは同じメソッド内で設定し、解放しなければなりません。 +- セマフォによって保護されるコードの実行は、できる限り短くしなければなりません。 +- セマフォの解放を待つために、コードは [`Semaphore`](../commands/sempahore) コマンドの tickCount 引数によってタイミングを設定しなければなりません。 + +セマフォを使用する典型的なコードは次のとおりです: + +```4d + While(Semaphore("MySemaphore";300)) + IDLE + End while + // セマフォによって保護されるコードをここに置く + CLEAR SEMAPHORE("MySemaphore") +``` + +解放されないセマフォは、データベースの一部をブロックする可能性があります。セマフォの設定と解放を同じメソッド内でおこなうことは、このリスクを排除するのに役立ちます。 + +セマフォによって保護されるコードを最小限に抑えることで、アプリケーションの流動性が高まり、セマフォがボトルネックとして機能するのを防ぎます。 + +最後に、[`Semaphore`](../commands/sempahore) コマンドのオプションの *tickCount* 引数を使用することは、セマフォの解放待ちを最適化するために不可欠です。この引数を使用すると、コマンドは次のように動作します: + +- プロセスは、コードの実行が次の行に進むことなく、セマフォが利用可能になるまで、指定された tick 数 (この例では300) を最大として待機します。 +- この制限の終了前にセマフォが解放された場合、それはただちにプロセスに割り当てられ (Semaphore は False を返します)、コードの実行が再開されます。 +- この制限の終了前にセマフォが解放されない場合、コードの実行が再開されます。 + +このコマンドは、待ち行列を確立することでリクエストに優先順位を付けることもします。このようにして、セマフォを最初にリクエストしたプロセスが最初にそれを取得します。待機時間は、アプリケーションの仕様に応じて設定されることに注意してください。 + +### ローカルセマフォまたはグローバルセマフォ + +4Dには2種類のセマフォがあります: ローカルセマフォとグローバルセマフォです。 + +- ローカルセマフォは、同じワークステーション上のすべてのプロセスからアクセス可能で、そのワークステーション上でのみアクセスできます。ローカルセマフォは、セマフォの名前にドル記号 ($) を接頭辞として付けることで作成できます。ローカルセマフォは、同じワークステーション上で実行されるプロセス間の操作を監視するために使用します。たとえば、ローカルセマフォは、シングルユーザーデータベースまたはワークステーション上のすべてのプロセスによって共有されるプロセス間配列へのアクセスを監視するために使用できます。 +- グローバルセマフォは、すべてのユーザーとそのすべてのプロセスからアクセス可能です。グローバルセマフォは、マルチユーザーデータベースのユーザー間の操作を監視するために使用します。 + +グローバルセマフォとローカルセマフォは、その論理においては同一です。違いはそのスコープにあります。 + +クライアント/サーバーにおいて、グローバルセマフォは、すべてのクライアントとサーバー上で実行されるすべてのプロセス間で共有されます。ローカルセマフォは、それが作成されたマシン上で実行されるプロセス間でのみ共有されます。 + +シングルユーザーの4Dアプリケーションでは、あなたが唯一のユーザーであるため、グローバルセマフォとローカルセマフォは同じスコープを持ちます。ただし、データベースが両方の構成で使用されている場合は、おこないたいことに応じてグローバルセマフォまたはローカルセマフォを使用するようにしてください。 + +**注:** インターフェースやプロセス間変数の配列など、アプリケーションのクライアントのローカルな側面を管理するためにセマフォが必要な場合は、ローカルセマフォの使用を推奨します。この場合にグローバルセマフォを使用すると、不要なネットワーク交換を引き起こすだけでなく、他のクライアントマシンに不必要に影響を与える可能性もあります。ローカルセマフォを使用すれば、これらの望ましくない副作用を回避できます。 + + + \ No newline at end of file diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md new file mode 100644 index 00000000000000..793f5e5c9dbd03 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md @@ -0,0 +1,7 @@ +--- +id: overview +title: 4D database overview +--- + +## Description + diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/records.md b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/records.md new file mode 100644 index 00000000000000..25e1705847e48e --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/records.md @@ -0,0 +1,308 @@ +--- +id: records +title: Records +slug: /Develop/records +displayed_sidebar: docs +--- + + +## Record numbers + +There are three numbers associated with a record: + +- Record number +- Selected record number +- Sequence number + +### Record Number + +The record number is the absolute/physical record number for a record. A record number is automatically assigned to each new record and remains constant for the record until the record is deleted. Record numbers start at zero. They are not unique because record numbers of deleted records are reused for new records. They also change when the database is [compacted](../MSC/compact.md) or [repaired](../MSC/repair.md). + +### Selected Record Number + +The selected record number is the position of the record in the current selection, and so depends on the current selection. If the selection is changed or sorted, the selected record number will probably change. Numbering for the selected record number starts at one (1). + +### Sequence Number + +The sequence number is a unique non-repeating number that may be assigned to a field of a record (via the Autoincrement property, the SQL AUTO_INCREMENT attribute or the [`Sequence number`](../commands/sequence-number) command). It is not automatically stored with each record. It starts by default at 1 and is incremented for each new record that is created. Unlike record numbers, a sequence number is not reused when a record is deleted or when a database is compacted or repaired. Sequence numbers provide a way to have unique ID numbers for records. If a sequence number is incremented during a transaction, the number is not decremented if the transaction is canceled. + +:::note Notes + +- 4D does not carry out any check when you modify the automatic number internal counter of a table using the [`SET DATABASE PARAMETER`](../commands/set-database-parameter) command. If you decrement this counter, the new records created may have numbers that have already been assigned. +- Sequence numbers are not recommended to fill unique ID primary key fields for records. To create unique record IDs, it is strongly recommended to use UUIDs. + +::: + +### Example + +The following tables illustrate the numbers that are associated with records. Each line in the table represents information about a record. The order of the lines is the order in which records would be displayed in an output form. + +- **Data**: The data from a field in each record. For our example, it contains a person’s name. +- **Record Number**: The record’s absolute record number. This is the number returned by the [`Record number`](../commands/record-number) command. +- **Selected Record Number**: The record’s position in the current selection. This is the number returned by the [`Selected record number`](../commands/selected-record-number) command. +- **Sequence Number**: The record’s unique sequence number. This is the number returned by the [`Sequence number`](../commands/sequence-number) command when the record was created. This number is stored in a field. + +#### After the Records Are Entered + +The first table shows the records after they are entered. + +- The default order for the records is by record number. +- The record number starts at 0. +- The selected record number and the sequence number start at 1. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Sam| 3 |4 |4| +|Lisa| 4| 5 |5| + +Note: The records remain in the default order after a command changes the current selection without reordering it; for example, after the **Show All** menu command is chosen in the Design environment, or after the [`ALL RECORDS`](../commands/all-records) command is executed. + +#### After the Records Are Sorted + +The next table shows the same records sorted by name. + +- The same record number remains associated with each record. +- The selected record numbers reflect the new position of the records in the sorted selection. +- The sequence numbers never change, since they were assigned when each record was created and are stored in the record. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Sam| 3 |3 |4| +|Terri| 1 |4 |2| +|Tess |0| 5| 1| + + +#### After a Record Is Deleted + +The following table shows the records after Sam is deleted. + +- Only the selected record numbers have changed. Selected record numbers reflect the order in which the records are displayed. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Terri| 1 |3 |2| +|Tess |0| 4| 1| + + +#### After a Record Is Added + +The next table shows the records after a new record has been added for Liz. + +- A new record is added to the end of the current selection. +- Sam’s record number is reused for the new record. +- The sequence number continues to increment. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Lisa| 4| 4 |5| +|Liz |3| 5| 6| + +#### After the Selection is Changed and Sorted + +The following table shows the records after the selection was reduced to three records and then sorted. + +- Only the selected record number associated with each record changes. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Sabra| 2|1| 3| +|Liz |3| 2| 6| +|Terri| 1 |3 |2| + +## Record Stack + +The [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) commands allow you to put (“push”) records onto the record stack, and to remove (“pop”) them from the stack. + +Each process has its own record stack for each table. 4D maintains the record stacks for you. Each record stack is a last-in-first-out (LIFO) stack. Stack capacity is limited by memory. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) should be used with discretion. Each record that is pushed uses part of free memory. Pushing too many records can cause an out-of-memory or stack full condition. + +4D clears the stack of any unpopped records when you return to the menu at the end of execution of your method. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) are useful when you want to examine records in the same file during data entry. To do this, you push the record, search and examine records in the file (copy fields into variables, for example), and finally pop the record to restore the record. + +While entering a record, if you have to check a multiple field unique value, use the [`SET QUERY DESTINATION`](../commands/set-quer-destination) command. This will save you the calls to [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) that you were making before and after the call to QUERY in order to preserve the data entered in the current record. [`SET QUERY DESTINATION`](../commands/set-quer-destination) allows you to make a query that does not change the selection nor the current record. + +## Record locking + +4D and 4D Server automatically manage databases by preventing multi-user or multi-process conflicts. Two users or two processes cannot modify the same record or object at the same time. However, the second user or process can have read-only access to the record or object at the same time. + +There are several reasons for using the multi-user commands: + +- Modifying records by using the language. +- Using a custom user interface for multi-user operations. +- Saving related modifications inside a transaction. + +There are three important concepts to be aware of when using commands in a multi-processing database: + +1. In a process, each table is in either a read-only or a read/write state. +2. Records become locked when they are loaded and unlocked when they are unloaded. +3. A locked record cannot be modified. + +As a convention in the following sections, the person performing an operation on the multi-user database is referred to as the **local user**. Other people using the database are referred to as the **other users**. The discussion is from the perspective of the local user. Also, from a multi-process perspective, the process executing an operation on the database is the **current process**. Any other executing process is referred to as **other processes**. The discussion is from the point of view of the current process. + +### Locked Records + +A locked record cannot be modified by the local user or the current process. A locked record can be loaded, but cannot be modified. A record is locked when one of the other users or processes has successfully loaded the record for modification, or when the record is stacked. Only the user who is modifying the record sees that record as unlocked. All other users and processes see the record as locked, and therefore unavailable for modification. A table must be in a read/write state for a record to be loaded unlocked. + +### Read-Only and Read/Write States + +Each table in a database is in either a read/write or a read-only state for each user and process of the database. **Read-only** means that records for the table can be loaded but not modified. **Read/write** means that records for the table can be loaded and modified if no other user has locked the record first. + +Note that if you change the status of a table, the change takes effect for the next record loaded. If there is a record currently loaded when you change the table’s status, that record is not affected by the status change. + +#### Read-Only State + +When a table is read-only and a record is loaded, this record is always locked. In other words, locked records can be displayed, printed, and otherwise used, but they cannot be modified. + +Note that the read-only state applies only to editing existing records. A read-only state does not affect the creation of new records. You can still add records to a read-only table using [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record), or the menu commands of the Design environment (in this case, the records being created are locked for all other users/processes). Note that the [`ARRAY TO SELECTION`](../commands/array-to-selection) command is not affected by the read-only state since it can both create and modify records. + +4D automatically sets a table to read-only for commands that do not require write access to records. These commands are: [`DISPLAY SELECTION`](../commands/display-selection), [`DISTINCT VALUES`](../commands/distinct-values), [`EXPORT DIF`](../commands/export-dif), [`EXPORT SYLK`](../commands/export-sylk), [`EXPORT TEXT`](../commands/export-text), [`PRINT SELECTION`](../commands/print-selection), [`PRINT LABEL`](../commands/print-label), [`QR REPORT`](../commands/qr-report), [`SELECTION TO ARRAY`](../commands/selection-to-array), [`SELECTION RANGE TO ARRAY`](../commands/selection-range-to-array). + +You can find out the state of a table at any time using the [`Read only state`](../commands/read-only-state) function. + +Before executing any of these commands, 4D saves the current state of the table (read-only or read/write) for the current process. After the command has executed, this state is restored. + +#### Read/Write State + +When a table is read/write and a record is loaded, the record will become unlocked if no other user has locked the record first. If the record is locked by another user, the record is loaded as a locked record that cannot be modified by the local user. + +A table must be set to read/write and the record loaded for it to become unlocked and thus modifiable. + +If a user loads a record from a table in read/write mode, no other users can load that record for modification. However, other users can add records to the table, either through the [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record) commands or manually in the Design environment. + +Read/write is the default state for all tables when a database is opened and a new process is started. + +#### Changing the Status of a Table + +You can use the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands to change the state of a table. If you want to change the state of a table in order to make a record read-only or read/write, you must execute the command before this record is loaded. Any record that is already loaded is not affected by the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands. + +Each process has its own state (read-only or read/write) for each table in the database. + +By default, if you do not use the READ ONLY command, all tables are in read/write mode. + +### Loading, Modifying and Unloading Records + +Before the local user can modify a record, the table must be in the read/write state and the record must be loaded and unlocked. + +Any of the commands that loads a current record (if there is one) — such as [`NEXT RECORD`](../commands/next-record), [`QUERY`](../commands/query), [`ORDER BY`](../commands/order-by), [`RELATE ONE`](../commands/relate-one), etc. — sets the record state as locked or unlocked. The record is loaded according to the current state of its table (read-only or read/write) and its availability. A record may also be loaded for a related table by any of the commands that cause an automatic relation to be established. + +If a table is in the read-only state for a process or a user, then this table's records are loaded in read-only mode, which means they cannot be modified or deleted by this process or user. This is recommended for viewing or retrieving data because it does not prevent other users or processes from accessing the records of this table in read/write mode if necessary. + +If a table is in the read/write state for a process or a user, then any record from this table is also loaded in read/write mode, but only if no other user or process has already locked this record. If a record is successfully loaded in read/write mode, it is unlocked for the current process or user (it can be modified and saved) and is locked for all other users or processes. A table must be put into the read/write state before loading a record for modification and then saving it. + +If the record is to be modified, you use the Locked function to test whether or not a record is locked by another user. If a record is locked (Locked returns True), load the record with the [`LOAD RECORD`](../commands/load-record) command and again test whether or not the record is locked. This sequence must be continued until the record becomes unlocked (Locked returns False). + +When modifications to be made to a record are finished, the record must be released (and therefore unlocked for the other users) with [`UNLOAD RECORD`](../commands/unload-record). If a record is not unloaded, it will remain locked for all other users until a different current record is selected. Changing the current record of a table automatically unlocks the previous current record. You need to explicitly call [`UNLOAD RECORD`](../commands/unload-record) if you do not change the current record. This discussion applies to existing records. When a new record is created, it can be saved regardless of the state of the table to which it belongs. + +:::note + +When it is used in a transaction, the [`UNLOAD RECORD`](../commands/unload-record) command unloads the current record only for the process that manages the transaction. For other processes, the record stays locked as long as the transaction has not been validated (or cancelled). + +::: + +Use the [`LOCKED BY`](../commands/locked-by) command to see which user and/or process have locked a record. + +::: + +A good practice is to place all tables in read-only mode when each process is started (using the syntax [`READ ONLY(*)`](../commands/read-only)) then put each table in read/write mode only when necessary. Access to tables in read-only mode is faster and more memory-efficient. Moreover, changing the state of a table is optimized in client/server mode because it does not cause any additional network traffic: information is only sent to the server when executing a command that requires adequate access to the table. + +::: + +### Loops to Load Unlocked Records + +The following example shows the simplest loop with which to load an unlocked record: + +```4d + READ WRITE([Customers])//Set the table’s state to read/write + Repeat//Loop until the record is unlocked + LOAD RECORD([Customers])//Load record and set locked status + Until(Not(Locked([Customers]))) + //Do something to the record here + READ ONLY([Customers])//Set the table’s state to read-only +``` + +The loop continues until the record is unlocked. + +A loop like this is used only if the record is unlikely to be locked by anyone else, since the user would have to wait for the loop to terminate. Thus, it is unlikely that the loop would be used as is unless the record could only be modified by means of a method. + +The following example uses the previous loop to load an unlocked record and modify the record: + +```4d + READ WRITE([Inventory]) + Repeat //Loop until the record is unlocked + LOAD RECORD([Inventory]) //Load record and set it to locked + Until(Not(Locked([Inventory]))) + [Inventory]Part Qty:=[Inventory]Part Qty 1 //Modify the record + SAVE RECORD([Inventory]) //Save the record + UNLOAD RECORD([Inventory]) //Let other users modfiy it + READ ONLY([Inventory]) +``` + + +The [`MODIFY RECORD`](../commands/modify-record) command automatically notifies the user if a record is locked, and prevents the record from being modified. The following example avoids this automatic notification by first testing the record with the Locked function. If the record is locked, the user can cancel. + +This example efficiently checks to see if the current record is locked for the table [Commands]. If it is locked, the process is delayed by the procedure for one second. This technique can be used both in a multi-user or multi-process situation: + +```4d + Repeat + READ ONLY([Commands])//You do not need read/write right now + QUERY([Commands]) + //If the search was completed and some records were returned + If((OK=1) & (Records in selection([Commands])>0)) + READ WRITE([Commands])//Set the table to read/write state + LOAD RECORD([Commands]) + While(Locked([Commands]) & (OK=1)) `If the record is locked, + //loop until the record is unlocked + //Who is the record locked by? + LOCKED BY([Commands];$Process;$User;$SessionUser;$Name) + If($Process=-1)//Has the record been deleted? + ALERT("The record has been deleted in the meantime.") + OK:=0 + Else + If($User="")//Are you in single-user mode + $User:="you" + End if + CONFIRM("The record is already used by "+$User+" in the "+$Name+" Process.") + If(OK=1)//If you want to wait for a few seconds + DELAY PROCESS(Current process;120)//Wait for a few seconds + LOAD RECORD([Commands])//Try to load the record + End if + End if + End while + If(OK=1)//The record is unlocked + MODIFY RECORD([Commands])//You can modify the record + UNLOAD RECORD([Commands]) + End if + READ ONLY([Commands])//Switch back to read-only + OK:=1 + End if + Until(OK=0) +``` + + +### Using Commands in Multi-user or Multi-process Environment + +A number of commands in the language perform specific actions when they encounter a locked record. They behave normally if they do not encounter a locked record. + +Here is a list of these commands and their actions when a locked record is encountered. + +- [`MODIFY RECORD`](../commands/modify-record): Displays a dialog box stating that the record is in use. The record is not displayed, therefore the user cannot modify the record. In the Design environment, the record is shown in read-only state. +- [`MODIFY SELECTION`](../commands/modify-selection): Behaves normally except when the user double-clicks a record to modify it. [`MODIFY SELECTION`](../commands/modify-selection) displays dialog box stating that the record is in use and then allows read-only access to the record. +- [`APPLY TO SELECTION`](../commands/apply-to-selection): Loads a locked record, but does not modify it. [`APPLY TO SELECTION`](../commands/apply-to-selection) can be used to read information from the table without special care. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE SELECTION`](../commands/delete-selection): Does not delete any locked records; it skips them. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE RECORD`](../commands/delete-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`SAVE RECORD`](../commands/save-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`ARRAY TO SELECTION`](../commands/array-to-selection): Does not save any locked records. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`GOTO RECORD`](../commands/goto-record): Records in a multi-user/multi-process database may be deleted and added by other users, therefore the record numbers may change. Use caution when directly referencing a record by number in a multi-user database. +- [**Sets**](./sets.md): Take special care with sets, as the information that the set was based on may be changed by another user or process. diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md new file mode 100644 index 00000000000000..f1e42b3cc1c863 --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md @@ -0,0 +1,168 @@ +--- +id: sets +title: Sets +slug: /Develop/sets +displayed_sidebar: docs +--- + + +Sets offer you a powerful, swift means for manipulating record selections. Besides the ability to create sets, relate them to the current selection, and store, load, and clear sets, 4D offers three standard set operations: + +- Intersection +- Union +- Difference. + + +## Sets and the Current Selection + +A set is a compact representation of a selection of records. The idea of sets is closely bound to the idea of the current selection. Sets are generally used for the following purposes: + +- To save and later restore a selection when the order does not matter +- To access the selection a user made on screen (the `UserSet`) +- To perform a logical operation between selections. + +The current selection is a list of references that points to each record that is currently selected. The list exists in memory. Only currently selected records are in the list. A selection doesn’t actually contain the records, but only a list of references to the records. Each reference to a record takes 4 bytes in memory. When you work on a table, you always work with the records in the current selection. When a selection is sorted, only the list of references is rearranged. There is only one current selection for each table inside a process. + +Like a current selection, a set represents a selection of records. A set does this by using a very compact representation for each record. Each record is represented by one bit (one-eighth of a byte). Operations using sets are very fast, because computers can perform operations on bits very quickly. A set contains one bit for every record in the table, whether or not the record is included in the set. In fact, each bit is equal to 1 or 0, depending on whether or not the record is in the set. + +Sets are very economical in terms of RAM space. The size of a set, in bytes, is always equal to the total number of records in the table divided by 8. For example, if you create a set for a table containing 10,000 records, the set takes up 1,250 bytes, which is about 1.2K in RAM. + +There can be many sets for each table. In fact, sets can be saved to disk separately from the database. To change a record belonging to a set, first you must use the set as the current selection, then modify the record or records. + +A set is never in a sorted order—the records are simply indicated as belonging to the set or not. On the other hand, a named selection is in sorted order, but it requires more memory in most cases. For more information about named selections, see the Named Selections section. + +A set "remembers" which record was the current record at the time the set was created. The following table compares the concepts of the current selection and of sets: + +|Comparison|Current Selection|Sets| +|---|---|---| +|Number per table|1|0 to many| +|Sortable|Yes|No| +|Can be saved on disk|No|Yes| +|RAM per record(in bytes)|Number of selected records * 4|Total number of records/8| +|Combinable| No| Yes| +|Contains current record| Yes| Yes, as of the time the set was created| + +When you create a set, it belongs to the table from which you created it. Set operations can be performed only between sets belonging to the same table. + +Sets are independent from the data. This means that after changes are made to a file, a set may no longer be accurate. There are many operations that can cause a set to be inaccurate. For example, if you create a set of all the people from New York City, and then change the data in one of those records to “Boston” the set would not change, because the set is just a representation of a selection of records. Deleting records and replacing them with new ones also changes a set, as well as compacting the data. Sets can be guaranteed to be accurate only as long as the data in the original selection has not been changed. + +## Process and Interprocess Sets + +You can have the following three types of sets: + +- **Process sets**: A process set can only be accessed by the process in which it has been created. `LockedSet` is a process set. Process sets are cleared as soon as the process method ends. Process sets do not need any special prefix in the name. +- **Interprocess sets**: A set is an interprocess set if the name of the set is preceded by the symbols (<>) — a “less than” sign followed by a “greater than” sign. An interprocess set is “visible” to all the processes of the database. +In client/server mode, an interprocess set is “visible” to processes of the machine where it was created (client or server). +The name of an interprocess set must be unique in the database. +- **Local Sets/Client Sets**: Local/client sets are intended for use in client/server mode. The name of a local/client set is always preceded by the dollar sign ($) -- except for the UserSet system set. Unlike other types of sets, a local/client set is stored on the client machine. + +:::note Notes + +- The maximum size of a set name is 255 characters (excluding <> and $ symbols). +- For more information about the use of sets in client/server mode, please refer to 4D Server, Sets and Named Selections. + +::: + + +## Visibility of Sets + +The following table indicates the principles concerning the visibility of sets depending on their scope and where they were created: + + + +||Client Process|Other processes on the same client|Other clients|Server process|Other processes on the server| +|---|---|---|---|---|---| +|Creation in a client process |||||| +|$test|X ||||| +|test | X||| X(Trigger) || +|<>test | X|X |||| +|Creation in a server process|||||| +|$test|||| X|| +|test ||||X|| +|<>test||||X| X| + + +## Sets and Transactions + +A set can be created inside a [transaction](./transactions.md). It is possible to create a set of the records created inside a transaction and a set of records created or modified outside of a transaction. When the transaction ends, the set created during the transaction should be cleared, because it may not be an accurate representation of the records, especially if the transaction was canceled. + +## Example + +The following example deletes duplicate records from a table which contains information about people. A For...End for loop moves through all the records, comparing the current record to the previous record. If the name, address, and zip code are the same, then the record is added to a set. At the end of the loop, the set is made the current selection and the (old) current selection is deleted: + +```4d + CREATE EMPTY SET([People];"Duplicates") + // Create an empty set for duplicate records + ALL RECORDS([People]) + // Select all records + // Sort the records by ZIP, address, and name so + // that the duplicates will be next to each other + ORDER BY([People];[People]ZIP;>;[People]Address;>;[People]Name;>) + // Initialize variables that hold the fields from the previous record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + // Go to second record to compare with first + NEXT RECORD([People]) + For($i;2;Records in table([People])) + // Loop through records starting at 2 + // If the name, address, and ZIP are the same as the + // previous record then it is a duplicate record. + If(([People]Name=$Name) & ([People]Address=$Address) & ([People]ZIP=$ZIP)) + // Add current record (the duplicate) to set + ADD TO SET([People];"Duplicates") + Else + // Save this record’s name, address, and ZIP for comparison with the next record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + End if + // Move to the next record + NEXT RECORD([People]) + End for + // Use duplicate records that were found + USE SET("Duplicates") + // Delete the duplicate records + DELETE SELECTION([People]) + // Remove the set from memory + CLEAR SET("Duplicates") +``` + +As an alternative to immediately deleting records at the end of the method, you could display them on screen or print them, so that a more detailed comparison can be made. + + +## The UserSet System Set + +4D maintains a system set named `UserSet`, which automatically stores the most recent selection of records highlighted on screen by the user. Thus, you can display a group of records with [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection), ask the user to select from among them and turn the results of that manual selection into a selection or into a set that you name. + +::info 4D Server + +Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection), [`UNION`](../commands/union) and [`DIFFERENCE`](../commands/difference), make sure you compare `UserSet` only to client sets. + +::: + +There is only one `UserSet` for a [process](../Develop/processes.md). Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. + +4D manages the `UserSet` set for list forms displayed in Design mode or using the [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection) commands. However, this mechanism is not active for [subforms](../FormObjects/subform_overview.md). + +The following method illustrates how you can display records, allow the user to select some of them, and then use UserSet to display the selected records: + +```4d + // Display all records and allow user to select any number of them. + // Then display this selection by using UserSet to change the current selection. + FORM SET OUTPUT([People];"Display") // Set the output layout + ALL RECORDS([People]) // Select all people + ALERT("Press Ctrl or Command and Click to select the people required.") + DISPLAY SELECTION([People]) // Display the people + USE SET("UserSet") // Use the people that were selected + ALERT("You chose the following people.") + DISPLAY SELECTION([People]) // Display the selected people +``` + +## The LockedSet System Set + +The [`APPLY TO SELECTION`](../commands/apply-to-selection), [`DELETE SELECTION`](../commands/delete-selection), [`ARRAY TO SELECTION`](../commands/array-to-selection) and [`JSON TO SELECTION`](../commands/json-to-selection) commands create a set named `LockedSet` when used in a multi-processing environment. + +Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the [`SET QUERY AND LOCK`](../commands/set-query-and-lock) command). + +`LockedSet` indicates which records were locked during the execution of the command. \ No newline at end of file diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md new file mode 100644 index 00000000000000..6691cfcb0e545c --- /dev/null +++ b/i18n/ja/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md @@ -0,0 +1,157 @@ +--- +id: xml +title: XML Processing +slug: /Develop/XML +displayed_sidebar: docs +--- + + +## Overview of XML Commands + +### XML, DOM, and SAX + +The [**XML** theme](../commands/theme/XML.md) groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. + +4D also offers two separate sets of XML commands: [**DOM**](../commands/theme/XML_DOM.md) (Document Object Model) and [**SAX**](../commands/theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. + +- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. +- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. + +### References + +http://www.saxproject.org/?selected=event
+http://www.w3schools.com/xml/ + +:::note + +For XML support, 4D uses the [Xerces.dll library](../Notes/updates.md#library-table) developed by the Apache Foundation company. + +::: + + +### Preemptive mode + +XML references created by a [preemptive process](../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. + + +### Character Sets + +The following character sets are supported by the XML DOM and XML SAX commands of 4D: + +- ASCII +- UTF-8 +- UTF-16 (Big/Small Endian) +- UCS4 (Big/Small Endian) +- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, +- ISO-8859-1 (or Latin1) +- Windows-1252. + + +### Glossary + +This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. + +- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. +- **Child**: In an XML structure, an element in a level directly below another. +- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. +- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. +- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. +- **Parent**: In an XML structure, an element in a level directly above another. +- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. +- **Root**: An element located at the first level of an XML structure. +- **Sibling**: An element at the same level as another. +- **Structure**: structured XML object. This object can be a document, a variable, or an element. +- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. +- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. +- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. +- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. + + +## XML DOM Commands + +### Creating, opening and closing XML documents via DOM + +Objects created, modified or parsed by the [4D XML DOM commands](../commands/theme/XML_DOM.md) can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../commands/dom-parse-xml-variable). + +Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../commands/dom-close-xml) command to close the source in the end. + +Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. + + +### Support of XPath notation + +Several XML DOM commands ([`DOM Create XML element`](../commands/dom-create-xml-element), [`DOM Find XML element`](../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. + +XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. + +For example, given the following structure: + +```xml + + + + + + + +``` + +XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. + +4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: + +```xml + + + aaa + bbb + ccc + + +``` + +XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. + +For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../commands/dom-find-xml-element) command description. + +:::note Compatibility + +Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../settings/compatibility.md). + +::: + +### Error Handling + +Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. + +In addition, the reference returned in this case is a sequence of 32 zero "0" characters. + + +## XML SAX Commands + +### Creating, opening and closing XML documents via SAX + +The [XML SAX commands](../commands/theme/XML_SAX.md) work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../commands/send-packet) or [`Append document`](../commands/append-document). + +The creation and opening of XML documents by programming is carried out using the [`Create document`](../commands/create-document) and [`Open document`](../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. + +:::note + +Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. + +::: + +Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../commands/close-document) command. If any XML elements were open, they will be closed automatically. + +### About end-of-line characters and BOM management + +When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: + +- CRLF characters on Windows and LF on macOS for end-of-line characters +- files are written without BOM. + +:::note Compatibility + +In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../commands/xml-set-options) command and a [Compatibility setting](../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../commands/xml-set-options) command before the first SAX writing command. + +::: diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md new file mode 100644 index 00000000000000..bec7326945fb92 --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/legacy-to-import.md @@ -0,0 +1,95 @@ +--- +id: legacy-to-import +title: develop-legacy +draft: true +--- + + + + +## Semáforos + +um semáforo lhe permite ter certeza de que dois ou mais processos não modifiquem o mesmo recurso ao mesmo tempo. Só o processo que define o semáforo pode eliminá-lo. + + +:::info + +[Signals](../API/SignalClass.md) can also be used to manage interactions. Signals allow you to make sure one or more process(es) will wait for a specific task to be completed before continuing execution. Any process can wait and/or release a signal. + +::: + +### O que é um semáforo? + +Em um programa de computador, um semáforo é uma ferramenta que é usada para proteger as ações que devem ser realizadas por um único processo ou usuário por vez. + +Em 4D, a necessidade convencional de uso de um semáforo é para modificar um array inter-processo: se um processo estiver modificando os valores do array, outro processo não deve poder fazer a mesma coisa ao mesmo tempo. O desenvolvedor utiliza um semáforo para indicar a um processo que só pode realizar sua sequência de operações se nenhum outro processo estiver realizando as mesmas tarefas. Quando um processo encontra com um semáforo, há três possibilidades: + +- Obtém imediatamente o direito a passar +- Espera seu turno até que obtém o direito a passar +- Continua seu caminho, abandonando a ideia de realizar as tarefas. + +Portanto, o semáforo protege partes do código. Se permite passar só um processo de cada vez e bloqueia o acesso até que o processo que possui atualmente o direito de uso renuncie a este direito, liberando o semáforo. + + +### Comandos para trabalhar com semáfoross + +Em 4D, um semáforo é estabelecido chamando a função Semaphore. Para liberar um semáforo, se chama o comando CLEAR SEMAPHORE. + +A função Semaphore tem um comportamento muito especial já que realiza potencialmente duas ações de cada vez: + +- Se o semáforo já estiver assignado, a função devolve True +- Se não for assignado o semáforo, a função o assigna ao processo e devolve False ao mesmo tempo. + +Esta ação dupla realizada pelo mesmo comando assegura que nenhuma operação externa pode ser inserida entre a proba do semáforo e sua atribuição. + +Pode utilizar o comando Test semaphore para saber se um semáforo já estiver assignado ou não. Este comando se utiliza principalmente como parte das operações longas, tais como o fechamento anual das contas onde Test semaphore lhe permite controlar a interface para evitar o acesso a certas operações tais como a adição dos dados contáveis. + +### Como usar semáforos + +Os semáforos devem ser utilizados respeitando os princípios a seguir: + +- um semáforo deve ser definido e lançado no mesmo método, +- a execução de código protegido pelo semáforo deve ser a mas curta possível, +- o código deve ser temporizado por meio do parâmetro contTics da função Semaphore para esperar a liberação do semáforo. + + +Este é o código típico para o uso de um semáforo: + +```4d + While(Semaphore("MySemaphore";300)) + IDLE + End while + // place code protected by semaphore here + CLEAR SEMAPHORE("MySemaphore") +``` + +Um semáforo que não se libera pode bloquear parte do banco de dados. Configurar e liberar o semáforo no mesmo método ajuda a eliminar este risco. + +Minimizar o código protegido pelo semáforo aumenta a fluidez da aplicação e evita que o semáforo seja um gargalo. + +Por último, utilizando o parâmetro opcional contTics do comando Semaphore é essencial para otimizar a espera do semáforo a liberar. Utilizando este parâmetro, os comandos funcionam da maneira abaixo: + +- O processo espera um número máximo especificado de tics (300 no exemplo) para que o semáforo esteja disponível, sem a execução de código passar para a próxima linha, +Se o semáforo for liberado antes do final deste limite, ele é atribuído imediatamente ao processo (Semaphore devolve False) e se reinicia a execução de código, +Se o semáforo não for liberado antes do final deste limite, a execução do código recomeça. +- O comando também dá prioridade às petições estabelecendo uma fila. Desta maneira, o primeiro processo que solicitar um semáforo será o primeiro em obter um. + +Lembre que o tempo de espera se estabelece em função das características específicas da aplicação. + +### Semáforos globais ou locais + +Há dois tipos de semáforos em 4D: semáforos locais e semáforos globais. + +- Um semáforo local é visível para todos os processos de um mesmo posto e só no posto. Um semáforo local pode ser criado ao adicionar um prefixo ao nome do semáforo um sinal de dólar ($). Se utilizar semáforos locais para supervisar as operações entre os diferentes processos que são executados na mesma máquina. Por exemplo, um semáforo local pode ser utilizado para controlar o acesso a um array interprocesso compartido por todos os processos de um banco de dados mono usuário ou de um equipo cliente. +- Um semáforo global é acessível a todos os usuários e todos seus processos. Os semáforos globais são utilizados para controlar as operações entre os usuários de um banco de dados multi-usuário. + +Os semáforos globais e locais são idênticos em sua lógica. A diferença está em seu alcance. + +No modo cliente-servidor, os semáforos globais são compartidos entre todos os processos que são executados em todos os clientes e servidores. Um semáforo local somente se comparte entre os processos que se executam na máquina onde foi criado. + +Em 4D, os semáforos globais ou locais têm o mesmo alcance, já que você é o único usuario. Entretanto, se seu banco de dados estiver sendo usado em ambas configurações, tenha certeza de usar semáforos globais ou locais, dependendo do que quiser fazer. + +Nota: é recomendado o uso de semáforos locais quando precisar de um semáforo para gerenciar um aspecto local para um cliente da aplicação, tais como a interface ou um conjunto de variáveis inter processo. Se usar um semáforo global neste caso, não apenas haveria intercâmbios de rede desnecessários, mas também poderia afetar a outras máquinas clientes desnecessariamente. O uso de um semáforo local evitaria estes efeitos secundários indesejáveis. + + + \ No newline at end of file diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md new file mode 100644 index 00000000000000..793f5e5c9dbd03 --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/overview.md @@ -0,0 +1,7 @@ +--- +id: overview +title: 4D database overview +--- + +## Description + diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/records.md b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/records.md new file mode 100644 index 00000000000000..25e1705847e48e --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/records.md @@ -0,0 +1,308 @@ +--- +id: records +title: Records +slug: /Develop/records +displayed_sidebar: docs +--- + + +## Record numbers + +There are three numbers associated with a record: + +- Record number +- Selected record number +- Sequence number + +### Record Number + +The record number is the absolute/physical record number for a record. A record number is automatically assigned to each new record and remains constant for the record until the record is deleted. Record numbers start at zero. They are not unique because record numbers of deleted records are reused for new records. They also change when the database is [compacted](../MSC/compact.md) or [repaired](../MSC/repair.md). + +### Selected Record Number + +The selected record number is the position of the record in the current selection, and so depends on the current selection. If the selection is changed or sorted, the selected record number will probably change. Numbering for the selected record number starts at one (1). + +### Sequence Number + +The sequence number is a unique non-repeating number that may be assigned to a field of a record (via the Autoincrement property, the SQL AUTO_INCREMENT attribute or the [`Sequence number`](../commands/sequence-number) command). It is not automatically stored with each record. It starts by default at 1 and is incremented for each new record that is created. Unlike record numbers, a sequence number is not reused when a record is deleted or when a database is compacted or repaired. Sequence numbers provide a way to have unique ID numbers for records. If a sequence number is incremented during a transaction, the number is not decremented if the transaction is canceled. + +:::note Notes + +- 4D does not carry out any check when you modify the automatic number internal counter of a table using the [`SET DATABASE PARAMETER`](../commands/set-database-parameter) command. If you decrement this counter, the new records created may have numbers that have already been assigned. +- Sequence numbers are not recommended to fill unique ID primary key fields for records. To create unique record IDs, it is strongly recommended to use UUIDs. + +::: + +### Example + +The following tables illustrate the numbers that are associated with records. Each line in the table represents information about a record. The order of the lines is the order in which records would be displayed in an output form. + +- **Data**: The data from a field in each record. For our example, it contains a person’s name. +- **Record Number**: The record’s absolute record number. This is the number returned by the [`Record number`](../commands/record-number) command. +- **Selected Record Number**: The record’s position in the current selection. This is the number returned by the [`Selected record number`](../commands/selected-record-number) command. +- **Sequence Number**: The record’s unique sequence number. This is the number returned by the [`Sequence number`](../commands/sequence-number) command when the record was created. This number is stored in a field. + +#### After the Records Are Entered + +The first table shows the records after they are entered. + +- The default order for the records is by record number. +- The record number starts at 0. +- The selected record number and the sequence number start at 1. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Sam| 3 |4 |4| +|Lisa| 4| 5 |5| + +Note: The records remain in the default order after a command changes the current selection without reordering it; for example, after the **Show All** menu command is chosen in the Design environment, or after the [`ALL RECORDS`](../commands/all-records) command is executed. + +#### After the Records Are Sorted + +The next table shows the same records sorted by name. + +- The same record number remains associated with each record. +- The selected record numbers reflect the new position of the records in the sorted selection. +- The sequence numbers never change, since they were assigned when each record was created and are stored in the record. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Sam| 3 |3 |4| +|Terri| 1 |4 |2| +|Tess |0| 5| 1| + + +#### After a Record Is Deleted + +The following table shows the records after Sam is deleted. + +- Only the selected record numbers have changed. Selected record numbers reflect the order in which the records are displayed. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Lisa| 4| 1 |5| +|Sabra| 2|2| 3| +|Terri| 1 |3 |2| +|Tess |0| 4| 1| + + +#### After a Record Is Added + +The next table shows the records after a new record has been added for Liz. + +- A new record is added to the end of the current selection. +- Sam’s record number is reused for the new record. +- The sequence number continues to increment. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Tess |0| 1| 1| +|Terri| 1 |2 |2| +|Sabra| 2|3| 3| +|Lisa| 4| 4 |5| +|Liz |3| 5| 6| + +#### After the Selection is Changed and Sorted + +The following table shows the records after the selection was reduced to three records and then sorted. + +- Only the selected record number associated with each record changes. + +|Data|Record Number|Selected Record Number|Sequence Number| +|---|---|---|----| +|Sabra| 2|1| 3| +|Liz |3| 2| 6| +|Terri| 1 |3 |2| + +## Record Stack + +The [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) commands allow you to put (“push”) records onto the record stack, and to remove (“pop”) them from the stack. + +Each process has its own record stack for each table. 4D maintains the record stacks for you. Each record stack is a last-in-first-out (LIFO) stack. Stack capacity is limited by memory. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) should be used with discretion. Each record that is pushed uses part of free memory. Pushing too many records can cause an out-of-memory or stack full condition. + +4D clears the stack of any unpopped records when you return to the menu at the end of execution of your method. + +[`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) are useful when you want to examine records in the same file during data entry. To do this, you push the record, search and examine records in the file (copy fields into variables, for example), and finally pop the record to restore the record. + +While entering a record, if you have to check a multiple field unique value, use the [`SET QUERY DESTINATION`](../commands/set-quer-destination) command. This will save you the calls to [`PUSH RECORD`](../commands/push-record) and [`POP RECORD`](../commands/pop-record) that you were making before and after the call to QUERY in order to preserve the data entered in the current record. [`SET QUERY DESTINATION`](../commands/set-quer-destination) allows you to make a query that does not change the selection nor the current record. + +## Record locking + +4D and 4D Server automatically manage databases by preventing multi-user or multi-process conflicts. Two users or two processes cannot modify the same record or object at the same time. However, the second user or process can have read-only access to the record or object at the same time. + +There are several reasons for using the multi-user commands: + +- Modifying records by using the language. +- Using a custom user interface for multi-user operations. +- Saving related modifications inside a transaction. + +There are three important concepts to be aware of when using commands in a multi-processing database: + +1. In a process, each table is in either a read-only or a read/write state. +2. Records become locked when they are loaded and unlocked when they are unloaded. +3. A locked record cannot be modified. + +As a convention in the following sections, the person performing an operation on the multi-user database is referred to as the **local user**. Other people using the database are referred to as the **other users**. The discussion is from the perspective of the local user. Also, from a multi-process perspective, the process executing an operation on the database is the **current process**. Any other executing process is referred to as **other processes**. The discussion is from the point of view of the current process. + +### Locked Records + +A locked record cannot be modified by the local user or the current process. A locked record can be loaded, but cannot be modified. A record is locked when one of the other users or processes has successfully loaded the record for modification, or when the record is stacked. Only the user who is modifying the record sees that record as unlocked. All other users and processes see the record as locked, and therefore unavailable for modification. A table must be in a read/write state for a record to be loaded unlocked. + +### Read-Only and Read/Write States + +Each table in a database is in either a read/write or a read-only state for each user and process of the database. **Read-only** means that records for the table can be loaded but not modified. **Read/write** means that records for the table can be loaded and modified if no other user has locked the record first. + +Note that if you change the status of a table, the change takes effect for the next record loaded. If there is a record currently loaded when you change the table’s status, that record is not affected by the status change. + +#### Read-Only State + +When a table is read-only and a record is loaded, this record is always locked. In other words, locked records can be displayed, printed, and otherwise used, but they cannot be modified. + +Note that the read-only state applies only to editing existing records. A read-only state does not affect the creation of new records. You can still add records to a read-only table using [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record), or the menu commands of the Design environment (in this case, the records being created are locked for all other users/processes). Note that the [`ARRAY TO SELECTION`](../commands/array-to-selection) command is not affected by the read-only state since it can both create and modify records. + +4D automatically sets a table to read-only for commands that do not require write access to records. These commands are: [`DISPLAY SELECTION`](../commands/display-selection), [`DISTINCT VALUES`](../commands/distinct-values), [`EXPORT DIF`](../commands/export-dif), [`EXPORT SYLK`](../commands/export-sylk), [`EXPORT TEXT`](../commands/export-text), [`PRINT SELECTION`](../commands/print-selection), [`PRINT LABEL`](../commands/print-label), [`QR REPORT`](../commands/qr-report), [`SELECTION TO ARRAY`](../commands/selection-to-array), [`SELECTION RANGE TO ARRAY`](../commands/selection-range-to-array). + +You can find out the state of a table at any time using the [`Read only state`](../commands/read-only-state) function. + +Before executing any of these commands, 4D saves the current state of the table (read-only or read/write) for the current process. After the command has executed, this state is restored. + +#### Read/Write State + +When a table is read/write and a record is loaded, the record will become unlocked if no other user has locked the record first. If the record is locked by another user, the record is loaded as a locked record that cannot be modified by the local user. + +A table must be set to read/write and the record loaded for it to become unlocked and thus modifiable. + +If a user loads a record from a table in read/write mode, no other users can load that record for modification. However, other users can add records to the table, either through the [`CREATE RECORD`](../commands/create-record) and [`ADD RECORD`](../commands/add-record) commands or manually in the Design environment. + +Read/write is the default state for all tables when a database is opened and a new process is started. + +#### Changing the Status of a Table + +You can use the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands to change the state of a table. If you want to change the state of a table in order to make a record read-only or read/write, you must execute the command before this record is loaded. Any record that is already loaded is not affected by the [`READ ONLY`](../commands/read-only) and [`READ WRITE`](../commands/read-write) commands. + +Each process has its own state (read-only or read/write) for each table in the database. + +By default, if you do not use the READ ONLY command, all tables are in read/write mode. + +### Loading, Modifying and Unloading Records + +Before the local user can modify a record, the table must be in the read/write state and the record must be loaded and unlocked. + +Any of the commands that loads a current record (if there is one) — such as [`NEXT RECORD`](../commands/next-record), [`QUERY`](../commands/query), [`ORDER BY`](../commands/order-by), [`RELATE ONE`](../commands/relate-one), etc. — sets the record state as locked or unlocked. The record is loaded according to the current state of its table (read-only or read/write) and its availability. A record may also be loaded for a related table by any of the commands that cause an automatic relation to be established. + +If a table is in the read-only state for a process or a user, then this table's records are loaded in read-only mode, which means they cannot be modified or deleted by this process or user. This is recommended for viewing or retrieving data because it does not prevent other users or processes from accessing the records of this table in read/write mode if necessary. + +If a table is in the read/write state for a process or a user, then any record from this table is also loaded in read/write mode, but only if no other user or process has already locked this record. If a record is successfully loaded in read/write mode, it is unlocked for the current process or user (it can be modified and saved) and is locked for all other users or processes. A table must be put into the read/write state before loading a record for modification and then saving it. + +If the record is to be modified, you use the Locked function to test whether or not a record is locked by another user. If a record is locked (Locked returns True), load the record with the [`LOAD RECORD`](../commands/load-record) command and again test whether or not the record is locked. This sequence must be continued until the record becomes unlocked (Locked returns False). + +When modifications to be made to a record are finished, the record must be released (and therefore unlocked for the other users) with [`UNLOAD RECORD`](../commands/unload-record). If a record is not unloaded, it will remain locked for all other users until a different current record is selected. Changing the current record of a table automatically unlocks the previous current record. You need to explicitly call [`UNLOAD RECORD`](../commands/unload-record) if you do not change the current record. This discussion applies to existing records. When a new record is created, it can be saved regardless of the state of the table to which it belongs. + +:::note + +When it is used in a transaction, the [`UNLOAD RECORD`](../commands/unload-record) command unloads the current record only for the process that manages the transaction. For other processes, the record stays locked as long as the transaction has not been validated (or cancelled). + +::: + +Use the [`LOCKED BY`](../commands/locked-by) command to see which user and/or process have locked a record. + +::: + +A good practice is to place all tables in read-only mode when each process is started (using the syntax [`READ ONLY(*)`](../commands/read-only)) then put each table in read/write mode only when necessary. Access to tables in read-only mode is faster and more memory-efficient. Moreover, changing the state of a table is optimized in client/server mode because it does not cause any additional network traffic: information is only sent to the server when executing a command that requires adequate access to the table. + +::: + +### Loops to Load Unlocked Records + +The following example shows the simplest loop with which to load an unlocked record: + +```4d + READ WRITE([Customers])//Set the table’s state to read/write + Repeat//Loop until the record is unlocked + LOAD RECORD([Customers])//Load record and set locked status + Until(Not(Locked([Customers]))) + //Do something to the record here + READ ONLY([Customers])//Set the table’s state to read-only +``` + +The loop continues until the record is unlocked. + +A loop like this is used only if the record is unlikely to be locked by anyone else, since the user would have to wait for the loop to terminate. Thus, it is unlikely that the loop would be used as is unless the record could only be modified by means of a method. + +The following example uses the previous loop to load an unlocked record and modify the record: + +```4d + READ WRITE([Inventory]) + Repeat //Loop until the record is unlocked + LOAD RECORD([Inventory]) //Load record and set it to locked + Until(Not(Locked([Inventory]))) + [Inventory]Part Qty:=[Inventory]Part Qty 1 //Modify the record + SAVE RECORD([Inventory]) //Save the record + UNLOAD RECORD([Inventory]) //Let other users modfiy it + READ ONLY([Inventory]) +``` + + +The [`MODIFY RECORD`](../commands/modify-record) command automatically notifies the user if a record is locked, and prevents the record from being modified. The following example avoids this automatic notification by first testing the record with the Locked function. If the record is locked, the user can cancel. + +This example efficiently checks to see if the current record is locked for the table [Commands]. If it is locked, the process is delayed by the procedure for one second. This technique can be used both in a multi-user or multi-process situation: + +```4d + Repeat + READ ONLY([Commands])//You do not need read/write right now + QUERY([Commands]) + //If the search was completed and some records were returned + If((OK=1) & (Records in selection([Commands])>0)) + READ WRITE([Commands])//Set the table to read/write state + LOAD RECORD([Commands]) + While(Locked([Commands]) & (OK=1)) `If the record is locked, + //loop until the record is unlocked + //Who is the record locked by? + LOCKED BY([Commands];$Process;$User;$SessionUser;$Name) + If($Process=-1)//Has the record been deleted? + ALERT("The record has been deleted in the meantime.") + OK:=0 + Else + If($User="")//Are you in single-user mode + $User:="you" + End if + CONFIRM("The record is already used by "+$User+" in the "+$Name+" Process.") + If(OK=1)//If you want to wait for a few seconds + DELAY PROCESS(Current process;120)//Wait for a few seconds + LOAD RECORD([Commands])//Try to load the record + End if + End if + End while + If(OK=1)//The record is unlocked + MODIFY RECORD([Commands])//You can modify the record + UNLOAD RECORD([Commands]) + End if + READ ONLY([Commands])//Switch back to read-only + OK:=1 + End if + Until(OK=0) +``` + + +### Using Commands in Multi-user or Multi-process Environment + +A number of commands in the language perform specific actions when they encounter a locked record. They behave normally if they do not encounter a locked record. + +Here is a list of these commands and their actions when a locked record is encountered. + +- [`MODIFY RECORD`](../commands/modify-record): Displays a dialog box stating that the record is in use. The record is not displayed, therefore the user cannot modify the record. In the Design environment, the record is shown in read-only state. +- [`MODIFY SELECTION`](../commands/modify-selection): Behaves normally except when the user double-clicks a record to modify it. [`MODIFY SELECTION`](../commands/modify-selection) displays dialog box stating that the record is in use and then allows read-only access to the record. +- [`APPLY TO SELECTION`](../commands/apply-to-selection): Loads a locked record, but does not modify it. [`APPLY TO SELECTION`](../commands/apply-to-selection) can be used to read information from the table without special care. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE SELECTION`](../commands/delete-selection): Does not delete any locked records; it skips them. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`DELETE RECORD`](../commands/delete-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`SAVE RECORD`](../commands/save-record): This command is ignored if the record is locked. No error is returned. You must test that the record is unlocked before executing this command. +- [`ARRAY TO SELECTION`](../commands/array-to-selection): Does not save any locked records. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). +- [`GOTO RECORD`](../commands/goto-record): Records in a multi-user/multi-process database may be deleted and added by other users, therefore the record numbers may change. Use caution when directly referencing a record by number in a multi-user database. +- [**Sets**](./sets.md): Take special care with sets, as the information that the set was based on may be changed by another user or process. diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md new file mode 100644 index 00000000000000..f1e42b3cc1c863 --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/sets.md @@ -0,0 +1,168 @@ +--- +id: sets +title: Sets +slug: /Develop/sets +displayed_sidebar: docs +--- + + +Sets offer you a powerful, swift means for manipulating record selections. Besides the ability to create sets, relate them to the current selection, and store, load, and clear sets, 4D offers three standard set operations: + +- Intersection +- Union +- Difference. + + +## Sets and the Current Selection + +A set is a compact representation of a selection of records. The idea of sets is closely bound to the idea of the current selection. Sets are generally used for the following purposes: + +- To save and later restore a selection when the order does not matter +- To access the selection a user made on screen (the `UserSet`) +- To perform a logical operation between selections. + +The current selection is a list of references that points to each record that is currently selected. The list exists in memory. Only currently selected records are in the list. A selection doesn’t actually contain the records, but only a list of references to the records. Each reference to a record takes 4 bytes in memory. When you work on a table, you always work with the records in the current selection. When a selection is sorted, only the list of references is rearranged. There is only one current selection for each table inside a process. + +Like a current selection, a set represents a selection of records. A set does this by using a very compact representation for each record. Each record is represented by one bit (one-eighth of a byte). Operations using sets are very fast, because computers can perform operations on bits very quickly. A set contains one bit for every record in the table, whether or not the record is included in the set. In fact, each bit is equal to 1 or 0, depending on whether or not the record is in the set. + +Sets are very economical in terms of RAM space. The size of a set, in bytes, is always equal to the total number of records in the table divided by 8. For example, if you create a set for a table containing 10,000 records, the set takes up 1,250 bytes, which is about 1.2K in RAM. + +There can be many sets for each table. In fact, sets can be saved to disk separately from the database. To change a record belonging to a set, first you must use the set as the current selection, then modify the record or records. + +A set is never in a sorted order—the records are simply indicated as belonging to the set or not. On the other hand, a named selection is in sorted order, but it requires more memory in most cases. For more information about named selections, see the Named Selections section. + +A set "remembers" which record was the current record at the time the set was created. The following table compares the concepts of the current selection and of sets: + +|Comparison|Current Selection|Sets| +|---|---|---| +|Number per table|1|0 to many| +|Sortable|Yes|No| +|Can be saved on disk|No|Yes| +|RAM per record(in bytes)|Number of selected records * 4|Total number of records/8| +|Combinable| No| Yes| +|Contains current record| Yes| Yes, as of the time the set was created| + +When you create a set, it belongs to the table from which you created it. Set operations can be performed only between sets belonging to the same table. + +Sets are independent from the data. This means that after changes are made to a file, a set may no longer be accurate. There are many operations that can cause a set to be inaccurate. For example, if you create a set of all the people from New York City, and then change the data in one of those records to “Boston” the set would not change, because the set is just a representation of a selection of records. Deleting records and replacing them with new ones also changes a set, as well as compacting the data. Sets can be guaranteed to be accurate only as long as the data in the original selection has not been changed. + +## Process and Interprocess Sets + +You can have the following three types of sets: + +- **Process sets**: A process set can only be accessed by the process in which it has been created. `LockedSet` is a process set. Process sets are cleared as soon as the process method ends. Process sets do not need any special prefix in the name. +- **Interprocess sets**: A set is an interprocess set if the name of the set is preceded by the symbols (<>) — a “less than” sign followed by a “greater than” sign. An interprocess set is “visible” to all the processes of the database. +In client/server mode, an interprocess set is “visible” to processes of the machine where it was created (client or server). +The name of an interprocess set must be unique in the database. +- **Local Sets/Client Sets**: Local/client sets are intended for use in client/server mode. The name of a local/client set is always preceded by the dollar sign ($) -- except for the UserSet system set. Unlike other types of sets, a local/client set is stored on the client machine. + +:::note Notes + +- The maximum size of a set name is 255 characters (excluding <> and $ symbols). +- For more information about the use of sets in client/server mode, please refer to 4D Server, Sets and Named Selections. + +::: + + +## Visibility of Sets + +The following table indicates the principles concerning the visibility of sets depending on their scope and where they were created: + + + +||Client Process|Other processes on the same client|Other clients|Server process|Other processes on the server| +|---|---|---|---|---|---| +|Creation in a client process |||||| +|$test|X ||||| +|test | X||| X(Trigger) || +|<>test | X|X |||| +|Creation in a server process|||||| +|$test|||| X|| +|test ||||X|| +|<>test||||X| X| + + +## Sets and Transactions + +A set can be created inside a [transaction](./transactions.md). It is possible to create a set of the records created inside a transaction and a set of records created or modified outside of a transaction. When the transaction ends, the set created during the transaction should be cleared, because it may not be an accurate representation of the records, especially if the transaction was canceled. + +## Example + +The following example deletes duplicate records from a table which contains information about people. A For...End for loop moves through all the records, comparing the current record to the previous record. If the name, address, and zip code are the same, then the record is added to a set. At the end of the loop, the set is made the current selection and the (old) current selection is deleted: + +```4d + CREATE EMPTY SET([People];"Duplicates") + // Create an empty set for duplicate records + ALL RECORDS([People]) + // Select all records + // Sort the records by ZIP, address, and name so + // that the duplicates will be next to each other + ORDER BY([People];[People]ZIP;>;[People]Address;>;[People]Name;>) + // Initialize variables that hold the fields from the previous record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + // Go to second record to compare with first + NEXT RECORD([People]) + For($i;2;Records in table([People])) + // Loop through records starting at 2 + // If the name, address, and ZIP are the same as the + // previous record then it is a duplicate record. + If(([People]Name=$Name) & ([People]Address=$Address) & ([People]ZIP=$ZIP)) + // Add current record (the duplicate) to set + ADD TO SET([People];"Duplicates") + Else + // Save this record’s name, address, and ZIP for comparison with the next record + $Name:=[People]Name + $Address:=[People]Address + $ZIP:=[People]ZIP + End if + // Move to the next record + NEXT RECORD([People]) + End for + // Use duplicate records that were found + USE SET("Duplicates") + // Delete the duplicate records + DELETE SELECTION([People]) + // Remove the set from memory + CLEAR SET("Duplicates") +``` + +As an alternative to immediately deleting records at the end of the method, you could display them on screen or print them, so that a more detailed comparison can be made. + + +## The UserSet System Set + +4D maintains a system set named `UserSet`, which automatically stores the most recent selection of records highlighted on screen by the user. Thus, you can display a group of records with [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection), ask the user to select from among them and turn the results of that manual selection into a selection or into a set that you name. + +::info 4D Server + +Although its name does not begin with the character "$", the `UserSet` system set is a client set. So, when using [`INTERSECTION`](../commands/intersection), [`UNION`](../commands/union) and [`DIFFERENCE`](../commands/difference), make sure you compare `UserSet` only to client sets. + +::: + +There is only one `UserSet` for a [process](../Develop/processes.md). Each table does not have its own `UserSet`. `UserSet` becomes "owned" by a table when a selection of records is displayed for the table. + +4D manages the `UserSet` set for list forms displayed in Design mode or using the [`MODIFY SELECTION`](../commands/modify-selection) or [`DISPLAY SELECTION`](../commands/display-selection) commands. However, this mechanism is not active for [subforms](../FormObjects/subform_overview.md). + +The following method illustrates how you can display records, allow the user to select some of them, and then use UserSet to display the selected records: + +```4d + // Display all records and allow user to select any number of them. + // Then display this selection by using UserSet to change the current selection. + FORM SET OUTPUT([People];"Display") // Set the output layout + ALL RECORDS([People]) // Select all people + ALERT("Press Ctrl or Command and Click to select the people required.") + DISPLAY SELECTION([People]) // Display the people + USE SET("UserSet") // Use the people that were selected + ALERT("You chose the following people.") + DISPLAY SELECTION([People]) // Display the selected people +``` + +## The LockedSet System Set + +The [`APPLY TO SELECTION`](../commands/apply-to-selection), [`DELETE SELECTION`](../commands/delete-selection), [`ARRAY TO SELECTION`](../commands/array-to-selection) and [`JSON TO SELECTION`](../commands/json-to-selection) commands create a set named `LockedSet` when used in a multi-processing environment. + +Query commands also create a `LockedSet` system set when they find locked records in the 'query and lock' context (see the [`SET QUERY AND LOCK`](../commands/set-query-and-lock) command). + +`LockedSet` indicates which records were locked during the execution of the command. \ No newline at end of file diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md new file mode 100644 index 00000000000000..6691cfcb0e545c --- /dev/null +++ b/i18n/pt/docusaurus-plugin-content-docs/current/Develop-legacy/xml.md @@ -0,0 +1,157 @@ +--- +id: xml +title: XML Processing +slug: /Develop/XML +displayed_sidebar: docs +--- + + +## Overview of XML Commands + +### XML, DOM, and SAX + +The [**XML** theme](../commands/theme/XML.md) groups together the generic XML "utilities" commands of 4D. These are option- and error-management commands. + +4D also offers two separate sets of XML commands: [**DOM**](../commands/theme/XML_DOM.md) (Document Object Model) and [**SAX**](../commands/theme/XML_SAX.md) (Simple API XML) are two different parsing modes for XML documents. + +- The DOM mode parses an XML source and builds its structure (its "tree") in memory. Because of this, access to each element of the source is extremely fast. However, since the entire tree structure is stored in memory, the processing of large XML documents may lead to the memory capacity being exceeded and thus provoke errors. +- The SAX mode does not build a tree structure in memory. In this mode, "events" (such as the start and end of an element) are generated when parsing the source. This mode lets you parse XML documents of any size, regardless of the amount of memory available. + +### References + +http://www.saxproject.org/?selected=event
+http://www.w3schools.com/xml/ + +:::note + +For XML support, 4D uses the [Xerces.dll library](../Notes/updates.md#library-table) developed by the Apache Foundation company. + +::: + + +### Preemptive mode + +XML references created by a [preemptive process](../Develop/preemptive.md) can only be used in that specific process. Conversely, XML references created by a cooperative process can be used by any other cooperative process, but cannot be used by any preemptive process. + + +### Character Sets + +The following character sets are supported by the XML DOM and XML SAX commands of 4D: + +- ASCII +- UTF-8 +- UTF-16 (Big/Small Endian) +- UCS4 (Big/Small Endian) +- EBCDIC code pages IBM037, IBM1047 and IBM1140 encodings, +- ISO-8859-1 (or Latin1) +- Windows-1252. + + +### Glossary + +This non-exhaustive list details the main XML concepts used by the commands and functions of 4D. + +- **Attribute**: an XML sub-tag associated with an element. An attribute always contains a name and a value. +- **Child**: In an XML structure, an element in a level directly below another. +- **DTD**: *Document Type Declaration*. The DTD records the set of specific rules and properties that the XML must follow. These rules define, more particularly, the name and content of each tag as well as its context. This formalization of the elements can be used to check whether an XML document is in compliance (in which case, it is declared “valid”). The DTD may be included in the XML document (internal DTD) or in a separate document (external DTD). Note that the DTD is not mandatory. +- **Element**: an XML tag. An element always contains a name and a value. Optionally, an element may contain attributes. +- **ElementRef**: XML reference used by the 4D XML commands to specify an XML structure. This reference is made up of 8 coded characters in hexadecimal form, which means that its length is 32 characters on a 64-bit system. It is recommended to declare XML references as Text. +- **Parent**: In an XML structure, an element in a level directly above another. +- **Parsing, parser**: The act of analyzing the contents of a structured object in order to extract useful information. +- **Root**: An element located at the first level of an XML structure. +- **Sibling**: An element at the same level as another. +- **Structure**: structured XML object. This object can be a document, a variable, or an element. +- **Validation**: An XML document is “validated” by the parser when it is “well-formed” and in compliance with the DTD specifications. +- **Well-formed**: An XML document is declared “well-formed” by the parser when it complies with the generic XML specifications. +- **XML**: eXtensible Markup Language. A computerized data exchange standard enabling the transfer of data as well as their structure. The XML language is based on the use of tags and a specific syntax, in keeping with the HTML language. However, unlike the latter, the XML language allows the definition of customized tags. +- **XSL**: eXtensible Stylesheet Language. A language permitting the definition of style sheets used to process and display the contents of an XSL document. + + +## XML DOM Commands + +### Creating, opening and closing XML documents via DOM + +Objects created, modified or parsed by the [4D XML DOM commands](../commands/theme/XML_DOM.md) can be text, URLs, documents or BLOBs. The DOM commands used for opening XML objects in 4D are [`DOM Parse XML source`](../commands/dom-parse-xml-source) and [`DOM Parse XML variable`](../commands/dom-parse-xml-variable). + +Many commands then let you read, parse and write the elements and attributes. Errors are recovered using the [`XML GET ERROR`](../commands/xml-get-error) command. Do not forget to call the [`DOM CLOSE XML`](../commands/dom-close-xml) command to close the source in the end. + +Note about use of XML BLOB parameters: For historical reasons, XML commands such as [`DOM Parse XML variable`](../commands/dom-parse-xml-variable) accept BLOB type parameters. However, it is highly recommended to store XML structures as Text. The use of BLOBs is reserved for processing binary data. In conformity with XML specifications, binary data are automatically encoded in Base64, even when the BLOB contains text. + + +### Support of XPath notation + +Several XML DOM commands ([`DOM Create XML element`](../commands/dom-create-xml-element), [`DOM Find XML element`](../commands/dom-find-xml-element), [`DOM Create XML element arrays`](../commands/dom-create-xml-element-arrays) and [`DOM SET XML ELEMENT VALUE`](../commands/dom-set-xml-element-value)) support some XPath expressions for accessing XML elements. + +XPath notation comes from the XPath language, designed to navigate within XML structures. It allows the setting of elements directly within an XML structure via a "pathname" type syntax, without necessarily having to indicate the complete pathname in order to reach it. + +For example, given the following structure: + +```xml + + + + + + + +``` + +XPath notation allows you to access element 3 using the */RootElement/Elem1/Elem2/Elem3* syntax. + +4D also accepts indexed XPath elements using the *Element[ElementNum]* syntax. For example, given the following structure: + +```xml + + + aaa + bbb + ccc + + +``` + +XPath notation allows you to access the "ccc" value using the */RootElement/Elem1/Elem2[3]* syntax. + +For a comprehensive list of supported XPath expressions, refer to the [`DOM Find XML element`](../commands/dom-find-xml-element) command description. + +:::note Compatibility + +Starting with 4D 18 R3, the XPath implementation has been modified to be more compliant and to support a wider set of expressions. If you want to benefit from the extended features in your converted databases, you need to select the **Use standard XPath** option of the [Compatibility page](../settings/compatibility.md). + +::: + +### Error Handling + +Many functions in this theme return an XML element reference. If an error occurs during function execution (for example, if the root element reference is not valid), the *OK* variable is set to 0 and an error is generated. + +In addition, the reference returned in this case is a sequence of 32 zero "0" characters. + + +## XML SAX Commands + +### Creating, opening and closing XML documents via SAX + +The [XML SAX commands](../commands/theme/XML_SAX.md) work with the standard document references of 4D (**DocRef**, a Time type reference). It is therefore possible to use these commands jointly with the 4D commands used to manage documents, such as [`SEND PACKET`](../commands/send-packet) or [`Append document`](../commands/append-document). + +The creation and opening of XML documents by programming is carried out using the [`Create document`](../commands/create-document) and [`Open document`](../commands/open-document) commands. Subsequently, the use of an XML command with these documents will cause the automatic activation of XML mechanisms such as encoding. For instance, the `` header will be written automatically in the document. + +:::note + +Documents read by SAX commands must be opened in read-only mode by the [`Open document`](../commands/open-document) command. This avoids any conflict between 4D and the Xerces library when you open "regular" and XML documents simultaneously. If you execute a SAX parsing command with a document open in read-write mode, an alert message is displayed and parsing is impossible. + +::: + +Closing an XML document must be carried out using the [`CLOSE DOCUMENT`](../commands/close-document) command. If any XML elements were open, they will be closed automatically. + +### About end-of-line characters and BOM management + +When writing SAX documents, 4D uses the following default settings for end-of-line characters and BOM (byte order mask) usage: + +- CRLF characters on Windows and LF on macOS for end-of-line characters +- files are written without BOM. + +:::note Compatibility + +In projects created with 4D versions up to 19.x, by default 4D uses CRLF as end-of-line characters on macOS for SAX and a BOM. You can control the `XML line ending` and `XML BOM` management using the [`XML SET OPTIONS`](../commands/xml-set-options) command and a [Compatibility setting](../settings/compatibility.md). Important: Since SAX file lines are written directly at each statement, if you need to set the BOM and/or end-of-line options, you must call the [`XML SET OPTIONS`](../commands/xml-set-options) command before the first SAX writing command. + +::: diff --git a/sidebars.js b/sidebars.js index 80c07ad10c3b31..be18ecf92f3dde 100644 --- a/sidebars.js +++ b/sidebars.js @@ -331,13 +331,17 @@ module.exports = "Develop/async" ] }, + "Develop-legacy/transactions", + "Tags/transformation-tags", + "Project/date-time-formats", + "Develop-legacy/xml", { type: "category", - label: "Records & selections", + label: "Records & Selections (legacy data access)", link: { type: "generated-index", - title: "Records & selections", - description: "Legacy development objects and concepts for 4D databases", + title: "Records & Selections (legacy data access)", + description: "Legacy data access based upon records, selections, sets", slug: "/category/records-selections", keywords: [ "records", @@ -345,13 +349,10 @@ module.exports = ], image: "/img/docusaurus.png" }, items: [ - "Develop-legacy/sets", - "Develop-legacy/records" + "Develop-legacy/records", + "Develop-legacy/sets" ] - }, - "Develop-legacy/transactions", - "Tags/transformation-tags", - "Project/date-time-formats" + } ] }, { @@ -735,6 +736,11 @@ module.exports = "Menus/sdi" ] }, + { + type: "doc", + label: "Drag and Drop", + id: "Desktop/drag-and-drop" + }, { type: "category", label: "Access Rights", diff --git a/versioned_docs/version-21-R2/commands-legacy/component-list.md b/versioned_docs/version-21-R2/commands-legacy/component-list.md index dbbb2aafd38d9c..d9223a125234a7 100644 --- a/versioned_docs/version-21-R2/commands-legacy/component-list.md +++ b/versioned_docs/version-21-R2/commands-legacy/component-list.md @@ -31,16 +31,16 @@ displayed_sidebar: docs When a project is opened, 4D loads the valid components: -* found in the [Components folder of your project](../../Project/architecture.md#components). -* declared in the [**dependencies.json** file of your project](../../Project/components.md#dependenciesjson-and-environment4djson). +* found in the [Components folder of your project](../Project/architecture.md#components). +* declared in the [**dependencies.json** file of your project](../Project/components.md#dependenciesjson-and-environment4djson). -**Reminder:** If the same component is installed at different locations, a [priority order](../../Project/components.md#priority) is applied. +**Reminder:** If the same component is installed at different locations, a [priority order](../Project/components.md#priority) is applied. This command can be called from the host project or from a component. If the project does not use any components, the *componentsArray* array is returned empty. The names of the components are the names of the structure files of the matrix databases (.4db, .4dc or .4dbase). This command can be used for setting up architectures and modular interfaces that offer additional functionalities according to the presence of components. -For more information about 4D components, please refer to [this page](../../Concepts/components.md). +For more information about 4D components, please refer to [this page](../Concepts/components.md). ## See also diff --git a/versioned_docs/version-21/commands-legacy/component-list.md b/versioned_docs/version-21/commands-legacy/component-list.md index 38a001a6ebdc5a..a163082d9b6c82 100644 --- a/versioned_docs/version-21/commands-legacy/component-list.md +++ b/versioned_docs/version-21/commands-legacy/component-list.md @@ -31,16 +31,16 @@ displayed_sidebar: docs When a project is opened, 4D loads the valid components: -* found in the [Components folder of your project](../../Project/architecture.md#components). -* declared in the [**dependencies.json** file of your project](../../Project/components.md#dependenciesjson-and-environment4djson). +* found in the [Components folder of your project](../Project/architecture.md#components). +* declared in the [**dependencies.json** file of your project](../Project/components.md#dependenciesjson-and-environment4djson). -**Reminder:** If the same component is installed at different locations, a [priority order](../../Project/components.md#priority) is applied. +**Reminder:** If the same component is installed at different locations, a [priority order](../Project/components.md#priority) is applied. This command can be called from the host project or from a component. If the project does not use any components, the *componentsArray* array is returned empty. The names of the components are the names of the structure files of the matrix databases (.4db, .4dc or .4dbase). This command can be used for setting up architectures and modular interfaces that offer additional functionalities according to the presence of components. -For more information about 4D components, please refer to [this page](../../Concepts/components.md). +For more information about 4D components, please refer to [this page](../Concepts/components.md). ## See also From 680bff53b61ea7da4c1afc44a0fb9668038cc9eb Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 24 Jun 2026 12:04:57 +0200 Subject: [PATCH 18/25] drag and drop+pasteboard final --- .../{drag-drop.md => drag-and-drop.md} | 69 ++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) rename docs/Desktop/{drag-drop.md => drag-and-drop.md} (73%) diff --git a/docs/Desktop/drag-drop.md b/docs/Desktop/drag-and-drop.md similarity index 73% rename from docs/Desktop/drag-drop.md rename to docs/Desktop/drag-and-drop.md index 3de222703276bc..4ce94a9056588f 100644 --- a/docs/Desktop/drag-drop.md +++ b/docs/Desktop/drag-and-drop.md @@ -60,9 +60,12 @@ Your implementation will be based upon the following scenario: 1. In the [`On Begin Drag Over`](../Events/onBeginDragOver.md) event of the source object (with ["Custom" **Draggable** property](../FormObjects/properties_Action.md#draggable)), put appropriate data in the pasteboard using [`APPEND DATA TO PASTEBOARD`](../commands/append-data-to-pasteboard), [`SET FILE TO PASTEBOARD`](../commands/set-file-to-pasteboard) or other commands from the [Pasteboard theme](../commands/theme/Pasteboard.md). You can also define a specific cursor icon using [`SET DRAG ICON`](../commands/set-drag-icon) command. 2. In the [`On Drag Over`](../Events/onDragOver.md) event of the destination object (with ["Custom" **Droppable** property](../FormObjects/properties_Action.md#droppable)), get the data types or data signatures found in the pasteboard using [`GET PASTEBOARD DATA TYPE`](../commands/get-pasteboard-data-type) or [`GET PASTEBOARD DATA`](../commands/get-pasteboard-data) and check if they are compatible with the destination object. -The [`Drop position`](../commands/drop-position) command returns the element number or the item position of the target element or list item, if the destination object is an array (i.e., scrollable area), a hierarchical list, a text or a combo box, as well as the column number if the object is a list box. -If the destination object or element is compatible, return **0** to accept the drop, otherwise **-1** in its [object method](../Concepts/methods.md#method-types). -3. In the [`On Drop`](../Events/onDrop.md) event of the destination object (with ["Custom" **Droppable** property](../FormObjects/properties_Action.md#droppable)), execute any action in response to the drop. If the drag-and-drop operation is intended to copy the dragged data, you simply assign the data to destination object. If the drag and drop is not intended to move data, but is instead a user interface metaphor for a particular operation, you can perform whatever you want, for example getting file paths using [`Get file from pasteboard`](../commands/get-file-from-pasteboard) command. +The [`Drop position`](../commands/drop-position) command returns the element number or the item position of the target element or list item, if the destination object is an array (i.e., scrollable area), a hierarchical list, a text or a combo box, as well as the column number if the object is a list box. +3. The [object method](../Concepts/methods.md#method-types) of the destination object or element must return 0 or -1 to accept or reject the action: + - If it is compatible, return **0** to accept the drop and execute the [`On Drop`](../Events/onDrop.md) event when the mouse button is released. + - Otherwise, return **-1** to reject the drop. +4D automatically handles the interface aspect of this interaction by displaying a cursor depending on whether the drop is accepted or rejected. +4. In the [`On Drop`](../Events/onDrop.md) event of the destination object (with ["Custom" **Droppable** property](../FormObjects/properties_Action.md#droppable)), execute any action in response to the drop. If the drag-and-drop operation is intended to copy the dragged data, you simply assign the data to destination object. If the drag and drop is not intended to move data, but is instead a user interface metaphor for a particular operation, you can perform whatever you want, for example getting file paths using [`Get file from pasteboard`](../commands/get-file-from-pasteboard) command. Note that the [`On Begin Drag Over`](../Events/onBeginDragOver.md) event is generated **in the context of the source object of the drag** while [`On Drag Over`](../Events/onDragOver.md) and [`On Drop`](../Events/onDrop.md) events are only sent to the destination object. @@ -94,7 +97,7 @@ In the case of data other than text or pictures (another 4D object, file, etc.) ## Examples -### Example: Array based list box to input text area +### Array based list box to input text area In this simple example, we want to fill an input text area with data dragged from an array-based list box: @@ -127,7 +130,7 @@ If(Form event code=On Drop) //Requires Droppable Action enabled from Property Li ``` -### Example: Selection based list box to input text area +### Selection based list box to input text area Combining custom and automatic drag and drop features allows simple and powerful interfaces. In this example, we want to fill an input text area with data dragged from a list box: @@ -153,7 +156,7 @@ Moving and formatting data is done through drag and drop: ![](../assets/en/Desktop/dragdrop5.png) -### Example: File path to text area +### File path to text area You want the user to select a file on the disk, then drag and drop it on an enterable variable (of type object) so that it displays a json description of the file. @@ -184,7 +187,7 @@ In the object method of the variable, you just write: ``` -### Example: File paths to list box +### File paths to list box You want the user to select files on the disk, then drag and drop them on a list box so that it displays file paths. @@ -220,4 +223,54 @@ In the list box object method, you just write: ``` -## Pasteboard commands \ No newline at end of file +## Pasteboard commands + +The [commands of the "Pasteboard" theme](../commands/theme/Pasteboard.md) can be used both for managing copy/paste actions (**Clipboard management**), as well as inter-application drag and drop actions. + +4D uses two data pasteboards: one for copied (or cut) data, which is the clipboard, and the other for data being dragged and dropped. +These two pasteboards are managed using the same commands. You access one or the other depending on the context: + +- The drag and drop pasteboard can only be accessed within the [`On Begin Drag Over`](../Events/onBeginDragOver.md), [`On Drag over`](../Events/onDragOver.md) or [`On Drop`](../Events/onDrop.md) form events and in the [**On Drop** database method](../commands-legacy/on-drop-database-method.md). Outside of these contexts, the drag and drop pasteboard is not available. +- The copy/paste pasteboard can be accessed in all other cases. Unlike the drag and drop pasteboard, it keeps the data that are placed in it during the entire session, so long as they are not cleared or reused. + +### Types of Data + +During drag and drop actions, different types of data can be placed on and read from the pasteboard. You can access a data type in several ways: + +- Via its 4D signature: The 4D signature is a character string indicating a data type referenced by the 4D application. The use of 4D signatures facilitates the development of multi-platform applications since these signatures are identical under Mac OS and Windows. You will find the list of 4D signatures below. +- Via a UTI (Uniform Type Identifier, macos only): The UTI standard, specified by Apple, associates a character string with each type of native object. For example, GIF pictures have the UTI type "com.apple.gif". UTI types are published in Apple documentations as well as by the editors concerned. +- Via its number or its format name (Windows only): Under Windows, each native data type is referenced by its number ("3", "12", and so on) and a name ("Rich Text Edit"). By default, Microsoft specifies several native types called standard data formats. In addition, third-party editors can "save" format names in the system, which then attributes them a number in return. For more information about this and about native types, please refer to the Microsoft developer documentation (more particularly at http://msdn2.microsoft.com/en-us/library/ms649013.aspx). + +:::note + +In 4D commands, the Windows format numbers are handled as text. + +::: + +All the [commands of the "Pasteboard" theme](../commands/theme/Pasteboard.md) can work with each one of these data types. You can find out which data types are present in the pasteboard in each of these formats using the [`GET PASTEBOARD DATA TYPE`](../commands/get-pasteboard-data-type) command. + +:::note + +4-character types (TEXT, PICT or custom types) are supported for compatibility with prior versions of 4D. + +::: + + +### 4D Signatures + +Here is the list of standard 4D signatures as well as their description: + +|Signature|Description| +|----|----| +|"com.4d.private.text.native"|Text in native character set| +|"com.4d.private.text.utf16"|Text in Unicode character set| +|"com.4d.private.text.rtf"|Enriched text| +|"com.4d.private.picture.pict"|PICT picture format| +|"com.4d.private.picture.png"|PNG picture format| +|"com.4d.private.picture.gif"|GIF picture format| +|"com.4d.private.picture.jfif"|JPEG picture format| +|"com.4d.private.picture.emf"|EMF picture format| +|"com.4d.private.picture.bitmap"|BITMAP picture format| +|"com.4d.private.picture.tiff"|TIFF picture format| +|"com.4d.private.picture.pdf"|PDF document| +|"com.4d.private.file.url"|File pathname| \ No newline at end of file From 8f92d09d35f14dbdd45f7286a4acfb15ee498723 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 24 Jun 2026 16:17:17 +0200 Subject: [PATCH 19/25] up to form object name --- docs/Develop-legacy/named-selections.md | 75 +++++++++++++++++++ docs/FormObjects/formObjects_overview.md | 32 ++++++++ docs/language-legacy/On a Series/average.md | 6 +- docs/language-legacy/On a Series/max.md | 2 +- docs/language-legacy/On a Series/min.md | 2 +- .../On a Series/std-deviation.md | 2 +- .../On a Series/sum-squares.md | 2 +- docs/language-legacy/On a Series/sum.md | 2 +- docs/language-legacy/On a Series/variance.md | 2 +- .../Printing/print-selection.md | 14 +++- .../Printing/print-selection.md | 6 ++ .../Printing/print-selection.md | 6 ++ .../Printing/print-selection.md | 6 ++ .../Printing/print-selection.md | 8 +- sidebars.js | 3 +- 15 files changed, 156 insertions(+), 12 deletions(-) create mode 100644 docs/Develop-legacy/named-selections.md diff --git a/docs/Develop-legacy/named-selections.md b/docs/Develop-legacy/named-selections.md new file mode 100644 index 00000000000000..ebe8817eccdbd2 --- /dev/null +++ b/docs/Develop-legacy/named-selections.md @@ -0,0 +1,75 @@ +--- +id: named-selections +title: Named Selections +slug: /Develop/named-selections +displayed_sidebar: docs +--- + + +## Overview + +Named selections provide an easy way to manipulate several selections simultaneously. A named selection is an ordered list of records for a table in a process. This ordered list can be given a name and kept in memory. Named selections offer a simple means to preserve in memory the order of the selection and the current record of the selection. + +The following commands enable you to work with named selections: + +- [`COPY NAMED SELECTION`](../commands/copy-named-selection) +- [`CUT NAMED SELECTION`](../commands/cut-named-selection) +- [`USE NAMED SELECTION`](../commands/use-named-selection) +- [`CLEAR NAMED SELECTION`](../commands/clear-named-selection) +- [`CREATE SELECTION FROM ARRAY`](../commands/create-selection-from-array) + + +Named selections are created with the [`COPY NAMED SELECTION`](../commands/copy-named-selection), [`CUT NAMED SELECTION`](../commands/cut-named-selection) and [`CREATE SELECTION FROM ARRAY`](../commands/create-selection-from-array). Named selections are generally used to work on one or more selections and to save and later restore an ordered selection. There can be many named selections for each table in a process. To reuse a named selection as the current selection, call [`USE NAMED SELECTION`](../commands/use-named-selection). When you are done with a named selection, use [`CLEAR NAMED SELECTION`](../commands/clear-named-selection). + +:::note + +Combining the statement `SET QUERY DESTINATION(Into named selection;namedselection)` with a search command (for example [`QUERY`](../commands/query)) can also be used to create a named selection. Refer to the description of the [`SET QUERY DESTINATION`](../commands/set-query-destination) command. + +::: + +Named selections can be local, process or interprocess in scope. + +A named selection is local when its name is preceded by a dollar sign. When its name is not preceded by any symbol, it is a process named selection and it is an interprocess named selection if its name is preceded by the symbols (<>) — a “less than” sign followed by a “greater than” sign. + +The scope of an interprocess named selection is identical to the scope of an interprocess variable (*deprecated*). An interprocess named selection can be accessed from any process. With 4D in remote mode and 4D Server, an interprocess named selection is available only to the processes of the client that created it. An interprocess named selection is not available to other client machines. +A process named selection is available only within the process in which it was created and on the server. +A local named selection is defined for the process that created it and is not visible on the server. + +:::note + +Creating a named selection requires access to the selection of the table. Since selections are kept on the server and a local process does not have access to server data, do not use named selections within local processes. + +::: + +## Visibility of Named Selections + +The following table indicates the principles concerning the visibility of named selections depending on their scope and where they were created: + + +||Client Process|Other processes on the same client|Other clients |Server process|Other processes on the server| +|---|---|---|---|---|---| +|Creation in a client process |||||| +|$test|X||||| +|test |X|||X(Trigger) || +|<>test| X| X |||| +|Creation in a server process |||||| +|$test||||X|| +|test|||| X || +|<>test |||| X|X| + + +## Named Selections and Sets + +The differences between [sets](./sets.md) and named selections are: + +- A named selection is an ordered list of records; a set is not. +- Sets are very memory efficient, because they require only one bit for each record in the file. Named selections require 4 bytes for each record in the selection. +- Unlike sets, named selections cannot be saved to disk. +- Sets have the standard [`INTERSECTION`](../commands/intersection), [`UNION`](../commands/union) and [`DIFFERENCE`](../commands/difference) operations; named selections cannot be combined with other named selections. + + +The similarities between named selections and sets are: + +- Like a set, a named selection exists in memory. +- A named selection and a set store references to a record. If records are modified or deleted, the named selection or the set can become invalid. +- Like a set, a named selection “remembers” the current record as of the time the named selection was created. \ No newline at end of file diff --git a/docs/FormObjects/formObjects_overview.md b/docs/FormObjects/formObjects_overview.md index 88be6eabf58535..35efd5b543e55e 100644 --- a/docs/FormObjects/formObjects_overview.md +++ b/docs/FormObjects/formObjects_overview.md @@ -36,3 +36,35 @@ Example for a button object: "height": 20 } ``` + +### Accessing form objects using their name or their data source in the 4D language + +Many commands handling form objects such as commands from [Objects (Forms)](../commands/theme/Objects_Forms.md), [List Box](../commands/theme/List_Box.md), or [Styled Text](../commands/theme/Styled_Text.md) themes share the same generic syntaxes described here: + +```4d +COMMAND NAME( * ; *object* : Text { ; *additional parameters* } ) +//or +COMMAND NAME( *object* : Variable, Field { ; *additional parameters* }) +``` + +If you specify the \* parameter, you indicate that *object* is the [name of the object](./properties_Object.md#object-name) (a string). If you don't pass the \*, you indicate that *object* is a field or a variable, i.e. its [data source](./properties_Object.md#variable-or-expression). + +When using the [object name](./properties_Object.md#object-name), you can rely on the @ character within that name if you want to address several objects of the form in one call. The following table shows examples of object names you can specify to this command. + +|Object Names|Objects affected by the call| +|---|---| +|mainGroupBox|Only the object mainGroupBox.| +|main@|The objects whose name starts with “main”.| +|@GroupBox|The objects whose name ends with “GroupBox”.| +|@Group@|The objects whose name contains “Group”.| +|main@Btn|The objects whose name starts with “main” and ends with “Btn”.| +|@|All the objects present in the form.| + +Form object names can contain up 255 bytes, allowing you to define and apply custom naming rules, such as "xxxx_Button" or "xxx_Mac". + +:::warning + +You can [configure the way the @ character is interpreted](../settings/database.md#text-comparison) when it is included in a character string. This option affects the functioning of the form object commands. + +::: + diff --git a/docs/language-legacy/On a Series/average.md b/docs/language-legacy/On a Series/average.md index e8f25cbba07a2b..b05efae1685f5d 100644 --- a/docs/language-legacy/On a Series/average.md +++ b/docs/language-legacy/On a Series/average.md @@ -32,21 +32,21 @@ displayed_sidebar: docs ## Description -**Average** returns the arithmetic mean (average) of *series*. If *series* is an indexed field, the index is used to find the average. +**Average** returns the arithmetic mean (average) of *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to find the average. You can pass an array (one or two dimensions) in *series*. In this case, the array must be of the Integer, Longint or Real type. This command accepts an optional *attributePath* parameter of the Text type, that you can use if *series* is an object field. It allows you to define the path of the attribute to compute. Use the standard dot notation to define paths to nested attributes, for example "company.address.number". Keep in mind that object attribute names are case-sensitive. Only numeric attribute values are computed. If there are values in the attribute path which are not of a numeric type, they are ignored. -If the command is correctly executed, the OK system variable is set to 1\. If it is interrupted (for example if the user clicks on the **Stop** button of the progress thermometer), the OK variable is set to 0. +If the command is correctly executed, the OK system variable is set to 1. If it is interrupted (for example if the user clicks on the **Stop** button of the progress thermometer), the OK variable is set to 0. ## Example 1 The following example sets the variable *vAverage* that is in the B0 Break area of an output form. The line of code is the object method for *vAverage*. The object method is not executed until the level 0 break: ```4d - vAverage:=Average([Employees] Salary) + vAverage:=Average([Employees]Salary) ``` The following method is called to print the records in the selection and to activate break processing: diff --git a/docs/language-legacy/On a Series/max.md b/docs/language-legacy/On a Series/max.md index fd05bd7b428461..9a5d594c974e79 100644 --- a/docs/language-legacy/On a Series/max.md +++ b/docs/language-legacy/On a Series/max.md @@ -32,7 +32,7 @@ displayed_sidebar: docs ## Description -**Max** returns the maximum value in *series*. If *series* is an indexed field, the index is used to find the maximum value. +**Max** returns the maximum value in *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to find the maximum value. You can pass an array (one or two dimensions) in *series*. In this case, the array must be of the Integer, Longint, Real, or Date type. diff --git a/docs/language-legacy/On a Series/min.md b/docs/language-legacy/On a Series/min.md index 068a3613c68e5d..2d0a12c5a3384d 100644 --- a/docs/language-legacy/On a Series/min.md +++ b/docs/language-legacy/On a Series/min.md @@ -32,7 +32,7 @@ displayed_sidebar: docs ## Description -**Min** returns the minimum value in *series*. If *series* is an indexed field, the index is used to find the minimum value. +**Min** returns the minimum value in *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to find the minimum value. If the *series* selection is empty, **Min** returns 0. diff --git a/docs/language-legacy/On a Series/std-deviation.md b/docs/language-legacy/On a Series/std-deviation.md index 38e3042e04f7c1..c30d43fc70b8fb 100644 --- a/docs/language-legacy/On a Series/std-deviation.md +++ b/docs/language-legacy/On a Series/std-deviation.md @@ -29,7 +29,7 @@ displayed_sidebar: docs ## Description -**Std deviation** returns the standard deviation of *series*. If *series* is an indexed field, the index is used to find the standard deviation. +**Std deviation** returns the standard deviation of *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to find the standard deviation. You can pass an array (one or two dimensions) in *series*. In this case, the array must be of the Integer, Longint or Real type. diff --git a/docs/language-legacy/On a Series/sum-squares.md b/docs/language-legacy/On a Series/sum-squares.md index 263958bf095e2c..49826260245bd6 100644 --- a/docs/language-legacy/On a Series/sum-squares.md +++ b/docs/language-legacy/On a Series/sum-squares.md @@ -29,7 +29,7 @@ displayed_sidebar: docs ## Description -**Sum squares** returns the sum of the squares of *series*. If *series* is an indexed field, the index is used to find the sum of the squares. +**Sum squares** returns the sum of the squares of *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to find the sum of the squares. You can pass an array (one or two dimensions) in *series*. In this case, the array must be of the Integer, Longint or Real type. diff --git a/docs/language-legacy/On a Series/sum.md b/docs/language-legacy/On a Series/sum.md index 947b5ca40ad66f..38d3c1a8238594 100644 --- a/docs/language-legacy/On a Series/sum.md +++ b/docs/language-legacy/On a Series/sum.md @@ -32,7 +32,7 @@ displayed_sidebar: docs ## Description -The **Sum** command returns the sum (total of all values) for *series*. If *series* is an indexed field, the index is used to total the values. +The **Sum** command returns the sum (total of all values) for *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to total the values. You can pass an array (one or two dimensions) in *series*. In this case, the array must be of the Integer, Longint or Real type. diff --git a/docs/language-legacy/On a Series/variance.md b/docs/language-legacy/On a Series/variance.md index 6f412fd6c0263c..1679d0fc60251c 100644 --- a/docs/language-legacy/On a Series/variance.md +++ b/docs/language-legacy/On a Series/variance.md @@ -29,7 +29,7 @@ displayed_sidebar: docs ## Description -**Variance** returns the variance for *series*. If *series* is an indexed field, the index is used to find the variance. +**Variance** returns the variance for *series*. If *series* is a field, the command uses to current selection ot the parent table; if it is indexed, the index is used to find the variance. You can pass an array (one or two dimensions) in *series*. In this case, the array must be of the Integer, Longint or Real type. diff --git a/docs/language-legacy/Printing/print-selection.md b/docs/language-legacy/Printing/print-selection.md index d334b4d7854d84..30d3811d2e512c 100644 --- a/docs/language-legacy/Printing/print-selection.md +++ b/docs/language-legacy/Printing/print-selection.md @@ -47,7 +47,19 @@ During printing, the output form method and/or the form’s object methods are e You can check whether **PRINT SELECTION** is printing the first header by testing [Before selection](../commands/before-selection) during an On Header event. You can also check for the last footer, by testing [End selection](../commands/end-selection) during an On Printing Footer event. For more information, see the description of these commands, as well as those of [Form event code](../commands/form-event-code) and [Level](../commands/level). -To print a sorted selection with subtotals or breaks using **PRINT SELECTION**, you must first sort the selection. Then, in each Break area of the report, include a variable with an object method that assigns the subtotal to the variable. You can also use statistical and arithmetical functions like [Sum](../commands/sum) and [Average](../commands/average) to assign values to variables. For more information, see the descriptions of [Subtotal](../commands/subtotal), [BREAK LEVEL](../commands/break-level) and [ACCUMULATE](../commands/accumulate). +To print a sorted selection with subtotals or breaks using **PRINT SELECTION**, you must first sort the selection. Then, in each Break area of the report, include a variable with an object method that assigns the subtotal to the variable. For more information, see the descriptions of [Subtotal](../commands/subtotal), [BREAK LEVEL](../commands/break-level) and [ACCUMULATE](../commands/accumulate). + + +:::note + +You can use [statistical commands](../../commands/theme/On_a_Series.md) like [Sum](../commands/sum) and [Average](../commands/average) to assign values to variables. When statistical functions are used in a report, they behave in a specific way because the report itself must load each record. When you use these functions in a report, the values that are returned are reliable only at break level 0, and only when break processing is turned on. This means that they are useful only at the end of a report, after all the records have been processed. You would use these functions only in an object method for a non-enterable area that is included in the B0 Break area. + + +::: + + + + :::warning diff --git a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md index d245f6771e7e2b..672645ff87dba0 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md @@ -49,6 +49,12 @@ Puede saber si PRINT SELECTION está imprimiendo el primer encabezado probando [ Para imprimir una selección ordenada con subtotales o rupturas utilizando PRINT SELECTION, debe primero ordenar la selección. Luego, en cada área de ruptura del informe, incluir una variable con un método de objeto que asigne el subtotal a la variable. Igualmente puede utilizar funciones estadísticas y aritméticas como [Sum](../commands/sum) y [Average](../commands/average) para asignar valores a las variables. Para mayor información, consulte las descripciones de [Subtotal](../commands/subtotal), [BREAK LEVEL](../commands/break-level) y [ACCUMULATE](../commands/accumulate). +:::note + +Puede utilizar [comandos estadísticos](../../commands/theme/On_a_Series.md) como [Sum](../commands/sum) y [Average](../commands/average) para asignar valores a las variables. Cuando se utilizan funciones estadísticas en un informe, se comportan de manera específica porque el propio informe debe cargar cada registro. Cuando utiliza estas funciones en un informe, los valores devueltos solo son fiables en el nivel de ruptura 0, y solo cuando el procesamiento de rupturas está activado. Esto significa que solo son útiles al final de un informe, después de que se hayan procesado todos los registros. Solo usaría estas funciones en un método de objeto para un área no editable incluida en el área de ruptura B0. + +::: + **Advertencia:** no utilice el comando [PAGE BREAK](../commands/page-break) con el comando PRINT SELECTION. [PAGE BREAK](../commands/page-break) está reservado para ser utilizado con el comando [Print form](../commands/print-form). Después de un llamado a PRINT SELECTION, la variable OK toma el valor 1 si la impresión se ha completado. Si la impresión fue interrumpida, la variable OK toma el valor 0 (cero) (por ejemplo si el usuario hizo clic en Cancelar en la caja de diálogo de impresión). diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md index dc4a61e6e39b00..00d4227a1dbb4f 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md @@ -52,6 +52,12 @@ Si **PRINT SELECTION** est appelée au même moment par deux process différents Pour imprimer une sélection triée avec des sous-totaux ou des ruptures à l'aide de la commande **PRINT SELECTION**, vous devez d'abord trier la sélection. Puis vous devez inclure, dans chaque zone de rupture de l'état, une variable associée à une méthode objet assignant le sous-total à la variable. Vous pouvez aussi utiliser des fonctions statistiques ou arithmétiques telles que [Sum](../commands/sum) et [Average](../commands/average) pour assigner des valeurs aux variables. Pour plus d'informations, reportez-vous à la description des commandes [Subtotal](../commands/subtotal), [BREAK LEVEL](../commands/break-level) et [ACCUMULATE](../commands/accumulate). +:::note + +Vous pouvez utiliser des [commandes statistiques](../../commands/theme/On_a_Series.md) comme [Sum](../commands/sum) et [Average](../commands/average) pour assigner des valeurs aux variables. Lorsque des fonctions statistiques sont utilisées dans un état, elles se comportent de manière spécifique car l'état lui-même doit charger chaque enregistrement. Lorsque vous utilisez ces fonctions dans un état, les valeurs retournées ne sont fiables qu'au niveau de rupture 0, et uniquement lorsque le traitement des ruptures est activé. Cela signifie qu'elles ne sont utiles qu'à la fin d'un état, après que tous les enregistrements ont été traités. Vous utiliserez ces fonctions uniquement dans une méthode objet d'une zone non saisissable incluse dans la zone de rupture B0. + +::: + **Attention :** N'utilisez pas la commande [PAGE BREAK](../commands/page-break) avec **PRINT SELECTION**. [PAGE BREAK](../commands/page-break) est exclusivement réservée à une utilisation combinée avec la commande [Print form](../commands/print-form). Après un appel à **PRINT SELECTION**, la variable OK prend la valeur 1 si l'impression s'est déroulée correctement. Si l'impression a été interrompue (par exemple l'utilisateur a cliqué sur un bouton Annuler dans les boîtes de dialogue d'impression), la variable OK prend la valeur *0* (zéro). diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md index 85f7ed49d0e0c4..d6b4a82d6fd8fe 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md @@ -49,6 +49,12 @@ displayed_sidebar: docs **PRINT SELECTION** を使用し、小計やブレーク付きでセレクションを印刷するには、まずそのセレクションをソートしなければなりません。次に、レポートの各ブレークエリアに、小計を変数に代入するオブジェクトメソッドを持つ変数を配置します。変数に値を代入する、[Sum](../commands/sum) や [Average](../commands/average) のような統計関数と算術関数を使用することもできます。詳細は[Subtotal](../commands/subtotal)、[BREAK LEVEL](../commands/break-level)、[ACCUMULATE](../commands/accumulate) コマンドの説明を参照してください。 +:::note + +[Sum](../commands/sum) や [Average](../commands/average) のような[統計コマンド](../../commands/theme/On_a_Series.md)を使用して変数に値を代入することができます。統計関数をレポートで使用する場合、レポート自体が各レコードを読み込む必要があるため、特定の動作をします。これらの関数をレポートで使用すると、返される値が信頼できるのはブレークレベル0のみであり、ブレーク処理が有効になっている場合に限ります。つまり、すべてのレコードが処理された後のレポートの末尾でのみ有効です。これらの関数は、B0ブレークエリアに含まれる非入力エリアのオブジェクトメソッド内でのみ使用してください。 + +::: + **警告:** **PRINT SELECTION** のコンテキストで [PAGE BREAK](../commands/page-break) コマンドを使用してはいけません。[PAGE BREAK](../commands/page-break) は [Print form](../commands/print-form) のコンテキストで使用します。 **PRINT SELECTION** の呼び出し後、プリントが正常に終了するとシステム変数OKに1がセットされます。プリントが中断された場合には、システム変数OKには0がセットされます(例えばユーザが印刷ダイアログボックスでキャンセルをクリックした場合)。 diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md index 236008adcde2a6..e554553252ca0a 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/Printing/print-selection.md @@ -47,7 +47,13 @@ Durante a impressão, o método de formulário de saída e os métodos de objeto Pode saber se PRINT SELECTION está imprimindo o primeiro cabeçalho provando [Before selection](../commands/before-selection) durante um evento On Header. Igualmente pode verificar o último pé de página, provando End selection durante um evento On Printing Footer. Para maior informação, consulte a descrição destes comandos, como também dos comandos [Form event code](../commands/form-event-code) e [Level ](../commands/level). Para imprimir uma seleção ordenada com subtotais ou quebras utilizando PRINT SELECTION, deve primeiro ordenar a seleção. Depois, em cada área de quebra do relatório, incluir uma variável com um método de objeto que atribui o subtotal à variável . Igualmente pode utilizar funções estatísticas e aritméticas como [Sum](../commands/sum) e [Average](../commands/average) para atribuir valores às variáveis. Para maior informação, consulte as descrições de [Subtotal](../commands/subtotal), [BREAK LEVEL](../commands/break-level) e [ACCUMULATE](../commands/accumulate). - + +:::note + +Você pode usar [comandos estatísticos](../../commands/theme/On_a_Series.md) como [Sum](../commands/sum) e [Average](../commands/average) para atribuir valores às variáveis. Quando funções estatísticas são usadas em um relatório, elas se comportam de maneira específica porque o próprio relatório precisa carregar cada registro. Quando você usa essas funções em um relatório, os valores retornados são confiáveis apenas no nível de quebra 0, e somente quando o processamento de quebras está ativado. Isso significa que elas são úteis apenas no final de um relatório, após todos os registros terem sido processados. Você usaria essas funções apenas em um método de objeto para uma área não editável incluída na área de quebra B0. + +::: + **Aviso**: Não use [PAGE BREAK](../commands/page-break) com o comando PRINT SELECTION. [PAGE BREAK](../commands/page-break) é usada com o comando [Print form](../commands/print-form). Depois de um chamado a PRINT SELECTION, a variável OK toma o valor 1 se a impressão for completada. Se a impressão foi interrompida, a variável OK toma o valor 0 (zero) (por exemplo se o usuário clicar em Cancelar nas caixas de diálogo de impressão). diff --git a/sidebars.js b/sidebars.js index be18ecf92f3dde..f1328c3c27e9cf 100644 --- a/sidebars.js +++ b/sidebars.js @@ -350,7 +350,8 @@ module.exports = image: "/img/docusaurus.png" }, items: [ "Develop-legacy/records", - "Develop-legacy/sets" + "Develop-legacy/sets", + "Develop-legacy/named-selections" ] } ] From 63b9a23625a5bc9abd02c97ceb15c0db51a31480 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 24 Jun 2026 17:10:34 +0200 Subject: [PATCH 20/25] list box commands --- docs/FormObjects/listbox_overview.md | 178 +++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/docs/FormObjects/listbox_overview.md b/docs/FormObjects/listbox_overview.md index 825cf6cd4a9f1c..65febef27f4d3c 100644 --- a/docs/FormObjects/listbox_overview.md +++ b/docs/FormObjects/listbox_overview.md @@ -606,5 +606,183 @@ In this case, you must fill and empty arrays through the code. The principles to - When a user clicks on a collapse button, you can process the `On Collapse` event. The [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell concerned: you remove as many rows as needed from the list box using the [`LISTBOX DELETE ROWS`](../commands/listbox-delete-rows) command. +## List boxes and the 4D language + +Many commands of the 4D language can be used with list boxes, from the [List box theme](../commands/theme/List_Box.md) but also from [Objects (Forms)](../commands/theme/Objects_Forms.md) and other themes. They can be used with list boxes, or [parts of list boxes](#list-box-parts) such as headers, footers, rows, or columns. Some of them can only be used with specific [list box types](#list-box-types). + +### List Box commands + +| Command | List Box Type | Supported Parts | +|--------|--------------|----------------| +| [`LISTBOX COLLAPSE`](../commands/listbox-collapse) | Hierarchical | List box, headers, footers, rows, columns | +| [`LISTBOX DELETE COLUMN`](../commands/listbox-delete-column) | All | Columns | +| [`LISTBOX DELETE ROWS`](../commands/listbox-delete-rows) | Array | List box, headers, footers, rows, columns | +| [`LISTBOX DUPLICATE COLUMN`](../commands/listbox-duplicate-column) | Array, Selection, Collection | Columns | +| [`LISTBOX EXPAND`](../commands/listbox-expand) | Hierarchical | List box, headers, footers, rows, columns | +| [`LISTBOX Get array`](../commands/listbox-get-array) | Array | List box, headers, footers, rows, columns | +| [`LISTBOX GET ARRAYS`](../commands/listbox-get-arrays) | All | List box, headers, footers, rows, columns | +| [`LISTBOX Get auto row height`](../commands/listbox-get-auto-row-height) | Array | List box, headers, footers, rows, columns | +| [`LISTBOX GET CELL COORDINATES`](../commands/listbox-get-cell-coordinates) | All | List box, headers, footers, rows, columns | +| [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) | All | List box, headers, footers, rows, columns | +| [`LISTBOX Get column formula`](../commands/listbox-get-column-formula) | Selection, Collection | Columns | +| [`LISTBOX Get column width`](../commands/listbox-get-column-width) | All | Columns | +| [`LISTBOX Get footer calculation`](../commands/listbox-get-footer-calculation) | Array, Selection | Footers | +| [`LISTBOX Get footers height`](../commands/listbox-get-footers-height) | All | Footers | +| [`LISTBOX GET GRID`](../commands/listbox-get-grid) | All | List box, headers, footers, rows, columns | +| [`LISTBOX GET GRID COLORS`](../commands/listbox-get-grid-colors) | All | List box, headers, footers, rows, columns | +| [`LISTBOX Get headers height`](../commands/listbox-get-headers-height) | All | Headers | +| [`LISTBOX GET HIERARCHY`](../commands/listbox-get-hierarchy) | Array | List box, headers, footers, rows, columns | +| [`LISTBOX Get locked columns`](../commands/listbox-get-locked-columns) | All | List box | +| [`LISTBOX Get number of columns`](../commands/listbox-get-number-of-columns) | All | List box | +| [`LISTBOX GET OBJECTS`](../commands/listbox-get-objects) | All | List box | +| [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) | All | List box, headers, footers, rows, columns | +| [`LISTBOX Get property`](../commands/listbox-get-property) | All | List box, columns | +| [`LISTBOX Get row color as number`](../commands/listbox-get-row-color-as-number) | Array | Rows | +| [`LISTBOX Get row font style`](../commands/listbox-get-row-font-style) | Array | Rows | +| [`LISTBOX Get row height`](../commands/listbox-get-row-height) | Array | Rows | +| [`LISTBOX Get rows height`](../commands/listbox-get-rows-height) | All | List box | +| [`LISTBOX Get static columns`](../commands/listbox-get-static-columns) | All | List box | +| [`LISTBOX GET TABLE SOURCE`](../commands/listbox-get-table-source) | All | List box | +| [`LISTBOX INSERT COLUMN`](../commands/listbox-insert-column) | All | List box | +| [`LISTBOX INSERT COLUMN FORMULA`](../commands/listbox-insert-column-formula) | All | List box | +| [`LISTBOX INSERT ROWS`](../commands/listbox-insert-rows) | Array | List box | +| [`LISTBOX MOVE COLUMN`](../commands/listbox-move-column) | All | Columns | +| [`LISTBOX MOVED COLUMN NUMBER`](../commands/listbox-moved-column-number) | All | Columns | +| [`LISTBOX MOVED ROW NUMBER`](../commands/listbox-moved-row-number) | Array | Rows | +| [`LISTBOX SELECT BREAK`](../commands/listbox-select-break) | Hierarchical | List box | +| [`LISTBOX SELECT ROW`](../commands/listbox-select-row) | All | Rows | +| [`LISTBOX SET ARRAY`](../commands/listbox-set-array) | Array | List box, columns | +| [`LISTBOX SET AUTO ROW HEIGHT`](../commands/listbox-set-auto-row-height) | Array | Rows | +| [`LISTBOX SET COLUMN FORMULA`](../commands/listbox-set-column-formula) | Selection, Collection | Columns | +| [`LISTBOX SET COLUMN WIDTH`](../commands/listbox-set-column-width) | All | Columns | +| [`LISTBOX SET FOOTER CALCULATION`](../commands/listbox-set-footer-calculation) | Array, Selection | Footers | +| [`LISTBOX SET FOOTERS HEIGHT`](../commands/listbox-set-footers-height) | All | Footers | +| [`LISTBOX SET GRID`](../commands/listbox-set-grid) | All | List box | +| [`LISTBOX SET GRID COLOR`](../commands/listbox-set-grid-color) | All | List box | +| [`LISTBOX SET HEADERS HEIGHT`](../commands/listbox-set-headers-height) | All | Headers | +| [`LISTBOX SET HIERARCHY`](../commands/listbox-set-hierarchy) | Array | List box | +| [`LISTBOX SET LOCKED COLUMNS`](../commands/listbox-set-locked-columns) | All | List box | +| [`LISTBOX SET PROPERTY`](../commands/listbox-set-property) | All | List box, columns | +| [`LISTBOX SET ROW COLOR`](../commands/listbox-set-row-color) | Array | Rows | +| [`LISTBOX SET ROW FONT STYLE`](../commands/listbox-set-row-font-style) | Array | Rows | +| [`LISTBOX SET ROW HEIGHT`](../commands/listbox-set-row-height) | Array | Rows | +| [`LISTBOX SET ROWS HEIGHT`](../commands/listbox-set-rows-height) | All | List box | +| [`LISTBOX SET STATIC COLUMNS`](../commands/listbox-set-static-columns) | All | List box | +| [`LISTBOX SET TABLE SOURCE`](../commands/listbox-set-table-source) | Selection | List box | +| [`LISTBOX SORT COLUMNS`](../commands/listbox-sort-columns) | All | Columns | + +### Miscellaneous commands + + +| Command | List Box Type | Supported Parts | Comments | +|--------|--------------|----------------|----------| +| [`EDIT ITEM`](../commands/edit-item) | All | Columns | Allows you to pass a cell of a list box object into edit mode | +| [`Get edited text`](../commands/get-edited-text) | All | List box, headers, footers, rows, columns | | +| [`REDRAW`](../commands/redraw) | Array, Selection | List box | When applied to a selection list box, triggers an update of the data displayed in the list box. Not supported with list box of the entity selection type. | +| [`Displayed line number`](../commands/displayed-line-number) | All | List box, headers, footers, rows, columns | Works in the context of the [`On Display Detail`](../Events/onDisplayDetail.md) form event for a list box object | +| [`Drop position`](../commands/drop-position) | All | List box, headers, footers, rows, columns | | +| [`Count in array`](../commands/count-in-array) | All | List box, headers, footers, rows, columns | | +| [`Print object`](../commands/print-object) | All | List box, headers, footers, rows, columns | | + + +### Object (forms) commands + +| Command | List Box Type | Supported Parts | +|--------|--------------|----------------| +| [`OBJECT DUPLICATE`](../commands/object-duplicate) | All | List box, headers, footers, rows, columns | +| [`OBJECT GET BEST SIZE`](../commands/object-get-best-size) | All | Columns | +| [`OBJECT Get border style`](../commands/object-get-border-style) | All | List box, headers, footers, rows, columns | +| [`OBJECT GET COORDINATES`](../commands/object-get-coordinates) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get data source`](../commands/object-get-data-source) | Array | List box | +| [`OBJECT GET DRAG AND DROP OPTIONS`](../commands/object-get-drag-and-drop-options) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get enterable`](../commands/object-get-enterable) | All | Columns | +| [`OBJECT Get filter`](../commands/object-get-filter) | All | Columns | +| [`OBJECT Get focus rectangle invisible`](../commands/object-get-focus-rectangle-invisible) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get font`](../commands/object-get-font) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get font size`](../commands/object-get-font-size) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get font style`](../commands/object-get-font-style) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get format`](../commands/object-get-format) | All | Headers | +| [`OBJECT Get help tip`](../commands/object-get-help-tip) | All | Headers, footers | +| [`OBJECT Get horizontal alignment`](../commands/object-get-horizontal-alignment) | All | List box, headers, footers, columns | +| [`OBJECT Get list reference`](../commands/object-get-list-reference) | All | Columns | +| [`OBJECT Get name`](../commands/object-get-name) | All | List box, headers, footers, rows, columns | +| [`OBJECT Get pointer`](../commands/object-get-pointer) | All | List box, headers, footers, rows, columns (see below)| +| [`OBJECT GET RESIZING OPTIONS`](../commands/object-get-resizing-options) | All | List box, headers, footers, rows, columns | +| [`OBJECT GET RGB COLORS`](../commands/object-get-rgb-colors) | All | List box, headers, footers, rows, columns | +| [`OBJECT GET SCROLL POSITION`](../commands/object-get-scroll-position) | All | List box | +| [`OBJECT GET SCROLLBAR`](../commands/object-get-scrollbar) | All | List box | +| [`OBJECT Get type`](../commands/object-get-type) | All | List box, headers, footers, columns | +| [`OBJECT Get vertical alignment`](../commands/object-get-vertical-alignment) | All | List box, headers, footers, columns | +| [`OBJECT MOVE`](../commands/object-move) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET COLOR`](../commands/object-set-color) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET COORDINATES`](../commands/object-set-coordinates) | All | List box | +| [`OBJECT SET DATA SOURCE`](../commands/object-set-data-source) | All | List box | +| [`OBJECT SET ENTERABLE`](../commands/object-set-enterable) | All | Columns | +| [`OBJECT SET EVENTS`](../commands/object-set-events) | All | List box | +| [`OBJECT SET FOCUS RECTANGLE INVISIBLE`](../commands/object-set-focus-rectangle-invisible) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET FONT`](../commands/object-set-font) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET FONT SIZE`](../commands/object-set-font-size) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET FONT STYLE`](../commands/object-set-font-style) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET FORMAT`](../commands/object-set-format) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET HELP TIP`](../commands/object-set-help-tip) | All | Headers, footers | +| [`OBJECT SET HORIZONTAL ALIGNMENT`](../commands/object-set-horizontal-alignment) | All | List box, headers, footers, columns | +| [`OBJECT SET RESIZING OPTIONS`](../commands/object-set-resizing-options) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET RGB COLORS`](../commands/object-set-rgb-colors) | All | List box, headers, footers, rows, columns | +| [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position) | All | List box | +| [`OBJECT SET SCROLLBAR`](../commands/object-set-scrollbar) | All | List box. Scrolls the list box rows so that the first selected row or a specified row is displayed| +| [`OBJECT SET TITLE`](../commands/object-set-title) | All | Headers | +| [`OBJECT SET VERTICAL ALIGNMENT`](../commands/object-set-vertical-alignment) | All | List box, headers, footers, columns | +| [`OBJECT SET VISIBLE`](../commands/object-set-visible) | All | List box, headers, footers | + +When [`OBJECT SET VISIBLE`](../commands/object-set-visible) is used with a header or footer, it is applied on all List box object headers or footers, regardless of the individual element set by the command. For example, the `OBJECT SET VISIBLE(*;"header3";False)` statement will hide all headers in the List box object to which *header3* belongs and not simply this header. Note that in order for you to be able to manage the visibility of these objects using the [`OBJECT SET VISIBLE`](../commands/object-set-visible) command, they must have been displayed in the list box properties. + +### OBJECT Get pointer + +The [`OBJECT Get pointer`](../commands/object-get-pointer) command used with the `Object with focus` or `Object current` constant can be used in the object method of a list box or a list box column. They return a pointer to the list box, the list box column (see note below) or the header variable depending on the type of [form event](../Events/overview.md). The following table details this functioning: + +| Event | Object with focus | Object current | +|------|------------------|----------------| +| [`On Clicked`](../Events/onClicked.md) | list box | column | +| [`On Double Clicked`](../Events/onDoubleClicked.md) | list box | column | +| [`On Before Keystroke`](../Events/onBeforeKeystroke.md) | column | column | +| [`On After Keystroke`](../Events/onAfterKeystroke.md) | column | column | +| [`On After Edit`](../Events/onAfterEdit.md) | column | column | +| [`On Getting Focus`](../Events/onGettingFocus.md) | column or list box (*) | column or list box (*) | +| [`On Losing Focus`](../Events/onLosingFocus.md) | column or list box (*) | column or list box (*) | +| [`On Drop`](../Events/onDrop.md) | list box (source) | list box (*) | +| [`On Drag Over`](../Events/onDragOver.md) | list box (source) | list box (*) | +| [`On Begin Drag Over`](../Events/onBeginDragOver.md) | list box | list box (*) | +| [`On Mouse Enter`](../Events/onMouseEnter.md) | list box (**) | list box (**) | +| [`On Mouse Move`](../Events/onMouseMove.md) | list box (**) | list box (**) | +| [`On Mouse Leave`](../Events/onMouseLeave.md) | list box (**) | list box (**) | +| [`On Data Change`](../Events/onDataChange.md) | column | column | +| [`On Selection Change`](../Events/onSelectionChange.md) | list box (**) | list box (**) | +| [`On Before Data Entry`](../Events/onBeforeDataEntry.md) | column | column | +| [`On Column Moved`](../Events/onColumnMoved.md) | list box | column | +| [`On Row Moved`](../Events/onRowMoved.md) | list box | list box | +| [`On Column Resize`](../Events/onColumnResize.md) | list box | column | +| [`On Open Detail`](../Events/onOpenDetail.md) | Nil | list box (**) | +| [`On Close Detail`](../Events/onCloseDetail.md) | Nil | list box (**) | +| [`On Header Click`](../Events/onHeaderClick.md) | list box | header | +| [`On Footer Click`](../Events/onFooterClick.md) | list box | footer | +| [`On After Sort`](../Events/onAfterSort.md) | list box | header | + +(\*) When the focus is modified within a list box, a pointer to the column is returned. When the focus is modified at the overall form level, a pointer to the list box is returned. In the context of a column object method, a pointer to the column is returned. +(\*\*) Not executed in the context of a column object method. + +:::note + +When a pointer to a column is returned, the object pointed to depends on the type of list box. With an array type list box, the `OBJECT Get pointer` command returns a pointer to the column of the list box with the focus (i.e. to an array). The 4D pointer mechanism allows you to see the item number of the modified array. For example, supposing a user modified the 5th line of the column col2: +```4d + $Column:=OBJECT Get pointer(Object with focus) + //$Column contains a pointer to col2 + $Row:=$Column-> //$Row equals 5 +``` +::: + +For a selection type list box, the `OBJECT Get pointer` command returns: +- For a column associated with a field, a pointer to the associated field, +- For a column associated with a variable, a pointer to the variable, +- For a column associated with an expression, the `Is nil pointer` pointer. From 92f51a146545256ea122eb4e7318fa529e9d59b8 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 24 Jun 2026 19:18:47 +0200 Subject: [PATCH 21/25] added tokens --- docs/Concepts/methods.md | 54 ++++++++++++++++++++++++ docs/FormObjects/list_overview.md | 70 +++++++++++++++---------------- 2 files changed, 89 insertions(+), 35 deletions(-) diff --git a/docs/Concepts/methods.md b/docs/Concepts/methods.md index 8c7ec211e2217e..a9ae6867c776f3 100644 --- a/docs/Concepts/methods.md +++ b/docs/Concepts/methods.md @@ -24,3 +24,57 @@ In the 4D Language, there are several categories of methods. The category depend |**Class**|Automatically called when an object of the class is instantiated 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. See [**Classes**](classes.md) and [**Function** class](../API/FunctionClass.md). | +## Language tokens + +4D's language includes a unique tokenization system for constants, commands, tables, fields and keywords names that are used in the code. Tokenizing these names means that as you type in the code editor they are stored internally as absolute references (numbers) and then restored as text during execution or display depending on the context. This allows you to guarantee that the code will always be interpreted correctly, even if you rename your tables or fields, or when 4D language commands are renamed over the course of different application versions. + +**Note:** This also ensures automatic translation of the code when you have enabled the ["Use regional system settings" preference](../Preferences/methods.md#4d-programming-language-use-regional-system-settings) and open your databases with 4D versions in different languages. + +Tokenisation is completely transparent for 4D developers when working in the [4D code editor](../code-editor/write-class-method.md), and you generally won't need to worry about it. However, there are two cases where you might need to take action regarding tokenization: if you want to disable it, and if you want to use tokenization in your formulas. + +### Disabling tokenization + +When your project is stored on a version control system (VCS) such as GitHub or GitLab, you may want to disable tokenization to make the code more readable on the external platform. To do this, you can deselect the [**Include tokens in project source files**](../Preferences/general.md#include-tokens-in-project-source-files) preference to prevent tokens from being stored in your **new projects**. + +You can configure your **existing projects** to save code without tokens by inserting the following key in the `.4DProject` file using a text editor: + +```json +"tokenizedText": false +``` + +This setting is only taken into account when methods are saved. Existing methods in your projects are left untouched, unless you resave them. + +### Using tokens in formulas + +A text-based 4D [formula](../commands/theme/Formulas.md) is a text that is interpreted at runtime, and not as it is typed. In fact, this is the case as soon as 4D code is expressed as raw text, more specifically when code is exported and then imported using the [`METHOD GET CODE`](../commands/method-get-code) and [`METHOD SET CODE`](../commands/method-set-code) commands, copied/pasted or [interpreted from 4D HTML tags](../Tags/transformation-tags.md). +To benefit from tokenization mechanisms in these contexts, you just need to use an explicit syntax which consists in preceding object names in the language by their token. + +### Token syntax + +For tokenizable named elements contained in expressions, 4D offers a special syntax you can use to reference the tokens directly: you just need to add a specific suffix after the element name to indicate its type (command, field, etc.), followed by its reference. The token syntax is detailed in this table: + +|Element|Example (standard syntax)|Suffix|Example (token syntax)|Comments| +|--|---|---|---|----| +|4D Command|String(a)|:Cxx|String:C10(a)|xx is the command number| +|4D Constant|Pi|:Kxx:yy|Pi:K30:1|xx is the ID of the constant group and yy is its index (position) within this group| +|Table|[Employees]|:xx|[Employees:1]|xx is the table number| +|Field|[Employees]Name|:xx|[Employees:1]Name:2|xx is the field number| +|4D Plugin|PV PRINT(area)|:Pxx:yy|PV PRINT:P13000:229(area)|xx is the plug-in ID and yy is the index of the command| + +**Note:** Uppercase letters (C, P) must be used in the suffixes; otherwise, they will not be interpreted correctly. + +When you use this syntax, you guarantee that your formulas will be interpreted correctly even in the case of renaming or when the database is executed in a different language. + +This syntax is accepted in all 4D formulas (or 4D expressions) regardless of the calling context: + +- 4D formulas executed using the Formula editor or using commands such as [`EXECUTE FORMULA`](../commands/execute-formula), [`APPLY TO SELECTION`](../commands/apply-to-selection), [`QUERY BY FORMULA`](../commands/query-by-formula), [`LISTBOX INSERT COLUMN FORMULA`](../commands/listbox-insert-column-formula), etc. +- expressions inserted in [multi-style text areas](../FormObjects/properties_Text.md#supported-tags) (see [`ST INSERT EXPRESSION`]()), +- expressions calculated in [transformation tags](../Tags/transformation-tags.md), +- expressions inserted in external areas such as [4D Write Pro areas](../WritePro/managing-formulas.md). + +#### Where to find the element numbers? + +The token syntax requires the addition of the reference numbers of various elements. The location of these references depends on the type of element. + +- **4D commands:** Command numbers can be found in the documentation ("Properties" area) as well as on the Commands page of the Explorer. +- **Tables and fields**: Table and field numbers can be obtained using the [`Table`](../commands/table) and [`Field`](../commands/field) commands. They are also displayed in the Inspector palette of the Structure editor. \ No newline at end of file diff --git a/docs/FormObjects/list_overview.md b/docs/FormObjects/list_overview.md index a0459ebfdb6eb3..afff2babd0d260 100644 --- a/docs/FormObjects/list_overview.md +++ b/docs/FormObjects/list_overview.md @@ -25,7 +25,7 @@ In both cases, you manage a hierarchical list at runtime through its *ListRef* r A hierarchical list is both a **language object** existing in memory and a **form object**. -The **language object** is referenced by an unique internal ID of the Longint type, designated by *ListRef* in the 4D Language Reference. This ID is returned by the commands that can be used to create lists: `New list`, `Copy list`, `Load list`, `BLOB to list`. There is only one instance of the language object in memory and any modification carried out on this object is immediately carried over to all the places where it is used. +The **language object** is referenced by an unique internal ID of the Longint type, designated by *ListRef* in the 4D Language Reference. This ID is returned by the commands that can be used to create lists: [`New list`](../commands/new-list), [`Copy list`](../commands/copy-list), [`Load list`](../commands/load-list), [`BLOB to list`](../commands/blob-to-list). There is only one instance of the language object in memory and any modification carried out on this object is immediately carried over to all the places where it is used. The **form object** is not necessarily unique: there may be several representations of the same hierarchical list in the same form or in different ones. As with other form objects, you specify the object in the language using the syntax (*;"ListName", etc.). @@ -42,7 +42,7 @@ Each representation of the list has its own specific characteristics and shares - The position of the scrolling cursor. The other characteristics (font, font size, style, entry control, color, list contents, icons, etc.) are common to all the representations and cannot be modified separately. -Consequently, when you use commands based on the expanded/collapsed configuration or the current item, for example `Count list items` (when the final `*` parameter is not passed), it is important to be able to specify the representation to be used without any ambiguity. +Consequently, when you use commands based on the expanded/collapsed configuration or the current item, for example [`Count list items`](../commands/count-list-items) (when the final `*` parameter is not passed), it is important to be able to specify the representation to be used without any ambiguity. You must use the `ListRef` ID with language commands when you want to specify the hierarchical list found in memory. On the other hand, if you want to specify the representation of a hierarchical list object at the form level, you must use the object name (string type) in the command, via the standard syntax (*;"ListName", etc.). @@ -57,45 +57,45 @@ SET LIST ITEM FONT(*;"mylist1";*;thefont) ### Support of @ -As with other object property management commands, it is possible to use the “@” character in the `ListName` parameter. As a rule, this syntax is used to designate a set of objects in the form. However, in the context of hierarchical list commands, this does not apply in every case. This syntax will have two different effects depending on the type of command: +As with [other object property management commands](../FormObjects/formObjects_overview.md#accessing-form-objects-using-their-name-or-their-data-source-in-the-4d-language), it is possible to use the “@” character in the `ListName` parameter. As a rule, this syntax is used to designate a set of objects in the form. However, in the context of hierarchical list commands, this does not apply in every case. This syntax will have two different effects depending on the type of command: - For commands that set properties, this syntax designates all the objects whose name corresponds (standard behavior). For example, the parameter "LH@" designates all objects of the hierarchical list type whose name begins with “LH.” - - `DELETE FROM LIST` - - `INSERT IN LIST` - - `SELECT LIST ITEMS BY POSITION` - - `SET LIST ITEM` - - `SET LIST ITEM FONT` - - `SET LIST ITEM ICON` - - `SET LIST ITEM PARAMETER` - - `SET LIST ITEM PROPERTIES` + - [`DELETE FROM LIST`](../commands/delete-from-list) + - [`INSERT IN LIST`](../commands/insert-in-list) + - [`SELECT LIST ITEMS BY POSITION`](../commands/select-list-items-by-position) + - [`SET LIST ITEM`](../commands/set-list-item) + - [`SET LIST ITEM FONT`](../commands/set-list-item-font) + - [`SET LIST ITEM ICON`](../commands/set-list-item-icon) + - [`SET LIST ITEM PARAMETER`](../commands/set-list-item-parameter) + - [`SET LIST ITEM PROPERTIES`](../commands/set-list-item-properties) - For commands retrieving properties, this syntax designates the first object whose name corresponds: - - `Count list items` - - `Find in list` - - `GET LIST ITEM` - - `Get list item font` - - `GET LIST ITEM ICON` - - `GET LIST ITEM PARAMETER` - - `GET LIST ITEM PROPERTIES` - - `List item parent` - - `List item position` - - `Selected list items` + - [`Count list items`](../commands/count-list-items) + - [`Find in list`](../commands/find-in-list) + - [`GET LIST ITEM`](../commands/get-list-item) + - [`Get list item font`](../commands/get-list-item-font) + - [`GET LIST ITEM ICON`](../commands/get-list-item-icon) + - [`GET LIST ITEM PARAMETER`](../commands/get-list-item-parameter) + - [`GET LIST ITEM PROPERTIES`](../commands/get-list-item-properties) + - [`List item parent`](../commands/list-item-parent) + - [`List item position`](../commands/list-item-position) + - [`Selected list items`](../commands/selected-list-items) ## Generic commands to use with hierarchical lists It is possible to modify the appearance of a hierarchical list form objects using several generic 4D commands. You can pass to these commands either the object name of the hierarchical list (using the * parameter), or its variable name (containing the ListRef value): -- `OBJECT SET FONT` -- `OBJECT SET FONT STYLE` -- `OBJECT SET FONT SIZE` -- `OBJECT SET FILTER` -- `OBJECT SET ENTERABLE` -- `OBJECT SET SCROLLBAR` -- `OBJECT SET SCROLL POSITION` -- `OBJECT SET RGB COLORS` +- [`OBJECT SET FONT`](../commands/object-set-font) +- [`OBJECT SET FONT STYLE`](../commands/object-set-font-style) +- [`OBJECT SET FONT SIZE`](../commands/object-set-font-size) +- [`OBJECT SET FILTER`](../commands/object-set-filter) +- [`OBJECT SET ENTERABLE`](../commands/object-set-enterable) +- [`OBJECT SET SCROLLBAR`](../commands/object-set-scrollbar) +- [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position) +- [`OBJECT SET RGB COLORS`](../commands/object-set-rgb-colors) -> Reminder: Except `OBJECT SET SCROLL POSITION`, these commands modify all the representations of the same list, even if you only specify a list via its object name. +> Reminder: Except [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position), these commands modify all the representations of the same list, even if you only specify a list via its object name. ## Priority of property commands @@ -105,7 +105,7 @@ Certain properties of hierarchical lists (for example, the **Enterable** attribu 2. Generic object property commands 3. Form property -This principle is applied regardless of the order in which the commands are called. If an item property is modified individually via a hierarchical list command, the equivalent object property command will have no effect on this item even if it is called subsequently. For example, if the color of an item is modified via the `SET LIST ITEM PROPERTIES` command, the `OBJECT SET COLOR` command will have no effect on this item. +This principle is applied regardless of the order in which the commands are called. If an item property is modified individually via a hierarchical list command, the equivalent object property command will have no effect on this item even if it is called subsequently. For example, if the color of an item is modified via the [`SET LIST ITEM PROPERTIES`](../commands/set-list-item-properties) command, the `OBJECT SET COLOR` command will have no effect on this item. ## Management of items by position or by reference @@ -127,19 +127,19 @@ Here are a few tips for using reference numbers: 1. You do not need to identify each item with a unique number (beginner level). - First example: you build a system of tabs by programming, for example, an address book. Since the system returns the number of the tab selected, you will probably not need more information than this. In this case, do not worry about item reference numbers: pass any value (except 0) in the *itemRef* parameter. Note that for an address book system, you can predefine a list A, B, ..., Z in Design mode. You can also create it by programming in order to eliminate any letters for which there are no records. - - Second example: while working with a database, you progressively build a list of keywords. You can save this list at the end of each session by using the `SAVE LIST` or `LIST TO BLOB` commands and reload it at the beginning of each new session using the `Load list` or `BLOB to list` commands. You can display this list in a floating palette; when each user clicks on a keyword in the list, the item chosen is inserted into the enterable area that is selected in the foreground process. The important thing is that you only process the item selected, because the `Selected list items` command returns the position of the item that you must process. When using this position value, you obtain the title of the item by means of the `GET LIST ITEM` command. Here again, you do not need to identify each item individually; you can pass any value (except 0) in the *itemRef* parameter. + - Second example: while working with a database, you progressively build a list of keywords. You can save this list at the end of each session by using the [`SAVE LIST`](../commands/save-list) or [`LIST TO BLOB`](../commands/list-to-blob) commands and reload it at the beginning of each new session using the [`Load list`](../commands/load-list) or [`BLOB to list`](../commands/blob-to-list) commands. You can display this list in a floating palette; when each user clicks on a keyword in the list, the item chosen is inserted into the enterable area that is selected in the foreground process. The important thing is that you only process the item selected, because the [`Selected list items`](../commands/selected-list-items) command returns the position of the item that you must process. When using this position value, you obtain the title of the item by means of the [`GET LIST ITEM`](../commands/get-list-item) command. Here again, you do not need to identify each item individually; you can pass any value (except 0) in the *itemRef* parameter. 2. You need to partially identify the list items (intermediary level). -You use the item reference number to store information needed when you must work with the item; this point is detailed in the example of the `APPEND TO LIST` command. In this example, we use the item reference numbers to store record numbers. However, we must be able to establish a distinction between items that correspond to the [Department] records and those that correspond to the [Employees] records. +You use the item reference number to store information needed when you must work with the item; this point is detailed in the example of the [`APPEND TO LIST`](../commands/append-to-list) command. In this example, we use the item reference numbers to store record numbers. However, we must be able to establish a distinction between items that correspond to the [Department] records and those that correspond to the [Employees] records. 3. You need to identify all the list items individually (advanced level). -You program an elaborate management of hierarchical lists in which you absolutely must be able to identify each item individually at every level of the list. A simple way of implementing this is to maintain a personal counter. Suppose that you create a *hlList* list using the `APPEND TO LIST` command. At this stage, you initialize a counter *vhlCounter* to 1. Each time you call `APPEND TO LIST` or `INSERT IN LIST`, you increment this counter `(vhlCounter:=vhlCounter+1)`, and you pass the counter number as the item reference number. The trick consists in never decrementing the counter when you delete items — the counter can only increase. In this way, you guarantee the uniqueness of the item reference numbers. Since these numbers are of the Longint type, you can add or insert more than two billion items in a list that has been reinitialized... (however if you are working with such a great number of items, this usually means that you should use a table rather than a list.) +You program an elaborate management of hierarchical lists in which you absolutely must be able to identify each item individually at every level of the list. A simple way of implementing this is to maintain a personal counter. Suppose that you create a *hlList* list using the [`APPEND TO LIST`](../commands/append-to-list) command. At this stage, you initialize a counter *vhlCounter* to 1. Each time you call [`APPEND TO LIST`](../commands/append-to-list) or [`INSERT IN LIST`](../commands/insert-in-list), you increment this counter `(vhlCounter:=vhlCounter+1)`, and you pass the counter number as the item reference number. The trick consists in never decrementing the counter when you delete items — the counter can only increase. In this way, you guarantee the uniqueness of the item reference numbers. Since these numbers are of the Longint type, you can add or insert more than two billion items in a list that has been reinitialized... (however if you are working with such a great number of items, this usually means that you should use a table rather than a list.) > If you use Bitwise Operators, you can also use item reference numbers for storing information that can be put into a Longint, i.e. 2 Integers, 4-byte values or, yet again, 32 Booleans. ### When do you need unique reference numbers? -In most cases, when using hierarchical lists for user interface purposes and when only dealing with the selected item (the one that was clicked or dragged), you will not need to use item reference numbers at all. Using `Selected list items` and `GET LIST ITEM` you have all you need to deal with the currently selected item. In addition, commands such as `INSERT IN LIST` and `DELETE FROM LIST` allow you to manipulate the list “relatively” with respect to the selected item. +In most cases, when using hierarchical lists for user interface purposes and when only dealing with the selected item (the one that was clicked or dragged), you will not need to use item reference numbers at all. Using [`Selected list items`](../commands/selected-list-items) and [`GET LIST ITEM`](../commands/get-list-item) you have all you need to deal with the currently selected item. In addition, commands such as [`INSERT IN LIST`](../commands/insert-in-list) and [`DELETE FROM LIST`](../commands/delete-from-list) allow you to manipulate the list “relatively” with respect to the selected item. Basically, you need to deal with item reference numbers when you want direct access to any item of the list programmatically and not necessarily the one currently selected in the list. From 94254ac39e484d919f2a97ce999ae6af5458721a Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Wed, 24 Jun 2026 19:22:12 +0200 Subject: [PATCH 22/25] Update general.md --- docs/Preferences/general.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Preferences/general.md b/docs/Preferences/general.md index 300b63dc466aa8..6e193a06c800e4 100644 --- a/docs/Preferences/general.md +++ b/docs/Preferences/general.md @@ -96,7 +96,7 @@ Thanks to this principle, under macOS the database folders appear as packages ha ### Include tokens in project source files -When this option is checked, saved [method source files](../Project/architecture.md#sources) in new 4D projects will contain **tokens** for classic language and database objects (constants, commands, tables and fields). Tokens are additional characters such as `:C10` or `:5` inserted in the source code files, that allow renaming tables and fields and identifying elements whatever the 4D version (see [Using tokens in formulas](https://doc.4d.com/4Dv20/4D/20.6/Using-tokens-in-formulas.300-7487422.en.html)). +When this option is checked, saved [method source files](../Project/architecture.md#sources) in new 4D projects will contain [**tokens** for classic language and database objects (constants, commands, tables and fields)](../Concepts/methods.md#language-tokens). Tokens are additional characters such as `:C10` or `:5` inserted in the source code files, that allow renaming tables and fields and identifying elements whatever the 4D version. If you intend to use VCS or external code editors with your new projects, you might want to uncheck this option for a better readability of the code with these tools. From dfbbabb792ea85f1dc5697dad77f578ce1c18420 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 25 Jun 2026 12:06:37 +0200 Subject: [PATCH 23/25] relations and LDAP --- docs/Develop-legacy/records.md | 62 ++++++++++++++++++ docs/assets/en/Develop/relations.png | Bin 0 -> 13577 bytes docs/language-legacy/LDAP/ldap-login.md | 11 +++- .../language-legacy/LDAP/ldap-login.md | 10 ++- .../language-legacy/LDAP/ldap-login.md | 10 ++- .../language-legacy/LDAP/ldap-login.md | 10 ++- .../language-legacy/LDAP/ldap-login.md | 10 ++- 7 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 docs/assets/en/Develop/relations.png diff --git a/docs/Develop-legacy/records.md b/docs/Develop-legacy/records.md index 25e1705847e48e..b854cb6dcac864 100644 --- a/docs/Develop-legacy/records.md +++ b/docs/Develop-legacy/records.md @@ -306,3 +306,65 @@ Here is a list of these commands and their actions when a locked record is encou - [`ARRAY TO SELECTION`](../commands/array-to-selection): Does not save any locked records. If the command encounters a locked record, the record is put into the [`LockedSet` system set](./sets.md#the-lockedset-system-set). - [`GOTO RECORD`](../commands/goto-record): Records in a multi-user/multi-process database may be deleted and added by other users, therefore the record numbers may change. Use caution when directly referencing a record by number in a multi-user database. - [**Sets**](./sets.md): Take special care with sets, as the information that the set was based on may be changed by another user or process. + + +## Records and Relations + +Commands in the [Relations theme](../commands/theme/Relations.md), in particular [`RELATE ONE`](../commands/relate-one) and [`RELATE MANY`](../commands/relate-many), establish and manage the automatic and non-automatic relations between tables. Before using any of the commands in this theme, refer to the 4D Design Reference manual for information about creating relations between tables. + +### Using Automatic Table Relations with Commands + +Two tables can be related with automatic table relations. In general, when an automatic table relation is established, it loads or selects the related records in a related table. Many operations cause the relation to be established. + +These operations include: + +- Data entry +- Listing records on the screen in output forms +- Reporting +- Operations on a selection of records, such as queries, sorts, and applying a formula + +To optimize performance, when 4D establishes automatic relations, only one record becomes the current record for a table. For each of the operations listed above, the related record is loaded according to the following principles: + +- If a relation selects only one record of a related table, that record is loaded from disk. +- If a relation selects more than one record of a related table, a new selection of records is created for that table, and the first record in that selection is loaded from disk. + +For example, using the database structure displayed here, if a record for the [Employees] table is loaded and displayed for data entry, the related record from the [Companies] table is selected and is loaded. Similarly, if a record for the [Companies] table is loaded and displayed for data entry, the related records from the [Employees] table are selected. + +![](../assets/en/Develop/relations.png) + + +In this database structure, the [Employees] table is referred to as the **Many table**, and the [Companies] table is referred to as the **One table**. To remember this concept, think of "there are many employees related to one company" and "each company has many employees". + +Similarly, the Company field in the [Employees] table is referred to as the **Many field**, and the Name field in the [Companies] table is referred to as the **One** field. It is not always possible to have the related field be unique. For example, the [Companies]Name field may have several company records containing the same value. This non-unique situation can be easily handled by creating a relation, which will always be unique, on another field in the related table. This field could be a company ID field. + +The following table lists commands that use automatic relations to load related records during operation of the command. All of the commands will use existing automatic Many-to-One relations. Only those commands with Yes in the One-to-Many established column below will use automatic One-to-Many relations. + +|Command|One-to-Many established| +|--|--| +|[`ADD RECORD`](../commands/add-record) |Yes| +|[`APPLY TO SELECTION`](../commands/apply-to-selection)| No| +|[`DISPLAY SELECTION`](../commands/display-selection)| No| +|[`EXPORT DIF`](../commands/export-dif)| No| +|[`EXPORT SYLK`](../commands/export-sylk)| No| +|[`EXPORT TEXT`](../commands/export-text)| No| +|[`EXPORT DATA`](../commands/export-data)| No| +|[`MODIFY RECORD`](../commands/modify-record)| Yes| +|[`MODIFY SELECTION`](../commands/modify-selection)| Yes (in data entry)| +|[`ORDER BY`](../commands/order-by)| No| +|[`ORDER BY FORMULA`](../commands/order-by-formula)| No| +|[`QUERY BY FORMULA`](../commands/query-by-formula)| Yes| +|[`QUERY SELECTION`](../commands/query-selection)| Yes| +|[`QUERY`](../commands/query)| Yes| +|[`PRINT LABEL`](../commands/print-label)| No| +|[`PRINT SELECTION`](../commands/print-selection)| Yes| +|[`QR REPORT`](../commands/qr-report)| No| +|[`SELECTION TO ARRAY`](../commands/selection-to-array)| No| +|[`SELECTION RANGE TO ARRAY`](../commands/selection-range-to-array)| No| + + +### Using Commands to Establish Table Relations + +Automatic relations do not mean that the related record or records for a table will be selected simply because a command loads a record. In some cases, after using a command that loads a record, you must explicitly select the related records by using [`RELATE ONE`](../commands/relate-one) or [`RELATE MANY`](../commands/relate-many) if you need to access the related data. + +Some of the commands listed in the previous table (such as the query commands) load a current record after the task is completed. In this case, the record that is loaded does not automatically select the records related to it. Again, if you need to access the related data, you must explicitly select the related records by using [`RELATE ONE`](../commands/relate-one) or [`RELATE MANY`](../commands/relate-many). + diff --git a/docs/assets/en/Develop/relations.png b/docs/assets/en/Develop/relations.png new file mode 100644 index 0000000000000000000000000000000000000000..cba02ce581035dd0248b344c6e2646cd5fcd030a GIT binary patch literal 13577 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 **LDAP LOGIN** command opens a read-only connection to the LDAP server specified in the *url* parameter with the *login* and *password* identifiers provided. If accepted by the server, this connection will be used for any LDAP searches executed subsequently in the current process until the [LDAP LOGOUT](../commands/ldap-logout) command is executed (or until the process is closed). +:::info + +LDAP or *Lightweight Directory Access Protocol* is an open standard for accessing and maintaining distributed information services. For more information, please refer to the [Wikipedia page on LDAP](http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) or the [OpenLDAP Software](http://www.openldap.org/) main page. + +::: + In *url*, pass the full URL of the LDAP server you want to connect to, including the scheme and port (389 by default). This parameter should be compliant with [rfc2255](https://www.ietf.org/rfc/rfc2255.txt). You can open secure connections over TLS by using a *url* that starts with "ldaps" and uses a specific port number (for example "ldaps://svr.ldap.acme.com:1389"). The LDAP server must have an SSL Certificate (at least for Microsoft Active Directory). Using a TLS connection is highly recommended when the password is sent in plain text (see below). @@ -40,9 +46,9 @@ You can open secure connections over TLS by using a *url* that starts with "ldap In *login*, pass the user account on the LDAP server, and in *password*, pass the user password. By default, the *login* can be one of the following login strings, depending on the LDAP Server configuration: * a Distinguished Name (DN), for example "CN=John Smith,OU=users,DC=example,DC=com" -* the user name (CN), for example "CN=John Smith" +* the user name (CN for *Common Name*), for example "CN=John Smith" * an e-mail address, for example "johnsmith@4d.fr" -* an SAM-Account-Name, for example "jsmith". +* a SAM-Account-Name (*Security Account Manager*, logon name for Active Directory), for example "jsmith". Note that accepted values for the *login* are related to the password transmission mode as defined by the *digest* parameter. For example, in a default MS Active Directory configuration: @@ -105,7 +111,6 @@ This example tries to connect to an application: ## See also -*LDAP* [LDAP LOGOUT](../commands/ldap-logout) ## Properties diff --git a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md index 14754cabd08c53..12a03ceb5c1683 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md @@ -32,6 +32,12 @@ displayed_sidebar: docs El comando **LDAP LOGIN** abre una conexión de sólo lectura en el servidor LDAP especificado por el parámetro *url* con los identificadores *login* y *contraseña* suministrados. Si es aceptado por el servidor, esta conexión se utiliza para todas las búsquedas LDAP efectuadas posteriormente en el proceso actual hasta que el comando *RuntimeVLWinFolder* se ejecute (o hasta que el proceso se cierre). +:::info + +LDAP o *Lightweight Directory Access Protocol* es un estándar abierto para acceder y mantener servicios de información distribuidos. Para más información, consulte la [página de Wikipedia sobre LDAP](http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) o la página principal de [OpenLDAP Software](http://www.openldap.org/). + +::: + En *url*, pase el URL completo del servidor LDAP al cual conectarse, incluyendo el esquema y el puerto (389 por defecto). Este parámetro debe ser compatible con la [rfc2255](https://www.ietf.org/rfc/rfc2255.txt). Puede abrir conexiones seguras a través de TLS utilizando una mediante el uso de una *url* que empieza comience por "ldaps" y que utilice un número de puerto específico (por ejemplo "ldaps://svr.ldap.acme.com:1389"). El servidor LDAP debe tener un certificado SSL (al menos para Microsoft Active Directory). Es muy recomendable utilizar una conexión TLS cuando se envía la contraseña en texto plano (ver más abajo). @@ -41,9 +47,9 @@ Puede abrir conexiones seguras a través de TLS utilizando una mediante el uso d En *login*, pase la cuenta de usuario en el servidor LDAP, y en *contraseña*, pase la contraseña de usuario. Por defecto, el *login* puede ser una de las siguientes cadenas de inicio de sesión, dependiendo de la configuración del servidor LDAP: * un Distinguished Name (DN), por ejemplo "CN=John Smith,OU=users,DC=example,DC=com" -* un nombre de usuario (CN), por ejemplo "CN=John Smith" +* un nombre de usuario (CN para *Common Name*), por ejemplo "CN=John Smith" * una dirección de correo electrónico, por ejemplo "johnsmith@4d.fr" -* un SAM-Account-Name, por ejemplo "jsmith". +* un SAM-Account-Name (*Security Account Manager*, nombre de inicio de sesión para Active Directory), por ejemplo "jsmith". Tenga en cuenta que los valores aceptados para el *login* están relacionadas con el modo de transmisión de la contraseña definido por el parámetro *digest*. Por ejemplo, en una configuración por defecto de MS Active Directory: diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md index afd859d8c3ab20..2a57db00010f79 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md @@ -32,6 +32,12 @@ displayed_sidebar: docs La commande **LDAP LOGIN** ouvre une connexion en lecture seule sur le serveur LDAP désigné par le paramètre *url* avec les identifiants *login* et *motDePasse* fournis. Si elle est acceptée par le serveur, cette connexion sera utilisée pour toutes les recherches LDAP effectuées par la suite dans le process courant, jusqu'à ce que la commande [LDAP LOGOUT](../commands/ldap-logout) soit exécutée (ou que le process soit terminé). +:::info + +LDAP ou *Lightweight Directory Access Protocol* est un standard ouvert pour l'accès et la maintenance de services d'information distribués. Pour plus d'informations, veuillez consulter la [page Wikipedia sur LDAP](http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) ou la page principale du logiciel [OpenLDAP Software](http://www.openldap.org/). + +::: + Dans *url*, passez l'URL complet du serveur LDAP auquel se connecter, incluant le *scheme* et le port (389 by default). Ce paramètre doit être conforme à la [rfc2255](https://www.ietf.org/rfc/rfc2255.txt). Vous pouvez ouvrir une connexion sécurisée via TLS en passant un *url* qui débute par "ldaps" et qui utilise un numéro de port spécifique (par exemple "ldaps://svr.ldap.acme.com:1389"). Le serveur LDAP doit généralement disposer d'un certificat SSL (c'est le cas pour MS Active Directory). Il est fortement recommandé d'utiliser une connexion TLS lorsque le mot de passe est transmis en texte brut (voir ci-dessous). @@ -40,9 +46,9 @@ Vous pouvez ouvrir une connexion sécurisée via TLS en passant un *url* qui dé Dans *login*, passez le compte utilisateur sur le serveur LDAP et dans *motDePasse*, passez le mot de passe du compte. Le *login* peut prendre l'une des formes suivantes, en fonction de la configuration du serveur LDAP : * un Distinguished Name (DN), par exemple "CN=John Smith,OU=users,DC=example,DC=com" -* un nom d'utilisateur (CN), par exemple "CN=John Smith" +* un nom d'utilisateur (CN pour *Common Name*), par exemple "CN=John Smith" * une adresse email, par exemple "johnsmith@4d.fr" -* un SAM-Account-Name, par exemple "jsmith". +* un SAM-Account-Name (*Security Account Manager*, identifiant de connexion pour Active Directory), par exemple "jsmith". Notez que les valeurs admises pour le *login* sont liées au mode de transmission du mot de passe, défini par le paramètre *digest*. Par exemple, dans une configuration par défaut de MS Active Directory : diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md index b177b3ce9cc689..ca8c1adf887ec7 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md @@ -32,6 +32,12 @@ displayed_sidebar: docs **LDAP LOGIN** コマンドは*url* 引数で指定したLDAPサーバーに対し、*login* 引数と *password* 引数に渡された識別子をもって読み込み専用の接続を開きます。サーバーに受け入れられた場合、[LDAP LOGOUT](../commands/ldap-logout) コマンドが実行されるまで(あるいはプロセスが閉じられるまで)、カレントプロセスにおいてその後に実行される全てのLDAP検索にはこの接続が使用されます。 +:::info + +LDAP (*Lightweight Directory Access Protocol*) は、分散情報サービスへのアクセスおよび維持管理のためのオープンスタンダードです。詳細については、[LDAPに関するWikipediaのページ](http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) または [OpenLDAP Software](http://www.openldap.org/) のメインページを参照してください。 + +::: + *url* 引数には、スキームとポート(デフォルトでは389)を含め、接続するLDAPサーバーへの完全なURLを渡します。この引数は[rfc2255](https://www.ietf.org/rfc/rfc2255.txt)に準拠している必要があります。 *url* 引数に対し、"ldaps"で始まる、特定のポート番号(例: "ldaps://svr.ldap.acme.com:1389" 等)を使用した場合、TLS経由の安全な接続を開くことができます。LDAPサーバーは、(少なくともMicrosoft Active Directoryに対する)SSL証明書を持っている必要があります。パスワードが通常のテキストとして送信される場合にはTLS接続の使用が強く推奨 されます(以下を参照して下さい)。 @@ -40,9 +46,9 @@ displayed_sidebar: docs *login* 引数には、LDAPサーバー上のユーザーアカウントを渡し、*password* 引数にはパスワードを渡します。デフォルトで、*login* 引数にはLDAPサーバーの設定に応じて、以下の文字列のどれかを渡すことができます: * 識別名(DN)。例えば、"CN=John Smith,OU=users,DC=example,DC=com" -* ユーザー名(CN)。例えば、"CN=John Smith" +* ユーザー名(CN、*Common Name*)。例えば、"CN=John Smith" * メールアドレス。例えば、"johnsmith@4d.fr" -* SAM-アカウント名。例えば、"jsmith" +* SAM-アカウント名 (*Security Account Manager*、Active Directory のログオン名)。例えば、"jsmith" *login* 引数で受け入れ可能な値は、*digest* 引数で定義された送信モードと関係しているという点に注意して下さい。例えば、MS Active Directoryのデフォルトの設定においては、以下のようになっています: diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md index 1ffa1ad4745c59..146e19ea9998d6 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/LDAP/ldap-login.md @@ -32,6 +32,12 @@ displayed_sidebar: docs O comando**LDAP LOGIN** abre uma conexão somente leitura no servidor LDAP especificado pelo parâmetro *url* com os identificadores de *login* e *senha*. Se for aceito pelo servidor, esta ligação é utilizada para todas as pesquisas de LDAP posteriormente introduzidas no processo atual até que o comando *RuntimeVLWinFolder* sejaé executado (ou até que o processo seja fechado). +:::info + +LDAP ou *Lightweight Directory Access Protocol* é um padrão aberto para acessar e manter serviços de informação distribuídos. Para mais informações, consulte a [página da Wikipedia sobre LDAP](http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) ou a página principal do [OpenLDAP Software](http://www.openldap.org/). + +::: + Em *url*, passe a URL completa do servidor LDAP para se conectar, incluindo o esquema e o porto (389 por padrão). Este parâmetro tem de ser compatível com o [rfc2255](https://www.ietf.org/rfc/rfc2255.txt). Você pode abrir conexões seguras usando TLS usando uma *url* que começa com "ldaps" e usa um número de porta específico (por exemplo, "ldaps://svr.ldap.acme.com:1389") . O servidor LDAP deve ter um certificado SSL (pelo menos para Microsoft Active Directory). É altamente recomendável usar uma conexão TLS quando a senha for enviada em texto simples (veja abaixo). @@ -42,9 +48,9 @@ No *login*, passar a conta de usuário no servidor LDAP, e em *senha*, passe sen * um Distinguished Name (DN), por exemplo, "CN=John Smith,OU=users,DC=example,DC=com" -* um nome de usuário (CN), por exemplo, "CN = John Smith" +* um nome de usuário (CN para *Common Name*), por exemplo, "CN = John Smith" * endereço de e-mail, por exemplo "johnsmith@4d.fr" -* uma SAM-Account-Name, por exemplo "jsmith". +* uma SAM-Account-Name (*Security Account Manager*, nome de início de sessão para Active Directory), por exemplo "jsmith". Repare que os valores aceitos para o *login* estão relacionados com o modo de transmissão da senha definido pelo parâmetro *digest*. Por exemplo, em uma configuração padrão do MS Active Directory: * Quando o modo de transmissão for LDAP password MD5, o único valor aceito para um início de sessão é a SAM-Account-Name. From 68cf975ce12f77e0ffd3d151952594877b166d20 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 25 Jun 2026 14:30:46 +0200 Subject: [PATCH 24/25] Update sidebars.js --- sidebars.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sidebars.js b/sidebars.js index f1328c3c27e9cf..50fd818c19f4d3 100644 --- a/sidebars.js +++ b/sidebars.js @@ -334,7 +334,9 @@ module.exports = "Develop-legacy/transactions", "Tags/transformation-tags", "Project/date-time-formats", - "Develop-legacy/xml", + "Develop-legacy/xml" + /* + // not ready yet, needs imports from Design ref for records and selection concepts, { type: "category", label: "Records & Selections (legacy data access)", @@ -353,7 +355,7 @@ module.exports = "Develop-legacy/sets", "Develop-legacy/named-selections" ] - } + } */ ] }, { From 602bf2836968d5acc670830fe5cfbccfe711e169 Mon Sep 17 00:00:00 2001 From: arnaud-4d Date: Thu, 2 Jul 2026 17:47:03 +0200 Subject: [PATCH 25/25] ajout cache management commands overview dans les settings + fix lien dans database parameters --- .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- docs/settings/database.md | 45 +++++++++++++++---- .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../current/settings/database.md | 28 ++++++++++++ .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../current/settings/database.md | 28 ++++++++++++ .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../current/settings/database.md | 28 ++++++++++++ .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../current/settings/database.md | 28 ++++++++++++ .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- .../4D Environment/get-database-parameter.md | 2 +- .../4D Environment/set-database-parameter.md | 2 +- 25 files changed, 169 insertions(+), 28 deletions(-) diff --git a/docs/language-legacy/4D Environment/get-database-parameter.md b/docs/language-legacy/4D Environment/get-database-parameter.md index d8665e3dd75a11..d8a02fd5dbde61 100644 --- a/docs/language-legacy/4D Environment/get-database-parameter.md +++ b/docs/language-legacy/4D Environment/get-database-parameter.md @@ -123,7 +123,7 @@ Three synchronization modes are then possible on the client side. The Auto Synch **Possible values**: longint > 1 (seconds) -**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [XML DECODE](../commands/xml-decode) of the Database settings for the session (it is not stored in the Database settings). +**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [Database page](../../settings/database.md) of the settings for the session (it is not stored in the settings). diff --git a/docs/language-legacy/4D Environment/set-database-parameter.md b/docs/language-legacy/4D Environment/set-database-parameter.md index 3a369b5d72548a..ce8f35d8c7192a 100644 --- a/docs/language-legacy/4D Environment/set-database-parameter.md +++ b/docs/language-legacy/4D Environment/set-database-parameter.md @@ -130,7 +130,7 @@ Three synchronization modes are then possible on the client side. The Auto Synch **Possible values**: longint > 1 (seconds) -**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [XML DECODE](../commands/xml-decode) of the Database settings for the session (it is not stored in the Database settings). +**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [Database page](../../settings/database.md) of the settings for the session (it is not stored in the settings). diff --git a/docs/settings/database.md b/docs/settings/database.md index 0d74f51df9085c..9f45beac7dee28 100644 --- a/docs/settings/database.md +++ b/docs/settings/database.md @@ -114,15 +114,44 @@ You use the settings on this tab to configure the cache memory for the database. ![](../assets/en/settings/memory-maximum-size.png) -- **Calculation of adaptive cache not checked**: this mode, you set the size of the memory cache for the database yourself. 4D then displays an entry area that allows setting the memory cache to use as well as information related to the physical memory (RAM available on the machine), the current cache and cache after restart (taking your changes into account). +- **Calculation of adaptive cache not checked**: this mode, you set the size of the memory cache for the database yourself. 4D then displays an entry area that allows setting the memory cache to use as well as information related to the physical memory (RAM available on the machine), the current cache and cache after restart (taking your changes into account). - The size of the memory cache that you enter will be reserved for the 4D database, regardless of the state of machine resources. This setting can be used in certain specific configurations, or when the database is designed to be used on dissimilar systems in terms of memory. In most cases, the adaptive cache offers better performance. +The size of the memory cache that you enter will be reserved for the 4D database, regardless of the state of machine resources. This setting can be used in certain specific configurations, or when the database is designed to be used on dissimilar systems in terms of memory. In most cases, the adaptive cache offers better performance. -- **Flush Cache every ... Seconds/Minutes**: Specifies the time period between each automatic saving of the data cache, i.e., its writing to disk. - 4D saves the data placed in the cache at regular intervals. You can specify any time interval between 1 second and 500 minutes. By default, 4D saves your data every 20 seconds. The application also saves your data to disk each time you change to another environment or exit the application. You can also call the [FLUSH CACHE](../commands/flush-cache) command to trigger the flush at any moment. +- **Flush Cache every ... Seconds/Minutes**: Specifies the time period between each automatic saving of the data cache, i.e., its writing to disk. +4D saves the data placed in the cache at regular intervals. You can specify any time interval between 1 second and 500 minutes. By default, 4D saves your data every 20 seconds. The application also saves your data to disk each time you change to another environment or exit the application. You can also call the [`FLUSH CACHE`](../commands/flush-cache) command to trigger the flush at any moment. - When you anticipate heavy data entry, consider setting a short time interval between saves. In case of a power failure, you will only lose the data entered since the previous save (if the database is running without a log file). +When you anticipate heavy data entry, consider setting a short time interval between saves. In case of a power failure, you will only lose the data entered since the previous save (if the database is running without a log file). - If there is a noticeable slowing down of the database each time the cache is flushed, you need to adjust the frequency. This slowness means that a huge amount of records is being saved. A shorter period between saves would therefore be more efficient since each save would involve fewer records and hence be faster. - - By default, 4D displays a small window when the cache is flushed. If you do not want this visual reminder, you can uncheck the **Flushing progress** option on the [Interface page](./interface.md). +If there is a noticeable slowing down of the database each time the cache is flushed, you need to adjust the frequency. This slowness means that a huge amount of records is being saved. A shorter period between saves would therefore be more efficient since each save would involve fewer records and hence be faster. + +By default, 4D displays a small window when the cache is flushed. If you do not want this visual reminder, you can uncheck the **Flushing progress** option on the [Interface page](./interface.md). + +:::note + +You can modify temporary the cache flush frequency using the [`Cache flush periodicity` selector of the `SET DATABASE PARAMETER` command](../commands/set-database-parameter#cache-flush-periodicity-95). + +::: + + + + +### Managing priorities in database cache + +The 4D database cache includes an automatic priority management mechanism that provides a high level of efficiency and performance for data access. Thanks to this mechanism, when space is needed to load new data in the cache, low priority cached data are released first, while higher priority cached data remain loaded. + +This mechanism is fully automatic and usually, you will not have to worry about it. However, for specific cases it can be customized using a [set of dedicated commands from the "Cache Management" theme](../commands/theme/Cache_Management.md), which allow changing the priority of objects for the entire time the database is running, or temporarily for the current process. Note that these commands must be used carefully since they affect database performance. + +#### Priority management overview + +The Cache manager selects data to remove from the cache as necessary using a priority system. The three kinds of objects that can be loaded in the cache have a different priority: + +- **tables**: all standard field data (numeric, dates, etc.), excluding blobs (see below). Default priority is medium. +- **blobs**: all binary field data (text, picture, object and blobs) stored in the data file. Default priority is the lowest. +- **indexes**: all field indexes, including keyword indexes and composite indexes. Since indexes are frequently accessed, they have a special status in the cache. Default priority is the highest. + +Default priorities usually provide the best performances. However, for specific cases you can customize the cache priorities using two sets of 4D commands: + +- Commands that change the priorities for the whole session and all processes: [`SET TABLE CACHE PRIORITY`](../commands/set-table-cache-priority), [`SET INDEX CACHE PRIORITY`](../commands/set-index-cache-priority), and [`SET BLOBS CACHE PRIORITY`](../commands/set-blobs-cache-priority). These commands should be used in a startup database method. +- Commands that change the priorities only for the current process: [`ADJUST TABLE CACHE PRIORITY`](../commands/adjust-table-cache-priority), [`ADJUST INDEX CACHE PRIORITY`](../commands/adjust-index-cache-priority), and [`ADJUST BLOBS CACHE PRIORITY`](../commands/adjust-blobs-cache-priority). Use these commands to improve the performance of a temporary operation on your database and go back to initial priorities after the operation is finished. These commands are available only on 4D Server or 4D in local mode. + diff --git a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md index 05786444cfe324..bb8e169addba59 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md @@ -124,7 +124,7 @@ Tres modos de sincronización son posibles del lado del cliente. El selector Aut **Valores posibles:** entero largo > 1 (segundos) -**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en [XML DECODE](../commands/xml-decode) de la configuración de la base para la sesión (que no se almacena en las Propiedades de la base). +**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en la [página Base de datos](../../settings/database.md) de la configuración para la sesión (que no se almacena en la configuración). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md index 07b3f6e3a089b9..dc7b582769f30c 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md @@ -130,7 +130,7 @@ Tres modos de sincronización son posibles del lado del cliente. El selector Aut **Valores posibles:** entero largo > 1 (segundos) -**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en [XML DECODE](../commands/xml-decode) de la configuración de la base para la sesión (que no se almacena en las Propiedades de la base). +**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en la [página Base de datos](../../settings/database.md) de la configuración para la sesión (que no se almacena en la configuración). diff --git a/i18n/es/docusaurus-plugin-content-docs/current/settings/database.md b/i18n/es/docusaurus-plugin-content-docs/current/settings/database.md index 749bbc81261bd2..266fc43fdc21df 100644 --- a/i18n/es/docusaurus-plugin-content-docs/current/settings/database.md +++ b/i18n/es/docusaurus-plugin-content-docs/current/settings/database.md @@ -124,3 +124,31 @@ Utilice los parámetros de esta pestaña para configurar la memoria caché de la Si la base de datos se ralentiza notablemente cada vez que se vacía la caché, deberá ajustar la frecuencia. Esta lentitud significa que se está guardando una gran cantidad de registros. Por lo tanto, un periodo más corto entre guardados sería más eficaz, ya que cada guardado implicaría menos registros y, por lo tanto, sería más rápido. Por defecto, 4D muestra una pequeña ventana cuando se vacía la caché. Si no desea este recordatorio visual, puede deseleccionar la opción **Escritura de caché** en la [página Interfaz](./interface.md). + +:::note + +Puede modificar temporalmente la frecuencia de escritura de la caché utilizando el [selector `Cache flush periodicity` del comando `SET DATABASE PARAMETER`](../commands/set-database-parameter#cache-flush-periodicity-95). + +::: + + + + +### Gestión de las prioridades en la caché de la base de datos + +La caché de la base de datos 4D incluye un mecanismo automático de gestión de prioridades que ofrece un alto nivel de eficacia y rendimiento para el acceso a los datos. Gracias a este mecanismo, cuando se necesita espacio para cargar nuevos datos en la caché, los datos en caché de baja prioridad se liberan primero, mientras que los datos en caché de mayor prioridad permanecen cargados. + +Este mecanismo es totalmente automático y, por lo general, no tendrá que preocuparse por él. Sin embargo, para casos específicos puede personalizarse utilizando un [conjunto de comandos dedicados del tema "Gestión de caché"](../commands/theme/Cache_Management.md), que permiten cambiar la prioridad de los objetos durante todo el tiempo que la base de datos está en ejecución, o temporalmente para el proceso actual. Tenga en cuenta que estos comandos deben utilizarse con cuidado, ya que afectan al rendimiento de la base de datos. + +#### Descripción general de la gestión de prioridades + +El gestor de caché selecciona los datos a eliminar de la caché según sea necesario mediante un sistema de prioridades. Los tres tipos de objetos que se pueden cargar en la caché tienen una prioridad diferente: + +- **tablas**: todos los datos de campos estándar (numéricos, fechas, etc.), excluyendo los blobs (ver más abajo). La prioridad por defecto es media. +- **blobs**: todos los datos de campos binarios (texto, imagen, objeto y blobs) almacenados en el archivo de datos. La prioridad por defecto es la más baja. +- **índices**: todos los índices de campos, incluidos los índices de palabras clave y los índices compuestos. Dado que los índices se consultan con frecuencia, tienen un estatus especial en la caché. La prioridad por defecto es la más alta. + +Las prioridades por defecto suelen ofrecer el mejor rendimiento. Sin embargo, para casos específicos puede personalizar las prioridades de la caché utilizando dos conjuntos de comandos 4D: + +- Comandos que cambian las prioridades para toda la sesión y todos los procesos: [`SET TABLE CACHE PRIORITY`](../commands/set-table-cache-priority), [`SET INDEX CACHE PRIORITY`](../commands/set-index-cache-priority), y [`SET BLOBS CACHE PRIORITY`](../commands/set-blobs-cache-priority). Estos comandos deben utilizarse en un método base de inicio. +- Comandos que cambian las prioridades sólo para el proceso actual: [`ADJUST TABLE CACHE PRIORITY`](../commands/adjust-table-cache-priority), [`ADJUST INDEX CACHE PRIORITY`](../commands/adjust-index-cache-priority), y [`ADJUST BLOBS CACHE PRIORITY`](../commands/adjust-blobs-cache-priority). Utilice estos comandos para mejorar el rendimiento de una operación temporal en su base de datos y volver a las prioridades iniciales una vez finalizada la operación. Estos comandos sólo están disponibles en 4D Server o 4D en modo local. diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md index 1a3c66e0bf844a..37987c73de48aa 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md @@ -123,7 +123,7 @@ Tres modos de sincronización son posibles del lado del cliente. El selector Aut **Valores posibles:** entero largo > 1 (segundos) -**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en [XML DECODE](../commands/xml-decode) de la configuración de la base para la sesión (que no se almacena en las Propiedades de la base). +**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en la [página Base de datos](../../settings/database.md) de la configuración para la sesión (que no se almacena en la configuración). diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md index 3b8603ba23e79b..faf2a1537bfc0b 100644 --- a/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/es/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md @@ -129,7 +129,7 @@ Tres modos de sincronización son posibles del lado del cliente. El selector Aut **Valores posibles:** entero largo > 1 (segundos) -**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en [XML DECODE](../commands/xml-decode) de la configuración de la base para la sesión (que no se almacena en las Propiedades de la base). +**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en la [página Base de datos](../../settings/database.md) de la configuración para la sesión (que no se almacena en la configuración). diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md index 3ebf1e4039b0ae..2f81264281d6e4 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md @@ -124,7 +124,7 @@ Portée : 4D local, 4D Server **Valeurs possibles** : entier long > 1 (secondes) -**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [XML DECODE](../commands/xml-decode) des Propriétés de la base durant la session courante (elle n'est pas stockée dans les Propriétés de la base). +**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [page Base de données](../../settings/database.md) des paramètres durant la session courante (elle n'est pas stockée dans les paramètres). diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md index e13bd8f7bb314c..ec394e78e12f0f 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md @@ -129,7 +129,7 @@ Portée : 4D local, 4D Server **Valeurs possibles** : entier long > 1 (secondes) -**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [XML DECODE](../commands/xml-decode) des Propriétés de la base durant la session courante (elle n'est pas stockée dans les Propriétés de la base). +**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [page Base de données](../../settings/database.md) des paramètres durant la session courante (elle n'est pas stockée dans les paramètres). diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/settings/database.md b/i18n/fr/docusaurus-plugin-content-docs/current/settings/database.md index e5b16d1f91f96e..2385c4e76d50e3 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/current/settings/database.md +++ b/i18n/fr/docusaurus-plugin-content-docs/current/settings/database.md @@ -124,3 +124,31 @@ Utilisez les paramètres de cet onglet pour configurer la mémoire cache de la b Si chaque opération d’écriture du cache est accompagnée d’un fort ralentissement de la base de données, il faut ajuster la fréquence. Ce symptôme signifie une sauvegarde massive d’enregistrements. Dans ce cas, une fréquence d’écriture plus élevée, donc plus rapide, est plus efficace. Par défaut, 4D affiche une petite fenêtre lors de l'écriture du cache. Si vous ne voulez pas ce rappel visuel, vous pouvez désélectionner l'option **Ecriture du cache** dans la [Page Interface](./interface.md). + +:::note + +Vous pouvez modifier temporairement la fréquence d'écriture du cache à l'aide du [sélecteur `Cache flush periodicity` de la commande `SET DATABASE PARAMETER`](../commands/set-database-parameter#cache-flush-periodicity-95). + +::: + + + + +### Gestion des priorités dans le cache de la base de données + +Le cache de la base de données 4D inclut un mécanisme automatique de gestion des priorités qui offre un haut niveau d'efficacité et de performance pour l'accès aux données. Grâce à ce mécanisme, lorsque de l'espace est nécessaire pour charger de nouvelles données dans le cache, les données mises en cache de faible priorité sont libérées en premier, tandis que les données mises en cache de priorité plus élevée restent chargées. + +Ce mécanisme est entièrement automatique et, en général, vous n'aurez pas à vous en préoccuper. Toutefois, pour des cas spécifiques, il peut être personnalisé à l'aide d'un [ensemble de commandes dédiées du thème "Gestion du cache"](../commands/theme/Cache_Management.md), qui permettent de modifier la priorité des objets pendant toute la durée de fonctionnement de la base, ou temporairement pour le process courant. Notez que ces commandes doivent être utilisées avec précaution car elles affectent les performances de la base de données. + +#### Présentation de la gestion des priorités + +Le gestionnaire de cache sélectionne les données à retirer du cache si nécessaire à l'aide d'un système de priorités. Les trois types d'objets pouvant être chargés dans le cache ont une priorité différente : + +- **tables** : toutes les données de champs standard (numériques, dates, etc.), à l'exclusion des blobs (voir ci-dessous). La priorité par défaut est moyenne. +- **blobs** : toutes les données de champs binaires (texte, image, objet et blobs) stockées dans le fichier de données. La priorité par défaut est la plus basse. +- **index** : tous les index de champs, y compris les index par mots-clés et les index composites. Étant donné que les index sont fréquemment consultés, ils ont un statut spécial dans le cache. La priorité par défaut est la plus élevée. + +Les priorités par défaut offrent généralement les meilleures performances. Toutefois, pour des cas spécifiques, vous pouvez personnaliser les priorités du cache à l'aide de deux ensembles de commandes 4D : + +- Les commandes qui modifient les priorités pour toute la session et tous les process : [`SET TABLE CACHE PRIORITY`](../commands/set-table-cache-priority), [`SET INDEX CACHE PRIORITY`](../commands/set-index-cache-priority), et [`SET BLOBS CACHE PRIORITY`](../commands/set-blobs-cache-priority). Ces commandes doivent être utilisées dans une méthode base sur ouverture. +- Les commandes qui modifient les priorités uniquement pour le process courant : [`ADJUST TABLE CACHE PRIORITY`](../commands/adjust-table-cache-priority), [`ADJUST INDEX CACHE PRIORITY`](../commands/adjust-index-cache-priority), et [`ADJUST BLOBS CACHE PRIORITY`](../commands/adjust-blobs-cache-priority). Utilisez ces commandes pour améliorer les performances d'une opération temporaire sur votre base et revenir aux priorités initiales une fois l'opération terminée. Ces commandes sont disponibles uniquement sur 4D Server ou 4D en mode local. diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md index 3029942e49a485..c4a336453e54e6 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md @@ -123,7 +123,7 @@ Portée : 4D local, 4D Server **Valeurs possibles** : entier long > 1 (secondes) -**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [XML DECODE](../commands/xml-decode) des Propriétés de la base durant la session courante (elle n'est pas stockée dans les Propriétés de la base). +**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [page Base de données](../../settings/database.md) des paramètres durant la session courante (elle n'est pas stockée dans les paramètres). diff --git a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md index b419010fd3279f..3b21b7314ba0e9 100644 --- a/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/fr/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md @@ -128,7 +128,7 @@ Portée : 4D local, 4D Server **Valeurs possibles** : entier long > 1 (secondes) -**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [XML DECODE](../commands/xml-decode) des Propriétés de la base durant la session courante (elle n'est pas stockée dans les Propriétés de la base). +**Description** : Permet de lire ou de fixer la valeur courante de périodicité de l'écriture du cache de données sur le disque, exprimée en secondes. Si elle est modifiée, cette valeur remplace la valeur définie par l'option **Ecriture cache toutes les secondes/minutes** dans la [page Base de données](../../settings/database.md) des paramètres durant la session courante (elle n'est pas stockée dans les paramètres). diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md index 6a949c77247b94..8685d1626ffc5e 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md @@ -123,7 +123,7 @@ displayed_sidebar: docs **取りうる値**: 倍長整数 > 1 (秒) -**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、データベース設定の[XML DECODE](../commands/xml-decode)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これはデータベース設定には保存されません)。 +**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、設定の[データベースページ](../../settings/database.md)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これは設定には保存されません)。 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md index 6b7034318b01e5..f36cfe74af4b51 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md @@ -128,7 +128,7 @@ displayed_sidebar: docs **取りうる値**: 倍長整数 > 1 (秒) -**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、データベース設定の[XML DECODE](../commands/xml-decode)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これはデータベース設定には保存されません)。 +**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、設定の[データベースページ](../../settings/database.md)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これは設定には保存されません)。 diff --git a/i18n/ja/docusaurus-plugin-content-docs/current/settings/database.md b/i18n/ja/docusaurus-plugin-content-docs/current/settings/database.md index 1cc0aace262db0..f745ffe4e62aac 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/current/settings/database.md +++ b/i18n/ja/docusaurus-plugin-content-docs/current/settings/database.md @@ -120,3 +120,31 @@ UUID バージョン7の詳細な情報については、 [こちらのblog記 キャッシュがフラッシュされるたびにデータベースの動作が遅くなる場合、周期を調整する必要があります。 動作が遅くなるのは、大量のレコードがディスクにフラッシュされるためです。 フラッシュ周期を短くすることで、各フラッシュ時に保存されるレコード数を減らすことができ、動作も速くなります。 デフォルトで 4D はキャッシュがフラッシュされていることを示す小さなウィンドウを表示します。 このウィンドウを表示したくない場合、[インターフェースページ](./interface.md) の **フラッシュの進捗状況** オプションの選択を解除します。 + +:::note + +[`SET DATABASE PARAMETER` コマンドの `Cache flush periodicity` セレクター](../commands/set-database-parameter#cache-flush-periodicity-95) を使用して、キャッシュのフラッシュ周期を一時的に変更できます。 + +::: + + + + +### データベースキャッシュにおける優先度の管理 + +4D データベースキャッシュには、データアクセスの高い効率性とパフォーマンスを提供する自動優先度管理メカニズムが含まれています。 このメカニズムにより、新しいデータをキャッシュにロードするためのスペースが必要になると、優先度の低いキャッシュデータが先に解放され、優先度の高いキャッシュデータはロードされたままになります。 + +このメカニズムは完全に自動化されており、通常は気にする必要はありません。 ただし、特定のケースでは、[「キャッシュ管理」テーマの専用コマンド群](../commands/theme/Cache_Management.md) を使用してカスタマイズできます。これらのコマンドを使うと、データベースの実行中ずっと、または現在のプロセスに対して一時的に、オブジェクトの優先度を変更できます。 これらのコマンドはデータベースのパフォーマンスに影響するため、注意して使用する必要があります。 + +#### 優先度管理の概要 + +キャッシュマネージャーは、必要に応じて優先度システムを使用してキャッシュから削除するデータを選択します。 キャッシュにロードできる 3 種類のオブジェクトは、それぞれ異なる優先度を持ちます: + +- **テーブル**: blob を除く、すべての標準フィールドデータ (数値、日付など) (以下参照)。 デフォルトの優先度は中です。 +- **blob**: データファイルに格納される、すべてのバイナリフィールドデータ (テキスト、ピクチャー、オブジェクト、blob)。 デフォルトの優先度は最も低いです。 +- **インデックス**: キーワードインデックスや複合インデックスを含む、すべてのフィールドインデックス。 インデックスは頻繁にアクセスされるため、キャッシュ内で特別なステータスを持ちます。 デフォルトの優先度は最も高いです。 + +デフォルトの優先度は通常、最良のパフォーマンスを提供します。 ただし、特定のケースでは、2 種類の 4D コマンド群を使用してキャッシュの優先度をカスタマイズできます: + +- セッション全体とすべてのプロセスの優先度を変更するコマンド: [`SET TABLE CACHE PRIORITY`](../commands/set-table-cache-priority)、[`SET INDEX CACHE PRIORITY`](../commands/set-index-cache-priority)、および [`SET BLOBS CACHE PRIORITY`](../commands/set-blobs-cache-priority)。 これらのコマンドは、起動時データベースメソッドで使用する必要があります。 +- 現在のプロセスの優先度のみを変更するコマンド: [`ADJUST TABLE CACHE PRIORITY`](../commands/adjust-table-cache-priority)、[`ADJUST INDEX CACHE PRIORITY`](../commands/adjust-index-cache-priority)、および [`ADJUST BLOBS CACHE PRIORITY`](../commands/adjust-blobs-cache-priority)。 一時的な操作のパフォーマンスを改善し、操作終了後に初期の優先度に戻すには、これらのコマンドを使用します。 これらのコマンドは 4D Server または ローカルモードの 4D でのみ使用できます。 diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md index d5eb985018e714..abc9adf3312943 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md @@ -122,7 +122,7 @@ displayed_sidebar: docs **取りうる値**: 倍長整数 > 1 (秒) -**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、データベース設定の[XML DECODE](../commands/xml-decode)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これはデータベース設定には保存されません)。 +**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、設定の[データベースページ](../../settings/database.md)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これは設定には保存されません)。 diff --git a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md index 6f84881c65367c..0e7ee5dfb1da61 100644 --- a/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/ja/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md @@ -127,7 +127,7 @@ displayed_sidebar: docs **取りうる値**: 倍長整数 > 1 (秒) -**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、データベース設定の[XML DECODE](../commands/xml-decode)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これはデータベース設定には保存されません)。 +**詳細**: 秒単位で指定された、キャッシュ保存頻度を取得あるいは設定します。この値を変更すると、設定の[データベースページ](../../settings/database.md)内の**キャッシュを保存: X秒毎**オプションをセッション中の間上書きします(これは設定には保存されません)。 diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md index 086cdbe555ff77..567949d81ccfd5 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/get-database-parameter.md @@ -745,7 +745,7 @@ Deverá reiniciar a aplicação para que este parâmetro seja levado em conta. N **Valores possíveis**: longint > 1 (segundos) -**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** em [XML DECODE](../commands/xml-decode) das configurações de Bancos de Dados para a sessão (não é armazenada nas configurações do Banco de Dados). +**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** na [página Banco de dados](../../settings/database.md) das configurações para a sessão (não é armazenada nas configurações). diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md index f7e00f5db5f2db..055def2d326588 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/language-legacy/4D Environment/set-database-parameter.md @@ -750,7 +750,7 @@ Deverá reiniciar a aplicação para que este parâmetro seja levado em conta. N **Valores possíveis**: longint > 1 (segundos) -**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** em [XML DECODE](../commands/xml-decode) das configurações de Bancos de Dados para a sessão (não é armazenada nas configurações do Banco de Dados). +**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** na [página Banco de dados](../../settings/database.md) das configurações para a sessão (não é armazenada nas configurações). diff --git a/i18n/pt/docusaurus-plugin-content-docs/current/settings/database.md b/i18n/pt/docusaurus-plugin-content-docs/current/settings/database.md index 7fb4cb4393573a..ca9c97c07f007e 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/current/settings/database.md +++ b/i18n/pt/docusaurus-plugin-content-docs/current/settings/database.md @@ -124,3 +124,31 @@ Você usa as configurações nesta aba para configurar a memória em cache para Se houver uma lentidão notável no banco de dados toda vez que o cache for liberado, você precisará ajustar a frequência. Essa lentidão significa que uma grande quantidade de registros está sendo salva. Um período mais curto entre as economias seria portanto mais eficaz, uma vez que cada poupança implicaria menos registos e, por conseguinte, mais rápido. Por padrão, 4D exibe uma pequena janela quando o cache é liberado. Si no desea este recordatorio visual, puede deseleccionar la opción **Escritura de caché** en la [página Interfaz](./interface.md). + +:::note + +Você pode modificar temporariamente a frequência de escrita do cache usando o [seletor `Cache flush periodicity` do comando `SET DATABASE PARAMETER`](../commands/set-database-parameter#cache-flush-periodicity-95). + +::: + + + + +### Gerenciamento de prioridades no cache do banco de dados + +O cache do banco de dados 4D inclui um mecanismo automático de gerenciamento de prioridades que oferece um alto nível de eficiência e desempenho para o acesso aos dados. Graças a esse mecanismo, quando é necessário espaço para carregar novos dados no cache, os dados em cache de baixa prioridade são liberados primeiro, enquanto os dados em cache de prioridade mais alta permanecem carregados. + +Esse mecanismo é totalmente automático e, geralmente, você não terá que se preocupar com ele. No entanto, para casos específicos, ele pode ser personalizado usando um [conjunto de comandos dedicados do tema "Cache Management"](../commands/theme/Cache_Management.md), que permitem alterar a prioridade dos objetos durante todo o tempo em que o banco de dados está em execução, ou temporariamente para o processo atual. Observe que esses comandos devem ser usados com cuidado, pois afetam o desempenho do banco de dados. + +#### Visão geral do gerenciamento de prioridades + +O gerenciador de cache seleciona os dados a serem removidos do cache conforme necessário usando um sistema de prioridades. Os três tipos de objetos que podem ser carregados no cache têm uma prioridade diferente: + +- **tabelas**: todos os dados de campos padrão (numéricos, datas, etc.), excluindo os blobs (ver abaixo). A prioridade padrão é média. +- **blobs**: todos os dados de campos binários (texto, imagem, objeto e blobs) armazenados no arquivo de dados. A prioridade padrão é a mais baixa. +- **índices**: todos os índices de campos, incluindo índices de palavras-chave e índices compostos. Como os índices são acessados com frequência, eles têm um status especial no cache. A prioridade padrão é a mais alta. + +As prioridades padrão geralmente oferecem o melhor desempenho. No entanto, para casos específicos, você pode personalizar as prioridades do cache usando dois conjuntos de comandos 4D: + +- Comandos que alteram as prioridades para toda a sessão e todos os processos: [`SET TABLE CACHE PRIORITY`](../commands/set-table-cache-priority), [`SET INDEX CACHE PRIORITY`](../commands/set-index-cache-priority), e [`SET BLOBS CACHE PRIORITY`](../commands/set-blobs-cache-priority). Esses comandos devem ser usados em um método de banco de dados de inicialização. +- Comandos que alteram as prioridades apenas para o processo atual: [`ADJUST TABLE CACHE PRIORITY`](../commands/adjust-table-cache-priority), [`ADJUST INDEX CACHE PRIORITY`](../commands/adjust-index-cache-priority), e [`ADJUST BLOBS CACHE PRIORITY`](../commands/adjust-blobs-cache-priority). Use esses comandos para melhorar o desempenho de uma operação temporária no seu banco de dados e retornar às prioridades iniciais após a conclusão da operação. Esses comandos estão disponíveis apenas no 4D Server ou no 4D em modo local. diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md index e41be9a6dd70c7..9ea279e2240a72 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md @@ -744,7 +744,7 @@ Deverá reiniciar a aplicação para que este parâmetro seja levado em conta. N **Valores possíveis**: longint > 1 (segundos) -**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** em [XML DECODE](../commands/xml-decode) das configurações de Bancos de Dados para a sessão (não é armazenada nas configurações do Banco de Dados). +**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** na [página Banco de dados](../../settings/database.md) das configurações para a sessão (não é armazenada nas configurações). diff --git a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md index 528528d3a6a8e9..aa7573b5074f3a 100644 --- a/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md +++ b/i18n/pt/docusaurus-plugin-content-docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md @@ -749,7 +749,7 @@ Deverá reiniciar a aplicação para que este parâmetro seja levado em conta. N **Valores possíveis**: longint > 1 (segundos) -**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** em [XML DECODE](../commands/xml-decode) das configurações de Bancos de Dados para a sessão (não é armazenada nas configurações do Banco de Dados). +**Descrição**: Obtém ou estabelece a peridiocidade de esvaziamento da cache atual, expressa em segundos. Modificar este valor sobrepuja a opção **Flush Cache every X Seconds** na [página Banco de dados](../../settings/database.md) das configurações para a sessão (não é armazenada nas configurações). diff --git a/versioned_docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md b/versioned_docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md index ba62c8b1d69f1b..a4840a70f51671 100644 --- a/versioned_docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md +++ b/versioned_docs/version-21-R3/language-legacy/4D Environment/get-database-parameter.md @@ -123,7 +123,7 @@ Three synchronization modes are then possible on the client side. The Auto Synch **Possible values**: longint > 1 (seconds) -**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [XML DECODE](../commands/xml-decode) of the Database settings for the session (it is not stored in the Database settings). +**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [Database page](../../settings/database.md) of the settings for the session (it is not stored in the settings). diff --git a/versioned_docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md b/versioned_docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md index 0f6c8aa9e0e226..150036d1ec04e7 100644 --- a/versioned_docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md +++ b/versioned_docs/version-21-R3/language-legacy/4D Environment/set-database-parameter.md @@ -129,7 +129,7 @@ Three synchronization modes are then possible on the client side. The Auto Synch **Possible values**: longint > 1 (seconds) -**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [XML DECODE](../commands/xml-decode) of the Database settings for the session (it is not stored in the Database settings). +**Description**: Gets or sets the current cache flush periodicity, expressed in seconds. Modifying this value overrides the **Flush Cache every X Seconds** option in the [Database page](../../settings/database.md) of the settings for the session (it is not stored in the settings).