Sviluppo4d.it
Sito indipendente di informazioni tecniche per sviluppatori 4th Dimension italiani  

Sviluppatori 4D

Utility 4D

Risorse 4D



4d logo
Naviga:

Faq

Ho trovato 67 faq.

Categoria Argomento Commenti
Comandi Comandi [v14] I comandi nativi JSON: Selection to JSON
Il comando Selection to JSON crea una stringa JSON con i campi della selezione corrente, ad esempio:

$jsonString :=Selection to JSON([Anagrafica])

Il risultato sarà del tipo :
[
{"cognome":"Rossi", "nome":"Mario"},
{"cognome":"Verdi", "nome":"Giuseppe"},
...
]

E' possibile caricare solo alcuni campi aggiungendoli alla sintassi:

$jsonString :=Selection to JSON([Anagrafica], [Anagrafica]Cognome)
[
{"Cognome":"Rossi"},
{"Cognome":"Verdi"},
...
]


Oppure si può impostare un "template"

  C_OBJECT($template)
  OB SET($template;"LastName";->[Anagrafica] Cognome)
  $jsonString :=Selection to JSON([Anagrafica];$template)

[
{"LastName":"Rossi"},
{"LastName":"Verdi"},
...
]
Comandi Comandi [v14] I comandi nativi JSON: JSON Stringify
Partendo da una variabile C_Object si ottiene l'equivalente in stringa JSON con il comando

JSON Stringify ( value ; * ) -> ritorna una stringa compatta
JSON Stringify ( value ; * ) -> modalità 'pretty print', ritorna una stringa indentata

Esempio:

C_OBJECT($Anagrafica;$Figli)
  OB SET($Anagrafica;"cognome";"Rossi";"nome";"Mario")
  OB SET($Figli;"nome";"Giovanni";"anni";"12")
  OB SET($Anagrafica;"figli";$Figli)
  $Uno:=JSON Stringify($Anagrafica)

  {"nome":"Mario","cognome":"Rossi","figli":{"nome":"Giovanni","anni","12"}}

$Due:=JSON Stringify($Anagrafica;*)
  
  {
  "nome":"Mario",
  "cognome":"Rossi",
  "figli":{
    "nome":"Giovanni",
    "anni","12"
  }
}
Comandi Comandi [v14] I comandi nativi JSON: JSON Parse
Dalla versione v14 sono disponibili i comandi JSON, che permettono di passare da stringhe a oggetti 4d.

Gli oggetti JSON sono circondati da graffe {}
Gli array sono circondati da quadre []
I dati sono in formato "chiave":"valore"
La sequenza di dati è separata dalle virgole

Il valore può essere:

  • testo (fra virgolette)

  • numero (col punto decimale)

  • data ( "YYYY-MM-DDTHH:mm:ssZ" )

  • true/false

  • null



JSON Parse ( jsonString {; type} ) -> Function result

Se viene passato il parametro il comando lo converte nel formato richiesto, altrimentii farà la conversione al meglio possibile. Due esempi:

JSON Parse("{\"nome\":124}") -> ritorna un C_OBJECT con {nome = 124}
JSON Parse("{\"nome\":124}", is longint) -> ritorna 124
Comandi Comandi Impostare il livello di cifratura SSL
Il comando SET DATABASE PARAMETER con l'opzione 64 (SSL Cipher List) permette di impostare il livello di cifratura SSL.

Ad esempio è possibile eseguire questo codice per disabilitare l'SSL2 e attivare solo l'SSL3 per la versione di 4d v11:

STOP WEB SERVER
SET DATABASE PARAMETER (SSL Cipher List;"HIGH:!SSLv2:!EXP:!ADH:!aNULL:!eNULL:!NULL")
START WEB SERVER

Alcune informazioni su come scrivere questo parametro si può leggere la documentazione del Comando Ciphers di OpenSSL.

Nella v13.3 i valori di default sono:
TLSv1/SSLv3, Cipher : AES256-SHA AES(256)

Le altre cifrature accettate sono
SSL2 ciphers: nessuno

SSL3 ciphers:
CAMELLIA256-SHA 256 bit
AES256-SHA 256 bit
DES-CBC3-SHA 168 bit
SEED-SHA 128 bit
CAMELLIA128-SHA 128 bit
AES128-SHA 128 bit
IDEA-CBC-SHA 128 bit
RC4-SHA 128 bit
RC4-MD5 128 bit
DES-CBC-SHA 56 bit

TLS1 ciphers:
CAMELLIA256-SHA 256 bit
AES256-SHA 256 bit
DES-CBC3-SHA 168 bit
SEED-SHA 128 bit
CAMELLIA128-SHA 128 bit
AES128-SHA 128 bit
IDEA-CBC-SHA 128 bit
RC4-SHA 128 bit
RC4-MD5 128 bit
DES-CBC-SHA 56 bit
Comandi Comandi Indentazione XML
Quando si crea un XML, i comandi di 4d lo creano con tutta l'indentazione necessaria ad una più facile lettura.

Però se l'xml è utilizzato per comunicazioni via wan (server to server, mobile to server, etc) in produzione è meglio risparmiare in dimensioni dei messaggi, ad esempio togliendo l'indentazione: su file complessi con molti livelli di indentazione il risparmio può essere notevole.

Fino alla v11 si usava il secondo parametro del comando
DOM SET XML OPTION

Dalla v12 il comando è stato rinominato
DOM SET XML OPTION -> DOM SET XML DECLARATION

e invece per le opzioni più generiche si usa il comando più specifico
XML SET OPTION

Questo comando ha diverse opzioni, nel caso specifico la sintassi è:

DOM SET XML OPTION($idRef; XML Indentation; XML No indentation)
Comandi Comandi Esempi di Replicate in Campi e in Array
Il comando Replicate eseguito su un 4d (Locale) permette di leggere da un 4d (Remoto) gli ultimi record modificati/cancellati dopo l'ultima lettura, per avere la "replica" aggiornata di alcune tabelle.

La sintassi minima è la seguente:

REPLICATE campoid, campo1, campo2, campo3
FROM tabellaRemota
FOR REMOTE STAMP :vRemote_Stamp
REMOTE OVER LOCAL
LATEST REMOTE STAMP :vRiceviCorrenteUltimoStam
INTO localTable(campoid, campo1, campo2, campo3);

Da notare che in vRiceviCorrenteUltimoStam arriva l'ultimo Stamp corrente da conservare per usarlo nella prossima volta che si fa la stessa chiamata.

Questa di seguito è la versione completa dei parametri opzionali, con una clausola WHERE per selezionare i record da tagliare, con la LIMIT e la conseguente OFFSET per tagliare l'esportazione in più parti

REPLICATE campoid, campo1, campo2, campo3
FROM tabellaRemota
WHERE tabellaRemota.campox=:vCondizione
LIMIT :vLimit_Value
OFFSET :vOffset_Value
FOR REMOTE STAMP :vRemote_Stamp,
LOCAL STAMP :vLocal_Stamp
REMOTE OVER LOCAL /*oppure LOCAL OVER REMOTE*/
LATEST REMOTE STAMP :vRiceviCorrenteUltimoStam,
LATEST LOCAL STAMP :vLatest_Local_Stamp
INTO localTable(campoid, campo1, campo2, campo3);


Da notare che posso leggere i dati senza doverli appoggiare su una tabella, ma solo in array.

REPLICATE campoid, field1, field2, field3
FROM remoteTable
FOR REMOTE STAMP :vRemote_Stamp
REMOTE OVER LOCAL
LATEST REMOTE STAMP :vRiceviCorrenteUltimoStam
INTO :aID, :aCampo1, :aCampo2, :aCampo3;


REPLICATE campoid, campo1, campo2, campo3
FROM tabellaRemota
WHERE tabellaRemota.campox=:vCondizione
LIMIT :vLimit_Value
OFFSET :vOffset_Value
FOR REMOTE STAMP :vRemote_Stamp,
LOCAL STAMP :vLocal_Stamp
REMOTE OVER LOCAL /*oppure LOCAL OVER REMOTE*/
LATEST REMOTE STAMP :vRiceviCorrenteUltimoStam,
LATEST LOCAL STAMP :vLatest_Local_Stamp
INTO :aID, :aCampo1, :aCampo2, :aCampo3;


Comandi Comandi [v13] Confronta due Immagini con Equal Pictures
Il comando Equal pictures confronta precisamente due immagini per dimensione e contenuto.

Il comando accetta 3 parametri: i primi 2 sono le immagini da confrontare, nel terzo si troverà un'immagine maschera con a nero i pixel identici.

Ritorna False se le dimensioni non sono uguali.

Se le dimensioni sono uguali il confronto è a livello di pixel, e nella maschera viene 'acceso' in bianco il pixel che segna la differenza.
        
