Modelli di import/export: allegato tecnico 

Il programma di import e le azioni associate

L'import e l'export di oggetto è realizzato tramite un programma creato partendo dalla compilazione del modello. Questo programma temporaneo ha come nome WWINNNNNN o WWENNNNNN (dove NNNNNN è un numero progressivo).

Nel caso dell'export, il programma estrae solo dei dati (filtrandoli secondo le abilitazioni degli utenti). Nel caso dell'import, il programma contiene le istruzioni di decodifica del flusso di dati e richiama le diverse funzioni collegate all'oggetto da importare, emulandone in qualche modo l'inserimento. Così, le etichette standard dei programmi SUBXXX e SPEXXX, che permettono di gestire gli Oggetti, sono richiamate normalmente.

Ma si richiamano inoltre delle etichette supplementari specifiche all'import, definite nel programma IMPXXX, se questo esiste (e nel programma specifico definito nel modello, che permette di elaborare i casi specifici). Le cronologie che seguono descrivono precisamente il modo in cui si svolge un import nel caso dei diversi tipi di oggetto (per maggiori dettagli, si farà riferimento alla documentazione sulla gestione di oggetto). Nel riquadro che segue, le azioni dell'Oggetto standard sono indicate in corsivo, quelle legate all'import in grassetto.

La colonna Azioni indica delle azioni realizzate subito dopo l'operazione indicata nel contesto: per esempio, nel caso dell'oggetto semplice, se si guarda il riquadro 8.2:

  • vengono realizzate le azioni VERIF_MOD e IMP_VERIF_MOD
  • si locca il record, poi si realizzano le azioni AVANT_MODFIC e IMP_AVANT_MODFIC
  • si alimentano le variabili della classe [F], poi si realizzano le azioni INIMOD e IMP_INIMOD.
  • si riscrive, poi si realizzano le azioni MODIF e IMP_MODIF.
  • si esegue l'operazione di fine transazione (Commit), poi si realizzano le azioni APRES_MOD e IMP_APRES_MOD.
  • si sblocca, poi si eseguono le azioni DEVERROU e IMP_DEVERROU.

Si noti che le azioni contenute nel programma specifico di import sono effettuate prima di quelle del programma standard di import; se il programma specifico di import alimenta la variabile GPE a 1, l'azione del programma standard di import viene inibita.

Oggetto semplice

Sequenza

Contesto

Azioni

1.1

Prima della creazione del programma di import:

L’Openo che permette di scrivere il programma temporaneo di import (con nome assegnato dalla variabile IMPTRT) non è ancora avvenuta.

E' possibile cambiare il nome delle videate utilizzate (riquadro NOMMSK, il numero di videate è dato da NBMASK)

IMP_COMPILE

1.2

Dopo la creazione del programma di import:

Il programma temporaneo di import (con nome assegnato dalla variabile IMPTRT) è sempre aperto da Openo: è quindi possibile aggiungervi (con Wrseq) delle istruzioni complementari.

Il programma sarà compilato dopo questa azione, dopodiché la procedura di import vera e propria comincerà.

IMP_TRTSUP

2

Inizio programma

OUVREIMP_OUVRE

3

Lettura del record di testata

Trasferimento nella classe [F]

L'azione AP_IMPORT è richiamata dopo il caricamento delle variabili decodificate di ciascun blocco (il livello di nidificazione è conosciuto dalla variabile SEPNUM (da 1 a 8), l'abbreviazione della tabella principale in corso di elaborazione dalla variabile IMPABR

 

 

AP_IMPORT

4

Verifica dell'autorizzazione di creare o

modificare:

SETBOUT IMP_SETBOUT (*)

5

Test di esistenza dell'oggetto:

 

5.1

Se l'oggetto non esiste:

SETBOUT IMP_SETBOUT
RAZCREIMP_RAZCRE

5.2

Se l'oggetto esiste:

Poi caricamento della scheda

Riverifica delle autorizzazioni

VERROU IMP_VERROU

LIENSIMP_LIENS

SETBOUT IMP_SETBOUT

AVANT_MOD IMP_AVANT_MOD

6.1

