
Naviga:
|
Ho trovato 48 faq.
| Categoria | Argomento | Commenti |
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] 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 |
|
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. |