Se non ci sono differenze neanche a livello di pixel il comando ritorna True.
Comandi Comandi Comandi rinominati dalla v11 alla v12
v11v12
APPLY XSLT TRANSFORMATIONXSLT APPLY TRANSFORMATION
BEST OBJECT SIZEOBJECT GET BEST SIZE
BUTTON TEXTOBJECT SET TITLE
COMPRESS PICTURE FILEQT COMPRESS PICTURE FILE
COMPRESS PICTUREQT COMPRESS PICTURE
Current form pageFORM Get current page
DECODEBASE64 DECODE
DELETE LISTBOX COLUMNLISTBOX DELETE COLUMN
DELETE LISTBOX ROWLISTBOX DELETE ROW
DOM SET XML OPTIONSDOM SET XML DECLARATION
ENCODEBASE64 ENCODE
FIRST PAGEFORM FIRST PAGE
FONT SIZEOBJECT SET FONT SIZE
FONT STYLEOBJECT SET FONT STYLE
FONTOBJECT SET FONT
Get alignmentOBJECT Get alignment
GET FORM OBJECTSFORM GET OBJECTS
GET FORM PARAMETERFORM GET PARAMETER
GET FORM PROPERTIESFORM GET PROPERTIES
Get formatOBJECT Get format
GET LISTBOX ARRAYSLISTBOX GET ARRAYS
GET LISTBOX CELL POSITIONLISTBOX GET CELL POSITION
Get listbox column widthLISTBOX Get column width
Get listbox informationLISTBOX Get information
Get listbox rows heightLISTBOX Get rows height
Get number of listbox columnsLISTBOX Get number of columns
Get number of listbox rowsLISTBOX Get number of rows
GET OBJECT RECTOBJECT GET COORDINATES
GET XML ERRORXML GET ERROR
GET XSLT ERRORXSLT GET ERROR
GOTO AREAGOTO OBJECT
GOTO PAGEFORM GOTO PAGE
INPUT FORMFORM SET INPUT
INSERT LISTBOX COLUMN FORMULALISTBOX INSERT COLUMN FORMULA
INSERT LISTBOX COLUMNLISTBOX INSERT COLUMN
INSERT LISTBOX ROWLISTBOX INSERT ROW
LAST PAGEFORM LAST PAGE
LOAD COMPRESS PICTURE FROM FILEQT LOAD COMPRESS PICTURE FROM FILE
MOVE OBJECTOBJECT MOVE
MOVED LISTBOX COLUMN NUMBERLISTBOX MOVED COLUMN NUMBER
MOVED LISTBOX ROW NUMBERLISTBOX MOVED ROW NUMBER
NEXT PAGEFORM NEXT PAGE
OUTPUT FORMFORM SET OUTPUT
PREVIOUS PAGEFORM PREVIOUS PAGE
SAX SET XML OPTIONSSAX SET XML DECLARATION
SCROLL LINESOBJECT SET SCROLL POSITION
SELECT LISTBOX ROWLISTBOX SELECT ROW
SET ALIGNMENTOBJECT SET ALIGNMENT
SET CHOICE LISTOBJECT SET CHOICE LIST NAME
SET COLOROBJECT SET COLOR
SET ENTERABLEOBJECT SET ENTERABLE
SET FILTEROBJECT SET FILTER
SET FORM HORIZONTAL RESIZINGFORM SET HORIZONTAL RESIZING
SET FORM SIZEFORM SET SIZE
SET FORM VERTICAL RESIZINGFORM SET VERTICAL RESIZING
SET FORMATOBJECT SET FORMAT
SET LISTBOX COLUMN WIDTHLISTBOX SET COLUMN WIDTH
SET LISTBOX GRID COLORLISTBOX SET GRID COLOR
SET LISTBOX ROWS HEIGHTLISTBOX SET ROWS HEIGHT
SET RGB COLORSOBJECT SET RGB COLORS
SET SCROLLBAR VISIBLEOBJECT SET SCROLLBAR
SET VISIBLEOBJECT SET VISIBLE
SET XSLT PARAMETERXSLT SET PARAMETER
SHOW LISTBOX GRIDLISTBOX SHOW GRID
SORT LISTBOX COLUMNSLISTBOX SORT COLUMNS
SQL EXPORTEXPORT ODBC
SQL IMPORTIMPORT ODBC
Comandi Comandi Comandi rinominati dalla 2004 alla v11
v2004.8v11
APPEND TO CLIPBOARDAPPEND DATA TO PASTEBOARD
AsciiCharacter code
CLEAR CLIPBOARDCLEAR PASTEBOARD
Compiled applicationIs compiled mode
Count fieldsGet last field number
Count tablesGet last table number
DELETE ELEMENTDELETE FROM ARRAY
DELETE LIST ITEMDELETE FROM LIST
EXECUTEEXECUTE FORMULA
Find index keyFind in field
GET CLIPBOARDGET PASTEBOARD DATA
GET PICTURE FROM CLIPBOARDGET PICTURE FROM PASTEBOARD
GET PLUGIN LISTPLUGIN LIST
Get text from clipboardGet text from pasteboard
INSERT ELEMENTINSERT IN ARRAY
INSERT LIST ITEMINSERT IN LIST
MENU BARSET MENU BAR
ODBC CANCEL LOADSQL CANCEL LOAD
ODBC End selectionSQL End selection
ODBC EXECUTESQL EXECUTE
ODBC EXPORTSQL EXPORT
ODBC GET LAST ERRORSQL GET LAST ERROR
ODBC GET OPTIONSQL GET OPTION
ODBC IMPORTSQL IMPORT
ODBC LOAD RECORDSQL LOAD RECORD
ODBC LOGINSQL LOGIN
ODBC LOGOUTSQL LOGOUT
ODBC SET OPTIONSQL SET OPTION
ODBC SET PARAMETERSQL SET PARAMETER
SET MENU ITEM KEYSET MENU ITEM SHORTCUT
SET PICTURE TO CLIPBOARDSET PICTURE TO PASTEBOARD
SET TEXT TO CLIPBOARDSET TEXT TO PASTEBOARD
Test clipboardPasteboard data size
USE ASCII MAPUSE CHARACTER SET
Comandi Comandi [v12.2] Comando FORM SCREENSHOT
Dalla versione 12.2 è disponibile il nuovo comando FORM SCREENSHOT che accetta due sintassi:

FORM SCREENSHOT ( formPict )
Crea una schermata del form corrente al momento

FORM SCREENSHOT ( {aTable ;} formName ; formPict {; pageNum} )
Crea una schermata di un form del database come vista nel form editor
Comandi Comandi Reindirizzare l'output di LAUNCH EXTERNAL PROCESS
I parametri aggiuntivi di LAUNCH EXTERNAL PROCESS permettono di riempire una variabile $output con lo standard output del comando lanciato. Ecco un esempio.

C_TEXT($input;$error;$output)
$input:=Char(34)+$percorsoprogramma+Char(34)+" "+$altriparametri+Char(13)+Char(10)
SET ENVIRONMENT VARIABLE("_4D_OPTION_HIDE_CONSOLE";"true")
LAUNCH EXTERNAL PROCESS("cmd.exe";$input;$output;$error)
Comandi Comandi Un compendio per usare Match regex [2]
Continuiamo ad analizzare i pattern possibili per il comando Match regex.

- {...} definiscono un numero di ripetizioni della espressione regolare precedente. Può essere usato nella forma:
{n} l'espressione regolare deve essere ripetuta n volte
{min,} l'espressione regolare deve essere ripetuta almeno min volte
{min, max} l'espressione regolare deve essere ripetuta almeno min volte e massimo max volte

- | (la pipe) definisce più opzioni (il classico OR). Quindi:

  • "4|d" corrisponde a "d"
  • "4|d" non corrisponde a "b"


- (...) definiscono i gruppi. È possibile infatti ottenere sia delle stringhe di corrispondenza che delle sottostringhe, quelle che corrispondono ai pattern fra parentesi. Quindi:

  • "(4+)d" corrisponde a "4d". Subpattern: {"4"}

Comandi Comandi [v11 SQL] Il comando SET QUERY AND LOCK
Il nuovo comando SET QUERY AND LOCK, che prende come parametro semplicemente True o False, permette di richiedere il blocco dei record risultanti da una query. Ciò garantisce che i risultati di una certa ricerca non possano essere modificato da un altro processo che non sia quello attuale.

Il comando può essere usato solo all'interno di una transazione (altrimenti restituisce errore), e i record restano bloccati finché la transazione viene terminata: a quel punto i record vengono comunque rilasciati. Basta comunque chiamare SET QUERY AND LOCK(False) per rilasciarli.