Simulazione di inserimento delle videate associate

alla tabella principale

IMPORT

IMP_DEFTRT (*)

6.2

Per ciascun campo della videata:

Esecuzione delle azioni avant_zone

avant_saisie

init

Se il campo è inserito:

Per sapere se il campo è in un riquadro:

(questa azione assegna nolign se necessario)

Se OK=1, trasferimento dalla classe [F]

Del campo di nome identico

Esecuzione delle azioni après_zone

E all'occorrenza après_modif

 

 

 

 

 

 

IMP_ZONE

7.1

Lettura di un record del file secondario (ciò avviene per tutti i livelli di record secondari)

 

IMPORT

IMP_TAB

 

AP_IMPORT

 

7.2

Simulazione delle videata associate.

Nel caso di un riquadro, la variabile

nolign viene utilizzata.

Di default, viene aggiunta una riga

( nolign = 0)

 

8

Registrazione dell'oggetto

 

8.1

Caso della creazione:

Inizio transazione

Scrittura

Fine transazione

 

 

In caso di Rollback:

VERIF_CRE IMP_VERIF_CRE

INICREIMP_INICRE

CREATION IMP_CREATION

APRES_CRE IMP_APRES_CRE

 

AB_CREATION

IMP_AB_CREATION

8.2

Caso della modifica:

Inizio transazione

Lock del record

Assegnazione delle variabili [F]

Riscrittura

Fine transazione

 

 

In caso di Rollback:

Sblocco

VERIF_MOD IMP_VERIF_MOD

AVANT_MODFIC

IMP_AVANT_MODFIC

INIMODIMP_INIMOD

MODIF IMP_MODIF (*)

APRES_MOD IMP_APRES_MOD

 

AB_MODIF IMP_AB_MODIF

DEVERROU IMP_DEVERROU

9

Fine programma:

FERME IMP_FERME

(*) Le azioni MODIF et IMP_MODIF sono utilizzate in principio per gestire la registrazione delle righe (MODIF è utilizzato in standard dalla gestione di oggetto, IMP_MODIF permette di gestire delle azioni supplementari). L'azione IMP_DEFTRT permette di riassegnare, se necessario, la variabile TRTMSK, che definisce il nome del programma automatico definito nel dizionario delle videate.

L’azione IMP_SETBOUT è utilizzata per completare le opzioni di gestione dell'oggetto: è possibile che si debba fare una Call VIREBOUT in import per vietare ad esempio la creazione, ed agire generalmente sulla variabile CHAINE che contiene tutte le opzioni.

Oggetto combinato

Sequenza

Contesto

Azioni

1.1

Prima della creazione del programma di import:

L’Openo che permette di scrivere il programma temporaneo di import (con nome assegnato dalla variabile IMPTRT) non è ancora avvenuta.

E' possibile cambiare il nome delle videate utilizzate (riquadro NOMMSK, il numero di videate è dato da NBMASK)

IMP_COMPILE

1.2

Dopo la creazione del programma di import:

Il programma temporaneo di import (con nome assegnato dalla variabile IMPTRT) è sempre aperto da Openo: è quindi possibile aggiungervi (con Wrseq) delle istruzioni complementari.

Il programma sarà compilato dopo questa azione, dopodiché la procedura di import vera e propria comincerà.

IMP_TRTSUP

1.3

Inizio programma

OUVREIMP_OUVRE

2

Lettura del file di import e trasferimento nella classe [F]

L'azione AP_IMPORT è richiamata dopo il caricamento delle variabili decodificate di ciascun blocco (il livello di nidificazione è conosciuto dalla variabile SEPNUM (da 1 a 8), l'abbreviazione della tabella principale in corso di elaborazione dalla variabile IMPABR

AP_IMPORT

3

Test di esistenza dell'oggetto (numero righe >0)

 

3.1

Se l'oggetto esiste:

VERROUIMP_VERROU

3.2

Verifica dell'autorizzazione a creare o

a modificare:

SETBOUTIMP_SETBOUT

3.3

Se l'oggetto non esiste:

SETBOUTIMP_SETBOUT

