Importazione in formato JASCII
FORMATO DEL FILE
JOLLY esegue importazioni di dati all'interno del database leggendo dati da file scritti nel seguente formato.
- JOLLY ASCII(marcatore del formato di file)
- VERSION=nnnn
- Data e ora esportazione(YYYY-MM-DD HH:MM)
- Codice numerico univoco del programma / utente che ha prodotto il file
- Descrizione di chi ha prodotto il file
- [UNIQUE_ID=identificatore univoco di esportazione]
- [LOGFILE=[nomefile]]
- [ASK_READ_LOGFILE=YES|NO]
- [OS_EXECUTE_BEFORE=comando (.BAT o .CMD)]
- [OS_EXECUTE_AFTER=comando (.BAT o .CMD)]
- [MESSAGEBOX=TEXT=messaggio;CAPTION=titolo[;FLAGS=xxxx]]
- [ABORT=TEXT=messaggio;CAPTION=titolo]
- [DBS=ASA|SQLSERVER|OTHER]
- [USE_STORED_PROCEDURE=ON|OFF]
- eventuali righe vuote, per consentire eventuali future modifiche al formato
- TABLE_START=nome (simbolico) della tabella
- [TABLE_NAME=nome fisico della tabella]
- NUMBER_OF_FIELDS=numero dei campi da importare per la table
- DATA_LENGTH={lunghezza di ogni riga di dati (compreso l'asterisco che termina ogni riga) | VARIABLE (se la riga è a lunghezza non fissa)}
- [{IF_RECORD_EXISTS | IF_ALREADY_IMPORTED} = {ignore|ask|skip|update|delete_and_insert} [;if=§condizione sql§] [;sql_skip=§espressione sql§] [;sql_update=§espressione sql§] [;sql_delete=§espressione sql§]]
- [SKIP_IF_QUERY_HAS_ROWS=§espressione sql§]
- [SQL_EXECUTE_BEFORE_IMPORT=espressione SQL]
- [SQL_EXECUTE_AFTER_IMPORT=espressione SQL]
- [SQL_EXECUTE_AFTER_ROW=espressione SQL]
- [DONT_REGISTER_IMPORTATION]
- [UPDATE_VIDEO_FREQUENCY=numero di records]
- [LOGFILE={YES [:FIELDNAME] | NO} [, descrizione table]]
- [MESSAGE_FIELD=nomecampo]
- DONT_REGISTER_KEYS opzione che consente di accelerare sensibilmente l'importazione di tabelle con molte righe
- FIELDS_START(indica l'inizio della definizione dei campi)
- una riga per ogni campo esportato (ovvero: da importare)
- TABLE_END
- eventuali righe vuote
- DATA_START(indica l'inizio della sezione dati)
- una o più righe di dati per ogni record esportato (da importare) | DATAFILE=nomefile
- DATA_END(indica la fine della sezione dati)
- eventuali righe vuote
- [eventuali altre tabelle, che devono rispettare lo stesso formato, a partire dalla clausola TABLE_START fino alla clausola DATA_END]
- END_OF_FILE
E' possibile importare fino a 24 tabelle nello stesso file.
VERSION
Numero di versione del formato di esportazione del file dati; valore exadecimale a 4 cifre: le prime due indicano la versione, le ultime 2 la release; esempio: 0258 = 0x0102 = ver 1, rel 2.
Le versioni dei formati di importazione jascii sono le seguenti:
| versione | data | descrizione |
|---|---|---|
| 1.01 | 2003 | versione iniziale della procedura |
| 1.02 | 15-02-2005 | aggiunta della possibilità di esportazione di più campi a lunghezza variabile (e non solamente di uno); anziché essere registrati alla fine della prima (e unica) riga di dati, tali campi vengono scritti in righe supplementari (una riga per ogni campo) |
UNIQUE_ ID
La clausola UNIQUE_ID è riferita al file
exportato nel suo insieme e consente di identificare in modo univoco i files importati.
Non ha alcuna relazione con l'esistenza o meno dei singoli records importati sul
database di destinazione, ma serve esclusivamente ad evitare di importare più volte, per errore, lo stesso file.
Il programma infatti si rifiuta di importare più di una volta files con lo stesso identificatore.
La clausola è facoltativa.
LOGFILE=[nomefile]
Se la clausola è presente, su NOMEFILE vengono
registrate le attività svolte dalla procedura di importazione. Se NOMEFILE
non è indicato, sarà utilizzato lo stesso nome del file dati con estensione .TXT.
Per attivare/disattivare le informazioni sulle singole tables, vedi la clausola LOGFILE=YES/NO.
Nomefile può contenere variabili di ambiente del sistema operativo
(esempio: %ProgramFilesDir%, oppure %TEMP%).
ASK_READ_LOGFILE=YES|NO
L'inserimento di questa clausola facoltativa
abilita/disabilita la proposta di lettura del file log (ovviamente solo se
questo è presente) al termine dell'esportazione. Il valore predefinito è NO.
Spesso, soprattutto se l'utente non è particolarmente brillante, la proposta di
lettura del file LOG (di cui non si capisce il significato né l'utilità) può
indurre confusione.
TABLE_NAME
Formato:TABLE_NAME=nome fisico della tabella
La clausola è facoltativa. Serve per quei (rari) casi in cui si desidera importare sulla stessa tabella di destinazione dati provenienti da due tabelle diverse. In questo caso è necessario usare due nomi diversi nella clausola TABLE_START, e il nome reale della tabella di destinazione in TABLE_NAME.
Esempio:
TABLE_START=telefoni_telefoni
TABLE_NAME=telefoni
…..
TABLE_END
TABLE_START=telefoni_fax
TABLE_NAME=telefoni
…..
TABLE_END
OPZIONI TABELLA
Le seguenti opzioni possono essere indicate per ogni tabella.
- IF_RECORD_EXISTS
| IF_ALREADY_IMPORTED = {ignore|skip|update|delete_and_insert}[;if=§condizione
sql§] [;sql_skip=§espressione sql§] [;sql_update=§espressione sql§] [;sql_delete=§espressione
sql§]
Questa opzione consente di controllare la circostanza che il record sia già stato importato, oppure che esista già sulla tabella di destinazione (le due circostanze, ancorchè simili e spesso coincidenti, sono molto ben distinte, soprattutto nel caso in cui la primary key sulla table di destinazione sia generata al momento dell'importazione). Qualora sia possibile, è preferibile usare il controllo sulla tabella di destinazione, in quanto di più semplice ed efficace gestione.
NB: per utilizzare questa opzione è necessario aver definito la primary key per la table.
se la condizione indicata è vera viene eseguita una delle seguenti operazioni:
- IGNORE: non viene eseguito alcun controllo sull'esistenza del record;
- ASK: viene chiesto all'utente cosa fare; valore DEFAULT se l'opzione non viene indicata;
- SKIP: il record viene semplicemente ignorato;
- UPDATE: il record viene aggiornato;
- DELETE_AND_INSERT: il record viene prima eliminato e poi importato.
L'operazione viene eseguita solo se la condizione (opzionale) risulta verificata; se la condizione non è verificata l'azione eseguita è l'opposto di quella proposta: SKIP > UPDATE, UPDATE > SKIP, DELETE > SKIP; la condizione può contenere:
- campi del record da importare compresi tra $ e $
- campi del record esistente compresi tra $@ e @$ (l'uso dei campi del record da importare è in generale preferibile per motivi di performance)
La condizione deve essere un predicato booleano in sintassi SQL. Ad esempio:
- IF_RECORD_EXISTS=update; IF = $dt_update$ > $@dt_update@$
- IF_RECORD_EXISTS=delete; IF = $dt_update$ <= $@datetime_exportation@$
Possono essere opzionalmente indicate espressioni SQL che sono eseguite in concomitanza con uno dei possibili eventi (skip/ update/ delete). Tali espressioni SQL vengono eseguite prima dell'evento e solo se l'evento si verifica.
- sql_skip=§espressione sql§
- sql_update=§espressione sql§
- sql_delete=§espressione sql§]
Su tali espressioni SQL vengono eseguite le stesse sostituzioni previste per la condizione.
L'opzione si ripercuote a cascata sulle tabella collegate attraverso un legame di FOREIGN KEY (le righe figlie subiranno lo stesso trattamento della riga padre) a meno di specifiche ulteriori condizioni espresse sulle righe figlie.
Il valore default è:
- IF_RECORD_EXISTS >> ASK
- IF_ALREADY_IMPORTED >> IGNORE (nessun controllo)
- SKIP_IF_QUERY_HAS_ROWS=§espressione
sql§ l'importazione viene eseguita solo se l'espressione SQL
specificata non restituisce nessuna riga
esempio: SKIP_IF_QUERY_HAS_ROWSl'istruzione è ripetibile; vengono importati i soli records per i quali tutte le clausole sono contemporaneamente soddisfatte - DONT_REGISTER_IMPORTATION: qualora sia abilitata l'opzione di registrazione delle righe importate, la tabella risulta comunque esclusa da tale trattamento;
- DONT_REGISTER_KEYS: evita che venga registrato il valore di tutte le righe importate; può essere usato solo da tabelle la cui Primary key non è referenziata da Foreign Keys di altre tabelle; serve per velocificare (sostanzialmente) il caricamento di tabelle con un enorme numero di righe;
- SQL_EXECUTE_AFTER_ROW=espressione SQL: una o più espressioni SQL che vengono eseguite per ogni riga subito dopo l'importazione della riga; ogni espressione può occupare una riga. E' possibile indicare il nome di campi della riga, compresi tra una coppia di $.
- SQL_EXECUTE_BEFORE_IMPORT=espressione SQL: una o più espressioni SQL che vengono eseguite prima dell'importazione della table; non vengono eseguite sostituzioni.
- SQL_EXECUTE_AFTER_IMPORT=espressione SQL: una o più espressioni SQL che vengono eseguite al termine dell'importazione della table; non vengono eseguite sostituzioni.
- [MESSAGE_FIELD=nomecampo]il campo indicato sarà utilizzato per la compilazione del registro di importazione e per tutti i messaggi utente
- LOGFILE={YES [:FIELDNAME] | NO} [,descrizione table] attiva/disattiva la registrazione su file dei record importati. Presuppone l'esistenza di una clausola LOGFILE=filename. Il campo referenziato nel file log sarà FIELDNAME; se FIELDNAME non viene indicato (e/o se non viene indicata la clausola LOGFILE), sarà utilizzato MESSAGE_FIELD o, in subordine, il primo campo della table. Il valore DEFAULT è YES (attivato dalla clausola LOGFILE generale).
FORMATO CAMPO
Per ogni campo esportato si deve
inserire una riga che descrive nome, tipo e caratteristiche del campo.
La sintassi è la seguente:
[!]name tipo [col_start {size|*}] [SQL=§espressione SQL§] [PK] [FK:table] [autoincrement] [REM] [commenti]
| ! | indica che il campo deve
essere riempito a spazî, e non trimmato; per default il campo viene trimmato |
| name | il nome del campo SQL |
| tipo | il tipo di campo: può essere uno dei tipi già definiti per l'esportazione |
| col_start | colonna di inizio dei dati; il campo non è obbligatorio, ma se non presente è obbligatorio che sia presente l'opzione SQL |
| size | * | numero di colonne occupate dal campo nel file ascii; il campo non è obbligatorio, ma se non presente deve essere presente la clausola SQL. Se tipo = S, in luogo delle dimensioni del campo è possibile specificare un asterisco, ad indicare che il campo ha dimensione variabile. Per ogni campo marcato dall'asterisco il programma legge una riga di dati supplementare rispetto a quella base, e l'associazione tra campo e riga viene realizzata in funzione dell'ordine di dichiarazione dei campi. |
| SQL | al campo sarà assegnato il risultato del dell'istruzione SQL
specificata; è possibile referenziare il nome di altri campi della tabella purché indicati tra $$ e dichiarati prima del campo in trattamento; esempio: SQL=§select valore FROM pconti WHERE str_codice = $str_conto$§ |
| PK | indica che il campo fa parte della Primary Key per la table; una table dovrebbe sempre avere una PK quantomeno per la verifica dell'esistenza o meno del record che si sta caricando; qualora una table sia priva di PK non sarà eseguito alcun controllo di esistenza |
| FK:table | indica
che il valore campo referenzia un corrispondente valore presente sulla
master table indicata. Il nome usato non è quello della tabella fisica (TABLE_NAME)
ma quello simbolico (TABLE_START). Se il valore sulla master table viene modificato dalla procedura di importazione (perché, ad esempio, si tratta di un campo da generare come AUTOINCREMENT), il valore sulla tabella accessoria sarà automaticamente e corrispondentemente modificato. In caso di tabelle con primary key composta da più campi, l'ordine di riferimento è strettamente posizionale. E' perciò rigorosamente necessario inserire i campi della foreign key sulla detail table esattamente nello stesso ordine dei campi della primary key sulla master table |
| AUTOINCREMENT | il valore del campo sarà generato al momento dell'importazione in modo da garantirne l'univocità; si utilizza soprattutto (o meglio: esclusivamente) per le primary keys prive di valore intrinseco; l'opzione AUTOINCREMENT è incompatibile con l'opzione SQL |
| REM | REMarks, ovvero commento, ovvero il campo viene trattato sotto tutti gli aspetti ma non viene importato nel database di destinazione |
| commenti | informazioni sul significato o sulla struttura del campo |
SEZIONE DATI
La sezione dati può avere due formati:
- può contenere una (o più) righe di dati per ogni record da importare
- DATAFILE=nomefilespecifica che i dati si trovano su nomefile; può contenere variabili di ambiente del sistema operativo (esempio: %ProgramFilesDir%, oppure %TEMP%).
In entrambi i casi i dati devono avere lo stesso formato e seguire le seguenti regole:
- ogni riga contiene un record a lunghezza fissa e chiuso da un asterisco; fa eccezione il caso in cui si abbiano dati a lunghezza variabile, ciascuno dei quali occupa una riga supplementare ed ha lunghezza, appunto, variabile;
- eventuali sequenza di 'acapo' (CR/LF, ascii #013#010) devono essere codificate come \| (ascii #092#124);
- eventuali caratteri speciali (non alfanumerici) vengono codificati con la sequenza \nn dove nn è il codice esadecimale ASCII del carattere (numero su due posizioni); il back slash da solo viene codificato come \\ (doppio backslash);
- il separatore decimale per i campi numerici è la virgola;
- non devono essere indicati separatori delle migliaia;
- i valori NULL sono indicati dal descrittore (NULL) parentesi comprese; ne consegue che i campi che possono contenere valori NULL dovranno essere larghi almeno 6 colonne (per contenere il descrittore speciale).
OS_EXECUTE_BEFORE/OS_EXECUTE_AFTER (esecuzione comando Sistema Operativo)
Durante l'esecuzione dello script di esportazione è possibile eseguire dei
comandi batch (formato BAT o CMD) usando la sintassi: OS_EXECUTE_xxxxx=comando.
BEFORE fa eseguire il comando prima dell'esportazione, AFTER lo fa eseguire DOPO
l'esportazione.
Se il comando è definito sull'intestazione di una specifica
tabella, i comandi sono eseguiti rispettivamente prima o dopo l'esportazione
della tabella.
Il comando può contenere variabili di ambiente del sistema operativo (esempio:
%ProgramFilesDir%, oppure %TEMP%).
MESSAGEBOX
Per emettere un messaggio è possibile usare la sintassi (vedi MESSAGEBOX esportazione per ulteriori dettagli sintattici)
MESSAGEBOX=TEXT=testo;CAPTION=titolo[;FLAGS=numero]
ABORT
Interrompe l'importazione emettendo un messaggio di errore.
ABORT=TEXT=testo;CAPTION=titolo
USE_STORED_PROCEDURE
Valori ammessi: ON, OFF. Default: ON.
Se l'opzione è attiva il programma carica tutti i comandi di esportazione su una table transitoria (SQL_batch) e quindi una
stored procedure (exec_SQL_batch()) per eseguirli. Questa modalità è utile in certi casi particolari per trattare dati che altrimenti creerebbero problemi di esecuzione.
DBS
DBS, ovvero DataBase System, indica il database su cui si sta operando.
I possibili valori sono ASA (Adaptive Server Anywhere), SQLSERVER, OTHER.
Il default è ASA.
UPDATE_VIDEO_FREQUENCY
UPDATE_VIDEO_FREQUENCY=numero di records
Indica ogni quanti records il programma deve aggiornare il video durante la fase di importazione. Default = 7.
MACRO PREDEFINITE
In tutti i punti del file da importare è possibile usare una delle seguenti macro predefinite. Risulta particolarmente comodo utilizzare queste macro sulle clausole IMPORT_OPTIONS del file che definisce il formato di esportazione.
| macro | disponibile a partire dalla versione | valore sostituito |
|---|---|---|
| @@datetime_exportation | 1.02 | timestamp (YYYY-MM-DD HH:MM:SS) del momento in cui è avvenuta l'esportazione |
| @@computer_name | 1.02 | computer che esegue l'importazione |
| @@ | 1.02 | nome dell'operatore che esegue l'importazione |
Pagina base del manuale di JOLLY ESPORTAZIONE in formato JASCII