Ecco un esempio di cancellazione controllata da SET QUERY AND LOCK:

START TRANSACTION
SET QUERY AND LOCK(True)`così mi assicuro che i record trovati siano locked per gli altri
QUERY([Clients];[Clients]Category=“C”)
DELETE SELECTION([Clients])
SET QUERY AND LOCK(False)
VALIDATE TRANSACTION

1
Comandi Comandi Un compendio per usare Match regex [1]
Il comando Match regex permette di fare operazioni particolari sulle stringhe. La forma base del comando è:

Match regex (pattern; aString)

dove aString è la stringa dove effettuiamo la ricerca, pattern è una speciale stringa che contiene "cosa" cercare. Se pattern si trova all'interno di di aString il comando ritorna True. Ecco cosa si può inserire all'interno di pattern.

- il caso più ovvio: se pattern:="mytext" e aString:="mytext", il comando ritorna True

- . (il punto) corrisponde a "qualsiasi carattere" tranne new line (a meno che ciò non venga espressamente specificato nelle opzioni inseribili in pattern). Quindi:

  • "4.b" corrisponde a "4db"
  • "4.r" non corrisponde a "4dfr"


- [ ... ] definisce classi di caratteri. Come:

    "[a-z]" corrisponde a qualsiasi lettera minuscola

Se la classe inizia con "^", la classe viene negata, cioè esiste corrispondenza se i caratteri non sono nella classe.

- * (asterisco) corrisponde a zero o più operatori. Quindi:

  • "z*" corrisponde a ""
  • "z*" corrisponde a "zzzzz"
  • "4d*b" corrisponde a "4dddb"
  • "4d*b" non corrisponde a "4d"


- + (il segno più) corrisponde a uno o più operatori. Quindi:

  • "z+" corrisponde a "z"
  • "z+" non corrisponde a ""


? - corrisponde a zero o un operatore. Quindi:

  • "a?" corrisponde a ""
  • "a?" corrisponde a "a"
  • "a?" non corrisponde a "aa"


Comandi Comandi Cambiare il set di caratteri usando i comandi SQL
Quando si fanno dei collegamenti a server SQL esterni ci potrebbero essere dei problemi di transcodifica del set di caratteri.

Il comando che permette di definire il charset corretto è
SQL SET OPTION(SQL Charset ;<charset>)

Il valore del parametro charset è di default 106 che sta per UTF-8

Gli altri codici si trovano nella tabella di questa pagina : http://www.iana.org/assignments/character-sets

A volte però non è semplice identificare quale codice usare, per via delle varie combinazioni ad esempio di client usato da mac o da windows: una soluzione è usare il parametro -2 che si adatta alla piattaforma ( e cioè iso-8859-1 su windows e MacRoman su mac).

SQL SET OPTION(SQL Charset ;-2)
Comandi Comandi Le sintassi del parametro sorgente dati di SQL LOGIN
Il comando SQL LOGIN accetta 3 parametri: la fonte dati, user e password.

La fonte dati può essere espressa in diversi modi:

- IP address
Sintassi: IP:<Indirizzo>{:<PortaTCP>}{:ssl}
In questo caso il comando apre una connessione diretta al 4D Server eseguito sulla macchina indicata dall'IP. Se non passi la porta TCP, verrà usata la porta standard 19812.
NOTA: se vuoi aprire una connessione in SSL, bisogna aggiungere ":ssl"

- nome pubblicato sulla rete del database 4D
Sintassi: 4D:<Nome_pubblicato>
In questo caso il comando apre una connessione diretta al 4D Server con il nome indicato. La porta TCP del server deve essere impostata allo stesso modo in entrambi i server.

- il nome di una data source ODBC
Sintassi: ODBC:<UserDSN> or <SystemDSN>
E' possibile indicare il nome di una sorgente dati impostata con l'amministratore ODBC.
Il prefisso non è obbligatorio per compatibilità con le versioni precedenti, ma è consigliato.

- stringa vuota
Sintassi: ""
Richiede la visualizzazione di una finestra di dialogo dove è possibile utilizzare vari pannelli per scegliere la connessione

- costante SQL_INTERNAL
Syntax: SQL_INTERNAL
In questo caso, il comando redireziona le richieste SQL al database interno.
Comandi Comandi [v12] Il terzo parametro del comando String
Quando converti una data in testo, si usa il comando stringa che accetta come secondo parametro una delle seguenti costanti:

Blank if null date ritorna "" invece di 0
Date RFC 1123 Mon, 24 Jan 2011 23:00:00 GMT
Internal date abbreviated Jan 25, 2011
Internal date long January 25, 2011
Internal date short 25/01/2011
Internal date short special 25/01/11 (ma anche 25/01/1811)
ISO Date 2011-01-25T00:00:00
ISO Date GMT 2011-01-24T23:00:00Z
System date abbreviated 25/gen/2011
System date long martedì 25 gennaio 2011
System date short 25/01/11

E il terzo parametro? Serve per le costanti di tipo RFC o ISO per aggiungere anche l'ora; ad esempio:

String(Current date;Date RFC 1123;Current time)
Tue, 25 Jan 2011 07:07:12 GMT

String(Current date;ISO Date;Current time)
2011-01-25T08:07:12
Comandi Comandi Percorso in formato Posix
Per avere il percorso della cartella dove si trova il database in formato Unix (Posix) si può usare il comando GET 4D FOLDER con questa sintassi, disponibile dalla versione 4D 2004.5:

Database Folder Unix Syntax

  Il risultato sarà del tipo:

/Users/Documents/MioDatabase/


Questa caratteristica è utile soprattutto usando LAUNCH EXTERNAL PROCESS, che su Mac OS X accetta un percorso Unix (Posix).
Comandi Comandi [v12] Esempio di comando PHP per estrarre stringhe in un array
Nella v12 è integrato un interprete PHP v 5.3.2 che può essere utilizzato come estensione al linguaggio di 4d. E' possibile lanciare script php creati al momento, usare i comandi nativi di php, dei moduli preinstallati o installarne di altri.


La sintassi é
PHP Execute ( percorsoScript {; funzione {; risultato {; param1} {; param2 ; ... ; paramN}}} ) -> Function result

Riportiamo un paio di esempi semplice di uso del comando, con percorsoScript="" perché passiamo una funziona nativa del php, explode.

ARRAY TEXT($arrayTesto;0)
    $p1 :=","
  $p2 :="11,22,33,44,55"
  $isOk :=PHP Execute("";"explode";$arrayTesto;$p1;$p2)
  
- $arrayTesto conterrà le stringhe "11", "22", "33", etc.


Invece passando come parametro per il risultato un array numerico, sempre con la stessa stringa di input:

ARRAY LONGINT($arrayNumerico ;0)
  $p1 :=","
  $p2 :="11,22,33,44,55"
  $isOk :=PHP Execute("";"explode";$arrayNumerico;$p1;$p2)

- $arrayNumerico conterrà i numeri 11, 22, 33, etc.
Comandi Comandi [v12] Rimuovere i tag nel rich text format
Con la v12 è possibile avere testo formattato, utilizzando nel campo testo i tag HTML.

Per rimuovere i tag è possibile usare il comando OBJECT Get plain text. Interessante ad esempio per fare una ricerca all'interno di campi con testi con all'interno i tag html.

Cercando ad esempio "Apple iPhone" potresti non trovare il campo con scritto:
"<SPAN> STYLE="font-size:13.5pt">Apple</SPAN> iPhone"

La soluzione è usare :
QUERY BY FORMULA([articoli];OBJECT Get plain text([articoli]descrizione)="@Apple iPhone@")
Comandi Comandi Aggiornare la gestione degli Eventi dei form
I seguenti comandi sono stati dichiarati obsoleti e andrebbero sostituiti dalla versione 11 in avanti:

Deactivated
Activated
In Header
In Break
In Footer
Before
During
After
Outside call

Quindi i pezzi di codice nei metodi dei form di questo tipo:

If(Activated)
        ORDER BY([Tabella];[Tabella]Campo;>)
        ` ...
End if

Deve diventare così:

If(Form event=On Activate)
        ORDER BY([Tabella];[Tabella]Campo;>)
        ` ...
End if


Questa è la lista delle costanti del comando Form Event da utilizzare al posto dei vecchi comandi:

Command Form Event
Deactivated -> On Deactivate
Activated -> On Activate
In Header -> On Header
In Break -> On Printing Break
In Footer -> On Printing Footer
After -> On Validate

I comandi Before e During sono un po' più complessi:

Command Form Event
Before -> On Load
Before -> On Display Detail
Before -> On Printing Detail
During -> On Clicked
During -> On Double Clicked
During -> On Losing Focus
During -> On Getting Focus
During -> On Menu Selected
During -> On Data Change
During -> On Close Box
During -> On Printing Detail
During -> On Open Detail
During -> On Close Detail

Ad esempio a volte si usava la coppia Before e During assieme:
(Before & During) -> On Display Detail
Comandi Comandi [v11 SQL] I valori NULL nei campi
Con la versione 11 e l'introduzione del motore SQL, anche con 4D è possibile gestire i valori NULL. Un esempio di campo NULL è un booleano che contiene i valori Maschio/Femmina quando si censisce un'anagrafica: finché l'utente non setta il valore corretto il valore del campo è NULL.

Per impostare il valore di un campo a NULL si usa il comando SET FIELD VALUE NULL, mentre per sapere se il valore del campo è NULL si usa il comando Is field value Null.
Comandi Comandi [v11 SQL] Dimensione dei parametri testo in plugin esterni come Stmp_body
Benchè le variabili testo di 4D abbiano superato il limite di 32K ci sono ancora dei comandi che hanno parametri testo che richiedono questo limite. Uno di questi è SMTP_Boby che richiede che il teso passato sia ancora limitato a 32K.
Se usate delle righe di codice come le seguenti per creare il corpo della email.

  $offset:=0
  While ($offset<BLOB size(Mail_Blob))
    $body:=BLOB to text(Mail_Blob;Text without length ;$offset)
    $noError:=(ErrCheck ("SMTP_Body";SMTP_Body ($Smtp_id;$body;2)))
  End while

Ricordatevi che lo stesso metodo nella v11 to text deve diventare cosi:

  $body:=BLOB to text(Mail_Blob;Text without length ;$offset;$maxsize)
  $offset:=0
  $maxsize:=30000
  While ($offset<BLOB size(Mail_Blob))
    $body:=BLOB to text(Mail_Blob;UTF8 Mac Text without length ;$offset;$maxsize))
    $noError:=(ErrCheck ("SMTP_Body";SMTP_Body ($Smtp_id;$body;2)))
  End while

dove $maxsize deve essere inferiore o uguale a 32K
Comandi Comandi Modificare lo stato di una relazione: SET FIELD RELATION
Per modificare lo stato di una relazione è assai utile il comando SET FIELD RELATION, soprattutto quando una relazione non è definita automatica da struttura e invece si vuole che lo diventi temporaneamente. La sintassi del comando è:

SET FIELD RELATION (manyTable | manyField; one; many)

dove
- manyTable è la tabella e in questo caso la modifica varrà per tutte le relazioni che partono dalla tabella;
- oppure manyField è il campo da cui parte la relazione;
- one e many prendono il valore delle seguenti costanti per definire le relazioni uno e molti:
Do not modify (0) non modifica nulla;
Structure configuration (1) prende per la relazione il valore stabilito nella struttura;
Manual (2) rende la relazione manuale;
Automatic (3) la rende automatica.


Un esempio:

SET AUTOMATIC RELATIONS(False;False) `Reset delle relazioni
`Solo le relazioni definite adesso verranno usate
SET FIELD RELATION([Invoices]Cust_IDt;Automatic;Automatic)
SET FIELD RELATION([Invoice_Row]Invoice_ID;Automatic;Automatic)
QR REPORT([Invoices];Char(1);True;True;True)
Comandi Comandi [v11 SQL] Il comando TRUNCATE TABLE
Il comando TRUNCATE TABLE, ereditato evidentemente dall'SQL Truncate (Table), permette la cancellazione di tutti i record di una tabella in una singola operazione.

Rispetto alla consueta coppia di ALL RECORDS / DELETE SELECTION questo comando è molto più veloce, non esegue i trigger né controlla le relazioni per eventuali integrità referenziali, non aggiorna neanche il LockedSet se trova dei record bloccati.
Semplicemente ritorna ok = 1 se ha avuto effetto, altrimenti si interrompe con ok = 0.

Utile ad esempio per ripulire velocemente una tabella temporanea.
Comandi Comandi [v11 SQL] Il comando Transform Picture
Rispetto alle versioni precedenti, adesso oltre agli operatori (+,/,*..) è possibile modificare un'immagine con il comando Transform Picture.

TRANSFORM PICTURE($immagine;Scale;$larghezza;$altezza)
I parametri $larghezza e $altezza sono il decimale del fattore di scala, ad esempio per dimezzare al 50% si usa lo 0,5

TRANSFORM PICTURE($immagine;Translate;$oriz;$vert)
I parametri sono numero anche negativo di pixel di spostamento.

TRANSFORM PICTURE($immagine;Flip horizontally)
Per ottenere un'immagine speculare orizzontalmente.

TRANSFORM PICTURE($immagine;Flip vertically)
Per ottenere un'immagine speculare verticalmente.

TRANSFORM PICTURE($immagine;Reset)
Per annullare tutte le modifiche di sopra.

Invece, non sono annullabili le seguenti opzioni:

TRANSFORM PICTURE($immagine;Fade to grey scale)
Trasforma l'immagine in scala di grigi.

TRANSFORM PICTURE($immagine;Crop;$x;$y;$larg;$alt;)
Ritaglia l'immagine partendo dalle coordinate x e y per un certo numero di pixel di larghezze e altezza
Comandi Comandi [v11 SQL] Il comando Get 4D Folder e i nuovi parametri
Al comando Get 4D Folder, già presentato in una una precedente faq, accetta nuovi parametri molto utili per identificare alcune cartelle di lavoro. Ecco l'elenco completo ad oggi:

  • Active 4D Folder
  • Licenses Folder
  • Extras Folder (dalla v11.2 da non usare, meglio la Resource folder)
  • 4D Client Database Folder
  • Database Folder
  • Database Folder Unix Syntax
    (utile su Mac quando si usa il comando Launch external process)
  • Current Resources folder
  • Logs Folder
  • HTML Root Folder



Comandi Comandi Aggiungere un elemento agli array di una listbox: INSERT LISTBOX ROW
Il caso è banale: aggiungere a tutti gli array di una listbox un elemento (possibilmente in fondo) per inserire una nuova riga.

Una possibilità è aggiungere un elemento ad ognuno degli array che compongono la listbox.
Oppure si può usare

INSERT LISTBOX ROW ({*; }object; position)

per inserire un elemento in posizione position a tutti gli array della listbox.


In ogni caso poi bisogna usare EDIT ITEM per modificare l'elemento inserito.
Comandi Comandi Differenza fra EDIT ITEM e GOTO AREA
I comandi EDIT ITEM e GOTO AREA servono per spostarsi su una certa zona di un form. La differenza sta nel tipo di oggetti su cui tali comandi si applicano.

EDIT ITEM ({*; }object{; item})

permette di modificare gli elementi di:

  • Liste gerarchiche
  • List box
  • Subforms (in questo caso, solo il nome della subform può essere passato come object),
  • List forms mostrate con MODIFY SELECTION o DISPLAY SELECTION.

item indica l'elemento da modificare, se utilizzabile.

In tutti gli altri casi si usa GOTO AREA.
Comandi Comandi [v11 SQL] Il comando OPEN SECURITY CENTER
Dalla versione v11 non è più necessario utilizzare un applicativo 4D Tools per le operazioni di manutenzione.

Le funzionalità sono ora disponibili all'interno dell'applicazione, nella cosiddetta MSC, cioè Maintenance and Security Center.

Per dare la possibilità all'utente finale di accedere alla stessa finestra, è possibile utilizzare il comando OPEN SECURITY CENTER. Alcune funzioni vengono automaticamente disabilitate in funzione dei privilegi dell'utente corrente.
Comandi Comandi [v11 SQL] Il comando CHECK LOG FILE
Il comando CHECK LOG FILE è assai potente: l'accesso ad esso dovrebbe essere ristretto agli utenti di più alto livello.

CHECK LOG FILE permette di consultare il file log e di tornare indietro (Rollback) ad uno stadio precedente della base dati.



Il comando è utilizzabile o via Runtime monoutente o da 4DServer, non da un client.

Comandi Comandi [v11 SQL] Nuovo comando Choose
4D v11 SQL ha ora un nuovo comando Choose.

Invece di scrivere un lungo case per avere un valore in funzione di un parametro singolo, è possibile usare questo comando in una singola riga.

Valore:=Choose(Criterio;Valore1;Valore2;..)

-Se il Criterio è Boolean, Choose ritorna Valore1 se True o Valore2 se False. In this case, the command expects exactly three parameters: criterion, value1 and value2.
-Se il Criterio è un numero, Choose ritorna il valore corrispondente, partendo dal Valore1 per lo Zero.

Ad esempio:
Lavoro:=Choose([Anagrafica]Mansione;"CEO";"Ingegnere Software";"Barista Starbucks";"Attore")

Questo codice è esattamente equivalente a:

Case of
  :([Anagrafica]Mansione =0)
      Lavoro:="CEO"
  :([Anagrafica]Mansione =1)
      Lavoro:="Ingegnere Software"
  :([Anagrafica]Mansione =2)
      Lavoro:="Barista Starbucks"
  :([Anagrafica]Mansione =3)
      Lavoro:="Attore"
End case
Comandi Comandi [v11 SQL] Uso di SELECT
SELECT è il comando del linguaggio SQL che permette di ottenere dei dati. Ecco un sunto della sintassi che può avere:


SELECT [ALL | DISTINCT]
{* | campo_di_ricerca, ..., campo_di_ricerca}
FROM tabella_di_ricerca, ..., tabella_di_ricerca
[WHERE condizioni_di_ricerca]
[ORDER BY lista_di_ordinamento]
[GROUP BY lista_di_raggruppamento]
[HAVING condizioni_di_ricerca]
[LIMIT {numero_intero | ALL}]
[OFFSET numero_intero]
[INTO {4d_language_reference, ..., 4d_language_reference | LISTBOX 4d_language_reference}]
[FOR UPDATE]

Comandi Comandi [v11 SQL] Il comando QUERY BY SQL
Avendo al proprio interno un motore nativo SQL, 4D v11 permette di utilizzare il comando QUERY BY SQL per eseguire query su database 4D utilizzando la sintassi SQL. Ad esempio:

QUERY BY SQL([Employees];"name=’smith’")

equivale alla query SQL:

SELECT * FROM Employees WHERE "name=’smith’"

in maniera molto simile all'uso di QUERY BY FORMULA.
QUERY BY FORMULA non usa le relazioni definite nella struttura del database, le join devono invece essere definite all'interno della query. Ad esempio, se la struttura è:

[PEOPLE]
Name
City
[CITIES]
Name
Population

la query sarà:

QUERY BY FORMULA([PEOPLE]; [CITIES]Population>1000)

oppure

QUERY BY SQL([PEOPLE];"people.city=cities.name AND cities.population>1000")
Comandi Comandi [v11 SQL] Select folder Usa una cartella di partenza
Nelle precedenti versioni di 4D, il comandoSelect folder permetteva di scegliere una cartella a partire dalla root del sistema. Ciò risultava molto noioso se la cartella da raggiungere era particolarmente annidata.

Per migliorare la fruibilità del comando, nell'ultima versione del tool di sviluppo è possibile passare come secondo parametro (opzionale) o una stringa vuota (e in tal modo verrà di default mostrata la cartella dei docimenti impostata sul sistema), oppure il percorso della cartella da mostrare all'apertura della finestra di scelta.

E' possibile passare anche un intero (fino a 32000) che indica un determinato percorso memorizzato da 4d e riproposto quando viene usato lo stesso numero, così come succedeva con il comando Select Document. I numeri passati sono condivisi dai due comandi.
Comandi Comandi [v11 SQL] USE EXTERNAL DATABASE: query SQL esterne nel codice 4D
Il comando USE EXTERNAL DATABASE, la cui sintassi è

USE EXTERNAL DATABASE (sourceName{; user; password})

permette di utilizzare il motore SQL di 4D (e le relative query) per accedere a dati presenti in DSN definiti nel sistema.

Usando questo comando, tutte le successive chiamate del processo del tipo Begin SQL/End SQL saranno indirizzate al database sourceName, finché non viene utilizzato il comando USE INTERNAL DATABASE o un altro USE EXTERNAL DATABASE per accedere ad altri DSN (simile, per capirci, al funzionamento di SET QUERY DESTINATION).

Ecco un esempio:


   C_TEXT(sourceNamesArr;sourceDriversArr;0)
      GET DATA SOURCE LIST(1;sourceNamesArr;sourceDriversArr) `i data source utente
      If (Find in array(sourceNamesArr;"emp")#-1) `se emp esiste
           USE EXTERNAL DATABASE("emp";"tiger";"scott")
           Begin SQL
           ... `stringhe SQL
           End SQL
      End if

Comandi Comandi Esportare dati con EXPORT TEXT *
Il comandi EXPORT TEXT ({table; }document) permette di esportare dati da una tabella a partire dalla selezione corrente (basta dunque eseguire precedentemente una query per esportare solo ciò che serve). L'esportazione viene eseguita utilizzando l'OUTPUT FORM e i campi vengono inseriti nell'ordine in cui si trovano nel form. Gli oggetti non campi (tipo i pulsanti) non vengono considerati.
Per ogni record esportato viene generato un evento On Load: così è possibile esportare anche variabili, impostandone i valori in questo evento.

Il nome del documento può essere quello di un documento nuovo o esistente. Se già presente, il documento viene automaticamente sovrascritto senza preavviso (se si vuole evitare ciò è bene usare prima il comando Test path name sul nome del documento da creare).

Se si passa una stringa vuota come nome del documento viene visualizzata la finestra standard di salvataggio file: se si preme Salva la variabile di sistema OK prende il valore 1.

Di default, il delimitatore di campo è la tabulazione (ASCII 9 o Tab) e quello dei record il return (ASCII 13 o CR). E' comunque possibile modificarli cambiando i valori (numerici) delle variabili FldDelimit e RecDelimit.



2
Comandi Comandi Il comando ALERT
Il comando ALERT permette di mostrare a video una dialog con un'icona, un testo da massimo 255 caratteri e un pulsante.
La sintassi è

ALERT (message{; ok button title})

dove message è il messaggio da mostrare a video (può essere un testo direttamente oppure una variabile) e, opzionale, ok button title è il testo da assegnare al pulsante OK.

Se il testo passato è superiore a 255 caratteri viene troncato.
La dimensione del pulsante viene adattata automaticamente alla dimensione del testo del pulsante.

ATTENZIONE: Il comando non deve essere eseguito all'interno dei form event On Activate oppure On Deactivate perché ciò genera un loop infinito.

Comandi Comandi Creare un logical mirror [1]: come funziona
Solitamente le tecniche di backup standard permettono di effettuare salvataggi (solitamente notturni o a richiesta) dei database. Però in qualche caso non basta avere una copia di backup, ma sarebbe utile fermare le operazioni di accesso al database per il minor tempo possibile.

Per venire incontro a questo tipo di esigenza, con la versione 2004.3 è comparso un nuovo tipo di backup: logical mirror.
Su macchine 4D Server diventa infatti possibile avere due programmi sempre aggiornati e funzionanti: vediamo come funziona.

Supponiamo di avere due Server, uno MacchinaPrincipale e l'altro MacchinaMirror. Su MacchinaPrincipale facciamo partire l'applicazione, eseguiamo un backup e definiamo un file log (che per MioDatabase sarà MioDatabase.4DL).

Usciamo dall'applicazione.

Copiamo tutti i file (compreso il log file) su MacchinaMirror.

Facciamo partire l'applicazione su entrambe le macchine: MacchinaMirror ci chiederà quale log file utilizzare e noi sceglieremo il file MioDatabase.4DL che abbiamo trasferito.

Decidiamo di eseguire l'aggiornamento del mirror in automatico (ad esempio dopo una certa quantità di operazioni). Eseguiamo un metodo contenente il comando New log file. Il precedente file di log verrà salvato , ad esempio, col nome, MioDatabase[0001-0000].4DL

Inviamo il il file MioDatabase[0001-0000].4DL a MacchinaMirror, usando 4DInternetCommands o 4DOpen.

Mentre MacchinaPrincipale continua tranquillamente a lavorare, MacchinaMirror si accorge della presenza di un nuovo file log da integrare. Esegue allora il metodo contenente il comando INTEGRATE LOG FILE che integrerà MioDatabase[0001-0000].4DL nel database. Questo è inoltre diventato così il nuovo file log.

Se quindi MacchinaPrincipale si rompe, diventando temporaneamente inutilizzabile, si può decidere di passare ad usare MacchinaMirror. Copiamo il file MioDatabase.4DL da MacchinaPrincipale a, nella posizione usuale, MacchinaMirror: questa, al solito, si accorgerà della presenza di un nuovo file di log e lo integrerà nel database, che diventerà il nuovo database da utilizzare, durante la riparazione di MacchinaPrincipale.

Riparata MacchinaPrincipale, si inseriscono su questa i file attualmente su MacchinaMirror.

I due server cominciano nuovamente a funzionare come in partenza.

Il tutto senza interruzioni lavorative e con un brevissimo tempo di attivazione del server mirror.
Comandi Comandi Il comando Get 4D folder
Il comando Get 4D folder ritorna il percorso per le cartelle utilizzate da 4D, in base al parametro passato al comando (infatti la sintassi è Get 4D folder {(folder)} ).

Le costanti utilizzabili come parametro sono:

Active 4D Folder oppure 0 (valori di default)
Licenses Folder oppure 1
Extras Folder oppure 2
4D Client Database Folder oppure 3

Nel dettaglio:

Active 4D Folder contiene i seguenti file:
le preferenze delle applicazioni o delle utility dell'ambiente 4D;
i file per il protocollo TCP/IP;
le cartelle che 4D Client scarica dal server per salvare risorse, plug-in, extras;
Solitamente il percorso della cartella è:

Su Mac OS: {Disco fisso}:Library:Application Support:4D

Su Windows: {Disco fisso}:\Documents and Settings\All Users\Application Data\4D
Su 4DClient la cartella diventa:
{Disco fisso}:\Documents and Settings\Current user\Application Data\4D
dove Current user è l'utente che ha aperto la sessione di Windows.


License Folder
Contiene i file con le licenze, si trova:
Su Mac OS : {Disco fisso}:Library:Application Support:4D:Licenses
Su Windows: {Disco fisso}:\Documents and Settings\All Users\Application Data\4D\Licenses




4D Client Database Folder (solo per le macchine client)

E' la cartella contenente tutti i file necessari al funzionamento del programma client, con le relative sottocartelle.
Il percorso è:
Su Windows: {Disco fisso}:\Documents and Settings\Current user\Application Data\4D\DatabaseName_Address

(dove Current user è l'utente che ha aperto la sessione Windows).

Su Mac OS: {Disco fisso}:Library:Application Support:4D:DatabaseName_Address




Extras Folder
Funziona solo su 4D Client e permette di conoscere il percorso alla cartella scaricata automaticamente da 4D Server contenente gli extra, tutti quei file che solitamente vogliamo siano presenti su ogni client (risorse statistiche, testi, xml, preferenze).
Il percorso è:
Su Windows: {Disco fisso}:\Documents and Settings\Current user\Application Data\4D\DatabaseName_Address\Extras

(dove Current user è sempre l'utente che ha aperto la sessione Windows).

Su Mac OS: {Disco fisso}:Library:Application Support:4D:DatabaseName_Address:Extras

Comandi Comandi 4D 2004 - Il comando SELECT LISTBOX ROW
In una listbox, il comando SELECT LISTBOX ROW permette di impostare la selezione per le righe il cui numero viene passsato come parametro.
La sintassi è:

SELECT LISTBOX ROW ({*; }object; position{; action})

dove
- object è l'oggetto listbox (se si passa la variabile "*" non serve, altrimenti si usa se si vuole passare il nome dell'oggetto);
- position è la riga da prendere in considerazione;
- action è un intero (facoltativo) che permette di impostare l'azione da compiere sulla riga. Per azione si intende:

Replace listbox selection (0): sostituisce la selezione attuale con quella specificata da position, è l'azione di default.
Add to listbox selection (1): la riga position viene aggiunta alla selezione corrente.
Remove from listbox selection (2): la riga position viene rimossa dalla selezione corrente.

Per scorrere direttamente via linguaggio alla riga selezionata si può usare il comando SCROLL LINES.
Per passare automaticamente alla modalità di inserimento si può usare il comando EDIT ITEM.

Comandi Comandi Il comando GET CLIPBOARD
Il comando GET CLIPBOARD, la cui sintassi è

GET CLIPBOARD (dataType; data)

dove

- dataType è ua stringa di 4 caratteri passata al comando indicante il tipo di dato presente negli appunti (case sensitive)
- data è il blob che riceve il contenuto degli appunti

permette di riempire un blob con il contenuto della clipboard.

Il risultato del comando può essere uno dei seguenti:
- i dati sono estratti correttamente dagli appunti e la variabile OK viene impostata a 1.
- gli appunti non contengono il tipo di dati specificato in dataType, la variabile OK viene settata a 0 e viene generatoun errore -102
- non c'è sufficiente memoria per eseguire il comando, OK vale 0 e viene generato un errore -108.

Comandi Comandi Il comando SELECTION TO ARRAY
Il comando SELECTION TO ARRAY la cui sintassi è

SELECTION TO ARRAY (field | table; array{; field2 | table2; array2; ...; fieldN | tableN; arrayN})

dove

table è la tabella da cui ottenere i record number, oppure
field sono i campi da cui ricevere i dati
array sono gli array che riceveranno i dati

crea uno o più array ricopiando i dati o i record number della selezione corrente nei vari array.

SELECTION TO ARRAY è in grado anche di caricare i valori di tabelle in relazione "a Uno" con la tabella attuale, purché sia, temporaneamente o di default, automatica.

Ogni array riceve dati dello stesso tipo, eccettuati i seguenti casi:
- se un campo testo viene copiato in uno String array, l'array resta di tipo String;
- un campo time viene copiato in un array di tipo Long Integer.

Il comando è ottimizzato per 4DServer

Dopo l'esecuzione di SELECTION TO ARRAY, sia la selezione che il record corrente non vengono modificati, ma il record corrente non risulta caricato: è dunque necessario usare un LOAD RECORD per caricarlo nuovamente.

Comandi Comandi Il comando SET BLOB SIZE
Il comando SET BLOB SIZE, la cui sintassi è:

SET BLOB SIZE (blob; size{; filler})

permette di specificare una nuova dimensione size per il blob blob passato come parametro.
Il comando è ad esempio usato per svuotare il contenuto di un blob.

Il parametro opzionale filler permette di specificare, in caso di aumento di dimensione del blob, il codice ascii del carattere da utilizare per "riempire" i byte aggiunti.
Comandi Comandi Mostrare la posizione di un file o di una cartella
Dalla 2004.1 è disponibile il comando SHOW ON DISK per mostrare la posizione di un file o di una cartella.

Il comando apre proprio la cartella del Finder su Mac o dell'Explorer su Windows.

Il parametro passato può essere il nome di un file o di una cartella.

SHOW ON DISK(“C:\\MiaCartella\\MioDocumento.txt”)
SHOW ON DISK(“C:\\MiaCartella\\CartellaInterna)

SHOW ON DISK(“Macintosh HD:MiaCartella:MioDocumento.txt”)
SHOW ON DISK(“Macintosh HD:MiaCartella:CartellaInterna")

Se si indica una cartella il Finder/Explorer ne mostrano la posizione; nel caso in cui la si volesse già aperta passare un secondo parametro *.

SHOW ON DISK(“C:\\MiaCartella\\CartellaInterna”;*)
SHOW ON DISK(“Macintosh HD:MiaCartella:CartellaInterna";*)

Comandi Comandi Il verso di esecuzione dei comandi di comunicazione interprocesso
I comandi GET PROCESS VARIABLE, SET PROCESS VARIABLE and VARIABLE TO VARIABLE permettono di far comunicare fra di loro i processi.

Tali comandi sono utilizzabili sia in versione monoutente che in modalità Client/Server.

In quest'ultimo caso, è importante ricordare come le operazioni di lettura o scrittura avvengono solo nel verso "dal client al server": non è dunque possibile far comunicare direttamente fra di loro due client o eseguire le operazioni di lettura/scrittura dal server verso il client.

Comandi Comandi Operatori Binari
Nei casi in cui è necessario lavorare a livello binario, cioè dei Bit, 4d fornisce una serie di operatori che lavorano con numeri interi o longint.

AND = & = Numero & Numero
OR = | = Numero | Numero
XOR = ^| = Numero ^| Numero

Per spostare il numero binario verso sinistra o verso destra di un numero di posti:

Left Bit Shift = << = Numero << diQuantiBit
Right Bit Shift = >> = Numero >> diQuantiBit

Per controllare e modificare un singolo bit all'interno di un numero

Attiva Bit = ?+ = Numero ?? qualeBit
Azzera Bit = ?- = Numero ?? qualeBit
Controlla Bit = ?? = Numero ?? qualeBit
Comandi Comandi Creare una selezione da valori multipli
Nel caso in cui si abbia la necessità di fare un ricerca per valori multipli su un campo indicizzato, piuttosto che accodare diverse query, è meglio usare QUERY WITH ARRAY che crea la selezione di record in modo molto più veloce.

Ecco un esempio, per selezionare tutti i clienti di Milano, Roma, Napoli:

ARRAY STRING (2;Province_at;2)
Province_at{1}:="MI"
Province_at{2}:="RM"
Province_at{3}:="NA"
QUERY WITH ARRAY ([Clienti]Provincia; Province_at)

Nota: non è necessario passare la tabella perchè il comando cambia la selezione relativa al campo indicizzato passato come primo parametro.
Comandi Comandi Cercare un elemento in un indice: Find Index Key
Con il comando Find Index Key(campo_indicizzato;termine) è possibile cercare direttamente una voce all'interno di un indice, senza toccare la selezione corrente.

Ad esempio, è estremamente utile dall'interno di una maschera d'inserimento per controllare che una voce non sia già presente nella base dati, senza perdere il record corrente.

La funzione ritorna -1 se la voce non è nell'indice, altrimenti se la trova ritorna il numero di record corrispondente.

Da notare che il termine da cercare deve essere necessariamente una variabile perché il comando la riempie con il valore trovato: in questo modo si possono fare le ricerche sui campi Alpha usando la "@".
Comandi Comandi Controllo Ortografico Integrato
Il comando SPELL CHECKING avvia il controllo della correttezza dei termini usati nel campo o variabile di tipo testo in cui si trova il cursore nella maschera corrente.

Se il termine non viene trovato appare la relativa finestra di dialogo dove è possibile correggere, ignorare o aggiungere il termine nel proprio dizionario personale.

4th Dimension usa il dizionario corrente, corrispondente alla lingua dell'applicativo usato; quindi normalmente in Italia avremo preimpostato l'Inglese.

Con il comando SET DICTIONARY è possibile scegliere fra Inglese, Francese, Spagnolo e Tedesco con una serie di loro varianti.

Al momento (settembre 2005) l'Italiano non è disponibile.
Comandi Comandi Linee a colori alternati nelle liste di record
Il comando Displayed line number è uilizzabile solo all'interno dell'evento On Display Detail; ecco un esempio di utilizzo per colorare un campo in modo diverso in funzione della riga selezionata.

If (Form event=On Display Detail)
  If (Displayed line number % 2 = 0)
      `Nero su bianco per le righe pari
      SET RGB COLORS([Tabella]Campo; -1; 0x00FFFFFF)
  Else
      `Nero su celeste per righe pari
      SET RGB COLORS([Tabella]Campo; -1; 0x00E0E0FF)
    End if
End if
Comandi Comandi Delay Process e il processo User/Custom Menus
Il comando Delay process ha una particolarità: non funziona nel processo "User/Custom Menus", cioé non lo rallenta.

Questo è normamente causa di confusione quando una procedura che contiene un Delay Process viene testata in ambiente User: la soluzione è di ricordarsi di selezionare il pulsante "New Process" nella finestra di Execute Method (in modo da lanciare la procedura in un processo separato).

Oppure è possibile usare un metodo alternativo:

    `Metodo Pausa
    `Aspetta 2 secondi o il numero di secondi che gli passi come parametro
    `funziona anche in User/Runtime
C_LONGINT($sec_l)
C_TIME($inizio_h)
If (Count parameters>0)
  $sec_l:=$1
Else
  $sec_l:=2
End if
$inizio_h:=Current time
While (Abs(Current time-$inizio_h)<$sec_l)
  DELAY PROCESS(Current process;30)
End while

Comandi Comandi Il comando BLOB size
Comando: BLOB size (blob) -> Longint

Categoria: BLOB

Versione: 6.0

Parametri: blob è una variabile o un campo di tipo BLOB

Risultato: Long Integer - Valore numerico indicante la dimensione del BLOB passato come parametro.

Descrizione: BLOB size ritorna la dimensione di un BLOB espressa in byte.

Esempio: il seguente frammento di codice aggiunge 100 byte al BLOB mioblob_bl

SET BLOB SIZE(BLOB size(mioblob_bl)+100)

Comandi Comandi Il comando ARRAY TO SELECTION
Il comando ARRAY TO SELECTION, la cui sintassi è:

ARRAY TO SELECTION (array; field{; array2; field2; ...; arrayN; fieldN})

dove

array[n] sono gli array da copiare nella selezione;
filed[n] sono i campi che ricevono i dati (tutti appartenenti alla stessa tabella)

copia il contenuto di uno o più array in una selezione di record.
Il primo degli array passati determina il numero di record che verranno creati.
E' importantissimo ricordare che il comando SOVRASCRIVE LA SELEZIONE della tabella: se si vuol essere sicuri di non incappare in inconvenienti può essere utile eseguire un REDUCE SELECTION prima di ARRAY TO SELECTION.
Se invece si vuole intenzionalmente sovrascrivere la selezione, è bene controllare se qualche record è bloccato, guardando il contenuto del set del processo chiamato LockedSet, che contiene i record bloccati: i record bloccati non vengono sovrascritti da ARRAY TO SELECTION.
Il comando è ottimizzato per l'uso con 4D Server.

Comandi Comandi Come usare il Sequence Number
La funzione Sequence Number ritorna un numero progressivo automatico per ogni tabella ed è usato per creare il codice identificativo (o chiave primaria) del singolo record. Parte da 1 alla creazione del database ed è incrementata da 1 per ogni record salvato.

La funzione però aveva alcuni limiti per cui era sconsigliata: in pratica poiché non era possibile modificarne il valore corrente diventava difficile, ad esempio, spostare i dati da un database all'altro o ripartire da un certo numero.

Finalmente dalla 2004.1 è disponibile un modo accedere al valore usato dal Sequence Number:

1. Get Database Parameter ( Tabella ; Table Sequence Number ) -> Longint
Legge il valore corrente del prossimo numero che sarà assegnato dalla Sequence Number per la Tabella passata come primo parametro

2. SET DATABASE PARAMETER ( Tabella ; Table Sequence Number ; Longint )
Imposta il prossimo numero progressivo che sarà generato dalla Sequence Number pe la Tabella.


1
Comandi Comandi Impostare il timeout di una chiamata SOAP
Nelle chiamate SOAP con Call Web Service il timeout di connessione è di default 10 secondi: se il server non risponde in questo tempo, il client chiude la connessione.

Per impostare un timeout differente per la prossima chiamata è possibile usare il seguente comando (disponibile dalla versione 2004):

SET WEB SERVICE OPTION(Web Service HTTP Timeout;30)

Se non si riesce ad utilizzare questa opzione, magari perchè la connessione cade lo stesso malgrado un timeout più lungo, allora si può provare ad ottenere il risultato
della propria chiamata in differita.

Cioè, ipotizzo una comunicazione del genere:
          
A) il client : invia il dato
B) il server : riceve e risponde subito un codice "sto elaborando"
C) il client : ogni tempo X riprova a chiedere lumi al server
D) il server : quando ha finito il codice è "ok" oppure "err, lista errori"