RAZCREIMP_RAZCRE

4.1

Ciclo di lettura dei record

Record collegati a ciascuna riga:

Trasferimento nella classe [F]

Fine ciclo di lettura

Record collegati al termine del ciclo:

FILTRE

LIENS0IMP_LIENS0

LIENSIMP_LIENS

 

LIENS2IMP_LIENS2

5.1

Simulazione di inserimento delle videate associate

alla tabella principale

IMPORT

IMP_DEFTRT (*)

5.2

Per ciascun campo della videata:

Esecuzione delle azioni avant_zone

avant_saisie

init

Se il campo è inserito:

Se OK=1, trasferimento dalla classe [F] del campo con nome uguale

Esecuzione delle azioni après_zonee all'occorrenza après_modif

 

 

 

 

IMP_ZONE

6.1

Lettura di un record del file secondario [F]

L'azione AP_IMPORT è richiamata dopo il caricamento delle variabili decodificate di ciascun blocco (il livello di nidificazione è conosciuto dalla variabile SEPNUM (da 1 a 8), l'abbreviazione della tabella principale in corso di elaborazione dalla variabile IMPABR

IMPORT

 

AP_IMPORT

6.2

Simulazione delle videata associate.

Nel caso di un riquadro, la variabilenolign è utilizzata.

Di default, viene aggiunta una riga

( nolign = 0)

 

7

Registrazione dell'oggetto

 

7.1

Caso della creazione:

 

Inizio transazione

Per ciascuna riga:

Scrittura

 

Al termine della scrittura delle righe:

Transazione terminata:

VERIF_CRE IMP_VERIF_CRE

DEBUT_CRE IMP_DEBUT_CRE

INICREIMP_INICRE

CREATIONIMP_CREATION

MODIFIMP_MODIF

APRES_CREIMP_APRES_CRE

7.2

Caso della modifica:

  Inizio transazione

Cancellazione delle righe

Ciclo sulle righe:

 

Creazione riga

Al termine del ciclo

Fine transazione

VERIF_MOD IMP_VERIF_MOD

DEBUT_MOD

IMP_DEBUT_MOD

FILTRE

INICREIMP_INICRE

CREATIONIMP_CREATION

MODIFIMP_MODIF

APRES_MODIMP_APRES_MOD DEVERROUIMP_DEVERROU

8

Fine programma:

FERME IMP_FERME

 

Oggetto riquadro

Sequenza

Contesto

Azioni

1.1

Prima della creazione del programma di import:

L’Openo che permette di scrivere il programma temporaneo di import (con nome assegnato dalla variabile IMPTRT) non è ancora avvenuta.

E' possibile cambiare il nome delle videate utilizzate (riquadro NOMMSK, il numero di videate è dato da NBMASK)

IMP_COMPILE

1.2

Dopo la creazione del programma di import:

Il programma temporaneo di import (con nome assegnato dalla variabile IMPTRT) è sempre aperto da Openo: è quindi possibile aggiungervi (con Wrseq) delle istruzioni complementari.

Il programma sarà compilato dopo questa azione, dopodiché la procedura di import vera e propria comincerà.

IMP_TRTSUP

1.3

Inizio programma

OUVREIMP_OUVRE

2

Lettura dei dati del file e caricamento della classe [F]

L'azione AP_IMPORT è richiamata dopo il caricamento delle variabili decodificate di ciascun blocco (il livello di nidificazione è conosciuto dalla variabile SEPNUM (da 1 a 8), l'abbreviazione della tabella principale in corso di elaborazione dalla variabile IMPABR

 

AP_IMPORT

3

Se l'oggetto esiste:

VERROUIMP_VERROU

4

Lock della tabella

Inizio lettura:

Ciclo di lettura dei record

Al termine della lettura

FILTRE

LIENS0IMP_LIENS0

LIENSIMP_LIENS

LIENS2IMP_LIENS2

5

Verifica dell'autorizzazione a modificare:

SETBOUTIMP_SETBOUT

6.1

Simulazione di inserimento delle videate associate

alla tabella principale

IMPORT

IMP_DEFTRT (*)

6.2

Per ciascun campo della videata:

