Naviga: |
Ho trovato 68 faq.
Categoria | Argomento | Commenti | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comandi |
[v16] 4D Tags
Questo è l'elenco aggiornato dei TAG da usare nelle pagine dinamiche ( o da Web o col comando PROCESS 4D TAGS) : 4DTEXT, inserisce variabili o espressioni di 4D come testo (se contengono un carattere come il < lo traducono in htmlencode per visualizzarlo cosi com'è) 4DHTML, inserisce variabili o espressioni di 4D come codice HTML, senza conversioni 4DEVAL, valuta espressioni di 4D, anche senza risultato ( tipo a:=1 ), nel caso ritorni lo considera come HTML senza sostituzioni di caratteri 4DSCRIPT, esegue un metodo 4D (in fase di preparazione della pagina, non arriva sul browser) con la sintassi <!--#4DSCRIPT/metodo/mioparametro--> : The method does not exist. Nota: il metodo deve essere flaggato come disponibile per il web, aver dichiarato come testo $0 e $1, e in $1 riceverà "/mioparametro" 4DINCLUDE, include un'altra pagina (in fase di preparazione della pagina, non arriva sul browser) 4DBASE, definisce da quel punto in avanti dove prendere le pagine con i 4DINCLUDE successivi 4DCODE, esegue blocchi di codici 4D anche su più righe, incluse finestre e il comando Trace: è eseguito lato server prima di servire la pagina 4DIF, 4DElse, 4DElseIF e 4DENDIF, per gestire condizioni, 4DLOOP and 4DENDLOOP, per fare cicli di codice. Adesso accetta: - array ( incluso array di puntatori) - tabella (la selezione corrente) - espressione, in cui esce dal ciclo per una condizione classica, del tipo: <!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP--> |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
[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 |
[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:
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 |
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 |
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 |
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 |
[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 rinominati dalla v11 alla v12
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comandi |
Comandi rinominati dalla 2004 alla v11
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
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 |
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:
- (...) definiscono i gruppi. È possibile infatti ottenere sia delle stringhe di corrispondenza che delle sottostringhe, quelle che corrispondono ai pattern fra parentesi. Quindi:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
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:
- [ ... ] 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:
- + (il segno più) corrisponde a uno o più operatori. Quindi:
? - corrisponde a zero o un operatore. Quindi:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
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 |
[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 |
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 |
[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 |
[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 |
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 |
[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 |
[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 |
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 |
[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 |
[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 |
[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:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
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:
item indica l'elemento da modificare, se utilizzabile. In tutti gli altri casi si usa GOTO AREA. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
[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 |
[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 |
[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 |
[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 |
[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 |
[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) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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. |
Mutuo Facile, iDigitalScout, iDigitalTags e altre app di Nexid srl per iPhone e iPad
Cidroid, distributore italiano lettori barcode per IOS Apple iPhone, iPod, iPad