Se il client (e l'utente) deve rimanere bloccato in attesa, il tempo X potrebbe essere molto breve, anche di 5 secondi.
Comandi Comandi SET TABLE TITLES e SET FIELD TITLES *
Il comando SET TABLE TITLES permette di nascondere, riordinare o rinominare le tabelle presenti nel database quando questo elenco appare nelle dialog di 4th Dimension, come ad esempio il Query Editor o Quick Report.

La sintassi è:

SET TABLE TITLES (tableTitles; tableNumbers)

dove tableTitles è l'array contenente i nuovi nomi e tableNumbers le attuali posizioni nella struttura (table number).

Gli array devono essere sincronizzati. Per non far comparire una tabella basta non includerne titolo e numero negli array.

Quindi, ad esempio supponiamo di avere tre tabelle A, B e C, create in questo ordine, e di volerle far apparire come X, Y e Z. Inoltre non vogliamo che la tabella B sia visibile. Infine, vogliamo far apparire le tabelle nell'ordine Z e X. Tutto ciò si fa semplicemente inserendo Z e X nell'array dei nomi e 3 e 1 nell'array delle posizioni.

SET TABLE TITLES non modifica la struttura, ma è valido per le semplici sessioni: quindi ad esempio, più 4D Client possono vedere lo stesso database simultaneamente in modo differente.

SET TABLE TITLES non ha il potere di modificare l'attributo Invisible attribuito ad una tabella nella struttura: così, una tabella invisibile continuerà ad esserlo, anche se inserita negli array passsati al comando.

Il comando SET FIELD TITLES è molto simile, semplicemente applica le stesse considerazioni di SET TABLE TITLES ai campi di una tabella.


2
Comandi Comandi Controllare tutti i plugin caricati
Con la versione 2004 di 4D è possibile conoscere la lista di tutti i plug-in caricati utilizzando il comando GET PLUGIN LIST: un ottimo sistema per controllare allo startup del database se tutti i componenti necessari al programma sono presenti.

GET PLUGIN LIST elenca tutti i plugin, sia quelli integrati (tipo 4D Chart) che quelli di terze parti.
Comandi Comandi Confrontare due reali: il comando SET REAL COMPARISON LEVEL
Il comando SET REAL COMPARISON LEVEL a cui viene passato come parametro un numero, indica il valore epsilon secondo cui valutare l'uguaglianza fra due numeri reali.

Come visto nella faq sull'arrotondamento dei numeri reali, il computer effettua delle approssimazioni per calcolare i numeri reali: quindi anche nel calcolare l'uguaglianza fra due numeri 4th Dimension deve tenere in considerazione questa approssimazione, controllando se se la differenza fra due numeri eccede o meno un certo valore. Questo valore è dato proprio dall'epsilon passato come parametro a SET REAL COMPARISON LEVEL.

Vediamo un esempio.
Dati due numeri reali a e b, se Abs(a-b) è maggiore di epsilon i numeri verranno considerati diversi, altrimenti uguali.
Di default, 4D usa come epsilon 10 elevato a -6 (10^-6). Ciò significa che:

• 0,00001=0,00002 restituisce False perché la loro differenza (0,00001) è maggiore di 10^-6.
• 0,000001=0,000002 ritorna True perché la loro differenza (0,000001) non è maggiore di 10^-6.
• 0,000001=0,000003 restituisce False perché la loro differenza (0,000002) è maggiore di 10^-6.

Bisogna dunque usare SET REAL COMPARISON LEVEL se risulta necessario confrontare valori più bassi di 10^-6.

Si noti inoltre che se si deve eseguire una query o un ordinamento su un campo contenente valori più bassi di 10^-6, il comando SET REAL COMPARISON LEVEL deve essere usato prima della costruzione dell'indice.

Il comando non ha alcun effetto sul calcolo o la visualizzazione dei numeri reali.
Comandi Comandi Uso di Delay Process o di Pause Process
I comandi Delay Process e Pause Process fanno essenzialmente la stessa cosa: interrompono l'esecuzione del processo indicato. La differenza fondamentale sta nel fatto che:

- DELAY PROCESS ferma l'esecuzione del processo per un certo lasso di tempo, dopo il quale il processo riprende automaticamente;

- PAUSE PROCESS ferma l'esecuzione del processo fino a che non viene eseguito sullo stesso processo un comando RESUME PROCESS.

Una situazione tipica si ha ad esempio quando un metodo lancia un nuovo processo e deve attendere il completamento dell'esecuzione di quest'ultimo per poter continuare. L'algoritmo per il metodo chiamante sarebbe:

$id:=New process
While (Process state($id)>=0)
    DELAY PROCESS (Current process; tempo_di_pausa_che_penso_ragionevole)
End while

In questo caso l'attesa e la ripresa sono gestite dal processo chiamante. Il vantaggio è che il processo chiamato non ha interazione alcuna col processo chiamante. Lo svantaggio è che il ciclo While potrebbe sprecare troppo tempo macchina (se il tempo di attesa è troppo corto) o fare restare il processo inattivo inutilmente (se il tempo di attesa è alto). Vantaggi e svantaggi si invertono se l'algoritmo è:

$id:=New process
PAUSE PROCESS (Current process)

Il processo resta fermo in attesa che il processo chiamato non lo svegli con un RESUME PROCESS.
Comandi Comandi Controllare il blocco dei record con LOCKED ATTRIBUTES
Dopo aver controllato che un record è bloccato (prima della modifica o della cancellazione), con Locked, può essere usato il comando LOCKED ATTRIBUTES per capire chi o quale processo ha in uso il record.

La sintassi è:

LOCKED ATTRIBUTES ({table; }process; user; machine; processName)

dove "table" è la tabella (se specificata, altrimenti userà quella di default), mentre gli altri parametri sono variabili che restituiscono il numero di processo (in modalità client/server è il numero di processo del server), nome utente e macchina (ma solo se in modalità client/server, altrimenti si ottengono due stringhe vuote) e il nome del processo.
Comandi Comandi Il comando Get menu item
Il comando Get menu item riceve come parametri il numero identificativo del menu, il numero identificativo della voce del menu e, opzionale, il numero di processo e restituisce il testo di una voce di menu.
Comandi Comandi Il comando Get indexed string
Utilizzando una sintassi del tipo:

Get indexed string (resID; strID{; resFile})

dove:

- resID è il numero della risorsa;
- strID è il numero della stringa;
- resFile è il numero identificativo del resource file da usare, altrimenti, se omesso, tutti i file aperti;

il comando permette di ottenere la stringa contenuta nella risorsa lista di stringhe resID in posizione strID. Per ottenere tutte le stringhe di una risorsa di questo tipo si usa invece il comando STRING LIST TO ARRAY.


1
Comandi Comandi APPLY TO SELECTION
Questo comando esegue una riga di codice, operazione o metodo sulla selezione corrente della tabella passata come primo parametro; in genere si usa per modificare un campo con un'unica operazione. Se nella selezione ci fosse qualche record bloccato, viene preparato un set "LockedSet" da controllare dopo l'uso dell'Apply.
Ma i record vengono salvati solo se modificati, per cui questo comando può essere facilmente usato anche in altri modi.

Ad esempio le seguenti sei righe di codice:
  $totale_r:=0
  FIRST RECORD([Righe])
  While (Not(End selection([Righe])))
    $totale_r:=totale_r+([Righe]Quantità*[Righe]Prezzo)
    NEXT RECORD([Righe])
  End while

possono essere riassunte in due soltanto:
  $totale_r:=0
  APPLY TO SELECTION([Righe];$totale_r:=totale_r+([Righe]Quantità*[Righe]Prezzo))
Comandi Comandi Execute on server
Comando: Execute on server

Categoria: Processes

Versione: 6

Parametri:
Execute on server (procedure; stack{; name{; param{; param2; ...; paramN}{; *}}}) : Numero

procedure, Stringa : Procedura da eseguire all'interno del processo
stack, Numero : Dimensione in byte dello Stack, 128*1024 è un buon numero
name, Stringa : Il nome del processo generato
param, Expression : Parametri della procedura
* = non aprire un altro processo se già in esecuzione con questo nome
Valore ritornato, Numero : Numero del processo generato o in esecuzione.

Execute on server esegue un nuovo processo sulla macchina server (nella modalità client/server) o in locale (in modalità runtime).

Chiamando Execute on server da un client viene ritornato un numero di processo negativo, se viene chiamato dal server un numero positivo.

Se il processo non può essere generato il valore ritornato è 0 e viene generato un errore intercettabile con ON ERR CALL.
Comandi Comandi Application type
Comando: Application type -> Long Integer

Categoria: 4D Environment

Versione: 6.0

Parametri: Non richiede parametri

Risultato: Long Integer - Valore numerico indicante il tipo di applicazione.

Descrizione: Il comando Application type restituisce un valore numerico indicante il tipo di ambiente 4D attualmente in esecuzione. 4D fornisce le seguenti costanti (con i relativi valori numerici):

4th Dimension: 0
4D Engine: 1
4D Runtime: 2
4D Runtime Classic: 3
4D Client: 4
4D Server: 5
4D First: 6

Esempio: in un punto qualsiasi di un programma (che non sia il database method On Server Startup) se si vuole controllare se si sta eseguendo 4D Server, si può scrivere:

If (Application type=4D Server)
      `esegui qualcosa
End if

Comandi correlati:
Application version, Version type

Comandi Comandi FLUSH BUFFERS
Comando: FLUSH BUFFERS

Categoria: 4D Environment

Versione: 3

Parametri: Non richiede parametri

Descrizione: Il comando FLUSH BUFFERS salva immediatamente i dati nella cache temporanea su disco: tutte le modifiche effettuate al database vengono salvate.

Solitamente non è necessario chiamare questo comando, poiché 4th Dimension si preoccupa di effettuare regolarmente questa operazione. La proprietà del database Flush Data Buffers (nel Design environment), che specifica quanto spesso effettuare il salvataggio, viene usata proprio per controllare la tempistica di questa operazione.

Nota: 4D si occupa anche della correttezza delle operazioni effettate sui dati ancora presenti nel file buffer, e in maniera trasparente. Ad esempio l'esecuzione di una query integra tranquillamente i dati presenti nel data file con quelli presenti ancora nel buffer.

Accesso

User: Nuovo
Pass: Accedi

Utenti Registrati

Cerca

Se non trovi le informazioni che cerchi scrivi a aiuto@sviluppo4d.it

4D Principali

4D Discussioni

Faq random


Crediti

Dominio registrato da ZetaNet
Sito realizzato da Nexus srl
4D SQL 11.9.0 offerto da 4D & Italsoftware
Icone di FAMFAMFAM
Moderato da Umberto Migliore
262 utenti registrati

Pagina servita il 28/04/17 alle 10:18:38 Valid HTML 4.01! Valid CSS!

Mutuo Facile, Serie Filmcards, Serie Singloids e altre app di Nexus srl per iPhone e iPad

Cidroid, distributore italiano lettori barcode per Apple iPhone, iPod, iPad della IPC