Esecuzione delle azioni avant_zone

avant_saisie

init

Se il campo è inserito:

Se OK=1, trasferimento dalla classe [F] del campo con nome uguale

Esecuzione delle azioni après_zonee all'occorrenza après_modif

 

 

 

 

IMP_ZONE

7.1

Lettura di un record del file secondario

IMPORT

7.2

Simulazione delle videate associate.

una riga viene aggiuta al riquadro (nolign è gestito dalla gestione oggetto)

 

8

Registrazione dell'oggetto

 

8.1

Si è sempre in creazione

Inizio transazione

poi blocco tabella

se OK<>0 in seguito a MOD_IMPORT,

la transazione prosegue:

Si cancellano tutti i record esistenti

Per ogni riga:

Scrittura

Al termine della scrittura delle righe:

Fine transazione

VERIF_MOD IMP_VERIF_MOD

MOD_IMPORT

 

FILTRE

INICREIMP_INICRE

CREATIONIMP_CREATION

MODIFIMP_MODIF

9

Quando la transazione è riuscita

APRES_MODIMP_APRES_MOD

10

Fine programma:

FERMEIMP_FERME

 

Le azioni del programma IMPxxx

Tutte le azioni IMPxxx hanno lo stesso contesto di quelle di SUBxxx e vengono richiamate dopo.

Le azioni seguenti sono particolari.

l’azione IMPORT

L'azione IMPORT è richiamata dopo ciascuna lettura di record.

La variabile IMPFIC contiene l'abbreviazione del file importato. La classe corrispondente è disponibile (per le informazioni effettivamente importate).

Nel caso di un riquadro, la variabile nolign è inizializzata a 0, e sarà utilizzata in uscita per sapere quale riga viene inserita. Se nolign è lasciata a zero, sarà creata una nuova riga.

l’azione IMP_TAB

L'azione IMPORT è utilizzata per gestire i campi di una tabella secondaria raggruppati in un riquadro (la pagina 3 dell'oggetto definisce a questo scopo le tabelle secondarie, le videate e le variabili di fondo riquadro corrispondenti). Questo permette di distinguere i campi non indicizzati che devono essere posizionati in un riquadro degli altri campi. Questa azione è utilizzata solo per gli import di oggetto di tipo normale.

Azione IMP_ZONE

L'azione IMP_ZONE è richiamata al posto dell'inserimento di un campo, essa permette di recuperare un valore in una videata che nel file avrebbe un nome diverso (es: caso dei campi dimensionati in una tabella che corrisponde a più colonne di un riquadro):

  • La variabile IMPFIC contiene l’abbreviazione del file che ha provocato l'inserimento.
  • La variabile IMPMSK contiene il nome della videata in corso di inserimento.
  • La variabile IMPZON contiene il nome del campo in corso di inserimento.
  • La variabile IMPMOD, preposizionata a 0 permette di attivare l'azione di après_modif.
  • La variabile OK, inizializzata a 1 permette o meno di attivare l'azione standard.

Azione MOD_IMPORT

L’azione MOD_IMPORT serve solo in import di un oggetto riquadro (per vietare eventualmente questo import).

Il programma di import specifico

Questo programma di import bypassa (in generale per ragioni di prestazioni) la gestione standard d'oggetto e include solo un numero limitato di label richiamate da Gosub dalla funzione di import. Queste label sono definite qui di seguito:

Label

Contesto

$OUVRE

All'inizio dell'import, questa label permette di dichiarare videate, tabelle e variabili necessarie.

$RAZCRE

All'inizio della lettura (si sta per leggere un nuovo record). Permette di azzerare le variabili che saranno in seguito alimentate dall'import.

$SAIMSK

Quando un gruppo di dati è stato letto. La variabile IMPFIC permette di conoscere l'abbreviazione della tabella il cui contenuto è stato letto. La classe [F] che corrisponde a questa tabella è allora alimentata ed è possibile effettuare dei trasferimenti di dati verso delle videate (quando si lavora con degli oggetti di tipo testata / riga, in generale è in una videata che si memorizzano temporaneamente i dati).

$VALID

