<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://brwiki2.brulescorp.com/brwiki2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=GomezL</id>
	<title>BR Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://brwiki2.brulescorp.com/brwiki2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=GomezL"/>
	<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Special:Contributions/GomezL"/>
	<updated>2026-05-31T22:02:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Encryption&amp;diff=11505</id>
		<title>Encryption</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Encryption&amp;diff=11505"/>
		<updated>2026-04-03T03:20:11Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Document Status Encrypt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(As of 4.30)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Encryption&#039;&#039;&#039; encompasses a number of different operations.  These operations can be used independently or in combination to meet different needs.  We use industry standard encryption available through OpenSSL.  Three technologies are widely used for encrypting data. BR supports the first two listed below through its [[ENCRYPT]] and [[DECRYPT]] [[internal functions]]. &lt;br /&gt;
&lt;br /&gt;
==Overview of Two Encryption Methods==&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Symmetric key ciphers&#039;&#039;&#039; – where the same key is used to encrypt and decrypt data. You can specify a key to encrypt some data and later use the same key to decrypt the data.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Hashing routines&#039;&#039;&#039; – one way routines that take data and convert it to a hash value.  Sometimes these are thought of as checksums such as MD5 sum.  Hash values are always the same length regardless of how big the hashed data is.  A 10 gb file will have a hash result that is the same length as a 200 byte file. Hashing routines have a number of specific uses, including:&lt;br /&gt;
*Verify that data has not changed.&lt;br /&gt;
*Verifying that two files are the same.&lt;br /&gt;
*Validating passwords – this is based on the concept that if two values have the same hash value the values are equal.  Using this technique improves security because it allows a server to store passwords in an unrecoverable format.  Even the server software is unable to regenerate the original password.  It is only capable of checking if the hash of a password matches the stored password hash.&lt;br /&gt;
&lt;br /&gt;
==Symmetric Key Ciphers==&lt;br /&gt;
There are two encryption functions in the BR language, [[ENCRYPT$]] and [[DECRYPT$]].&lt;br /&gt;
&lt;br /&gt;
 ENCRYPT$(Data$ [,Key$ [,Encryption-type$ [,Initialization-vector$]]])&lt;br /&gt;
 DECRYPT$(Data$ [,Key$ [,Encryption-type$ [,Initialization-vector$]]])&lt;br /&gt;
&lt;br /&gt;
Data$ - The data to be encrypted&lt;br /&gt;
&lt;br /&gt;
Key$ - The secret key to be used for encryption.  If not specified this value will come from an OPTION 66 statement.&lt;br /&gt;
&lt;br /&gt;
Encryption-type$ - The type of encryption to be done.  If not specified, a common high strength encryption type will be employed.  This is described in more detail below, but is generally only useful for interfacing with other typically non-BR programs.&lt;br /&gt;
&lt;br /&gt;
Initialization-vector$ - This is an arcane part of encryption standards. It exists to prevent attackers from being able to tell whether the unencrypted data has changed. This is described in more detail below, but is general only needed when interfacing with other non-BR programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interfacing With Other Programs (encryption type and initialization vector)==&lt;br /&gt;
There are a number of different types of encryption that BR supports through OpenSSL:  AES, BLOWFISH, DES, triple DES, RC4 and RC2.  Most symmetric key ciphers are block ciphers meaning that they encrypt one block at a time. This means if you have a bit message, it is broken up into multiple blocks and each block is encrypted. The block size can be set as (128, 192, 256) bits. Some encryption types don&#039;t support all of these values so STATUS ENCRYPTION should be checked to see what encryption types are available in BR. Besides block size, there are also various schemes for blocking data. One might expect that using 256 bit blocking would simply take every 32 bytes and call it a block.  This is not done though because there is a possibility that this would cause patterns in the encrypted data. To prevent this, there are various schemes known as codebooks which change the way data is blocked. Wikipedia explains this in more detail. If the encryption type is not specified AES:256:CBC:128 will be used. To be compatible with other programs the entire encryption type must be specified (cipher: key length: codebook: initialization vector length).&lt;br /&gt;
&lt;br /&gt;
Initialization-vector – this is used to cause the same data encrypted with the same key to have a different encrypted result. This is significant because otherwise an attacker looking at data seeing the same encrypted result twice would know that the key and the unencrypted data have not changed. Regardless of whether or not you are concerned about this potential security issue, the standard encryption methods require this value so interfacing with other programs may require you to use it. It is a common practice to use a random number for this value and store the value at the beginning of (ahead of) the encrypted result. This is what BR does if this parameter is omitted.&lt;br /&gt;
&lt;br /&gt;
As an example:&lt;br /&gt;
 ENCRYPT$(“test”,“key”) &lt;br /&gt;
Produces a string containing “random number initialization vector”&amp;amp;”encrypted result”.&lt;br /&gt;
&lt;br /&gt;
If the initialization vector is explicitly specified as in:&lt;br /&gt;
ENCRYPT$(“test”,“key”,“AES:256:CBC:128”,“RANDOM”) &lt;br /&gt;
the result would be simply “encrypted result”.&lt;br /&gt;
&lt;br /&gt;
DECRYPT$ has the same arguments as ENCRYPT$ with the exception of the first parameter which is the encrypted data. DECRYPT$ expects to be used with the same key$, encryption-type$, and initialization-vector$ as was used to encrypt the data.  As with ENCRYPT$, if key$ is not specified, the value from the OPTION statement will be used. If encryption-type$ is not specified, “AES:256:CBC:128” will be used. If the initialization vector is not specified, it will be assumed that the encrypted data starts with an initialization vector.&lt;br /&gt;
&lt;br /&gt;
==Hashing Routines==&lt;br /&gt;
Three common forms of hashing are allowed in BR. They are MD5, SHA, and SHA-1. These are also provided through the ENCRYPT$ function specifying a null key$ value:&lt;br /&gt;
&lt;br /&gt;
 ENCRYPT$(data$, “”, “MD5”) ENCRYPT$(data$, “”, “SHA”) ENCRYPT$(data$, “”, “SHA-1”)&lt;br /&gt;
&lt;br /&gt;
Hashing is also referred to as Message Digests or digests. This is what the MD in MD5 means. There is no way to restore data that has been hashed. Hashing is a one way function so DECRYPT$ will yield an error.&lt;br /&gt;
&lt;br /&gt;
==Asymmetric Encryption==&lt;br /&gt;
Asymmetric key encryption is also known as public/private key encryption.&lt;br /&gt;
&lt;br /&gt;
Public/private keys are created as a pair by a key generator.  They are a pair, and it is not possible to have two public keys for the same private key or vice versa. With regard to public/private key pairs, what one key encrypts the other key can decrypt, and neither key can decrypt what it has encrypted.  When a private key is used to encrypt data, the result is called a signature because everyone who has the public key can decrypt it.&lt;br /&gt;
&lt;br /&gt;
This technique is used for:&lt;br /&gt;
&lt;br /&gt;
Signing (using certificates) – A private key can be used to sign data. The result of such signing can be tested/validated with the corresponding public key.&lt;br /&gt;
&lt;br /&gt;
Data encryption – A public key can be used to encrypt data. This data can then only be decrypted by the corresponding private key.&lt;br /&gt;
&lt;br /&gt;
Hashes and signing are different but used together.  Rather than signing a large block of data which would create a large signature, only the hash is signed to create much smaller fixed length signature data.  When verifying a large block of signed data, the data is used to create a hash value and the hash value is compared to a decrypted signature.&lt;br /&gt;
&lt;br /&gt;
Asymmetric encryption is not accessible through the BR ENCRYPT$, DECRYPT$ functions. However, it is used by our SSL client server connections and HTTPS. Certificates are most commonly used by SSL and HTTPS and are less useful for other application processes. &lt;br /&gt;
&lt;br /&gt;
In the Client Server model the client knows the server’s public key and the server uses its private key to encrypt and decrypt.  BRclient.exe connects to BRListener.exe by opening an SSL socket on the server using DHE_RSA-AES256-SHA Encryption. Handshaking is performed using a private key stored on the server within BRListener. Once authenticated, the socket is then passed to BRServer.exe for actual data processing.&lt;br /&gt;
&lt;br /&gt;
Encryption is invoked by Business Rules HTTP support as follows:&lt;br /&gt;
&lt;br /&gt;
 CONFIG HTTPS port-number   [ LOG file-pathname ] [CERT= cert-file-basename]&lt;br /&gt;
 CONFIG OPTION  66   private-key-file-encryption-password&lt;br /&gt;
 OPEN #400: “HTTP=SERVER”, DISPLAY, OUTIN&lt;br /&gt;
&lt;br /&gt;
The BRSERVER executable directory must contain two files:&lt;br /&gt;
&lt;br /&gt;
 https-private.pem&lt;br /&gt;
 https-cert.pem&lt;br /&gt;
&lt;br /&gt;
These files are made by the following commands under Linux, MAC and cygwin for Windows: openssl req -new -x509 -out httpserver.pem -days 10000&lt;br /&gt;
&lt;br /&gt;
(this will prompt for the OPTION 66 password)&lt;br /&gt;
&lt;br /&gt;
 mv privkey.pem   https-private.pem&lt;br /&gt;
 mv httpserver.pem   https-cert.pem&lt;br /&gt;
&lt;br /&gt;
This port specific service can then be accessed with browsers. When the specified port is accessed through a browser, BR establishes an HTTPS connection rather than an HTTP connection.&lt;br /&gt;
&lt;br /&gt;
==Signing and Certificate Processing Industry Standards==&lt;br /&gt;
The purpose of certificates is to verify the authenticity of unencrypted data. &lt;br /&gt;
&lt;br /&gt;
Certain companies are authorized by the government to act as a Certificate Authority (CA). These companies (e.g. Verisign) issue electronic certificates which can be used to issue second level certificates. Certificates can have expiration dates and the line of authority extends from a CA to any number of levels (but a chain is only as strong as its weakest link). Certificates contain a list of signatures (described below) that trace back to a CA as follows: &lt;br /&gt;
&lt;br /&gt;
When a company needs to obtain a certificate from a CA, it prepares its own certificate and sends it to the CA for signature. Creating a certificate requires the pre-production of a private and public key pair. The certificate text properly identifies the signing authority, the owner of the certificate, and the owner’s public key. The signing authority externally verifies the identity of the owner before signing it.  The CA provides the signature and the CA’s own public key for validating it. &lt;br /&gt;
&lt;br /&gt;
Browsers know the CA identities and their public keys. A browser can verify a CA signed cert by hashing it, decrypting the signature with the known public key and matching the decrypted signature against the hash total. &lt;br /&gt;
 &lt;br /&gt;
Any company that is issued a (self-prepared authority signed) certificate by a CA can sign second level certificates issued to third parties. A second level cert contains the parent (CA issued) certificate, and includes the public keys of the issuer and the recipient. The signature is essentially the encrypted hash total of ‘itself plus all of its ancestors’. Additional levels each contain the chain of certificates leading from a CA issued cert to itself. By including public keys along with the identities of the owners, certificates become tools for validating the signatures of their owners. When signed data (with an encrypted hash total) is sent to clients the signatures insure that the data has not been altered along the way. &lt;br /&gt;
&lt;br /&gt;
Ostensibly, a certificate cannot be counterfeited because it requires the signature of its parent which can only be produced with its parent’s private key.  By providing both public keys ( signer and recipient ) in all certs along with signatures, a non-forgeable or alterable chain is established. &lt;br /&gt;
&lt;br /&gt;
====Example:====&lt;br /&gt;
CA public key – known to browser&lt;br /&gt;
certificate 1 (signed by CA – contains owner’s public key)&lt;br /&gt;
certificate 2 (signed by second level - includes certificate 1 - contains owner’s public key)&lt;br /&gt;
final certificate (signed by third level - includes certificate 2 - contains owner’s public key)&lt;br /&gt;
 &lt;br /&gt;
A browser would find the CA information in the certificate and check to see if it is in the browser’s internal list. If not, it fails. Then it verifies that certificate 1 (which ends up being part of the final certificate) has been signed by the CA. After that it checks certificate 2 and verifies that it has been signed by the owner of certificate 1. Finally it checks the final certificate and verifies that it has been signed by the owner of certificate 2.&lt;br /&gt;
&lt;br /&gt;
To assure the line authority of any certificate, the public keys are associated with signers, not with documents. &lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Encryption Support by Version&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
BR encryption support has evolved over time. The sections below distinguish between currently supported legacy algorithms, deprecated (removed) algorithms, and newer additions.&lt;br /&gt;
&lt;br /&gt;
==Old List (Still Supported)==&lt;br /&gt;
&lt;br /&gt;
The following algorithms are supported for backward compatibility and remain available in current versions:&lt;br /&gt;
&lt;br /&gt;
===Symmetric Key Ciphers===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DES (all modes)&lt;br /&gt;
DES-EDE / DES-EDE3 (Triple DES)&lt;br /&gt;
RC4 (40, 128)&lt;br /&gt;
RC2 (40, 64, 128)&lt;br /&gt;
BF (Blowfish)&lt;br /&gt;
CAST5&lt;br /&gt;
AES:128 / 192 / 256 (ECB, CBC, CFB, OFB)&lt;br /&gt;
IDEA&lt;br /&gt;
CAMELLIA:128 / 192 / 256&lt;br /&gt;
SEED&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Message Digest Algorithms===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MD5&lt;br /&gt;
SHA-1&lt;br /&gt;
MDC-2&lt;br /&gt;
RIPEMD-160&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Deprecated (Removed / No Longer Available)==&lt;br /&gt;
&lt;br /&gt;
The following algorithms were available in earlier versions but are no longer exposed in current builds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SHA   (original / alias)&lt;br /&gt;
DSS&lt;br /&gt;
DSS-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These were removed due to obsolescence or lack of modern security relevance.&lt;br /&gt;
&lt;br /&gt;
==In Development (Newer Additions)==&lt;br /&gt;
&lt;br /&gt;
===Added in Version 4.31hdg===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SHA-256&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==STATUS ENCRYPTION==&lt;br /&gt;
&lt;br /&gt;
The command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
STATUS ENCRYPTION&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
displays the encryption and digest algorithms supported by the currently running BR executable. This is the authoritative source for determining which algorithms are available.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* Default encryption:&lt;br /&gt;
  &amp;lt;code&amp;gt;AES:256:CBC:128&amp;lt;/code&amp;gt;&lt;br /&gt;
* If no initialization vector is provided, BR prepends a random IV to the encrypted output.&lt;br /&gt;
* DECRYPT$ must use the same parameters as ENCRYPT$.&lt;br /&gt;
&lt;br /&gt;
==Wishlist: Future Encryption Types==&lt;br /&gt;
&lt;br /&gt;
The following modern algorithms are supported by OpenSSL but not currently exposed in BR:&lt;br /&gt;
&lt;br /&gt;
* AES:128:GCM:96&lt;br /&gt;
* AES:192:GCM:96&lt;br /&gt;
* AES:256:GCM:96&lt;br /&gt;
* HMAC-SHA-256&lt;br /&gt;
* HMAC-SHA-512&lt;br /&gt;
* SHA-512&lt;br /&gt;
* ChaCha20-Poly1305&lt;br /&gt;
* PBKDF2 (password hashing)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Definitions]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=MAX_SORT_MEMORY&amp;diff=11504</id>
		<title>MAX SORT MEMORY</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=MAX_SORT_MEMORY&amp;diff=11504"/>
		<updated>2026-03-22T19:28:03Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This [[CONFIG]] option sets the maximum memory allowed for SORT and INDEX operations &#039;&#039;(in megabytes)&#039;&#039;. This is a [[BRconfig.sys]] statement.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MAX_SORT_MEMORY &amp;lt;integer&amp;gt; MB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:msm.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Specifies the maximum number of megabytes BR should use for sorting and indexing.&lt;br /&gt;
&lt;br /&gt;
* Default: 8 MB  &lt;br /&gt;
* Allowed range: 2–512 MB  &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG MAX_SORT_MEMORY 512 MB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The ``MB`` suffix is required after the integer value.&lt;br /&gt;
* This setting is a balance between CPU / Hard Disk Speed and available memory.&lt;br /&gt;
* Do not assume that bigger is better.   &lt;br /&gt;
* 64 MB may be the sweet spot for your system.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Config]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=MAX_SORT_MEMORY&amp;diff=11503</id>
		<title>MAX SORT MEMORY</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=MAX_SORT_MEMORY&amp;diff=11503"/>
		<updated>2026-03-22T17:10:53Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This [[CONFIG]] option sets the maximum memory allowed for SORT and INDEX operations &#039;&#039;(in megabytes)&#039;&#039;. This is a [[BRconfig.sys]] statement.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MAX_SORT_MEMORY &amp;lt;integer&amp;gt; MB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:msm.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Specifies the maximum number of megabytes BR should use for sorting and indexing.&lt;br /&gt;
&lt;br /&gt;
* Default: 8 MB  &lt;br /&gt;
* Allowed range: 2–512 MB  &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG MAX_SORT_MEMORY 512 MB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The ``MB`` suffix is required after the integer value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Config]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=MAX_SORT_MEMORY&amp;diff=11502</id>
		<title>MAX SORT MEMORY</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=MAX_SORT_MEMORY&amp;diff=11502"/>
		<updated>2026-03-22T17:09:26Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Document required MB and allowed values&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This [[CONFIG]] option sets the maximum memory allowed for SORT and INDEX operations &#039;&#039;(in megabytes)&#039;&#039;. This is a [[BRconfig.sys]] statement.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MAX_SORT_MEMORY &amp;lt;integer&amp;gt; MB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:msm.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
Specifies the maximum number of megabytes BR should use for sorting and indexing.&lt;br /&gt;
&lt;br /&gt;
* Default: 8 MB  &lt;br /&gt;
* Allowed range: 2–512 MB  &lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG MAX_SORT_MEMORY 512 MB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The ``MB`` suffix is required after the integer value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Config]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=%5EKeyStroke_and_%5EDataChg&amp;diff=11495</id>
		<title>^KeyStroke and ^DataChg</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=%5EKeyStroke_and_%5EDataChg&amp;diff=11495"/>
		<updated>2026-02-05T19:46:32Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Show Sample for ^DataCHG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As of [[4.30]], two new [[INPUT FIELDS]] field attributes are now supported which provide detailed control of user input:&lt;br /&gt;
*^KEYSTROKE - return control to the program when a keystroke is entered&lt;br /&gt;
*^DATACHG - return control to the program when data is changed&lt;br /&gt;
(a subset of ^KEYSTROKE)&lt;br /&gt;
&lt;br /&gt;
When control is returned to a program as a result of these attributes, one of three new [[Fkey]] values is applied:&lt;br /&gt;
&lt;br /&gt;
*140 - a character was appended to the data&lt;br /&gt;
*141 - the data changed other than appending a character&lt;br /&gt;
*142 - ( applies only to ^KEYSTROKE ) the data is unchanged but a key was pressed or a mouse action occurred that did not trigger a field exit&lt;br /&gt;
&lt;br /&gt;
When a key is pressed with ^KEYSTROKE or ^DATACHG that sets a 140, 141 or 142 FKEY, it will also set the [[KStat$]] value.  This allows the program to see what key was pressed. This KSTAT$ value will be cleared on the next [[RINPUT Fields]] operation. &lt;br /&gt;
&lt;br /&gt;
If a navigation key operates within the field and ^KEYSTROKE is specified, it triggers fkey 142. If the navigation key causes focus to leave the field, fkeys 140-142  are not generated and KSTAT is not set. &lt;br /&gt;
&lt;br /&gt;
===Sample===&lt;br /&gt;
 00001   PRINT Newpage&lt;br /&gt;
 00010   INPUT FIELDS &amp;quot;10,10,C 10,[D]S^DataCHGC&amp;quot;&amp;amp;Str$(New_Pos),ATTR &#039;[A]&#039;: Dummy$&lt;br /&gt;
 00020   PRINT FIELDS &amp;quot;1,70,n 10&amp;quot;: Fkey&lt;br /&gt;
 00025   LET New_Field$=Kstat$&lt;br /&gt;
 00026   LET New_Pos=Curpos&lt;br /&gt;
 00030   PRINT FIELDS &amp;quot;3,70,N 10&amp;quot;: New_Pos&lt;br /&gt;
 00040   PRINT FIELDS &amp;quot;4,70,C 10&amp;quot;: Unhex$(New_Field$)&amp;amp;&amp;quot; &amp;quot;&amp;amp;New_Field$&lt;br /&gt;
 00050   PRINT FIELDS &amp;quot;5,70,C 10&amp;quot;: Dummy$&lt;br /&gt;
 00090   LET Curfld(Curfld,Fkey) !:&lt;br /&gt;
         GOTO 10&lt;br /&gt;
 &lt;br /&gt;
The program triggers ^DATACHG and displays the FKEY along with the value that was pushed to KSTAT$.   Each keystrokeis processed.   The input allows granular control. &lt;br /&gt;
&lt;br /&gt;
;Note &lt;br /&gt;
While shift, control and alt do not change either the functionality or fkey value of navigation keys, KSTAT$ produces unique values for each of these settings. This complicates things a bit but provides more options for programmed responses to custom key combinations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11493</id>
		<title>DEBUG PROFILE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11493"/>
		<updated>2025-09-12T17:23:21Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Additional resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= BR Profiler Main Page =&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;PROFILER.EXE&#039;&#039;&#039; to translate the BR Profiler output file into readable text.&lt;br /&gt;
&lt;br /&gt;
== Generating profiler output ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEBUG PROFILE SAMPLED filename&lt;br /&gt;
DEBUG PROFILE TIMED filename&lt;br /&gt;
DEBUG PROFILE STOP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Viewing profiler output ==&lt;br /&gt;
Use &#039;&#039;&#039;profiler.exe&#039;&#039;&#039; to view the contents of a log file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profiler.exe filename&lt;br /&gt;
profiler.exe filename raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional resources ==&lt;br /&gt;
&lt;br /&gt;
* See the FTP site: &#039;&#039;Dll_Distr/Profiler&#039;&#039; for samples and documentation.&lt;br /&gt;
* [[Profiler File Layout]] — Detailed description of the profiler log file format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Debug]]&lt;br /&gt;
[[Category:Profiler]]&lt;br /&gt;
[[Category:Tools]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11492</id>
		<title>DEBUG PROFILE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11492"/>
		<updated>2025-09-12T17:22:55Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= BR Profiler Main Page =&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;PROFILER.EXE&#039;&#039;&#039; to translate the BR Profiler output file into readable text.&lt;br /&gt;
&lt;br /&gt;
== Generating profiler output ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEBUG PROFILE SAMPLED filename&lt;br /&gt;
DEBUG PROFILE TIMED filename&lt;br /&gt;
DEBUG PROFILE STOP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Viewing profiler output ==&lt;br /&gt;
Use &#039;&#039;&#039;profiler.exe&#039;&#039;&#039; to view the contents of a log file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
profiler.exe filename&lt;br /&gt;
profiler.exe filename raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional resources ==&lt;br /&gt;
&lt;br /&gt;
* See the FTP site: &#039;&#039;Dll\_Distr/Profiler&#039;&#039; for samples and documentation.&lt;br /&gt;
* [[Profiler File Layout]] — Detailed description of the profiler log file format.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Debug]]&lt;br /&gt;
[[Category:Profiler]]&lt;br /&gt;
[[Category:Tools]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Profiler_File_Layout&amp;diff=11491</id>
		<title>Profiler File Layout</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Profiler_File_Layout&amp;diff=11491"/>
		<updated>2025-09-12T17:14:40Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Profiler Output File Format =&lt;br /&gt;
&lt;br /&gt;
The profiler output file will be a sequence of variable-length records of various types. The first byte of each record provides the record type, while the length and record information are record-type specific. All numbers are in &#039;&#039;&#039;network byte order&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CREATE MODULE MAPPING ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 1&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–3:&#039;&#039;&#039; 16-bit module number&lt;br /&gt;
* &#039;&#039;&#039;Byte 4–5:&#039;&#039;&#039; 16-bit File Name Length&lt;br /&gt;
* &#039;&#039;&#039;Byte 6–end:&#039;&#039;&#039; File Name&lt;br /&gt;
&lt;br /&gt;
== CURRENT LINE ==&lt;br /&gt;
Current line information begins with this record and ends with an &#039;&#039;&#039;END CURRENT LINE&#039;&#039;&#039; record.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 3&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–3:&#039;&#039;&#039; module number&lt;br /&gt;
* &#039;&#039;&#039;Byte 4–7:&#039;&#039;&#039; line number&lt;br /&gt;
* &#039;&#039;&#039;Byte 8:&#039;&#039;&#039; clause number&lt;br /&gt;
&lt;br /&gt;
== TIME SPENT IN LINE ==&lt;br /&gt;
These records exist only for timed sampling. They always occur between &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; and &#039;&#039;&#039;END CURRENT LINE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 4&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–9:&#039;&#039;&#039; 8-byte time spent in line (nanoseconds)&lt;br /&gt;
&lt;br /&gt;
== BACKTRACE INFORMATION ==&lt;br /&gt;
These records may or may not exist depending on creation options. They always occur between &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; and &#039;&#039;&#039;END CURRENT LINE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note: Apart from the record type identifier, these records have the same format as &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 5&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–3:&#039;&#039;&#039; module number&lt;br /&gt;
* &#039;&#039;&#039;Byte 4–7:&#039;&#039;&#039; line number&lt;br /&gt;
* &#039;&#039;&#039;Byte 8:&#039;&#039;&#039; clause number&lt;br /&gt;
&lt;br /&gt;
== FUNCTION NAME ==&lt;br /&gt;
These records may or may not exist depending on creation options. They follow immediately after either &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; or &#039;&#039;&#039;BACKTRACE INFORMATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 7&lt;br /&gt;
* &#039;&#039;&#039;Byte 2:&#039;&#039;&#039; 8-bit name length&lt;br /&gt;
* &#039;&#039;&#039;Byte 3–on:&#039;&#039;&#039; function name&lt;br /&gt;
&lt;br /&gt;
== GOSUB ==&lt;br /&gt;
These records may or may not exist depending on creation options. They follow immediately after either &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; or &#039;&#039;&#039;BACKTRACE INFORMATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 8&lt;br /&gt;
&lt;br /&gt;
== MAIN ROUTINE ==&lt;br /&gt;
These records may or may not exist depending on creation options. They follow immediately after either &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; or &#039;&#039;&#039;BACKTRACE INFORMATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This indicates that the given line is neither in a GOSUB nor in a function body.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 9&lt;br /&gt;
&lt;br /&gt;
== END CURRENT LINE ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 6&lt;br /&gt;
&lt;br /&gt;
= Potential Syntax =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DEBUG PROFILE SAMPLED filename&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DEBUG PROFILE TIMED filename&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DEBUG PROFILE STOP&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Profiler.exe ==&lt;br /&gt;
To use the profiler.exe available on the ftp site in /Dll_Distr/profiler to get a nice listing of what is in the log file use.&lt;br /&gt;
* profiler.exe filename&lt;br /&gt;
or&lt;br /&gt;
* profiler.exe filename raw&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Profiler_File_Layout&amp;diff=11490</id>
		<title>Profiler File Layout</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Profiler_File_Layout&amp;diff=11490"/>
		<updated>2025-09-12T17:10:42Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Profiler Output File Format =&lt;br /&gt;
&lt;br /&gt;
The profiler output file will be a sequence of variable-length records of various types. The first byte of each record provides the record type, while the length and record information are record-type specific. All numbers are in &#039;&#039;&#039;network byte order&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== CREATE MODULE MAPPING ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 1&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–3:&#039;&#039;&#039; 16-bit module number&lt;br /&gt;
* &#039;&#039;&#039;Byte 4–5:&#039;&#039;&#039; 16-bit File Name Length&lt;br /&gt;
* &#039;&#039;&#039;Byte 6–end:&#039;&#039;&#039; File Name&lt;br /&gt;
&lt;br /&gt;
== CURRENT LINE ==&lt;br /&gt;
Current line information begins with this record and ends with an &#039;&#039;&#039;END CURRENT LINE&#039;&#039;&#039; record.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 3&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–3:&#039;&#039;&#039; module number&lt;br /&gt;
* &#039;&#039;&#039;Byte 4–7:&#039;&#039;&#039; line number&lt;br /&gt;
* &#039;&#039;&#039;Byte 8:&#039;&#039;&#039; clause number&lt;br /&gt;
&lt;br /&gt;
== TIME SPENT IN LINE ==&lt;br /&gt;
These records exist only for timed sampling. They always occur between &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; and &#039;&#039;&#039;END CURRENT LINE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 4&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–9:&#039;&#039;&#039; 8-byte time spent in line (nanoseconds)&lt;br /&gt;
&lt;br /&gt;
== BACKTRACE INFORMATION ==&lt;br /&gt;
These records may or may not exist depending on creation options. They always occur between &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; and &#039;&#039;&#039;END CURRENT LINE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Note: Apart from the record type identifier, these records have the same format as &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 5&lt;br /&gt;
* &#039;&#039;&#039;Byte 2–3:&#039;&#039;&#039; module number&lt;br /&gt;
* &#039;&#039;&#039;Byte 4–7:&#039;&#039;&#039; line number&lt;br /&gt;
* &#039;&#039;&#039;Byte 8:&#039;&#039;&#039; clause number&lt;br /&gt;
&lt;br /&gt;
== FUNCTION NAME ==&lt;br /&gt;
These records may or may not exist depending on creation options. They follow immediately after either &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; or &#039;&#039;&#039;BACKTRACE INFORMATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 7&lt;br /&gt;
* &#039;&#039;&#039;Byte 2:&#039;&#039;&#039; 8-bit name length&lt;br /&gt;
* &#039;&#039;&#039;Byte 3–on:&#039;&#039;&#039; function name&lt;br /&gt;
&lt;br /&gt;
== GOSUB ==&lt;br /&gt;
These records may or may not exist depending on creation options. They follow immediately after either &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; or &#039;&#039;&#039;BACKTRACE INFORMATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 8&lt;br /&gt;
&lt;br /&gt;
== MAIN ROUTINE ==&lt;br /&gt;
These records may or may not exist depending on creation options. They follow immediately after either &#039;&#039;&#039;CURRENT LINE&#039;&#039;&#039; or &#039;&#039;&#039;BACKTRACE INFORMATION&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This indicates that the given line is neither in a GOSUB nor in a function body.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 9&lt;br /&gt;
&lt;br /&gt;
== END CURRENT LINE ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Byte 1:&#039;&#039;&#039; 6&lt;br /&gt;
&lt;br /&gt;
= Potential Syntax =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DEBUG PROFILE SAMPLED filename&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DEBUG PROFILE TIMED filename&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DEBUG PROFILE STOP&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Profiler_File_Layout&amp;diff=11489</id>
		<title>Profiler File Layout</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Profiler_File_Layout&amp;diff=11489"/>
		<updated>2025-09-12T17:01:59Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Created page with &amp;quot;The profiler output file will be a sequence of variable length records of various types.  The first byte of each record will provide the record type, the length and record information will be record type specific.  All numbers are network byte order.  CREATE MODULE MAPPING Byte 1: 1 Byte 2-3: 16 bit module number Byte 4-5: 16 bit File Name Length Byte 6-end: File Name  CURRENT LINE Current line information is started with this record and will be ended with a END CURRENT...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The profiler output file will be a sequence of variable length records of various types.  The first byte of each record will provide the record type, the length and record information will be record type specific.  All numbers are network byte order.&lt;br /&gt;
&lt;br /&gt;
CREATE MODULE MAPPING&lt;br /&gt;
Byte 1: 1&lt;br /&gt;
Byte 2-3: 16 bit module number&lt;br /&gt;
Byte 4-5: 16 bit File Name Length&lt;br /&gt;
Byte 6-end: File Name&lt;br /&gt;
&lt;br /&gt;
CURRENT LINE&lt;br /&gt;
Current line information is started with this record and will be ended with a END CURRENT LINE&lt;br /&gt;
record&lt;br /&gt;
Byte 1: 3&lt;br /&gt;
Byte 2-3: module number&lt;br /&gt;
Byte 4-7: line number&lt;br /&gt;
Byte 8: clause number&lt;br /&gt;
&lt;br /&gt;
TIME SPENT IN LINE &lt;br /&gt;
these records will only exist for timed sampling&lt;br /&gt;
they will always occur between CURRENT LINE and END CURRENT LINE&lt;br /&gt;
Byte 1: 4&lt;br /&gt;
Byte 2 – 9: 8 bit time spent in line in nano-seconds.&lt;br /&gt;
&lt;br /&gt;
BACKTRACE INFORMATION&lt;br /&gt;
these records may or may not exist depending on creation options&lt;br /&gt;
they will always occur between CURRENT LINE and END CURRENT LINE&lt;br /&gt;
Note: besides the record type identifier, these records have the same format as CURRENT LINE&lt;br /&gt;
Byte 1: 5&lt;br /&gt;
Byte 2-3: module number&lt;br /&gt;
Byte 4-7: line number&lt;br /&gt;
Byte 8: clause number&lt;br /&gt;
&lt;br /&gt;
FUNCTION NAME:&lt;br /&gt;
These records may or may not exist depending on creation options.&lt;br /&gt;
These records will follow immediately after either CURRENT LINE or BACKTRACE INFORMATION&lt;br /&gt;
Byte 1:7&lt;br /&gt;
Byte 2: 8-bit name length&lt;br /&gt;
Byte 3- on: function name&lt;br /&gt;
&lt;br /&gt;
GOSUB:&lt;br /&gt;
These records may or may not exist depending on creation options.&lt;br /&gt;
These records will follow immediately after either CURRENT LINE or BACKTRACE INFORMATION&lt;br /&gt;
Byte 1:8&lt;br /&gt;
&lt;br /&gt;
MAIN ROUTINE:&lt;br /&gt;
These records may or may not exist depending on creation options.&lt;br /&gt;
These records will follow immediately after either CURRENT LINE or BACKTRACE INFORMATION&lt;br /&gt;
This indicates that the given line is neither in a GOSUB or in a function body.&lt;br /&gt;
Byte 1:9&lt;br /&gt;
&lt;br /&gt;
END CURRENT LINE&lt;br /&gt;
Byte 1: 6&lt;br /&gt;
&lt;br /&gt;
Potential syntax&lt;br /&gt;
&lt;br /&gt;
DEBUG PROFILE SAMPLED filename&lt;br /&gt;
DEBUG PROFILE TIMED filename&lt;br /&gt;
DEBUG PROFILE STOP&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11488</id>
		<title>DEBUG PROFILE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11488"/>
		<updated>2025-09-12T17:01:43Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Use PROFILER.EXE to translate the BR Profiler output file into readable text.&lt;br /&gt;
&lt;br /&gt;
To generate profiler output:&lt;br /&gt;
DEBUG PROFILE SAMPLED filename&lt;br /&gt;
or&lt;br /&gt;
DEBUG PROFILE TIMED filename&lt;br /&gt;
and&lt;br /&gt;
DEBUG PROFILE STOP to end the profile&lt;br /&gt;
&lt;br /&gt;
Also, to use the profiler.exe to get a nice listing of what is in the log file.&lt;br /&gt;
profiler.exe filename&lt;br /&gt;
or&lt;br /&gt;
profiler.exe filename raw&lt;br /&gt;
&lt;br /&gt;
See ftp site Dll_Distr/Profiler for samples and documentation.&lt;br /&gt;
&lt;br /&gt;
[[Profiler File Layout]] -- Details about the profiler log&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Debug]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11487</id>
		<title>DEBUG PROFILE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11487"/>
		<updated>2025-09-12T17:00:26Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Use PROFILER.EXE to translate the BR Profiler output file into readable text.&lt;br /&gt;
&lt;br /&gt;
To generate profiler output:&lt;br /&gt;
DEBUG PROFILE SAMPLED filename&lt;br /&gt;
or&lt;br /&gt;
DEBUG PROFILE TIMED filename&lt;br /&gt;
and&lt;br /&gt;
DEBUG PROFILE STOP to end the profile&lt;br /&gt;
&lt;br /&gt;
Also, to use the profiler.exe to get a nice listing of what is in the log file.&lt;br /&gt;
profiler.exe filename&lt;br /&gt;
or&lt;br /&gt;
profiler.exe filename raw&lt;br /&gt;
&lt;br /&gt;
See ftp site Dll_Distr/Profiler for samples and documentation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Debug]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11486</id>
		<title>DEBUG PROFILE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DEBUG_PROFILE&amp;diff=11486"/>
		<updated>2025-09-12T16:57:29Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Created page with &amp;quot; Use PROFILER.EXE to translate the BR Profiler output file into readable text.  To generate profiler output: DEBUG PROFILE SAMPLED filename or DEBUG PROFILE TIMED filename and DEBUG PROFILE STOP to end the profile  Also, to use the profiler.exe to get a nice listing of what is in the log file. profiler.exe filename or profiler.exe filename raw  See ftp site Dll_Distr/Profiler for samples and documentation.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Use PROFILER.EXE to translate the BR Profiler output file into readable text.&lt;br /&gt;
&lt;br /&gt;
To generate profiler output:&lt;br /&gt;
DEBUG PROFILE SAMPLED filename&lt;br /&gt;
or&lt;br /&gt;
DEBUG PROFILE TIMED filename&lt;br /&gt;
and&lt;br /&gt;
DEBUG PROFILE STOP to end the profile&lt;br /&gt;
&lt;br /&gt;
Also, to use the profiler.exe to get a nice listing of what is in the log file.&lt;br /&gt;
profiler.exe filename&lt;br /&gt;
or&lt;br /&gt;
profiler.exe filename raw&lt;br /&gt;
&lt;br /&gt;
See ftp site Dll_Distr/Profiler for samples and documentation.&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Debug&amp;diff=11485</id>
		<title>Debug</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Debug&amp;diff=11485"/>
		<updated>2025-09-12T16:56:13Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;see also: [[BR32.exe Debug]]&lt;br /&gt;
&lt;br /&gt;
There are many [[commands]], [[statements]], [[debuggers]], etc that will help you to &#039;&#039;&#039;debug&#039;&#039;&#039; a [[Business Rules!]] [[program]].&lt;br /&gt;
&lt;br /&gt;
Some [[editors]] such as [[MyEdit (BR Edition)]] provide an vast array of their own tools for use in debugging.&lt;br /&gt;
&lt;br /&gt;
Debug versions of BR32.exe are used almost exclusively during the [[beta]] process of upcoming versions of Business Rules!.&lt;br /&gt;
&lt;br /&gt;
Other than functions in the [[:Category:Debug|debug category]], the [[Go]] [[command]] can be very useful for debugging programs&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;DEBUG CONSOLE OFF&#039;&#039;&#039; command is supported as of BR [[4.18a]].&lt;br /&gt;
&lt;br /&gt;
[[DEBUG PROFILE]] -- Used to create Itemized Profile log file for troubleshooting performance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Debug]]&lt;br /&gt;
[[Category:Needs Help]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=-202,020,202.02&amp;diff=11484</id>
		<title>-202,020,202.02</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=-202,020,202.02&amp;diff=11484"/>
		<updated>2025-06-05T12:57:41Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[PD]] is a Packed Decimal.&lt;br /&gt;
&lt;br /&gt;
PD 6.2 can store +/ 999,999,999.99&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-202,020,202.02&#039;&#039;&#039; is the value read from an empty, never written, [[PD]] &#039;&#039;&#039;6.2&#039;&#039;&#039; field.&lt;br /&gt;
&lt;br /&gt;
[[Category:Number]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=SQL&amp;diff=11483</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=SQL&amp;diff=11483"/>
		<updated>2025-05-23T15:48:50Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SQL manages data via a relational data management system. As of 4.3, BR includes several special ways of working together with SQL.&lt;br /&gt;
&lt;br /&gt;
====CONFIG DATABASE db-ref ODBC-MANAGER====&lt;br /&gt;
CONFIG [[DATABASE]] db-ref ODBC-MANAGER will invoke the ODBC Manager to define or identify a file DSN. Once this is done you can issue the command [[STATUS]] DATABASE –P to see the connect string that the ODBC Manager used to make the connection. Thereafter you can use that connection string to establish the connection to the database as follows:&lt;br /&gt;
&lt;br /&gt;
 CONFIG DATABASE db-ref  CONNECTSTRING=&amp;quot;Driver={Microsoft Access Driver (*.mdb)}DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
            - or -&lt;br /&gt;
 CONFIG DATABASE db-ref  DSN=’dsn-ref ‘ &lt;br /&gt;
&lt;br /&gt;
;Additional Optional Parameters:&lt;br /&gt;
&lt;br /&gt;
 [, USER= department | LOGIN_NAME | ? ]&lt;br /&gt;
 [, {PASSWORD= dept-password | PASSWORDD=encrypted-passwd  | BR_PASSWORD | ? ]&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;&#039;?&#039;&#039;&#039; indicates prompt and &#039;&#039;&#039;BR_PASSWORD&#039;&#039;&#039; indicates the password used during client login. If running the standard model (not client-server) then this is equivalent to &amp;quot;?&amp;quot;. &#039;&#039;&#039;encrypted-passwd&#039;&#039;&#039; is the DB password encrypted with the key stated in OPTION 66.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CONFIG DATABASE  MAX_COLUMN_WIDTH   nnnn&#039;&#039;&#039;&lt;br /&gt;
Some database column types are variable length. SQL requires advanced buffer allocation. This would unnecessarily tax the system if not restricted. This statement sets a maximum width for all columns. Memory is allocated to the minimum of (this amount or the column width). &amp;quot;nnnn&amp;quot; is the maximum column width. The default is 2000 characters.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;CONFIG DATABASE CLEAR   { db-ref | ALL }&#039;&#039;&#039;&lt;br /&gt;
This will close the specified database or all open databases.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sample Connection Strings:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Using a SQL Server /w SQL Login:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;SERVER=server;Initial Catalog=database;UID=username;PWD=password&amp;quot;&lt;br /&gt;
 db-ref is the database reference.&lt;br /&gt;
 server is the SQL Server [FQDN] or IP Address&lt;br /&gt;
 database is the [SQL Server Database] &lt;br /&gt;
 username is the [SQL Server User Name]&lt;br /&gt;
 password is the [SQL Server Password]&lt;br /&gt;
&lt;br /&gt;
 Using a SQL Server /w Windows Authentication:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;Initial Catalog=database;Persist Security Info=True;MultipleBC_TableResultSets=True; Database=database;SERVER=server;Login Name=username;Password=BR_PASSWORD&amp;quot;&lt;br /&gt;
 db-ref is the database reference.&lt;br /&gt;
 server is the SQL Server [FQDN] or IP Address&lt;br /&gt;
 database is the [SQL Server Database] &lt;br /&gt;
 username is the [SQL Server User Name]&lt;br /&gt;
 Note that BR_PASSWORD will use the users Active Directory password to connect to the SQL Server.&lt;br /&gt;
 Note that &amp;quot;SQL Server&amp;quot; is one of several choices for SQL Server, another choice would be SQL Server Native Client 11.0&lt;br /&gt;
&lt;br /&gt;
====OPEN statements====&lt;br /&gt;
&lt;br /&gt;
 OPEN #20: &amp;quot;DATABASE= db-ref&amp;quot;, SQL &amp;quot;sql-statement&amp;quot;, OUTIN&lt;br /&gt;
              - or -&lt;br /&gt;
 OPEN #20: &amp;quot;DATABASE= db-ref, Name= filename&amp;quot; , SQL, OUTIN&lt;br /&gt;
Where filename refers to a DISPLAY file containing a SQL statement that gets executed when a WRITE statement is processed.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
 OPEN #20: &amp;quot;DATABASE=MyData&amp;quot;,SQL &amp;quot;SELECT FILENO,BALANCE from MASTER WHERE FILENO=?&amp;quot;,OUTIN&lt;br /&gt;
&lt;br /&gt;
====Sequence of Operations====&lt;br /&gt;
#Begin processing with a WRITE statement.&lt;br /&gt;
#If the WRITE contains an IO list of values then it is used to populate the SQL before it is executed. In this process IO list values replace question marks positionally from left to right. These question marks only work with SQL arguments that refer to stored data. Question marks cannot be specified where SQL keywords or table column names appear. &lt;br /&gt;
#Resulting SQL may or may not produce a result set. If it does, the result set may be processed like a BR file opened RELATIVE. Some operations that use file positioning may be slow since the whole result set may not be in memory immediately. Simple sequential access should be fairly quick.&lt;br /&gt;
#Once SQL has been populated by an IOlist, it may be reused with the same values by issuing a WRITE with no IOlist.&lt;br /&gt;
#READ IOlist variable associations are positional with each READ accessing one row of values.&lt;br /&gt;
&lt;br /&gt;
===SQL read/write example===&lt;br /&gt;
&lt;br /&gt;
 00001    execute &amp;quot;CONFIG database Inventory connectstring=&amp;quot;&amp;quot;DRIVER=SQL Server;SERVER=COMPUTER;Initial Catalog=Inventory;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=True&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 00002    let sqlconnection = 1&lt;br /&gt;
 00003 !  READ test&lt;br /&gt;
 00004    open #sqlconnection: &amp;quot;DATABASE=Inventory&amp;quot;,SQL &amp;quot;SELECT [Name],[Address],[City],[Country],[DateOfBirth],[Age] FROM [Inventory].[dbo].[Customer]&amp;quot;,OUTIN&lt;br /&gt;
 00005    write #sqlconnection:&lt;br /&gt;
 00006    do&lt;br /&gt;
 00007       read #sqlconnection, using &#039;form POS 1,C 50,C 50,C 50,C 50,C 50,N 3&#039;: Name$,Address$,City$,Country$,DateOfBirth$,Age eof ignore&lt;br /&gt;
 00008 !     if EOF was encountered, then we are finished reading the result set&lt;br /&gt;
 00009       if file(sqlconnection)&amp;lt;&amp;gt;0 then exit do&lt;br /&gt;
 00010       let dob$ = &amp;quot;&amp;quot;&lt;br /&gt;
 00011 !     only convert SQL date to BR date if it is non-empty, otherwise BR_DATE$ bombs&lt;br /&gt;
 00012       if DateOfBirth$&amp;lt;&amp;gt;&amp;quot;&amp;quot; then&lt;br /&gt;
 00013          let dob$ = BR_DATE$(DateOfBirth$)&lt;br /&gt;
 00014       end if&lt;br /&gt;
 00015 !     show user the next result row&lt;br /&gt;
 00016       print Name$,Address$,City$,Country$,dob$,Age&lt;br /&gt;
 00017    loop&lt;br /&gt;
 00018    close #sqlconnection:&lt;br /&gt;
 00019  !&lt;br /&gt;
 00020 !  WRITE test&lt;br /&gt;
 00021    open #sqlconnection: &amp;quot;DATABASE=Inventory&amp;quot;,SQL &amp;quot;insert into [Inventory].[dbo].[Customer] ([Id],[Name],[Address],[City],[Country],[DateOfBirth],[Age]) values (6,&#039;Tom, Jerryngton&#039;, &#039;123 Big Walkway&#039;, &#039;Dallas&#039;, &#039;USA&#039;, &#039;1982-01-01&#039;, 35);&amp;quot;,OUTIN&lt;br /&gt;
 00022    write #sqlconnection:&lt;br /&gt;
 00023    close #sqlconnection:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL Date Format Functions===&lt;br /&gt;
&lt;br /&gt;
 A$=SQL_DATE$(BR-date-string,&amp;quot;format-mask&amp;quot;)   ! format date for storage&lt;br /&gt;
 B$=BR_DATE$(SQL-date-string,&amp;quot;format-mask&amp;quot;)   ! unpack DB date value&lt;br /&gt;
&lt;br /&gt;
* Note: SQL DATETIME fields are &amp;quot;Packed for Storage&amp;quot;, but &amp;quot;DATE&amp;quot; fields are returned as a CCYY-MM-DD string in a SQL Query.  DATE returns &amp;quot;BLANK&amp;quot; for &amp;quot;Empty or Null Date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===SQL Table Interrogation===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ENV$(STATUS)&#039;&#039;&#039; has been extended to interrogate database connections and ODBC data sources. A program called ENVDB.BRS (listed below) has been written to demonstrate how this extension works and to show how to setup linkage to a database or ODBC data source. Run the program as is to bring up the Microsoft ODBC manager. Then select a data source and look at the output from the program. This will also show you how to get and use connect strings. In this example lines 1900 and 2000 accomplish the same open as line 1800 in my environment. &lt;br /&gt;
&lt;br /&gt;
Try it on your Windows workstation. As long as you have one or more ODBC drivers supported you can use it without having to install a database. You can even use it to interrogate Excel files because Microsoft provides an ODBC driver for that. &lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate database interrogation entry is:&lt;br /&gt;
 01000 ! Replace Envdb&lt;br /&gt;
 01100    dim DATABASES$(1)*100&lt;br /&gt;
 01200    dim DATABASE$*100&lt;br /&gt;
 01300    dim TABLES$(1)*100&lt;br /&gt;
 01400    dim TABLE$*100&lt;br /&gt;
 01500    dim COLUMNS$(1)*100&lt;br /&gt;
 01600    dim COLUMN$*100&lt;br /&gt;
 01700    dim C$*100,FLD1$*40,FLD2$*40,FLD3$*40,FLD4$*40&lt;br /&gt;
 01800    Execute &amp;quot;CONFIG database testdb odbc-manager&amp;quot;&lt;br /&gt;
 01900 !   Execute &amp;quot;CONFIG database testdb DSN=&#039;Accounts Payable&#039;&amp;quot;&lt;br /&gt;
 02000 !   Execute &amp;quot;CONFIG database testdb connectstring=&amp;quot;&amp;quot;DSN=Excel Files;DBQ=L:\orders\Beneficial PORCEL.xls;DefaultDir=L:\orders;DriverId=1046;MaxBufferSize=2048&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 02100    open #1: &amp;quot;name=envdb.txt,replace&amp;quot;,display,output &lt;br /&gt;
 02200 Dump_Table: ! ***** Dump Table Layout&lt;br /&gt;
 02300    let OUTFD = 1&lt;br /&gt;
 02400    let ENV$(&amp;quot;status.database.LIST&amp;quot;, MAT DATABASES$)  !List of db&#039;s&lt;br /&gt;
 02500    for DATABASE=1 to UDIM(DATABASES$)  !For each connected database&lt;br /&gt;
 02600       let DATABASE$=DATABASES$(DATABASE)&lt;br /&gt;
 02700       let FNSHOW_DATABASE(DATABASE$, &amp;quot;status.database.&amp;quot;&amp;amp;DATABASE$)&lt;br /&gt;
 02800    next DATABASE&lt;br /&gt;
 02900    end &lt;br /&gt;
 03000 ! &lt;br /&gt;
 03100    def FNSHOW_DATABASE(DATABASE$*100, ST_PREFIX$*100)&lt;br /&gt;
 03200       print #OUTFD: DATABASE$&lt;br /&gt;
 03300       let OUT_PREFIX$=CHR$(9)&lt;br /&gt;
 03400       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;DSN=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DSN&amp;quot;)&lt;br /&gt;
 03500       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;CONNECTSTRING=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.CONNECTSTRING&amp;quot;)&lt;br /&gt;
 03600       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Tables:&amp;quot;&lt;br /&gt;
 03700       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.TABLES&amp;quot;&lt;br /&gt;
 03800       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT TABLES$)&lt;br /&gt;
 03900       for TABLE = 1 to UDIM(MAT TABLES$)&lt;br /&gt;
 04000          let TABLE$=TABLES$(TABLE)&lt;br /&gt;
 04100          let FNSHOW_TABLE(TABLE$,ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;TABLE$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 04200       next TABLE&lt;br /&gt;
 04300    fnend &lt;br /&gt;
 04400 ! &lt;br /&gt;
 04500    def FNSHOW_TABLE(TABLE$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 04600       print #OUTFD: OUT_PREFIX$&amp;amp;TABLE$&lt;br /&gt;
 04700       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 04800       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table remarks=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.REMARKS&amp;quot;)&lt;br /&gt;
 04900       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 05000       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Columns:&amp;quot;&lt;br /&gt;
 05100       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.COLUMNS&amp;quot;&lt;br /&gt;
 05200       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT COLUMNS$)&lt;br /&gt;
 05300       for COLUMN = 1 to UDIM(MAT COLUMNS$)&lt;br /&gt;
 05400          let COLUMN$=COLUMNS$(COLUMN)&lt;br /&gt;
 05500          let FNSHOW_COLUMN(COLUMN$, ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;COLUMN$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 05600       next COLUMN&lt;br /&gt;
 05700    fnend &lt;br /&gt;
 05800 ! &lt;br /&gt;
 05900    def FNSHOW_COLUMN(COLUMN$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 06000       print #OUTFD: OUT_PREFIX$&amp;amp;COLUMN$&lt;br /&gt;
 06100       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 06200       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 06300       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column length=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LENGTH&amp;quot;)&lt;br /&gt;
 06400       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column decimals=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DECIMALS&amp;quot;)&lt;br /&gt;
 06500    fnend&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
For more information about &#039;&#039;&#039;SQL&#039;&#039;&#039; or &#039;&#039;&#039;Structured Query Language&#039;&#039;&#039; see [[Wikipedia:SQL]].&lt;br /&gt;
&lt;br /&gt;
===CLIENT_SERVER RECONNECT===&lt;br /&gt;
You can modify WBCONFIG.SYS or execute in code.&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
 EXECUTE &amp;quot;CONFIG CLIENT_SERVER RECONNECT_AFTER=120 RECONNECT_TIME=120&amp;quot; &lt;br /&gt;
&lt;br /&gt;
The default 120 is two minutes; set the values to 99999 to wait 27 hours (infinity).&lt;br /&gt;
&lt;br /&gt;
Please remember that the BRServer.exe components will remain &amp;quot;Active&amp;quot; in the server&#039;s task manager until the timeout period has passed.   &lt;br /&gt;
&lt;br /&gt;
When executing a SQL command, Client Server &amp;quot;appears to be hung&amp;quot; waiting for a response.   if you reach the limit (IE 120 seconds), BRClient will believe it has timed out, and &amp;quot;Crash&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===SQL LOCK_TIMEOUT===&lt;br /&gt;
In SQL, [LOCK_TIMEOUT] instructs the SQL Server session to wait a certain number of seconds before returning an error.&lt;br /&gt;
&lt;br /&gt;
* The default value is -1&lt;br /&gt;
* 120 is a reasonable value, and it works in tandem with CLIENT_SERVER RECONNECT.&lt;br /&gt;
&lt;br /&gt;
Sample Code to set the [LOCK_TIMEOUT] settings:&lt;br /&gt;
&lt;br /&gt;
Call the function providing the SQL Connection Name and the desired timeout.&lt;br /&gt;
&lt;br /&gt;
If there is a blocking transaction, that transaction will trigger an error 3006 with SQL State of &amp;quot;42000&amp;quot;   &lt;br /&gt;
&lt;br /&gt;
Sample Function:&lt;br /&gt;
 64230 DEF FNSET_LOCK_TIMEOUT(SLT_Connection$,SLT_Timeout)&lt;br /&gt;
 64232 DIM SLT_SQL$*9999&lt;br /&gt;
 64234 SLT_SQL$=&amp;quot;SET LOCK_TIMEOUT &amp;quot;&amp;amp;str$(SLT_Timeout)&lt;br /&gt;
 64236     OPEN #(Updhandle=Fngethandle): &amp;quot;DATABASE=&amp;quot;&amp;amp;SLT_Connection$,SQL SLT_SQL$,OUTIN &lt;br /&gt;
 64238     WRITE #Updhandle: &lt;br /&gt;
 64240     CLOSE #Updhandle: &lt;br /&gt;
 64242 FNEND&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Terminology]]&lt;br /&gt;
[[Category:SQL]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Editor&amp;diff=11480</id>
		<title>Editor</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Editor&amp;diff=11480"/>
		<updated>2025-04-20T15:29:22Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Known Third Party Editors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Many editors are supported for BR! [[Source code]]. &lt;br /&gt;
&lt;br /&gt;
The purpose of the EDITOR statement is to identify the program used by the [[EDIT]] command. &lt;br /&gt;
&lt;br /&gt;
 Editor &amp;quot;editor-program&amp;quot; [ REMOVE ] [NOWAIT]&lt;br /&gt;
&lt;br /&gt;
While the &#039;&#039;&#039;Editor&#039;&#039;&#039; specification is normally placed within a BRCONFIG.SYS file, it can also be specified with the [[config|Config]] command or within a program line using the [[Execute]] statement to issue the Config command. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Examples====&lt;br /&gt;
An Editor Statement could be typed in the command console like: &lt;br /&gt;
&lt;br /&gt;
  Config Editor &amp;quot;C:\Program Files\NotePad++\NotePad++.exe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Or added to [[BRConfig.sys]] like: &lt;br /&gt;
&lt;br /&gt;
  Editor &amp;quot;C:\Program Files\NotePad++\NotePad++.exe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Or perhaps added to BRConfig.sys, but only applicable to an individual user (Herbert) like: &lt;br /&gt;
&lt;br /&gt;
 @&amp;quot;Herbert&amp;quot; Editor &amp;quot;C:\Program Files\Mills Enterprise\MyEditBR\MyEditBR.exe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
REMOVE and NOWAIT affect the way the EDIT command uses the editor program. REMOVE causes BR to remove the source file when editing is complete. &lt;br /&gt;
&lt;br /&gt;
====See also====&lt;br /&gt;
&lt;br /&gt;
*[[Edit]] &lt;br /&gt;
*[[wikipedia:comparison_of_text_editors]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Known Third Party Editors====&lt;br /&gt;
&lt;br /&gt;
These editors can process .wbs/.brs [[Business Rules! Editable Source]] code. &lt;br /&gt;
&lt;br /&gt;
*NotePad &lt;br /&gt;
*[[PFE32]] &lt;br /&gt;
*[http://www.textpad.com/ TextPad] &lt;br /&gt;
*[[My Edit BR]] &lt;br /&gt;
*[http://www.mills-enterprise.ca MyEditBR website]&lt;br /&gt;
*[http://www.brixoft.net/prodinfo.asp?id=1 Source Edit] &lt;br /&gt;
*[[EditPad Pro]] &lt;br /&gt;
*[[Notepad++]] (open source) &lt;br /&gt;
*[http://www.ultraedit.com/ UltraEdit] &lt;br /&gt;
*[https://sourceforge.net/projects/jedit/ JEdit] (open source) &lt;br /&gt;
*[http://www.crimsoneditor.com Crimson Editor] (open source) &lt;br /&gt;
*[http://www.lugaru.com/ Epsilon] &lt;br /&gt;
*[http://www.context.cx/ ConTEXT] &lt;br /&gt;
*[http://www.andre-simon.de/ WinHighlight] &lt;br /&gt;
*[http://editra.org/index.php Editra]&lt;br /&gt;
*[https://www.cursor.com/ Cursor]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Utilities Third Party]]&lt;br /&gt;
[[Category:Config]]&lt;br /&gt;
[[Category:Basics]]&lt;br /&gt;
[[Category:Needs Help]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=0317&amp;diff=11479</id>
		<title>0317</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=0317&amp;diff=11479"/>
		<updated>2025-03-03T15:17:22Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Error&lt;br /&gt;
|0317&lt;br /&gt;
|attempt to [[redimension]] an [[array]] that is already on the [[RPN stack]]&lt;br /&gt;
|attempt to redimension an array that is already on the RPN stack&lt;br /&gt;
This error was added in BR! version [[4.2]].&lt;br /&gt;
&lt;br /&gt;
The following program demonstrates the error.   Remember that X &amp;amp; Y are the same array in this example, and you cannot assign the results of FN_Y to the same array.   &lt;br /&gt;
&lt;br /&gt;
 00010 dim x(10)&lt;br /&gt;
 00020 let &#039;&#039;&#039;x(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;fn_y(mat x)&lt;br /&gt;
 00030 end &lt;br /&gt;
 00040 def fn_y(mat y)&lt;br /&gt;
 00060   mat y(1) &lt;br /&gt;
 00070   let y(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;123&lt;br /&gt;
 00080   let fn_y&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;y(1)&lt;br /&gt;
 00090 fnend &lt;br /&gt;
&lt;br /&gt;
|Type [[GO]] and hit enter to continue.&lt;br /&gt;
&lt;br /&gt;
You can solve the above example like this becomes 1:&lt;br /&gt;
 00010 dim x(10),&lt;br /&gt;
 00020 let temp&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;fn_y(mat x)&lt;br /&gt;
 00025 let x(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;temp&lt;br /&gt;
 00030 end &lt;br /&gt;
 00040 def fn_y(mat y)&lt;br /&gt;
 00060   mat y(1) &lt;br /&gt;
 00070   let y(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;123&lt;br /&gt;
 00080   let fn_y&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;y(1)&lt;br /&gt;
 00090 fnend &lt;br /&gt;
&lt;br /&gt;
Another alternative Becomes 123: &lt;br /&gt;
&lt;br /&gt;
 00010 dim x(10),&lt;br /&gt;
 00020 let fn_y(mat x)&lt;br /&gt;
 00030 end &lt;br /&gt;
 00040 def fn_y(mat y)&lt;br /&gt;
 00060   mat y(1) &lt;br /&gt;
 00070   let y(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;123&lt;br /&gt;
 00080   let fn_y&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;y(1)&lt;br /&gt;
 00090 fnend &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Error Codes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=0317&amp;diff=11478</id>
		<title>0317</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=0317&amp;diff=11478"/>
		<updated>2025-03-03T15:14:38Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Error&lt;br /&gt;
|0317&lt;br /&gt;
|attempt to [[redimension]] an [[array]] that is already on the [[RPN stack]]&lt;br /&gt;
|attempt to redimension an array that is already on the RPN stack&lt;br /&gt;
This error was added in BR! version [[4.2]].&lt;br /&gt;
&lt;br /&gt;
The following program demonstrates the error.   Remember that X &amp;amp; Y are the same array in this example, and you cannot assign the results of FN_Y to the same array.   &lt;br /&gt;
&lt;br /&gt;
 00010 dim x(10)&lt;br /&gt;
 00020 let &#039;&#039;&#039;x(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;fn_y(mat x)&lt;br /&gt;
 00030 end &lt;br /&gt;
 00040 def fn_y(mat y)&lt;br /&gt;
 00060   mat y(1) &lt;br /&gt;
 00070   let y(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;123&lt;br /&gt;
 00080   let fn_y&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;y(1)&lt;br /&gt;
 00090 fnend &lt;br /&gt;
&lt;br /&gt;
|Type [[GO]] and hit enter to continue.&lt;br /&gt;
&lt;br /&gt;
You can solve the above example like this:  (X(1)=1)&lt;br /&gt;
&lt;br /&gt;
 00010 dim x(10),&lt;br /&gt;
 00020 let temp&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;fn_y(mat x)&lt;br /&gt;
 00025 let x(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;temp&lt;br /&gt;
 00030 end &lt;br /&gt;
 00040 def fn_y(mat y)&lt;br /&gt;
 00060   mat y(1) &lt;br /&gt;
 00070   let y(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;123&lt;br /&gt;
 00080   let fn_y&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;y(1)&lt;br /&gt;
 00090 fnend &lt;br /&gt;
&lt;br /&gt;
Another alternative:  (X(1)=123)&lt;br /&gt;
&lt;br /&gt;
 00010 dim x(10),&lt;br /&gt;
 00020 let fn_y(mat x)&lt;br /&gt;
 00030 end &lt;br /&gt;
 00040 def fn_y(mat y)&lt;br /&gt;
 00060   mat y(1) &lt;br /&gt;
 00070   let y(1)&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;123&lt;br /&gt;
 00080   let fn_y&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;y(1)&lt;br /&gt;
 00090 fnend &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Error Codes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=BRSerial.dat&amp;diff=11450</id>
		<title>BRSerial.dat</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=BRSerial.dat&amp;diff=11450"/>
		<updated>2024-03-04T15:52:46Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;BRSerial.dat&#039;&#039;&#039; file contains your [[Business Rules!]] license information.  You can easily check the license information contained in this file by using [[CheckSerial.exe]].&lt;br /&gt;
&lt;br /&gt;
You may Rename BRSerial.dat to BrSerial.[BR Version] such as BRSerial.42 or BRSerial.43.  &lt;br /&gt;
&lt;br /&gt;
[[UserID$]]&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Files]] &lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=BRSerial.dat&amp;diff=11449</id>
		<title>BRSerial.dat</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=BRSerial.dat&amp;diff=11449"/>
		<updated>2024-03-04T15:52:01Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;BRSerial.dat&#039;&#039;&#039; file contains your [[Business Rules!]] license information.  You can easily check the license information contained in this file by using [[CheckSerial.exe]].&lt;br /&gt;
&lt;br /&gt;
You may Rename BRSerial.dat to BrSerial.[BR Version] such as BRSerial.42 or BRSerial.43.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Files]] [[UserID$]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Sort_Facility&amp;diff=11426</id>
		<title>Sort Facility</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Sort_Facility&amp;diff=11426"/>
		<updated>2023-06-09T19:58:33Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Sort expanding on A vs B for &amp;quot;Address Out&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Business Rules sort facility allows you to produce a sorted output file from a randomly ordered file of records, and to rearrange the records in a variety of ways.&lt;br /&gt;
&lt;br /&gt;
A simple [[Index and Sort facilities Tutorial#Basic Overview of SORT|Sort Tutorial]] is now available.&lt;br /&gt;
&lt;br /&gt;
==Sort Command==&lt;br /&gt;
The SORT command is the instruction that tells BR to begin the sorting procedure. Its only parameter is an optional control file name that contains all the specifications about how a particular file, or set of files, is to be sorted.&lt;br /&gt;
&lt;br /&gt;
BR will execute the SORT command in any of the following 3 ways:&lt;br /&gt;
&lt;br /&gt;
#From READY mode. When followed by the name of the sort control file, SORT can be executed from READY mode.&lt;br /&gt;
#From a procedure file. When followed by either a sort control file name or by the specifications that make up a single sort group, SORT can be executed from a procedure file.&lt;br /&gt;
#With the EXECUTE statement. When the name of the sort control file is included, SORT may be specified by the EXECUTE statement.&lt;br /&gt;
&lt;br /&gt;
BR SORT facility allows you to produce a sorted output file from a randomly ordered file of records, and to rearrange the records in a variety of ways.&lt;br /&gt;
&lt;br /&gt;
===Comments and Examples===&lt;br /&gt;
The following example causes the sort specifications in ALPHABET.FIL to be executed (when ALPHABET.FIL is a sort control file in the form of an internal file):&lt;br /&gt;
 SORT ALPHABET.FIL&lt;br /&gt;
&lt;br /&gt;
Alternatively, and more easily edited sort control files can be created as [[PROC]] files. For example:&lt;br /&gt;
 PROC SAMPLESORT&lt;br /&gt;
&lt;br /&gt;
This command will run the procedure file SAMPLESORT, which begins with the SORT command, and contains all the sort control information. The SAMPLESORT procedure file might look like this:&lt;br /&gt;
&lt;br /&gt;
 Sort&lt;br /&gt;
 ! Creating a sort file, don&#039;t you worry!&lt;br /&gt;
 FILE orders.int,,,samplesort2,,,,,R,,REPLACE,SHR&lt;br /&gt;
 ALTS RO 1,&amp;quot;VERYQUICKFOX&amp;quot;&lt;br /&gt;
 RECORD I,106,2,C,&amp;quot;TX&amp;quot;,&amp;quot;TX&amp;quot;,OR&lt;br /&gt;
 RECORD I,106,2,C,&amp;quot;LA&amp;quot;,&amp;quot;LA&amp;quot;,OR&lt;br /&gt;
 RECORD I,106,2,C,&amp;quot;tx&amp;quot;,&amp;quot;tx&amp;quot;,OR&lt;br /&gt;
 RECORD I,106,2,C,&amp;quot;la&amp;quot;,&amp;quot;la&amp;quot;,OR&lt;br /&gt;
 SUM &lt;br /&gt;
 MASK 31,30,C,A,1,30,C,A&lt;br /&gt;
&lt;br /&gt;
SORT tells BR to run a sort as the first step of the procedure. The comment will show up on the operator&#039;s screen. Only FILE and MASK are required. Each parameter will be described in detail below, but this particular SORT will return a file named samplesort2 of the data in the ORDERS.INT file, containing only the customer information from Texas and Louisiana arranged alphabetically according to &amp;quot;VERYQUICKFOX&amp;quot;. Commas are necessary when skipping optional parameters within each line.&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
 SORT [&amp;lt;[[Sort control file|control file]]&amp;gt;]&lt;br /&gt;
[[Image:Sort.png]]&lt;br /&gt;
&lt;br /&gt;
===Defaults===&lt;br /&gt;
1.) Look to the next lines in the procedure file for the sort specifications.&lt;br /&gt;
&lt;br /&gt;
===Parameters===&lt;br /&gt;
The &amp;quot;control file&amp;quot; parameter specifies the name (and path, if required) of the sort control file to be executed. The sort control file contains up to six different types of specifications:&lt;br /&gt;
# COMMENT (use ! as the first character of a comment)&lt;br /&gt;
# FILE&lt;br /&gt;
# ALTS&lt;br /&gt;
# RECORD&lt;br /&gt;
# SUM&lt;br /&gt;
# MASK&lt;br /&gt;
&lt;br /&gt;
FILE and MASK are required, others are optional.&lt;br /&gt;
&lt;br /&gt;
The use of SORT without a control file-ref can only be done from within a procedure. All required sort specifications must then immediately follow the SORT command. (See [[Sort Facility]] for more information).&lt;br /&gt;
&lt;br /&gt;
Sort control files can be created in a text editor as a procedure file, or as an internal file using WRITE. The simplest way is using a procedure file, since you can easily view and edit the file.&lt;br /&gt;
&lt;br /&gt;
===Technical Considerations===&lt;br /&gt;
The &#039;&#039;&#039;Sort&#039;&#039;&#039; command performs a [[Clear]] operation (unless a program is active) and begins execution of the SORT control file. The number of RECORD specifications that may be used in sort control files is 20.&lt;br /&gt;
&lt;br /&gt;
A user-defined collating sequence may be accessed through the FILE specification&#039;s collating sequence parameter. See [[COLLATE ALTERNATE]] in [[BRConfig.sys]] for more information.&lt;br /&gt;
&lt;br /&gt;
==Types of Sort Specifications==&lt;br /&gt;
&lt;br /&gt;
Six different types of sort specifications are allowed in each sort group. FILE and MASK are required. The following table summarizes some information about the sort specifications:&lt;br /&gt;
&lt;br /&gt;
[[Image:SortSpecs.png]]&lt;br /&gt;
&lt;br /&gt;
Below are six sections describing each SORT specification in detail.&lt;br /&gt;
&lt;br /&gt;
===Comment===&lt;br /&gt;
&lt;br /&gt;
The optional Comment (!) specification displays a message to the operator on the screen. Usually it&#039;s a description of the current sort. Comments appear exactly as you enter them.&lt;br /&gt;
&lt;br /&gt;
====Comments and Examples====&lt;br /&gt;
BR displays up to twenty lines worth of Comments per sort group. Comments or Comment lines exceeding this amount are ignored. If a Comment is longer than 43 characters, it will wrap to the next line on the screen. The following is an example of SORT&#039;s Comment:&lt;br /&gt;
&lt;br /&gt;
 ! Now sorting customer file&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
&lt;br /&gt;
[[Image:SortComment.png]]&lt;br /&gt;
&lt;br /&gt;
====Parameters====&lt;br /&gt;
After the required &#039;&#039;&#039;!&#039;&#039;&#039; symbol, you mat include an optional message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Message&#039;&#039;&#039; is the information to be displayed on the screen exactly as it is entered.&lt;br /&gt;
&lt;br /&gt;
====Technical Considerations====&lt;br /&gt;
&lt;br /&gt;
1) Comment specifications may be placed anywhere before the MASK specification in the sort group.&lt;br /&gt;
&lt;br /&gt;
===SUM===&lt;br /&gt;
&lt;br /&gt;
SUM is an optional specification that causes BR to display a summary of record counts after a file has been sorted. The way the titles are displayed is currently under development.&lt;br /&gt;
&lt;br /&gt;
====Comments and Examples====&lt;br /&gt;
&lt;br /&gt;
SUM should be used only when an operator will be in attendance during the sort, as execution will not continue between sort groups until &amp;lt;ENTER&amp;gt; has been pressed.&lt;br /&gt;
&lt;br /&gt;
SUM displays three record counts:&lt;br /&gt;
# the total number of records in the input file not including deleted records.&lt;br /&gt;
# the number of records that were included in the sort.&lt;br /&gt;
# the number of records that were written to the output file.&lt;br /&gt;
&lt;br /&gt;
The following example replaces the first and last messages printed by the SUM specification. The &amp;quot;Records read&amp;quot; and &amp;quot;Records selected&amp;quot; titles are left unchanged, but the single space in the fourth position causes the title for &amp;quot;Records output&amp;quot; to be omitted.&lt;br /&gt;
&lt;br /&gt;
    SUM Sort of HIST.FIL completed,,, ,Press &amp;lt;CR&amp;gt; to continue&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
&lt;br /&gt;
[[Image:SortSum.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Defaults====&lt;br /&gt;
#Display &amp;quot;Sort successfully completed.&amp;quot;&lt;br /&gt;
#Display &amp;quot;Records read&amp;quot;&lt;br /&gt;
#Display &amp;quot;Records selected&amp;quot;&lt;br /&gt;
#Display &amp;quot;Records output&amp;quot;&lt;br /&gt;
#Display &amp;quot;Press any key to continue.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Parameters====&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;90&amp;quot;|&#039;&#039;&#039;Title1&#039;&#039;&#039;||is a replacement for the message &amp;quot;Sort successfully completed&amp;quot;, which will automatically be displayed unless you specify otherwise.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;90&amp;quot;|&#039;&#039;&#039;Title2&#039;&#039;&#039;||is a replacement for the title &amp;quot;Records read&amp;quot;. Unless you specify otherwise, BR displays this title next to a count of the total number of records read from the input file.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;90&amp;quot;|&#039;&#039;&#039;Title3&#039;&#039;&#039;||is a replacement for the title &amp;quot;Records selected&amp;quot;. Unless you specify otherwise, BR displays this title next to the total number of records, which were included in the sort.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;90&amp;quot;|&#039;&#039;&#039;Title4&#039;&#039;&#039;||is a replacement for the title &amp;quot;Records output&amp;quot;, which is displayed next to the total number of records that were written to the output file.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;90&amp;quot;|&#039;&#039;&#039;Title5&#039;&#039;&#039;||is a replacement for the message &amp;quot;Press Enter to continue&amp;quot;, which is automatically displayed unless you specify otherwise.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Technical Considerations====&lt;br /&gt;
&lt;br /&gt;
#To entirely suppress a message, enter a space for the title. There is no way to suppress record counts when SUM is specified.&lt;br /&gt;
#BR truncates any title parameter, which is longer than 70 characters.&lt;br /&gt;
#The number of records selected displayed on the third line and the number of records output displayed on the fourth line should always be the same.&lt;br /&gt;
&lt;br /&gt;
===FILE===&lt;br /&gt;
&lt;br /&gt;
The FILE specification is a required specification that identifies the following:&lt;br /&gt;
#Names of input and output files.&lt;br /&gt;
#Directory for workspace.&lt;br /&gt;
#Type of output file.&lt;br /&gt;
#Desired collating sequence.&lt;br /&gt;
#Optional replacement of previous output files with the same name.&lt;br /&gt;
#File sharing rules for the input file.&lt;br /&gt;
&lt;br /&gt;
====Comments and Examples====&lt;br /&gt;
The following specification indicates that MASTER is the file to be sorted. It can be found in the VOL subdirectory on drive C. SORTOUT is the name of the output file. This can also be found in the VOL subdirectory on drive C. The WORK subdirectory, on drive D, is the designated work space. An address-out sort (PD3 format) is to be performed, and the native collating sequence is to be used (unless the BRConfig.sys file or CONFIG command has specified ALTERNATE):&lt;br /&gt;
&lt;br /&gt;
 FILE MASTER,VOL,C,SORTOUT,VOL,C,WORK,D,A,N&lt;br /&gt;
&lt;br /&gt;
In the following example, SORT.IN is the file to be sorted. It is located in the current directory on the current drive. SORT[WSID].OUT is the output file. The current drive and directory will be used for the work space. In the name SORT[WSID].OUT, the [WSID] will be replaced with the current workstation ID. A record-out sort using the alternate collating sequence is called for. If SORT[WSID].OUT already exists, BR will replace it with the newly sorted file.&lt;br /&gt;
&lt;br /&gt;
 FILE SORT.IN,,,SORT[WSID].OUT,,,,,R,A,REPLACE&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
&lt;br /&gt;
[[Image:SortFile.png]]&lt;br /&gt;
&lt;br /&gt;
====Defaults====&lt;br /&gt;
#Use the current directory.&lt;br /&gt;
#Use the current drive.&lt;br /&gt;
#Record-out sort (FILE spec)&lt;br /&gt;
#Default according to the COLLATE specification in the BRConfig.sys file.&lt;br /&gt;
#Do not replace existing file by same name.&lt;br /&gt;
#Use SHRI.&lt;br /&gt;
&lt;br /&gt;
====Parameters====&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;Input file name&#039;&#039;&#039;||is the name of the internal file containing the records to be sorted. &amp;quot;Path&amp;quot; is the sequence of directories, which leads to this file. &amp;quot;Drive&amp;quot; is the drive on which the subdirectory path and file can be found.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;Output file name&#039;&#039;&#039;||is the name of the file that is to contain the sorted records (or just the record numbers of the records in sorted order). &amp;quot;Path&amp;quot; is the sequence of directories, which leads to this file, and &amp;quot;drive&amp;quot; is the drive on which the subdirectory path and file can be found.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;Workpath&#039;&#039;&#039;||is a sequence of subdirectories, which leads to the disk area where BR should create a temporary Workspace. &amp;quot;Workrive&amp;quot; is the drive on which this subdirectory path can be found. There is no need to specify a name for the work file, as BR handles this internally. See the Technical Considerations section below for formulas to help you estimate work file space.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;FILE spec&#039;&#039;&#039;||allows you to choose from three different sort storage methods. &amp;quot;A&amp;quot; calls for an address-out sort, which is to be stored in PD3 format. &amp;quot;B&amp;quot; calls for an address-out sort, which is to be stored in B4 format. (&#039;&#039;Note: Not BH4&#039;&#039;) In both cases, the &amp;quot;address&amp;quot; which is being stored is the relative record number. &amp;quot;R&amp;quot; calls for a record-out sort, which means that each entire record is written to the output file. See the Technical Considerations section below for formulas to help you estimate address-out and record-out space. Address-out sorts execute much more quickly than record-out sorts, and the B storage method is faster than the A storage method.   When using the A Method, PD 3 has a limit of 99,999, so any records &amp;gt;10,000 will have a 0 in the PD 3 value.  When possible using &amp;quot;B&amp;quot; to avoid problems with large data sets.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;Collating sequence&#039;&#039;&#039;||allows you to specify a collating sequence for the sort. &amp;quot;A&amp;quot; calls for the alternate collating sequence to be used, and &amp;quot;N&amp;quot; calls for the native sequence to be used. In most instances, the FILE specification collating sequence will override the BRConfig.sys file&#039;s COLLATE specification (for the sort only). There is one exception, however: if the FILES specification is N, and the BRConfig.sys specification is COLLATE ALTERNATE, the alternate collating sequence will be used. The following table should help clarify when each sequence is used. NOTE that the column labeled BRConfig.sys refers to the specification currently in use, whether it was actually specified by the BRConfig.sys file or by the CONFIG command: &lt;br /&gt;
[[Image:SortFileTable.png]] &lt;br /&gt;
&#039;&#039;&#039;*Note&#039;&#039;&#039; the exception with this option&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;REPLACE&#039;&#039;&#039;|| replaces an old sort output file (if it exists under the specified name) with the new output file. This eliminates the need to free or drop the file before sorting. REPLACE should only be used with caution, as the existence of the output file may indicate that a previous error has occurred. You may wish to restrict the use of this parameter to WSID temporary files and to address-out files.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&#039;&#039;&#039;share spec&#039;&#039;&#039;|| allows you to specify file sharing rules for the input file. Any one of the NOSHR, SHRI, SHR or SHRU keywords is accepted. Keep in mind that the sort output file will not be in sorted order if SHR is specified and a record&#039;s sort field is modified by another workstation during the sort. (See &amp;quot;[[share specs]]&amp;quot; for more information about share parameters)&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;All commas must be included in the FILE specification, even if some parameters are omitted&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Technical Considerations====&lt;br /&gt;
1) To estimate the amount of space BR will need for its temporary work space, use the following formula (applies to both address-out and record-out sorts):&lt;br /&gt;
&lt;br /&gt;
:     Number of records selected x 2&lt;br /&gt;
:       x Sort key length + 4&lt;br /&gt;
:      = N [round up to a multiple of 1024]&lt;br /&gt;
&lt;br /&gt;
2) To estimate the byte size of a PD3-formatted output file for an address-out sort (specified with the &amp;quot;A&amp;quot; parameter), use the following formula:&lt;br /&gt;
&lt;br /&gt;
:     Number of records selected&lt;br /&gt;
:       x 4&lt;br /&gt;
:      + 15&lt;br /&gt;
:       = N [round up to a multiple of 512]&lt;br /&gt;
&lt;br /&gt;
3) The record limit for a PD3-formatted address-out sort (&amp;quot;A&amp;quot;), is 99,999 records.&lt;br /&gt;
&lt;br /&gt;
4) To estimate the byte size of a B4-formatted output file for an address-out sort (specified with the &amp;quot;B&amp;quot; parameter), use the following formula:&lt;br /&gt;
&lt;br /&gt;
:      Number of records selected&lt;br /&gt;
:     x 5&lt;br /&gt;
:     + 16&lt;br /&gt;
:     = N [round up to a multiple of 512]&lt;br /&gt;
&lt;br /&gt;
5) The record limit for a B4-formatted address-out sort (&amp;quot;R&amp;quot;), is 2.147 billion (2**31-1) records.&lt;br /&gt;
&lt;br /&gt;
6) To estimate the byte size of the output file for a record-out sort (specified with the &amp;quot;R&amp;quot; parameter), use the following formula:&lt;br /&gt;
&lt;br /&gt;
:      Number of records selected&lt;br /&gt;
:     x Record length + 1&lt;br /&gt;
:       = N [round up to a multiple of 512]&lt;br /&gt;
&lt;br /&gt;
7) BR automatically clears the controls (including collating sequence) set by one sort group before it begins executing the next sort group.&lt;br /&gt;
&lt;br /&gt;
===ALTS===&lt;br /&gt;
&lt;br /&gt;
The optional ALTS specification allows you to either reorder part of the collating sequence or to set certain characters equal to a new collating value.&lt;br /&gt;
&lt;br /&gt;
====Comments and Examples====&lt;br /&gt;
&lt;br /&gt;
ALTS is frequently used to set the values of uppercase letters to the same values as their lowercase counterparts.&lt;br /&gt;
&lt;br /&gt;
ALTS specifications take effect only during character comparisons when C is specified as the format type.&lt;br /&gt;
&lt;br /&gt;
The following example reorders the collating values for the uppercase letters A through Z to match the collating values for their lowercase counterparts:&lt;br /&gt;
&lt;br /&gt;
 ALTS RO,97,&amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following example reorders lowercase letters so that vowels are sorted before consonants:&lt;br /&gt;
&lt;br /&gt;
 ALTS RO,97,&amp;quot;aeioubcdfghjklmnpqrstvwXYZ&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following nine specifications set the collating values for the characters 1 through 9 to a collating value of 48. These values come into effect only when the sort is performed on C field types. It does not effect the sorting of the digits 1 through 9 when they appear in N fields:&lt;br /&gt;
&lt;br /&gt;
 ALTS EQ,48,&amp;quot;123456789&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
&lt;br /&gt;
[[Image:SortAlts.png]]&lt;br /&gt;
&lt;br /&gt;
====Parameters====&lt;br /&gt;
&lt;br /&gt;
In the top route of the syntax diagram, &amp;quot;RO&amp;quot; indicates that a set of characters is to be reordered.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;New starting value&amp;quot; is the first value to be assigned in the reordering process. It must be a number from 0 to 255, and it must not be allowed to increment beyond 255. Thus if you enter a value of 253, only three characters may be reordered.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Character sequence&amp;quot; is a list of up to 28 characters which are to be reordered. It must be enclosed in quotation marks. The value which is specified as the &amp;quot;new starting value&amp;quot; will be assigned to the first character specified in the &amp;quot;character sequence&amp;quot;. The next sequential value will be assigned to the second character in the &amp;quot;character sequence&amp;quot;, and so on. If you wish to reorder more than 28 characters, you must use an additional ALTS specification.&lt;br /&gt;
&lt;br /&gt;
In the lower route of the syntax diagram, &amp;quot;EQ&amp;quot; indicates that a new, single collating value is to be assigned to the specified characters (the value and the characters are set equal).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;New value&amp;quot; is a value from 0 to 255 which is to be assigned to the character. &amp;quot;Character sequence&amp;quot; is the character or set of characters which is to be given a new value; it must be enclosed within quotation marks.&lt;br /&gt;
&lt;br /&gt;
====Technical Considerations====&lt;br /&gt;
&lt;br /&gt;
1) If the ALTERNATE collating sequence is used for the sort, the following implied ALTS specification is automatically registered before any other ALTS specification is executed. Subsequent and overlapping ALTS specifications will take precedence over this specification:&lt;br /&gt;
&lt;br /&gt;
      ALTS RO,176,&amp;quot;0123456789&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2) There is no limit to the number of ALTS specifications in a single sort group.&lt;br /&gt;
&lt;br /&gt;
3) BR automatically clears all controls (including collating sequence and ALTS reordering) set by one sort group before it begins executing the next sort group.&lt;br /&gt;
&lt;br /&gt;
===Record===&lt;br /&gt;
&lt;br /&gt;
The optional RECORD specification allows you to specifically include or eliminate particular records from the sorting procedure.&lt;br /&gt;
&lt;br /&gt;
====Comments and Examples====&lt;br /&gt;
Each RECORD specification tells BR to examine a specific field, called the select field, and determines whether or not the record should be included in the sort. If the value of the select field falls inside the specified limits and I (include) has been specified, BR includes that record in the sort.&lt;br /&gt;
&lt;br /&gt;
If the value of the select field falls outside the specified limits and O (omit) has been specified, BR includes that record in the sort.&lt;br /&gt;
&lt;br /&gt;
When two or more RECORD specifications are connected by the keyword &amp;quot;AND&amp;quot; (also the default), a single record must meet the qualifications of both before it will be included in the sort.&lt;br /&gt;
&lt;br /&gt;
The RECORD specification in the following example tells BR to include only the records that fall inside the specified limits. The select field starts in position one of the record and is four characters in length. It is in packed decimal (PD) format. If the select field is equal to or greater than 100, and not more than 999, it will be included in the sort.&lt;br /&gt;
&lt;br /&gt;
 RECORD I,1,4,PD,&amp;quot;100&amp;quot;,&amp;quot;999&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following six RECORD specifications demonstrate the use of AND and OR. If a record passes the test in the first specification, it is automatically included in the sort. If it does not pass this test, it is evaluated according to the next three record specifications. If it does not receive a true evaluation for each, it may still be able to pass the requirements of the last two specifications. If it does not pass any of the three tests, it is not included in the sort:&lt;br /&gt;
&lt;br /&gt;
 RECORD I,40,5,C,&amp;quot;55024&amp;quot;,&amp;quot;55036&amp;quot;,OR&lt;br /&gt;
 RECORD I,49,15,C,&amp;quot;DAKOTA&amp;quot;,&amp;quot;DAKOTA&amp;quot;,AND&lt;br /&gt;
 RECORD I,20,15,C,&amp;quot;OUST RD&amp;quot;,&amp;quot;OUST RD&amp;quot;,AND&lt;br /&gt;
 RECORD I,15,5,C,&amp;quot;47315&amp;quot;,&amp;quot;47722&amp;quot;,OR&lt;br /&gt;
 RECORD I,49,15,C,&amp;quot;DAKOTA&amp;quot;,&amp;quot;DAKOTA&amp;quot;,AND&lt;br /&gt;
 RECORD I,20,15,C,&amp;quot;RIDGE RD&amp;quot;,&amp;quot;RIDGE RD&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The following record specification uses comparison fields in each individual record as the select field&#039;s lower and upper limits. An example of how it would be used is to identify all inventory items which are either understocked or overstocked. The select field (which represents the current inventory amount), is described as the six-character field that starts at position 28. If the value of this field is less than the value of the field that starts at position 52 (the minimum inventory amount) or greater than the value of the field that starts at position 59 (the maximum inventory amount), it will be included in the sort.&lt;br /&gt;
&lt;br /&gt;
 RECORD O,28,6,N,52,59&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
&lt;br /&gt;
[[Image:SortRecord.png]]&lt;br /&gt;
&lt;br /&gt;
====Defaults====&lt;br /&gt;
&lt;br /&gt;
1) Use AND.&lt;br /&gt;
&lt;br /&gt;
====Parameters====&lt;br /&gt;
&lt;br /&gt;
RECORD&#039;s first parameter must either be &amp;quot;I&amp;quot; (include) or &amp;quot;O&amp;quot; (omit). If you choose I, BR will include all records with select fields that fall inside the values you specify. If you choose O, BR will exclude all records with select fields that fall outside the values you specify. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Start pos&amp;quot; is the starting position of the select field, and &amp;quot;field length&amp;quot; is its character length. &amp;quot;Form spec&amp;quot; indicates the format of the field (C, N, PD, etc.; see the discussion of [[Category:File_Operations#Format_Specifications|format specifications]] in the [[File Operations]] Section for more information).&lt;br /&gt;
&lt;br /&gt;
BR compares the data in the specified field to lower and upper limits before determining whether or not its record should be included in the sort.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Lower limit start pos&amp;quot; identifies the starting position of another field in the record. BR will use the value of this comparison field as the lower limit of the select field. The format type of the comparison field must be identical to that of the select field, and the field length must be the same.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Upper limit start pos&amp;quot; identifies the starting position of the field which contains the upper limit value for the select field. The format type of this comparison field must be identical to that of the select field, and the field length must be the same.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Lower limit&amp;quot; and &amp;quot;upper limit&amp;quot; are constants enclosed within quotation marks. BR will consider these to be the low and high limit values for the select field in determining whether or not the record should be included. BR will not accept strings greater than 40 characters in length for this parameter. It is important to distinguish between uppercase and lowercase letters when using these options, as BR makes a letter-for-letter comparison on character fields.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;OR&amp;quot; and &amp;quot;AND&amp;quot; are the RECORD specifications&#039; last two parameters. If all the RECORD specifications in a sort group are joined by &amp;quot;AND&amp;quot;, a record must pass the requirements of each before it will be included in the sort. The following two specifications, for instance, require that the value of a certain four-character field in the record fall outside 2000 and 8000 and that a certain two-character field is equal to MN. If a record doesn&#039;t pass both these tests, it is not included in the sort.&lt;br /&gt;
&lt;br /&gt;
 RECORD O,3,4,C,&amp;quot;2000&amp;quot;,&amp;quot;8000&amp;quot;,AND&lt;br /&gt;
 RECORD I,28,2,&amp;quot;MN&amp;quot;,&amp;quot;MN&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;OR&amp;quot; parameter gives a second try to records that don&#039;t pass the first set of requirements. When it is included at the end of a RECORD specification, &amp;quot;OR&amp;quot; tells BR that the next RECORD specification begins a new set of requirements. If the current record passes the first set of requirements, BR does not check to see if it will pass any others. If the record does not pass the first set, however, BR sequentially checks to see if it will pass any other sets. As soon as it passes the requirements for one set of RECORD specifications, BR includes it in the sort.&lt;br /&gt;
&lt;br /&gt;
When &amp;quot;passing&amp;quot;lower and higher limits in the &amp;quot;record&amp;quot; section be sure and enclose the incoming variables with the appropriate quote sequence. This is just and example:&lt;br /&gt;
&lt;br /&gt;
 LET Data_Record$=&#039;RECORD I,&#039;&amp;amp;Str$(Recpos)&amp;amp;&#039;,8,C,&amp;quot;&#039;&amp;amp;V_File$&amp;amp;&#039;&amp;quot;,&amp;quot;&#039;&amp;amp;V_File$&amp;amp;&#039;&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
In the above example we are passing the Record Position and the lower and upper file numbers we want included in the &amp;quot;filter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Technical Considerations====&lt;br /&gt;
&lt;br /&gt;
1) BR allows up to 20 RECORD specifications per sort group. (On releases prior to 3.21b, the limit was ten)&lt;br /&gt;
2) When the OR parameter is used, processing will be faster if the first conditions are the ones most likely to result in a true evaluation.&lt;br /&gt;
3) The two different types of lower and upper limit parameters may be specified in the same RECORD specification.&lt;br /&gt;
4) When I is specified, the RECORD specification&#039;s parameters are inclusive. This means that a record will be included in the sort if the select field&#039;s value is equal to the upper or lower limit value or if it is between the upper and lower limit values.&lt;br /&gt;
5) When O is specified, RECORD&#039;s upper and lower limits are exclusive; the select field value may not be equal to either the upper or lower limit if it is to be included in the sort.&lt;br /&gt;
&lt;br /&gt;
===MASK===&lt;br /&gt;
&lt;br /&gt;
MASK is a required specification that identifies up to ten sort fields and the manner (ascending or descending) in which they should be sorted.&lt;br /&gt;
&lt;br /&gt;
====Comments and Examples====&lt;br /&gt;
A sort field contains the specific information to be sorted. When you wish to organize records in descending order by zip code, for example, the sort field is the zip code. The following MASK specification defines two sort fields. The first starts in position 1 and is four characters long; it is in packed decimal (PD) format, and it is to be sorted in ascending order. The second field starts in position 10 and is three characters long. It is in character (C) format, and is also to be sorted in ascending order.&lt;br /&gt;
&lt;br /&gt;
 MASK 1,4,PD,A,10,3,C,A&lt;br /&gt;
&lt;br /&gt;
====Syntax====&lt;br /&gt;
&lt;br /&gt;
[[File:SortMask.png]]&lt;br /&gt;
&lt;br /&gt;
====Parameters====&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Start position&amp;quot; is the starting record position of the field to be sorted, and &amp;quot;field length&amp;quot; is its character length. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Form spec&amp;quot; indicates the format, or data type, of the field. The format specifications which can be used in the MASK specification include the following: B (Binary); BL (Binary low); BH (Binary high); C (Character); D (Double-precision); L (Long); N (Numeric); PD (Packed decimal); S (Single-precision) and ZD (Zoned decimal). See [[:Category:File_Operations#Format_Specifications|Format Specifications]] in the [[File Operations]] section for more information about each of these format types.&lt;br /&gt;
&lt;br /&gt;
The last parameter must either be &amp;quot;A&amp;quot; to sort the specified record in ascending order, or &amp;quot;D&amp;quot; to sort it in descending order.&lt;br /&gt;
&lt;br /&gt;
====Technical Considerations====&lt;br /&gt;
#The following field lengths are required for the D, S &amp;amp; L format specs: D is 8; S is 4; &amp;amp; L is 9.&lt;br /&gt;
#The total sort key length may not exceed 32,767 bytes.&lt;br /&gt;
#Up to ten fields may be specified with the MASK specification.&lt;br /&gt;
#MASK must always be the last specification in a sort group.&lt;br /&gt;
#The existence of MASK flags the end of the current sort group. BR will automatically treat any specifications that follow as part of the next sort group.&lt;br /&gt;
&lt;br /&gt;
==Sort Specification==&lt;br /&gt;
&lt;br /&gt;
The ! (for a comment), FILE, ALTS, RECORD, SUM and MASK specifications each control a different aspect of the sorting procedure. A set of these specifications makes up a sort group.&lt;br /&gt;
&lt;br /&gt;
===Sort Group===&lt;br /&gt;
&lt;br /&gt;
A sort group contains all the necessary specifications for controlling the sorting of a single file. If only one file is to be sorted, a single sort group may simply follow a SORT command when it is specified in a procedure file. When several files are to be sorted, the sort group for each file may be placed together in a single sort control file.&lt;br /&gt;
&lt;br /&gt;
==Sort Control File==&lt;br /&gt;
{{:Sort control file}}&lt;br /&gt;
&lt;br /&gt;
==Sort Baseyear Processing==&lt;br /&gt;
&lt;br /&gt;
If a Y is appended to the A/D (ascending/descending) indicator of sort MASK statements or the I/O (include/exclude) field of RECORD statements, the field is subject to BASEYEAR processing.&lt;br /&gt;
&lt;br /&gt;
If such a field is in display format, then the first two characters are assumed to be a BASEYEAR dependent value.  If the field is packed (BH or PD) then the storage format is assumed to be YYMMDD, YYMM or YY format depending on the length of the field, similar to INDEX (see above table).&lt;br /&gt;
&lt;br /&gt;
The Y2K sorting and indexing features interpret year zero as zero (instead of 2000) if the month and day are zero.  Leading blanks in baseyear sensitive fields are replaced with zeroes for sorting purposes, provided the remainder of the field contains only numeric data.&lt;br /&gt;
&lt;br /&gt;
Prior to release 3.83e, BR ignored the digits to the left of the rightmost six digits of a date value unless century was specified in the mask.&lt;br /&gt;
&lt;br /&gt;
;Example:&lt;br /&gt;
&lt;br /&gt;
 ... DAYS(1001021,&amp;quot;YMD&amp;quot;) produced the same result as DAYS(001021,&amp;quot;YMD&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Now if BR is unsuccessful applying the &amp;quot;YMD&amp;quot; mask it now tries &amp;quot;CYMD&amp;quot;.  This change has inconvenienced some dealers.  Therefore OPTION 18 is provided to ignore the presence of digits to the left of the rightmost six digits.&lt;br /&gt;
&lt;br /&gt;
==Improving Sort Speed==&lt;br /&gt;
&lt;br /&gt;
All of the following factors can affect the speed of a sorting operation:&lt;br /&gt;
&lt;br /&gt;
# Number of records to be sorted. The fewer the records, the faster the sort.&lt;br /&gt;
# Type of sort. Address-out sorts takes less time to run than a record-out sorts because they require fewer disk reads and writes. Also the B storage method for address-out sorts is faster than the A storage method.&lt;br /&gt;
# RECORD specification(s). When RECORD specifications cause many records to be omitted from the sort, the sort runs faster.&lt;br /&gt;
# Length of sort field. The shorter the sort field, the faster the sort.&lt;br /&gt;
# Order of records in the input file. Files with records that are already close to the desired order sort more quickly than more randomly ordered files.&lt;br /&gt;
# Record size. The smaller the input records the faster the sort.&lt;br /&gt;
# Storage size of the computer. In general, the greater the storage, the faster the sort. If the computer does not have enough storage, it must use work files: the time required to read from and write to these files adds to the amount of time the sort takes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Sorting and Indexing]]&lt;br /&gt;
[[Category:Facility Commands]]&lt;br /&gt;
[[Category:Needs Help]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11419</id>
		<title>Category:Format Specifications</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11419"/>
		<updated>2023-04-11T16:27:00Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See the format specifications below for more details on each.&lt;br /&gt;
&lt;br /&gt;
See also [[Format specifications]] for a chart comparing their uses.&lt;br /&gt;
&lt;br /&gt;
Format specifications tell Business Rules the form that a particular data field will be in. A format specification is required whenever data is input into or output from a program. It is also required with the full screen processing statements. Format specs are not required in the following situations: with unformatted internal files, with all display files, and when unformatted PRINT statements are used.&lt;br /&gt;
&lt;br /&gt;
Not all format specifications are alike in their uses. Some can be used with internal and external files, but not with display files. Some can be used only with full screen formatting. And some format specifications behave differently depending on whether they are used for input or output.&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Common SQL Fields and BR Equivilants&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot; CELLSPACING=&amp;quot;1&amp;quot; CELLPADDING=&amp;quot;3&amp;quot; WIDTH=&amp;quot;100%&amp;quot; ALIGN=&amp;quot;Center&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;SQL Field&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;BR Equivilant&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;Example&amp;lt;/TH&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;COUNTER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;LONG INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SINGLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DOUBLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BINGINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 10&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SMALLINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH 2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;FLOAT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;L&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DECIMAL&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N or PD&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12.2 or PD 6.2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATETIME&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;Typically Stored as separate fields&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 8 or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;CHAR&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 30&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/TABLE&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Field Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11418</id>
		<title>Category:Format Specifications</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11418"/>
		<updated>2023-04-11T16:26:21Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See the format specifications below for more details on each.&lt;br /&gt;
&lt;br /&gt;
See also [[Format specifications]] for a chart comparing their uses.&lt;br /&gt;
&lt;br /&gt;
Format specifications tell Business Rules the form that a particular data field will be in. A format specification is required whenever data is input into or output from a program. It is also required with the full screen processing statements. Format specs are not required in the following situations: with unformatted internal files, with all display files, and when unformatted PRINT statements are used.&lt;br /&gt;
&lt;br /&gt;
Not all format specifications are alike in their uses. Some can be used with internal and external files, but not with display files. Some can be used only with full screen formatting. And some format specifications behave differently depending on whether they are used for input or output.&lt;br /&gt;
&lt;br /&gt;
Common SQL Fields and BR Equivilants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;1&amp;quot; CELLSPACING=&amp;quot;1&amp;quot; CELLPADDING=&amp;quot;3&amp;quot; WIDTH=&amp;quot;100%&amp;quot; ALIGN=&amp;quot;Center&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;SQL Field&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;BR Equivilant&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;Example&amp;lt;/TH&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;COUNTER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;LONG INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SINGLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DOUBLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BINGINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 10&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SMALLINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH 2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;FLOAT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;L&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DECIMAL&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N or PD&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12.2 or PD 6.2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATETIME&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;Typically Stored as separate fields&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 8 or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;CHAR&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 30&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/TABLE&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Field Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11417</id>
		<title>Category:Format Specifications</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11417"/>
		<updated>2023-04-11T14:23:26Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See the format specifications below for more details on each.&lt;br /&gt;
&lt;br /&gt;
See also [[Format specifications]] for a chart comparing their uses.&lt;br /&gt;
&lt;br /&gt;
Format specifications tell Business Rules the form that a particular data field will be in. A format specification is required whenever data is input into or output from a program. It is also required with the full screen processing statements. Format specs are not required in the following situations: with unformatted internal files, with all display files, and when unformatted PRINT statements are used.&lt;br /&gt;
&lt;br /&gt;
Not all format specifications are alike in their uses. Some can be used with internal and external files, but not with display files. Some can be used only with full screen formatting. And some format specifications behave differently depending on whether they are used for input or output.&lt;br /&gt;
&lt;br /&gt;
Common SQL Fields and BR Equivilants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;0&amp;quot; CELLSPACING=&amp;quot;1&amp;quot; CELLPADDING=&amp;quot;3&amp;quot; WIDTH=&amp;quot;100%&amp;quot; ALIGN=&amp;quot;Center&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;SQL Field&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;BR Equivilant&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;Example&amp;lt;/TH&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;COUNTER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;LONG INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SINGLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DOUBLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BINGINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 10&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SMALLINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH 2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;FLOAT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;L&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DECIMAL&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N or PD&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12.2 or PD 6.2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATETIME&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;Typically Stored as separate fields&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 8 or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;CHAR&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 30&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/TABLE&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Field Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11416</id>
		<title>Category:Format Specifications</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Category:Format_Specifications&amp;diff=11416"/>
		<updated>2023-04-11T14:22:16Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See the format specifications below for more details on each.&lt;br /&gt;
&lt;br /&gt;
See also [[Format specifications]] for a chart comparing their uses.&lt;br /&gt;
&lt;br /&gt;
Format specifications tell Business Rules the form that a particular data field will be in. A format specification is required whenever data is input into or output from a program. It is also required with the full screen processing statements. Format specs are not required in the following situations: with unformatted internal files, with all display files, and when unformatted PRINT statements are used.&lt;br /&gt;
&lt;br /&gt;
Not all format specifications are alike in their uses. Some can be used with internal and external files, but not with display files. Some can be used only with full screen formatting. And some format specifications behave differently depending on whether they are used for input or output.&lt;br /&gt;
&lt;br /&gt;
Common SQL Fields and BR Equivilants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TABLE BORDER=&amp;quot;0&amp;quot; CELLSPACING=&amp;quot;1&amp;quot; CELLPADDING=&amp;quot;3&amp;quot; WIDTH=&amp;quot;100%&amp;quot; ALIGN=&amp;quot;Center&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;SQL Field&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;BR Equivilant&amp;lt;/TH&amp;gt;&lt;br /&gt;
 &amp;lt;TH&amp;gt;Example&amp;lt;/TH&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;COUNTER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;LONG INTEGER&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SINGLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;S&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DOUBLE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BINGINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 10&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;SMALLINT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;BH&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;VH 2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;FLOAT&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;L&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 6&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DECIMAL&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N 12.2&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATETIME&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;N/A&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;Typically Stored as separate fields&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;TR&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;DATE&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
 &amp;lt;TD&amp;gt;C 8 or D&amp;lt;/TD&amp;gt;&lt;br /&gt;
&amp;lt;/TR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/TABLE&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Field Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=BR_Forum&amp;diff=11088</id>
		<title>BR Forum</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=BR_Forum&amp;diff=11088"/>
		<updated>2019-05-21T13:16:20Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Link to Register on Forum was broken.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;BR Forum&#039;&#039;&#039; ([http://brforum.brulescorp.com brforum.brulescorp.com]) is the place to post your questions, answers and other discussions about the Business Rules! programming language.&lt;br /&gt;
&lt;br /&gt;
To keep up to date with what is going on on the BR Forum, it is suggested that you subscribe to the [http://brforum.brulescorp.com/rss.php BR Forum&#039;s RSS feed].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===New Users===&lt;br /&gt;
*[http://brforum.brulescorp.com/ucp.php?mode=register Register]&lt;br /&gt;
*[http://brforum.brulescorp.com/viewforum.php?f=20&amp;amp;sid=60fc6da8b23fc4ddab1355116d9e3906 Help using the BR forum]&lt;br /&gt;
&lt;br /&gt;
When you get there, please check out the &amp;quot;[http://brforum.brulescorp.com/viewforum.php?f=20&amp;amp;sid=60fc6da8b23fc4ddab1355116d9e3906 Using this forum]&amp;quot; section for a few pointers to help you get started.&lt;br /&gt;
&lt;br /&gt;
You must be registered in the new forum in order to post messages. To do so, go to [http://brforum.brulescorp.com/ brforum.brulescorp.com]  and [http://brforum.brulescorp.com/profile.php?mode=register&amp;amp;sid=ee5bc51d99c90d7865769931e18acb22 Register]. New registrations must be approved by a moderator, so there could possibly be a slight delay before that takes place. Once you are registered, log in using the [http://brforum.brulescorp.com/login.php Log in] link in the upper right corner and you&#039;re ready to go.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Older Forum: the Maillist==&lt;br /&gt;
The older &amp;quot;BR_forum&amp;quot; maillist is still in wide spread use as a portal to the online forum, just remember that every email you send or receive here will be published.&lt;br /&gt;
&lt;br /&gt;
*[http://brulescorp.com/mailman/listinfo/br_forum_ads.net maillist]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Floating_Point_Numbers&amp;diff=11083</id>
		<title>Floating Point Numbers</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Floating_Point_Numbers&amp;diff=11083"/>
		<updated>2019-04-29T17:42:33Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Floating point numbers are numbers which allow the decimal point to &amp;quot;float&amp;quot; to any position. &lt;br /&gt;
&lt;br /&gt;
The Business Rules syntax is nEm, where n is a numeric constant indicating the sign and significant digits in the number, E represents base 10, and m is a signed integer representing the power to which 10 is raised. &lt;br /&gt;
&lt;br /&gt;
The largest and smallest numbers available to the system vary according to the hardware and operating system being used. The system function [[INF]] can be used to print the largest possible number on any given system; 1/INF generates the smallest number. Some caution should be used in working with numbers near these minimum and maximum extremes (e.g., using exponential notation in SORT). Also, for any given combination of hardware and Business Rules, the system infinity function INF and some testing should be combined to determine whether or not intermediate values used in calculations will be truncated. &lt;br /&gt;
&lt;br /&gt;
All numbers in memory are floating point numbers. The form of the number when written to disk or printed depends on the format or mask used in writing the number. Number variables are designated by NOT ending with a dollar sign in Business Rules.&lt;br /&gt;
&lt;br /&gt;
The fact that floating-point numbers cannot precisely represent all real numbers, and that floating-point operations cannot precisely represent true arithmetic operations, leads to many surprising situations. This is related to the finite precision with which computers generally represent numbers. in BUsiness Rules, floating point numbers can only provide 16 digits of precision, this is before or after the decimal place.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
Values that fit in Floating Point:&lt;br /&gt;
print using &#039;form n 20.2&#039;:1234567890123.45 --&amp;gt;     1234567890123.45&lt;br /&gt;
print using &#039;form n 20.8&#039;:1234567.89012345 --&amp;gt;     1234567.89012345&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Values that do not fit in Floating Point: &lt;br /&gt;
print using &#039;form n 20.2&#039;:123456789012345.67 --&amp;gt;   123456789012346.00&lt;br /&gt;
print using &#039;form n 20.8&#039;:1234567890.1234567 --&amp;gt;   1234567890.12346000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Definitions]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=System_(command)&amp;diff=11079</id>
		<title>System (command)</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=System_(command)&amp;diff=11079"/>
		<updated>2019-03-26T06:54:53Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Using SYSTEM to exit BR */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System (SY)&#039;&#039;&#039; [[:Category:commands|command]] can do two things:&lt;br /&gt;
#Exit BR and return control to the [[operating system]], or &lt;br /&gt;
#Perform a &#039;&#039;&#039;shell call&#039;&#039;&#039; (an operating system command) while BR is active. &lt;br /&gt;
&lt;br /&gt;
System can be executed from [[READY mode]], from a [[procedure file]], or with the [[Execute]] [[statement]].&lt;br /&gt;
&lt;br /&gt;
==Using SYSTEM to exit BR==&lt;br /&gt;
&lt;br /&gt;
Entering SYSTEM or it&#039;s short form, SY into the command line while in ready mode will exit BR. The same can be done using an [[Execute]] Statement or a procedure file. Optionally, the SYSTEM LOGOFF may be used when in client server to clear the login credentials.   The next time client server is started, the user will be requested to enter their credentials.&lt;br /&gt;
&lt;br /&gt;
[[image:Sy.jpg]]&lt;br /&gt;
[[image:System2.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Using SYSTEM to send commands to the operating system==&lt;br /&gt;
===Comments and Examples===&lt;br /&gt;
One use of the SYSTEM command is to run a program. In the following example, the SYSTEM command runs a program called BACKUP. By default, the first program waits until the other program has finished running, and then continues where it left off. The syntax includes the SYSTEM keyword and then the OS command, which in this case is the program name and location of the data to handle. &lt;br /&gt;
&lt;br /&gt;
 SYSTEM BACKUP C:\\*.DAT A: /S&lt;br /&gt;
&lt;br /&gt;
When the same command is used with an asterisks preceding the program name, BACKUP, the BR program restores its own screen upon re-entry:&lt;br /&gt;
&lt;br /&gt;
 SYSTEM *BACKUP C:\\*.DAT A: /S&lt;br /&gt;
&lt;br /&gt;
The statement below tests to see what type of operating system the program is running on, then executes the appropriate SYSTEM command for the operating system:&lt;br /&gt;
&lt;br /&gt;
 00100 IF FILE$(0)(1:3)=&amp;quot;CON:&amp;quot; THEN EXECUTE &amp;quot;SYSTEM DIR&amp;quot; :!ELSE EXECUTE &amp;quot;SYSTEM ls -al /usr/BR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Using Batch Files with System Exits===&lt;br /&gt;
&lt;br /&gt;
One use of the System command is to pass a return code to the host operating system as it permanently exits from BR. In the following example, a DOS [[batch file]] tests the return code ([[ERRORLEVEL]]) and performs a specific action according to its value.&lt;br /&gt;
&lt;br /&gt;
 BR PROC START&lt;br /&gt;
 IF ERRORLEVEL 101 GOTO BADERROR&lt;br /&gt;
 IF ERRORLEVEL 100 GOTO BACKUP&lt;br /&gt;
 IF ERRORLEVEL 99 GOTO FORMAT&lt;br /&gt;
 GOTO DONE&lt;br /&gt;
 :BACKUP&lt;br /&gt;
 BACKUPBR&lt;br /&gt;
 :FORMAT&lt;br /&gt;
 FORMAT A:&lt;br /&gt;
 BRSTART&lt;br /&gt;
 :BADERROR&lt;br /&gt;
 ECHO BAD ERROR RETURN CODE &amp;gt;100&lt;br /&gt;
 :DONE&lt;br /&gt;
&lt;br /&gt;
If the command SYSTEM 100 were used to exit from BR while the above batch file was active, DOS would start a back-up procedure as soon as the BR exit was complete.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
 SYSTEM [&amp;lt; code for OS&amp;gt;|[*]&amp;lt;OS command&amp;gt;]&lt;br /&gt;
[[Image:System.png]]&lt;br /&gt;
&lt;br /&gt;
==Defaults==&lt;br /&gt;
:1) Return control to the operating system with a return code of zero.&lt;br /&gt;
:2) Do not restore screen.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&#039;&#039;&#039;Code returned to OS&#039;&#039;&#039; parameter sets the value of the operating system return code which may be accessed using ERRORLEVEL in DOS batch files, and through the $? substitution in a Linux shell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OS command&#039;&#039;&#039; parameter is an operating system command which BR passes to the operating system for execution. If the result of the command requires no operator action, BR is immediately reentered after the command finishes execution. Since BR is active during the entire process, all variable values and memory remain the same. When the &#039;&#039;&#039;OS command&#039;&#039;&#039; parameter is preceded by an asterisk, the BR screen is restored upon re-entry. The &#039;&#039;&#039;OS command&#039;&#039;&#039; parameter must be a &#039;&#039;&#039;string variable&#039;&#039;&#039; or a string enclosed in quotes.&lt;br /&gt;
&lt;br /&gt;
Additional Flags that can alter the behavior of the shell call as follows:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-E or -e&#039;&#039;&#039;||&amp;quot;Errors&amp;quot; indicates that any Operating System errors returned from the shell should be reported (as error 4300). Otherwise shell call operating errors are ignored. Occasionally Windows returns error values for fairly nominal exceptions. So the -e is provided as an error return sensitivity level flag.  Further information can be obtained by querying SYSERR or SYSERR$&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-M or -m&#039;&#039;&#039;|| Run the program &amp;quot;minimized&amp;quot;.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||If a lower case m is specified, the process or program runs in a DOS command shell without displaying the DOS window, but with a corresponding icon on the task bar (effectively running the shelled process/program &amp;quot;minimized&amp;quot;) This is only applicable in Windows. It is ignored on all other systems.  If -m is omitted, the shelled program will open in a separate application window.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||If an upper case M is specified, the same thing happens except the task does not appear on the taskbar. It runs invisibly. Furthermore [[SPOOLCMD]] calls use lowercase m.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-s&#039;&#039;&#039;||Server Shell Call (this is the default for Unix). If -s is omitted on Windows, then this shell call is performed on the client.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-@&#039;&#039;&#039;||If using Client Server, then it runs the program on the  client. Client Shell Call is the default for Windows. If -@ is omitted, on Unix the shell call is performed on the server.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||(search path not implemented  on client)&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||Note- Ctrl-] ALWAYS performs a DOS shell call on the client.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-c&#039;&#039;&#039;||The main program &amp;quot;continues&amp;quot; to run while running the called one.  Windows launches the task and resumes BR operation where it left off. For Unix, the command is framed with NOHUP and &amp;amp;. If -c is omitted, then the shell call waits til the process is finished (up to the # seconds specified in SHELL LIMITS) before returning to BR.&lt;br /&gt;
&lt;br /&gt;
For [[OSX]] 10.6 you need&lt;br /&gt;
&lt;br /&gt;
sys -c | (pipe) Shell commands with a pipe make BR Continue after executing the sys -c (continue), if you do not insert the | pipe, then the script does not run under Br [[4.18]] and up.&lt;br /&gt;
This was found on a Macintosh client that just updated to OSX 10.6.x&lt;br /&gt;
&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-r&#039;&#039;&#039;||&amp;quot;Restore&amp;quot; means that Windows always performs shell in a separate window. (Unix ignores shell standard out data). If -r is omitted. then Unix forwards standard out and stdin data to and from the client window.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||Restores screen after running command on all systems.  In windows, the screen is always restored, so this flag is essentially ignored. This is the same as sys *command.  The newer syntax is more readable and preferred.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-w&#039;&#039;&#039;||(&amp;quot;without shell&amp;quot;) When a Windows application is called, use a -w flag to tell BR not to call COMMAND.COM, but to call the application directly.  It must be a program (i.e. &amp;quot;exe&amp;quot;) and not a script. The Search Path is used ON SERVER only (if no slashes). This option does NOT open a DOS window. It does not use Bourne shell. It enables unfiltered return values. A Timeout or Ctrl-A kills the process. If -w is omitted, then a timeout or Ctrl-A does NOT kill the process, which can leave orphans.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||Note- Currently -w is ignored in Unix standard models.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;blank&#039;&#039;&#039;||Application standard output is forwarded to the client. However the Bourne shell is utilized to initiate the process. The shelled program CAN be an executable script.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-p&#039;&#039;&#039;||(&amp;quot;Page Standard Output&amp;quot;) - This option applies to Unix server only. If -p is omitted, then output goes to screen without pausing&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-t9999&#039;&#039;&#039;||Wait up to the specified number of seconds (for client server only). If -t is omitted, wait the number of seconds specified in the [[SHELL LIMIT]] statement (see [[BRConfig.sys]] chapter for more information on [[SHELL LIMIT]])&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Technical Considerations==&lt;br /&gt;
:1) Simultaneous pressing of the Ctrl key and the right- bracket (]) key has the same effect as the SYSTEM command&#039;s shell call, except that no command string is automatically executed upon access to the operating system. Pressing of these keys causes BR immediately access the operating system and display the system prompt. Between each operating system operation, a message about what action is required to return to BR will be displayed.&lt;br /&gt;
:2) Too frequent or careless use of the SYSTEM command can make it more difficult to move your program to a new operating system. ADS strongly recommends the use of the FILE$ function in programs and procedures which access the resident operating system. This function allows programs to test the type of operating system before proceeding with a system-dependent sequence of commands. While the FILE$ function can always be programmed in at a later date, you may be able to save a great deal of time and recoding by placing it in programs as they are written.&lt;br /&gt;
:3) When the system call (either Ctrl-] or the [[SYSTEM]] command) starts and then exits a secondary software program before returning to [[BR]], the [[CODE]] function will reflect any return code that the secondary program has passed to the operating system. As soon as BR is reactivated, the value of [[CODE]] can be tested to Verify whether or not the secondary program was successful. This is currently valid for Linux versions of [[BR]] only.&lt;br /&gt;
:4) [[BR]] passes all quotation marks within or surrounding the &amp;quot;string-expr&amp;quot; parameter back to the operating system.&lt;br /&gt;
:5) The screen may be cleared on some Linux terminals when the [[SYSTEM]] call is completed. If this is undesirable, see [[Terminal Considerations]] for a possible remedy.&lt;br /&gt;
:6) BR now searches PATHs during Windows shell call.&lt;br /&gt;
:7) Shell calls to Windows applications are no longer maximized.&lt;br /&gt;
:8) System calls -M -W -C -R now operate like their corresponding lower case flags.  This case sensitivity had been suppressed to allow passing the flags to DOS, but that made the rules too obscure.&lt;br /&gt;
:9) Concerning Unix shell calls, the following flag combinations are prevented-&lt;br /&gt;
:-W and -C&amp;lt;br&amp;gt;&lt;br /&gt;
:-R and -C&amp;lt;br&amp;gt;&lt;br /&gt;
:-W and -R&amp;lt;br&amp;gt;&lt;br /&gt;
:In other words Without Shell, Restore Screen, and Continue are mutually exclusive options.  If more than one is specified at a time, error [[2222]] is generated.&lt;br /&gt;
&lt;br /&gt;
For disambiguation purposes, also see [[System Parameter]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:Executive Commands]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=BRlistener.exe&amp;diff=11043</id>
		<title>BRlistener.exe</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=BRlistener.exe&amp;diff=11043"/>
		<updated>2019-01-18T17:23:38Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;BRListener.exe&#039;&#039;&#039; file is a [[32 bit]] C++ application which serves as the [[connection agent]] for the server side of [[Business Rules!]] [[Client Server]] installations.&lt;br /&gt;
&lt;br /&gt;
GENERAL: You must be logged in as [[Administrator]] in order to run Setup (BRListener.exe). (Or [[superuser]] for [[SCO]]) &lt;br /&gt;
&lt;br /&gt;
In order to run BRListener.exe, [[BRListener.conf]] must be properly configured.&lt;br /&gt;
&lt;br /&gt;
Copy BRListener.exe to the proper [[System32]] folder.&lt;br /&gt;
&lt;br /&gt;
If you have a BR Service running:&lt;br /&gt;
&lt;br /&gt;
# Stop the BR Service on the machine where you intend to install. If your previous installation was done using InstallShield, use &amp;quot;stop BR service&amp;quot; from the Programs/BR Service icon list. &lt;br /&gt;
# You can also stop the BR Service by going to start, run, and typing &amp;quot;install /release&amp;quot;. &lt;br /&gt;
# If your previous installation was done using InstallShield, you can remove it by using the Add/Remove Programs feature in the Control Panel. In this case, your [[BRConfig.sys]] and [[license file]] will not be removed. This is to make them available for subsequent use. &lt;br /&gt;
# When you run install, installation will modify your BRListener.conf file if your target directory is different from the one previously specified. &lt;br /&gt;
&lt;br /&gt;
*BRListener ([[4.13]]) was changed to allow multiple label statements. It works in conjunction with a new build of the Client ([[4.12c]]).&lt;br /&gt;
&lt;br /&gt;
The listeners recognize a qualifying prefix on [[brlistener.conf|CONF]] file statements. This supports having different listeners active at the same time. This permits testing in production client-server environments.&lt;br /&gt;
&lt;br /&gt;
 @release = 1.2        PORT=8555&lt;br /&gt;
 @release = 2.0        PORT=8557&lt;br /&gt;
 @release &amp;lt; 2.0 EXECUTABLE = /ads/sys/br.d/brserver&lt;br /&gt;
 @release &amp;gt;= 2.0 EXECUTABLE = /ads/sys/br.d/brserver.new&lt;br /&gt;
&lt;br /&gt;
The full syntax for the Windows brlistenerinstaller is:&lt;br /&gt;
&lt;br /&gt;
brlistenerinstaller [/RELEASE] [/ALTERNATE alternate] [brlistener-path]&lt;br /&gt;
 &lt;br /&gt;
[/RELEASE] removes this service.&lt;br /&gt;
[/ALTERNATE alternate] uses an alternate service name. This will result in a service named BR_Listener-(alternate).&lt;br /&gt;
&lt;br /&gt;
The second brlistener must be installed using the ALTERNATE keyword followed by a number. Under Linux this is handled by naming the listeners differently. &lt;br /&gt;
&lt;br /&gt;
Persistent Login – Brlistener Release 2.0 in MULTISESSION Mode&lt;br /&gt;
&lt;br /&gt;
A Client session ID is stored in the registry on the client side and associated with the user login name. This is maintained in memory by the BRlistener along with the user&#039;s login-name and password. The listener first checks the user&#039;s client session ID before prompting for login info.&lt;br /&gt;
&lt;br /&gt;
[BRclient] communicates with [BRlistener] over TCP encrypted by TLS.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Files]]&lt;br /&gt;
[[Category:Client Server]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=System_(command)&amp;diff=11029</id>
		<title>System (command)</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=System_(command)&amp;diff=11029"/>
		<updated>2018-11-01T15:50:30Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;System (SY)&#039;&#039;&#039; [[:Category:commands|command]] can do two things:&lt;br /&gt;
#Exit BR and return control to the [[operating system]], or &lt;br /&gt;
#Perform a &#039;&#039;&#039;shell call&#039;&#039;&#039; (an operating system command) while BR is active. &lt;br /&gt;
&lt;br /&gt;
System can be executed from [[READY mode]], from a [[procedure file]], or with the [[Execute]] [[statement]].&lt;br /&gt;
&lt;br /&gt;
==Using SYSTEM to exit BR==&lt;br /&gt;
&lt;br /&gt;
Entering SYSTEM or it&#039;s short form, SY into the command line while in ready mode will exit BR. The same can be done using an [[Execute]] Statement or a procedure file. &lt;br /&gt;
&lt;br /&gt;
[[image:Sy.jpg]]&lt;br /&gt;
[[image:System2.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Using SYSTEM to send commands to the operating system==&lt;br /&gt;
===Comments and Examples===&lt;br /&gt;
One use of the SYSTEM command is to run a program. In the following example, the SYSTEM command runs a program called BACKUP. By default, the first program waits until the other program has finished running, and then continues where it left off. The syntax includes the SYSTEM keyword and then the OS command, which in this case is the program name and location of the data to handle. &lt;br /&gt;
&lt;br /&gt;
 SYSTEM BACKUP C:\\*.DAT A: /S&lt;br /&gt;
&lt;br /&gt;
When the same command is used with an asterisks preceding the program name, BACKUP, the BR program restores its own screen upon re-entry:&lt;br /&gt;
&lt;br /&gt;
 SYSTEM *BACKUP C:\\*.DAT A: /S&lt;br /&gt;
&lt;br /&gt;
The statement below tests to see what type of operating system the program is running on, then executes the appropriate SYSTEM command for the operating system:&lt;br /&gt;
&lt;br /&gt;
 00100 IF FILE$(0)(1:3)=&amp;quot;CON:&amp;quot; THEN EXECUTE &amp;quot;SYSTEM DIR&amp;quot; :!ELSE EXECUTE &amp;quot;SYSTEM ls -al /usr/BR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Using Batch Files with System Exits===&lt;br /&gt;
&lt;br /&gt;
One use of the System command is to pass a return code to the host operating system as it permanently exits from BR. In the following example, a DOS [[batch file]] tests the return code ([[ERRORLEVEL]]) and performs a specific action according to its value.&lt;br /&gt;
&lt;br /&gt;
 BR PROC START&lt;br /&gt;
 IF ERRORLEVEL 101 GOTO BADERROR&lt;br /&gt;
 IF ERRORLEVEL 100 GOTO BACKUP&lt;br /&gt;
 IF ERRORLEVEL 99 GOTO FORMAT&lt;br /&gt;
 GOTO DONE&lt;br /&gt;
 :BACKUP&lt;br /&gt;
 BACKUPBR&lt;br /&gt;
 :FORMAT&lt;br /&gt;
 FORMAT A:&lt;br /&gt;
 BRSTART&lt;br /&gt;
 :BADERROR&lt;br /&gt;
 ECHO BAD ERROR RETURN CODE &amp;gt;100&lt;br /&gt;
 :DONE&lt;br /&gt;
&lt;br /&gt;
If the command SYSTEM 100 were used to exit from BR while the above batch file was active, DOS would start a back-up procedure as soon as the BR exit was complete.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
 SYSTEM [&amp;lt; code for OS&amp;gt;|[*]&amp;lt;OS command&amp;gt;]&lt;br /&gt;
[[Image:System.png]]&lt;br /&gt;
&lt;br /&gt;
==Defaults==&lt;br /&gt;
:1) Return control to the operating system with a return code of zero.&lt;br /&gt;
:2) Do not restore screen.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&#039;&#039;&#039;Code returned to OS&#039;&#039;&#039; parameter sets the value of the operating system return code which may be accessed using ERRORLEVEL in DOS batch files, and through the $? substitution in a Linux shell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OS command&#039;&#039;&#039; parameter is an operating system command which BR passes to the operating system for execution. If the result of the command requires no operator action, BR is immediately reentered after the command finishes execution. Since BR is active during the entire process, all variable values and memory remain the same. When the &#039;&#039;&#039;OS command&#039;&#039;&#039; parameter is preceded by an asterisk, the BR screen is restored upon re-entry. The &#039;&#039;&#039;OS command&#039;&#039;&#039; parameter must be a &#039;&#039;&#039;string variable&#039;&#039;&#039; or a string enclosed in quotes.&lt;br /&gt;
&lt;br /&gt;
Additional Flags that can alter the behavior of the shell call as follows:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-E or -e&#039;&#039;&#039;||&amp;quot;Errors&amp;quot; indicates that any Operating System errors returned from the shell should be reported (as error 4300). Otherwise shell call operating errors are ignored. Occasionally Windows returns error values for fairly nominal exceptions. So the -e is provided as an error return sensitivity level flag.  Further information can be obtained by querying SYSERR or SYSERR$&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-M or -m&#039;&#039;&#039;|| Run the program &amp;quot;minimized&amp;quot;.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||If a lower case m is specified, the process or program runs in a DOS command shell without displaying the DOS window, but with a corresponding icon on the task bar (effectively running the shelled process/program &amp;quot;minimized&amp;quot;) This is only applicable in Windows. It is ignored on all other systems.  If -m is omitted, the shelled program will open in a separate application window.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||If an upper case M is specified, the same thing happens except the task does not appear on the taskbar. It runs invisibly. Furthermore [[SPOOLCMD]] calls use lowercase m.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-s&#039;&#039;&#039;||Server Shell Call (this is the default for Unix). If -s is omitted on Windows, then this shell call is performed on the client.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-@&#039;&#039;&#039;||If using Client Server, then it runs the program on the  client. Client Shell Call is the default for Windows. If -@ is omitted, on Unix the shell call is performed on the server.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||(search path not implemented  on client)&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||Note- Ctrl-] ALWAYS performs a DOS shell call on the client.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-c&#039;&#039;&#039;||The main program &amp;quot;continues&amp;quot; to run while running the called one.  Windows launches the task and resumes BR operation where it left off. For Unix, the command is framed with NOHUP and &amp;amp;. If -c is omitted, then the shell call waits til the process is finished (up to the # seconds specified in SHELL LIMITS) before returning to BR.&lt;br /&gt;
&lt;br /&gt;
For [[OSX]] 10.6 you need&lt;br /&gt;
&lt;br /&gt;
sys -c | (pipe) Shell commands with a pipe make BR Continue after executing the sys -c (continue), if you do not insert the | pipe, then the script does not run under Br [[4.18]] and up.&lt;br /&gt;
This was found on a Macintosh client that just updated to OSX 10.6.x&lt;br /&gt;
&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-r&#039;&#039;&#039;||&amp;quot;Restore&amp;quot; means that Windows always performs shell in a separate window. (Unix ignores shell standard out data). If -r is omitted. then Unix forwards standard out and stdin data to and from the client window.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||Restores screen after running command on all systems.  In windows, the screen is always restored, so this flag is essentially ignored. This is the same as sys *command.  The newer syntax is more readable and preferred.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-w&#039;&#039;&#039;||(&amp;quot;without shell&amp;quot;) When a Windows application is called, use a -w flag to tell BR not to call COMMAND.COM, but to call the application directly.  It must be a program (i.e. &amp;quot;exe&amp;quot;) and not a script. The Search Path is used ON SERVER only (if no slashes). This option does NOT open a DOS window. It does not use Bourne shell. It enables unfiltered return values. A Timeout or Ctrl-A kills the process. If -w is omitted, then a timeout or Ctrl-A does NOT kill the process, which can leave orphans.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;| ||Note- Currently -w is ignored in Unix standard models.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;blank&#039;&#039;&#039;||Application standard output is forwarded to the client. However the Bourne shell is utilized to initiate the process. The shelled program CAN be an executable script.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-p&#039;&#039;&#039;||(&amp;quot;Page Standard Output&amp;quot;) - This option applies to Unix server only. If -p is omitted, then output goes to screen without pausing&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;60&amp;quot;|&#039;&#039;&#039;-t9999&#039;&#039;&#039;||Wait up to the specified number of seconds (for client server only). If -t is omitted, wait the number of seconds specified in the [[SHELL LIMIT]] statement (see [[BRConfig.sys]] chapter for more information on [[SHELL LIMIT]])&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Technical Considerations==&lt;br /&gt;
:1) Simultaneous pressing of the Ctrl key and the right- bracket (]) key has the same effect as the SYSTEM command&#039;s shell call, except that no command string is automatically executed upon access to the operating system. Pressing of these keys causes BR immediately access the operating system and display the system prompt. Between each operating system operation, a message about what action is required to return to BR will be displayed.&lt;br /&gt;
:2) Too frequent or careless use of the SYSTEM command can make it more difficult to move your program to a new operating system. ADS strongly recommends the use of the FILE$ function in programs and procedures which access the resident operating system. This function allows programs to test the type of operating system before proceeding with a system-dependent sequence of commands. While the FILE$ function can always be programmed in at a later date, you may be able to save a great deal of time and recoding by placing it in programs as they are written.&lt;br /&gt;
:3) When the system call (either Ctrl-] or the [[SYSTEM]] command) starts and then exits a secondary software program before returning to [[BR]], the [[CODE]] function will reflect any return code that the secondary program has passed to the operating system. As soon as BR is reactivated, the value of [[CODE]] can be tested to Verify whether or not the secondary program was successful. This is currently valid for Linux versions of [[BR]] only.&lt;br /&gt;
:4) [[BR]] passes all quotation marks within or surrounding the &amp;quot;string-expr&amp;quot; parameter back to the operating system.&lt;br /&gt;
:5) The screen may be cleared on some Linux terminals when the [[SYSTEM]] call is completed. If this is undesirable, see [[Terminal Considerations]] for a possible remedy.&lt;br /&gt;
:6) BR now searches PATHs during Windows shell call.&lt;br /&gt;
:7) Shell calls to Windows applications are no longer maximized.&lt;br /&gt;
:8) System calls -M -W -C -R now operate like their corresponding lower case flags.  This case sensitivity had been suppressed to allow passing the flags to DOS, but that made the rules too obscure.&lt;br /&gt;
:9) Concerning Unix shell calls, the following flag combinations are prevented-&lt;br /&gt;
:-W and -C&amp;lt;br&amp;gt;&lt;br /&gt;
:-R and -C&amp;lt;br&amp;gt;&lt;br /&gt;
:-W and -R&amp;lt;br&amp;gt;&lt;br /&gt;
:In other words Without Shell, Restore Screen, and Continue are mutually exclusive options.  If more than one is specified at a time, error [[2222]] is generated.&lt;br /&gt;
&lt;br /&gt;
For disambiguation purposes, also see [[System Parameter]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:Executive Commands]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Multi-Line_Textbox&amp;diff=11028</id>
		<title>Multi-Line Textbox</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Multi-Line_Textbox&amp;diff=11028"/>
		<updated>2018-10-20T18:30:43Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Multi-Line TextBoxes&#039;&#039;&#039; are accomplished in BR! by using an [[Input Fields]] [[statement]].  Here is a sample:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  00010   DIM Buff$*2048&lt;br /&gt;
  00012   LET Buff$=&#039;start with something&#039;&lt;br /&gt;
  00020   RINPUT FIELDS &#039;#0,5,2,text 14/58/20,[D]s&#039;: Buff$&lt;br /&gt;
&lt;br /&gt;
Syntax: Text [Rows]/[Columns]/[Max Char]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Widget]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Multi-Line_Textbox&amp;diff=11027</id>
		<title>Multi-Line Textbox</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Multi-Line_Textbox&amp;diff=11027"/>
		<updated>2018-10-20T18:30:28Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Multi-Line TextBoxes&#039;&#039;&#039; are accomplished in BR! by using an [[Input Fields]] [[statement]].  Here is a sample:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  00010   DIM Buff$*2048&lt;br /&gt;
  00012   LET Buff$=&#039;start with something&#039;&lt;br /&gt;
  00020   RINPUT FIELDS &#039;#0,5,2,text 14/58/20,[D]s&#039;: Buff$&lt;br /&gt;
&lt;br /&gt;
Syntax: Text [Rows]/[Columns]/[Max Charr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Widget]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Text&amp;diff=10952</id>
		<title>Text</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Text&amp;diff=10952"/>
		<updated>2018-07-09T17:06:39Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* TEXT FIELD FORMAT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  TEXT FIELD FORMAT==&lt;br /&gt;
As of 4.3&lt;br /&gt;
&lt;br /&gt;
 10  (R)INPUT FIELDS “row, col, TEXT rows/cols[/capacity],  leading-attr,  …”:&lt;br /&gt;
&lt;br /&gt;
This format is similar to the C/V/G format with the ^ENTER_LF attribute except:&lt;br /&gt;
No trailing space padding or trimming occurs.&lt;br /&gt;
&lt;br /&gt;
Rows and columns are specified.&lt;br /&gt;
Field capacity or newlines can cause a vertical scrollbar to appear.&lt;br /&gt;
&lt;br /&gt;
Supported leading attributes are ^ENTER_LF (the default), ^ENTER_CRLF and ^NOWRAP.&lt;br /&gt;
The TEXT keyword will imply ^ENTER_LF unless ^ENTER_CRLF is specified.&lt;br /&gt;
&lt;br /&gt;
^ENTER_LF (the default) causes the ENTER key to add LF characters to the data and to go to a new line left justified. The cursor will retrace the data when backspace or left-arrow is keyed, meaning the on-screen LF characters are represented by moving the cursor, instead of allowing it to rest on invisible LF characters.&lt;br /&gt;
&lt;br /&gt;
^ENTER_CRLF may be specified in lieu of ^ENTER_LF. When that is the case, carriage returns entered are represented in the data as carriage-return-linefeed (CRLF) character pairs.  ^NOWRAP may be specified to suppress word wrapping. When ^NOWRAP is active, data is entered on the current line until ENTER is keyed to go to the next line. Both horizontal and vertical scroll bars appear as needed.&lt;br /&gt;
&lt;br /&gt;
Tabs are entered into the text. Shift-tab is ignored.&lt;br /&gt;
&lt;br /&gt;
Home, End and the arrow keys all operate relative to the current line as opposed to operating on the text box as a whole.&lt;br /&gt;
&lt;br /&gt;
Depressing the Control key causes the following keys to operate in the normal string entry mode:&lt;br /&gt;
&lt;br /&gt;
*Enter – Returns control to the BR program&lt;br /&gt;
*Tab – Goes to the next control&lt;br /&gt;
*Shift-Tab – Goes to the prior control&lt;br /&gt;
*Home – Goes to the beginning of data or the first field&lt;br /&gt;
*End – Goes to the end of data or the last field&lt;br /&gt;
*Left-Arrow/Up-Arrow – Goes to the prior control&lt;br /&gt;
*Right-Arrow/Down-Arrow – Goes to the next control&lt;br /&gt;
* [[CurPos]] introduced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate TEXT entry is:&lt;br /&gt;
 01000 ! Rep Text&lt;br /&gt;
 01020 ! Test New Text Field Type&lt;br /&gt;
 01040    dim TEXT$*300, TEXT$(1)*80&lt;br /&gt;
 01060    print NEWPAGE&lt;br /&gt;
 01080    rinput fields &amp;quot;3,10,text 4/40/300,uh&amp;quot;: TEXT$&lt;br /&gt;
 01100    print fields &amp;quot;10,10,c&amp;quot;: TEXT$&lt;br /&gt;
 01120    print TEXT$&lt;br /&gt;
 01140    let STR2MAT(TEXT$, MAT TEXT$, CHR$(10))&lt;br /&gt;
 01160   print MAT TEXT$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Format Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Text&amp;diff=10951</id>
		<title>Text</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Text&amp;diff=10951"/>
		<updated>2018-07-09T17:05:07Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* TEXT FIELD FORMAT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  TEXT FIELD FORMAT==&lt;br /&gt;
As of 4.3&lt;br /&gt;
&lt;br /&gt;
 10  (R)INPUT FIELDS “row, col, TEXT rows/cols[/capacity],  leading-attr,  …”:&lt;br /&gt;
&lt;br /&gt;
This format is similar to the C/V/G format with the ^ENTER_LF attribute except:&lt;br /&gt;
No trailing space padding or trimming occurs.&lt;br /&gt;
&lt;br /&gt;
Rows and columns are specified.&lt;br /&gt;
Field capacity or newlines can cause a vertical scrollbar to appear.&lt;br /&gt;
&lt;br /&gt;
Supported leading attributes are ^ENTER_LF (the default), ^ENTER_CRLF and ^NOWRAP.&lt;br /&gt;
The TEXT keyword will imply ^ENTER_LF unless ^ENTER_CRLF is specified.&lt;br /&gt;
&lt;br /&gt;
^ENTER_LF (the default) causes the ENTER key to add LF characters to the data and to go to a new line left justified. The cursor will retrace the data when backspace or left-arrow is keyed, meaning the on-screen LF characters are represented by moving the cursor, instead of allowing it to rest on invisible LF characters.&lt;br /&gt;
&lt;br /&gt;
^ENTER_CRLF may be specified in lieu of ^ENTER_LF. When that is the case, carriage returns entered are represented in the data as carriage-return-linefeed (CRLF) character pairs.  ^NOWRAP may be specified to suppress word wrapping. When ^NOWRAP is active, data is entered on the current line until ENTER is keyed to go to the next line. Both horizontal and vertical scroll bars appear as needed.&lt;br /&gt;
&lt;br /&gt;
Tabs are entered into the text. Shift-tab is ignored.&lt;br /&gt;
&lt;br /&gt;
Home, End and the arrow keys all operate relative to the current line as opposed to operating on the text box as a whole.&lt;br /&gt;
&lt;br /&gt;
Depressing the Control key causes the following keys to operate in the normal string entry mode:&lt;br /&gt;
&lt;br /&gt;
*Enter – Returns control to the BR program&lt;br /&gt;
*Tab – Goes to the next control&lt;br /&gt;
*Shift-Tab – Goes to the prior control&lt;br /&gt;
*Home – Goes to the beginning of data or the first field&lt;br /&gt;
*End – Goes to the end of data or the last field&lt;br /&gt;
*Left-Arrow/Up-Arrow – Goes to the prior control&lt;br /&gt;
*Right-Arrow/Down-Arrow – Goes to the next control&lt;br /&gt;
* [[CurPos]] introduced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate TEXT entry is:&lt;br /&gt;
 01000 ! Rep Text&lt;br /&gt;
 01020 ! Test New Text Field Type&lt;br /&gt;
 01040    dim TEXT$*300, TEXT$(1)*80&lt;br /&gt;
 01060    print NEWPAGE&lt;br /&gt;
 01080    rinput fields &amp;quot;3,10,text 4/40/300,uh&amp;quot;: TEXT$&lt;br /&gt;
 01100    print fields &amp;quot;10,10,c&amp;quot;: TEXT$&lt;br /&gt;
 01120    print TEXT$&lt;br /&gt;
 01140    let STR2MAT(TEXT$, MAT TEXT$, CHR$(10))&lt;br /&gt;
 01160   print MAT TEXT$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Format Specifications]]&lt;br /&gt;
[[Category:Field Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Text&amp;diff=10950</id>
		<title>Text</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Text&amp;diff=10950"/>
		<updated>2018-07-09T17:04:02Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* TEXT FIELD FORMAT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  TEXT FIELD FORMAT==&lt;br /&gt;
As of 4.3&lt;br /&gt;
&lt;br /&gt;
 10  (R)INPUT FIELDS “row, col, TEXT rows/cols[/capacity],  leading-attr,  …”:&lt;br /&gt;
&lt;br /&gt;
This format is similar to the C/V/G format with the ^ENTER_LF attribute except:&lt;br /&gt;
No trailing space padding or trimming occurs.&lt;br /&gt;
&lt;br /&gt;
Rows and columns are specified.&lt;br /&gt;
Field capacity or newlines can cause a vertical scrollbar to appear.&lt;br /&gt;
&lt;br /&gt;
Supported leading attributes are ^ENTER_LF (the default), ^ENTER_CRLF and ^NOWRAP.&lt;br /&gt;
The TEXT keyword will imply ^ENTER_LF unless ^ENTER_CRLF is specified.&lt;br /&gt;
&lt;br /&gt;
^ENTER_LF (the default) causes the ENTER key to add LF characters to the data and to go to a new line left justified. The cursor will retrace the data when backspace or left-arrow is keyed, meaning the on-screen LF characters are represented by moving the cursor, instead of allowing it to rest on invisible LF characters.&lt;br /&gt;
&lt;br /&gt;
^ENTER_CRLF may be specified in lieu of ^ENTER_LF. When that is the case, carriage returns entered are represented in the data as carriage-return-linefeed (CRLF) character pairs.  ^NOWRAP may be specified to suppress word wrapping. When ^NOWRAP is active, data is entered on the current line until ENTER is keyed to go to the next line. Both horizontal and vertical scroll bars appear as needed.&lt;br /&gt;
&lt;br /&gt;
Tabs are entered into the text. Shift-tab is ignored.&lt;br /&gt;
&lt;br /&gt;
Home, End and the arrow keys all operate relative to the current line as opposed to operating on the text box as a whole.&lt;br /&gt;
&lt;br /&gt;
Depressing the Control key causes the following keys to operate in the normal string entry mode:&lt;br /&gt;
&lt;br /&gt;
*Enter – Returns control to the BR program&lt;br /&gt;
*Tab – Goes to the next control&lt;br /&gt;
*Shift-Tab – Goes to the prior control&lt;br /&gt;
*Home – Goes to the beginning of data or the first field&lt;br /&gt;
*End – Goes to the end of data or the last field&lt;br /&gt;
*Left-Arrow/Up-Arrow – Goes to the prior control&lt;br /&gt;
*Right-Arrow/Down-Arrow – Goes to the next control&lt;br /&gt;
* [[CurPos]] introduced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate TEXT entry is:&lt;br /&gt;
 01000 ! Rep Text&lt;br /&gt;
 01020 ! Test New Text Field Type&lt;br /&gt;
 01040    dim TEXT$*300, TEXT$(1)*80&lt;br /&gt;
 01060    print NEWPAGE&lt;br /&gt;
 01080    rinput fields &amp;quot;3,10,text 4/40/300,uh&amp;quot;: TEXT$&lt;br /&gt;
 01100    print fields &amp;quot;10,10,c&amp;quot;: TEXT$&lt;br /&gt;
 01120    print TEXT$&lt;br /&gt;
 01140    let STR2MAT(TEXT$, MAT TEXT$, CHR$(10))&lt;br /&gt;
 01160   print MAT TEXT$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Field Specifications]]&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Copy&amp;diff=10909</id>
		<title>Copy</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Copy&amp;diff=10909"/>
		<updated>2017-09-25T14:35:37Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Technical Considerations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Copy (COP)&#039;&#039;&#039; [[command]] copies one or more files in numerous ways:&lt;br /&gt;
# From one directory to another on the same or different disks.&lt;br /&gt;
# From one place on a directory to another place on the same directory. In this case you must give the resultant copy a different name.&lt;br /&gt;
# From a file to a printer.&lt;br /&gt;
# The -S option has been added to allow copying of a file which is currently open. The file to be copied must be opened for sharing ([[Shr]] or [[ShrI]]). If it is opened [[NoShr]], a file sharing violation error [[4148]] will occur when Copy with -S is attempted.&lt;br /&gt;
&lt;br /&gt;
==Comments and Examples==&lt;br /&gt;
&lt;br /&gt;
When using the copy command, you may specify a drive letter or number, and a path. You may also use [[wildcard characters]] &#039;&#039;&#039;?&#039;&#039;&#039; and &#039;&#039;&#039;*&#039;&#039;&#039; in place of alphanumeric characters in file names. [[Redirection symbols]] &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039; and &#039;&#039;&#039;&amp;gt;&amp;gt;&#039;&#039;&#039; redirect screen output to a printer, a file, or another device.&lt;br /&gt;
&lt;br /&gt;
The following command copies the file SAMPLE from the default directory of a disk in drive A to the default directory of a disk in drive B. The file name remains the same:&lt;br /&gt;
&lt;br /&gt;
 COPY A:SAMPLE B:&lt;br /&gt;
&lt;br /&gt;
The next command copies the file SAMPLE from the subdirectory \TEST1 on a disk in drive A to the subdirectory \TEST2 on the same disk. If TEST2 does not exist as a subdirectory, Business Rules names the file TEST2 and places it in the default directory on the default drive:&lt;br /&gt;
&lt;br /&gt;
 COPY A:\TEST1\SAMPLE A:\TEST2&lt;br /&gt;
&lt;br /&gt;
The following command copies SAMPLE from one place in the subdirectory \TEST1 on a disk in drive A to another place in the same subdirectory. The copied file is renamed SAMPLE1:&lt;br /&gt;
&lt;br /&gt;
 COPY A:\TEST1\SAMPLE A:\TEST1\SAMPLE1&lt;br /&gt;
&lt;br /&gt;
The next command copies the file SAMPLE from the default directory of a disk in drive B to a printer attached to the first parallel port:&lt;br /&gt;
&lt;br /&gt;
 COPY B:SAMPLE PRN:&lt;br /&gt;
&lt;br /&gt;
The same file can be copied to the printer at the first serial port with the following command:&lt;br /&gt;
&lt;br /&gt;
 COPY B:SAMPLE AUX:&lt;br /&gt;
&lt;br /&gt;
The next command copies all files with names starting with SAMPLE, a period and any extension from a disk in drive A to a disk in drive B. The &#039;&#039;&#039;D&#039;&#039;&#039; in the command causes deleted records to be removed from any of the SAMPLE files which are internal files. The &#039;&#039;&#039;C&#039;&#039;&#039; in the command causes Business Rules! to prompt for a diskette change if the disk in drive B fills up before the copying process is completed.&lt;br /&gt;
&lt;br /&gt;
 COPY A:SAMPLE.* B: -DC&lt;br /&gt;
&lt;br /&gt;
The following example copies the internal file SAMPLE from a disk in drive A to a disk in drive B, setting the record length of the new file at 128:&lt;br /&gt;
&lt;br /&gt;
 COPY A:SAMPLE B: -128&lt;br /&gt;
&lt;br /&gt;
As of 4.2, COPY supports copying a print file unaltered to a printer:&lt;br /&gt;
 COPY PRT\EDITLIST.255  DIRECT:/HP4&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
 COPY &amp;lt;from file&amp;gt; {[AUX:]|[PRN:]|[&amp;lt;to file&amp;gt;]} {[&amp;gt;[&amp;gt;]&amp;lt;output file&amp;gt;]|[PRINT]} [&amp;lt;[[copy option|-option]]&amp;gt;][-...]&lt;br /&gt;
&lt;br /&gt;
[[Image:Copy.png]]&lt;br /&gt;
&lt;br /&gt;
==Defaults==&lt;br /&gt;
# Copy the file, using the current file name, into the current directory on the current drive.&lt;br /&gt;
# Display a log of all performed actions in the [[command console]].&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&lt;br /&gt;
Copy requires the &#039;&#039;&#039;from file&#039;&#039;&#039; parameter, which provides the information necessary for identifying the file or files you wish to copy.&lt;br /&gt;
&lt;br /&gt;
After the &#039;&#039;&#039;from file&#039;&#039;&#039;, you may specify the optional parameter &#039;&#039;&#039;to file&#039;&#039;&#039;, which is the name (and path, if required) of the file you are creating.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PRN:&#039;&#039;&#039; allows you to copy the file indicated in the &#039;&#039;&#039;from file&#039;&#039;&#039; to the printer attached to the first parallel port on DOS systems. This string must be translated with the [[SUBSTITUTE]] specification in [[BRConfig.sys]] to specify the appropriate output device on [[Linux]] systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AUX:&#039;&#039;&#039; copies the &#039;&#039;&#039;from file&#039;&#039;&#039; file to the printer attached to the first [[serial port]]. This string must be translated with the SUBSTITUTE specification for Business Rules! Linux versions.&lt;br /&gt;
&lt;br /&gt;
In place of the &#039;&#039;&#039;PRN:&#039;&#039;&#039; or &#039;&#039;&#039;AUX:&#039;&#039;&#039; parameters, you may also specify COM1:, COM2:, LPT1:, LPT2:, etc. to indicate the port to which your printer is attached (see the drive discussion in the Definitions chapter for more information). These device references will operate properly only on Business Rules DOS versions. They may be mapped to new references with the BRConfig.sys file&#039;s SUBSTITUTE specification.&lt;br /&gt;
&lt;br /&gt;
The redirection symbol in the &#039;&#039;&#039;&amp;gt;file-ref&#039;&#039;&#039; parameter saves messages that normally appear on the screen to the specified file. The &#039;&#039;&#039;PRINT&#039;&#039;&#039; parameter sends these same messages to the printer rather than to the screen or a file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option&#039;&#039;&#039; may be one or more of several optional parameters. Such option(s) can follow the copy command when separated from the rest of the command with a dash:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-A&#039;&#039;&#039;||tells the system to copy only files that have the archive bit on. The system turns the archive bits in the original files off when the copying process is complete. This option applies to Business Rules! [[DOS]] versions only.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-C&#039;&#039;&#039;||prompts for a diskette change if the disk is full.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-D&#039;&#039;&#039;||omits deleted records from the copy, but responds only when used with internal files. It is important to rebuild all related index files after using this option.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-N&#039;&#039;&#039;||prevents the screen from showing a log of performed actions.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-P&#039;&#039;&#039;||causes scrolling to pause after a full screen of information has been displayed. (Press &amp;lt;CR&amp;gt; for next screen.)&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-S&#039;&#039;&#039;||option has been added to allow copying of a file which is currently open. The file to be copied must be opened for sharing (SHR or SHRI) if it is opened NOSHR, error [[4148]] (file sharing violation) will occur when COPY with the -S is attempted.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-V&#039;&#039;&#039;||requires the operator to Verify each action before Business Rules! performs it.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-#&#039;&#039;&#039;||represents output file record length. Internal file record lengths are shortened or expanded (with blanks) to match the number you indicate (version [[2.04]]+). When specified with other options, the record length must always be last.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Technical Considerations==&lt;br /&gt;
Prior to version [[3.0]] the -S switch meant preserve space.  That syntax is no longer supported. -s now refers to file sharing as noted above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
COPY to a printer :DEVICE was being rejected. COPY to a PRN: or WIN: device is still illegal. (Use TYPE with redirection for PRN: and WIN:)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the [Source] Directory is very flexible supporting *, *.* &amp;amp; *.*.* to include &amp;quot;All Files&amp;quot;, the [Destination] Directory is less flexibe.    &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
 Copy Source\* Destination&lt;br /&gt;
* This sample will copy all files to Destination - This is the preferred syntax for copy&lt;br /&gt;
&lt;br /&gt;
 Copy Source\* Destination\*&lt;br /&gt;
* This sample will copy all files to Destination but will Remove any Extension so &amp;quot;Sample.wb&amp;quot; will become &amp;quot;Sample&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Copy Source\* Destination\*.*&lt;br /&gt;
* This sample will copy all files to Destination but complex files like &amp;quot;Sample.wb.brs&amp;quot; will become &amp;quot;Sample.wb&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Copy Source\* Destination\*.*.*&lt;br /&gt;
* This sample will copy all files to Destination complex files like &amp;quot;Sample.wb.brs&amp;quot; will become &amp;quot;Sample.wb.brs&amp;quot;  - Files with more &amp;quot;.&amp;quot; would also be truncated.&lt;br /&gt;
&lt;br /&gt;
==Client Server==&lt;br /&gt;
&lt;br /&gt;
 COPY    filename      @:filename      (@ indicates Client system)&lt;br /&gt;
&lt;br /&gt;
Copies filename TO client current directory&lt;br /&gt;
&lt;br /&gt;
(Or specify @:pathname relative to client current directory.)&lt;br /&gt;
&lt;br /&gt;
 COPY      @:filename      filename&lt;br /&gt;
&lt;br /&gt;
Copies filename FROM client current directory.&lt;br /&gt;
&lt;br /&gt;
If you are trying to use [[absolute paths]] on the [[client]], specify @::&lt;br /&gt;
&lt;br /&gt;
This is really most useful with [[OPEN:]] and [[SAVE:]] file selection browsers.&lt;br /&gt;
&lt;br /&gt;
Use caution when using absolute paths on the client because [[permissions]] and [[file systems]] can be different from one computer to another.&lt;br /&gt;
&lt;br /&gt;
Normally BR will use the [[startup directory]] to copy things and you can change this in the shortcut if needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:File Management Commands]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Copy&amp;diff=10908</id>
		<title>Copy</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Copy&amp;diff=10908"/>
		<updated>2017-09-25T14:34:44Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Technical Considerations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Copy (COP)&#039;&#039;&#039; [[command]] copies one or more files in numerous ways:&lt;br /&gt;
# From one directory to another on the same or different disks.&lt;br /&gt;
# From one place on a directory to another place on the same directory. In this case you must give the resultant copy a different name.&lt;br /&gt;
# From a file to a printer.&lt;br /&gt;
# The -S option has been added to allow copying of a file which is currently open. The file to be copied must be opened for sharing ([[Shr]] or [[ShrI]]). If it is opened [[NoShr]], a file sharing violation error [[4148]] will occur when Copy with -S is attempted.&lt;br /&gt;
&lt;br /&gt;
==Comments and Examples==&lt;br /&gt;
&lt;br /&gt;
When using the copy command, you may specify a drive letter or number, and a path. You may also use [[wildcard characters]] &#039;&#039;&#039;?&#039;&#039;&#039; and &#039;&#039;&#039;*&#039;&#039;&#039; in place of alphanumeric characters in file names. [[Redirection symbols]] &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039; and &#039;&#039;&#039;&amp;gt;&amp;gt;&#039;&#039;&#039; redirect screen output to a printer, a file, or another device.&lt;br /&gt;
&lt;br /&gt;
The following command copies the file SAMPLE from the default directory of a disk in drive A to the default directory of a disk in drive B. The file name remains the same:&lt;br /&gt;
&lt;br /&gt;
 COPY A:SAMPLE B:&lt;br /&gt;
&lt;br /&gt;
The next command copies the file SAMPLE from the subdirectory \TEST1 on a disk in drive A to the subdirectory \TEST2 on the same disk. If TEST2 does not exist as a subdirectory, Business Rules names the file TEST2 and places it in the default directory on the default drive:&lt;br /&gt;
&lt;br /&gt;
 COPY A:\TEST1\SAMPLE A:\TEST2&lt;br /&gt;
&lt;br /&gt;
The following command copies SAMPLE from one place in the subdirectory \TEST1 on a disk in drive A to another place in the same subdirectory. The copied file is renamed SAMPLE1:&lt;br /&gt;
&lt;br /&gt;
 COPY A:\TEST1\SAMPLE A:\TEST1\SAMPLE1&lt;br /&gt;
&lt;br /&gt;
The next command copies the file SAMPLE from the default directory of a disk in drive B to a printer attached to the first parallel port:&lt;br /&gt;
&lt;br /&gt;
 COPY B:SAMPLE PRN:&lt;br /&gt;
&lt;br /&gt;
The same file can be copied to the printer at the first serial port with the following command:&lt;br /&gt;
&lt;br /&gt;
 COPY B:SAMPLE AUX:&lt;br /&gt;
&lt;br /&gt;
The next command copies all files with names starting with SAMPLE, a period and any extension from a disk in drive A to a disk in drive B. The &#039;&#039;&#039;D&#039;&#039;&#039; in the command causes deleted records to be removed from any of the SAMPLE files which are internal files. The &#039;&#039;&#039;C&#039;&#039;&#039; in the command causes Business Rules! to prompt for a diskette change if the disk in drive B fills up before the copying process is completed.&lt;br /&gt;
&lt;br /&gt;
 COPY A:SAMPLE.* B: -DC&lt;br /&gt;
&lt;br /&gt;
The following example copies the internal file SAMPLE from a disk in drive A to a disk in drive B, setting the record length of the new file at 128:&lt;br /&gt;
&lt;br /&gt;
 COPY A:SAMPLE B: -128&lt;br /&gt;
&lt;br /&gt;
As of 4.2, COPY supports copying a print file unaltered to a printer:&lt;br /&gt;
 COPY PRT\EDITLIST.255  DIRECT:/HP4&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
 COPY &amp;lt;from file&amp;gt; {[AUX:]|[PRN:]|[&amp;lt;to file&amp;gt;]} {[&amp;gt;[&amp;gt;]&amp;lt;output file&amp;gt;]|[PRINT]} [&amp;lt;[[copy option|-option]]&amp;gt;][-...]&lt;br /&gt;
&lt;br /&gt;
[[Image:Copy.png]]&lt;br /&gt;
&lt;br /&gt;
==Defaults==&lt;br /&gt;
# Copy the file, using the current file name, into the current directory on the current drive.&lt;br /&gt;
# Display a log of all performed actions in the [[command console]].&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&lt;br /&gt;
Copy requires the &#039;&#039;&#039;from file&#039;&#039;&#039; parameter, which provides the information necessary for identifying the file or files you wish to copy.&lt;br /&gt;
&lt;br /&gt;
After the &#039;&#039;&#039;from file&#039;&#039;&#039;, you may specify the optional parameter &#039;&#039;&#039;to file&#039;&#039;&#039;, which is the name (and path, if required) of the file you are creating.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PRN:&#039;&#039;&#039; allows you to copy the file indicated in the &#039;&#039;&#039;from file&#039;&#039;&#039; to the printer attached to the first parallel port on DOS systems. This string must be translated with the [[SUBSTITUTE]] specification in [[BRConfig.sys]] to specify the appropriate output device on [[Linux]] systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AUX:&#039;&#039;&#039; copies the &#039;&#039;&#039;from file&#039;&#039;&#039; file to the printer attached to the first [[serial port]]. This string must be translated with the SUBSTITUTE specification for Business Rules! Linux versions.&lt;br /&gt;
&lt;br /&gt;
In place of the &#039;&#039;&#039;PRN:&#039;&#039;&#039; or &#039;&#039;&#039;AUX:&#039;&#039;&#039; parameters, you may also specify COM1:, COM2:, LPT1:, LPT2:, etc. to indicate the port to which your printer is attached (see the drive discussion in the Definitions chapter for more information). These device references will operate properly only on Business Rules DOS versions. They may be mapped to new references with the BRConfig.sys file&#039;s SUBSTITUTE specification.&lt;br /&gt;
&lt;br /&gt;
The redirection symbol in the &#039;&#039;&#039;&amp;gt;file-ref&#039;&#039;&#039; parameter saves messages that normally appear on the screen to the specified file. The &#039;&#039;&#039;PRINT&#039;&#039;&#039; parameter sends these same messages to the printer rather than to the screen or a file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option&#039;&#039;&#039; may be one or more of several optional parameters. Such option(s) can follow the copy command when separated from the rest of the command with a dash:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-A&#039;&#039;&#039;||tells the system to copy only files that have the archive bit on. The system turns the archive bits in the original files off when the copying process is complete. This option applies to Business Rules! [[DOS]] versions only.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-C&#039;&#039;&#039;||prompts for a diskette change if the disk is full.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-D&#039;&#039;&#039;||omits deleted records from the copy, but responds only when used with internal files. It is important to rebuild all related index files after using this option.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-N&#039;&#039;&#039;||prevents the screen from showing a log of performed actions.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-P&#039;&#039;&#039;||causes scrolling to pause after a full screen of information has been displayed. (Press &amp;lt;CR&amp;gt; for next screen.)&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-S&#039;&#039;&#039;||option has been added to allow copying of a file which is currently open. The file to be copied must be opened for sharing (SHR or SHRI) if it is opened NOSHR, error [[4148]] (file sharing violation) will occur when COPY with the -S is attempted.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-V&#039;&#039;&#039;||requires the operator to Verify each action before Business Rules! performs it.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;10%&amp;quot;|&#039;&#039;&#039;-#&#039;&#039;&#039;||represents output file record length. Internal file record lengths are shortened or expanded (with blanks) to match the number you indicate (version [[2.04]]+). When specified with other options, the record length must always be last.&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Technical Considerations==&lt;br /&gt;
Prior to version [[3.0]] the -S switch meant preserve space.  That syntax is no longer supported. -s now refers to file sharing as noted above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
COPY to a printer :DEVICE was being rejected. COPY to a PRN: or WIN: device is still illegal. (Use TYPE with redirection for PRN: and WIN:)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While the [Source] Directory is very flexible supporting *, *.* &amp;amp; *.*.* to include &amp;quot;All Files&amp;quot;, the [Destination] Directory is less flexibe.    &lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
Copy Source\* Destination&lt;br /&gt;
* This sample will copy all files to Destination - This is the preferred syntax for copy&lt;br /&gt;
&lt;br /&gt;
Copy Source\* Destination\*&lt;br /&gt;
* This sample will copy all files to Destination but will Remove any Extension so &amp;quot;Sample.wb&amp;quot; will become &amp;quot;Sample&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Copy Source\* Destination\*.*&lt;br /&gt;
* This sample will copy all files to Destination but complex files like &amp;quot;Sample.wb.brs&amp;quot; will become &amp;quot;Sample.wb&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Copy Source\* Destination\*.*.*&lt;br /&gt;
* This sample will copy all files to Destination complex files like &amp;quot;Sample.wb.brs&amp;quot; will become &amp;quot;Sample.wb.brs&amp;quot;  - Files with more &amp;quot;.&amp;quot; would also be truncated.&lt;br /&gt;
&lt;br /&gt;
==Client Server==&lt;br /&gt;
&lt;br /&gt;
 COPY    filename      @:filename      (@ indicates Client system)&lt;br /&gt;
&lt;br /&gt;
Copies filename TO client current directory&lt;br /&gt;
&lt;br /&gt;
(Or specify @:pathname relative to client current directory.)&lt;br /&gt;
&lt;br /&gt;
 COPY      @:filename      filename&lt;br /&gt;
&lt;br /&gt;
Copies filename FROM client current directory.&lt;br /&gt;
&lt;br /&gt;
If you are trying to use [[absolute paths]] on the [[client]], specify @::&lt;br /&gt;
&lt;br /&gt;
This is really most useful with [[OPEN:]] and [[SAVE:]] file selection browsers.&lt;br /&gt;
&lt;br /&gt;
Use caution when using absolute paths on the client because [[permissions]] and [[file systems]] can be different from one computer to another.&lt;br /&gt;
&lt;br /&gt;
Normally BR will use the [[startup directory]] to copy things and you can change this in the shortcut if needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:File Management Commands]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=TRANSLATE&amp;diff=10892</id>
		<title>TRANSLATE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=TRANSLATE&amp;diff=10892"/>
		<updated>2017-06-25T18:33:15Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Sample program to create a &amp;quot;Translate&amp;quot; file.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; TRANSLATE=&amp;lt;file ref&amp;gt;&lt;br /&gt;
The &amp;quot;TRANSLATE=file-ref&amp;quot; parameter indicates that character translation is required for all input or output of C, V, G, N, ZD or PIC strings. The file-ref must identify either a 256- or 512-byte file. The first 256 bytes are used as an input translation table. &lt;br /&gt;
&lt;br /&gt;
This optional parameter allows the translation of data to or from another collating sequence. Internally, all computers represent letters of the alphabet, punctuation marks and even digits according to an arbitrary numbering scheme. Today, the common coding schemes is ASCII (American Standard Code for Information Interchange). In the past, EBCDIC (Extended Binary Coded Decimal Interchange Code) was used, especially for main frames. Probably the most common use of the TRANSLATE= capability is translating files between ASCII and EBCDIC.&lt;br /&gt;
&lt;br /&gt;
An example of the difference between ASCII and EBCDIC is that the uppercase letters A, B and C are represented by 65, 66 and 67 respectively in ASCII; but in EBCDIC, they are 193, 194 and 195. Also, in ASCII, the blank or space character is represented by the number 32 while in EBCDIC it is number 64. Although all systems that currently run Business Rules the ASCII coding scheme, some older computer systems use EBCDIC.&lt;br /&gt;
&lt;br /&gt;
Used in [[Open]] statements: [[Open Display|Display]], [[Open Internal|Internal]], [[Open external|external]], and [[Open communications|communications]].&lt;br /&gt;
&lt;br /&gt;
The translate table is made up of 256 characters starting with the replacement value for CHR$(0), and ending with CHR$(255).  &lt;br /&gt;
&lt;br /&gt;
See also the [[XLATE$]] internal function.&lt;br /&gt;
&lt;br /&gt;
Sample Programs to create &amp;quot;TRANSLATE&amp;quot; tables:&lt;br /&gt;
* This program created a TRANSLATE table that will only allow &amp;quot;Common Characters&amp;quot;, and filter out unwanted symbols.   Tihs is commonly used when importing data from Electronic Data files.&lt;br /&gt;
&lt;br /&gt;
 00100   DIM Tbl$*512,Edi_Xlate$*512&lt;br /&gt;
 00110   LET Edi_Xlate$ = Rpt$(&amp;quot; &amp;quot;, 32)&amp;amp;&amp;quot; !&amp;quot;&amp;amp;Chr$(34)&amp;amp;&amp;quot;#$%&amp;amp;&#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~*&amp;quot;&amp;amp;Rpt$(&amp;quot; &amp;quot;, 128)&lt;br /&gt;
 00120   LET Edi_Xlate$(11:11)=Chr$(10) : LET Edi_Xlate$(14:14)=Chr$(13)&lt;br /&gt;
 00130   LET Tbl$=Edi_Xlate$&amp;amp;Edi_Xlate$&lt;br /&gt;
 00140   OPEN #1: &amp;quot;NAME=EDI_XLATE,RECL=512,replace&amp;quot;,EXTERNAL,OUTPUT&lt;br /&gt;
 00150   WRITE #1,USING 160: Tbl$&lt;br /&gt;
 00160   FORM Pos 1,C 512&lt;br /&gt;
 00170   CLOSE #1:&lt;br /&gt;
 00180   END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:All Parameters]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=TimeOut&amp;diff=10834</id>
		<title>TimeOut</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=TimeOut&amp;diff=10834"/>
		<updated>2017-01-26T14:54:59Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The TIMEOUT error trap can be used with the WAIT parameter The WAIT= parameter on INPUT/RINPUT statements will trigger an error based on the [WAIT] settings. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Terminology]]&lt;br /&gt;
[[Category:Error Conditions]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.31&amp;diff=10833</id>
		<title>4.31</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.31&amp;diff=10833"/>
		<updated>2017-01-26T14:49:15Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Version 431ga */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Release Notes 4.31h&lt;br /&gt;
&lt;br /&gt;
The prior versions were [[4.1]] and [[4.2]] and [[4.30]].&lt;br /&gt;
&lt;br /&gt;
As Of 06/30/2015&lt;br /&gt;
&lt;br /&gt;
===Version 430+zmf===&lt;br /&gt;
Added final keepalive send before turning off the copy_sort_index_sys_cmd flag.&amp;lt;br&amp;gt;&lt;br /&gt;
Revised SSL shutdown wait loop.&amp;lt;br&amp;gt;&lt;br /&gt;
Set SSL shutdown start time (this was causing a reconnect timeout because it wasn&#039;t set).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Changed close listener wait from 5 seconds down to 2 seconds.&lt;br /&gt;
&lt;br /&gt;
===Version 431===&lt;br /&gt;
Made connection status global.&amp;lt;br&amp;gt;&lt;br /&gt;
Prevented sending KB char to server when reconnecting.&amp;lt;br&amp;gt;&lt;br /&gt;
Level 14 logging of client-server messages (debug version only).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 431a===&lt;br /&gt;
Error [[413]] message (window not on top) clarified.&amp;lt;br&amp;gt;&lt;br /&gt;
Suppressed logging in checkSSL until CS version match established.&amp;lt;br&amp;gt;&lt;br /&gt;
Polished up source terms and spelling errors - no object affect.&amp;lt;br&amp;gt;&lt;br /&gt;
Revised order of Menu Display responses to brserver.&amp;lt;br&amp;gt;&lt;br /&gt;
Allowed BR MSG() keyboard function to work when Command Console is the active window.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 431b===&lt;br /&gt;
Corrected exit pre-processing for both normal and unattended modes.&amp;lt;br&amp;gt;&lt;br /&gt;
Changed &amp;quot;blank&amp;quot; references to &amp;quot;blanksPtr&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Completely revised UNATTENDED_INPUT_CALL processing.&amp;lt;br&amp;gt;&lt;br /&gt;
Changed HTTP &amp;quot;Client-Inquiry&amp;quot; to &amp;quot;PAGE-URL&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
Added HTTP support for &amp;quot;PAGE-HEADER&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Revised error messages that pertain to system errors to indicate as much.&amp;lt;br&amp;gt;&lt;br /&gt;
Added some DLL errors to the BRERR$ definitions file. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added support for getting cookies via http. &amp;lt;br&amp;gt;&lt;br /&gt;
Cleaned up some errors causing dumps during termination.&amp;lt;br&amp;gt;&lt;br /&gt;
Switched log information to message boxes for errors that occur while uploading the client DLL.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Revised SYSTEM LOGOFF to not fail to zero session IDs when issued to BRSERVER. &lt;br /&gt;
This is to fix the problem where Windows reports active sessions where there is none, causing WSID&#039;s to be assigned incorrectly.&lt;br /&gt;
&lt;br /&gt;
===br4.31ce===&lt;br /&gt;
Fixed the problem where NOWAIT was being ignored if OPTION 38 was on.&lt;br /&gt;
&lt;br /&gt;
===Version 431d===&lt;br /&gt;
Removed DUPLICATE FLOWSTACK code.&amp;lt;br&amp;gt;&lt;br /&gt;
Revised ENDRUN processing of libraries .. set currentFileChain and currentScreenChain values during library PCB detachment. This fixed a problem detaching a NOFILES library.&amp;lt;br&amp;gt;&lt;br /&gt;
Lots of changes to run.cpp for flowstack processing and readability.&lt;br /&gt;
&lt;br /&gt;
Changes from prior editions:&amp;lt;br&amp;gt;&lt;br /&gt;
*SQL and SYSERR fixes.&lt;br /&gt;
*Suppress error 867 on a radio button.&lt;br /&gt;
*Don&#039;t show LABELS, and BUTTONS in STATUS command when GUI is off.&lt;br /&gt;
*Removed an error trying to close an already closed window. &lt;br /&gt;
&lt;br /&gt;
===Version 431d===&lt;br /&gt;
Removed DUPLICATE FLOWSTACK code.&amp;lt;br&amp;gt;&lt;br /&gt;
Revised ENDRUN processing of libraries .. set currentFileChain and CurrentScreenChain values during library PCB detachment. This fixed a problem detaching a NOFILES library.&amp;lt;br&amp;gt;&lt;br /&gt;
Lots of changes to run.cpp for flowstack processing and readability.&lt;br /&gt;
&lt;br /&gt;
Changes from prior editions:&lt;br /&gt;
*SQL and SYSERR fixes.&lt;br /&gt;
*Suppress error 867 on a radio button.&lt;br /&gt;
*Don&#039;t show LABELS, and BUTTONS in STATUS command when GUI is off.&lt;br /&gt;
*Removed an error trying to close an already closed window. &lt;br /&gt;
&lt;br /&gt;
Mismatched packets are ignored when:&lt;br /&gt;
*Ignore failure or keyboard return or we&#039;re terminating.&lt;br /&gt;
*Ignore failure is now on for cleanupNormalExits and closeWindowZero.&lt;br /&gt;
*When a flow stack error occurs, BR now returns error 9003.&lt;br /&gt;
*Current program name is stored on the client in a global when the status line is updated.&lt;br /&gt;
&lt;br /&gt;
Corrected processing mismatched packets for CALL_FUNCTION_NULL_ACTION.&amp;lt;br&amp;gt;&lt;br /&gt;
Added transfer of current line number to client.&lt;br /&gt;
&lt;br /&gt;
===Version 431e===&lt;br /&gt;
Revised remote.cpp ignoring of unmatched packets.&amp;lt;br&amp;gt;&lt;br /&gt;
Polished up the transfer of program name and line number to the client.&amp;lt;br&amp;gt;&lt;br /&gt;
Renamed clientOnly to ignoreFailureClientOnly&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added error [[0738]] - SELECT should be a trailing attribute.&amp;lt;br&amp;gt;&lt;br /&gt;
This error occurs when SELECT is used as a leading attribute without the ^.&lt;br /&gt;
&lt;br /&gt;
===Version 431f===&lt;br /&gt;
Added path to log message referencing brCrashDumpUploader.&amp;lt;br&amp;gt;&lt;br /&gt;
Added support for DEBUG INTERNAL COREDUMP_SERVER.&amp;lt;br&amp;gt;&lt;br /&gt;
Now we pass currentUserLineNumber to client in all models.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 431fb===&lt;br /&gt;
If an invalid trailing attribute is allowed via OPTION 38 BR was occasionally dumping.&amp;lt;br&amp;gt;&lt;br /&gt;
Keepalive timeouts are prevented when sitting in a message box.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 431fc===&lt;br /&gt;
Created and applied MINOR_IO_ERROR (valued at 3). This relates to log levels.&lt;br /&gt;
&lt;br /&gt;
===Version 431fe===&lt;br /&gt;
Ignore mismatched packets on menu display.&amp;lt;br&amp;gt;&lt;br /&gt;
Suppress timeout during MSGBOX call.&amp;lt;br&amp;gt;&lt;br /&gt;
Fix 2D control header font colors.&amp;lt;br&amp;gt;&lt;br /&gt;
Removed V42 references.&amp;lt;br&amp;gt;&lt;br /&gt;
Fixed a problem re loading library modules RELEASE.&amp;lt;br&amp;gt; &lt;br /&gt;
Corrected logging before DLL loaded.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 431ff===&lt;br /&gt;
Revised PIC processing.&lt;br /&gt;
&lt;br /&gt;
===Version 431fg===&lt;br /&gt;
Revised PIC, and DATE processing to test formatted field capacity when inserting characters. (FMT runs only in overtype mode so it isn&#039;t affected.)&amp;lt;br&amp;gt;&lt;br /&gt;
Statusline ROWCOL now defaults to off.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 4.31g===&lt;br /&gt;
Upgrade to VS 2010.&amp;lt;br&amp;gt;&lt;br /&gt;
Fixed problem with license verification only to first decimal point of version number.&amp;lt;br&amp;gt;&lt;br /&gt;
Change made to prevent looping during shutdown.&amp;lt;br&amp;gt;&lt;br /&gt;
Client changed to let the server determine whether or not to terminate.&amp;lt;br&amp;gt;&lt;br /&gt;
Graceful client shutdown. See build notes for details.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 431ga===&lt;br /&gt;
Removed UPGRADE code flag from source.&amp;lt;br&amp;gt;&lt;br /&gt;
Fixed date problem that was created by recent FMT and PIC revisions.&amp;lt;br&amp;gt;&lt;br /&gt;
KREC is updated during printing only when the PUSH level is zero.&amp;lt;br&amp;gt;&lt;br /&gt;
For HTTP client, the log data showing CURL information was extended.&amp;lt;br&amp;gt;&lt;br /&gt;
The HTTP client now does a GET if no printing occurs prior to a LINPUT.&amp;lt;br&amp;gt;&lt;br /&gt;
A display parameter was added to the fldedit function. This function is used &lt;br /&gt;
by FMT, PIC DATE and other field types to see if typing is done in excess of field capacity.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 4.31gc===&lt;br /&gt;
More detail is provided when a database connection attempt is unsuccessful.&amp;lt;br&amp;gt;&lt;br /&gt;
Corrected failures pertaining to deleting characters in non-currency PIC masks, especially with backspace. &amp;lt;br&amp;gt;&lt;br /&gt;
ENV$ and STATUS ENV search strings are now enhanced. See the wiki for details.&lt;br /&gt;
Internal documentation updated.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Version 4.31h===&lt;br /&gt;
Removed references to abort. Used CANCEL instead.&amp;lt;br&amp;gt;&lt;br /&gt;
Error 370 was dropping the program file during a REPLACE where OPTION 60 was on and the program contained 4.2+ statements. This is fixed.&amp;lt;br&amp;gt;&lt;br /&gt;
The XLATE system function was extended to support translation to and from UTF-8. &amp;lt;br&amp;gt;&lt;br /&gt;
Added error 438 &amp;quot;Input String not valid UTF-8 format.&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Removed system functions UPSI, LINEBUFFER, XPOS, CFIELDS$, and CHYRON$.&amp;lt;br&amp;gt;&lt;br /&gt;
Days(date(&amp;quot;H:M:S&amp;quot;),&amp;quot;H:M:S&amp;quot;) was producing a date with the first day of the current month. This was changed to the current day.&amp;lt;br&amp;gt;&lt;br /&gt;
RINPUT was positioning the cursor according to the previous Input. This was fixed.&amp;lt;br&amp;gt;&lt;br /&gt;
The Web Server support now does not tamper with binary data. It was converting to UTF-8.&amp;lt;br&amp;gt;&lt;br /&gt;
An internal pointer was adjusted to prevent crashes when the stack overflows.&amp;lt;br&amp;gt;&lt;br /&gt;
Default stack sizes were revised.&lt;br /&gt;
 work_size = 500000,    /* work stack size */&lt;br /&gt;
 flow_size = 100,       /* flow stack size */&lt;br /&gt;
 rpn_size = 1000,       /* rpn stack size */&lt;br /&gt;
 for_size = 100;        /* for-next stack */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Release 4.3]]&lt;br /&gt;
[[Category:Release Notes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=4340&amp;diff=10832</id>
		<title>4340</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=4340&amp;diff=10832"/>
		<updated>2017-01-26T14:48:30Z</updated>

		<summary type="html">&lt;p&gt;GomezL: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Error&lt;br /&gt;
|4340&lt;br /&gt;
|([[4.2]]+) An HTTP error has occurred / ([[4.16]]-) Novell error 140&lt;br /&gt;
|In BR! version [[4.20]], This error code was re-introduced to be used in conjunction with the [[SysErr]] and [[SysErr$]]. It indicates that an error occurred in the underlying operating system. Reference SysErr$ for a description of the actual error. &lt;br /&gt;
&lt;br /&gt;
As of BR! version 4.16 This Novell error no longer exists.  &lt;br /&gt;
&lt;br /&gt;
|Use the SysErr &amp;amp; Syserr$ to troubleshoot the errors.   The HTTP interface in Business Rules uses the CURL library, and these errors should be documented in the Curl Site.&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Error Codes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DATABASE&amp;diff=10826</id>
		<title>DATABASE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DATABASE&amp;diff=10826"/>
		<updated>2017-01-23T20:20:23Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* ODBC-MANAGER */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 4.3 and higher [[CONFIG]] DATABASE may use one of 3 methods for connecting to SQL Sources:&lt;br /&gt;
*DSN&lt;br /&gt;
*CONNECTSTRING&lt;br /&gt;
*ODBC-MANAGER&lt;br /&gt;
&lt;br /&gt;
===DSN===&lt;br /&gt;
Syntax:&lt;br /&gt;
 CONFIG DATABASE &amp;lt;db-ref&amp;gt;  DSN=&amp;lt;dsn-ref&amp;gt;  [, USER= &amp;lt;department&amp;gt; | LOGIN_NAME | ? ] [, {PASSWORD= &amp;lt;dept-password&amp;gt; | BR_PASSWORD | ? } | PASSWORD=&amp;lt;encrypted-password&amp;gt; ]&lt;br /&gt;
The ? indicates prompt&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
 EXECUTE &#039;CONFIG DATABASE CLS_Data DSN=&amp;quot;MyData&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
===CONNECTSTRING (DSN Less)===&lt;br /&gt;
Syntax:&lt;br /&gt;
 CONFIG DATABASE &amp;lt;db-ref&amp;gt;  CONNECTSTRING=&amp;quot;&amp;lt;Driver&amp;gt;={Microsoft Access Driver (*.mdb)} DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sample Connection Strings:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Using a SQL Server /w SQL Login:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;SERVER=server;Initial Catalog=database;UID=username;PWD=password&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;db-ref&amp;quot; is the database reference.&lt;br /&gt;
&amp;quot;server&amp;quot; is the SQL Server [FQDN] or IP Address&lt;br /&gt;
&amp;quot;database&amp;quot; is the [SQL Server Database] &lt;br /&gt;
&amp;quot;username&amp;quot; is the [SQL Server User Name]&lt;br /&gt;
&amp;quot;password&amp;quot; is the [SQL Server Password]&lt;br /&gt;
&lt;br /&gt;
Using a SQL Server /w Windows Authentication:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;Initial Catalog=database;Persist Security Info=True;MultipleBC_TableResultSets=True; Database=database;SERVER=server;Login Name=username;Password=BR_PASSWORD&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;db-ref&amp;quot; is the database reference.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;server&amp;quot; is the SQL Server [FQDN] or IP Address&lt;br /&gt;
&lt;br /&gt;
&amp;quot;database&amp;quot; is the [SQL Server Database] &lt;br /&gt;
&lt;br /&gt;
&amp;quot;username&amp;quot; is the [SQL Server User Name]&lt;br /&gt;
&lt;br /&gt;
BR_PASSWORD will use the users Active Directory password to connect to the SQL Server.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;SQL Server&amp;quot; is one of several choices for SQL Server, another choice would be SQL Server Native Client 11.0&lt;br /&gt;
&lt;br /&gt;
===ODBC-MANAGER===&lt;br /&gt;
Syntax:&lt;br /&gt;
 CONFIG DATABASE &amp;lt;db-ref&amp;gt; ODBC-MANAGER&lt;br /&gt;
&lt;br /&gt;
Using ODBC Manager as the parameter will allow the end user to select the desired data source.&lt;br /&gt;
&lt;br /&gt;
The following is a sample program that will use the ODBC-MANAGER to identify the proper connection string.&lt;br /&gt;
* Note: This will not work in Client Server&lt;br /&gt;
&lt;br /&gt;
 00010   PRINT Newpage&lt;br /&gt;
 00011   IF Env$(&amp;quot;br_model&amp;quot;)=&amp;quot;CLIENT_SERVER&amp;quot; THEN PRINT &amp;quot;Warning, you cannot connect to ODBC-MANAGER in Client Server Mode&amp;quot;&lt;br /&gt;
 00020   EXECUTE &amp;quot;Config Database Test_DB ODBC-MANAGER&amp;quot; ERROR CONNECT_ERROR&lt;br /&gt;
 00030   PRINT &amp;quot;Connection String is:&amp;quot; !:&lt;br /&gt;
        PRINT Env$(&amp;quot;STATUS.DATABASE.[TEST_DB].CONNECTSTRING&amp;quot;)&lt;br /&gt;
 00099   STOP &lt;br /&gt;
 00100 CONNECT_ERROR: ! &lt;br /&gt;
 00110   PRINT &amp;quot;Error Connecting - Err:&amp;quot;;Err;&amp;quot; Line:&amp;quot;;Line;&amp;quot; Syserr:&amp;quot;;Syserr$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:All Parameters]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=DATABASE&amp;diff=10825</id>
		<title>DATABASE</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=DATABASE&amp;diff=10825"/>
		<updated>2017-01-23T20:19:25Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* ODBC-MANAGER */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In version 4.3 and higher [[CONFIG]] DATABASE may use one of 3 methods for connecting to SQL Sources:&lt;br /&gt;
*DSN&lt;br /&gt;
*CONNECTSTRING&lt;br /&gt;
*ODBC-MANAGER&lt;br /&gt;
&lt;br /&gt;
===DSN===&lt;br /&gt;
Syntax:&lt;br /&gt;
 CONFIG DATABASE &amp;lt;db-ref&amp;gt;  DSN=&amp;lt;dsn-ref&amp;gt;  [, USER= &amp;lt;department&amp;gt; | LOGIN_NAME | ? ] [, {PASSWORD= &amp;lt;dept-password&amp;gt; | BR_PASSWORD | ? } | PASSWORD=&amp;lt;encrypted-password&amp;gt; ]&lt;br /&gt;
The ? indicates prompt&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
 EXECUTE &#039;CONFIG DATABASE CLS_Data DSN=&amp;quot;MyData&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
===CONNECTSTRING (DSN Less)===&lt;br /&gt;
Syntax:&lt;br /&gt;
 CONFIG DATABASE &amp;lt;db-ref&amp;gt;  CONNECTSTRING=&amp;quot;&amp;lt;Driver&amp;gt;={Microsoft Access Driver (*.mdb)} DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sample Connection Strings:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Using a SQL Server /w SQL Login:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;SERVER=server;Initial Catalog=database;UID=username;PWD=password&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;db-ref&amp;quot; is the database reference.&lt;br /&gt;
&amp;quot;server&amp;quot; is the SQL Server [FQDN] or IP Address&lt;br /&gt;
&amp;quot;database&amp;quot; is the [SQL Server Database] &lt;br /&gt;
&amp;quot;username&amp;quot; is the [SQL Server User Name]&lt;br /&gt;
&amp;quot;password&amp;quot; is the [SQL Server Password]&lt;br /&gt;
&lt;br /&gt;
Using a SQL Server /w Windows Authentication:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;Initial Catalog=database;Persist Security Info=True;MultipleBC_TableResultSets=True; Database=database;SERVER=server;Login Name=username;Password=BR_PASSWORD&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;db-ref&amp;quot; is the database reference.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;server&amp;quot; is the SQL Server [FQDN] or IP Address&lt;br /&gt;
&lt;br /&gt;
&amp;quot;database&amp;quot; is the [SQL Server Database] &lt;br /&gt;
&lt;br /&gt;
&amp;quot;username&amp;quot; is the [SQL Server User Name]&lt;br /&gt;
&lt;br /&gt;
BR_PASSWORD will use the users Active Directory password to connect to the SQL Server.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;SQL Server&amp;quot; is one of several choices for SQL Server, another choice would be SQL Server Native Client 11.0&lt;br /&gt;
&lt;br /&gt;
===ODBC-MANAGER===&lt;br /&gt;
Syntax:&lt;br /&gt;
 CONFIG DATABASE &amp;lt;db-ref&amp;gt; ODBC-MANAGER&lt;br /&gt;
&lt;br /&gt;
Using ODBC Manager as the parameter will allow the end user to select the desired data source.&lt;br /&gt;
&lt;br /&gt;
The following is a sample program that will use the ODBC-MANAGER to identify the proper connection string.&lt;br /&gt;
* Note: This will not work in Client Server *&lt;br /&gt;
&lt;br /&gt;
00010   PRINT Newpage&lt;br /&gt;
00011   IF Env$(&amp;quot;br_model&amp;quot;)=&amp;quot;CLIENT_SERVER&amp;quot; THEN PRINT &amp;quot;Warning, you cannot connect to ODBC-MANAGER in Client Server Mode&amp;quot;&lt;br /&gt;
00020   EXECUTE &amp;quot;config database Test_DB ODBC-MANAGER&amp;quot; ERROR CONNECT_ERROR&lt;br /&gt;
00030   PRINT &amp;quot;Connection String is:&amp;quot; !:&lt;br /&gt;
        PRINT Env$(&amp;quot;STATUS.DATABASE.[TEST_DB].CONNECTSTRING&amp;quot;)&lt;br /&gt;
00099   STOP &lt;br /&gt;
00100 CONNECT_ERROR: ! &lt;br /&gt;
00110   PRINT &amp;quot;Error Connecting - Err:&amp;quot;;Err;&amp;quot; Line:&amp;quot;;Line;&amp;quot; Syserr:&amp;quot;;Syserr$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:All Parameters]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Encryption&amp;diff=10824</id>
		<title>Encryption</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Encryption&amp;diff=10824"/>
		<updated>2017-01-19T01:33:42Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Asymmetric Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(As of 4.30)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Encryption&#039;&#039;&#039; encompasses a number of different operations.  These operations can be used independently or in combination to meet different needs.  We use industry standard encryption available through OpenSSL.  Three technologies are widely used for encrypting data. BR supports the first two listed below through its [[ENCRYPT]] and [[DECRYPT]] [[internal functions]]. &lt;br /&gt;
&lt;br /&gt;
==Overview of Two Encryption Methods==&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;Symmetric key ciphers&#039;&#039;&#039; – where the same key is used to encrypt and decrypt data. You can specify a key to encrypt some data and later use the same key to decrypt the data.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Hashing routines&#039;&#039;&#039; – one way routines that take data and convert it to a hash value.  Sometimes these are thought of as checksums such as MD5 sum.  Hash values are always the same length regardless of how big the hashed data is.  A 10 gb file will have a hash result that is the same length as a 200 byte file. Hashing routines have a number of specific uses, including:&lt;br /&gt;
*Verify that data has not changed.&lt;br /&gt;
*Verifying that two files are the same.&lt;br /&gt;
*Validating passwords – this is based on the concept that if two values have the same hash value the values are equal.  Using this technique improves security because it allows a server to store passwords in an unrecoverable format.  Even the server software is unable to regenerate the original password.  It is only capable of checking if the hash of a password matches the stored password hash.&lt;br /&gt;
&lt;br /&gt;
==Symmetric Key Ciphers==&lt;br /&gt;
There are two encryption functions in the BR language, [[ENCRYPT$]] and [[DECRYPT$]].&lt;br /&gt;
&lt;br /&gt;
 ENCRYPT$(Data$ [,Key$ [,Encryption-type$ [,Initialization-vector$]]])&lt;br /&gt;
 DECRYPT$(Data$ [,Key$ [,Encryption-type$ [,Initialization-vector$]]])&lt;br /&gt;
&lt;br /&gt;
Data$ - The data to be encrypted&lt;br /&gt;
&lt;br /&gt;
Key$ - The secret key to be used for encryption.  If not specified this value will come from an OPTION 66 statement.&lt;br /&gt;
&lt;br /&gt;
Encryption-type$ - The type of encryption to be done.  If not specified, a common high strength encryption type will be employed.  This is described in more detail below, but is generally only useful for interfacing with other typically non-BR programs.&lt;br /&gt;
&lt;br /&gt;
Initialization-vector$ - This is an arcane part of encryption standards. It exists to prevent attackers from being able to tell whether the unencrypted data has changed. This is described in more detail below, but is general only needed when interfacing with other non-BR programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interfacing With Other Programs (encryption type and initialization vector)==&lt;br /&gt;
There are a number of different types of encryption that BR supports through OpenSSL:  AES, BLOWFISH, DES, triple DES, RC4 and RC2.  Most symmetric key ciphers are block ciphers meaning that they encrypt one block at a time. This means if you have a bit message, it is broken up into multiple blocks and each block is encrypted. The block size can be set as (128, 192, 256) bits. Some encryption types don&#039;t support all of these values so STATUS ENCRYPTION should be checked to see what encryption types are available in BR. Besides block size, there are also various schemes for blocking data. One might expect that using 256 bit blocking would simply take every 32 bytes and call it a block.  This is not done though because there is a possibility that this would cause patterns in the encrypted data. To prevent this, there are various schemes known as codebooks which change the way data is blocked. Wikipedia explains this in more detail. If the encryption type is not specified AES:256:CBC:128 will be used. To be compatible with other programs the entire encryption type must be specified (cipher: key length: codebook: initialization vector length).&lt;br /&gt;
&lt;br /&gt;
Initialization-vector – this is used to cause the same data encrypted with the same key to have a different encrypted result. This is significant because otherwise an attacker looking at data seeing the same encrypted result twice would know that the key and the unencrypted data have not changed. Regardless of whether or not you are concerned about this potential security issue, the standard encryption methods require this value so interfacing with other programs may require you to use it. It is a common practice to use a random number for this value and store the value at the beginning of (ahead of) the encrypted result. This is what BR does if this parameter is omitted.&lt;br /&gt;
&lt;br /&gt;
As an example:&lt;br /&gt;
 ENCRYPT$(“test”,“key”) &lt;br /&gt;
Produces a string containing “random number initialization vector”&amp;amp;”encrypted result”.&lt;br /&gt;
&lt;br /&gt;
If the initialization vector is explicitly specified as in:&lt;br /&gt;
ENCRYPT$(“test”,“key”,“AES:256:CBC:128”,“RANDOM”) &lt;br /&gt;
the result would be simply “encrypted result”.&lt;br /&gt;
&lt;br /&gt;
DECRYPT$ has the same arguments as ENCRYPT$ with the exception of the first parameter which is the encrypted data. DECRYPT$ expects to be used with the same key$, encryption-type$, and initialization-vector$ as was used to encrypt the data.  As with ENCRYPT$, if key$ is not specified, the value from the OPTION statement will be used. If encryption-type$ is not specified, “AES:256:CBC:128” will be used. If the initialization vector is not specified, it will be assumed that the encrypted data starts with an initialization vector.&lt;br /&gt;
&lt;br /&gt;
==Hashing Routines==&lt;br /&gt;
Three common forms of hashing are allowed in BR. They are MD5, SHA, and SHA-1. These are also provided through the ENCRYPT$ function specifying a null key$ value:&lt;br /&gt;
&lt;br /&gt;
 ENCRYPT$(data$, “”, “MD5”) ENCRYPT$(data$, “”, “SHA”) ENCRYPT$(data$, “”, “SHA-1”)&lt;br /&gt;
&lt;br /&gt;
Hashing is also referred to as Message Digests or digests. This is what the MD in MD5 means. There is no way to restore data that has been hashed. Hashing is a one way function so DECRYPT$ will yield an error.&lt;br /&gt;
&lt;br /&gt;
==Asymmetric Encryption==&lt;br /&gt;
Asymmetric key encryption is also known as public/private key encryption.&lt;br /&gt;
&lt;br /&gt;
Public/private keys are created as a pair by a key generator.  They are a pair, and it is not possible to have two public keys for the same private key or vice versa. With regard to public/private key pairs, what one key encrypts the other key can decrypt, and neither key can decrypt what it has encrypted.  When a private key is used to encrypt data, the result is called a signature because everyone who has the public key can decrypt it.&lt;br /&gt;
&lt;br /&gt;
This technique is used for:&lt;br /&gt;
&lt;br /&gt;
Signing (using certificates) – A private key can be used to sign data. The result of such signing can be tested/validated with the corresponding public key.&lt;br /&gt;
&lt;br /&gt;
Data encryption – A public key can be used to encrypt data. This data can then only be decrypted by the corresponding private key.&lt;br /&gt;
&lt;br /&gt;
Hashes and signing are different but used together.  Rather than signing a large block of data which would create a large signature, only the hash is signed to create much smaller fixed length signature data.  When verifying a large block of signed data, the data is used to create a hash value and the hash value is compared to a decrypted signature.&lt;br /&gt;
&lt;br /&gt;
Asymmetric encryption is not accessible through the BR ENCRYPT$, DECRYPT$ functions. However, it is used by our SSL client server connections and HTTPS. Certificates are most commonly used by SSL and HTTPS and are less useful for other application processes. &lt;br /&gt;
&lt;br /&gt;
In the Client Server model the client knows the server’s public key and the server uses its private key to encrypt and decrypt.  BRclient.exe connects to BRListener.exe by opening an SSL socket on the server using DHE_RSA-AES256-SHA Encryption. Handshaking is performed using a private key stored on the server within BRListener. Once authenticated, the socket is then passed to BRServer.exe for actual data processing.&lt;br /&gt;
&lt;br /&gt;
Encryption is invoked by Business Rules HTTP support as follows:&lt;br /&gt;
&lt;br /&gt;
 CONFIG HTTPS PORT port-number   [ LOG file-pathname ]&lt;br /&gt;
 CONFIG OPTION  66   private-key-file-encryption-password&lt;br /&gt;
 OPEN #400: “HTTP=SERVER”, DISPLAY, OUTIN&lt;br /&gt;
&lt;br /&gt;
The BRSERVER executable directory must contain two files:&lt;br /&gt;
&lt;br /&gt;
 https-private.pem&lt;br /&gt;
 https-cert.pem&lt;br /&gt;
&lt;br /&gt;
These files are made by the following commands under Linux, MAC and cygwin for Windows: openssl req -new -x509 -out httpserver.pem -days 10000&lt;br /&gt;
&lt;br /&gt;
(this will prompt for the OPTION 66 password)&lt;br /&gt;
&lt;br /&gt;
 mv privkey.pem   https-private.pem&lt;br /&gt;
 mv httpserver.pem   https-cert.pem&lt;br /&gt;
&lt;br /&gt;
This port specific service can then be accessed with browsers. When the specified port is accessed through a browser, BR establishes an HTTPS connection rather than an HTTP connection.&lt;br /&gt;
&lt;br /&gt;
==Signing and Certificate Processing Industry Standards==&lt;br /&gt;
The purpose of certificates is to verify the authenticity of unencrypted data. &lt;br /&gt;
&lt;br /&gt;
Certain companies are authorized by the government to act as a Certificate Authority (CA). These companies (e.g. Verisign) issue electronic certificates which can be used to issue second level certificates. Certificates can have expiration dates and the line of authority extends from a CA to any number of levels (but a chain is only as strong as its weakest link). Certificates contain a list of signatures (described below) that trace back to a CA as follows: &lt;br /&gt;
&lt;br /&gt;
When a company needs to obtain a certificate from a CA, it prepares its own certificate and sends it to the CA for signature. Creating a certificate requires the pre-production of a private and public key pair. The certificate text properly identifies the signing authority, the owner of the certificate, and the owner’s public key. The signing authority externally verifies the identity of the owner before signing it.  The CA provides the signature and the CA’s own public key for validating it. &lt;br /&gt;
&lt;br /&gt;
Browsers know the CA identities and their public keys. A browser can verify a CA signed cert by hashing it, decrypting the signature with the known public key and matching the decrypted signature against the hash total. &lt;br /&gt;
 &lt;br /&gt;
Any company that is issued a (self-prepared authority signed) certificate by a CA can sign second level certificates issued to third parties. A second level cert contains the parent (CA issued) certificate, and includes the public keys of the issuer and the recipient. The signature is essentially the encrypted hash total of ‘itself plus all of its ancestors’. Additional levels each contain the chain of certificates leading from a CA issued cert to itself. By including public keys along with the identities of the owners, certificates become tools for validating the signatures of their owners. When signed data (with an encrypted hash total) is sent to clients the signatures insure that the data has not been altered along the way. &lt;br /&gt;
&lt;br /&gt;
Ostensibly, a certificate cannot be counterfeited because it requires the signature of its parent which can only be produced with its parent’s private key.  By providing both public keys ( signer and recipient ) in all certs along with signatures, a non-forgeable or alterable chain is established. &lt;br /&gt;
&lt;br /&gt;
====Example:====&lt;br /&gt;
CA public key – known to browser&lt;br /&gt;
certificate 1 (signed by CA – contains owner’s public key)&lt;br /&gt;
certificate 2 (signed by second level - includes certificate 1 - contains owner’s public key)&lt;br /&gt;
final certificate (signed by third level - includes certificate 2 - contains owner’s public key)&lt;br /&gt;
 &lt;br /&gt;
A browser would find the CA information in the certificate and check to see if it is in the browser’s internal list. If not, it fails. Then it verifies that certificate 1 (which ends up being part of the final certificate) has been signed by the CA. After that it checks certificate 2 and verifies that it has been signed by the owner of certificate 1. Finally it checks the final certificate and verifies that it has been signed by the owner of certificate 2.&lt;br /&gt;
&lt;br /&gt;
To assure the line authority of any certificate, the public keys are associated with signers, not with documents. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Definitions]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=SQL&amp;diff=10823</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=SQL&amp;diff=10823"/>
		<updated>2017-01-16T19:40:10Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* SQL Date Format Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SQL manages data via a relational data management system. As of 4.3, BR includes several special ways of working together with SQL.&lt;br /&gt;
&lt;br /&gt;
====CONFIG DATABASE db-ref ODBC-MANAGER====&lt;br /&gt;
CONFIG [[DATABASE]] db-ref ODBC-MANAGER will invoke the ODBC Manager to define or identify a file DSN. Once this is done you can issue the command [[STATUS]] DATABASE –P to see the connect string that the ODBC Manager used to make the connection. Thereafter you can use that connect string to establish the connection to the database as follows:&lt;br /&gt;
&lt;br /&gt;
 CONFIG DATABASE db-ref  CONNECTSTRING=&amp;quot;Driver={Microsoft Access Driver (*.mdb)}DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
            - or -&lt;br /&gt;
 CONFIG DATABASE db-ref  DSN=’dsn-ref ‘ &lt;br /&gt;
&lt;br /&gt;
;Additional Optional Parameters:&lt;br /&gt;
&lt;br /&gt;
 [, USER= department | LOGIN_NAME | ? ]&lt;br /&gt;
 [, {PASSWORD= dept-password | PASSWORDD=encrypted-passwd  | BR_PASSWORD | ? ]&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;&#039;?&#039;&#039;&#039; indicates prompt and &#039;&#039;&#039;BR_PASSWORD&#039;&#039;&#039; indicates the password used during client login. If running the standard model (not client-server) then this is equivalent to &amp;quot;?&amp;quot;. &#039;&#039;&#039;encrypted-passwd&#039;&#039;&#039; is the DB password encrypted with the key stated in OPTION 66.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CONFIG DATABASE  MAX_COLUMN_WIDTH   nnnn&#039;&#039;&#039;&lt;br /&gt;
Some database column types are variable length. SQL requires advanced buffer allocation. This would unnecessarily tax the system if not restricted. This statement sets a maximum width for all columns. Memory is allocated to the minimum of (this amount or the column width). &amp;quot;nnnn&amp;quot; is the maximum column width. The default is 2000 characters.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;CONFIG DATABASE CLEAR   { db-ref | ALL }&#039;&#039;&#039;&lt;br /&gt;
This will close the specified database or all open databases.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sample Connection Strings:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Using a SQL Server /w SQL Login:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;SERVER=server;Initial Catalog=database;UID=username;PWD=password&amp;quot;&lt;br /&gt;
 db-ref is the database reference.&lt;br /&gt;
 server is the SQL Server [FQDN] or IP Address&lt;br /&gt;
 database is the [SQL Server Database] &lt;br /&gt;
 username is the [SQL Server User Name]&lt;br /&gt;
 password is the [SQL Server Password]&lt;br /&gt;
&lt;br /&gt;
 Using a SQL Server /w Windows Authentication:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;Initial Catalog=database;Persist Security Info=True;MultipleBC_TableResultSets=True; Database=database;SERVER=server;Login Name=username;Password=BR_PASSWORD&amp;quot;&lt;br /&gt;
 db-ref is the database reference.&lt;br /&gt;
 server is the SQL Server [FQDN] or IP Address&lt;br /&gt;
 database is the [SQL Server Database] &lt;br /&gt;
 username is the [SQL Server User Name]&lt;br /&gt;
 Note that BR_PASSWORD will use the users Active Directory password to connect to the SQL Server.&lt;br /&gt;
 Note that &amp;quot;SQL Server&amp;quot; is one of several choices for SQL Server, another choice would be SQL Server Native Client 11.0&lt;br /&gt;
&lt;br /&gt;
====OPEN statements====&lt;br /&gt;
&lt;br /&gt;
 OPEN #20: &amp;quot;DATABASE= db-ref&amp;quot;, SQL &amp;quot;sql-statement&amp;quot;, OUTIN&lt;br /&gt;
              - or -&lt;br /&gt;
 OPEN #20: &amp;quot;DATABASE= db-ref, Name= filename&amp;quot; , SQL, OUTIN&lt;br /&gt;
Where filename refers to a DISPLAY file containing a SQL statement that gets executed when a WRITE statement is processed.&lt;br /&gt;
&lt;br /&gt;
Example: &lt;br /&gt;
 OPEN #20: &amp;quot;DATABASE=MyData&amp;quot;,SQL &amp;quot;SELECT FILENO,BALANCE from MASTER WHERE FILENO=?&amp;quot;,OUTIN&lt;br /&gt;
&lt;br /&gt;
====Sequence of Operations====&lt;br /&gt;
#Begin processing with a WRITE statement.&lt;br /&gt;
#If the WRITE contains an IO list of values then it is used to populate the SQL before it is executed. In this process IO list values replace question marks positionally from left to right. These question marks only work with SQL arguments that refer to stored data. Question marks cannot be specified where SQL keywords or table column names appear. &lt;br /&gt;
#Resulting SQL may or may not produce a result set. If it does, the result set may be processed like a BR file opened RELATIVE. Some operations that use file positioning may be slow since the whole result set may not be in memory immediately. Simple sequential access should be fairly quick.&lt;br /&gt;
#Once SQL has been populated by an IOlist, it may be reused with the same values by issuing a WRITE with no IOlist.&lt;br /&gt;
#READ IOlist variable associations are positional with each READ accessing one row of values.&lt;br /&gt;
&lt;br /&gt;
===SQL Date Format Functions===&lt;br /&gt;
&lt;br /&gt;
 A$=SQL_DATE$(BR-date-string,&amp;quot;format-mask&amp;quot;)   ! format date for storage&lt;br /&gt;
 B$=BR_DATE$(SQL-date-string,&amp;quot;format-mask&amp;quot;)   ! unpack DB date value&lt;br /&gt;
&lt;br /&gt;
* Note: SQL DATETIME fields are &amp;quot;Packed for Storage&amp;quot;, but &amp;quot;DATE&amp;quot; fields are returned as a CCYY-MM-DD string in a SQL Query.  DATE returns &amp;quot;BLANK&amp;quot; for &amp;quot;Empty or Null Date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===SQL Table Interrogation===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ENV$(STATUS)&#039;&#039;&#039; has been extended to interrogate database connections and ODBC data sources. A program called ENVDB.BRS (listed below) has been written to demonstrate how this extension works and to show how to setup linkage to a database or ODBC data source. Run the program as is to bring up the Microsoft ODBC manager. Then select a data source and look at the output from the program. This will also show you how to get and use connect strings. In this example lines 1900 and 2000 accomplish the same open as line 1800 in my environment. &lt;br /&gt;
&lt;br /&gt;
Try it on your Windows workstation. As long as you have one or more ODBC drivers supported you can use it without having to install a database. You can even use it to interrogate Excel files because Microsoft provides an ODBC driver for that. &lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate database interrogation entry is:&lt;br /&gt;
 01000 ! Replace Envdb&lt;br /&gt;
 01100    dim DATABASES$(1)*100&lt;br /&gt;
 01200    dim DATABASE$*100&lt;br /&gt;
 01300    dim TABLES$(1)*100&lt;br /&gt;
 01400    dim TABLE$*100&lt;br /&gt;
 01500    dim COLUMNS$(1)*100&lt;br /&gt;
 01600    dim COLUMN$*100&lt;br /&gt;
 01700    dim C$*100,FLD1$*40,FLD2$*40,FLD3$*40,FLD4$*40&lt;br /&gt;
 01800    Execute &amp;quot;CONFIG database testdb odbc-manager&amp;quot;&lt;br /&gt;
 01900 !   Execute &amp;quot;CONFIG database testdb DSN=&#039;Accounts Payable&#039;&amp;quot;&lt;br /&gt;
 02000 !   Execute &amp;quot;CONFIG database testdb connectstring=&amp;quot;&amp;quot;DSN=Excel Files;DBQ=L:\orders\Beneficial PORCEL.xls;DefaultDir=L:\orders;DriverId=1046;MaxBufferSize=2048&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 02100    open #1: &amp;quot;name=envdb.txt,replace&amp;quot;,display,output &lt;br /&gt;
 02200 Dump_Table: ! ***** Dump Table Layout&lt;br /&gt;
 02300    let OUTFD = 1&lt;br /&gt;
 02400    let ENV$(&amp;quot;status.database.LIST&amp;quot;, MAT DATABASES$)  !List of db&#039;s&lt;br /&gt;
 02500    for DATABASE=1 to UDIM(DATABASES$)  !For each connected database&lt;br /&gt;
 02600       let DATABASE$=DATABASES$(DATABASE)&lt;br /&gt;
 02700       let FNSHOW_DATABASE(DATABASE$, &amp;quot;status.database.&amp;quot;&amp;amp;DATABASE$)&lt;br /&gt;
 02800    next DATABASE&lt;br /&gt;
 02900    end &lt;br /&gt;
 03000 ! &lt;br /&gt;
 03100    def FNSHOW_DATABASE(DATABASE$*100, ST_PREFIX$*100)&lt;br /&gt;
 03200       print #OUTFD: DATABASE$&lt;br /&gt;
 03300       let OUT_PREFIX$=CHR$(9)&lt;br /&gt;
 03400       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;DSN=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DSN&amp;quot;)&lt;br /&gt;
 03500       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;CONNECTSTRING=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.CONNECTSTRING&amp;quot;)&lt;br /&gt;
 03600       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Tables:&amp;quot;&lt;br /&gt;
 03700       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.TABLES&amp;quot;&lt;br /&gt;
 03800       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT TABLES$)&lt;br /&gt;
 03900       for TABLE = 1 to UDIM(MAT TABLES$)&lt;br /&gt;
 04000          let TABLE$=TABLES$(TABLE)&lt;br /&gt;
 04100          let FNSHOW_TABLE(TABLE$,ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;TABLE$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 04200       next TABLE&lt;br /&gt;
 04300    fnend &lt;br /&gt;
 04400 ! &lt;br /&gt;
 04500    def FNSHOW_TABLE(TABLE$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 04600       print #OUTFD: OUT_PREFIX$&amp;amp;TABLE$&lt;br /&gt;
 04700       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 04800       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table remarks=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.REMARKS&amp;quot;)&lt;br /&gt;
 04900       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 05000       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Columns:&amp;quot;&lt;br /&gt;
 05100       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.COLUMNS&amp;quot;&lt;br /&gt;
 05200       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT COLUMNS$)&lt;br /&gt;
 05300       for COLUMN = 1 to UDIM(MAT COLUMNS$)&lt;br /&gt;
 05400          let COLUMN$=COLUMNS$(COLUMN)&lt;br /&gt;
 05500          let FNSHOW_COLUMN(COLUMN$, ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;COLUMN$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 05600       next COLUMN&lt;br /&gt;
 05700    fnend &lt;br /&gt;
 05800 ! &lt;br /&gt;
 05900    def FNSHOW_COLUMN(COLUMN$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 06000       print #OUTFD: OUT_PREFIX$&amp;amp;COLUMN$&lt;br /&gt;
 06100       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 06200       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 06300       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column length=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LENGTH&amp;quot;)&lt;br /&gt;
 06400       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column decimals=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DECIMALS&amp;quot;)&lt;br /&gt;
 06500    fnend&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
For more information about &#039;&#039;&#039;SQL&#039;&#039;&#039; or &#039;&#039;&#039;Structured Query Language&#039;&#039;&#039; see [[Wikipedia:SQL]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Terminology]]&lt;br /&gt;
[[Category:SQL]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.30&amp;diff=10822</id>
		<title>4.30</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.30&amp;diff=10822"/>
		<updated>2017-01-16T19:40:01Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* SQL Date Format Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status: [[Beta]]&lt;br /&gt;
&lt;br /&gt;
The prior versions were [[4.1]] and [[4.2]].&lt;br /&gt;
&lt;br /&gt;
As Of 08/30/2012&lt;br /&gt;
&lt;br /&gt;
==MISCELLANEOUS ENHANCEMENTS==&lt;br /&gt;
&lt;br /&gt;
“ON error-type IGNORE” now ignores the error instead of going to an Ignore label. This is effective for both ON statements and individual statement error exits. This could change the way your programs work if your Ignore statements do more than CONTINUE.  &lt;br /&gt;
&lt;br /&gt;
The general purpose ERROR exit implies SOFOW truncation. So statements that are governed by ERROR IGNORE also do SOFLOW truncation as needed. &lt;br /&gt;
&lt;br /&gt;
For client / server configurations:&lt;br /&gt;
SPOOLPATH   @: client-pathname&lt;br /&gt;
Sets the remote spool path on the client. In addition to regular spool files, this is where PDF files are created. SPOOLPATH can be set concurrently for both client and server by specifying two SPOOLPATH statements. The @: indicates remote.  &lt;br /&gt;
&lt;br /&gt;
The client-pathname has some unique characteristics:&lt;br /&gt;
Paths are assumed to be OS pathnames relative to the CLIENT_CURRENT_DIR folder, or the startup directory if CLIENT_CURRENT_DIR is not specified. &lt;br /&gt;
If a full pathname is specified it must begin with a colon.  ( e.g.  @::X:\path ) Otherwise it will be preceded with the path to the client current working directory. &lt;br /&gt;
Specifying a relative remote pathname is not compatible with CLIENT_CURRENT_DIR SYNC.&lt;br /&gt;
The status of SPOOLPATH and REMOTESPOOLPATH settings are displayed in response to the STATUS SUBSTITUTE command.  &lt;br /&gt;
&lt;br /&gt;
CHR$(6) is a field separator that displays as a space but causes the immediately preceding data to be right justified. This applies to both Native Windows Printing and PRINT FIELDS. &lt;br /&gt;
&lt;br /&gt;
MAT2STR, STR2MAT changes to trim outside of quotes, but not inside of quotes and to always quote MAT2STR when quotes are present.  &lt;br /&gt;
&lt;br /&gt;
STATUS USERS will display the WSID and name of each user logged in on the network. &lt;br /&gt;
The SQL statement SHOW USERS responds with the same information for ODBC users.&lt;br /&gt;
&lt;br /&gt;
BRERR$ is a new system function that display the description of BR ERR value.&lt;br /&gt;
BRERR$(error-code) returns the description of that code.&lt;br /&gt;
Examples-&lt;br /&gt;
When ERR returns 4270, BRERR$ will return “end of file”.&lt;br /&gt;
BRERR$(0875) returns “unrecognized data after field specification”&lt;br /&gt;
&lt;br /&gt;
For making it easier to configure ODBC with BRconfig.sys and to setup common configuration files for multiple platforms we have added:&lt;br /&gt;
@LINUX&lt;br /&gt;
@WINDOWS&lt;br /&gt;
@MAC&lt;br /&gt;
@ODBC&lt;br /&gt;
&lt;br /&gt;
For example, this could be important for DRIVE statements:&lt;br /&gt;
@LINUX DRIVE C:,/unix/path,.,\&lt;br /&gt;
@WINDOWS DRIVE C:,\\server\path,.,\&lt;br /&gt;
&lt;br /&gt;
Programs compiled with older versions of BR (3.3 – 3.8) can be listed accurately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GRID AND LIST CHANGES===&lt;br /&gt;
&lt;br /&gt;
Arrays  are automatically resized when receiving data from 2D INPUT operations. This also applies to grouped arrays. Automatic resizing only applies to one dimensional arrays and does not occur when INPUTing into two dimensional arrays.&lt;br /&gt;
&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, ROW, ALL&amp;quot; : ( MAT Array1$,&lt;br /&gt;
             MAT Array2$, MAT Array3, MAT Array4, MAT Array5$ )&lt;br /&gt;
  Where all arrays are one dimensional and may have the incorrect number of elements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Three New Read Types====&lt;br /&gt;
  Notes- &lt;br /&gt;
Auto Resizing applies&lt;br /&gt;
Selection Type must be ALL&lt;br /&gt;
&lt;br /&gt;
The original 2D INPUT read types are:&lt;br /&gt;
  CNT	 - The number of cells specified.&lt;br /&gt;
  SUB	 - Read the Cell Subscript Values.&lt;br /&gt;
  CELL	 - Read each cell specified.&lt;br /&gt;
  ROWCNT - The number of rows specified.&lt;br /&gt;
  ROWSUB - The subscripts of the specified rows.&lt;br /&gt;
  ROW	 - Read all cells in each specified row.&lt;br /&gt;
&lt;br /&gt;
 HEADERS – The original PRINT FIELDS HEADER values.&lt;br /&gt;
e.g.  INPUT FIELDS &amp;quot;row,col,LIST rows/cols, HEADERS,,NOWAIT&amp;quot; :&lt;br /&gt;
                                   (MAT HEADINGS$,MAT WIDTHS, MAT FORMS$)&lt;br /&gt;
&lt;br /&gt;
  COLCNT - The number of columns established by the header arrays.&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, COLCNT, ALL&amp;quot; : numeric-variable&lt;br /&gt;
&lt;br /&gt;
These  are for generalized library routines to inspect passed controls. &lt;br /&gt;
&lt;br /&gt;
  SORT_ORDER - Provides a value of zero for each unsorted column and gives&lt;br /&gt;
the ascending sequence of column sorts that have occurred. If a column has&lt;br /&gt;
been reversed (double sorted) it&#039;s value will be negative.&lt;br /&gt;
&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, SORT_ORDER, ALL&amp;quot; : numeric-array&lt;br /&gt;
Given the following history of sorting a four column GRID:&lt;br /&gt;
column 1 (descending most rescent)&lt;br /&gt;
column 2 (ascending first sorted)&lt;br /&gt;
column 3 (not sorted)&lt;br /&gt;
column 4 (sorted ascending)&lt;br /&gt;
&lt;br /&gt;
SORT_ORDER would return-&lt;br /&gt;
array(1) -&amp;gt;  -1&lt;br /&gt;
array(2) -&amp;gt;   3&lt;br /&gt;
array(3) -&amp;gt;   0&lt;br /&gt;
array(4) -&amp;gt;   2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Restoring a User Sorted 2D Control===&lt;br /&gt;
&lt;br /&gt;
The syntax for sorting an array is currently:&lt;br /&gt;
&lt;br /&gt;
 PRINT FIELDS &amp;quot;nn,nn,GRID 10/40,SORT&amp;quot;: { column number }&lt;br /&gt;
&lt;br /&gt;
This has been extended to allow a numeric array of instead of a scalar. If an array is given, it is assumed to be in the same format that SORT_ORDER returns. The new format is:&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;nn,nn,GRID 10/40,SORT&amp;quot;: { column-number | numeric-array }&lt;br /&gt;
&lt;br /&gt;
Where the numeric-array has one element for each column left to right. BR will resort the columns in the requested order. &lt;br /&gt;
&lt;br /&gt;
The numeric array values indicating the order of column sorting to be performed do not need to exactly match the standard format. e.g Fractions are allowed, the values can fall within any range, and there does not need to be trailing zero elements for unsorted columns.&lt;br /&gt;
&lt;br /&gt;
=== A new Read Qualifier is available.===&lt;br /&gt;
[[Displayed_Order]] introduced&lt;br /&gt;
&lt;br /&gt;
===Masked 2D Display===&lt;br /&gt;
&lt;br /&gt;
LIST and GRID support the MASK operation-&lt;br /&gt;
&lt;br /&gt;
 PRINT FIELDS &amp;quot;row,col,LIST rows/cols,MASK&amp;quot; :  mask_array&lt;br /&gt;
&lt;br /&gt;
This restricts the rows (for both LIST and GRID) previously displayed to those corresponding to a “true” value in mask_array. A true value is represented in a umeric array as a value greater than zero. Negative values are not allowed in mask arrays. A string mask array may also be used with “T” and “F” values. The MASK stays in effect until 1) a new MASK is specified or 2) the contents of the control are changed with PRINT ( =, +, - see Output Operations in New Console.DOC). &lt;br /&gt;
&lt;br /&gt;
INPUT FIELDS &amp;quot;row,col,LIST rows/cols,MASK [,NOWAIT]&amp;quot; : mask_array&lt;br /&gt;
This reads the display mask setting for a 2D control.&lt;br /&gt;
&lt;br /&gt;
The mask array affects only the user presentation.. not the result set. Use RANGE processing or the CHG selection type to selectively read from a 2D control.&lt;br /&gt;
&lt;br /&gt;
== New Search Field Type: Filter ==&lt;br /&gt;
&lt;br /&gt;
See [[Filter]]&lt;br /&gt;
== New Config: Filter_Delimiters  ==&lt;br /&gt;
&lt;br /&gt;
See [[Filter_Delimiters]]&lt;br /&gt;
&lt;br /&gt;
== FIELDS CHARACTER BY CHARACTER KEYBOARD CONTROL==&lt;br /&gt;
&lt;br /&gt;
[[^KeyStroke and ^DataChg]] introduced.&lt;br /&gt;
&lt;br /&gt;
== RANGE SELECTION TYPE==&lt;br /&gt;
&lt;br /&gt;
Valid current selection types are:&lt;br /&gt;
  SEL	- Read one or more selected items.&lt;br /&gt;
  SELONE - Select only one item.&lt;br /&gt;
  ALL	- Read all items in the control (except headings).&lt;br /&gt;
  CUR	- Current cell or row number.&lt;br /&gt;
  CHG	- All cells or rows who’s values have been changed by the operator.&lt;br /&gt;
&lt;br /&gt;
BR now supports the following additional selection types:&lt;br /&gt;
  RANGE - Specifies which portion of a 2D control is to be input.&lt;br /&gt;
  CELL_RANGE – A special type of output range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RANGE Input===&lt;br /&gt;
&lt;br /&gt;
In the following examples BR will redimension the receiving arrays as needed:&lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row, col, LIST rows/cols, CELL, RANGE&amp;quot; : start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
This reads the specified range of cells. BR redimensions MAT Data$ as needed.  Note that CELL may now be used with LIST. Previously, LISTs were only addressable by row. &lt;br /&gt;
&lt;br /&gt;
INPUT FIELDS &amp;quot;row, col, LIST rows/cols, ROW, RANGE&amp;quot; :&lt;br /&gt;
             (start:=7), (end:=11), ( MAT Array1$, MAT Array2, MAT Array3$ )&lt;br /&gt;
&lt;br /&gt;
This reads the cells in rows 7 through 11. The receiving arrays are redimensioned as appropriate.&lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row, col, GRID rows/cols, ROW, RANGE&amp;quot; :&lt;br /&gt;
             MAT start, MAT end, ( MAT Data1$, MAT Data2$, MAT Data3 )&lt;br /&gt;
This reads one or more ranges of rows.&lt;br /&gt;
&lt;br /&gt;
A more detailed example of this is:&lt;br /&gt;
  100 -- create and populate a LIST control --&lt;br /&gt;
  ........&lt;br /&gt;
  200 MAT START(3) : MAT END(3)&lt;br /&gt;
  210 READ MAT START, MAT END&lt;br /&gt;
  220 DATA 7,21,33&lt;br /&gt;
  230 DATA 11,21,38&lt;br /&gt;
  240 INPUT FIELDS &amp;quot;row, col, LIST rows/cols, ROW, RANGE&amp;quot; : MAT START,&lt;br /&gt;
            MAT END, ( MAT Array1$, MAT Array2, MAT Array3$ )&lt;br /&gt;
&lt;br /&gt;
This reads 12 rows of data ( row 7-11, row 21 and rows 33-38 ).&lt;br /&gt;
&lt;br /&gt;
=== RANGE Output===&lt;br /&gt;
&lt;br /&gt;
By default, RANGE output refers to rows. The special keyword CELL_RANGE is used to denote the specification of cell ranges. Additionally, the use of scalars versus arrays for start and end values determines important characteristics of the output process. &lt;br /&gt;
&lt;br /&gt;
4c) Using Scalars For Range Specification&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7, 8, GRID 10/75, RANGE&amp;quot;: start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
This replaces the values in rows numbered &#039;start&#039; through &#039;end&#039; with the data in MAT Data$. The size of MAT Data$ must be a multiple of the number of columns in the GRID or an error is generated.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7, 8, LIST 10/75, RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
&lt;br /&gt;
This replaces the values in ROWs numbered &#039;start&#039; through &#039;end&#039; with the data from MATs NAME$, CITY$, AGE and WEIGHT. The data arrays must all be dimensioned the same.&lt;br /&gt;
&lt;br /&gt;
=== Row Insertion and Deletion===&lt;br /&gt;
&lt;br /&gt;
The number of rows being output do not need to match the number of rows being replaced. To delete a range of rows, output one or more grouped arrays with zero elements.&lt;br /&gt;
&lt;br /&gt;
Examples- Using the following statement various scenarios are described.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,LIST 10/75, RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
&lt;br /&gt;
  Start=7, end=11, and the arrays have been DIMed to nine elements&lt;br /&gt;
  Result- Nine rows replace five, and the total content of the control is&lt;br /&gt;
          expanded by 4 rows.&lt;br /&gt;
&lt;br /&gt;
  Start=7, end=11, and the arrays are DIMed to zero elements&lt;br /&gt;
  Result- Five rows are deleted, and the total size of the control is&lt;br /&gt;
          reduced by 5 rows.&lt;br /&gt;
&lt;br /&gt;
  Start=7, end=0 (anything less than 7), and the arrays are DIMed to&lt;br /&gt;
           support three rows&lt;br /&gt;
  Result- Three rows are inserted ahead of row seven and the total content&lt;br /&gt;
          of the control is expanded by three rows&lt;br /&gt;
&lt;br /&gt;
  Start=5000, end={any value}, the control only has 482 rows, and the source&lt;br /&gt;
          arrays are DIMed to support eleven rows&lt;br /&gt;
  Result- Eleven rows are appended to the end of the control and become&lt;br /&gt;
          rows 483 through 493.&lt;br /&gt;
&lt;br /&gt;
=== Outputting Ranges of Cells===&lt;br /&gt;
&lt;br /&gt;
Ranges of cells may be output in conjunction with the CELL_RANGE keyword.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,LIST 10/75, CELL_RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
                                - or -&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,GRID 10/75, CELL_RANGE&amp;quot;: start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
In this case, start and end specify cells instead of rows. If insertion or deletion is indicated by dimensioning the data arrays to greater or fewer elements than are being replaced, then the data must be a multiple of the number of columns. Insertion and deletion is only valid in terms&lt;br /&gt;
of rows, even when cell subscripts are used to specify ranges. In such cases, if the cell subscripts are not on row boundaries, an error is generated.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,GRID 10/75, CELL_RANGE&amp;quot;: start, start, Data$&lt;br /&gt;
In this example, the value in one cell is replaced with the content of a scalar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using Arrays For RANGE Specification===&lt;br /&gt;
&lt;br /&gt;
If the start and end specifications are arrays, denoting multiple ranges, there must be a one to one correspondence between the number of rows specified and those in the data. This method implies replacement only and insertion or deletion is not allowed.&lt;br /&gt;
&lt;br /&gt;
The data flow that this feature was designed to support is one where the user is presented with a LIST or GRID where multiple rows have been either selected or changed before returning control to the program and the program is responding by updating something on those rows.&lt;br /&gt;
&lt;br /&gt;
The program begins by presenting a 2D control to the user and reading the the control with type ROWSUB or SUB. Type SUB only works for GRIDs where all colmns have the same data type. Of course the subscripts are read into a numeric array which BR redimensions as appropriate.  Then the program reads the changed or selected data with NOWAIT. (This resets the CHG flags in the control.) The program then changes either row (ROWSUB) or cell (SUB)&lt;br /&gt;
data and outputs the results using the subscript array as both the start and end specification. Other scenarios are possible but this is the primary intended use.&lt;br /&gt;
&lt;br /&gt;
An example of this is:&lt;br /&gt;
  100 -- create and populate a GRID --&lt;br /&gt;
  ........&lt;br /&gt;
  200 INPUT FIELDS &amp;quot;row,col,GRID rows/cols,ROWSUB,CHG&amp;quot;: MAT Rowsubs&lt;br /&gt;
         (Reading subscripts does not reset the CHG flags in the control.)&lt;br /&gt;
  210 INPUT FIELDS &amp;quot;row,col,GRID rows/cols,ROW,CHG,NOWAIT&amp;quot;: ( MAT Data1$,&lt;br /&gt;
                                  MAT Data2, MAT Data3$ )&lt;br /&gt;
          BR redimensions the receiving arrays as needed.&lt;br /&gt;
         (Reading the data also resets the CHG flags in the control.)&lt;br /&gt;
&lt;br /&gt;
  220 -- process the changed rows now present in the data arrays --&lt;br /&gt;
  ........&lt;br /&gt;
  300 PRINT FIELDS &amp;quot;row,col,GRID rows/cols,RANGE&amp;quot;: MAT Rowsubs,&lt;br /&gt;
                   MAT Rowsubs, ( MAT Data1$, MAT Data2, MAT Data3$ )&lt;br /&gt;
&lt;br /&gt;
This outputs the updated rows.&lt;br /&gt;
&lt;br /&gt;
== FINE GRAIN FIELD POSITIONING==&lt;br /&gt;
ROW/COL and ROWS/COLS in FIELDS operations may be expressed as decimal fractions.&lt;br /&gt;
&lt;br /&gt;
== LOGGING ENHANCEMENTS==&lt;br /&gt;
The debug versions of BR now expect you to use a LOGGING configuration statement. This enables BR to post exit messages during unexpected terminations.&lt;br /&gt;
&lt;br /&gt;
A system function called DEBUG_STR( message-level, string-value ) will, depending on LOG LEVEL, send data to the LOGGING file as well as to the MyEditBR debugger if it is attached, or optionally to the command console if the debugger is not attached and GUI is ON. This lets you freely put trace related informational statements into your code without affecting normal processing.  &lt;br /&gt;
&lt;br /&gt;
The LOGGING configuration statement now has two additional optional parameters:&lt;br /&gt;
&lt;br /&gt;
   LOGGING  loglevel,  logfile   [ ,DEBUG_LOG_LEVEL=nn ]   [ ,+CONSOLE ]&lt;br /&gt;
&lt;br /&gt;
Note- Logfile is a native OS filename.  Second and subsequent occurrences of the LOGGING statement may omit loglevel and the log filename.&lt;br /&gt;
	&lt;br /&gt;
DEBUG_LOG_LEVEL specifies the log level for debugging log messages Independently of the standard log level. If not specified the Debug_Log_Level is set to the standard log level.&lt;br /&gt;
&lt;br /&gt;
+CONSOLE applies only when GUI is ON and specifies that all logging messages also go to the console and the console is to be left visible when not attached to MyEditBR. ( Console logging output is suppressed when GUI is OFF. )&lt;br /&gt;
&lt;br /&gt;
Message Levels are compared with Log Levels during the filtering process. The Logging Level is meant to specify the level of detail to be logged, with greater detail logged at higher log levels.  &lt;br /&gt;
&lt;br /&gt;
The following types of messages are written to the LOGGING file:&lt;br /&gt;
&lt;br /&gt;
Config error messages based on their assigned level of importance.&lt;br /&gt;
&lt;br /&gt;
DEBUG_STR() messages where message-level is equal to or less than the DEBUG_LOG_LEVEL.&lt;br /&gt;
&lt;br /&gt;
Log levels 0, 1, 2 and 3-&lt;br /&gt;
  System generated warning messages such as OS failures and abnormal exits.&lt;br /&gt;
Log level 5 or above-&lt;br /&gt;
  User Logon data, including any logon attempts.&lt;br /&gt;
Log level 6 or above-&lt;br /&gt;
  Starting a BR program, exiting.&lt;br /&gt;
Log level 8 or above-&lt;br /&gt;
   Commands such as COPY plus shell calls with parameters. &lt;br /&gt;
   PDF printing events.&lt;br /&gt;
Log level 11 or above-&lt;br /&gt;
   Any PRINT output that goes to the console is also logged (GUI ON only).&lt;br /&gt;
Log level 12 or above-&lt;br /&gt;
  TRACE, and DISPLAY messages.&lt;br /&gt;
Log level 13 or above-&lt;br /&gt;
  Lots of what the system is doing now messages.&lt;br /&gt;
&lt;br /&gt;
Any DEBUG_STR() calls with a level &amp;gt;10 are deemed to be message level 10.&lt;br /&gt;
&lt;br /&gt;
Logging was added to PDF creation. Logging of minor events that happen during the printing process are logged at log level 8.  Errors are logged at a lower level. Logging was also improved with respect to loading older versions of pdflib.&lt;br /&gt;
Note- As a diagnostic, the following command is quite useful: &lt;br /&gt;
DIR &amp;gt;PDF:/READER&lt;br /&gt;
&lt;br /&gt;
ODBC Logging was substantially increased.&lt;br /&gt;
&lt;br /&gt;
Log Level Indication is given in Log Messages:&lt;br /&gt;
  (6) - 08/25/2011 11:33:53&lt;br /&gt;
Setting logging to log file logfile.txt log level 10.&lt;br /&gt;
  (6) - 08/25/2011 11:33:53&lt;br /&gt;
The BRConfig.sys file is C:\Users\dan\programs\cygwin\home\dan\br-wx\br\winbuild\dllbuild\output\brconfig.sys&lt;br /&gt;
The (6) here is the log level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSV AND XML PARSING ENHANCEMENTS==&lt;br /&gt;
The string to mat and mat to string functions have been extended to ease parsing of CSV and XML data. &lt;br /&gt;
&lt;br /&gt;
STR2MAT( str$, MAT zzz$ [, [MAT] Sep$ [, flags$]] )&lt;br /&gt;
Where Sep$ may be an array and flag$ is in the format:&lt;br /&gt;
[ quote-type ] [ :LTRM ] | [ :TRIM ] | [ :RTRM ]&lt;br /&gt;
Where quote-type can be Q, QUOTES, (&#039;), or (&amp;quot;), case insensitive. Q and QUOTES denote standard BR quote processing. The trim flags denote post processing of extracted elements and the leading colon is only present when quote-type is specified.&lt;br /&gt;
When Sep$ is an array, then any or all of the specified values are deemed to represent a single separator with the qualification that any one separator, cannot occur more than once in a string of adjacent separators. To restate this, when elements of a Sep$ array occur adjacent to each other within the source string, they are grouped as a separator substring.&lt;br /&gt;
Sep$ elements cannot occur more than once in a separator substring. When they do, it denotes the specification of a null element.  e.g. two successive commas or two successive occurrences of CR+LF both denote null elements. Essentially when Sep$ elements are &#039;consumed&#039; by their recognition within the source string, then they cannot be re-recognized without inserting a null element into the output array. &lt;br /&gt;
=== Quote Processing ===&lt;br /&gt;
Quotation marks suppress the recognition of separators in accordance with the following rules.&lt;br /&gt;
Standard BR Quote Processing&lt;br /&gt;
When examining str$ left to right, the first character (and the first character after each separator) is checked to see if is either (&#039;) or (&amp;quot;). If it is either of those then it activates quotation processing which suppresses the recognition of separators until quotation processing is deactivated. The first character thus becomes the governing quote type until quotation processing is deactivated.&lt;br /&gt;
&lt;br /&gt;
The string is copied until it ends or until an odd number of successive occurrences of the governing quote type is encountered. During this processing, two adjacent occurrences of the governing quote character denote an embedded occurrence of the quote character.&lt;br /&gt;
Examples&lt;br /&gt;
&amp;quot;abc,def&amp;quot; -&amp;gt; abc,def    where the comma is not recognized as a separator and is part of the data&lt;br /&gt;
abc&amp;quot;def -&amp;gt; abc&amp;quot;def    naturally embedded quotes may occur anywhere within a string after the first character&lt;br /&gt;
&amp;quot;abc&amp;quot;def&amp;quot; -&amp;gt; abcdef&amp;quot;   quotation processing is deactivated by the center quote mark&lt;br /&gt;
&amp;quot;abcdef&amp;quot; -&amp;gt; abcdef   normal data&lt;br /&gt;
&amp;quot;abc&#039;def&amp;quot; -&amp;gt; abc&#039;def   the single quote is treated like any other character while double quotes govern&lt;br /&gt;
&#039;abc&amp;quot;def&#039; -&amp;gt; abc&amp;quot;def   double quotes are treated like any other character while single quotes govern&lt;br /&gt;
&amp;quot;abc&amp;quot;&amp;quot;def&amp;quot; -&amp;gt; abc&amp;quot;def   pairs of governing quotes denote a single embedded quote&lt;br /&gt;
&amp;quot;abc&amp;quot;&amp;quot;&amp;quot;def&amp;quot; -&amp;gt; abc&amp;quot;def&amp;quot;   the third successive occurrence deactivates quote processing which began with the first quote&lt;br /&gt;
&lt;br /&gt;
MAT2STR( MAT zzz$, str$ [, sep$ [, flags$]] )&lt;br /&gt;
Where flag$ is in the format:&lt;br /&gt;
[ quote-type ] [ :LTRM ] | [ :TRIM ] | [ :RTRM ]&lt;br /&gt;
Where quote-type can be Q, QUOTES, (&#039;), or (&amp;quot;), case insensitive. Quote-type denotes that each element should be enclosed in quotation marks. The trim flags denote pre-processing of array elements and the leading colon is only present when quote-type is specified.&lt;br /&gt;
If Q or QUOTES is specified then BR automatically determines which quote type to apply as follows:&lt;br /&gt;
First the element is unpacked. That is, if it is contained in quotes, the quotes are stripped and embedded pairs are singled. Next the element is scanned left to right for either type of quote character ( single or double ). If a quote character is encountered the element is enclosed in the alternate quote type and embedded occurrences of that quote type are doubled. If no quote character is encountered then double quotes are applied.&lt;br /&gt;
Examples&lt;br /&gt;
Quote Type is Q or QUOTES&lt;br /&gt;
abcdef -&amp;gt; &amp;quot;abcdef&amp;quot;&lt;br /&gt;
abc&#039;def -&amp;gt; &amp;quot;abc&#039;def&amp;quot;&lt;br /&gt;
abc&amp;quot;def -&amp;gt; &#039;abc&amp;quot;def&#039;&lt;br /&gt;
abc&amp;quot;&amp;quot;def -&amp;gt; ‘abc&amp;quot;&amp;quot;def’     embedded quotes are left intact when quotes are not active&lt;br /&gt;
&#039;abcdef -&amp;gt; &amp;quot;&#039;abcdef&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Quote Type is &#039; ( quote type single )&lt;br /&gt;
abcdef -&amp;gt; &#039;abcdef&#039;&lt;br /&gt;
&#039;abcdef -&amp;gt; &#039;&#039;&#039;abcdef&#039;   single quotes get doubled when embedded in single quotes&lt;br /&gt;
&amp;quot;abcdef -&amp;gt; &#039;&amp;quot;abcdef&#039;   leading double quote is treated normally&lt;br /&gt;
&lt;br /&gt;
Quote type double mirrors quote type single.&lt;br /&gt;
MAT2STR and STR2MAT trim outside of quotes but not inside of quotes. Also MAT2STR always adds quotes when quotes are present in the data.  &lt;br /&gt;
When using MAT2STR on a 2 dimensional array, the first delimiter is used for individual elements and the second delimiter at the end of each row. This principle also applies to three to seven dimensions.&lt;br /&gt;
Example&lt;br /&gt;
Given the following two dimensional array zzz$ containing the values-&lt;br /&gt;
    1            2&lt;br /&gt;
    3            4&lt;br /&gt;
&lt;br /&gt;
The following statements-&lt;br /&gt;
    10 Sep$(1)=&amp;quot;,&amp;quot;&lt;br /&gt;
    20 Sep$(2)=hex$(&amp;quot;0D0A&amp;quot;) ! CRLF&lt;br /&gt;
    30 MAT2STR( MAT zzz$,  str$, MAT Sep$ )&lt;br /&gt;
    40 PRINT str$&lt;br /&gt;
&lt;br /&gt;
Will produce-&lt;br /&gt;
    1,2&lt;br /&gt;
    3,4&lt;br /&gt;
&lt;br /&gt;
=== CSV Parsing Example===&lt;br /&gt;
Parsing CSV data files is now quite easy, the following code snippet demonstrates how to open a CSV/Tab File, read in the fields from the header, and then loop through  the records.&lt;br /&gt;
 01000    dim CSV_LINE$*999,CSV_FILE$*256, CSV_DELIM$*1, CSV_HEADER$*999, &lt;br /&gt;
CSV_FIELDS$(1)*40, CSV_DATA$(1)*60&lt;br /&gt;
 01020    form C,&amp;quot; &amp;quot;&lt;br /&gt;
 01040    let CSV_FILE$=&amp;quot;Sample_File.tab&amp;quot; : let TAB$=CHR$(9)&lt;br /&gt;
 01060    open #(CSV_HANDLE:=10): &amp;quot;name=&amp;quot;&amp;amp;CSV_FILE$&amp;amp;&amp;quot;, shr&amp;quot;, display,input &lt;br /&gt;
 01080    linput #CSV_HANDLE: CSV_HEADER$&lt;br /&gt;
 01100    let CSV_DELIM$=TAB$&lt;br /&gt;
 01120    if POS(CSV_HEADER$,TAB$) &amp;lt;= 0 then &lt;br /&gt;
 01140       let CSV_DELIM$=&amp;quot;,&amp;quot;&lt;br /&gt;
 01160    end if &lt;br /&gt;
 01180    let STR2MAT(CSV_HEADER$, MAT CSV_FIELDS$, CSV_DELIM$, &amp;quot;QUOTES:TRIM&amp;quot;)&lt;br /&gt;
 01200    print using 1020: MAT CSV_FIELDS$&lt;br /&gt;
 01220    do &lt;br /&gt;
 01240       linput #CSV_HANDLE: CSV_LINE$ eof Exit_Csv&lt;br /&gt;
 01260       let STR2MAT(CSV_LINE$,MAT CSV_DATA$,CSV_DELIM$,&amp;quot;Q:trim&amp;quot;)&lt;br /&gt;
 01280       print using 1020: MAT CSV_DATA$&lt;br /&gt;
 01300    loop &lt;br /&gt;
 01320 Exit_Csv: !&lt;br /&gt;
&lt;br /&gt;
You might wish to copy any CSV file to Sample_File.tab and run this program to view the content.&lt;br /&gt;
&lt;br /&gt;
=== XML Parsing Examples===&lt;br /&gt;
&lt;br /&gt;
STR2MAT may also be used to Parse XML data.&lt;br /&gt;
This is a bit more complex than parsing CSV files, but remains a powerful tool.&lt;br /&gt;
The following example will parse XML$ into &amp;quot;MAT XML_LINE$&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  10 DIM XML$*999999,XML_LINE$(1)*32000&lt;br /&gt;
  20 XML$=&amp;quot;&amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&amp;lt;/ITEM&amp;gt;&amp;lt;/NODE&amp;gt;&amp;lt;/XML&amp;gt;&amp;quot;&lt;br /&gt;
  100 LET Str2mat(XML$,Mat XML_LINE$,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;TRIM&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
This makes the parsing of XML a bit more convenient. The following XML sample shows how the function will parse the data&lt;br /&gt;
&lt;br /&gt;
Input:&lt;br /&gt;
  &amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&amp;lt;/ITEM&amp;gt;&amp;lt;/NODE&amp;gt;&amp;lt;/XML&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
  &amp;lt;XML&lt;br /&gt;
  &amp;lt;NODE&lt;br /&gt;
  &amp;lt;ITEM&lt;br /&gt;
  ITEM VALUE&amp;lt;/ITEM&lt;br /&gt;
  &amp;lt;/NODE&lt;br /&gt;
  &amp;lt;/XML&lt;br /&gt;
&lt;br /&gt;
While the above technique is useful, a more complete and useful technique can be performed if the Node names are known. You may use an array of SEP$ values to parse the data.  Take the following example:&lt;br /&gt;
&lt;br /&gt;
 100    dim XML$*999999,XML_LINE$(1)*32000,SEP$(4)*32&lt;br /&gt;
 110    let XML$=&amp;quot;&amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&amp;lt;/ITEM&amp;gt;&amp;lt;ITEM2&amp;gt;ITEM2 VALUE&amp;lt;/ITEM2&amp;gt;&amp;lt;/NODE&amp;gt;&amp;lt;/XML&amp;gt;&amp;quot;&lt;br /&gt;
 120    read MAT SEP$&lt;br /&gt;
 130    data &amp;lt;/XML&amp;gt;,&amp;lt;/NODE&amp;gt;,&amp;lt;/ITEM&amp;gt;,&amp;lt;/ITEM2&amp;gt;&lt;br /&gt;
 140    let STR2MAT(XML$,MAT XML_LINE$,MAT SEP$,&amp;quot;TRIM&amp;quot;)&lt;br /&gt;
 150    print MAT XML_LINE$&lt;br /&gt;
&lt;br /&gt;
This program would return the following results:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&lt;br /&gt;
  &amp;lt;ITEM2&amp;gt;ITEM2 VALUE&lt;br /&gt;
&lt;br /&gt;
Notice that &amp;quot;Nested Nodes&amp;quot; are listed before the initial data, this may be used to identify the node.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NEW DLL STRUCTURE OF BUSINESS RULES!==&lt;br /&gt;
&lt;br /&gt;
As of Release 4.3 Business Rules! has been restructured into the following modules:&lt;br /&gt;
[[brserver.exe]] – The BR Server module accessed by Client-Server configurations. Brserver.exe also operates as what is now viewed as the Standard Model. If it is invoked by brlistener, then it act as brserver. If it is simply executed, it acts as brcombined. However, when operating as the standard model, it needs to have brclient.dll in the same directory as brserver.&lt;br /&gt;
[[brclient.exe]] – The program that the user accesses in Client-Server configurations&lt;br /&gt;
[[brclient.dll]] – The client processing program that correlates with the brserver edition.&lt;br /&gt;
[[npbrclient.dll]] - The standard (non-IE) browser plugin dll&lt;br /&gt;
[[iebrclient.dll]] – Internet Explorer plugin dll&lt;br /&gt;
&lt;br /&gt;
Client installation is done by placing brclient.exe and brclient.dll on the client system and referencing brclient.exe in an icon. Server installation is done by placing brserver.exe and brclient.dll on the server and referencing brserver.exe in the brlistener.conf file. Exe files may be renamed as desired. The name of the released brclient.dll modules will be lengthy and must not be changed because BR relies on the DLL names for version identification. &lt;br /&gt;
&lt;br /&gt;
You will need one of the following possible configurations:&lt;br /&gt;
* Workstation Standard Model&lt;br /&gt;
* Server executable&lt;br /&gt;
* Workstation Client dll&lt;br /&gt;
* Linux Terminal Support&lt;br /&gt;
* Server executable&lt;br /&gt;
* Linux Client dll ( .so )&lt;br /&gt;
* Client Server Model&lt;br /&gt;
* On Client Machine-&lt;br /&gt;
* Client executable&lt;br /&gt;
* Workstation Client dll&lt;br /&gt;
* On Server&lt;br /&gt;
* Server executable&lt;br /&gt;
* Workstation Client dll&lt;br /&gt;
* BR Listener installed&lt;br /&gt;
[ Linux Client dll for Linux terminal access ]&lt;br /&gt;
&lt;br /&gt;
The 32 and 64 bit versions of servers and clients can be intermixed. However dlls must be the in same bit class as the modules that call them.  Put your BR bmp files ( drawsunk.bmp, startup.bmp etc. ) in the BR server executable directory. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Updates will pertain to Processor DLLs while the user interfaces will remain as installed. Client DLLs will be automatically uploaded when corresponding server DLLs are accessed in the event they are not already present on the client.&lt;br /&gt;
&lt;br /&gt;
The client can be accessed from within a browser by initiating it with HTML which can specify an embedded window or a separate independent window. In all cases opening a window with PARENT=NONE creates a separate window. &lt;br /&gt;
&lt;br /&gt;
=== BR Adjunctive Files===&lt;br /&gt;
&lt;br /&gt;
The BR executable is now considered to be where the BR server actually resides, irrespective of Drive statements and current working directories. &lt;br /&gt;
&lt;br /&gt;
The following files are located in the BR executable directory by default:&lt;br /&gt;
BR server executable&lt;br /&gt;
BRconfig.sys&lt;br /&gt;
BRserial.dat&lt;br /&gt;
BRserver.dat&lt;br /&gt;
WBcmd.wbh - BR help files&lt;br /&gt;
Server Dlls&lt;br /&gt;
Client Dlls for uploading as needed&lt;br /&gt;
System Image files – linedraw, etc. - typically BMPs&lt;br /&gt;
===) Exceptions===&lt;br /&gt;
&lt;br /&gt;
If [[WBcmd.wbh]] doesn&#039;t exist in the BR executable directory then BR looks for it in the initial directory specified by the first drive statement. ( deprecated – will be eliminated at some point)  ONQPATH currently defaults to this initial path as well. ( this will remain )&lt;br /&gt;
&lt;br /&gt;
If the BRconfig file is not present in the BR executable directory then BR looks for it in the current working directory at the time of BR invokation. &lt;br /&gt;
&lt;br /&gt;
The SPOOLPATH :OS-fullpath  configuration statement specifies where print spool files are temporarily stored during printing.  SPOOLPATH defaults to a spool directory that runs off of the BR root of the first drive statement. If no such spool directory exists and SPOOLPATH is not specified then BR creates one.&lt;br /&gt;
e.g.	DRIVE   J:, C:\BR, x, \MYAPP   would result in spool files being placed in:&lt;br /&gt;
C:\BR\SPOOL\&lt;br /&gt;
&lt;br /&gt;
SPOOLPATH @::client-OS-fullpath   specifies where on the client spool files are to be placed.  &lt;br /&gt;
  e.g.   SPOOLPATH  @::C:\BR\SPOOL  -or whatever other full path is desired-&lt;br /&gt;
&lt;br /&gt;
The @:  tells BR that this path is on the client. The second colon says the path is independent of drive specifications. &lt;br /&gt;
&lt;br /&gt;
WORKPATH defaults to the BR root of the first drive statement:&lt;br /&gt;
e.g.		C:\BR\&lt;br /&gt;
&lt;br /&gt;
BRconfig.sys INCLUDE statements are relative to the location of the file containing the INCLUDE statement ( the parent ).  CONFIG command INCLUDE statements are relative to the current directory at the time the command is issued.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Licensing Restrictions===&lt;br /&gt;
&lt;br /&gt;
As of [[4.20H]], [[brserial]] files must be specific to the first decimal position of the [[release]] of BR that is being used. ( e.g. 4.2x versus 4.3x )&lt;br /&gt;
&lt;br /&gt;
To accommodate more than one brserial level, BR first looks for its own suffix ( 42 or 43 ) before looking for a dat file. From now on it is most useful to name your brserial files either BRSERIAL.42 or BRSERIAL.43, etc.&lt;br /&gt;
&lt;br /&gt;
== CLIENT SERVER RECONNECT Configuration Statement==&lt;br /&gt;
&lt;br /&gt;
CLIENT_SERVER     RECONNECT_AFTER=20   RECONNECT_TIME=120&lt;br /&gt;
&lt;br /&gt;
BR sends idle packets between the client and the server every 2 seconds. This statement specifies that after 20 seconds of not receiving such packets BR will attempt to reconnect.  This reconnect process can last up to a maximum of 120 seconds, after which BR will issue a “lost connection” error and begin processing in unattended mode. &lt;br /&gt;
&lt;br /&gt;
You can change the above period lengths with the above CONFIG statement.&lt;br /&gt;
&lt;br /&gt;
When BR runs unattended, it normally terminates processing if the program attempts to wait for keyboard input. However, after a lost connection error, if a library program attempts to wait for keyboard input the library function is terminated, the calling statement receives control, and the lost connection error is issued again. This supports error trapping in the calling program so an orderly shutdown can be performed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AUTOIT SUPPORT==&lt;br /&gt;
&lt;br /&gt;
[[AutoIt]] is a free keyboard simulation program with very powerful automating capabilities. It can be used to access windows, read data from spreadsheets, write to display files and enter data in screens. There is a separate Window Information utility that comes with Autoit which displays what Autoit sees when windows are active. This has produced ambiguous information in the past. &lt;br /&gt;
&lt;br /&gt;
R99C999 (BR row &amp;amp; col) now appears in the text field of BR labels.&lt;br /&gt;
&lt;br /&gt;
Individual BR input fields may be referenced in Autoit as    EditNN    where NN is the INPUT FIELDS subscript (CURFLD) of the field.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ENVIRONMENT INTERROGATION==&lt;br /&gt;
&lt;br /&gt;
ENV$(&amp;quot;STATUS [ .sub-keyword ] ... &amp;quot; [, mat config$ [, search-arg] ...] )&lt;br /&gt;
&lt;br /&gt;
ENV$ returns a string or, in the event MAT CONFIG$ is provided, ENV$ redimensions and loads it. For a list of valid keywords issue a STATUS ENV command. If an array is specified, it may be followed by one or more case insensitive substrings which are regarded as restricting search arguments.&lt;br /&gt;
&lt;br /&gt;
e.g.  ENV$(&amp;quot;SERVER_PLATFORM&amp;quot;)      returns “WINDOWS”&lt;br /&gt;
&lt;br /&gt;
The following program displays all STATUS information that contains the word “file”:&lt;br /&gt;
&lt;br /&gt;
 00100    dim CONFIG$(1)*100&lt;br /&gt;
 00120    let ENV$(&amp;quot;STATUS&amp;quot;,MAT CONFIG$,&amp;quot;file&amp;quot;)&lt;br /&gt;
 00140    print MAT CONFIG$&lt;br /&gt;
&lt;br /&gt;
The above program produces the following output:&lt;br /&gt;
&lt;br /&gt;
 CHAINDFLT - Look for object files with source first.&lt;br /&gt;
 EDITOR C:\PROGRAM FILES\MILLS ENTERPRISE\MYEDITBR\MYEDITBR.EXE&lt;br /&gt;
 FILENAMES LOWER_CASE&lt;br /&gt;
 OPTION 23 is OFF - prevent data conversion errors from moving file position&lt;br /&gt;
 OPTION 25 is ON - make FILE$(0) be CON: if in windows&lt;br /&gt;
 OPTION 26 is OFF - suppress creation of .BAK files&lt;br /&gt;
 OPTION 29 is ON - save programs as .WB files&lt;br /&gt;
 OPTION 33 is 64 - locking position for large file support&lt;br /&gt;
 OPTION 49 is OFF - use relative path for spool file&lt;br /&gt;
 OPTION 51 is OFF - recover deleted records for all files&lt;br /&gt;
 SPOOLCMD prt.bat [SPOOLFILE] [COPIES] [PRINTER]&lt;br /&gt;
 Server File: :c:\wbserver.dat&lt;br /&gt;
 BR Config File: :C:\ADS\SYS\br.d\brconfig.sys&lt;br /&gt;
 Executable File: :C:\ADS\SYS\br.d\ &lt;br /&gt;
 brserver-430beta+q-Win32-DebugEfence-2011-03-20.exe&lt;br /&gt;
 Serial File: :C:\ADS\SYS\br.d\brserial.dat&lt;br /&gt;
 Workfile path: :c:\ads&lt;br /&gt;
 Open File #  0  :CON:&lt;br /&gt;
&lt;br /&gt;
If I just want the options with the word file then I would use:&lt;br /&gt;
&lt;br /&gt;
 00100    dim CONFIG$(1)*100&lt;br /&gt;
 00120    let ENV$(&amp;quot;STATUS.CONFIG.OPTION&amp;quot;,MAT CONFIG$,&amp;quot;file&amp;quot;)&lt;br /&gt;
 00140    print MAT CONFIG$&lt;br /&gt;
&lt;br /&gt;
Which produces:&lt;br /&gt;
 OPTION 23 is OFF - prevent data conversion errors from moving file position&lt;br /&gt;
 OPTION 25 is ON - make FILE$(0) be CON: if in windows&lt;br /&gt;
 OPTION 26 is OFF - suppress creation of .BAK files&lt;br /&gt;
 OPTION 29 is ON - save programs as .WB files&lt;br /&gt;
 OPTION 33 is 64 - locking position for large file support&lt;br /&gt;
 OPTION 49 is OFF - use relative path for spool file&lt;br /&gt;
 OPTION 51 is OFF - recover deleted records for all files &lt;br /&gt;
&lt;br /&gt;
Note that while keywords are case insensitive, they must be correctly specified, whereas search arguments are more “friendly”. For a complete list of valid keywords, issue the command:&lt;br /&gt;
&lt;br /&gt;
	STATUS ENV -p&lt;br /&gt;
&lt;br /&gt;
Some of the new keywords supported are:&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM&amp;quot;) is &amp;quot;WINDOWS&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.BR_BUILD_TYPE&amp;quot;) is &amp;quot;DebugEfence&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.BR_BUILD_DATE&amp;quot;) is &amp;quot;2011-05-12&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.BR_BITS&amp;quot;) is &amp;quot;32&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.OS_BITS&amp;quot;) is &amp;quot;64&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.OS_VERSION_NAME&amp;quot;) is &amp;quot;Windows 7&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.OS_VERSION_NUMBER&amp;quot;) is &amp;quot;6.1&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM&amp;quot;) is &amp;quot;LINUX&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.BR_BUILD_TYPE&amp;quot;) is &amp;quot;DebugEfence&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.BR_BUILD_DATE&amp;quot;) is &amp;quot;2011-05-13&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.BR_BITS&amp;quot;) is &amp;quot;64&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.OS_BITS&amp;quot;) is &amp;quot;&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.OS_VERSION_NAME&amp;quot;) is &amp;quot;#36-Ubuntu SMP Thu Jun 3 20:38:33 UTC 2010&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.OS_VERSION_NUMBER&amp;quot;) is &amp;quot;2.6.32-22-server&amp;quot;	&lt;br /&gt;
*BR_MODEL		  “CLIENT/SERVER” or “COMBINED”&lt;br /&gt;
&lt;br /&gt;
== NEW WORLD SQL SUPPORT==&lt;br /&gt;
&lt;br /&gt;
CONFIG DATABASE db-ref  DSN=dsn-ref  [, USER= department | LOGIN_NAME | ? ]&lt;br /&gt;
     [, {PASSWORD= dept-password | BR_PASSWORD | ?} | PASSWORDD=encrypted-passwd ]&lt;br /&gt;
? indicates prompt&lt;br /&gt;
BR_PASSWORD indicates the password used during client login. If running the standard model ( not client-server ) then this is equivalent to “?”.&lt;br /&gt;
encrypted-passwd is the DB password encrypted with the key stated in OPTION 66.&lt;br /&gt;
            - or -&lt;br /&gt;
CONFIG DATABASE db-ref  CONNECTSTRING=&amp;quot;Driver={Microsoft Access Driver (*.mdb)}&lt;br /&gt;
e.g.       DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
            - or -&lt;br /&gt;
CONFIG DATABASE ODBC-MANAGER&lt;br /&gt;
This will invoke the ODBC Manager to define or identify a file DSN.&lt;br /&gt;
&lt;br /&gt;
OPEN #20: &amp;quot;DATABASE= db-ref&amp;quot; , SQL &amp;quot;sql-statement&amp;quot;, OUTIN&lt;br /&gt;
             - or -&lt;br /&gt;
OPEN #20: &amp;quot;DATABASE= db-ref, Name= filename&amp;quot; , SQL, OUTIN&lt;br /&gt;
     - filename refers to a DISPLAY file containing an SQL statement&lt;br /&gt;
       that gets executed when a WRITE statement is processed -&lt;br /&gt;
&lt;br /&gt;
===Sequence of Operations===&lt;br /&gt;
&lt;br /&gt;
1. Begin processing with a WRITE statement.&lt;br /&gt;
2. If the WRITE contains an IO list of values then it is used to populate the &#039;filename&#039; SQL before it is executed. In this process IO list values replace question marks in the original SQL, positionally left to right.  These question marks only work with SQL arguments that refer to stored data. Question marks cannot be specified where SQL keywords or table column names appear. &lt;br /&gt;
3. This may or may not produce a result set. If it does, the result set may be processed like a BR file opened RELATIVE. Some operations that use file positioning may be slow since the whole result set may not be in memory immediately. Simple sequential access should be fairly quick.&lt;br /&gt;
4. Once SQL has been populated by an IOlist, it may be reused with the same values by issuing a WRITE with no IOlist.&lt;br /&gt;
5. READ IOlist variable associations are positional with each READ accessing one row of values.&lt;br /&gt;
&lt;br /&gt;
=== SQL Date Format Functions===&lt;br /&gt;
&lt;br /&gt;
A$ = SQL_DATE$(BR-date-string,&amp;quot;format-mask&amp;quot;)    ! format date for storage&lt;br /&gt;
B$ = BR_DATE$( SQL-date-string,&amp;quot;format-mask&amp;quot;)   ! unpack DB date value&lt;br /&gt;
&lt;br /&gt;
* Note: SQL DATETIME fields are &amp;quot;Packed for Storage&amp;quot;, but &amp;quot;DATE&amp;quot; fields are returned as a CCYY-MM-DD string in a SQL Query.  DATE returns &amp;quot;BLANK&amp;quot; for &amp;quot;Empty or Null Date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== SQL Table Interrogation===&lt;br /&gt;
&lt;br /&gt;
“ENV$ (STATUS)” has been extended to interrogate database connections and ODBC data sources. A program called ENVDB.BRS has been written to demonstrate how this extension works and to show how to setup linkage to a database or ODBC data source. Run the program as is to bring up the Microsoft ODBC manager. Then select a data source and look at the output from the program. This will also show you how to get and use connect strings. In this example lines 1900 and 2000 accomplish the same open as line 1800 in my environment. &lt;br /&gt;
&lt;br /&gt;
Try it on your Windows workstation. As long as you have one or more ODBC drivers supported you can use it without having to install a database. You can even use it to interrogate Excel files because Microsoft provides an ODBC driver for that. &lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate database interrogation entry is:&lt;br /&gt;
&lt;br /&gt;
 01000 ! Replace Envdb&lt;br /&gt;
 01020    dim DATABASES$(1)*100&lt;br /&gt;
 01040    dim DATABASE$*100&lt;br /&gt;
 01060    dim TABLES$(1)*100&lt;br /&gt;
 01080    dim TABLE$*100&lt;br /&gt;
 01100    dim COLUMNS$(1)*100&lt;br /&gt;
 01120    dim COLUMN$*100&lt;br /&gt;
 01140    dim C$*100,FLD1$*40,FLD2$*40,FLD3$*40,FLD4$*40&lt;br /&gt;
 01160    execute &amp;quot;CONFIG database testdb odbc-manager&amp;quot;&lt;br /&gt;
 01180 !   Execute &amp;quot;CONFIG database testdb DSN=&#039;Accounts Payable&#039;&amp;quot;&lt;br /&gt;
 01220 !   Execute &amp;quot;CONFIG database testdb connectstring=&amp;quot;&amp;quot;DSN=Excel Files;DBQ=L:\orders\Beneficial - A-PORCEL.xls;DefaultDir=L:\orders;DriverId=1046;MaxBufferSize=2048&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 01230 ! *****  Open Output File&lt;br /&gt;
 01240    open #1: &amp;quot;name=envdb.txt,replace&amp;quot;,display,output &lt;br /&gt;
 01420 Dump_Table: ! ***** Dump Table Layout&lt;br /&gt;
 01440    let OUTFD = 1&lt;br /&gt;
 01460    let ENV$(&amp;quot;status.database.LIST&amp;quot;, MAT DATABASES$)  !List of db&#039;s&lt;br /&gt;
 01480    for DATABASE=1 to UDIM(DATABASES$)  !For each connected database&lt;br /&gt;
 01500       let DATABASE$=DATABASES$(DATABASE)&lt;br /&gt;
 01520       let FNSHOW_DATABASE(DATABASE$, &amp;quot;status.database.&amp;quot;&amp;amp;DATABASE$)&lt;br /&gt;
 01540    next DATABASE&lt;br /&gt;
 01560    end &lt;br /&gt;
 01580 ! &lt;br /&gt;
 01600    def FNSHOW_DATABASE(DATABASE$*100, ST_PREFIX$*100)&lt;br /&gt;
 01620       print #OUTFD: DATABASE$&lt;br /&gt;
 01640       let OUT_PREFIX$=CHR$(9)&lt;br /&gt;
 01660       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;DSN=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DSN&amp;quot;)&lt;br /&gt;
 01680       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;CONNECTSTRING=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.CONNECTSTRING&amp;quot;)&lt;br /&gt;
 01700       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Tables:&amp;quot;&lt;br /&gt;
 01720       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.TABLES&amp;quot;&lt;br /&gt;
 01740       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT TABLES$)&lt;br /&gt;
 01760       for TABLE = 1 to UDIM(MAT TABLES$)&lt;br /&gt;
 01780          let TABLE$=TABLES$(TABLE)&lt;br /&gt;
 01800          let FNSHOW_TABLE(TABLE$, ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;TABLE$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 01820       next TABLE&lt;br /&gt;
 01840    fnend &lt;br /&gt;
 01860 ! &lt;br /&gt;
 01880    def FNSHOW_TABLE(TABLE$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 01900       print #OUTFD: OUT_PREFIX$&amp;amp;TABLE$&lt;br /&gt;
 01920       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 01940       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table remarks=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.REMARKS&amp;quot;)&lt;br /&gt;
 01960       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 01980       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Columns:&amp;quot;&lt;br /&gt;
 02000       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.COLUMNS&amp;quot;&lt;br /&gt;
 02020       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT COLUMNS$)&lt;br /&gt;
 02040       for COLUMN = 1 to UDIM(MAT COLUMNS$)&lt;br /&gt;
 02060          let COLUMN$=COLUMNS$(COLUMN)&lt;br /&gt;
 02080          let FNSHOW_COLUMN(COLUMN$, ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;COLUMN$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 02100       next COLUMN&lt;br /&gt;
 02120    fnend &lt;br /&gt;
 02140 ! &lt;br /&gt;
 02160    def FNSHOW_COLUMN(COLUMN$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 02180       print #OUTFD: OUT_PREFIX$&amp;amp;COLUMN$&lt;br /&gt;
 02200       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 02220       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 02240       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column length=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LENGTH&amp;quot;)&lt;br /&gt;
 02260       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column decimals=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DECIMALS&amp;quot;)&lt;br /&gt;
 02280    fnend&lt;br /&gt;
&lt;br /&gt;
==  BR DATA ENCRYPTION==&lt;br /&gt;
&lt;br /&gt;
Encryption encompasses a number of different operations.  These operations can be used independently or in combination to meet different needs.  We use industry standard encryption available through OpenSSL.  Three technologies are widely used for encrypting data. BR supports the first two listed below through its ENCRYPT and DECRYPT functions. &lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
1. Symmetric key ciphers – where the same key is used to encrypt and decrypt data.  You can specify a key to encrypt some data and later use the same key to decrypt the data.&lt;br /&gt;
&lt;br /&gt;
2. Hashing routines – one way routines that take data and convert it to a hash value.  Sometimes these are thought of as checksums such as MD5 sum.  Hash values are always the same length regardless of how big the hashed data is.  A 10 gb file will have a hash result that is the same length as a 200 byte file.  Hashing routines have a number of specific uses.&lt;br /&gt;
&lt;br /&gt;
1. Verify that data has not changed.&lt;br /&gt;
&lt;br /&gt;
2. Verifying that two files are the same.&lt;br /&gt;
&lt;br /&gt;
3. Validating passwords – this is based on the concept that if two values have the same hash value the values are equal.  Using this technique improves security because it allows a server to store passwords in an unrecoverable format.  Even the server software is unable to regenerate the original password.  It is only capable of checking if the hash of a password matches the stored password hash.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Symmetric Key Ciphers===&lt;br /&gt;
&lt;br /&gt;
There are two encryption functions in the BR language, ENCRYPT$ and DECRYPT$.&lt;br /&gt;
&lt;br /&gt;
 ENCRYPT$(Data$ [,Key$ [,Encryption-type$, [,Initialization-vector$]]])&lt;br /&gt;
 DECRYPT$(Data$ [,Key$ [,Encryption-type$, [,Initialization-vector$]]])&lt;br /&gt;
&lt;br /&gt;
Data$ - The data to be encrypted&lt;br /&gt;
&lt;br /&gt;
Key$ - The secret key to be used for encryption.  If not specified this value will come from an OPTION 66 statement.&lt;br /&gt;
&lt;br /&gt;
Encryption-type$ - The type of encryption to be done.  If not specified, a common high strength encryption type will be employed.  This is described in more detail below, but is generally only useful for interfacing with other typically non-BR programs.&lt;br /&gt;
&lt;br /&gt;
Initialization-vector$ - This is an arcane part of encryption standards.  It exists to prevent attackers from being able to tell whether the unencrypted data has changed.  This is described in more detail below, but is general only needed when interfacing with other non-BR programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfacing With Other Programs (encryption type and initialization vector)===&lt;br /&gt;
&lt;br /&gt;
There are a number of different types of encryption that BR supports through OpenSSL:  AES, BLOWFISH, DES, triple DES, RC4 and RC2.  Most symmetric key ciphers are block ciphers meaning that they encrypt one block at a time.  This means if you have a bit message, it is broken up into multiple blocks and each block is encrypted.  The block size can be set as (128, 192, 256) bits.  Some encryption types don&#039;t support all of these values so STATUS ENCRYPTION should be checked to see what encryption types are available in BR.  Besides block size, there are also various schemes for blocking data.  One might expect that using 256 bit blocking would simply take every 32 bytes and call it a block.  This is not done though because there is a possibility that this would cause patterns in the encrypted data.  To prevent this, there are various schemes known as codebooks which change the way data is blocked.  Wikipedia explains this in more detail.  If the encryption type is not specified AES:256:CBC:128 will be used.  To be compatible with other programs the entire encryption type must be specified (cipher: key length: codebook: invitialization vector length).&lt;br /&gt;
&lt;br /&gt;
Initialization-vector – this is used to cause the same data encrypted with the same key to have a different encrypted result.  This is significant because otherwise an attacker looking at data seeing the same encrypted result twice would know that the key and the unencrypted data have not changed.  Regardless of whether or not you are concerned about this potential security issue, the standard encryption methods require this value so interfacing with other programs may require you to use it.  It is a common practice to use a random number for this value and store the value at the beginning of (ahead of) the encrypted result.  This is what BR does if this parameter is omitted.&lt;br /&gt;
&lt;br /&gt;
As an example:&lt;br /&gt;
 ENCRYPT$(“test”, “key”) &lt;br /&gt;
Produces a string containing “random number initialization vector”&amp;amp;”encrypted result”.&lt;br /&gt;
&lt;br /&gt;
If the initialization vector is explicitly specified as in:&lt;br /&gt;
ENCRYPT$(“test”, “key”, “AES:256:CBC:128”, “RANDOM”) &lt;br /&gt;
the result would be simply “encrypted result”.&lt;br /&gt;
&lt;br /&gt;
DECRYPT$ has the same arguments as ENCRYPT$ with the exception of the first parameter which is the encrypted data.  DECRYPT$ expects to be used with the same key$, encryption-type$, and initialization-vector$ as was used to encrypt the data.  As with ENCRYPT$, if key$ is not specified, the value from the OPTION statement will be used.  If encryption-type$ is not specified, “AES:256:CBC:128” will be used.  If the initialization vector is not specified, it will be assumed that the encrypted data starts with an initialization vector.&lt;br /&gt;
&lt;br /&gt;
=== Hashing Routines===&lt;br /&gt;
&lt;br /&gt;
Three common forms of hashing are allowed in BR.  They are MD5, SHA, and SHA-1.  These are also provided through the ENCRYPT$ function specifying a null key$ value:&lt;br /&gt;
&lt;br /&gt;
ENCRYPT$(data$, “”, “MD5”)&lt;br /&gt;
ENCRYPT$(data$, “”, “SHA”)&lt;br /&gt;
ENCRYPT$(data$, “”, “SHA-1”)&lt;br /&gt;
&lt;br /&gt;
Hashing is also referred to as Message Digests or digests.  This is what the MD in MD5 means.  There is no way to restore data that has been hashed.   Hashing is a one way function so DECRYPT$ will yield an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Asymmetric Encryption===&lt;br /&gt;
&lt;br /&gt;
Asymmetric key encryption is also known as public/private key encryption. &lt;br /&gt;
&lt;br /&gt;
Public/private keys are created as a pair by a key generator.  They are a pair, and it is not possible to have two public keys for the same private key or vice versa.   With regard to public/private key pairs, what one key encrypts the other key can decrypt, and neither key can decrypt what it has encrypted.  When a private key is used to encrypt data, the result is called a signature because everyone who has the public key can decrypt it.&lt;br /&gt;
&lt;br /&gt;
This technique is used for:&lt;br /&gt;
&lt;br /&gt;
Signing (using certificates) – A private key can be used to sign data.  The result of such signing can be tested/validated with the corresponding public key. &lt;br /&gt;
&lt;br /&gt;
Data encryption – A public key can be used to encrypt data.  This data can then only be decrypted by the corresponding private key. &lt;br /&gt;
&lt;br /&gt;
Hashes and signing are different but used together.  Rather than signing a large block of data which would create a large signature, only the hash is signed to create much smaller fixed length signature data.  When verifying a large block of signed data, the data is used to create a hash value and the hash value is compared to a decrypted signature.&lt;br /&gt;
&lt;br /&gt;
Asymmetric encryption is not accessible through the BR ENCRYPT$, DECRYPT$ functions.  However, it is used by our SSL client server connections and HTTPS.  Certificates are most commonly used by SSL and HTTPS and are less useful for other application processes. In the Client Server model the client knows the server’s public key and the server uses its private key to encrypt and decrypt.&lt;br /&gt;
&lt;br /&gt;
Encryption is invoked by Business Rules HTTP support as follows:&lt;br /&gt;
&lt;br /&gt;
 CONFIG HTTPS PORT port-number   [ LOG file-pathname ]&lt;br /&gt;
 CONFIG OPTION  66   private-key-file-encryption-password&lt;br /&gt;
 OPEN #400: “HTTP=SERVER”, DISPLAY, OUTIN&lt;br /&gt;
&lt;br /&gt;
The BRSERVER executable directory must contain two files: &lt;br /&gt;
* https-private.pem&lt;br /&gt;
* https-cert.pem&lt;br /&gt;
&lt;br /&gt;
These files are made by the following commands under Linux, MAC and cygwin for Windows:&lt;br /&gt;
openssl req -new -x509 -out httpserver.pem -days 10000&lt;br /&gt;
&lt;br /&gt;
( this will prompt for the OPTION 66 password )&lt;br /&gt;
&lt;br /&gt;
 mv privkey.pem   https-private.pem&lt;br /&gt;
 mv httpserver.pem   https-cert.pem&lt;br /&gt;
&lt;br /&gt;
This port specific service can then be accessed with browsers. When the specified port is accessed through a browser, BR establishes an HTTPS connection rather than an HTTP connection.  &lt;br /&gt;
&lt;br /&gt;
=== Signing and Certificate Processing Industry Standards===&lt;br /&gt;
&lt;br /&gt;
Certain companies are authorized by the government to act as a Certificate Authority ( CA ). These companies ( e.g. Verisign ) issue electronic certificates which can be used to issue second level certificates. Certificates can have expiration dates and the line of authority extends from a CA to any number of levels (but a chain is only as strong as its weakest link). Certificates contain a list of signatures (described below) that trace back to a CA as follows: &lt;br /&gt;
&lt;br /&gt;
When a company needs to obtain a certificate from a CA, it prepares its own certificate and sends it to the CA for signature. The CA provides the signature and the CA’s own public key for validating it. The text in such certificates will identify the signing authority ( CA ) and the recipient of the certificate. It also contains the public key of both the signer and the recipient. &lt;br /&gt;
&lt;br /&gt;
Browsers know the CA identities and their public keys. A browser can verify a CA issued cert by hashing it, decrypting the signature with the known public key and matching the decrypted signature against the hash total. &lt;br /&gt;
 &lt;br /&gt;
Any company that is issued a certificate by a CA can sign second level certificates issued to third parties. A second level cert contains the parent (CA issued) certificate, and includes the public keys of the issuer and the recipient. The signature is essentially the encrypted hash total of ‘itself plus all of its ancestors’. Additional levels each contain the chain of certificates leading from a CA issued cert to itself. &lt;br /&gt;
&lt;br /&gt;
Ostensibly, a certificate cannot be counterfeited because it requires the signature of its parent which can only be produced with its parent’s private key.  By providing both public keys ( signer and recipient ) in all certs along with signatures, a non-forgeable or alterable chain is established. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
CA public key – known to browser&lt;br /&gt;
certificate 1 (signed by CA)&lt;br /&gt;
certificate 2 (signed by second level - includes certificate 1)&lt;br /&gt;
final certificate (signed by third level - includes certificate 2)&lt;br /&gt;
 &lt;br /&gt;
A browser would find the CA information in the certificate and check to see if it is in the browser’s internal list.  If not it fails.  Then it verifies that certificate 1 (which ends up being part of the final certificate) has been signed by the CA.  After that it checks certificate 2 and verifies that it has been signed with certificate 1.  Finally it checks the final certificate and verifies that it has been signed with certificate 2.&lt;br /&gt;
 &lt;br /&gt;
To assure the line authority of any certificate, the public keys are associated with signers, not with documents.&lt;br /&gt;
&lt;br /&gt;
== ODBC VERSION 4.3==&lt;br /&gt;
&lt;br /&gt;
Improved installation routines:&lt;br /&gt;
Easy to use&lt;br /&gt;
Compatible with Windows Vista/7&lt;br /&gt;
Compatible with 64 Bit Machines (both 32 and 64 bit drivers).&lt;br /&gt;
Easily create DNS entries from the CONTEXT using a BR program called CREATE_INI.BR. (You will need to tailor the resulting INI file to the target setting.)&lt;br /&gt;
Installation on a client can be done from a command line avoiding the need for human interaction at the client. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Support for 64 bit Record Locking (No 2GB Limit!).&lt;br /&gt;
Implemented Dynamic (on the fly) Indexes.&lt;br /&gt;
The ODBC splash screen has been removed.&lt;br /&gt;
&lt;br /&gt;
ODBC Logging:&lt;br /&gt;
*Set Logging to level 6 or greater.&lt;br /&gt;
*LOGGING 6, C:\ODBC-LOG.TXT&lt;br /&gt;
*Log file will provide helpful information to analyze queries.&lt;br /&gt;
*Actual SQL processed by Driver (As opposed to the SQL typed in MS-Access or MS-Excel)&lt;br /&gt;
*Indexes used by the Query. (To help determine the &amp;quot;BEST Query&amp;quot; for performance).&lt;br /&gt;
&lt;br /&gt;
More Robust:&lt;br /&gt;
*Improved Date Handling (Sort/Filter, etc).&lt;br /&gt;
*Improved Joins leverage &amp;amp;/or create indexes for performance.&lt;br /&gt;
*Improved Group By queries&lt;br /&gt;
*Improved &amp;quot;Like&amp;quot; filters.&lt;br /&gt;
*Improved Multiple Filters in a single query&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ODBC Licensing And Security===&lt;br /&gt;
&lt;br /&gt;
Licenses will be issued based on number of workstations or number of BR WSIDs.&lt;br /&gt;
&lt;br /&gt;
The price per user for licensing based on the number of BR WSIDs is one half of the price based on the number of ODBC workstations. &lt;br /&gt;
&lt;br /&gt;
The maximum license fee for ODBC is $4900.&lt;br /&gt;
&lt;br /&gt;
====Enforcement====&lt;br /&gt;
If the ODBC license is based on the number of BR users, then the BRSERIAL.DAT file always specifies 999 users. &lt;br /&gt;
&lt;br /&gt;
We assign a random number to each machine that uses the ODBC driver and another random number to each user of ODBC. These numbers are stored along with the date, encrypted in a table in the server and client registries.  Each time a session is started, the client is checked for pre-existing control numbers and if they exist then the numbers are used for the session (along with the current date). If a client reports a pre-existing number less than 14 days old that is not in the server table, then an alarm is signaled. This indicates tampering with the server table.&lt;br /&gt;
&lt;br /&gt;
When a control number pair is about to be added to the server table and the table is full then it is searched for an entry more than 14 days old for replacement. If no such entry exists, then a “maximum users exceeded” error message is presented. &lt;br /&gt;
&lt;br /&gt;
When a computer is replaced, this can leave an unusable entry in the server table for up to 14 days. If this occurs, then the user can run a program on the server that writes an encrypted header with the current date to the server table indicating that the table has been cleared in a licensed manner.  After this has been run, all entries in the table will be available for reuse.  Clients that have pre-existing control numbers will not generate the tamper error when the license file is cleared in this manner unless the client last used date is greater than the encrypted header date. This program requires a password which is an encrypted form of the current date plus the serial number. Only the dealer has the password producing program so only the dealer can obtain the current day’s password. &lt;br /&gt;
&lt;br /&gt;
When a client machine has more than two ODBC user entries, the entries greater than&lt;br /&gt;
one are counted as separate workstations. e.g. 1 or 2 -&amp;gt;1, 3-&amp;gt;2, 4-&amp;gt;3, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Procedure for Utilizing MS Access ODBC Middleware ===&lt;br /&gt;
&lt;br /&gt;
A procedure has been established for greatly expanding the SQL capabilities of the BR ODBC driver by routing ODBC requests through MS Access. Using this technique one can create reusable queries that combine several tables. This procedure is described in the installation guide. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  PRINT FONT STRETCHING==&lt;br /&gt;
&lt;br /&gt;
When we developed the PDF printing facility we encountered a problem getting PDF to print exactly like NWP and PCL.  This was partly because early in NWP development we stretched the fixed width fonts vertically for maximum legibility. So in version 4.2 we adopted a default font that was more like PCL that we could print in both NWP and PDF.&lt;br /&gt;
&lt;br /&gt;
However, we eventually returned to the older stretched fonts because of their superior legibility. This issue affects only fixed width fonts. This stretching can be disabled with OPTION 68. &lt;br /&gt;
&lt;br /&gt;
We are now using Courier New as the default font.  pdflib4-Win32.dll adds support for this stretching to our PDF capabilities.&lt;br /&gt;
&lt;br /&gt;
Relative Font Heights ( height to width ratios ):&lt;br /&gt;
    Native Courier New  1.6 		- available in PCL -&lt;br /&gt;
    Native Letter Gothic  2.0		- available in PCL -&lt;br /&gt;
    Stretched Fonts 2.6		- NWP and PDF only -&lt;br /&gt;
&lt;br /&gt;
The 1.6, 2.0, 2.6 are ratios.  For Courier New the 1.6 means that the font is 1.6 times as high as it is wide.  PCL measures all fixed width fonts in width and calculates the height based on these ratios.  So for Courier New a 10 CPI font would be 1.6 * (1 / 10)(CPI) * 72 (points per inch) = 11.52 points.  Actually the ratio for Courier New appears to be 1.66666666.  This would mean that 1.66666666 * (1/10) * 72 = 12 points.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  EXTENDED DATE / TIME FUNCTIONS==&lt;br /&gt;
&lt;br /&gt;
Date numeric variables can now represent time of day in the fractional space (to the right of the decimal point). The DAYS and DATE masks have been extended as follows:&lt;br /&gt;
&lt;br /&gt;
H#.## or H denotes hours [ with fractions ].&lt;br /&gt;
M#.### or M#.# denotes minutes.&lt;br /&gt;
S#.####, S or S# denotes seconds.&lt;br /&gt;
&lt;br /&gt;
M, to the right of H always denotes minutes, so H:M:S is sufficient.&lt;br /&gt;
Either AM or PM, to the right of H denotes AM / PM output.&lt;br /&gt;
The absence of AM and PM denote military hours (0 – 23).&lt;br /&gt;
The maximum significant digits that can be represented in a numeric variable are 15. So if century, year, month and day are stored as a 5 digit day of century, then internally up to ten digits to the right of the decimal are available for time of day. &lt;br /&gt;
&lt;br /&gt;
Extended Date Mask Examples:&lt;br /&gt;
 DATE( “Month dd, ccyy at H#.## hours”)  -&amp;gt;  September 12, 2011 at 14.58 hours&lt;br /&gt;
 DATE( “mm/dd/yy at H:M AM”)  -&amp;gt;  09/15/11 at 2:35 PM&lt;br /&gt;
 DATE( “mon dd cy at H#:M# PM”)  -&amp;gt;  Sep 15 2011 at 02:35 PM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example of using DATE$ to get time to 9 decimal places:&lt;br /&gt;
 Date$(&amp;quot;H#:M#:S#.#########&amp;quot;) -&amp;gt; 14:06:22.968419347&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When storing date/time combinations on disk, you should allow for all of the significant digits that your date mask supports on each side of the decimal point. A “BH 4” form supports nine significant digits, which is suitable for day of century plus a four digit fraction. To exceed that you can use either PD 6, PD 7, PD 8 or D 8 (double floating point) to store these values on disk.  DATE() only works with day-of-century values along with an optional time fraction.&lt;br /&gt;
&lt;br /&gt;
==  NEW DATE MASK INPUT PROCESSING==&lt;br /&gt;
&lt;br /&gt;
DATE(mask) can now be used as an INPUT FIELDS specification.&lt;br /&gt;
&lt;br /&gt;
10 INPUT FIELDS “row, col, DATE(mask)  ,UH” : date-var&lt;br /&gt;
&lt;br /&gt;
Special keyboard processing:&lt;br /&gt;
Punctuation (commas, colons, slashes, semicolons, and dashes) is skipped during entry similar to PIC.&lt;br /&gt;
Insert and delete are supported within subfields that are delineated by punctuation.&lt;br /&gt;
Copy includes punctuation.&lt;br /&gt;
Cut is Copy with redisplay of zero date.&lt;br /&gt;
Paste causes BR to translate the date to DAYS format and then display the date. Excel and OpenOffice Calc application formats are supported.&lt;br /&gt;
If a string is pasted, it is first converted to DAYS using the provided mask.&lt;br /&gt;
If a zero DAYS value is displayed then Month, M3, Day and D3 mask positions contain dashes.&lt;br /&gt;
&lt;br /&gt;
A date picker has been added. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A new configuration statement is provided to control the when the date picker appears:&lt;br /&gt;
&lt;br /&gt;
DATE   [ALWAYS]  [INVALID]  [NEVER]&lt;br /&gt;
&lt;br /&gt;
Additionally, the leading attribute ^DATE_PICKER is available.&lt;br /&gt;
&lt;br /&gt;
INVALID ( the default mode ) presents the date picker whenever the days value of the expressed date is zero.&lt;br /&gt;
&lt;br /&gt;
ALWAYS and ^DATE_PICKER show the picker whenever the cursor is in the field until a date is selected from the picker.  Leaving the field and reentering it actives the picker again. &lt;br /&gt;
&lt;br /&gt;
When in the date picker the following keys are active:&lt;br /&gt;
Shift- PgUp/PgDn – Go to the previous/next month&lt;br /&gt;
Ctrl- PgUp/PgDn – Go to the previous/next year&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate date entry is:&lt;br /&gt;
01000 ! Rep Date_Input&lt;br /&gt;
01020 ! Demonstrate The New Date() Input Format&lt;br /&gt;
01040 ! Skip Punctuation (Commas, Colons, Slashes, Semicolons, And Dashes)&lt;br /&gt;
01060 ! Insert And Delete Within Subfields That Are Delineated By Punctuation&lt;br /&gt;
01080 ! Continue To Support Cut And Paste Including Punctuation&lt;br /&gt;
01100 ! &lt;br /&gt;
01120    rinput fields &amp;quot;5,10,DATE(mm/dd/yy) ;6,10,c&amp;quot;: DATE_VAR&lt;br /&gt;
01140    print fields &amp;quot;8,10,date(Month DD, CCYY)&amp;quot;: DATE_VAR&lt;br /&gt;
01160 ! &lt;br /&gt;
01180    rinput fields &amp;quot;12,10,date(month dd, ccyy)&amp;quot;: DATE_VAR&lt;br /&gt;
01200    if NOT DATE_VAR then goto 1180&lt;br /&gt;
01220    print fields &amp;quot;15,10,date(yy/mm/dd)&amp;quot;: DATE_VAR &lt;br /&gt;
01240    print fields &amp;quot;18,10,N 6&amp;quot;: DATE_VAR  !Show days format&lt;br /&gt;
&lt;br /&gt;
         &lt;br /&gt;
&lt;br /&gt;
==  NEW TEXT FIELD FORMAT==&lt;br /&gt;
&lt;br /&gt;
10  (R)INPUT FIELDS “row, col, TEXT rows/cols[/capacity],  leading-attr,  …”:&lt;br /&gt;
&lt;br /&gt;
This format is similar to the C/V/G format with the ^ENTER_LF attribute except:&lt;br /&gt;
No trailing space padding or trimming occurs.&lt;br /&gt;
Rows and columns are specified.&lt;br /&gt;
Field capacity or newlines can cause a vertical scrollbar to appear.&lt;br /&gt;
&lt;br /&gt;
Supported leading attributes are ^ENTER_LF (the default), ^ENTER_CRLF and ^NOWRAP.&lt;br /&gt;
The TEXT keyword will imply ^ENTER_LF unless ^ENTER_CRLF is specified.&lt;br /&gt;
&lt;br /&gt;
^ENTER_LF (the default) causes the ENTER key to add LF characters to the data and to go to a new line left justified. The cursor will retrace the data when backspace or left-arrow is keyed, meaning the on-screen LF characters are represented by moving the cursor, instead of allowing it to rest on invisible LF characters.&lt;br /&gt;
&lt;br /&gt;
^ENTER_CRLF may be specified in lieu of ^ENTER_LF. When that is the case, carriage returns entered are represented in the data as carriage-return-linefeed (CRLF) character pairs.  ^NOWRAP may be specified to suppress word wrapping. When ^NOWRAP is active, data is entered on the current line until ENTER is keyed to go to the next line. Both horizontal and vertical scroll bars appear as needed.&lt;br /&gt;
&lt;br /&gt;
Tabs are entered into the text. Shift-tab is ignored.&lt;br /&gt;
&lt;br /&gt;
Home, End and the arrow keys all operate relative to the current line as opposed to operating on the text box as a whole.&lt;br /&gt;
&lt;br /&gt;
Depressing the Control key causes the following keys to operate in the normal string entry mode:&lt;br /&gt;
&lt;br /&gt;
*Enter – Returns control to the BR program&lt;br /&gt;
*Tab – Goes to the next control&lt;br /&gt;
*Shift-Tab – Goes to the prior control&lt;br /&gt;
*Home – Goes to the beginning of data or the first field&lt;br /&gt;
*End – Goes to the end of data or the last field&lt;br /&gt;
*Left-Arrow/Up-Arrow – Goes to the prior control&lt;br /&gt;
*Right-Arrow/Down-Arrow – Goes to the next control&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[CurPos]] introduced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate TEXT entry is:&lt;br /&gt;
 01000 ! Rep Text&lt;br /&gt;
 01020 ! Test New Text Fiueld Type&lt;br /&gt;
 01040    dim TEXT$*300, TEXT$(1)*80&lt;br /&gt;
 01060    print NEWPAGE&lt;br /&gt;
 01080    rinput fields &amp;quot;3,10,text 4/40/300,uh&amp;quot;: TEXT$&lt;br /&gt;
 01100    print fields &amp;quot;10,10,c&amp;quot;: TEXT$&lt;br /&gt;
 01120    print TEXT$&lt;br /&gt;
 01140    let STR2MAT(TEXT$, MAT TEXT$, CHR$(10))&lt;br /&gt;
 1160 rint MAT TEXT$&lt;br /&gt;
&lt;br /&gt;
==  INPUT ACROSS MULTIPLE WINDOWS==&lt;br /&gt;
&lt;br /&gt;
10  (R)INPUT FIELDS  #121: “10, 10, C 20, UH; 10, 12, PIC(##/##/##), UH;#124,&lt;br /&gt;
10, 10, C 30, UH”: aaa$, bbb$, ccc$&lt;br /&gt;
&lt;br /&gt;
This will input the first two fields on window #121 and the third field on window #124.  The ‘#window-number,’ prefix may appear in any row, col FIELDS specification and it overrides the window number that follows the PRINT/INPUT/RINPUT keyword. &lt;br /&gt;
&lt;br /&gt;
== CONFIG CONSOLE CHANGES==&lt;br /&gt;
&lt;br /&gt;
[[Console]] [[BRConfig.sys]] specification  introduced.&lt;br /&gt;
&lt;br /&gt;
==  BR IN A BROWSER==&lt;br /&gt;
&lt;br /&gt;
We have made it easy to setup BR in a Browser once you have Client Server working. &lt;br /&gt;
Point your browser at ads.net/plugin for a demonstration. Located in that directory is a file called index.html which is also on the FTP site in the BETA release browser-plugin directory.  Modify this file to setup your own web page. &lt;br /&gt;
&lt;br /&gt;
This HTML file demonstrates activation of BR client server in a browser. It first checks to see if the plugin is installed and if not it installs it. If needed, it updates the plugin from the ads.net site. It then initiates a connection to the server just like the BR client does. See the HTML file for further instructions, including how to confine BR to a window on the launch page if desired. &lt;br /&gt;
&lt;br /&gt;
A new OPTION 70 is provided which will default to being ON in the Browser version.  OPTION 70 will do the same thing as 54 (exit if BR enters command console mode), but it will be configurable to:&lt;br /&gt;
OPTION 70 OFF		! This can be set programmatically&lt;br /&gt;
OPTION 70 ON		! Same as OPTION 54 – the default for browsers&lt;br /&gt;
OPTION 70 RELAXED	! Mild security – enables some support&lt;br /&gt;
 &lt;br /&gt;
RELAXED mode is intended to allow some debugging but still provide some security.  This means disabling commands such as COPY, DIR, etc., CONFIG commands, and preventing changes from being made to BR programs. However, the security can be defeated  because all of these activities can be performed by programs or procedures. Use ON (the default) for high security. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  NEW AND CHANGED ERROR CODES==&lt;br /&gt;
* [[0000]] Successful completion no error&lt;br /&gt;
* [[0050]] Writing to BTREE2 file failed&lt;br /&gt;
* [[0059]] DEPRECATED ERROR: attempt to rewrite over key&lt;br /&gt;
* [[0063]] DEPRECATED ERROR: network locking error&lt;br /&gt;
* [[0417]] MSG string it too long&lt;br /&gt;
* [[0419]] Invalid MSG special char specification&lt;br /&gt;
* [[0436]] Bad flags for MAT2STR or STR2MAT&lt;br /&gt;
* [[0620]] DEPRECATED ERROR: duplicate OPEN for standard printer output&lt;br /&gt;
* [[0641]] DEPRECATED ERROR: missing protection device &lt;br /&gt;
* [[0635]] Error using SSL socket&lt;br /&gt;
* [[0717]] Error deleting record from BTREE2 file&lt;br /&gt;
* [[0727]] DEPRECATED ERROR: FORM variable not referenced&lt;br /&gt;
* [[0807]] Border characters can no longer be specified&lt;br /&gt;
* [[0814]] Bad or missing trailing attribute&lt;br /&gt;
* [[0818]] DEPRECATED ERROR: number too large for PIC format&lt;br /&gt;
* [[0865]] DEPRECATED ERROR: invalid attribute combination&lt;br /&gt;
* [[0887]] Sort column is not valid&lt;br /&gt;
* [[0930]] INPUT FIELDS &amp;quot;...RANGE&amp;quot; bad range variables&lt;br /&gt;
* [[0931]] Invalid insert or delete change with range&lt;br /&gt;
* [[0940]] Value does not match boolean format&lt;br /&gt;
* [[0941]] NULL boolean value used where allow null is false&lt;br /&gt;
* [[0945]] The length of the date format is excessively long&lt;br /&gt;
* [[1008]] Invalid keyword in shell interpreter&lt;br /&gt;
* [[1033]] Scalar variable in an array group&lt;br /&gt;
* [[2022]] The given encryption method does not exist&lt;br /&gt;
* [[2024]] The encryption method is only valid one way&lt;br /&gt;
* [[2026]] Missing encryption key&lt;br /&gt;
* [[2030]] Failed processing encryption&lt;br /&gt;
* [[2070]] DEPRECATED ERROR: not enough memory&lt;br /&gt;
* [[2080]] DEPRECATED ERROR: insufficient dimensioned storage&lt;br /&gt;
* [[2090]] DEPRECATED ERROR: not enough compilation storage&lt;br /&gt;
* [[2100]] Too many active procedures&lt;br /&gt;
* [[2101]] Illegal line number&lt;br /&gt;
* [[2102]] GO attempted without running program&lt;br /&gt;
* [[2103]] Illegal PROC parameter&lt;br /&gt;
* [[2104]] No active lines to run&lt;br /&gt;
* [[2108]] Program is active&lt;br /&gt;
* [[2109]] No program in memory to SAVE or REPLACE&lt;br /&gt;
* [[2111]] Missing lines for a program in object code&lt;br /&gt;
* [[2116]] Cannot SAVE during LOAD or MERGE&lt;br /&gt;
* [[2120]] DEPRECATED ERROR: not enough compilation storage&lt;br /&gt;
* [[2130]] Program changed since LOAD at another workstation&lt;br /&gt;
* [[3031]] DEPRECATED ERROR: 0 bytes available on disk&lt;br /&gt;
&lt;br /&gt;
* [[4002]] SQL create statement failed&lt;br /&gt;
* [[4003]] SQL free statement failed&lt;br /&gt;
* [[4004]] SQL prepare failed&lt;br /&gt;
* [[4005]] SQL clear old results failed&lt;br /&gt;
* [[4006]] SQL execute direct failed&lt;br /&gt;
* [[4007]] WRITE to SQL with incorrect number of data elements&lt;br /&gt;
* [[4008]] SQL describe result set columns failed&lt;br /&gt;
* [[4009]] SQL bind result set columns failed&lt;br /&gt;
* [[4010]] SQL fetch row failed&lt;br /&gt;
* [[4011]] SQL bind parameter failure&lt;br /&gt;
* [[4012]] Prepared SQL execution failure&lt;br /&gt;
* [[4014]] Error converting time stamp to string value or back&lt;br /&gt;
&lt;br /&gt;
* [[4114]] DEPRECATED ERROR: invalid disk or disk drive reference&lt;br /&gt;
* [[4115]] The specified database has not been opened&lt;br /&gt;
* [[4120]] Invalid Y2K data found in an index field&lt;br /&gt;
* [[4121]] DEPRECATED ERROR: invalid use of key file&lt;br /&gt;
* [[4123]] Corrupted BTREE index&lt;br /&gt;
* [[4128]] DEPRECATED ERROR: invalid file name&lt;br /&gt;
* [[4135]] DEPRECATED ERROR: volume ID invalid&lt;br /&gt;
* [[4137]] DEPRECATED ERROR: not enough storage space to create file&lt;br /&gt;
* [[4138]] Can&#039;t rename between client and server&lt;br /&gt;
* [[4140]] DEPRECATED ERROR: shared memory problem&lt;br /&gt;
* [[4141]] DEPRECATED ERROR: shared memory problem&lt;br /&gt;
* [[4142]] DEPRECATED ERROR: too many opened file names&lt;br /&gt;
* [[4143]] DEPRECATED ERROR: out of shared memory&lt;br /&gt;
* [[4144]] DEPRECATED ERROR: network semaphore error&lt;br /&gt;
* [[4145]] Time out while waiting for input from user or ASYNC file I/O&lt;br /&gt;
* [[4147]] A file has been opened too many times at the share level&lt;br /&gt;
* [[4149]] Different version of BR running with locking&lt;br /&gt;
* [[4159]] DEPRECATED ERROR: volume not on line&lt;br /&gt;
* [[4160]] Out of internal file handles&lt;br /&gt;
* [[4174]] Attempted file reservation on non-local file&lt;br /&gt;
* [[4175]] Multiple wbserver files detected&lt;br /&gt;
* [[4177]] DEPRECATED ERROR: windows shell call without command&lt;br /&gt;
* [[4179]] Failed to lock in progress on wbserver.dat&lt;br /&gt;
* [[4180]] Bad drive statement&lt;br /&gt;
* [[4185]] Setting the directory failed on the client side&lt;br /&gt;
* [[4194]] REWRITE check for null bytes failed&lt;br /&gt;
* [[4195]] READ check for null bytes failed&lt;br /&gt;
* [[4196]] WRITE check for null bytes failed&lt;br /&gt;
&lt;br /&gt;
* [[4200]] DEPRECATED ERROR: DOS/Windows/Novell error 0&lt;br /&gt;
* [[4201]] DEPRECATED ERROR: DOS/Windows/Novell error 1&lt;br /&gt;
* [[4202]] DEPRECATED ERROR: DOS/Windows/Novell error 2&lt;br /&gt;
* [[4203]] Path does not exist or is not a directory&lt;br /&gt;
* [[4204]] Too many file handles open on the system level&lt;br /&gt;
* [[4205]] Access is denied&lt;br /&gt;
* [[4206]] Invalid file descriptor&lt;br /&gt;
* [[4207]] DEPRECATED ERROR: DOS/Windows/Novell error 7&lt;br /&gt;
* [[4208]] DEPRECATED ERROR: DOS/Windows/Novell error 8&lt;br /&gt;
* [[4209]] DEPRECATED ERROR: DOS/Windows/Novell error 9&lt;br /&gt;
* [[4210]] DEPRECATED ERROR: DOS/Windows/Novell error 10&lt;br /&gt;
* [[4211]] DEPRECATED ERROR: DOS/Windows/Novell error 11&lt;br /&gt;
* [[4212]] DEPRECATED ERROR: DOS/Windows/Novell error 12&lt;br /&gt;
* [[4213]] DEPRECATED ERROR: DOS/Windows/Novell error 13&lt;br /&gt;
* [[4214]] DEPRECATED ERROR: DOS/Windows/Novell error 14&lt;br /&gt;
* [[4215]] Invalid drive reference&lt;br /&gt;
* [[4216]] Cannot remove directory&lt;br /&gt;
* [[4217]] DEPRECATED ERROR: DOS/Windows/Novell error 17&lt;br /&gt;
* [[4218]] DEPRECATED ERROR: DOS/Windows/Novell error 18&lt;br /&gt;
* [[4219]] I/O error on write protected floppy&lt;br /&gt;
* [[4220]] DEPRECATED ERROR: DOS/Windows/Novell error 20&lt;br /&gt;
* [[4221]] DEPRECATED ERROR: DOS/Windows/Novell error 21&lt;br /&gt;
* [[4222]] DEPRECATED ERROR: DOS/Windows/Novell error 22&lt;br /&gt;
* [[4223]] DEPRECATED ERROR: DOS/Windows/Novell error 23&lt;br /&gt;
* [[4224]] File is too large for locking mode&lt;br /&gt;
* [[4225]] DEPRECATED ERROR: DOS/Windows/Novell error 25&lt;br /&gt;
* [[4226]] DEPRECATED ERROR: DOS/Windows/Novell error 26&lt;br /&gt;
* [[4227]] DEPRECATED ERROR: DOS/Windows/Novell error 27&lt;br /&gt;
* [[4228]] DEPRECATED ERROR: DOS/Windows/Novell error 28&lt;br /&gt;
* [[4229]] DEPRECATED ERROR: DOS/Windows/Novell error 29&lt;br /&gt;
* [[4230]] DEPRECATED ERROR: DOS/Windows/Novell error 30&lt;br /&gt;
* [[4231]] DEPRECATED ERROR: DOS/Windows/Novell error 31&lt;br /&gt;
* [[4232]] DEPRECATED ERROR: DOS/Windows/Novell error 32&lt;br /&gt;
* [[4233]] DEPRECATED ERROR: DOS/Windows/Novell error 33&lt;br /&gt;
* [[4234]] DEPRECATED ERROR: DOS/Windows/Novell error 34&lt;br /&gt;
* [[4235]] DEPRECATED ERROR: DOS/Windows/Novell error 35&lt;br /&gt;
* [[4236]] DEPRECATED ERROR: DOS/Windows/Novell error 36&lt;br /&gt;
* [[4237]] DEPRECATED ERROR: DOS/Windows/Novell error 37&lt;br /&gt;
* [[4238]] DEPRECATED ERROR: DOS/Windows/Novell error 38&lt;br /&gt;
* [[4239]] Disk is full&lt;br /&gt;
* [[4240]] DEPRECATED ERROR: DOS/Windows/Novell error 40&lt;br /&gt;
* [[4241]] DEPRECATED ERROR: DOS/Windows/Novell error 41&lt;br /&gt;
* [[4242]] DEPRECATED ERROR: DOS/Windows/Novell error 42&lt;br /&gt;
* [[4243]] DEPRECATED ERROR: DOS/Windows/Novell error 43&lt;br /&gt;
* [[4244]] DEPRECATED ERROR: DOS/Windows/Novell error 44&lt;br /&gt;
* [[4245]] DEPRECATED ERROR: DOS/Windows/Novell error 45&lt;br /&gt;
* [[4246]] DEPRECATED ERROR: DOS/Windows/Novell error 46&lt;br /&gt;
* [[4247]] DEPRECATED ERROR: DOS/Windows/Novell error 47&lt;br /&gt;
* [[4248]] DEPRECATED ERROR: DOS/Windows/Novell error 48&lt;br /&gt;
* [[4249]] DEPRECATED ERROR: DOS/Windows/Novell error 49&lt;br /&gt;
* [[4250]] DEPRECATED ERROR: DOS/Windows/Novell error 50&lt;br /&gt;
* [[4251]] DEPRECATED ERROR: DOS/Windows/Novell error 51&lt;br /&gt;
* [[4252]] DEPRECATED ERROR: DOS/Windows/Novell error 52&lt;br /&gt;
* [[4253]] DEPRECATED ERROR: DOS/Windows/Novell error 53&lt;br /&gt;
* [[4254]] DEPRECATED ERROR: DOS/Windows/Novell error 54&lt;br /&gt;
* [[4255]] DEPRECATED ERROR: DOS/Windows/Novell error 55&lt;br /&gt;
* [[4256]] DEPRECATED ERROR: DOS/Windows/Novell error 56&lt;br /&gt;
* [[4257]] DEPRECATED ERROR: DOS/Windows/Novell error 57&lt;br /&gt;
* [[4258]] DEPRECATED ERROR: DOS/Windows/Novell error 58&lt;br /&gt;
* [[4259]] DEPRECATED ERROR: DOS/Windows/Novell error 59&lt;br /&gt;
* [[4260]] DEPRECATED ERROR: DOS/Windows/Novell error 60&lt;br /&gt;
* [[4261]] Printer queue full&lt;br /&gt;
* [[4262]] DEPRECATED ERROR: DOS/Windows/Novell error 62&lt;br /&gt;
* [[4263]] DEPRECATED ERROR: DOS/Windows/Novell error 63&lt;br /&gt;
* [[4264]] DEPRECATED ERROR: DOS/Windows/Novell error 64&lt;br /&gt;
* [[4265]] DEPRECATED ERROR: DOS/Windows/Novell error 65&lt;br /&gt;
* [[4266]] DEPRECATED ERROR: DOS/Windows/Novell error 66&lt;br /&gt;
* [[4267]] DEPRECATED ERROR: DOS/Windows/Novell error 67&lt;br /&gt;
* [[4268]] DEPRECATED ERROR: DOS/Windows/Novell error 68&lt;br /&gt;
* [[4269]] DEPRECATED ERROR: DOS/Windows/Novell error 69&lt;br /&gt;
* [[4270]] End of file&lt;br /&gt;
* [[4271]] Incomplete record&lt;br /&gt;
* [[4272]] Key not found&lt;br /&gt;
* [[4273]] Help keyword or topic not found&lt;br /&gt;
* [[4274]] DEPRECATED ERROR: DOS/Windows/Novell error 74&lt;br /&gt;
* [[4275]] DEPRECATED ERROR: DOS/Windows/Novell error 75&lt;br /&gt;
* [[4276]] Lock does not exist&lt;br /&gt;
* [[4277]] DEPRECATED ERROR: DOS/Windows/Novell error 77&lt;br /&gt;
* [[4278]] DEPRECATED ERROR: DOS/Windows/Novell error 78&lt;br /&gt;
* [[4279]] DEPRECATED ERROR: DOS/Windows/Novell error 79&lt;br /&gt;
* [[4280]]  DEPRECATED ERROR: DOS/Windows/Novell error 80&lt;br /&gt;
* [[4281]] DEPRECATED ERROR: DOS/Windows/Novell error 81&lt;br /&gt;
* [[4282]] Data does not match LINK=&lt;br /&gt;
* [[4283]] Updating previous/next link failed&lt;br /&gt;
* [[4284]] DEPRECATED ERROR: DOS/Windows/Novell error 84&lt;br /&gt;
* [[4285]] DEPRECATED ERROR: DOS/Windows/Novell error 85&lt;br /&gt;
* [[4286]] DEPRECATED ERROR: DOS/Windows/Novell error 86&lt;br /&gt;
* [[4287]] DEPRECATED ERROR: DOS/Windows/Novell error 87&lt;br /&gt;
* [[4288]] DEPRECATED ERROR: DOS/Windows/Novell error 88&lt;br /&gt;
* [[4289]] DEPRECATED ERROR: DOS/Windows/Novell error 89&lt;br /&gt;
* [[4290]] DEPRECATED ERROR: DOS/Windows/Novell error 90&lt;br /&gt;
* [[4291]] DEPRECATED ERROR: DOS/Windows/Novell error 91&lt;br /&gt;
* [[4292]] DEPRECATED ERROR: DOS/Windows/Novell error 92&lt;br /&gt;
* [[4293]] DEPRECATED ERROR: DOS/Windows/Novell error 93&lt;br /&gt;
* [[4294]] DEPRECATED ERROR: DOS/Windows/Novell error 94&lt;br /&gt;
* [[4295]] DEPRECATED ERROR: DOS/Windows/Novell error 95&lt;br /&gt;
* [[4296]] DEPRECATED ERROR: DOS/Windows/Novell error 96&lt;br /&gt;
* [[4297]] DEPRECATED ERROR: DOS/Windows/Novell error 97&lt;br /&gt;
* [[4298]] DEPRECATED ERROR: DOS/Windows/Novell error 98&lt;br /&gt;
* [[4299]] Cannot copy or rename file to itself&lt;br /&gt;
&lt;br /&gt;
* [[4300]] Shell call return value&lt;br /&gt;
* [[4301]] DEPRECATED ERROR: DOS/Windows/Novell error 101&lt;br /&gt;
* [[4302]] DEPRECATED ERROR: DOS/Windows/Novell error 102&lt;br /&gt;
* [[4303]] DEPRECATED ERROR: DOS/Windows/Novell error 103&lt;br /&gt;
* [[4304]] DEPRECATED ERROR: DOS/Windows/Novell error 104&lt;br /&gt;
* [[4305]] DEPRECATED ERROR: DOS/Windows/Novell error 105&lt;br /&gt;
* [[4306]] DEPRECATED ERROR: DOS/Windows/Novell error 106&lt;br /&gt;
* [[4307]] DEPRECATED ERROR: DOS/Windows/Novell error 107&lt;br /&gt;
* [[4308]] DEPRECATED ERROR: DOS/Windows/Novell error 108&lt;br /&gt;
* [[4309]] DEPRECATED ERROR: DOS/Windows/Novell error 109&lt;br /&gt;
* [[4310]] DEPRECATED ERROR: DOS/Windows/Novell error 110&lt;br /&gt;
* [[4311]] DEPRECATED ERROR: DOS/Windows/Novell error 111&lt;br /&gt;
* [[4312]] DEPRECATED ERROR: DOS/Windows/Novell error 112&lt;br /&gt;
* [[4313]] DEPRECATED ERROR: DOS/Windows/Novell error 113&lt;br /&gt;
* [[4314]] DEPRECATED ERROR: DOS/Windows/Novell error 114&lt;br /&gt;
* [[4315]] DEPRECATED ERROR: DOS/Windows/Novell error 115&lt;br /&gt;
* [[4316]] DEPRECATED ERROR: DOS/Windows/Novell error 116&lt;br /&gt;
* [[4317]] DEPRECATED ERROR: DOS/Windows/Novell error 117&lt;br /&gt;
* [[4318]] DEPRECATED ERROR: DOS/Windows/Novell error 118&lt;br /&gt;
* [[4319]] DEPRECATED ERROR: DOS/Windows/Novell error 119&lt;br /&gt;
* [[4320]] Unknown system error see SYSERR function&lt;br /&gt;
* [[4321]] DEPRECATED ERROR: DOS/Windows/Novell error 121&lt;br /&gt;
* [[4322]] DEPRECATED ERROR: DOS/Windows/Novell error 122&lt;br /&gt;
* [[4323]] DEPRECATED ERROR: DOS/Windows/Novell error 123&lt;br /&gt;
* [[4324]] DEPRECATED ERROR: DOS/Windows/Novell error 124&lt;br /&gt;
* [[4325]] DEPRECATED ERROR: DOS/Windows/Novell error 125&lt;br /&gt;
* [[4326]] DEPRECATED ERROR: DOS/Windows/Novell error 126&lt;br /&gt;
* [[4327]] DEPRECATED ERROR: DOS/Windows/Novell error 127&lt;br /&gt;
* [[4328]] DEPRECATED ERROR: DOS/Windows/Novell error 128&lt;br /&gt;
* [[4329]] DEPRECATED ERROR: DOS/Windows/Novell error 129&lt;br /&gt;
* [[4330]] DEPRECATED ERROR: DOS/Windows/Novell error 130&lt;br /&gt;
* [[4331]] DEPRECATED ERROR: DOS/Windows/Novell error 131&lt;br /&gt;
* [[4332]] DEPRECATED ERROR: DOS/Windows/Novell error 132&lt;br /&gt;
* [[4333]] DEPRECATED ERROR: DOS/Windows/Novell error 133&lt;br /&gt;
* [[4334]] DEPRECATED ERROR: DOS/Windows/Novell error 134&lt;br /&gt;
* [[4335]] DEPRECATED ERROR: DOS/Windows/Novell error 135&lt;br /&gt;
* [[4336]] DEPRECATED ERROR: DOS/Windows/Novell error 136&lt;br /&gt;
* [[4337]] DEPRECATED ERROR: DOS/Windows/Novell error 137&lt;br /&gt;
* [[4338]] DEPRECATED ERROR: DOS/Windows/Novell error 138&lt;br /&gt;
* [[4339]] DEPRECATED ERROR: DOS/Windows/Novell error 139&lt;br /&gt;
* [[4340]] Unknown curl error - use -e to return OS error&lt;br /&gt;
* [[4341]] DEPRECATED ERROR: DOS/Windows/Novell error 141&lt;br /&gt;
* [[4342]] DEPRECATED ERROR: DOS/Windows/Novell error 142&lt;br /&gt;
* [[4343]] DEPRECATED ERROR: DOS/Windows/Novell error 143&lt;br /&gt;
* [[4344]] DEPRECATED ERROR: DOS/Windows/Novell error 144&lt;br /&gt;
* [[4345]] DEPRECATED ERROR: DOS/Windows/Novell error 145&lt;br /&gt;
* [[4346]] DEPRECATED ERROR: DOS/Windows/Novell error 146&lt;br /&gt;
* [[4347]] DEPRECATED ERROR: DOS/Windows/Novell error 147&lt;br /&gt;
* [[4348]] DEPRECATED ERROR: DOS/Windows/Novell error 148&lt;br /&gt;
* [[4349]] DEPRECATED ERROR: DOS/Windows/Novell error 149&lt;br /&gt;
* [[4350]] DEPRECATED ERROR: DOS/Windows/Novell error 150&lt;br /&gt;
* [[4351]] DEPRECATED ERROR: DOS/Windows/Novell error 151&lt;br /&gt;
* [[4352]] DEPRECATED ERROR: DOS/Windows/Novell error 152&lt;br /&gt;
* [[4353]] DEPRECATED ERROR: DOS/Windows/Novell error 153&lt;br /&gt;
* [[4354]] DEPRECATED ERROR: DOS/Windows/Novell error 154&lt;br /&gt;
* [[4355]] DEPRECATED ERROR: DOS/Windows/Novell error 155&lt;br /&gt;
* [[4356]] DEPRECATED ERROR: DOS/Windows/Novell error 156&lt;br /&gt;
* [[4357]] DEPRECATED ERROR: DOS/Windows/Novell error 157&lt;br /&gt;
* [[4358]] DEPRECATED ERROR: DOS/Windows/Novell error 158&lt;br /&gt;
* [[4359]] DEPRECATED ERROR: DOS/Windows/Novell error 159&lt;br /&gt;
* [[4360]] DEPRECATED ERROR: DOS/Windows/Novell error 160&lt;br /&gt;
* [[4361]] DEPRECATED ERROR: DOS/Windows/Novell error 161&lt;br /&gt;
* [[4362]] DEPRECATED ERROR: DOS/Windows/Novell error 162&lt;br /&gt;
* [[4363]] DEPRECATED ERROR: DOS/Windows/Novell error 163&lt;br /&gt;
* [[4364]] DEPRECATED ERROR: DOS/Windows/Novell error 164&lt;br /&gt;
* [[4365]] DEPRECATED ERROR: DOS/Windows/Novell error 165&lt;br /&gt;
* [[4366]] DEPRECATED ERROR: DOS/Windows/Novell error 166&lt;br /&gt;
* [[4367]] DEPRECATED ERROR: DOS/Windows/Novell error 167&lt;br /&gt;
* [[4368]] DEPRECATED ERROR: DOS/Windows/Novell error 168&lt;br /&gt;
* [[4369]] DEPRECATED ERROR: DOS/Windows/Novell error 169&lt;br /&gt;
* [[4370]] DEPRECATED ERROR: DOS/Windows/Novell error 170&lt;br /&gt;
* [[4371]] DEPRECATED ERROR: DOS/Windows/Novell error 171&lt;br /&gt;
* [[4372]] DEPRECATED ERROR: DOS/Windows/Novell error 172&lt;br /&gt;
* [[4373]] DEPRECATED ERROR: DOS/Windows/Novell error 173&lt;br /&gt;
* [[4374]] DEPRECATED ERROR: DOS/Windows/Novell error 174&lt;br /&gt;
* [[4375]] DEPRECATED ERROR: DOS/Windows/Novell error 175&lt;br /&gt;
* [[4376]] DEPRECATED ERROR: DOS/Windows/Novell error 176&lt;br /&gt;
* [[4377]] DEPRECATED ERROR: DOS/Windows/Novell error 177&lt;br /&gt;
* [[4378]] DEPRECATED ERROR: DOS/Windows/Novell error 178&lt;br /&gt;
* [[4379]] DEPRECATED ERROR: DOS/Windows/Novell error 179&lt;br /&gt;
* [[4380]] DEPRECATED ERROR: DOS/Windows/Novell error 180&lt;br /&gt;
* [[4381]] DEPRECATED ERROR: DOS/Windows/Novell error 181&lt;br /&gt;
* [[4382]] DEPRECATED ERROR: DOS/Windows/Novell error 182&lt;br /&gt;
* [[4383]] DEPRECATED ERROR: DOS/Windows/Novell error 183&lt;br /&gt;
* [[4384]] DEPRECATED ERROR: DOS/Windows/Novell error 184&lt;br /&gt;
* [[4385]] DEPRECATED ERROR: DOS/Windows/Novell error 185&lt;br /&gt;
* [[4386]] DEPRECATED ERROR: DOS/Windows/Novell error 186&lt;br /&gt;
* [[4387]] DEPRECATED ERROR: DOS/Windows/Novell error 187&lt;br /&gt;
* [[4388]] DEPRECATED ERROR: DOS/Windows/Novell error 188&lt;br /&gt;
* [[4389]] DEPRECATED ERROR: DOS/Windows/Novell error 189&lt;br /&gt;
* [[4390]] DEPRECATED ERROR: DOS/Windows/Novell error 190&lt;br /&gt;
* [[4391]] DEPRECATED ERROR: DOS/Windows/Novell error 191&lt;br /&gt;
* [[4392]] DEPRECATED ERROR: DOS/Windows/Novell error 192&lt;br /&gt;
* [[4393]] DEPRECATED ERROR: DOS/Windows/Novell error 193&lt;br /&gt;
* [[4394]] DEPRECATED ERROR: DOS/Windows/Novell error 194&lt;br /&gt;
* [[4395]] DEPRECATED ERROR: DOS/Windows/Novell error 195&lt;br /&gt;
* [[4396]] DEPRECATED ERROR: DOS/Windows/Novell error 196&lt;br /&gt;
* [[4397]] DEPRECATED ERROR: DOS/Windows/Novell error 197&lt;br /&gt;
* [[4398]] DEPRECATED ERROR: DOS/Windows/Novell error 198&lt;br /&gt;
* [[4399]] File name is not a UNC path&lt;br /&gt;
&lt;br /&gt;
* [[4501]] OS function failure&lt;br /&gt;
* [[4513]] Bad data on OS function&lt;br /&gt;
* [[4514]] No memory on OS function&lt;br /&gt;
* [[4521]] Device not ready&lt;br /&gt;
* [[4522]] Bad system command&lt;br /&gt;
* [[4526]] Not a dos disk&lt;br /&gt;
* [[4591]] A shell call timed out&lt;br /&gt;
* [[4596]] Process signaled&lt;br /&gt;
* [[4597]] Process stopped&lt;br /&gt;
* [[4598]] Process was terminated in an unknown manner&lt;br /&gt;
* [[4614]] Invalid standard handle&lt;br /&gt;
* [[4616]] PDF library initialization failed&lt;br /&gt;
* [[4618]] An error that aborts further reconnect attempts has occurred&lt;br /&gt;
* [[4620]] Client server connection failure&lt;br /&gt;
* [[4890]] Temporary index creation failure&lt;br /&gt;
&lt;br /&gt;
* [[6201]] Spooling error while executing lp or lpr&lt;br /&gt;
* [[6213]] Unknown windows printing error&lt;br /&gt;
* [[6214]] Printing windlg find resource error&lt;br /&gt;
* [[6215]] Printing windlg initialization error&lt;br /&gt;
* [[6216]] Printing windlg load resource error&lt;br /&gt;
* [[6217]] Printing windlg load string failure&lt;br /&gt;
* [[6218]] Printing windlg lock resource failure&lt;br /&gt;
* [[6219]] Printing windlg no memory&lt;br /&gt;
* [[6220]] Printing windlg failed to lock memory&lt;br /&gt;
* [[6221]] Printing windlg no hisntance&lt;br /&gt;
* [[6222]] Printing windlg no hook&lt;br /&gt;
* [[6223]] Printing windlg no template&lt;br /&gt;
* [[6224]] Printing windlg struct size&lt;br /&gt;
* [[6225]] Printing windlg create IC failure&lt;br /&gt;
* [[6226]] Printing windlg default different&lt;br /&gt;
* [[6227]] Printing windlg drag and drop mismatch&lt;br /&gt;
* [[6228]] Printing windlg print dev mode failure&lt;br /&gt;
* [[6229]] Printing windlg error initializing printer&lt;br /&gt;
* [[6230]] Printing windlg error loading driver&lt;br /&gt;
* [[6231]] Printing windlg no default printer&lt;br /&gt;
* [[6232]] Printing windlg no devices&lt;br /&gt;
* [[6233]] Printing windlg parse failure&lt;br /&gt;
* [[6234]] Printing windlg printer not found&lt;br /&gt;
* [[6235]] Printing windlg return default failure&lt;br /&gt;
* [[6236]] Printing windlg setup failure&lt;br /&gt;
* [[6240]] Failed opening printer DC&lt;br /&gt;
* [[6242]] Invalid parametrized substitution format&lt;br /&gt;
* [[6243]] Parameter count does not match using parametrized substitutions&lt;br /&gt;
* [[6244]] Parametrized substitution result is too long&lt;br /&gt;
* [[6245]] Unsupported escape sequence for printing&lt;br /&gt;
* [[6246]] Passthrough printing error&lt;br /&gt;
* [[6247]] Invalid NWP color specification&lt;br /&gt;
* [[6248]] Invalid NWP picture specification or the image is not found&lt;br /&gt;
* [[6250]] Invalid PDF import specification&lt;br /&gt;
* [[6252]] Print PDF requires either READER or an output file name&lt;br /&gt;
* [[6254]] Creating a new PDF document failed&lt;br /&gt;
* [[6255]] Adding a page to a PDF document failed&lt;br /&gt;
* [[6256]] Ending a PDF document failed&lt;br /&gt;
* [[6257]] Adding an image to a PDF document failed&lt;br /&gt;
* [[6270]] Spooling error&lt;br /&gt;
* [[6272]] Bad initializer for PJL mode&lt;br /&gt;
* [[7600]] Invalid or missing key start position&lt;br /&gt;
* [[7601]] Invalid key length&lt;br /&gt;
* [[7602]] Bad key&lt;br /&gt;
* [[7603]] Duplicate keys found&lt;br /&gt;
* [[7604]] Missing parameters for INDEX&lt;br /&gt;
* [[7605]] Invalid index parameter&lt;br /&gt;
* [[7606]] INDEX records in does not match records out&lt;br /&gt;
* [[7607]] Not enough memory for INDEX&lt;br /&gt;
* [[7609]] Attempt to INDEX a file that is not an internal file&lt;br /&gt;
* [[7610]] Invalid INDEX file name&lt;br /&gt;
* [[7611]] INDEX file already exists&lt;br /&gt;
* [[7612]] Invalid INDEX work path&lt;br /&gt;
* [[7636]] INDEX interrupted by user&lt;br /&gt;
* [[7699]] Bad internal record size for INDEX&lt;br /&gt;
* [[7801]] Invalid sort keyword&lt;br /&gt;
* [[7804]] Syntax error in SORT - FILE specification&lt;br /&gt;
* [[7805]] Syntax error in SORT - RECORD specification&lt;br /&gt;
* [[7806]] Syntax error in SORT - ALTS specification&lt;br /&gt;
* [[7807]] Syntax error in SORT - MASK specification&lt;br /&gt;
* [[7809]] Syntax error in SORT - SUM specification&lt;br /&gt;
* [[7810]] Attempt to SORT a file that is not an internal file&lt;br /&gt;
* [[7811]] Not enough memory for SORT&lt;br /&gt;
* [[7812]] Invalid SORT output file type&lt;br /&gt;
* [[7821]] ALTS value is too large&lt;br /&gt;
* [[7823]] Missing MASK specification&lt;br /&gt;
* [[7825]] Too many RECORD statements&lt;br /&gt;
* [[7828]] SORT specifications out of order&lt;br /&gt;
* [[7829]] RECORD specification too long or too many RECORD specifications&lt;br /&gt;
* [[7830]] RECORD lower limit is greater than upper limit&lt;br /&gt;
* [[7831]] Output file record length is too short&lt;br /&gt;
* [[7832]] Output file not empty&lt;br /&gt;
* [[7853]] SORT control file not found&lt;br /&gt;
* [[8001]] DEPRECATED ERROR: number too long&lt;br /&gt;
* [[8002]] Window too small for input&lt;br /&gt;
* [[9000]] Out of memmory&lt;br /&gt;
* [[9001]] work stack is full&lt;br /&gt;
* [[9002]] RPN stack is full&lt;br /&gt;
* [[9003]] Flow stack is full&lt;br /&gt;
* [[9004]] FOR/NEXT stack is full&lt;br /&gt;
* [[9005]] RPN stack is empty&lt;br /&gt;
* [[9006]] Too many nested IF, FOR/NEXT or DO/LOOP structures&lt;br /&gt;
* [[9100]] DEPRECATED ERROR: compiler error&lt;br /&gt;
* [[9111]] Code byte count is incorrect&lt;br /&gt;
* [[9112]] Source byte count is incorrect&lt;br /&gt;
* [[9201]] Invalid access for opening a file&lt;br /&gt;
* [[9203]] Invalid create for opening a file&lt;br /&gt;
* [[9301]] Invalid number of RPN entries&lt;br /&gt;
* [[9302]] Function error&lt;br /&gt;
* [[9303]] Invalid function&lt;br /&gt;
* [[9304]] User defined function error&lt;br /&gt;
* [[9305]] User defined function error&lt;br /&gt;
* [[9306]] User defined function stacking error&lt;br /&gt;
* [[9307]] No editor defined or invalid ON error statement&lt;br /&gt;
* [[9308]] Utility open file channel is not open&lt;br /&gt;
* [[9309]] Corrupt .BR/.WB program file encountered&lt;br /&gt;
* [[9310]] Variable index outside of variable table&lt;br /&gt;
* [[9400]] DEPRECATED ERROR: output file corrupted&lt;br /&gt;
* [[9401]] BTREE verification failed&lt;br /&gt;
* [[9502]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9503]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9504]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9505]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9506]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9507]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9508]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9985]] DEPRECATED ERROR: work file missing&lt;br /&gt;
* [[9987]] No source exists for the given file&lt;br /&gt;
* [[9988]] DEPRECATED ERROR: source line greater than 800 bytes&lt;br /&gt;
* [[9990]] This version was made without HTTP support&lt;br /&gt;
* [[9992]] DEF statement compiler error&lt;br /&gt;
* [[9994]] Line reference indicates library, but no libraries active&lt;br /&gt;
* [[9995]] DEPRECATED ERROR: RPN stack failure&lt;br /&gt;
* [[9996]] Library program not found or internal line not found&lt;br /&gt;
* [[9997]] Unbalanced parenthesis or flow stack error&lt;br /&gt;
* [[9998]] Corrupt DIM source&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Needs Help]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Release 4.3]]&lt;br /&gt;
[[Category:Release Notes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.3&amp;diff=10821</id>
		<title>4.3</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.3&amp;diff=10821"/>
		<updated>2017-01-16T19:39:50Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* Open SQL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The prior version was [[4.2]]&lt;br /&gt;
&lt;br /&gt;
Note that the information release notes have been incorporated into the relevant wiki pages, but are left here in their original form. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Grid and List Changes==&lt;br /&gt;
&lt;br /&gt;
Arrays  are automatically resized when receiving data from 2D INPUT operations. This also applies to grouped arrays. Automatic resizing only applies to one dimensional arrays and does not occur when INPUTing into two dimensional arrays.&lt;br /&gt;
&lt;br /&gt;
Example where all arrays are one dimensional and may have the incorrect  number of elements:  &lt;br /&gt;
 INPUT FIELDS &amp;quot;row,col,LIST rows/cols, ROW, ALL&amp;quot; : (MAT Array1$, MAT Array2$, MAT Array3, MAT Array4, MAT Array5$)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Three New Read Types===&lt;br /&gt;
Notes: &lt;br /&gt;
Auto Resizing applies&lt;br /&gt;
&lt;br /&gt;
Selection Type must be ALL&lt;br /&gt;
&lt;br /&gt;
The original 2D INPUT read types are:&lt;br /&gt;
  CNT	 - The number of cells specified.&lt;br /&gt;
  SUB	 - Read the Cell Subscript Values.&lt;br /&gt;
  CELL	 - Read each cell specified.&lt;br /&gt;
  ROWCNT - The number of rows specified.&lt;br /&gt;
  ROWSUB - The subscripts of the specified rows.&lt;br /&gt;
  ROW	 - Read all cells in each specified row.&lt;br /&gt;
&lt;br /&gt;
 HEADERS – The original PRINT FIELDS HEADER values.&lt;br /&gt;
e.g. INPUT FIELDS &amp;quot;row,col,LIST rows/cols, HEADERS&amp;quot; : (MAT HEADINGS$,MAT WIDTHS, MAT FORMS$)&lt;br /&gt;
&lt;br /&gt;
  COLCNT - The number of columns established by the header arrays.&lt;br /&gt;
e.g. INPUT FIELDS &amp;quot;row,col,LIST rows/cols, COLCNT, ALL&amp;quot; : numeric-variable&lt;br /&gt;
&lt;br /&gt;
These  are for generalized library routines to inspect passed controls. &lt;br /&gt;
&lt;br /&gt;
  SORT_ORDER - Provides a value of zero for each unsorted column and gives the ascending sequence of column sorts that have occurred. If a column has been reversed (double sorted) it&#039;s value will be negative.&lt;br /&gt;
&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, SORT_ORDER, ALL&amp;quot; : numeric-array&lt;br /&gt;
Given the following history of sorting a four column GRID:&lt;br /&gt;
•	column 1 (descending most recent)&lt;br /&gt;
•	column 2 (ascending first sorted)&lt;br /&gt;
•	column 3 (not sorted)&lt;br /&gt;
•	column 4 (sorted ascending)&lt;br /&gt;
&lt;br /&gt;
SORT_ORDER would return-&lt;br /&gt;
array(1) -&amp;gt;  -1&lt;br /&gt;
array(2) -&amp;gt;   3&lt;br /&gt;
array(3) -&amp;gt;   0&lt;br /&gt;
array(4) -&amp;gt;   2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Restoring a User Sorted 2D Control===&lt;br /&gt;
&lt;br /&gt;
The syntax for sorting an array is currently:&lt;br /&gt;
&lt;br /&gt;
 PRINT FIELDS &amp;quot;nn,nn,GRID 10/40,SORT&amp;quot;: { column number }&lt;br /&gt;
&lt;br /&gt;
This has been extended to allow a numeric array of instead of a scalar.&lt;br /&gt;
If an array is given, it is assumed to be in the same format that SORT_ORDER&lt;br /&gt;
returns. The new format is:&lt;br /&gt;
&lt;br /&gt;
 PRINT FIELDS &amp;quot;nn,nn,GRID 10/40,SORT&amp;quot;: { column-number | numeric-array }&lt;br /&gt;
&lt;br /&gt;
Where the numeric-array has one element for each column left to right. BR will resort the columns in the requested order. &lt;br /&gt;
&lt;br /&gt;
The numeric array values indicating the order of column sorting to be performed&lt;br /&gt;
do not need to exactly match the standard format. e.g Fractions are&lt;br /&gt;
allowed, the values can fall within any range, and there does not need to&lt;br /&gt;
be trailing zero elements for unsorted columns.&lt;br /&gt;
&lt;br /&gt;
A new Read Qualifier is available.&lt;br /&gt;
  DISPLAYED_ORDER - indicates that the read operation is to not restore the data into it&#039;s original order before returning the results to the program.&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, ROWSUB, ALL, DISPLAYED_ORDER, NOWAIT&amp;quot;: numeric-array&lt;br /&gt;
This reads the original row subscripts for all rows - in their present order. This qualifier works only with the ALL selection type. It may be used in conjunction with other qualifiers such as FKEY. &lt;br /&gt;
&lt;br /&gt;
===Range Selection Type===&lt;br /&gt;
&lt;br /&gt;
Valid current selection types are:&lt;br /&gt;
  SEL	- Read one or more selected items.&lt;br /&gt;
  SELONE - Select only one item.&lt;br /&gt;
  ALL	- Read all items in the control (except headings).&lt;br /&gt;
  CUR	- Current cell or row number.&lt;br /&gt;
  CHG	- All cells or rows who’s values have been changed by the operator.&lt;br /&gt;
&lt;br /&gt;
BR now supports the following additional selection types:&lt;br /&gt;
  RANGE - Specifies which portion of a 2D control is to be input.&lt;br /&gt;
  CELL_RANGE – A special type of output range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Range Input====&lt;br /&gt;
&lt;br /&gt;
In the folowing examples BR will redimension the receiving arrays as needed:&lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row,col,LIST rows/cols, CELL, RANGE&amp;quot; :&lt;br /&gt;
             start, end, MAT Data$&lt;br /&gt;
This reads the specified range of cells. BR redimensions MAT Data$ as needed.  Note that CELL may now be used with LIST. Previously, LISTs were only addressable by row. &lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row,col,LIST rows/cols, ROW, RANGE&amp;quot; :&lt;br /&gt;
             (start:=7), (end:=11), ( MAT Array1$, MAT Array2, MAT Array3$ )&lt;br /&gt;
This reads the cells in rows 7 through 11. The recieving arrays are&lt;br /&gt;
redimensioned as appropriate.&lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row,col,GRID rows/cols, ROW, RANGE&amp;quot; :&lt;br /&gt;
             MAT start, MAT end, ( MAT Data1$, MAT Data2$, MAT Data3 )&lt;br /&gt;
This reads one or more ranges of rows.&lt;br /&gt;
&lt;br /&gt;
A more detailed example of this is:&lt;br /&gt;
  100 -- create and populate a LIST control --&lt;br /&gt;
  ........&lt;br /&gt;
  200 MAT START(3) : MAT END(3)&lt;br /&gt;
  210 READ MAT START, MAT END&lt;br /&gt;
  220 DATA 7,21,33&lt;br /&gt;
  230 DATA 11,21,38&lt;br /&gt;
  240 INPUT FIELDS &amp;quot;row,col,LIST rows/cols, ROW, RANGE&amp;quot; : MAT START,&lt;br /&gt;
            MAT END, ( MAT Array1$, MAT Array2, MAT Array3$ )&lt;br /&gt;
This reads 12 rows of data ( row 7-11, row 21 and rows 33-38 ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Range Output====&lt;br /&gt;
&lt;br /&gt;
By default, RANGE output refers to rows. The special keyword CELL_RANGE&lt;br /&gt;
is used to denote the specification of cell ranges. Additionally,&lt;br /&gt;
the use of scalars versus arrays for start and end values determines&lt;br /&gt;
important characteristics of the output process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using Scalars For Range Specification&lt;br /&gt;
&lt;br /&gt;
  PRINT FIELDS &amp;quot;7,8,GRID 10/75, RANGE&amp;quot;: start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
This replaces the values in rows numbered &#039;start&#039; through &#039;end&#039;&lt;br /&gt;
with the data in MAT Data$. The size of MAT Data$ must be a multiple&lt;br /&gt;
of the number of columns in the GRID or an error is generated.&lt;br /&gt;
&lt;br /&gt;
  PRINT FIELDS &amp;quot;7,8,LIST 10/75, RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
&lt;br /&gt;
This replaces the values in ROWs numbered &#039;start&#039; through &#039;end&#039;&lt;br /&gt;
with the data from MATs NAME$, CITY$, AGE and WEIGHT. The data arrays&lt;br /&gt;
must all be dimensioned the same.&lt;br /&gt;
&lt;br /&gt;
====Insertion and Deletion====&lt;br /&gt;
&lt;br /&gt;
The number of rows being output do not need to match the number of rows&lt;br /&gt;
being replaced. To delete a range of rows, output one or more grouped  arrays with zero elements.&lt;br /&gt;
&lt;br /&gt;
Examples- Using the following statement various scenarios are described.&lt;br /&gt;
&lt;br /&gt;
  PRINT FIELDS &amp;quot;7,8,LIST 10/75, RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
&lt;br /&gt;
  start=7, end=11, and the arrays have been DIMed to nine elements&lt;br /&gt;
  Result- Nine rows replace five, and the total content of the control is&lt;br /&gt;
          expanded by 4 rows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  start=7, end=11, and the arrays are DIMed to zero elements&lt;br /&gt;
  Result- Five rows are deleted, and the total size of the control is&lt;br /&gt;
          reduced by 5 rows.&lt;br /&gt;
&lt;br /&gt;
  start=7, end=0 (anything less than 7), and the arrays are DIMed to&lt;br /&gt;
           support three rows&lt;br /&gt;
  Result- Three rows are inserted ahead of row seven and the total content&lt;br /&gt;
          of the control is expanded by three rows&lt;br /&gt;
&lt;br /&gt;
  start=5000, end={any value}, the control only has 482 rows, and the source&lt;br /&gt;
          arrays are DIMed to support eleven rows&lt;br /&gt;
  Result- Eleven rows are appended to the end of the control and become&lt;br /&gt;
          rows 483 through 493.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Outputting Ranges of Cells====&lt;br /&gt;
&lt;br /&gt;
Ranges of cells may be output in conjunction with the CELL_RANGE keyword.&lt;br /&gt;
&lt;br /&gt;
  PRINT FIELDS &amp;quot;7,8,LIST 10/75, CELL_RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
                                - or -&lt;br /&gt;
&lt;br /&gt;
  PRINT FIELDS &amp;quot;7,8,GRID 10/75, CELL_RANGE&amp;quot;: start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
In this case, start and end specify cells instead of rows. If insertion or deletion is indicated by dimensioning the data arrays to greater or fewer elements than are being replaced, then the data must be a multiple of the number of columns. Insertion and deletion is only valid in terms&lt;br /&gt;
of rows, even when cell subscripts are used to specify ranges. In such cases, if the cell subscripts are not on row boundaries, an error is generated.&lt;br /&gt;
&lt;br /&gt;
  PRINT FIELDS &amp;quot;7,8,GRID 10/75, CELL_RANGE&amp;quot;: start, start, Data$&lt;br /&gt;
&lt;br /&gt;
In this example, the value in one cell is replaced with the content of&lt;br /&gt;
a scalar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Using Arrays For Range Specification====&lt;br /&gt;
&lt;br /&gt;
If the start and end specifications are arrays, denoting multiple ranges, there must be a one to one correspondence between the number of rows specified and those in the data. This method implies replacement only and insertion or deletion is not allowed.&lt;br /&gt;
&lt;br /&gt;
The data flow that this feature was designed to support is one where the user is presented with a LIST or GRID where multiple rows have been either selected or changed before returning control to the program and the program is responding by updating something on those rows.&lt;br /&gt;
&lt;br /&gt;
The program begins by presenting a 2D control to the user and reading the the control with type ROWSUB or SUB. Type SUB only works for GRIDs where all colmns have the same data type. Of course the subscripts are read into a numeric array which BR redimensions as appropriate.  Then the program reads the changed or selected data with NOWAIT. (This resets the CHG flags in the control.) The program then changes either row (ROWSUB) or cell (SUB)&lt;br /&gt;
data and outputs the results using the subscript array as both the start and end specification. Other scenarios are possible but this is the primary intended use.&lt;br /&gt;
&lt;br /&gt;
An example of this is:&lt;br /&gt;
  100 -- create and populate a GRID --&lt;br /&gt;
  ........&lt;br /&gt;
  200 INPUT FIELDS &amp;quot;row,col,GRID rows/cols,ROWSUB,CHG&amp;quot;: MAT Rowsubs&lt;br /&gt;
         (Reading subscripts does not reset the CHG flags in the control.)&lt;br /&gt;
  210 INPUT FIELDS &amp;quot;row,col,GRID rows/cols,ROW,CHG,NOWAIT&amp;quot;: ( MAT Data1$,&lt;br /&gt;
                                  MAT Data2, MAT Data3$ )&lt;br /&gt;
          BR redimensions the receiving arrays as needed.&lt;br /&gt;
         (Reading the data also resets the CHG flags in the control.)&lt;br /&gt;
&lt;br /&gt;
  220 -- process the changed rows now present in the data arrays --&lt;br /&gt;
  ........&lt;br /&gt;
  300 PRINT FIELDS &amp;quot;row,col,GRID rows/cols,RANGE&amp;quot;: MAT Rowsubs,&lt;br /&gt;
                   MAT Rowsubs, ( MAT Data1$, MAT Data2, MAT Data3$ )&lt;br /&gt;
&lt;br /&gt;
This outputs the updated rows.&lt;br /&gt;
&lt;br /&gt;
==Logging Enahncements==&lt;br /&gt;
&lt;br /&gt;
See [[Logging]] for details.&lt;br /&gt;
&lt;br /&gt;
==Fine Grain Field Positioning==&lt;br /&gt;
ROW/COL and ROWS/COLS in FIELDS operations may be expressed as&lt;br /&gt;
decimal fractions.&lt;br /&gt;
&lt;br /&gt;
==CSV and XML Parsing Enhancements==&lt;br /&gt;
&lt;br /&gt;
See [[Str2Mat]] for details.&lt;br /&gt;
&lt;br /&gt;
==New DLL Structure of Business Rules!==&lt;br /&gt;
&lt;br /&gt;
As of Release 4.3 Business Rules! is restructured into the following modules:&lt;br /&gt;
&lt;br /&gt;
Client and Server User Interface Modules&lt;br /&gt;
*[[brserver.exe]] – The BR Server module accessed by Client-Server configurations&lt;br /&gt;
*[[brcombined.exe]] – What is now viewed as the Standard Model&lt;br /&gt;
*[[brclient.exe]] – The program that the user accesses in Client-Server configurations&lt;br /&gt;
*[[plbrclient.dll]] - The standard (non-IE) browser plugin dll&lt;br /&gt;
*[[iebrclient.dll]] – Internet Explorer plugin dll&lt;br /&gt;
&lt;br /&gt;
Processor DLLs – Stored in the AppData\Local directory for each user and on each server. &lt;br /&gt;
*[[brserverdll]]-(version,platform,etc info).dll&lt;br /&gt;
*[[brclientdll]]-(version,platform,etc info).dll&lt;br /&gt;
&lt;br /&gt;
Updates will pertain to Processor DLLs while the user interfaces will remain as installed. Client DLLs will be automatically uploaded when corresponding server DLLs are accessed in the event they are not already present on the client.&lt;br /&gt;
&lt;br /&gt;
The client can be accesed from within a browser by initiating it with [[HTML]] which can specify an embedded window or a separate independent window. In all cases opening a window with [[PARENT=NONE]] creates a separate window. &lt;br /&gt;
&lt;br /&gt;
Each user will have a copy of either brcombined.exe or brclient.exe, but there are no licensing concerns because clients are not licenced. Only BR Servers are licensed.&lt;br /&gt;
&lt;br /&gt;
==Client Server Reconnect Configuration Statement==&lt;br /&gt;
&lt;br /&gt;
CLIENT_SERVER RECONNECT_AFTER=20   ERROR_AFTER=180   EXIT_AFTER=300&lt;br /&gt;
&lt;br /&gt;
The client will attempt to reconnect to the server after RECONNECT_AFTER seconds (default is 20 seconds).&lt;br /&gt;
&lt;br /&gt;
ERROR_AFTER generates a BR error and awaits for reconnection (default is 120 seconds).&lt;br /&gt;
&lt;br /&gt;
EXIT_AFTER generates a BR error and continues in unattended mode ( no client IO allowed - exit at next keyboard wait ). This is the normal exit from an unrecoverable disconnect (default is 240 seconds). &lt;br /&gt;
&lt;br /&gt;
If both ERROR_AFTER and EXIT_AFTER are specified, EXIT_AFTER will terminate an ERROR_AFTER wait.&lt;br /&gt;
&lt;br /&gt;
When a client is attempting to reconnect, it displays the session number it is using. The normal client login window will contain a check box that facilitates the entry of a reconnection session number. This allows reconnection from another workstation. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Autoit Support==&lt;br /&gt;
&lt;br /&gt;
Right now [[Autoit]] has trouble reading BR window content. We will correct that and see what other features we can provide to ease the integration of Autoit with BR, including possibly supporting Autoit DLL linkage. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==ODBC Version 4.3==&lt;br /&gt;
&lt;br /&gt;
[[ODBC]] version 4.3 released.&lt;br /&gt;
&lt;br /&gt;
==SQL Support==&lt;br /&gt;
&lt;br /&gt;
BR will use a single SQL server module to perform all SQL database access. This ‘engine’ will communicate with multiple BR sessions via TCP/IP. Normally the engine resides in the same directory as BR, but may reside elsewhere on the network. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===New World SQL Support===&lt;br /&gt;
==Config Database==&lt;br /&gt;
&lt;br /&gt;
CONFIG DATABASE may use one of 3 methods for connecting to SQL Sources&lt;br /&gt;
*DSN&lt;br /&gt;
*CONNECTSTRING&lt;br /&gt;
*ODBC-MANAGER&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
===DSN===&lt;br /&gt;
CONFIG DATABASE db-ref  DSN=dsn-ref  [, USER= department | LOGIN_NAME | ? ] [, {PASSWORD= dept-password | BR_PASSWORD | ?} | PASSWORDD=encrypted-passwd ]&lt;br /&gt;
     ? indicates prompt&lt;br /&gt;
&lt;br /&gt;
Example: EXECUTE &#039;CONFIG DATABASE CLS_Data DSN=&amp;quot;MyData&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
===CONNECTSTRING (DSN Less)===&lt;br /&gt;
CONFIG DATABASE db-ref  CONNECTSTRING=&amp;quot;Driver={Microsoft Access Driver (*.mdb)} DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sample Connection Strings:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Using a SQL Server /w SQL Login:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;SERVER=server;Initial Catalog=database;UID=username;PWD=password&amp;quot;&lt;br /&gt;
 db-ref is the database reference.&lt;br /&gt;
 server is the SQL Server [FQDN] or IP Address&lt;br /&gt;
 database is the [SQL Server Database] &lt;br /&gt;
 username is the [SQL Server User Name]&lt;br /&gt;
 password is the [SQL Server Password]&lt;br /&gt;
&lt;br /&gt;
 Using a SQL Server /w Windows Authentication:&lt;br /&gt;
 CONFIG database db-ref connectstring=&amp;quot;DRIVER=SQL Server;Initial Catalog=database;Persist Security Info=True;MultipleBC_TableResultSets=True; Database=database;SERVER=server;Login Name=username;Password=BR_PASSWORD&amp;quot;&lt;br /&gt;
 db-ref is the database reference.&lt;br /&gt;
 server is the SQL Server [FQDN] or IP Address&lt;br /&gt;
 database is the [SQL Server Database] &lt;br /&gt;
 username is the [SQL Server User Name]&lt;br /&gt;
 Note that BR_PASSWORD will use the users Active Directory password to connect to the SQL Server.&lt;br /&gt;
 Note that &amp;quot;SQL Server&amp;quot; is one of several choices for SQL Server, another choice would be SQL Server Native Client 11.0&lt;br /&gt;
&lt;br /&gt;
===ODBC-MANAGER===&lt;br /&gt;
CONFIG DATABASE db-ref ODBC-MANAGER&lt;br /&gt;
&lt;br /&gt;
Using ODBC Manager as the parameter will allow the end use to select the desired datasouce.&lt;br /&gt;
&lt;br /&gt;
==Open SQL==&lt;br /&gt;
OPEN #20: &amp;quot;DATABASE= db-ref&amp;quot; , SQL &amp;quot;sql-statement&amp;quot;, OUTIN&lt;br /&gt;
&lt;br /&gt;
Example:  OPEN #20: &amp;quot;DATABASE=MyData&amp;quot;,SQL &amp;quot;SELECT FILENO,BALANCE from MASTER WHERE FILENO=?&amp;quot;,OUTIN&lt;br /&gt;
             - or -&lt;br /&gt;
&lt;br /&gt;
OPEN #20: &amp;quot;DATABASE= db-ref, Name= filename&amp;quot; , SQL, OUTIN&lt;br /&gt;
     - filename refers to a DISPLAY file containing an SQL statement&lt;br /&gt;
       that gets executed when a WRITE statement is processed -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Begin processing with a WRITE statement.&lt;br /&gt;
If the WRITE conatins an IO list of values then it is used to populate the&lt;br /&gt;
  &#039;filename&#039; SQL before it is executed.&lt;br /&gt;
This may or may not produce a result set. If it does, the result set may be&lt;br /&gt;
  processed like a BR file opened RELATIVE. Some operations that use file&lt;br /&gt;
  positioning may be slow since the whole result set may not be in memory&lt;br /&gt;
  immediately. Simple sequential access should be fairly quick.&lt;br /&gt;
Once SQL has been populated by an IOlist, it may be reused with the same values&lt;br /&gt;
  by issuing a WRITE with no IOlist.&lt;br /&gt;
READ IOlist variable associations are positional with each READ accessing one&lt;br /&gt;
  row of values.&lt;br /&gt;
&lt;br /&gt;
New System Functions&lt;br /&gt;
A$ = SQL_DATE(&amp;quot;date-value&amp;quot; [,&amp;quot;value-format&amp;quot;]) ! format date for storage&lt;br /&gt;
B$ = BR_DATE(vtring-var$ [,&amp;quot;format&amp;quot;])         ! upack DB date value&lt;br /&gt;
&lt;br /&gt;
* Note: SQL DATETIME fields are &amp;quot;Packed for Storage&amp;quot;, but &amp;quot;DATE&amp;quot; fields are returned as a CCYY-MM-DD string in a SQL Query.  DATE returns &amp;quot;BLANK&amp;quot; for &amp;quot;Empty or Null Date&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== (Future) Legacy SQL Support===&lt;br /&gt;
&lt;br /&gt;
!!! This feature is a planned addition, and is not implemented yet!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If a file that is opened INTERNAL is really a DISPLAY file which has as the&lt;br /&gt;
first four characters &amp;quot;#SQL&amp;quot; then the file will be regarded as an SQL Reference&lt;br /&gt;
file which must be in the following format:&lt;br /&gt;
&lt;br /&gt;
    #SQL&lt;br /&gt;
    DATABASE= -DB ref-  &lt;br /&gt;
    CONTEXT= dictionary-path&lt;br /&gt;
&lt;br /&gt;
The file may then be processed as an INDEXED or RELATIVE BR file.&lt;br /&gt;
If Indexing is specified, the Index file is used to identify the key elements&lt;br /&gt;
to be used by BR for record selection. Split keys are broken into multiple&lt;br /&gt;
values by field length.&lt;br /&gt;
&lt;br /&gt;
When a READ or WRITE is issued, BR transfers data between variables in memory&lt;br /&gt;
and data in the DB using its own internally generated SQL control statements.&lt;br /&gt;
It uses the ODBC dictionary (CONTEXT) to translate BR FORM statement field&lt;br /&gt;
positions and formats to dictionary field names. These names are then used to&lt;br /&gt;
access the database during READ and WRITE operations.&lt;br /&gt;
&lt;br /&gt;
==Other Developments==&lt;br /&gt;
&lt;br /&gt;
[[Gary Hoff]] may get into the development cycle for some BR [[4.4]] features that will move BR into the world of mobile computing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Needs Help]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Release 4.3]]&lt;br /&gt;
[[Category:Release Notes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=Client_Server_Reconnect&amp;diff=10820</id>
		<title>Client Server Reconnect</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=Client_Server_Reconnect&amp;diff=10820"/>
		<updated>2017-01-16T17:59:20Z</updated>

		<summary type="html">&lt;p&gt;GomezL: Added Troubleshooting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Client Server Reconnect Configuration Statement can be used in versions 4.3 and higher.&lt;br /&gt;
&lt;br /&gt;
 CLIENT_SERVER RECONNECT_AFTER=20   RECONNECT_TIME=300&lt;br /&gt;
&lt;br /&gt;
The client will attempt to reconnect to the server after RECONNECT_AFTER seconds (default is 20 seconds).&lt;br /&gt;
&lt;br /&gt;
RECONNECT_TIME= specifies the maximum time to be spent attempting to reconnect (default is 120 seconds) before aborting the session. &lt;br /&gt;
&lt;br /&gt;
When a client is attempting to reconnect, it displays the session number it is using. The normal client login window will contain a check box that facilitates the entry of a reconnection session number. This allows reconnection from another workstation.&lt;br /&gt;
&lt;br /&gt;
[[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
Sometimes client server will disconnect when executing a particularly long/slow command.  In these situations, setting this command to higher values may help.   Setting both values to 999 seems to work in most cases.  &lt;br /&gt;
&lt;br /&gt;
Caution should be used when setting this value as the workstation will appear to &amp;quot;Lock up&amp;quot; while it is waiting, and if the server actually fails, the client will wait until the time limit has been reached.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Config]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
	<entry>
		<id>https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.30&amp;diff=10744</id>
		<title>4.30</title>
		<link rel="alternate" type="text/html" href="https://brwiki2.brulescorp.com/brwiki2/index.php?title=4.30&amp;diff=10744"/>
		<updated>2016-06-11T18:10:33Z</updated>

		<summary type="html">&lt;p&gt;GomezL: /* EXTENDED DATE / TIME FUNCTIONS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status: [[Beta]]&lt;br /&gt;
&lt;br /&gt;
The prior versions were [[4.1]] and [[4.2]].&lt;br /&gt;
&lt;br /&gt;
As Of 08/30/2012&lt;br /&gt;
&lt;br /&gt;
==MISCELLANEOUS ENHANCEMENTS==&lt;br /&gt;
&lt;br /&gt;
“ON error-type IGNORE” now ignores the error instead of going to an Ignore label. This is effective for both ON statements and individual statement error exits. This could change the way your programs work if your Ignore statements do more than CONTINUE.  &lt;br /&gt;
&lt;br /&gt;
The general purpose ERROR exit implies SOFOW truncation. So statements that are governed by ERROR IGNORE also do SOFLOW truncation as needed. &lt;br /&gt;
&lt;br /&gt;
For client / server configurations:&lt;br /&gt;
SPOOLPATH   @: client-pathname&lt;br /&gt;
Sets the remote spool path on the client. In addition to regular spool files, this is where PDF files are created. SPOOLPATH can be set concurrently for both client and server by specifying two SPOOLPATH statements. The @: indicates remote.  &lt;br /&gt;
&lt;br /&gt;
The client-pathname has some unique characteristics:&lt;br /&gt;
Paths are assumed to be OS pathnames relative to the CLIENT_CURRENT_DIR folder, or the startup directory if CLIENT_CURRENT_DIR is not specified. &lt;br /&gt;
If a full pathname is specified it must begin with a colon.  ( e.g.  @::X:\path ) Otherwise it will be preceded with the path to the client current working directory. &lt;br /&gt;
Specifying a relative remote pathname is not compatible with CLIENT_CURRENT_DIR SYNC.&lt;br /&gt;
The status of SPOOLPATH and REMOTESPOOLPATH settings are displayed in response to the STATUS SUBSTITUTE command.  &lt;br /&gt;
&lt;br /&gt;
CHR$(6) is a field separator that displays as a space but causes the immediately preceding data to be right justified. This applies to both Native Windows Printing and PRINT FIELDS. &lt;br /&gt;
&lt;br /&gt;
MAT2STR, STR2MAT changes to trim outside of quotes, but not inside of quotes and to always quote MAT2STR when quotes are present.  &lt;br /&gt;
&lt;br /&gt;
STATUS USERS will display the WSID and name of each user logged in on the network. &lt;br /&gt;
The SQL statement SHOW USERS responds with the same information for ODBC users.&lt;br /&gt;
&lt;br /&gt;
BRERR$ is a new system function that display the description of BR ERR value.&lt;br /&gt;
BRERR$(error-code) returns the description of that code.&lt;br /&gt;
Examples-&lt;br /&gt;
When ERR returns 4270, BRERR$ will return “end of file”.&lt;br /&gt;
BRERR$(0875) returns “unrecognized data after field specification”&lt;br /&gt;
&lt;br /&gt;
For making it easier to configure ODBC with BRconfig.sys and to setup common configuration files for multiple platforms we have added:&lt;br /&gt;
@LINUX&lt;br /&gt;
@WINDOWS&lt;br /&gt;
@MAC&lt;br /&gt;
@ODBC&lt;br /&gt;
&lt;br /&gt;
For example, this could be important for DRIVE statements:&lt;br /&gt;
@LINUX DRIVE C:,/unix/path,.,\&lt;br /&gt;
@WINDOWS DRIVE C:,\\server\path,.,\&lt;br /&gt;
&lt;br /&gt;
Programs compiled with older versions of BR (3.3 – 3.8) can be listed accurately.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GRID AND LIST CHANGES===&lt;br /&gt;
&lt;br /&gt;
Arrays  are automatically resized when receiving data from 2D INPUT operations. This also applies to grouped arrays. Automatic resizing only applies to one dimensional arrays and does not occur when INPUTing into two dimensional arrays.&lt;br /&gt;
&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, ROW, ALL&amp;quot; : ( MAT Array1$,&lt;br /&gt;
             MAT Array2$, MAT Array3, MAT Array4, MAT Array5$ )&lt;br /&gt;
  Where all arrays are one dimensional and may have the incorrect number of elements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Three New Read Types====&lt;br /&gt;
  Notes- &lt;br /&gt;
Auto Resizing applies&lt;br /&gt;
Selection Type must be ALL&lt;br /&gt;
&lt;br /&gt;
The original 2D INPUT read types are:&lt;br /&gt;
  CNT	 - The number of cells specified.&lt;br /&gt;
  SUB	 - Read the Cell Subscript Values.&lt;br /&gt;
  CELL	 - Read each cell specified.&lt;br /&gt;
  ROWCNT - The number of rows specified.&lt;br /&gt;
  ROWSUB - The subscripts of the specified rows.&lt;br /&gt;
  ROW	 - Read all cells in each specified row.&lt;br /&gt;
&lt;br /&gt;
 HEADERS – The original PRINT FIELDS HEADER values.&lt;br /&gt;
e.g.  INPUT FIELDS &amp;quot;row,col,LIST rows/cols, HEADERS,,NOWAIT&amp;quot; :&lt;br /&gt;
                                   (MAT HEADINGS$,MAT WIDTHS, MAT FORMS$)&lt;br /&gt;
&lt;br /&gt;
  COLCNT - The number of columns established by the header arrays.&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, COLCNT, ALL&amp;quot; : numeric-variable&lt;br /&gt;
&lt;br /&gt;
These  are for generalized library routines to inspect passed controls. &lt;br /&gt;
&lt;br /&gt;
  SORT_ORDER - Provides a value of zero for each unsorted column and gives&lt;br /&gt;
the ascending sequence of column sorts that have occurred. If a column has&lt;br /&gt;
been reversed (double sorted) it&#039;s value will be negative.&lt;br /&gt;
&lt;br /&gt;
e.g.   INPUT FIELDS &amp;quot;row,col,LIST rows/cols, SORT_ORDER, ALL&amp;quot; : numeric-array&lt;br /&gt;
Given the following history of sorting a four column GRID:&lt;br /&gt;
column 1 (descending most rescent)&lt;br /&gt;
column 2 (ascending first sorted)&lt;br /&gt;
column 3 (not sorted)&lt;br /&gt;
column 4 (sorted ascending)&lt;br /&gt;
&lt;br /&gt;
SORT_ORDER would return-&lt;br /&gt;
array(1) -&amp;gt;  -1&lt;br /&gt;
array(2) -&amp;gt;   3&lt;br /&gt;
array(3) -&amp;gt;   0&lt;br /&gt;
array(4) -&amp;gt;   2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Restoring a User Sorted 2D Control===&lt;br /&gt;
&lt;br /&gt;
The syntax for sorting an array is currently:&lt;br /&gt;
&lt;br /&gt;
 PRINT FIELDS &amp;quot;nn,nn,GRID 10/40,SORT&amp;quot;: { column number }&lt;br /&gt;
&lt;br /&gt;
This has been extended to allow a numeric array of instead of a scalar. If an array is given, it is assumed to be in the same format that SORT_ORDER returns. The new format is:&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;nn,nn,GRID 10/40,SORT&amp;quot;: { column-number | numeric-array }&lt;br /&gt;
&lt;br /&gt;
Where the numeric-array has one element for each column left to right. BR will resort the columns in the requested order. &lt;br /&gt;
&lt;br /&gt;
The numeric array values indicating the order of column sorting to be performed do not need to exactly match the standard format. e.g Fractions are allowed, the values can fall within any range, and there does not need to be trailing zero elements for unsorted columns.&lt;br /&gt;
&lt;br /&gt;
=== A new Read Qualifier is available.===&lt;br /&gt;
[[Displayed_Order]] introduced&lt;br /&gt;
&lt;br /&gt;
===Masked 2D Display===&lt;br /&gt;
&lt;br /&gt;
LIST and GRID support the MASK operation-&lt;br /&gt;
&lt;br /&gt;
 PRINT FIELDS &amp;quot;row,col,LIST rows/cols,MASK&amp;quot; :  mask_array&lt;br /&gt;
&lt;br /&gt;
This restricts the rows (for both LIST and GRID) previously displayed to those corresponding to a “true” value in mask_array. A true value is represented in a umeric array as a value greater than zero. Negative values are not allowed in mask arrays. A string mask array may also be used with “T” and “F” values. The MASK stays in effect until 1) a new MASK is specified or 2) the contents of the control are changed with PRINT ( =, +, - see Output Operations in New Console.DOC). &lt;br /&gt;
&lt;br /&gt;
INPUT FIELDS &amp;quot;row,col,LIST rows/cols,MASK [,NOWAIT]&amp;quot; : mask_array&lt;br /&gt;
This reads the display mask setting for a 2D control.&lt;br /&gt;
&lt;br /&gt;
The mask array affects only the user presentation.. not the result set. Use RANGE processing or the CHG selection type to selectively read from a 2D control.&lt;br /&gt;
&lt;br /&gt;
== New Search Field Type: Filter ==&lt;br /&gt;
&lt;br /&gt;
See [[Filter]]&lt;br /&gt;
== New Config: Filter_Delimiters  ==&lt;br /&gt;
&lt;br /&gt;
See [[Filter_Delimiters]]&lt;br /&gt;
&lt;br /&gt;
== FIELDS CHARACTER BY CHARACTER KEYBOARD CONTROL==&lt;br /&gt;
&lt;br /&gt;
[[^KeyStroke and ^DataChg]] introduced.&lt;br /&gt;
&lt;br /&gt;
== RANGE SELECTION TYPE==&lt;br /&gt;
&lt;br /&gt;
Valid current selection types are:&lt;br /&gt;
  SEL	- Read one or more selected items.&lt;br /&gt;
  SELONE - Select only one item.&lt;br /&gt;
  ALL	- Read all items in the control (except headings).&lt;br /&gt;
  CUR	- Current cell or row number.&lt;br /&gt;
  CHG	- All cells or rows who’s values have been changed by the operator.&lt;br /&gt;
&lt;br /&gt;
BR now supports the following additional selection types:&lt;br /&gt;
  RANGE - Specifies which portion of a 2D control is to be input.&lt;br /&gt;
  CELL_RANGE – A special type of output range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RANGE Input===&lt;br /&gt;
&lt;br /&gt;
In the following examples BR will redimension the receiving arrays as needed:&lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row, col, LIST rows/cols, CELL, RANGE&amp;quot; : start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
This reads the specified range of cells. BR redimensions MAT Data$ as needed.  Note that CELL may now be used with LIST. Previously, LISTs were only addressable by row. &lt;br /&gt;
&lt;br /&gt;
INPUT FIELDS &amp;quot;row, col, LIST rows/cols, ROW, RANGE&amp;quot; :&lt;br /&gt;
             (start:=7), (end:=11), ( MAT Array1$, MAT Array2, MAT Array3$ )&lt;br /&gt;
&lt;br /&gt;
This reads the cells in rows 7 through 11. The receiving arrays are redimensioned as appropriate.&lt;br /&gt;
&lt;br /&gt;
  INPUT FIELDS &amp;quot;row, col, GRID rows/cols, ROW, RANGE&amp;quot; :&lt;br /&gt;
             MAT start, MAT end, ( MAT Data1$, MAT Data2$, MAT Data3 )&lt;br /&gt;
This reads one or more ranges of rows.&lt;br /&gt;
&lt;br /&gt;
A more detailed example of this is:&lt;br /&gt;
  100 -- create and populate a LIST control --&lt;br /&gt;
  ........&lt;br /&gt;
  200 MAT START(3) : MAT END(3)&lt;br /&gt;
  210 READ MAT START, MAT END&lt;br /&gt;
  220 DATA 7,21,33&lt;br /&gt;
  230 DATA 11,21,38&lt;br /&gt;
  240 INPUT FIELDS &amp;quot;row, col, LIST rows/cols, ROW, RANGE&amp;quot; : MAT START,&lt;br /&gt;
            MAT END, ( MAT Array1$, MAT Array2, MAT Array3$ )&lt;br /&gt;
&lt;br /&gt;
This reads 12 rows of data ( row 7-11, row 21 and rows 33-38 ).&lt;br /&gt;
&lt;br /&gt;
=== RANGE Output===&lt;br /&gt;
&lt;br /&gt;
By default, RANGE output refers to rows. The special keyword CELL_RANGE is used to denote the specification of cell ranges. Additionally, the use of scalars versus arrays for start and end values determines important characteristics of the output process. &lt;br /&gt;
&lt;br /&gt;
4c) Using Scalars For Range Specification&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7, 8, GRID 10/75, RANGE&amp;quot;: start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
This replaces the values in rows numbered &#039;start&#039; through &#039;end&#039; with the data in MAT Data$. The size of MAT Data$ must be a multiple of the number of columns in the GRID or an error is generated.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7, 8, LIST 10/75, RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
&lt;br /&gt;
This replaces the values in ROWs numbered &#039;start&#039; through &#039;end&#039; with the data from MATs NAME$, CITY$, AGE and WEIGHT. The data arrays must all be dimensioned the same.&lt;br /&gt;
&lt;br /&gt;
=== Row Insertion and Deletion===&lt;br /&gt;
&lt;br /&gt;
The number of rows being output do not need to match the number of rows being replaced. To delete a range of rows, output one or more grouped arrays with zero elements.&lt;br /&gt;
&lt;br /&gt;
Examples- Using the following statement various scenarios are described.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,LIST 10/75, RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
&lt;br /&gt;
  Start=7, end=11, and the arrays have been DIMed to nine elements&lt;br /&gt;
  Result- Nine rows replace five, and the total content of the control is&lt;br /&gt;
          expanded by 4 rows.&lt;br /&gt;
&lt;br /&gt;
  Start=7, end=11, and the arrays are DIMed to zero elements&lt;br /&gt;
  Result- Five rows are deleted, and the total size of the control is&lt;br /&gt;
          reduced by 5 rows.&lt;br /&gt;
&lt;br /&gt;
  Start=7, end=0 (anything less than 7), and the arrays are DIMed to&lt;br /&gt;
           support three rows&lt;br /&gt;
  Result- Three rows are inserted ahead of row seven and the total content&lt;br /&gt;
          of the control is expanded by three rows&lt;br /&gt;
&lt;br /&gt;
  Start=5000, end={any value}, the control only has 482 rows, and the source&lt;br /&gt;
          arrays are DIMed to support eleven rows&lt;br /&gt;
  Result- Eleven rows are appended to the end of the control and become&lt;br /&gt;
          rows 483 through 493.&lt;br /&gt;
&lt;br /&gt;
=== Outputting Ranges of Cells===&lt;br /&gt;
&lt;br /&gt;
Ranges of cells may be output in conjunction with the CELL_RANGE keyword.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,LIST 10/75, CELL_RANGE&amp;quot;: start, end, (MAT NAME$,&lt;br /&gt;
                                          MAT CITY$, MAT AGE, MAT WEIGHT)&lt;br /&gt;
                                - or -&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,GRID 10/75, CELL_RANGE&amp;quot;: start, end, MAT Data$&lt;br /&gt;
&lt;br /&gt;
In this case, start and end specify cells instead of rows. If insertion or deletion is indicated by dimensioning the data arrays to greater or fewer elements than are being replaced, then the data must be a multiple of the number of columns. Insertion and deletion is only valid in terms&lt;br /&gt;
of rows, even when cell subscripts are used to specify ranges. In such cases, if the cell subscripts are not on row boundaries, an error is generated.&lt;br /&gt;
&lt;br /&gt;
PRINT FIELDS &amp;quot;7,8,GRID 10/75, CELL_RANGE&amp;quot;: start, start, Data$&lt;br /&gt;
In this example, the value in one cell is replaced with the content of a scalar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using Arrays For RANGE Specification===&lt;br /&gt;
&lt;br /&gt;
If the start and end specifications are arrays, denoting multiple ranges, there must be a one to one correspondence between the number of rows specified and those in the data. This method implies replacement only and insertion or deletion is not allowed.&lt;br /&gt;
&lt;br /&gt;
The data flow that this feature was designed to support is one where the user is presented with a LIST or GRID where multiple rows have been either selected or changed before returning control to the program and the program is responding by updating something on those rows.&lt;br /&gt;
&lt;br /&gt;
The program begins by presenting a 2D control to the user and reading the the control with type ROWSUB or SUB. Type SUB only works for GRIDs where all colmns have the same data type. Of course the subscripts are read into a numeric array which BR redimensions as appropriate.  Then the program reads the changed or selected data with NOWAIT. (This resets the CHG flags in the control.) The program then changes either row (ROWSUB) or cell (SUB)&lt;br /&gt;
data and outputs the results using the subscript array as both the start and end specification. Other scenarios are possible but this is the primary intended use.&lt;br /&gt;
&lt;br /&gt;
An example of this is:&lt;br /&gt;
  100 -- create and populate a GRID --&lt;br /&gt;
  ........&lt;br /&gt;
  200 INPUT FIELDS &amp;quot;row,col,GRID rows/cols,ROWSUB,CHG&amp;quot;: MAT Rowsubs&lt;br /&gt;
         (Reading subscripts does not reset the CHG flags in the control.)&lt;br /&gt;
  210 INPUT FIELDS &amp;quot;row,col,GRID rows/cols,ROW,CHG,NOWAIT&amp;quot;: ( MAT Data1$,&lt;br /&gt;
                                  MAT Data2, MAT Data3$ )&lt;br /&gt;
          BR redimensions the receiving arrays as needed.&lt;br /&gt;
         (Reading the data also resets the CHG flags in the control.)&lt;br /&gt;
&lt;br /&gt;
  220 -- process the changed rows now present in the data arrays --&lt;br /&gt;
  ........&lt;br /&gt;
  300 PRINT FIELDS &amp;quot;row,col,GRID rows/cols,RANGE&amp;quot;: MAT Rowsubs,&lt;br /&gt;
                   MAT Rowsubs, ( MAT Data1$, MAT Data2, MAT Data3$ )&lt;br /&gt;
&lt;br /&gt;
This outputs the updated rows.&lt;br /&gt;
&lt;br /&gt;
== FINE GRAIN FIELD POSITIONING==&lt;br /&gt;
ROW/COL and ROWS/COLS in FIELDS operations may be expressed as decimal fractions.&lt;br /&gt;
&lt;br /&gt;
== LOGGING ENHANCEMENTS==&lt;br /&gt;
The debug versions of BR now expect you to use a LOGGING configuration statement. This enables BR to post exit messages during unexpected terminations.&lt;br /&gt;
&lt;br /&gt;
A system function called DEBUG_STR( message-level, string-value ) will, depending on LOG LEVEL, send data to the LOGGING file as well as to the MyEditBR debugger if it is attached, or optionally to the command console if the debugger is not attached and GUI is ON. This lets you freely put trace related informational statements into your code without affecting normal processing.  &lt;br /&gt;
&lt;br /&gt;
The LOGGING configuration statement now has two additional optional parameters:&lt;br /&gt;
&lt;br /&gt;
   LOGGING  loglevel,  logfile   [ ,DEBUG_LOG_LEVEL=nn ]   [ ,+CONSOLE ]&lt;br /&gt;
&lt;br /&gt;
Note- Logfile is a native OS filename.  Second and subsequent occurrences of the LOGGING statement may omit loglevel and the log filename.&lt;br /&gt;
	&lt;br /&gt;
DEBUG_LOG_LEVEL specifies the log level for debugging log messages Independently of the standard log level. If not specified the Debug_Log_Level is set to the standard log level.&lt;br /&gt;
&lt;br /&gt;
+CONSOLE applies only when GUI is ON and specifies that all logging messages also go to the console and the console is to be left visible when not attached to MyEditBR. ( Console logging output is suppressed when GUI is OFF. )&lt;br /&gt;
&lt;br /&gt;
Message Levels are compared with Log Levels during the filtering process. The Logging Level is meant to specify the level of detail to be logged, with greater detail logged at higher log levels.  &lt;br /&gt;
&lt;br /&gt;
The following types of messages are written to the LOGGING file:&lt;br /&gt;
&lt;br /&gt;
Config error messages based on their assigned level of importance.&lt;br /&gt;
&lt;br /&gt;
DEBUG_STR() messages where message-level is equal to or less than the DEBUG_LOG_LEVEL.&lt;br /&gt;
&lt;br /&gt;
Log levels 0, 1, 2 and 3-&lt;br /&gt;
  System generated warning messages such as OS failures and abnormal exits.&lt;br /&gt;
Log level 5 or above-&lt;br /&gt;
  User Logon data, including any logon attempts.&lt;br /&gt;
Log level 6 or above-&lt;br /&gt;
  Starting a BR program, exiting.&lt;br /&gt;
Log level 8 or above-&lt;br /&gt;
   Commands such as COPY plus shell calls with parameters. &lt;br /&gt;
   PDF printing events.&lt;br /&gt;
Log level 11 or above-&lt;br /&gt;
   Any PRINT output that goes to the console is also logged (GUI ON only).&lt;br /&gt;
Log level 12 or above-&lt;br /&gt;
  TRACE, and DISPLAY messages.&lt;br /&gt;
Log level 13 or above-&lt;br /&gt;
  Lots of what the system is doing now messages.&lt;br /&gt;
&lt;br /&gt;
Any DEBUG_STR() calls with a level &amp;gt;10 are deemed to be message level 10.&lt;br /&gt;
&lt;br /&gt;
Logging was added to PDF creation. Logging of minor events that happen during the printing process are logged at log level 8.  Errors are logged at a lower level. Logging was also improved with respect to loading older versions of pdflib.&lt;br /&gt;
Note- As a diagnostic, the following command is quite useful: &lt;br /&gt;
DIR &amp;gt;PDF:/READER&lt;br /&gt;
&lt;br /&gt;
ODBC Logging was substantially increased.&lt;br /&gt;
&lt;br /&gt;
Log Level Indication is given in Log Messages:&lt;br /&gt;
  (6) - 08/25/2011 11:33:53&lt;br /&gt;
Setting logging to log file logfile.txt log level 10.&lt;br /&gt;
  (6) - 08/25/2011 11:33:53&lt;br /&gt;
The BRConfig.sys file is C:\Users\dan\programs\cygwin\home\dan\br-wx\br\winbuild\dllbuild\output\brconfig.sys&lt;br /&gt;
The (6) here is the log level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CSV AND XML PARSING ENHANCEMENTS==&lt;br /&gt;
The string to mat and mat to string functions have been extended to ease parsing of CSV and XML data. &lt;br /&gt;
&lt;br /&gt;
STR2MAT( str$, MAT zzz$ [, [MAT] Sep$ [, flags$]] )&lt;br /&gt;
Where Sep$ may be an array and flag$ is in the format:&lt;br /&gt;
[ quote-type ] [ :LTRM ] | [ :TRIM ] | [ :RTRM ]&lt;br /&gt;
Where quote-type can be Q, QUOTES, (&#039;), or (&amp;quot;), case insensitive. Q and QUOTES denote standard BR quote processing. The trim flags denote post processing of extracted elements and the leading colon is only present when quote-type is specified.&lt;br /&gt;
When Sep$ is an array, then any or all of the specified values are deemed to represent a single separator with the qualification that any one separator, cannot occur more than once in a string of adjacent separators. To restate this, when elements of a Sep$ array occur adjacent to each other within the source string, they are grouped as a separator substring.&lt;br /&gt;
Sep$ elements cannot occur more than once in a separator substring. When they do, it denotes the specification of a null element.  e.g. two successive commas or two successive occurrences of CR+LF both denote null elements. Essentially when Sep$ elements are &#039;consumed&#039; by their recognition within the source string, then they cannot be re-recognized without inserting a null element into the output array. &lt;br /&gt;
=== Quote Processing ===&lt;br /&gt;
Quotation marks suppress the recognition of separators in accordance with the following rules.&lt;br /&gt;
Standard BR Quote Processing&lt;br /&gt;
When examining str$ left to right, the first character (and the first character after each separator) is checked to see if is either (&#039;) or (&amp;quot;). If it is either of those then it activates quotation processing which suppresses the recognition of separators until quotation processing is deactivated. The first character thus becomes the governing quote type until quotation processing is deactivated.&lt;br /&gt;
&lt;br /&gt;
The string is copied until it ends or until an odd number of successive occurrences of the governing quote type is encountered. During this processing, two adjacent occurrences of the governing quote character denote an embedded occurrence of the quote character.&lt;br /&gt;
Examples&lt;br /&gt;
&amp;quot;abc,def&amp;quot; -&amp;gt; abc,def    where the comma is not recognized as a separator and is part of the data&lt;br /&gt;
abc&amp;quot;def -&amp;gt; abc&amp;quot;def    naturally embedded quotes may occur anywhere within a string after the first character&lt;br /&gt;
&amp;quot;abc&amp;quot;def&amp;quot; -&amp;gt; abcdef&amp;quot;   quotation processing is deactivated by the center quote mark&lt;br /&gt;
&amp;quot;abcdef&amp;quot; -&amp;gt; abcdef   normal data&lt;br /&gt;
&amp;quot;abc&#039;def&amp;quot; -&amp;gt; abc&#039;def   the single quote is treated like any other character while double quotes govern&lt;br /&gt;
&#039;abc&amp;quot;def&#039; -&amp;gt; abc&amp;quot;def   double quotes are treated like any other character while single quotes govern&lt;br /&gt;
&amp;quot;abc&amp;quot;&amp;quot;def&amp;quot; -&amp;gt; abc&amp;quot;def   pairs of governing quotes denote a single embedded quote&lt;br /&gt;
&amp;quot;abc&amp;quot;&amp;quot;&amp;quot;def&amp;quot; -&amp;gt; abc&amp;quot;def&amp;quot;   the third successive occurrence deactivates quote processing which began with the first quote&lt;br /&gt;
&lt;br /&gt;
MAT2STR( MAT zzz$, str$ [, sep$ [, flags$]] )&lt;br /&gt;
Where flag$ is in the format:&lt;br /&gt;
[ quote-type ] [ :LTRM ] | [ :TRIM ] | [ :RTRM ]&lt;br /&gt;
Where quote-type can be Q, QUOTES, (&#039;), or (&amp;quot;), case insensitive. Quote-type denotes that each element should be enclosed in quotation marks. The trim flags denote pre-processing of array elements and the leading colon is only present when quote-type is specified.&lt;br /&gt;
If Q or QUOTES is specified then BR automatically determines which quote type to apply as follows:&lt;br /&gt;
First the element is unpacked. That is, if it is contained in quotes, the quotes are stripped and embedded pairs are singled. Next the element is scanned left to right for either type of quote character ( single or double ). If a quote character is encountered the element is enclosed in the alternate quote type and embedded occurrences of that quote type are doubled. If no quote character is encountered then double quotes are applied.&lt;br /&gt;
Examples&lt;br /&gt;
Quote Type is Q or QUOTES&lt;br /&gt;
abcdef -&amp;gt; &amp;quot;abcdef&amp;quot;&lt;br /&gt;
abc&#039;def -&amp;gt; &amp;quot;abc&#039;def&amp;quot;&lt;br /&gt;
abc&amp;quot;def -&amp;gt; &#039;abc&amp;quot;def&#039;&lt;br /&gt;
abc&amp;quot;&amp;quot;def -&amp;gt; ‘abc&amp;quot;&amp;quot;def’     embedded quotes are left intact when quotes are not active&lt;br /&gt;
&#039;abcdef -&amp;gt; &amp;quot;&#039;abcdef&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Quote Type is &#039; ( quote type single )&lt;br /&gt;
abcdef -&amp;gt; &#039;abcdef&#039;&lt;br /&gt;
&#039;abcdef -&amp;gt; &#039;&#039;&#039;abcdef&#039;   single quotes get doubled when embedded in single quotes&lt;br /&gt;
&amp;quot;abcdef -&amp;gt; &#039;&amp;quot;abcdef&#039;   leading double quote is treated normally&lt;br /&gt;
&lt;br /&gt;
Quote type double mirrors quote type single.&lt;br /&gt;
MAT2STR and STR2MAT trim outside of quotes but not inside of quotes. Also MAT2STR always adds quotes when quotes are present in the data.  &lt;br /&gt;
When using MAT2STR on a 2 dimensional array, the first delimiter is used for individual elements and the second delimiter at the end of each row. This principle also applies to three to seven dimensions.&lt;br /&gt;
Example&lt;br /&gt;
Given the following two dimensional array zzz$ containing the values-&lt;br /&gt;
    1            2&lt;br /&gt;
    3            4&lt;br /&gt;
&lt;br /&gt;
The following statements-&lt;br /&gt;
    10 Sep$(1)=&amp;quot;,&amp;quot;&lt;br /&gt;
    20 Sep$(2)=hex$(&amp;quot;0D0A&amp;quot;) ! CRLF&lt;br /&gt;
    30 MAT2STR( MAT zzz$,  str$, MAT Sep$ )&lt;br /&gt;
    40 PRINT str$&lt;br /&gt;
&lt;br /&gt;
Will produce-&lt;br /&gt;
    1,2&lt;br /&gt;
    3,4&lt;br /&gt;
&lt;br /&gt;
=== CSV Parsing Example===&lt;br /&gt;
Parsing CSV data files is now quite easy, the following code snippet demonstrates how to open a CSV/Tab File, read in the fields from the header, and then loop through  the records.&lt;br /&gt;
 01000    dim CSV_LINE$*999,CSV_FILE$*256, CSV_DELIM$*1, CSV_HEADER$*999, &lt;br /&gt;
CSV_FIELDS$(1)*40, CSV_DATA$(1)*60&lt;br /&gt;
 01020    form C,&amp;quot; &amp;quot;&lt;br /&gt;
 01040    let CSV_FILE$=&amp;quot;Sample_File.tab&amp;quot; : let TAB$=CHR$(9)&lt;br /&gt;
 01060    open #(CSV_HANDLE:=10): &amp;quot;name=&amp;quot;&amp;amp;CSV_FILE$&amp;amp;&amp;quot;, shr&amp;quot;, display,input &lt;br /&gt;
 01080    linput #CSV_HANDLE: CSV_HEADER$&lt;br /&gt;
 01100    let CSV_DELIM$=TAB$&lt;br /&gt;
 01120    if POS(CSV_HEADER$,TAB$) &amp;lt;= 0 then &lt;br /&gt;
 01140       let CSV_DELIM$=&amp;quot;,&amp;quot;&lt;br /&gt;
 01160    end if &lt;br /&gt;
 01180    let STR2MAT(CSV_HEADER$, MAT CSV_FIELDS$, CSV_DELIM$, &amp;quot;QUOTES:TRIM&amp;quot;)&lt;br /&gt;
 01200    print using 1020: MAT CSV_FIELDS$&lt;br /&gt;
 01220    do &lt;br /&gt;
 01240       linput #CSV_HANDLE: CSV_LINE$ eof Exit_Csv&lt;br /&gt;
 01260       let STR2MAT(CSV_LINE$,MAT CSV_DATA$,CSV_DELIM$,&amp;quot;Q:trim&amp;quot;)&lt;br /&gt;
 01280       print using 1020: MAT CSV_DATA$&lt;br /&gt;
 01300    loop &lt;br /&gt;
 01320 Exit_Csv: !&lt;br /&gt;
&lt;br /&gt;
You might wish to copy any CSV file to Sample_File.tab and run this program to view the content.&lt;br /&gt;
&lt;br /&gt;
=== XML Parsing Examples===&lt;br /&gt;
&lt;br /&gt;
STR2MAT may also be used to Parse XML data.&lt;br /&gt;
This is a bit more complex than parsing CSV files, but remains a powerful tool.&lt;br /&gt;
The following example will parse XML$ into &amp;quot;MAT XML_LINE$&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  10 DIM XML$*999999,XML_LINE$(1)*32000&lt;br /&gt;
  20 XML$=&amp;quot;&amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&amp;lt;/ITEM&amp;gt;&amp;lt;/NODE&amp;gt;&amp;lt;/XML&amp;gt;&amp;quot;&lt;br /&gt;
  100 LET Str2mat(XML$,Mat XML_LINE$,&amp;quot;&amp;gt;&amp;quot;,&amp;quot;TRIM&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
This makes the parsing of XML a bit more convenient. The following XML sample shows how the function will parse the data&lt;br /&gt;
&lt;br /&gt;
Input:&lt;br /&gt;
  &amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&amp;lt;/ITEM&amp;gt;&amp;lt;/NODE&amp;gt;&amp;lt;/XML&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
  &amp;lt;XML&lt;br /&gt;
  &amp;lt;NODE&lt;br /&gt;
  &amp;lt;ITEM&lt;br /&gt;
  ITEM VALUE&amp;lt;/ITEM&lt;br /&gt;
  &amp;lt;/NODE&lt;br /&gt;
  &amp;lt;/XML&lt;br /&gt;
&lt;br /&gt;
While the above technique is useful, a more complete and useful technique can be performed if the Node names are known. You may use an array of SEP$ values to parse the data.  Take the following example:&lt;br /&gt;
&lt;br /&gt;
 100    dim XML$*999999,XML_LINE$(1)*32000,SEP$(4)*32&lt;br /&gt;
 110    let XML$=&amp;quot;&amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&amp;lt;/ITEM&amp;gt;&amp;lt;ITEM2&amp;gt;ITEM2 VALUE&amp;lt;/ITEM2&amp;gt;&amp;lt;/NODE&amp;gt;&amp;lt;/XML&amp;gt;&amp;quot;&lt;br /&gt;
 120    read MAT SEP$&lt;br /&gt;
 130    data &amp;lt;/XML&amp;gt;,&amp;lt;/NODE&amp;gt;,&amp;lt;/ITEM&amp;gt;,&amp;lt;/ITEM2&amp;gt;&lt;br /&gt;
 140    let STR2MAT(XML$,MAT XML_LINE$,MAT SEP$,&amp;quot;TRIM&amp;quot;)&lt;br /&gt;
 150    print MAT XML_LINE$&lt;br /&gt;
&lt;br /&gt;
This program would return the following results:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;XML&amp;gt;&amp;lt;NODE&amp;gt;&amp;lt;ITEM&amp;gt;ITEM VALUE&lt;br /&gt;
  &amp;lt;ITEM2&amp;gt;ITEM2 VALUE&lt;br /&gt;
&lt;br /&gt;
Notice that &amp;quot;Nested Nodes&amp;quot; are listed before the initial data, this may be used to identify the node.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NEW DLL STRUCTURE OF BUSINESS RULES!==&lt;br /&gt;
&lt;br /&gt;
As of Release 4.3 Business Rules! has been restructured into the following modules:&lt;br /&gt;
[[brserver.exe]] – The BR Server module accessed by Client-Server configurations. Brserver.exe also operates as what is now viewed as the Standard Model. If it is invoked by brlistener, then it act as brserver. If it is simply executed, it acts as brcombined. However, when operating as the standard model, it needs to have brclient.dll in the same directory as brserver.&lt;br /&gt;
[[brclient.exe]] – The program that the user accesses in Client-Server configurations&lt;br /&gt;
[[brclient.dll]] – The client processing program that correlates with the brserver edition.&lt;br /&gt;
[[npbrclient.dll]] - The standard (non-IE) browser plugin dll&lt;br /&gt;
[[iebrclient.dll]] – Internet Explorer plugin dll&lt;br /&gt;
&lt;br /&gt;
Client installation is done by placing brclient.exe and brclient.dll on the client system and referencing brclient.exe in an icon. Server installation is done by placing brserver.exe and brclient.dll on the server and referencing brserver.exe in the brlistener.conf file. Exe files may be renamed as desired. The name of the released brclient.dll modules will be lengthy and must not be changed because BR relies on the DLL names for version identification. &lt;br /&gt;
&lt;br /&gt;
You will need one of the following possible configurations:&lt;br /&gt;
* Workstation Standard Model&lt;br /&gt;
* Server executable&lt;br /&gt;
* Workstation Client dll&lt;br /&gt;
* Linux Terminal Support&lt;br /&gt;
* Server executable&lt;br /&gt;
* Linux Client dll ( .so )&lt;br /&gt;
* Client Server Model&lt;br /&gt;
* On Client Machine-&lt;br /&gt;
* Client executable&lt;br /&gt;
* Workstation Client dll&lt;br /&gt;
* On Server&lt;br /&gt;
* Server executable&lt;br /&gt;
* Workstation Client dll&lt;br /&gt;
* BR Listener installed&lt;br /&gt;
[ Linux Client dll for Linux terminal access ]&lt;br /&gt;
&lt;br /&gt;
The 32 and 64 bit versions of servers and clients can be intermixed. However dlls must be the in same bit class as the modules that call them.  Put your BR bmp files ( drawsunk.bmp, startup.bmp etc. ) in the BR server executable directory. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Updates will pertain to Processor DLLs while the user interfaces will remain as installed. Client DLLs will be automatically uploaded when corresponding server DLLs are accessed in the event they are not already present on the client.&lt;br /&gt;
&lt;br /&gt;
The client can be accessed from within a browser by initiating it with HTML which can specify an embedded window or a separate independent window. In all cases opening a window with PARENT=NONE creates a separate window. &lt;br /&gt;
&lt;br /&gt;
=== BR Adjunctive Files===&lt;br /&gt;
&lt;br /&gt;
The BR executable is now considered to be where the BR server actually resides, irrespective of Drive statements and current working directories. &lt;br /&gt;
&lt;br /&gt;
The following files are located in the BR executable directory by default:&lt;br /&gt;
BR server executable&lt;br /&gt;
BRconfig.sys&lt;br /&gt;
BRserial.dat&lt;br /&gt;
BRserver.dat&lt;br /&gt;
WBcmd.wbh - BR help files&lt;br /&gt;
Server Dlls&lt;br /&gt;
Client Dlls for uploading as needed&lt;br /&gt;
System Image files – linedraw, etc. - typically BMPs&lt;br /&gt;
===) Exceptions===&lt;br /&gt;
&lt;br /&gt;
If [[WBcmd.wbh]] doesn&#039;t exist in the BR executable directory then BR looks for it in the initial directory specified by the first drive statement. ( deprecated – will be eliminated at some point)  ONQPATH currently defaults to this initial path as well. ( this will remain )&lt;br /&gt;
&lt;br /&gt;
If the BRconfig file is not present in the BR executable directory then BR looks for it in the current working directory at the time of BR invokation. &lt;br /&gt;
&lt;br /&gt;
The SPOOLPATH :OS-fullpath  configuration statement specifies where print spool files are temporarily stored during printing.  SPOOLPATH defaults to a spool directory that runs off of the BR root of the first drive statement. If no such spool directory exists and SPOOLPATH is not specified then BR creates one.&lt;br /&gt;
e.g.	DRIVE   J:, C:\BR, x, \MYAPP   would result in spool files being placed in:&lt;br /&gt;
C:\BR\SPOOL\&lt;br /&gt;
&lt;br /&gt;
SPOOLPATH @::client-OS-fullpath   specifies where on the client spool files are to be placed.  &lt;br /&gt;
  e.g.   SPOOLPATH  @::C:\BR\SPOOL  -or whatever other full path is desired-&lt;br /&gt;
&lt;br /&gt;
The @:  tells BR that this path is on the client. The second colon says the path is independent of drive specifications. &lt;br /&gt;
&lt;br /&gt;
WORKPATH defaults to the BR root of the first drive statement:&lt;br /&gt;
e.g.		C:\BR\&lt;br /&gt;
&lt;br /&gt;
BRconfig.sys INCLUDE statements are relative to the location of the file containing the INCLUDE statement ( the parent ).  CONFIG command INCLUDE statements are relative to the current directory at the time the command is issued.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Licensing Restrictions===&lt;br /&gt;
&lt;br /&gt;
As of [[4.20H]], [[brserial]] files must be specific to the first decimal position of the [[release]] of BR that is being used. ( e.g. 4.2x versus 4.3x )&lt;br /&gt;
&lt;br /&gt;
To accommodate more than one brserial level, BR first looks for its own suffix ( 42 or 43 ) before looking for a dat file. From now on it is most useful to name your brserial files either BRSERIAL.42 or BRSERIAL.43, etc.&lt;br /&gt;
&lt;br /&gt;
== CLIENT SERVER RECONNECT Configuration Statement==&lt;br /&gt;
&lt;br /&gt;
CLIENT_SERVER     RECONNECT_AFTER=20   RECONNECT_TIME=120&lt;br /&gt;
&lt;br /&gt;
BR sends idle packets between the client and the server every 2 seconds. This statement specifies that after 20 seconds of not receiving such packets BR will attempt to reconnect.  This reconnect process can last up to a maximum of 120 seconds, after which BR will issue a “lost connection” error and begin processing in unattended mode. &lt;br /&gt;
&lt;br /&gt;
You can change the above period lengths with the above CONFIG statement.&lt;br /&gt;
&lt;br /&gt;
When BR runs unattended, it normally terminates processing if the program attempts to wait for keyboard input. However, after a lost connection error, if a library program attempts to wait for keyboard input the library function is terminated, the calling statement receives control, and the lost connection error is issued again. This supports error trapping in the calling program so an orderly shutdown can be performed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AUTOIT SUPPORT==&lt;br /&gt;
&lt;br /&gt;
[[AutoIt]] is a free keyboard simulation program with very powerful automating capabilities. It can be used to access windows, read data from spreadsheets, write to display files and enter data in screens. There is a separate Window Information utility that comes with Autoit which displays what Autoit sees when windows are active. This has produced ambiguous information in the past. &lt;br /&gt;
&lt;br /&gt;
R99C999 (BR row &amp;amp; col) now appears in the text field of BR labels.&lt;br /&gt;
&lt;br /&gt;
Individual BR input fields may be referenced in Autoit as    EditNN    where NN is the INPUT FIELDS subscript (CURFLD) of the field.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ENVIRONMENT INTERROGATION==&lt;br /&gt;
&lt;br /&gt;
ENV$(&amp;quot;STATUS [ .sub-keyword ] ... &amp;quot; [, mat config$ [, search-arg] ...] )&lt;br /&gt;
&lt;br /&gt;
ENV$ returns a string or, in the event MAT CONFIG$ is provided, ENV$ redimensions and loads it. For a list of valid keywords issue a STATUS ENV command. If an array is specified, it may be followed by one or more case insensitive substrings which are regarded as restricting search arguments.&lt;br /&gt;
&lt;br /&gt;
e.g.  ENV$(&amp;quot;SERVER_PLATFORM&amp;quot;)      returns “WINDOWS”&lt;br /&gt;
&lt;br /&gt;
The following program displays all STATUS information that contains the word “file”:&lt;br /&gt;
&lt;br /&gt;
 00100    dim CONFIG$(1)*100&lt;br /&gt;
 00120    let ENV$(&amp;quot;STATUS&amp;quot;,MAT CONFIG$,&amp;quot;file&amp;quot;)&lt;br /&gt;
 00140    print MAT CONFIG$&lt;br /&gt;
&lt;br /&gt;
The above program produces the following output:&lt;br /&gt;
&lt;br /&gt;
 CHAINDFLT - Look for object files with source first.&lt;br /&gt;
 EDITOR C:\PROGRAM FILES\MILLS ENTERPRISE\MYEDITBR\MYEDITBR.EXE&lt;br /&gt;
 FILENAMES LOWER_CASE&lt;br /&gt;
 OPTION 23 is OFF - prevent data conversion errors from moving file position&lt;br /&gt;
 OPTION 25 is ON - make FILE$(0) be CON: if in windows&lt;br /&gt;
 OPTION 26 is OFF - suppress creation of .BAK files&lt;br /&gt;
 OPTION 29 is ON - save programs as .WB files&lt;br /&gt;
 OPTION 33 is 64 - locking position for large file support&lt;br /&gt;
 OPTION 49 is OFF - use relative path for spool file&lt;br /&gt;
 OPTION 51 is OFF - recover deleted records for all files&lt;br /&gt;
 SPOOLCMD prt.bat [SPOOLFILE] [COPIES] [PRINTER]&lt;br /&gt;
 Server File: :c:\wbserver.dat&lt;br /&gt;
 BR Config File: :C:\ADS\SYS\br.d\brconfig.sys&lt;br /&gt;
 Executable File: :C:\ADS\SYS\br.d\ &lt;br /&gt;
 brserver-430beta+q-Win32-DebugEfence-2011-03-20.exe&lt;br /&gt;
 Serial File: :C:\ADS\SYS\br.d\brserial.dat&lt;br /&gt;
 Workfile path: :c:\ads&lt;br /&gt;
 Open File #  0  :CON:&lt;br /&gt;
&lt;br /&gt;
If I just want the options with the word file then I would use:&lt;br /&gt;
&lt;br /&gt;
 00100    dim CONFIG$(1)*100&lt;br /&gt;
 00120    let ENV$(&amp;quot;STATUS.CONFIG.OPTION&amp;quot;,MAT CONFIG$,&amp;quot;file&amp;quot;)&lt;br /&gt;
 00140    print MAT CONFIG$&lt;br /&gt;
&lt;br /&gt;
Which produces:&lt;br /&gt;
 OPTION 23 is OFF - prevent data conversion errors from moving file position&lt;br /&gt;
 OPTION 25 is ON - make FILE$(0) be CON: if in windows&lt;br /&gt;
 OPTION 26 is OFF - suppress creation of .BAK files&lt;br /&gt;
 OPTION 29 is ON - save programs as .WB files&lt;br /&gt;
 OPTION 33 is 64 - locking position for large file support&lt;br /&gt;
 OPTION 49 is OFF - use relative path for spool file&lt;br /&gt;
 OPTION 51 is OFF - recover deleted records for all files &lt;br /&gt;
&lt;br /&gt;
Note that while keywords are case insensitive, they must be correctly specified, whereas search arguments are more “friendly”. For a complete list of valid keywords, issue the command:&lt;br /&gt;
&lt;br /&gt;
	STATUS ENV -p&lt;br /&gt;
&lt;br /&gt;
Some of the new keywords supported are:&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM&amp;quot;) is &amp;quot;WINDOWS&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.BR_BUILD_TYPE&amp;quot;) is &amp;quot;DebugEfence&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.BR_BUILD_DATE&amp;quot;) is &amp;quot;2011-05-12&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.BR_BITS&amp;quot;) is &amp;quot;32&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.OS_BITS&amp;quot;) is &amp;quot;64&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.OS_VERSION_NAME&amp;quot;) is &amp;quot;Windows 7&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;CLIENT_PLATFORM.OS_VERSION_NUMBER&amp;quot;) is &amp;quot;6.1&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM&amp;quot;) is &amp;quot;LINUX&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.BR_BUILD_TYPE&amp;quot;) is &amp;quot;DebugEfence&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.BR_BUILD_DATE&amp;quot;) is &amp;quot;2011-05-13&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.BR_BITS&amp;quot;) is &amp;quot;64&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.OS_BITS&amp;quot;) is &amp;quot;&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.OS_VERSION_NAME&amp;quot;) is &amp;quot;#36-Ubuntu SMP Thu Jun 3 20:38:33 UTC 2010&amp;quot;&lt;br /&gt;
*ENV$(&amp;quot;SERVER_PLATFORM.OS_VERSION_NUMBER&amp;quot;) is &amp;quot;2.6.32-22-server&amp;quot;	&lt;br /&gt;
*BR_MODEL		  “CLIENT/SERVER” or “COMBINED”&lt;br /&gt;
&lt;br /&gt;
== NEW WORLD SQL SUPPORT==&lt;br /&gt;
&lt;br /&gt;
CONFIG DATABASE db-ref  DSN=dsn-ref  [, USER= department | LOGIN_NAME | ? ]&lt;br /&gt;
     [, {PASSWORD= dept-password | BR_PASSWORD | ?} | PASSWORDD=encrypted-passwd ]&lt;br /&gt;
? indicates prompt&lt;br /&gt;
BR_PASSWORD indicates the password used during client login. If running the standard model ( not client-server ) then this is equivalent to “?”.&lt;br /&gt;
encrypted-passwd is the DB password encrypted with the key stated in OPTION 66.&lt;br /&gt;
            - or -&lt;br /&gt;
CONFIG DATABASE db-ref  CONNECTSTRING=&amp;quot;Driver={Microsoft Access Driver (*.mdb)}&lt;br /&gt;
e.g.       DBQ=C:\inetpub\wwwroot\BegASP\Chapter.14\Contact.mdb&amp;quot;&lt;br /&gt;
            - or -&lt;br /&gt;
CONFIG DATABASE ODBC-MANAGER&lt;br /&gt;
This will invoke the ODBC Manager to define or identify a file DSN.&lt;br /&gt;
&lt;br /&gt;
OPEN #20: &amp;quot;DATABASE= db-ref&amp;quot; , SQL &amp;quot;sql-statement&amp;quot;, OUTIN&lt;br /&gt;
             - or -&lt;br /&gt;
OPEN #20: &amp;quot;DATABASE= db-ref, Name= filename&amp;quot; , SQL, OUTIN&lt;br /&gt;
     - filename refers to a DISPLAY file containing an SQL statement&lt;br /&gt;
       that gets executed when a WRITE statement is processed -&lt;br /&gt;
&lt;br /&gt;
===Sequence of Operations===&lt;br /&gt;
&lt;br /&gt;
1. Begin processing with a WRITE statement.&lt;br /&gt;
2. If the WRITE contains an IO list of values then it is used to populate the &#039;filename&#039; SQL before it is executed. In this process IO list values replace question marks in the original SQL, positionally left to right.  These question marks only work with SQL arguments that refer to stored data. Question marks cannot be specified where SQL keywords or table column names appear. &lt;br /&gt;
3. This may or may not produce a result set. If it does, the result set may be processed like a BR file opened RELATIVE. Some operations that use file positioning may be slow since the whole result set may not be in memory immediately. Simple sequential access should be fairly quick.&lt;br /&gt;
4. Once SQL has been populated by an IOlist, it may be reused with the same values by issuing a WRITE with no IOlist.&lt;br /&gt;
5. READ IOlist variable associations are positional with each READ accessing one row of values.&lt;br /&gt;
&lt;br /&gt;
=== SQL Date Format Functions===&lt;br /&gt;
&lt;br /&gt;
A$ = SQL_DATE$(BR-date-string,&amp;quot;format-mask&amp;quot;)    ! format date for storage&lt;br /&gt;
B$ = BR_DATE$( SQL-date-string,&amp;quot;format-mask&amp;quot;)   ! unpack DB date value&lt;br /&gt;
&lt;br /&gt;
=== SQL Table Interrogation===&lt;br /&gt;
&lt;br /&gt;
“ENV$ (STATUS)” has been extended to interrogate database connections and ODBC data sources. A program called ENVDB.BRS has been written to demonstrate how this extension works and to show how to setup linkage to a database or ODBC data source. Run the program as is to bring up the Microsoft ODBC manager. Then select a data source and look at the output from the program. This will also show you how to get and use connect strings. In this example lines 1900 and 2000 accomplish the same open as line 1800 in my environment. &lt;br /&gt;
&lt;br /&gt;
Try it on your Windows workstation. As long as you have one or more ODBC drivers supported you can use it without having to install a database. You can even use it to interrogate Excel files because Microsoft provides an ODBC driver for that. &lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate database interrogation entry is:&lt;br /&gt;
&lt;br /&gt;
 01000 ! Replace Envdb&lt;br /&gt;
 01020    dim DATABASES$(1)*100&lt;br /&gt;
 01040    dim DATABASE$*100&lt;br /&gt;
 01060    dim TABLES$(1)*100&lt;br /&gt;
 01080    dim TABLE$*100&lt;br /&gt;
 01100    dim COLUMNS$(1)*100&lt;br /&gt;
 01120    dim COLUMN$*100&lt;br /&gt;
 01140    dim C$*100,FLD1$*40,FLD2$*40,FLD3$*40,FLD4$*40&lt;br /&gt;
 01160    execute &amp;quot;CONFIG database testdb odbc-manager&amp;quot;&lt;br /&gt;
 01180 !   Execute &amp;quot;CONFIG database testdb DSN=&#039;Accounts Payable&#039;&amp;quot;&lt;br /&gt;
 01220 !   Execute &amp;quot;CONFIG database testdb connectstring=&amp;quot;&amp;quot;DSN=Excel Files;DBQ=L:\orders\Beneficial - A-PORCEL.xls;DefaultDir=L:\orders;DriverId=1046;MaxBufferSize=2048&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 01230 ! *****  Open Output File&lt;br /&gt;
 01240    open #1: &amp;quot;name=envdb.txt,replace&amp;quot;,display,output &lt;br /&gt;
 01420 Dump_Table: ! ***** Dump Table Layout&lt;br /&gt;
 01440    let OUTFD = 1&lt;br /&gt;
 01460    let ENV$(&amp;quot;status.database.LIST&amp;quot;, MAT DATABASES$)  !List of db&#039;s&lt;br /&gt;
 01480    for DATABASE=1 to UDIM(DATABASES$)  !For each connected database&lt;br /&gt;
 01500       let DATABASE$=DATABASES$(DATABASE)&lt;br /&gt;
 01520       let FNSHOW_DATABASE(DATABASE$, &amp;quot;status.database.&amp;quot;&amp;amp;DATABASE$)&lt;br /&gt;
 01540    next DATABASE&lt;br /&gt;
 01560    end &lt;br /&gt;
 01580 ! &lt;br /&gt;
 01600    def FNSHOW_DATABASE(DATABASE$*100, ST_PREFIX$*100)&lt;br /&gt;
 01620       print #OUTFD: DATABASE$&lt;br /&gt;
 01640       let OUT_PREFIX$=CHR$(9)&lt;br /&gt;
 01660       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;DSN=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DSN&amp;quot;)&lt;br /&gt;
 01680       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;CONNECTSTRING=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.CONNECTSTRING&amp;quot;)&lt;br /&gt;
 01700       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Tables:&amp;quot;&lt;br /&gt;
 01720       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.TABLES&amp;quot;&lt;br /&gt;
 01740       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT TABLES$)&lt;br /&gt;
 01760       for TABLE = 1 to UDIM(MAT TABLES$)&lt;br /&gt;
 01780          let TABLE$=TABLES$(TABLE)&lt;br /&gt;
 01800          let FNSHOW_TABLE(TABLE$, ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;TABLE$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 01820       next TABLE&lt;br /&gt;
 01840    fnend &lt;br /&gt;
 01860 ! &lt;br /&gt;
 01880    def FNSHOW_TABLE(TABLE$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 01900       print #OUTFD: OUT_PREFIX$&amp;amp;TABLE$&lt;br /&gt;
 01920       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 01940       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table remarks=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.REMARKS&amp;quot;)&lt;br /&gt;
 01960       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Table type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 01980       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Columns:&amp;quot;&lt;br /&gt;
 02000       let ST_PREFIX$=ST_PREFIX$&amp;amp;&amp;quot;.COLUMNS&amp;quot;&lt;br /&gt;
 02020       let ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LIST&amp;quot;, MAT COLUMNS$)&lt;br /&gt;
 02040       for COLUMN = 1 to UDIM(MAT COLUMNS$)&lt;br /&gt;
 02060          let COLUMN$=COLUMNS$(COLUMN)&lt;br /&gt;
 02080          let FNSHOW_COLUMN(COLUMN$, ST_PREFIX$&amp;amp;&amp;quot;.&amp;quot;&amp;amp;COLUMN$,OUT_PREFIX$&amp;amp;CHR$(9))&lt;br /&gt;
 02100       next COLUMN&lt;br /&gt;
 02120    fnend &lt;br /&gt;
 02140 ! &lt;br /&gt;
 02160    def FNSHOW_COLUMN(COLUMN$*100, ST_PREFIX$*100, OUT_PREFIX$)&lt;br /&gt;
 02180       print #OUTFD: OUT_PREFIX$&amp;amp;COLUMN$&lt;br /&gt;
 02200       let OUT_PREFIX$=OUT_PREFIX$&amp;amp;CHR$(9)&lt;br /&gt;
 02220       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column type=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.TYPE&amp;quot;)&lt;br /&gt;
 02240       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column length=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.LENGTH&amp;quot;)&lt;br /&gt;
 02260       print #OUTFD: OUT_PREFIX$&amp;amp;&amp;quot;Column decimals=&amp;quot;&amp;amp;ENV$(ST_PREFIX$&amp;amp;&amp;quot;.DECIMALS&amp;quot;)&lt;br /&gt;
 02280    fnend&lt;br /&gt;
&lt;br /&gt;
==  BR DATA ENCRYPTION==&lt;br /&gt;
&lt;br /&gt;
Encryption encompasses a number of different operations.  These operations can be used independently or in combination to meet different needs.  We use industry standard encryption available through OpenSSL.  Three technologies are widely used for encrypting data. BR supports the first two listed below through its ENCRYPT and DECRYPT functions. &lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
1. Symmetric key ciphers – where the same key is used to encrypt and decrypt data.  You can specify a key to encrypt some data and later use the same key to decrypt the data.&lt;br /&gt;
&lt;br /&gt;
2. Hashing routines – one way routines that take data and convert it to a hash value.  Sometimes these are thought of as checksums such as MD5 sum.  Hash values are always the same length regardless of how big the hashed data is.  A 10 gb file will have a hash result that is the same length as a 200 byte file.  Hashing routines have a number of specific uses.&lt;br /&gt;
&lt;br /&gt;
1. Verify that data has not changed.&lt;br /&gt;
&lt;br /&gt;
2. Verifying that two files are the same.&lt;br /&gt;
&lt;br /&gt;
3. Validating passwords – this is based on the concept that if two values have the same hash value the values are equal.  Using this technique improves security because it allows a server to store passwords in an unrecoverable format.  Even the server software is unable to regenerate the original password.  It is only capable of checking if the hash of a password matches the stored password hash.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Symmetric Key Ciphers===&lt;br /&gt;
&lt;br /&gt;
There are two encryption functions in the BR language, ENCRYPT$ and DECRYPT$.&lt;br /&gt;
&lt;br /&gt;
 ENCRYPT$(Data$ [,Key$ [,Encryption-type$, [,Initialization-vector$]]])&lt;br /&gt;
 DECRYPT$(Data$ [,Key$ [,Encryption-type$, [,Initialization-vector$]]])&lt;br /&gt;
&lt;br /&gt;
Data$ - The data to be encrypted&lt;br /&gt;
&lt;br /&gt;
Key$ - The secret key to be used for encryption.  If not specified this value will come from an OPTION 66 statement.&lt;br /&gt;
&lt;br /&gt;
Encryption-type$ - The type of encryption to be done.  If not specified, a common high strength encryption type will be employed.  This is described in more detail below, but is generally only useful for interfacing with other typically non-BR programs.&lt;br /&gt;
&lt;br /&gt;
Initialization-vector$ - This is an arcane part of encryption standards.  It exists to prevent attackers from being able to tell whether the unencrypted data has changed.  This is described in more detail below, but is general only needed when interfacing with other non-BR programs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Interfacing With Other Programs (encryption type and initialization vector)===&lt;br /&gt;
&lt;br /&gt;
There are a number of different types of encryption that BR supports through OpenSSL:  AES, BLOWFISH, DES, triple DES, RC4 and RC2.  Most symmetric key ciphers are block ciphers meaning that they encrypt one block at a time.  This means if you have a bit message, it is broken up into multiple blocks and each block is encrypted.  The block size can be set as (128, 192, 256) bits.  Some encryption types don&#039;t support all of these values so STATUS ENCRYPTION should be checked to see what encryption types are available in BR.  Besides block size, there are also various schemes for blocking data.  One might expect that using 256 bit blocking would simply take every 32 bytes and call it a block.  This is not done though because there is a possibility that this would cause patterns in the encrypted data.  To prevent this, there are various schemes known as codebooks which change the way data is blocked.  Wikipedia explains this in more detail.  If the encryption type is not specified AES:256:CBC:128 will be used.  To be compatible with other programs the entire encryption type must be specified (cipher: key length: codebook: invitialization vector length).&lt;br /&gt;
&lt;br /&gt;
Initialization-vector – this is used to cause the same data encrypted with the same key to have a different encrypted result.  This is significant because otherwise an attacker looking at data seeing the same encrypted result twice would know that the key and the unencrypted data have not changed.  Regardless of whether or not you are concerned about this potential security issue, the standard encryption methods require this value so interfacing with other programs may require you to use it.  It is a common practice to use a random number for this value and store the value at the beginning of (ahead of) the encrypted result.  This is what BR does if this parameter is omitted.&lt;br /&gt;
&lt;br /&gt;
As an example:&lt;br /&gt;
 ENCRYPT$(“test”, “key”) &lt;br /&gt;
Produces a string containing “random number initialization vector”&amp;amp;”encrypted result”.&lt;br /&gt;
&lt;br /&gt;
If the initialization vector is explicitly specified as in:&lt;br /&gt;
ENCRYPT$(“test”, “key”, “AES:256:CBC:128”, “RANDOM”) &lt;br /&gt;
the result would be simply “encrypted result”.&lt;br /&gt;
&lt;br /&gt;
DECRYPT$ has the same arguments as ENCRYPT$ with the exception of the first parameter which is the encrypted data.  DECRYPT$ expects to be used with the same key$, encryption-type$, and initialization-vector$ as was used to encrypt the data.  As with ENCRYPT$, if key$ is not specified, the value from the OPTION statement will be used.  If encryption-type$ is not specified, “AES:256:CBC:128” will be used.  If the initialization vector is not specified, it will be assumed that the encrypted data starts with an initialization vector.&lt;br /&gt;
&lt;br /&gt;
=== Hashing Routines===&lt;br /&gt;
&lt;br /&gt;
Three common forms of hashing are allowed in BR.  They are MD5, SHA, and SHA-1.  These are also provided through the ENCRYPT$ function specifying a null key$ value:&lt;br /&gt;
&lt;br /&gt;
ENCRYPT$(data$, “”, “MD5”)&lt;br /&gt;
ENCRYPT$(data$, “”, “SHA”)&lt;br /&gt;
ENCRYPT$(data$, “”, “SHA-1”)&lt;br /&gt;
&lt;br /&gt;
Hashing is also referred to as Message Digests or digests.  This is what the MD in MD5 means.  There is no way to restore data that has been hashed.   Hashing is a one way function so DECRYPT$ will yield an error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Asymmetric Encryption===&lt;br /&gt;
&lt;br /&gt;
Asymmetric key encryption is also known as public/private key encryption. &lt;br /&gt;
&lt;br /&gt;
Public/private keys are created as a pair by a key generator.  They are a pair, and it is not possible to have two public keys for the same private key or vice versa.   With regard to public/private key pairs, what one key encrypts the other key can decrypt, and neither key can decrypt what it has encrypted.  When a private key is used to encrypt data, the result is called a signature because everyone who has the public key can decrypt it.&lt;br /&gt;
&lt;br /&gt;
This technique is used for:&lt;br /&gt;
&lt;br /&gt;
Signing (using certificates) – A private key can be used to sign data.  The result of such signing can be tested/validated with the corresponding public key. &lt;br /&gt;
&lt;br /&gt;
Data encryption – A public key can be used to encrypt data.  This data can then only be decrypted by the corresponding private key. &lt;br /&gt;
&lt;br /&gt;
Hashes and signing are different but used together.  Rather than signing a large block of data which would create a large signature, only the hash is signed to create much smaller fixed length signature data.  When verifying a large block of signed data, the data is used to create a hash value and the hash value is compared to a decrypted signature.&lt;br /&gt;
&lt;br /&gt;
Asymmetric encryption is not accessible through the BR ENCRYPT$, DECRYPT$ functions.  However, it is used by our SSL client server connections and HTTPS.  Certificates are most commonly used by SSL and HTTPS and are less useful for other application processes. In the Client Server model the client knows the server’s public key and the server uses its private key to encrypt and decrypt.&lt;br /&gt;
&lt;br /&gt;
Encryption is invoked by Business Rules HTTP support as follows:&lt;br /&gt;
&lt;br /&gt;
 CONFIG HTTPS PORT port-number   [ LOG file-pathname ]&lt;br /&gt;
 CONFIG OPTION  66   private-key-file-encryption-password&lt;br /&gt;
 OPEN #400: “HTTP=SERVER”, DISPLAY, OUTIN&lt;br /&gt;
&lt;br /&gt;
The BRSERVER executable directory must contain two files: &lt;br /&gt;
* https-private.pem&lt;br /&gt;
* https-cert.pem&lt;br /&gt;
&lt;br /&gt;
These files are made by the following commands under Linux, MAC and cygwin for Windows:&lt;br /&gt;
openssl req -new -x509 -out httpserver.pem -days 10000&lt;br /&gt;
&lt;br /&gt;
( this will prompt for the OPTION 66 password )&lt;br /&gt;
&lt;br /&gt;
 mv privkey.pem   https-private.pem&lt;br /&gt;
 mv httpserver.pem   https-cert.pem&lt;br /&gt;
&lt;br /&gt;
This port specific service can then be accessed with browsers. When the specified port is accessed through a browser, BR establishes an HTTPS connection rather than an HTTP connection.  &lt;br /&gt;
&lt;br /&gt;
=== Signing and Certificate Processing Industry Standards===&lt;br /&gt;
&lt;br /&gt;
Certain companies are authorized by the government to act as a Certificate Authority ( CA ). These companies ( e.g. Verisign ) issue electronic certificates which can be used to issue second level certificates. Certificates can have expiration dates and the line of authority extends from a CA to any number of levels (but a chain is only as strong as its weakest link). Certificates contain a list of signatures (described below) that trace back to a CA as follows: &lt;br /&gt;
&lt;br /&gt;
When a company needs to obtain a certificate from a CA, it prepares its own certificate and sends it to the CA for signature. The CA provides the signature and the CA’s own public key for validating it. The text in such certificates will identify the signing authority ( CA ) and the recipient of the certificate. It also contains the public key of both the signer and the recipient. &lt;br /&gt;
&lt;br /&gt;
Browsers know the CA identities and their public keys. A browser can verify a CA issued cert by hashing it, decrypting the signature with the known public key and matching the decrypted signature against the hash total. &lt;br /&gt;
 &lt;br /&gt;
Any company that is issued a certificate by a CA can sign second level certificates issued to third parties. A second level cert contains the parent (CA issued) certificate, and includes the public keys of the issuer and the recipient. The signature is essentially the encrypted hash total of ‘itself plus all of its ancestors’. Additional levels each contain the chain of certificates leading from a CA issued cert to itself. &lt;br /&gt;
&lt;br /&gt;
Ostensibly, a certificate cannot be counterfeited because it requires the signature of its parent which can only be produced with its parent’s private key.  By providing both public keys ( signer and recipient ) in all certs along with signatures, a non-forgeable or alterable chain is established. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
CA public key – known to browser&lt;br /&gt;
certificate 1 (signed by CA)&lt;br /&gt;
certificate 2 (signed by second level - includes certificate 1)&lt;br /&gt;
final certificate (signed by third level - includes certificate 2)&lt;br /&gt;
 &lt;br /&gt;
A browser would find the CA information in the certificate and check to see if it is in the browser’s internal list.  If not it fails.  Then it verifies that certificate 1 (which ends up being part of the final certificate) has been signed by the CA.  After that it checks certificate 2 and verifies that it has been signed with certificate 1.  Finally it checks the final certificate and verifies that it has been signed with certificate 2.&lt;br /&gt;
 &lt;br /&gt;
To assure the line authority of any certificate, the public keys are associated with signers, not with documents.&lt;br /&gt;
&lt;br /&gt;
== ODBC VERSION 4.3==&lt;br /&gt;
&lt;br /&gt;
Improved installation routines:&lt;br /&gt;
Easy to use&lt;br /&gt;
Compatible with Windows Vista/7&lt;br /&gt;
Compatible with 64 Bit Machines (both 32 and 64 bit drivers).&lt;br /&gt;
Easily create DNS entries from the CONTEXT using a BR program called CREATE_INI.BR. (You will need to tailor the resulting INI file to the target setting.)&lt;br /&gt;
Installation on a client can be done from a command line avoiding the need for human interaction at the client. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Support for 64 bit Record Locking (No 2GB Limit!).&lt;br /&gt;
Implemented Dynamic (on the fly) Indexes.&lt;br /&gt;
The ODBC splash screen has been removed.&lt;br /&gt;
&lt;br /&gt;
ODBC Logging:&lt;br /&gt;
*Set Logging to level 6 or greater.&lt;br /&gt;
*LOGGING 6, C:\ODBC-LOG.TXT&lt;br /&gt;
*Log file will provide helpful information to analyze queries.&lt;br /&gt;
*Actual SQL processed by Driver (As opposed to the SQL typed in MS-Access or MS-Excel)&lt;br /&gt;
*Indexes used by the Query. (To help determine the &amp;quot;BEST Query&amp;quot; for performance).&lt;br /&gt;
&lt;br /&gt;
More Robust:&lt;br /&gt;
*Improved Date Handling (Sort/Filter, etc).&lt;br /&gt;
*Improved Joins leverage &amp;amp;/or create indexes for performance.&lt;br /&gt;
*Improved Group By queries&lt;br /&gt;
*Improved &amp;quot;Like&amp;quot; filters.&lt;br /&gt;
*Improved Multiple Filters in a single query&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ODBC Licensing And Security===&lt;br /&gt;
&lt;br /&gt;
Licenses will be issued based on number of workstations or number of BR WSIDs.&lt;br /&gt;
&lt;br /&gt;
The price per user for licensing based on the number of BR WSIDs is one half of the price based on the number of ODBC workstations. &lt;br /&gt;
&lt;br /&gt;
The maximum license fee for ODBC is $4900.&lt;br /&gt;
&lt;br /&gt;
====Enforcement====&lt;br /&gt;
If the ODBC license is based on the number of BR users, then the BRSERIAL.DAT file always specifies 999 users. &lt;br /&gt;
&lt;br /&gt;
We assign a random number to each machine that uses the ODBC driver and another random number to each user of ODBC. These numbers are stored along with the date, encrypted in a table in the server and client registries.  Each time a session is started, the client is checked for pre-existing control numbers and if they exist then the numbers are used for the session (along with the current date). If a client reports a pre-existing number less than 14 days old that is not in the server table, then an alarm is signaled. This indicates tampering with the server table.&lt;br /&gt;
&lt;br /&gt;
When a control number pair is about to be added to the server table and the table is full then it is searched for an entry more than 14 days old for replacement. If no such entry exists, then a “maximum users exceeded” error message is presented. &lt;br /&gt;
&lt;br /&gt;
When a computer is replaced, this can leave an unusable entry in the server table for up to 14 days. If this occurs, then the user can run a program on the server that writes an encrypted header with the current date to the server table indicating that the table has been cleared in a licensed manner.  After this has been run, all entries in the table will be available for reuse.  Clients that have pre-existing control numbers will not generate the tamper error when the license file is cleared in this manner unless the client last used date is greater than the encrypted header date. This program requires a password which is an encrypted form of the current date plus the serial number. Only the dealer has the password producing program so only the dealer can obtain the current day’s password. &lt;br /&gt;
&lt;br /&gt;
When a client machine has more than two ODBC user entries, the entries greater than&lt;br /&gt;
one are counted as separate workstations. e.g. 1 or 2 -&amp;gt;1, 3-&amp;gt;2, 4-&amp;gt;3, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Procedure for Utilizing MS Access ODBC Middleware ===&lt;br /&gt;
&lt;br /&gt;
A procedure has been established for greatly expanding the SQL capabilities of the BR ODBC driver by routing ODBC requests through MS Access. Using this technique one can create reusable queries that combine several tables. This procedure is described in the installation guide. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  PRINT FONT STRETCHING==&lt;br /&gt;
&lt;br /&gt;
When we developed the PDF printing facility we encountered a problem getting PDF to print exactly like NWP and PCL.  This was partly because early in NWP development we stretched the fixed width fonts vertically for maximum legibility. So in version 4.2 we adopted a default font that was more like PCL that we could print in both NWP and PDF.&lt;br /&gt;
&lt;br /&gt;
However, we eventually returned to the older stretched fonts because of their superior legibility. This issue affects only fixed width fonts. This stretching can be disabled with OPTION 68. &lt;br /&gt;
&lt;br /&gt;
We are now using Courier New as the default font.  pdflib4-Win32.dll adds support for this stretching to our PDF capabilities.&lt;br /&gt;
&lt;br /&gt;
Relative Font Heights ( height to width ratios ):&lt;br /&gt;
    Native Courier New  1.6 		- available in PCL -&lt;br /&gt;
    Native Letter Gothic  2.0		- available in PCL -&lt;br /&gt;
    Stretched Fonts 2.6		- NWP and PDF only -&lt;br /&gt;
&lt;br /&gt;
The 1.6, 2.0, 2.6 are ratios.  For Courier New the 1.6 means that the font is 1.6 times as high as it is wide.  PCL measures all fixed width fonts in width and calculates the height based on these ratios.  So for Courier New a 10 CPI font would be 1.6 * (1 / 10)(CPI) * 72 (points per inch) = 11.52 points.  Actually the ratio for Courier New appears to be 1.66666666.  This would mean that 1.66666666 * (1/10) * 72 = 12 points.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  EXTENDED DATE / TIME FUNCTIONS==&lt;br /&gt;
&lt;br /&gt;
Date numeric variables can now represent time of day in the fractional space (to the right of the decimal point). The DAYS and DATE masks have been extended as follows:&lt;br /&gt;
&lt;br /&gt;
H#.## or H denotes hours [ with fractions ].&lt;br /&gt;
M#.### or M#.# denotes minutes.&lt;br /&gt;
S#.####, S or S# denotes seconds.&lt;br /&gt;
&lt;br /&gt;
M, to the right of H always denotes minutes, so H:M:S is sufficient.&lt;br /&gt;
Either AM or PM, to the right of H denotes AM / PM output.&lt;br /&gt;
The absence of AM and PM denote military hours (0 – 23).&lt;br /&gt;
The maximum significant digits that can be represented in a numeric variable are 15. So if century, year, month and day are stored as a 5 digit day of century, then internally up to ten digits to the right of the decimal are available for time of day. &lt;br /&gt;
&lt;br /&gt;
Extended Date Mask Examples:&lt;br /&gt;
 DATE( “Month dd, ccyy at H#.## hours”)  -&amp;gt;  September 12, 2011 at 14.58 hours&lt;br /&gt;
 DATE( “mm/dd/yy at H:M AM”)  -&amp;gt;  09/15/11 at 2:35 PM&lt;br /&gt;
 DATE( “mon dd cy at H#:M# PM”)  -&amp;gt;  Sep 15 2011 at 02:35 PM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example of using DATE$ to get time to 9 decimal places:&lt;br /&gt;
 Date$(&amp;quot;H#:M#:S#.#########&amp;quot;) -&amp;gt; 14:06:22.968419347&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When storing date/time combinations on disk, you should allow for all of the significant digits that your date mask supports on each side of the decimal point. A “BH 4” form supports nine significant digits, which is suitable for day of century plus a four digit fraction. To exceed that you can use either PD 6, PD 7, PD 8 or D 8 (double floating point) to store these values on disk.  DATE() only works with day-of-century values along with an optional time fraction.&lt;br /&gt;
&lt;br /&gt;
==  NEW DATE MASK INPUT PROCESSING==&lt;br /&gt;
&lt;br /&gt;
DATE(mask) can now be used as an INPUT FIELDS specification.&lt;br /&gt;
&lt;br /&gt;
10 INPUT FIELDS “row, col, DATE(mask)  ,UH” : date-var&lt;br /&gt;
&lt;br /&gt;
Special keyboard processing:&lt;br /&gt;
Punctuation (commas, colons, slashes, semicolons, and dashes) is skipped during entry similar to PIC.&lt;br /&gt;
Insert and delete are supported within subfields that are delineated by punctuation.&lt;br /&gt;
Copy includes punctuation.&lt;br /&gt;
Cut is Copy with redisplay of zero date.&lt;br /&gt;
Paste causes BR to translate the date to DAYS format and then display the date. Excel and OpenOffice Calc application formats are supported.&lt;br /&gt;
If a string is pasted, it is first converted to DAYS using the provided mask.&lt;br /&gt;
If a zero DAYS value is displayed then Month, M3, Day and D3 mask positions contain dashes.&lt;br /&gt;
&lt;br /&gt;
A date picker has been added. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A new configuration statement is provided to control the when the date picker appears:&lt;br /&gt;
&lt;br /&gt;
DATE   [ALWAYS]  [INVALID]  [NEVER]&lt;br /&gt;
&lt;br /&gt;
Additionally, the leading attribute ^DATE_PICKER is available.&lt;br /&gt;
&lt;br /&gt;
INVALID ( the default mode ) presents the date picker whenever the days value of the expressed date is zero.&lt;br /&gt;
&lt;br /&gt;
ALWAYS and ^DATE_PICKER show the picker whenever the cursor is in the field until a date is selected from the picker.  Leaving the field and reentering it actives the picker again. &lt;br /&gt;
&lt;br /&gt;
When in the date picker the following keys are active:&lt;br /&gt;
Shift- PgUp/PgDn – Go to the previous/next month&lt;br /&gt;
Ctrl- PgUp/PgDn – Go to the previous/next year&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate date entry is:&lt;br /&gt;
01000 ! Rep Date_Input&lt;br /&gt;
01020 ! Demonstrate The New Date() Input Format&lt;br /&gt;
01040 ! Skip Punctuation (Commas, Colons, Slashes, Semicolons, And Dashes)&lt;br /&gt;
01060 ! Insert And Delete Within Subfields That Are Delineated By Punctuation&lt;br /&gt;
01080 ! Continue To Support Cut And Paste Including Punctuation&lt;br /&gt;
01100 ! &lt;br /&gt;
01120    rinput fields &amp;quot;5,10,DATE(mm/dd/yy) ;6,10,c&amp;quot;: DATE_VAR&lt;br /&gt;
01140    print fields &amp;quot;8,10,date(Month DD, CCYY)&amp;quot;: DATE_VAR&lt;br /&gt;
01160 ! &lt;br /&gt;
01180    rinput fields &amp;quot;12,10,date(month dd, ccyy)&amp;quot;: DATE_VAR&lt;br /&gt;
01200    if NOT DATE_VAR then goto 1180&lt;br /&gt;
01220    print fields &amp;quot;15,10,date(yy/mm/dd)&amp;quot;: DATE_VAR &lt;br /&gt;
01240    print fields &amp;quot;18,10,N 6&amp;quot;: DATE_VAR  !Show days format&lt;br /&gt;
&lt;br /&gt;
         &lt;br /&gt;
&lt;br /&gt;
==  NEW TEXT FIELD FORMAT==&lt;br /&gt;
&lt;br /&gt;
10  (R)INPUT FIELDS “row, col, TEXT rows/cols[/capacity],  leading-attr,  …”:&lt;br /&gt;
&lt;br /&gt;
This format is similar to the C/V/G format with the ^ENTER_LF attribute except:&lt;br /&gt;
No trailing space padding or trimming occurs.&lt;br /&gt;
Rows and columns are specified.&lt;br /&gt;
Field capacity or newlines can cause a vertical scrollbar to appear.&lt;br /&gt;
&lt;br /&gt;
Supported leading attributes are ^ENTER_LF (the default), ^ENTER_CRLF and ^NOWRAP.&lt;br /&gt;
The TEXT keyword will imply ^ENTER_LF unless ^ENTER_CRLF is specified.&lt;br /&gt;
&lt;br /&gt;
^ENTER_LF (the default) causes the ENTER key to add LF characters to the data and to go to a new line left justified. The cursor will retrace the data when backspace or left-arrow is keyed, meaning the on-screen LF characters are represented by moving the cursor, instead of allowing it to rest on invisible LF characters.&lt;br /&gt;
&lt;br /&gt;
^ENTER_CRLF may be specified in lieu of ^ENTER_LF. When that is the case, carriage returns entered are represented in the data as carriage-return-linefeed (CRLF) character pairs.  ^NOWRAP may be specified to suppress word wrapping. When ^NOWRAP is active, data is entered on the current line until ENTER is keyed to go to the next line. Both horizontal and vertical scroll bars appear as needed.&lt;br /&gt;
&lt;br /&gt;
Tabs are entered into the text. Shift-tab is ignored.&lt;br /&gt;
&lt;br /&gt;
Home, End and the arrow keys all operate relative to the current line as opposed to operating on the text box as a whole.&lt;br /&gt;
&lt;br /&gt;
Depressing the Control key causes the following keys to operate in the normal string entry mode:&lt;br /&gt;
&lt;br /&gt;
*Enter – Returns control to the BR program&lt;br /&gt;
*Tab – Goes to the next control&lt;br /&gt;
*Shift-Tab – Goes to the prior control&lt;br /&gt;
*Home – Goes to the beginning of data or the first field&lt;br /&gt;
*End – Goes to the end of data or the last field&lt;br /&gt;
*Left-Arrow/Up-Arrow – Goes to the prior control&lt;br /&gt;
*Right-Arrow/Down-Arrow – Goes to the next control&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[CurPos]] introduced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A sample program to demonstrate TEXT entry is:&lt;br /&gt;
 01000 ! Rep Text&lt;br /&gt;
 01020 ! Test New Text Fiueld Type&lt;br /&gt;
 01040    dim TEXT$*300, TEXT$(1)*80&lt;br /&gt;
 01060    print NEWPAGE&lt;br /&gt;
 01080    rinput fields &amp;quot;3,10,text 4/40/300,uh&amp;quot;: TEXT$&lt;br /&gt;
 01100    print fields &amp;quot;10,10,c&amp;quot;: TEXT$&lt;br /&gt;
 01120    print TEXT$&lt;br /&gt;
 01140    let STR2MAT(TEXT$, MAT TEXT$, CHR$(10))&lt;br /&gt;
 1160 rint MAT TEXT$&lt;br /&gt;
&lt;br /&gt;
==  INPUT ACROSS MULTIPLE WINDOWS==&lt;br /&gt;
&lt;br /&gt;
10  (R)INPUT FIELDS  #121: “10, 10, C 20, UH; 10, 12, PIC(##/##/##), UH;#124,&lt;br /&gt;
10, 10, C 30, UH”: aaa$, bbb$, ccc$&lt;br /&gt;
&lt;br /&gt;
This will input the first two fields on window #121 and the third field on window #124.  The ‘#window-number,’ prefix may appear in any row, col FIELDS specification and it overrides the window number that follows the PRINT/INPUT/RINPUT keyword. &lt;br /&gt;
&lt;br /&gt;
== CONFIG CONSOLE CHANGES==&lt;br /&gt;
&lt;br /&gt;
[[Console]] [[BRConfig.sys]] specification  introduced.&lt;br /&gt;
&lt;br /&gt;
==  BR IN A BROWSER==&lt;br /&gt;
&lt;br /&gt;
We have made it easy to setup BR in a Browser once you have Client Server working. &lt;br /&gt;
Point your browser at ads.net/plugin for a demonstration. Located in that directory is a file called index.html which is also on the FTP site in the BETA release browser-plugin directory.  Modify this file to setup your own web page. &lt;br /&gt;
&lt;br /&gt;
This HTML file demonstrates activation of BR client server in a browser. It first checks to see if the plugin is installed and if not it installs it. If needed, it updates the plugin from the ads.net site. It then initiates a connection to the server just like the BR client does. See the HTML file for further instructions, including how to confine BR to a window on the launch page if desired. &lt;br /&gt;
&lt;br /&gt;
A new OPTION 70 is provided which will default to being ON in the Browser version.  OPTION 70 will do the same thing as 54 (exit if BR enters command console mode), but it will be configurable to:&lt;br /&gt;
OPTION 70 OFF		! This can be set programmatically&lt;br /&gt;
OPTION 70 ON		! Same as OPTION 54 – the default for browsers&lt;br /&gt;
OPTION 70 RELAXED	! Mild security – enables some support&lt;br /&gt;
 &lt;br /&gt;
RELAXED mode is intended to allow some debugging but still provide some security.  This means disabling commands such as COPY, DIR, etc., CONFIG commands, and preventing changes from being made to BR programs. However, the security can be defeated  because all of these activities can be performed by programs or procedures. Use ON (the default) for high security. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  NEW AND CHANGED ERROR CODES==&lt;br /&gt;
* [[0000]] Successful completion no error&lt;br /&gt;
* [[0050]] Writing to BTREE2 file failed&lt;br /&gt;
* [[0059]] DEPRECATED ERROR: attempt to rewrite over key&lt;br /&gt;
* [[0063]] DEPRECATED ERROR: network locking error&lt;br /&gt;
* [[0417]] MSG string it too long&lt;br /&gt;
* [[0419]] Invalid MSG special char specification&lt;br /&gt;
* [[0436]] Bad flags for MAT2STR or STR2MAT&lt;br /&gt;
* [[0620]] DEPRECATED ERROR: duplicate OPEN for standard printer output&lt;br /&gt;
* [[0641]] DEPRECATED ERROR: missing protection device &lt;br /&gt;
* [[0635]] Error using SSL socket&lt;br /&gt;
* [[0717]] Error deleting record from BTREE2 file&lt;br /&gt;
* [[0727]] DEPRECATED ERROR: FORM variable not referenced&lt;br /&gt;
* [[0807]] Border characters can no longer be specified&lt;br /&gt;
* [[0814]] Bad or missing trailing attribute&lt;br /&gt;
* [[0818]] DEPRECATED ERROR: number too large for PIC format&lt;br /&gt;
* [[0865]] DEPRECATED ERROR: invalid attribute combination&lt;br /&gt;
* [[0887]] Sort column is not valid&lt;br /&gt;
* [[0930]] INPUT FIELDS &amp;quot;...RANGE&amp;quot; bad range variables&lt;br /&gt;
* [[0931]] Invalid insert or delete change with range&lt;br /&gt;
* [[0940]] Value does not match boolean format&lt;br /&gt;
* [[0941]] NULL boolean value used where allow null is false&lt;br /&gt;
* [[0945]] The length of the date format is excessively long&lt;br /&gt;
* [[1008]] Invalid keyword in shell interpreter&lt;br /&gt;
* [[1033]] Scalar variable in an array group&lt;br /&gt;
* [[2022]] The given encryption method does not exist&lt;br /&gt;
* [[2024]] The encryption method is only valid one way&lt;br /&gt;
* [[2026]] Missing encryption key&lt;br /&gt;
* [[2030]] Failed processing encryption&lt;br /&gt;
* [[2070]] DEPRECATED ERROR: not enough memory&lt;br /&gt;
* [[2080]] DEPRECATED ERROR: insufficient dimensioned storage&lt;br /&gt;
* [[2090]] DEPRECATED ERROR: not enough compilation storage&lt;br /&gt;
* [[2100]] Too many active procedures&lt;br /&gt;
* [[2101]] Illegal line number&lt;br /&gt;
* [[2102]] GO attempted without running program&lt;br /&gt;
* [[2103]] Illegal PROC parameter&lt;br /&gt;
* [[2104]] No active lines to run&lt;br /&gt;
* [[2108]] Program is active&lt;br /&gt;
* [[2109]] No program in memory to SAVE or REPLACE&lt;br /&gt;
* [[2111]] Missing lines for a program in object code&lt;br /&gt;
* [[2116]] Cannot SAVE during LOAD or MERGE&lt;br /&gt;
* [[2120]] DEPRECATED ERROR: not enough compilation storage&lt;br /&gt;
* [[2130]] Program changed since LOAD at another workstation&lt;br /&gt;
* [[3031]] DEPRECATED ERROR: 0 bytes available on disk&lt;br /&gt;
&lt;br /&gt;
* [[4002]] SQL create statement failed&lt;br /&gt;
* [[4003]] SQL free statement failed&lt;br /&gt;
* [[4004]] SQL prepare failed&lt;br /&gt;
* [[4005]] SQL clear old results failed&lt;br /&gt;
* [[4006]] SQL execute direct failed&lt;br /&gt;
* [[4007]] WRITE to SQL with incorrect number of data elements&lt;br /&gt;
* [[4008]] SQL describe result set columns failed&lt;br /&gt;
* [[4009]] SQL bind result set columns failed&lt;br /&gt;
* [[4010]] SQL fetch row failed&lt;br /&gt;
* [[4011]] SQL bind parameter failure&lt;br /&gt;
* [[4012]] Prepared SQL execution failure&lt;br /&gt;
* [[4014]] Error converting time stamp to string value or back&lt;br /&gt;
&lt;br /&gt;
* [[4114]] DEPRECATED ERROR: invalid disk or disk drive reference&lt;br /&gt;
* [[4115]] The specified database has not been opened&lt;br /&gt;
* [[4120]] Invalid Y2K data found in an index field&lt;br /&gt;
* [[4121]] DEPRECATED ERROR: invalid use of key file&lt;br /&gt;
* [[4123]] Corrupted BTREE index&lt;br /&gt;
* [[4128]] DEPRECATED ERROR: invalid file name&lt;br /&gt;
* [[4135]] DEPRECATED ERROR: volume ID invalid&lt;br /&gt;
* [[4137]] DEPRECATED ERROR: not enough storage space to create file&lt;br /&gt;
* [[4138]] Can&#039;t rename between client and server&lt;br /&gt;
* [[4140]] DEPRECATED ERROR: shared memory problem&lt;br /&gt;
* [[4141]] DEPRECATED ERROR: shared memory problem&lt;br /&gt;
* [[4142]] DEPRECATED ERROR: too many opened file names&lt;br /&gt;
* [[4143]] DEPRECATED ERROR: out of shared memory&lt;br /&gt;
* [[4144]] DEPRECATED ERROR: network semaphore error&lt;br /&gt;
* [[4145]] Time out while waiting for input from user or ASYNC file I/O&lt;br /&gt;
* [[4147]] A file has been opened too many times at the share level&lt;br /&gt;
* [[4149]] Different version of BR running with locking&lt;br /&gt;
* [[4159]] DEPRECATED ERROR: volume not on line&lt;br /&gt;
* [[4160]] Out of internal file handles&lt;br /&gt;
* [[4174]] Attempted file reservation on non-local file&lt;br /&gt;
* [[4175]] Multiple wbserver files detected&lt;br /&gt;
* [[4177]] DEPRECATED ERROR: windows shell call without command&lt;br /&gt;
* [[4179]] Failed to lock in progress on wbserver.dat&lt;br /&gt;
* [[4180]] Bad drive statement&lt;br /&gt;
* [[4185]] Setting the directory failed on the client side&lt;br /&gt;
* [[4194]] REWRITE check for null bytes failed&lt;br /&gt;
* [[4195]] READ check for null bytes failed&lt;br /&gt;
* [[4196]] WRITE check for null bytes failed&lt;br /&gt;
&lt;br /&gt;
* [[4200]] DEPRECATED ERROR: DOS/Windows/Novell error 0&lt;br /&gt;
* [[4201]] DEPRECATED ERROR: DOS/Windows/Novell error 1&lt;br /&gt;
* [[4202]] DEPRECATED ERROR: DOS/Windows/Novell error 2&lt;br /&gt;
* [[4203]] Path does not exist or is not a directory&lt;br /&gt;
* [[4204]] Too many file handles open on the system level&lt;br /&gt;
* [[4205]] Access is denied&lt;br /&gt;
* [[4206]] Invalid file descriptor&lt;br /&gt;
* [[4207]] DEPRECATED ERROR: DOS/Windows/Novell error 7&lt;br /&gt;
* [[4208]] DEPRECATED ERROR: DOS/Windows/Novell error 8&lt;br /&gt;
* [[4209]] DEPRECATED ERROR: DOS/Windows/Novell error 9&lt;br /&gt;
* [[4210]] DEPRECATED ERROR: DOS/Windows/Novell error 10&lt;br /&gt;
* [[4211]] DEPRECATED ERROR: DOS/Windows/Novell error 11&lt;br /&gt;
* [[4212]] DEPRECATED ERROR: DOS/Windows/Novell error 12&lt;br /&gt;
* [[4213]] DEPRECATED ERROR: DOS/Windows/Novell error 13&lt;br /&gt;
* [[4214]] DEPRECATED ERROR: DOS/Windows/Novell error 14&lt;br /&gt;
* [[4215]] Invalid drive reference&lt;br /&gt;
* [[4216]] Cannot remove directory&lt;br /&gt;
* [[4217]] DEPRECATED ERROR: DOS/Windows/Novell error 17&lt;br /&gt;
* [[4218]] DEPRECATED ERROR: DOS/Windows/Novell error 18&lt;br /&gt;
* [[4219]] I/O error on write protected floppy&lt;br /&gt;
* [[4220]] DEPRECATED ERROR: DOS/Windows/Novell error 20&lt;br /&gt;
* [[4221]] DEPRECATED ERROR: DOS/Windows/Novell error 21&lt;br /&gt;
* [[4222]] DEPRECATED ERROR: DOS/Windows/Novell error 22&lt;br /&gt;
* [[4223]] DEPRECATED ERROR: DOS/Windows/Novell error 23&lt;br /&gt;
* [[4224]] File is too large for locking mode&lt;br /&gt;
* [[4225]] DEPRECATED ERROR: DOS/Windows/Novell error 25&lt;br /&gt;
* [[4226]] DEPRECATED ERROR: DOS/Windows/Novell error 26&lt;br /&gt;
* [[4227]] DEPRECATED ERROR: DOS/Windows/Novell error 27&lt;br /&gt;
* [[4228]] DEPRECATED ERROR: DOS/Windows/Novell error 28&lt;br /&gt;
* [[4229]] DEPRECATED ERROR: DOS/Windows/Novell error 29&lt;br /&gt;
* [[4230]] DEPRECATED ERROR: DOS/Windows/Novell error 30&lt;br /&gt;
* [[4231]] DEPRECATED ERROR: DOS/Windows/Novell error 31&lt;br /&gt;
* [[4232]] DEPRECATED ERROR: DOS/Windows/Novell error 32&lt;br /&gt;
* [[4233]] DEPRECATED ERROR: DOS/Windows/Novell error 33&lt;br /&gt;
* [[4234]] DEPRECATED ERROR: DOS/Windows/Novell error 34&lt;br /&gt;
* [[4235]] DEPRECATED ERROR: DOS/Windows/Novell error 35&lt;br /&gt;
* [[4236]] DEPRECATED ERROR: DOS/Windows/Novell error 36&lt;br /&gt;
* [[4237]] DEPRECATED ERROR: DOS/Windows/Novell error 37&lt;br /&gt;
* [[4238]] DEPRECATED ERROR: DOS/Windows/Novell error 38&lt;br /&gt;
* [[4239]] Disk is full&lt;br /&gt;
* [[4240]] DEPRECATED ERROR: DOS/Windows/Novell error 40&lt;br /&gt;
* [[4241]] DEPRECATED ERROR: DOS/Windows/Novell error 41&lt;br /&gt;
* [[4242]] DEPRECATED ERROR: DOS/Windows/Novell error 42&lt;br /&gt;
* [[4243]] DEPRECATED ERROR: DOS/Windows/Novell error 43&lt;br /&gt;
* [[4244]] DEPRECATED ERROR: DOS/Windows/Novell error 44&lt;br /&gt;
* [[4245]] DEPRECATED ERROR: DOS/Windows/Novell error 45&lt;br /&gt;
* [[4246]] DEPRECATED ERROR: DOS/Windows/Novell error 46&lt;br /&gt;
* [[4247]] DEPRECATED ERROR: DOS/Windows/Novell error 47&lt;br /&gt;
* [[4248]] DEPRECATED ERROR: DOS/Windows/Novell error 48&lt;br /&gt;
* [[4249]] DEPRECATED ERROR: DOS/Windows/Novell error 49&lt;br /&gt;
* [[4250]] DEPRECATED ERROR: DOS/Windows/Novell error 50&lt;br /&gt;
* [[4251]] DEPRECATED ERROR: DOS/Windows/Novell error 51&lt;br /&gt;
* [[4252]] DEPRECATED ERROR: DOS/Windows/Novell error 52&lt;br /&gt;
* [[4253]] DEPRECATED ERROR: DOS/Windows/Novell error 53&lt;br /&gt;
* [[4254]] DEPRECATED ERROR: DOS/Windows/Novell error 54&lt;br /&gt;
* [[4255]] DEPRECATED ERROR: DOS/Windows/Novell error 55&lt;br /&gt;
* [[4256]] DEPRECATED ERROR: DOS/Windows/Novell error 56&lt;br /&gt;
* [[4257]] DEPRECATED ERROR: DOS/Windows/Novell error 57&lt;br /&gt;
* [[4258]] DEPRECATED ERROR: DOS/Windows/Novell error 58&lt;br /&gt;
* [[4259]] DEPRECATED ERROR: DOS/Windows/Novell error 59&lt;br /&gt;
* [[4260]] DEPRECATED ERROR: DOS/Windows/Novell error 60&lt;br /&gt;
* [[4261]] Printer queue full&lt;br /&gt;
* [[4262]] DEPRECATED ERROR: DOS/Windows/Novell error 62&lt;br /&gt;
* [[4263]] DEPRECATED ERROR: DOS/Windows/Novell error 63&lt;br /&gt;
* [[4264]] DEPRECATED ERROR: DOS/Windows/Novell error 64&lt;br /&gt;
* [[4265]] DEPRECATED ERROR: DOS/Windows/Novell error 65&lt;br /&gt;
* [[4266]] DEPRECATED ERROR: DOS/Windows/Novell error 66&lt;br /&gt;
* [[4267]] DEPRECATED ERROR: DOS/Windows/Novell error 67&lt;br /&gt;
* [[4268]] DEPRECATED ERROR: DOS/Windows/Novell error 68&lt;br /&gt;
* [[4269]] DEPRECATED ERROR: DOS/Windows/Novell error 69&lt;br /&gt;
* [[4270]] End of file&lt;br /&gt;
* [[4271]] Incomplete record&lt;br /&gt;
* [[4272]] Key not found&lt;br /&gt;
* [[4273]] Help keyword or topic not found&lt;br /&gt;
* [[4274]] DEPRECATED ERROR: DOS/Windows/Novell error 74&lt;br /&gt;
* [[4275]] DEPRECATED ERROR: DOS/Windows/Novell error 75&lt;br /&gt;
* [[4276]] Lock does not exist&lt;br /&gt;
* [[4277]] DEPRECATED ERROR: DOS/Windows/Novell error 77&lt;br /&gt;
* [[4278]] DEPRECATED ERROR: DOS/Windows/Novell error 78&lt;br /&gt;
* [[4279]] DEPRECATED ERROR: DOS/Windows/Novell error 79&lt;br /&gt;
* [[4280]]  DEPRECATED ERROR: DOS/Windows/Novell error 80&lt;br /&gt;
* [[4281]] DEPRECATED ERROR: DOS/Windows/Novell error 81&lt;br /&gt;
* [[4282]] Data does not match LINK=&lt;br /&gt;
* [[4283]] Updating previous/next link failed&lt;br /&gt;
* [[4284]] DEPRECATED ERROR: DOS/Windows/Novell error 84&lt;br /&gt;
* [[4285]] DEPRECATED ERROR: DOS/Windows/Novell error 85&lt;br /&gt;
* [[4286]] DEPRECATED ERROR: DOS/Windows/Novell error 86&lt;br /&gt;
* [[4287]] DEPRECATED ERROR: DOS/Windows/Novell error 87&lt;br /&gt;
* [[4288]] DEPRECATED ERROR: DOS/Windows/Novell error 88&lt;br /&gt;
* [[4289]] DEPRECATED ERROR: DOS/Windows/Novell error 89&lt;br /&gt;
* [[4290]] DEPRECATED ERROR: DOS/Windows/Novell error 90&lt;br /&gt;
* [[4291]] DEPRECATED ERROR: DOS/Windows/Novell error 91&lt;br /&gt;
* [[4292]] DEPRECATED ERROR: DOS/Windows/Novell error 92&lt;br /&gt;
* [[4293]] DEPRECATED ERROR: DOS/Windows/Novell error 93&lt;br /&gt;
* [[4294]] DEPRECATED ERROR: DOS/Windows/Novell error 94&lt;br /&gt;
* [[4295]] DEPRECATED ERROR: DOS/Windows/Novell error 95&lt;br /&gt;
* [[4296]] DEPRECATED ERROR: DOS/Windows/Novell error 96&lt;br /&gt;
* [[4297]] DEPRECATED ERROR: DOS/Windows/Novell error 97&lt;br /&gt;
* [[4298]] DEPRECATED ERROR: DOS/Windows/Novell error 98&lt;br /&gt;
* [[4299]] Cannot copy or rename file to itself&lt;br /&gt;
&lt;br /&gt;
* [[4300]] Shell call return value&lt;br /&gt;
* [[4301]] DEPRECATED ERROR: DOS/Windows/Novell error 101&lt;br /&gt;
* [[4302]] DEPRECATED ERROR: DOS/Windows/Novell error 102&lt;br /&gt;
* [[4303]] DEPRECATED ERROR: DOS/Windows/Novell error 103&lt;br /&gt;
* [[4304]] DEPRECATED ERROR: DOS/Windows/Novell error 104&lt;br /&gt;
* [[4305]] DEPRECATED ERROR: DOS/Windows/Novell error 105&lt;br /&gt;
* [[4306]] DEPRECATED ERROR: DOS/Windows/Novell error 106&lt;br /&gt;
* [[4307]] DEPRECATED ERROR: DOS/Windows/Novell error 107&lt;br /&gt;
* [[4308]] DEPRECATED ERROR: DOS/Windows/Novell error 108&lt;br /&gt;
* [[4309]] DEPRECATED ERROR: DOS/Windows/Novell error 109&lt;br /&gt;
* [[4310]] DEPRECATED ERROR: DOS/Windows/Novell error 110&lt;br /&gt;
* [[4311]] DEPRECATED ERROR: DOS/Windows/Novell error 111&lt;br /&gt;
* [[4312]] DEPRECATED ERROR: DOS/Windows/Novell error 112&lt;br /&gt;
* [[4313]] DEPRECATED ERROR: DOS/Windows/Novell error 113&lt;br /&gt;
* [[4314]] DEPRECATED ERROR: DOS/Windows/Novell error 114&lt;br /&gt;
* [[4315]] DEPRECATED ERROR: DOS/Windows/Novell error 115&lt;br /&gt;
* [[4316]] DEPRECATED ERROR: DOS/Windows/Novell error 116&lt;br /&gt;
* [[4317]] DEPRECATED ERROR: DOS/Windows/Novell error 117&lt;br /&gt;
* [[4318]] DEPRECATED ERROR: DOS/Windows/Novell error 118&lt;br /&gt;
* [[4319]] DEPRECATED ERROR: DOS/Windows/Novell error 119&lt;br /&gt;
* [[4320]] Unknown system error see SYSERR function&lt;br /&gt;
* [[4321]] DEPRECATED ERROR: DOS/Windows/Novell error 121&lt;br /&gt;
* [[4322]] DEPRECATED ERROR: DOS/Windows/Novell error 122&lt;br /&gt;
* [[4323]] DEPRECATED ERROR: DOS/Windows/Novell error 123&lt;br /&gt;
* [[4324]] DEPRECATED ERROR: DOS/Windows/Novell error 124&lt;br /&gt;
* [[4325]] DEPRECATED ERROR: DOS/Windows/Novell error 125&lt;br /&gt;
* [[4326]] DEPRECATED ERROR: DOS/Windows/Novell error 126&lt;br /&gt;
* [[4327]] DEPRECATED ERROR: DOS/Windows/Novell error 127&lt;br /&gt;
* [[4328]] DEPRECATED ERROR: DOS/Windows/Novell error 128&lt;br /&gt;
* [[4329]] DEPRECATED ERROR: DOS/Windows/Novell error 129&lt;br /&gt;
* [[4330]] DEPRECATED ERROR: DOS/Windows/Novell error 130&lt;br /&gt;
* [[4331]] DEPRECATED ERROR: DOS/Windows/Novell error 131&lt;br /&gt;
* [[4332]] DEPRECATED ERROR: DOS/Windows/Novell error 132&lt;br /&gt;
* [[4333]] DEPRECATED ERROR: DOS/Windows/Novell error 133&lt;br /&gt;
* [[4334]] DEPRECATED ERROR: DOS/Windows/Novell error 134&lt;br /&gt;
* [[4335]] DEPRECATED ERROR: DOS/Windows/Novell error 135&lt;br /&gt;
* [[4336]] DEPRECATED ERROR: DOS/Windows/Novell error 136&lt;br /&gt;
* [[4337]] DEPRECATED ERROR: DOS/Windows/Novell error 137&lt;br /&gt;
* [[4338]] DEPRECATED ERROR: DOS/Windows/Novell error 138&lt;br /&gt;
* [[4339]] DEPRECATED ERROR: DOS/Windows/Novell error 139&lt;br /&gt;
* [[4340]] Unknown curl error - use -e to return OS error&lt;br /&gt;
* [[4341]] DEPRECATED ERROR: DOS/Windows/Novell error 141&lt;br /&gt;
* [[4342]] DEPRECATED ERROR: DOS/Windows/Novell error 142&lt;br /&gt;
* [[4343]] DEPRECATED ERROR: DOS/Windows/Novell error 143&lt;br /&gt;
* [[4344]] DEPRECATED ERROR: DOS/Windows/Novell error 144&lt;br /&gt;
* [[4345]] DEPRECATED ERROR: DOS/Windows/Novell error 145&lt;br /&gt;
* [[4346]] DEPRECATED ERROR: DOS/Windows/Novell error 146&lt;br /&gt;
* [[4347]] DEPRECATED ERROR: DOS/Windows/Novell error 147&lt;br /&gt;
* [[4348]] DEPRECATED ERROR: DOS/Windows/Novell error 148&lt;br /&gt;
* [[4349]] DEPRECATED ERROR: DOS/Windows/Novell error 149&lt;br /&gt;
* [[4350]] DEPRECATED ERROR: DOS/Windows/Novell error 150&lt;br /&gt;
* [[4351]] DEPRECATED ERROR: DOS/Windows/Novell error 151&lt;br /&gt;
* [[4352]] DEPRECATED ERROR: DOS/Windows/Novell error 152&lt;br /&gt;
* [[4353]] DEPRECATED ERROR: DOS/Windows/Novell error 153&lt;br /&gt;
* [[4354]] DEPRECATED ERROR: DOS/Windows/Novell error 154&lt;br /&gt;
* [[4355]] DEPRECATED ERROR: DOS/Windows/Novell error 155&lt;br /&gt;
* [[4356]] DEPRECATED ERROR: DOS/Windows/Novell error 156&lt;br /&gt;
* [[4357]] DEPRECATED ERROR: DOS/Windows/Novell error 157&lt;br /&gt;
* [[4358]] DEPRECATED ERROR: DOS/Windows/Novell error 158&lt;br /&gt;
* [[4359]] DEPRECATED ERROR: DOS/Windows/Novell error 159&lt;br /&gt;
* [[4360]] DEPRECATED ERROR: DOS/Windows/Novell error 160&lt;br /&gt;
* [[4361]] DEPRECATED ERROR: DOS/Windows/Novell error 161&lt;br /&gt;
* [[4362]] DEPRECATED ERROR: DOS/Windows/Novell error 162&lt;br /&gt;
* [[4363]] DEPRECATED ERROR: DOS/Windows/Novell error 163&lt;br /&gt;
* [[4364]] DEPRECATED ERROR: DOS/Windows/Novell error 164&lt;br /&gt;
* [[4365]] DEPRECATED ERROR: DOS/Windows/Novell error 165&lt;br /&gt;
* [[4366]] DEPRECATED ERROR: DOS/Windows/Novell error 166&lt;br /&gt;
* [[4367]] DEPRECATED ERROR: DOS/Windows/Novell error 167&lt;br /&gt;
* [[4368]] DEPRECATED ERROR: DOS/Windows/Novell error 168&lt;br /&gt;
* [[4369]] DEPRECATED ERROR: DOS/Windows/Novell error 169&lt;br /&gt;
* [[4370]] DEPRECATED ERROR: DOS/Windows/Novell error 170&lt;br /&gt;
* [[4371]] DEPRECATED ERROR: DOS/Windows/Novell error 171&lt;br /&gt;
* [[4372]] DEPRECATED ERROR: DOS/Windows/Novell error 172&lt;br /&gt;
* [[4373]] DEPRECATED ERROR: DOS/Windows/Novell error 173&lt;br /&gt;
* [[4374]] DEPRECATED ERROR: DOS/Windows/Novell error 174&lt;br /&gt;
* [[4375]] DEPRECATED ERROR: DOS/Windows/Novell error 175&lt;br /&gt;
* [[4376]] DEPRECATED ERROR: DOS/Windows/Novell error 176&lt;br /&gt;
* [[4377]] DEPRECATED ERROR: DOS/Windows/Novell error 177&lt;br /&gt;
* [[4378]] DEPRECATED ERROR: DOS/Windows/Novell error 178&lt;br /&gt;
* [[4379]] DEPRECATED ERROR: DOS/Windows/Novell error 179&lt;br /&gt;
* [[4380]] DEPRECATED ERROR: DOS/Windows/Novell error 180&lt;br /&gt;
* [[4381]] DEPRECATED ERROR: DOS/Windows/Novell error 181&lt;br /&gt;
* [[4382]] DEPRECATED ERROR: DOS/Windows/Novell error 182&lt;br /&gt;
* [[4383]] DEPRECATED ERROR: DOS/Windows/Novell error 183&lt;br /&gt;
* [[4384]] DEPRECATED ERROR: DOS/Windows/Novell error 184&lt;br /&gt;
* [[4385]] DEPRECATED ERROR: DOS/Windows/Novell error 185&lt;br /&gt;
* [[4386]] DEPRECATED ERROR: DOS/Windows/Novell error 186&lt;br /&gt;
* [[4387]] DEPRECATED ERROR: DOS/Windows/Novell error 187&lt;br /&gt;
* [[4388]] DEPRECATED ERROR: DOS/Windows/Novell error 188&lt;br /&gt;
* [[4389]] DEPRECATED ERROR: DOS/Windows/Novell error 189&lt;br /&gt;
* [[4390]] DEPRECATED ERROR: DOS/Windows/Novell error 190&lt;br /&gt;
* [[4391]] DEPRECATED ERROR: DOS/Windows/Novell error 191&lt;br /&gt;
* [[4392]] DEPRECATED ERROR: DOS/Windows/Novell error 192&lt;br /&gt;
* [[4393]] DEPRECATED ERROR: DOS/Windows/Novell error 193&lt;br /&gt;
* [[4394]] DEPRECATED ERROR: DOS/Windows/Novell error 194&lt;br /&gt;
* [[4395]] DEPRECATED ERROR: DOS/Windows/Novell error 195&lt;br /&gt;
* [[4396]] DEPRECATED ERROR: DOS/Windows/Novell error 196&lt;br /&gt;
* [[4397]] DEPRECATED ERROR: DOS/Windows/Novell error 197&lt;br /&gt;
* [[4398]] DEPRECATED ERROR: DOS/Windows/Novell error 198&lt;br /&gt;
* [[4399]] File name is not a UNC path&lt;br /&gt;
&lt;br /&gt;
* [[4501]] OS function failure&lt;br /&gt;
* [[4513]] Bad data on OS function&lt;br /&gt;
* [[4514]] No memory on OS function&lt;br /&gt;
* [[4521]] Device not ready&lt;br /&gt;
* [[4522]] Bad system command&lt;br /&gt;
* [[4526]] Not a dos disk&lt;br /&gt;
* [[4591]] A shell call timed out&lt;br /&gt;
* [[4596]] Process signaled&lt;br /&gt;
* [[4597]] Process stopped&lt;br /&gt;
* [[4598]] Process was terminated in an unknown manner&lt;br /&gt;
* [[4614]] Invalid standard handle&lt;br /&gt;
* [[4616]] PDF library initialization failed&lt;br /&gt;
* [[4618]] An error that aborts further reconnect attempts has occurred&lt;br /&gt;
* [[4620]] Client server connection failure&lt;br /&gt;
* [[4890]] Temporary index creation failure&lt;br /&gt;
&lt;br /&gt;
* [[6201]] Spooling error while executing lp or lpr&lt;br /&gt;
* [[6213]] Unknown windows printing error&lt;br /&gt;
* [[6214]] Printing windlg find resource error&lt;br /&gt;
* [[6215]] Printing windlg initialization error&lt;br /&gt;
* [[6216]] Printing windlg load resource error&lt;br /&gt;
* [[6217]] Printing windlg load string failure&lt;br /&gt;
* [[6218]] Printing windlg lock resource failure&lt;br /&gt;
* [[6219]] Printing windlg no memory&lt;br /&gt;
* [[6220]] Printing windlg failed to lock memory&lt;br /&gt;
* [[6221]] Printing windlg no hisntance&lt;br /&gt;
* [[6222]] Printing windlg no hook&lt;br /&gt;
* [[6223]] Printing windlg no template&lt;br /&gt;
* [[6224]] Printing windlg struct size&lt;br /&gt;
* [[6225]] Printing windlg create IC failure&lt;br /&gt;
* [[6226]] Printing windlg default different&lt;br /&gt;
* [[6227]] Printing windlg drag and drop mismatch&lt;br /&gt;
* [[6228]] Printing windlg print dev mode failure&lt;br /&gt;
* [[6229]] Printing windlg error initializing printer&lt;br /&gt;
* [[6230]] Printing windlg error loading driver&lt;br /&gt;
* [[6231]] Printing windlg no default printer&lt;br /&gt;
* [[6232]] Printing windlg no devices&lt;br /&gt;
* [[6233]] Printing windlg parse failure&lt;br /&gt;
* [[6234]] Printing windlg printer not found&lt;br /&gt;
* [[6235]] Printing windlg return default failure&lt;br /&gt;
* [[6236]] Printing windlg setup failure&lt;br /&gt;
* [[6240]] Failed opening printer DC&lt;br /&gt;
* [[6242]] Invalid parametrized substitution format&lt;br /&gt;
* [[6243]] Parameter count does not match using parametrized substitutions&lt;br /&gt;
* [[6244]] Parametrized substitution result is too long&lt;br /&gt;
* [[6245]] Unsupported escape sequence for printing&lt;br /&gt;
* [[6246]] Passthrough printing error&lt;br /&gt;
* [[6247]] Invalid NWP color specification&lt;br /&gt;
* [[6248]] Invalid NWP picture specification or the image is not found&lt;br /&gt;
* [[6250]] Invalid PDF import specification&lt;br /&gt;
* [[6252]] Print PDF requires either READER or an output file name&lt;br /&gt;
* [[6254]] Creating a new PDF document failed&lt;br /&gt;
* [[6255]] Adding a page to a PDF document failed&lt;br /&gt;
* [[6256]] Ending a PDF document failed&lt;br /&gt;
* [[6257]] Adding an image to a PDF document failed&lt;br /&gt;
* [[6270]] Spooling error&lt;br /&gt;
* [[6272]] Bad initializer for PJL mode&lt;br /&gt;
* [[7600]] Invalid or missing key start position&lt;br /&gt;
* [[7601]] Invalid key length&lt;br /&gt;
* [[7602]] Bad key&lt;br /&gt;
* [[7603]] Duplicate keys found&lt;br /&gt;
* [[7604]] Missing parameters for INDEX&lt;br /&gt;
* [[7605]] Invalid index parameter&lt;br /&gt;
* [[7606]] INDEX records in does not match records out&lt;br /&gt;
* [[7607]] Not enough memory for INDEX&lt;br /&gt;
* [[7609]] Attempt to INDEX a file that is not an internal file&lt;br /&gt;
* [[7610]] Invalid INDEX file name&lt;br /&gt;
* [[7611]] INDEX file already exists&lt;br /&gt;
* [[7612]] Invalid INDEX work path&lt;br /&gt;
* [[7636]] INDEX interrupted by user&lt;br /&gt;
* [[7699]] Bad internal record size for INDEX&lt;br /&gt;
* [[7801]] Invalid sort keyword&lt;br /&gt;
* [[7804]] Syntax error in SORT - FILE specification&lt;br /&gt;
* [[7805]] Syntax error in SORT - RECORD specification&lt;br /&gt;
* [[7806]] Syntax error in SORT - ALTS specification&lt;br /&gt;
* [[7807]] Syntax error in SORT - MASK specification&lt;br /&gt;
* [[7809]] Syntax error in SORT - SUM specification&lt;br /&gt;
* [[7810]] Attempt to SORT a file that is not an internal file&lt;br /&gt;
* [[7811]] Not enough memory for SORT&lt;br /&gt;
* [[7812]] Invalid SORT output file type&lt;br /&gt;
* [[7821]] ALTS value is too large&lt;br /&gt;
* [[7823]] Missing MASK specification&lt;br /&gt;
* [[7825]] Too many RECORD statements&lt;br /&gt;
* [[7828]] SORT specifications out of order&lt;br /&gt;
* [[7829]] RECORD specification too long or too many RECORD specifications&lt;br /&gt;
* [[7830]] RECORD lower limit is greater than upper limit&lt;br /&gt;
* [[7831]] Output file record length is too short&lt;br /&gt;
* [[7832]] Output file not empty&lt;br /&gt;
* [[7853]] SORT control file not found&lt;br /&gt;
* [[8001]] DEPRECATED ERROR: number too long&lt;br /&gt;
* [[8002]] Window too small for input&lt;br /&gt;
* [[9000]] Out of memmory&lt;br /&gt;
* [[9001]] work stack is full&lt;br /&gt;
* [[9002]] RPN stack is full&lt;br /&gt;
* [[9003]] Flow stack is full&lt;br /&gt;
* [[9004]] FOR/NEXT stack is full&lt;br /&gt;
* [[9005]] RPN stack is empty&lt;br /&gt;
* [[9006]] Too many nested IF, FOR/NEXT or DO/LOOP structures&lt;br /&gt;
* [[9100]] DEPRECATED ERROR: compiler error&lt;br /&gt;
* [[9111]] Code byte count is incorrect&lt;br /&gt;
* [[9112]] Source byte count is incorrect&lt;br /&gt;
* [[9201]] Invalid access for opening a file&lt;br /&gt;
* [[9203]] Invalid create for opening a file&lt;br /&gt;
* [[9301]] Invalid number of RPN entries&lt;br /&gt;
* [[9302]] Function error&lt;br /&gt;
* [[9303]] Invalid function&lt;br /&gt;
* [[9304]] User defined function error&lt;br /&gt;
* [[9305]] User defined function error&lt;br /&gt;
* [[9306]] User defined function stacking error&lt;br /&gt;
* [[9307]] No editor defined or invalid ON error statement&lt;br /&gt;
* [[9308]] Utility open file channel is not open&lt;br /&gt;
* [[9309]] Corrupt .BR/.WB program file encountered&lt;br /&gt;
* [[9310]] Variable index outside of variable table&lt;br /&gt;
* [[9400]] DEPRECATED ERROR: output file corrupted&lt;br /&gt;
* [[9401]] BTREE verification failed&lt;br /&gt;
* [[9502]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9503]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9504]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9505]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9506]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9507]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9508]] DEVELOPMENT ERROR: Actual error code not assigned yet&lt;br /&gt;
* [[9985]] DEPRECATED ERROR: work file missing&lt;br /&gt;
* [[9987]] No source exists for the given file&lt;br /&gt;
* [[9988]] DEPRECATED ERROR: source line greater than 800 bytes&lt;br /&gt;
* [[9990]] This version was made without HTTP support&lt;br /&gt;
* [[9992]] DEF statement compiler error&lt;br /&gt;
* [[9994]] Line reference indicates library, but no libraries active&lt;br /&gt;
* [[9995]] DEPRECATED ERROR: RPN stack failure&lt;br /&gt;
* [[9996]] Library program not found or internal line not found&lt;br /&gt;
* [[9997]] Unbalanced parenthesis or flow stack error&lt;br /&gt;
* [[9998]] Corrupt DIM source&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Needs Help]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Release 4.3]]&lt;br /&gt;
[[Category:Release Notes]]&lt;/div&gt;</summary>
		<author><name>GomezL</name></author>
	</entry>
</feed>