Fine della lettura dei dati: questa label permette di fare i controlli e creare o modificare i dati nel database.

Si consiglia di realizzare questa modalità di import solo se si pongono dei particolari problemi di prestazioni. Infatti, anche se è più pesante, l'import "standard" d'oggetto permette di ottenere un controllo automatico includendo tutto ciò che è descritto nella logica d'oggetto, mentre il programma di import specifico necessita di ricodificare tutto a mano, richiamando eventualmente dei componenti esistenti.

File di trascodifica

Principio della trascodifica

Nel modello di import o di un export, ADONIX X3 riceve un flusso di dati in in set di caratteri che non è obbligatoriamente il set di caratteri interno (corrispondente al set di caratteri WE8ISO8951P1 in oracle). E' necessario essere in grado di trascodificarlo. Attenzione, si parlerà in questa documentazione solo di trascodifica di caratteri memorizzati su un byte corrispondenti in generale a caratteri accentati o specifici di alcune lingue occidentali. Questi caratteri sono normalmente codificati in un byte con valori compresi tra 160 e 250. Qui di seguito, si troveranno le corrispondenze tra questi caratteri ed i codici ascii del set standard utilizzati da ADONIX X3 (visualizzati con un font di tipo Arial).

Byte

0

1

2

3

4

5

6

7

8

9

16…

 

¡

¢

£

¤

¥

¦

§

¨

©

17…

ª

«

¬

 

®

¯

°

±

²

³

18…

 ´

µ

·

¸

¹

º

»

¼

½

19…

¾

¿

À

A

Â

Ã

Ä

Å

Æ

Ç

20…

 È

É

Ê

Ë

Ì

Í

Î

Ï

Ð

Ñ

21…

Ò

Ó

Ô

Õ

Ö

×

Ø

Ù

Ú

Û

22…

Ü

Ý

Þ

ß

à

á

â

ã

ä

å

23…

æ

ç

è

é

ê

ë

ì

í

î

ï

24…

 ð

ñ

ò

ó

ô

õ 

ö

÷

ø

ù 

25…

 ú

 û

ü

ý

þ

ÿ 

 

 

 

 

Ciò si fa per mezzo del campo Set di caratteri nel riquadro di trascodifica. Il campo in questione assume dei valori definiti dal menù locale 9. Questo menù locale non è parametrizzabile di default, ma è possibile aggiungervi dei valori in sviluppo, per gestire nuovi set di caratteri esterni.

A ciascun valore di questo menù locale corrisponde un file esterno, installato sul server, che definisce le trascodifiche da realizzare. Questo file si trova nella directory SYS del dossier X3, e ha come nome TRANS#.cnv, dove # corrisponde al numero del menù locale (1, 2, 3…). Il file TRANS0.cnv contiene dei commenti che spiegano (in inglese) il modo di procedere:

  • Si definiscono innanzitutto due righe sulle quali si indica:

adonix="stringa1"
output="stringa2"

stringa1 e stringa2 sono prefissi su 3 caratteri che definiscono il codice del set che si vuole definire. Ad esempio, si potrà usare ado per la stringa 1, e set per il secondo set di caratteri.

  • In seguito, si definiscono innanzitutto delle righe per definire ciascun carattere attribuendogli una mnemonica identica (che sarà prefissata da stringa1 o stringa2), seguito da un segno di uguaglianza e dal codice del carattere. Ad esempio, se si definisce con eacuta la e accento acuto, immaginiamo che questo carattere sia trascodificato nel set di caratteri finale set con il codice decimale 238 (è codificato 233 nel set ado). Verranno allora scritte le due righe seguenti:

adoeacuta="238"
seteacuta="233"

E' importante osservare che:

  • i doppi apici non sono obbligatori (si sarebbe potuto scrivere adoeacuta=238).
  • i codici possono anche essere forniti in formato ottale sotto forma di \nnn, ed in formato esadecimale sotto forma di Hxx.
  • l'ordine in cui le righe sono presentate ha poca importanza (si può innanzitutto definire la totalità dei caratteri di un set, poi quella del set seguente, oppure abbinare i caratteri due a due, o usare qualsiasi altro ordine).
  • i caratteri non descritti (o descritti in un set senza esserlo nell'altro) non saranno trascodificati.
  • possono essere liberamente inserite o aggiunte delle righe di commento, purchè siano precedute dal carattere #.

Esempio di file: TRANS0.cnv

Si troverà qui di seguito il contenuto del file TRANS0.cnv, che spiega in inglese come usarlo:

#
########################################################################
#
# trans0.cnv
#
# Transcodification file used for ADONIX X3 import/export
#
# Each line (except the comments prefixed by # ) must have the following format
#
# adoxxxxx = value1 or extxxxxx = value2
#
# (ado for adonix internal code, ext for "external" file code
#
# xxxxx is an identifier used to associate external & internal code together
#

# values can be defined in following formats :
#
# nnn or "nnn"         value in decimal
# \nnn or "\nnn"       value in octal
# Hnnn or "Hnnn"       value in hexadecimal
#
# Author : Bertrand YVINEC   
# Translated by Dominique BOPP
#
# Copyright (c) ADONIX 1992-2001
#
########################################################################
#
# Identifier definition (default is ado and ext)
#
adonix = "iso"
output = "ibm"

Esempio di file: TRANS2.cnv

Questo file permette di trascodificare nel set IBM PC. Il file è stato ripulito dalla maggior parte delle righe di commento.

#
########################################################################
# trans2.cnv
# Copyright (c) ADONIX 1992-2001
########################################################################
adonix = "iso"
output = "ibm"
#
# ISO code first
isoagr="\340"    # a grave
isoeai="\351"    # e acute
isoegr="\350"    # e grave
isocce="\347"    # c cedilla
isougr="\371"    # u grave
isodeg="\260"    # degree
isoali="\247"    # alinea
isoaci="\342"    # a circumflex
isoeci="\352"    # e circumflex
isoici="\356"    # i circumflex
isooci="\364"    # o circumflex
isouci="\373"    # u circumflex
isoatr="\344"    # a dieresis
isoetr="\353"    # e dieresis
isoitr="\357"    # i dieresis
isootr="\366"    # o dieresis
isoutr="\374"    # u dieresis
isopou="\243"    # pound
#
# Ensuite en code PC
ibmagr="\205"    # a grave
ibmeai="\202"    # e acute
ibmegr="\212"    # e grave
ibmcce="\207"    # c cedilla
ibmugr="\227"    # u grave
ibmdeg="\370"    # degree
ibmali="\365"    # alinea (CP 850)
ibmaci="\203"    # a circumflex
ibmeci="\210"    # e circumflex
ibmici="\214"    # i circumflex
ibmoci="\223"    # o circumflex
ibmuci="\226"    # u circumflex
ibmatr="\204"    # a dieresis
ibmetr="\211"    # e dieresis
ibmitr="\213"    # i dieresis
ibmotr="\224"    # o dieresis
ibmutr="\201"    # u dieresis
ibmpou="\234"    # pound

Import silenziosi

Principio della chiamata

Se si desidera attivare direttamente un import in un programma, è possibile procedere inserendo le seguenti righe:

If !GSERVEUR
 
   Call OUVRE_TRACE(TIT) From LECFIC
Endif
Call IMPORTSIL([L]COD_MODELE,[L]NOM_FICHIER)from GIMPOBJ
If !GSERVEUR
    Call FERME_TRACE From LECFIC
Endif

 Dove

  • [L]COD_MODELE=Variabile contenente il codice del modello di import
  • [L]NOM_FICHIER=Variabile contenente il nome completo del file da importare

Variabili interessate

Le variabili passate in argomento sono le seguenti:

  • [L]COD_MODELE=Variabile contenente il codice del modello di import
  • [L]NOM_FICHIER=Variabile contenente il nome completo del file da importare

Lo stato di fine dell'import è contenuto nel campo [M:IMP2]STAT
E' possibile avere il testo esteso del messaggio legato all'errore chiamando il seguente sotto-programma:

Call ERR_IMPORT([M:IMP2]STAT,MESSAGE) From GIMPOBJ