XMLOUT
From Pickwiki
Jump to navigationJump to search================= Main Program ===================
*=========================================================================
*= Domaine : OUTILS
*= Programme : UT.XMLOUT
*= Version 7.4.1.1
*= Date de mise à jour : 15/05/03
*= Date de génération : 15/05/03
*=========================================================================
*= L'instruction suivante permet de connaître le numéro de version du
*= programme compilé sous unix par la commande : what _[[NomProgramme]]
*=
[[NumeroDeVersionDuProgramme]] = "@(#)[UT.XMLOUT 7.4.1.1 15/05/03]"
*=
*=========================================================================
*-- Libellé : Extraction d'un fichier en XML "simple"
*-- Date : 15/05/03
*-- Référence :
*-- Objet : Extraction sous forme de fichier XML du contenu d'un
*-- fichier Unidata.
*-- Si on ne précise rien le fichier se trouve restitué
*-- sous forme arborescente FICHIER[[/ENREG/ATTRIBUTn/VALEUR/SSV]].
*-- Si on veut utiliser le dictionnaire alors les balises ATTRIBUTn
*-- sont remplacées par le plus long nom de l'attribut dans le
*-- dictionnaire s'il a été défini et les valeurs sont converties
*-- à l'aide du format donné dans le dictionnaire (OCONV).
*-- Formats d'appel :
*-- UT.XMLOUT <fichier> <dict> <critères>
*-- Où : fichier => nom du fichier que l'on veut transformer
*-- dict => utilisation du (D)ictionnaire ou non (.)
*-- critères=> ordres de sélection Uniquery pour limiter
*-- le traitement (IF @ID = "TOTO" par exemple)
*-- (critères du SELECT uniquement)
*========================================================================
*
CODERR = 0 ; * Code d'erreur
LIBERR = "" ; * Libellé de l'erreur
PARAM="" ; * Tableau de paramètres pour TTCAFF03
PARAM<1,1>="OUTILS" ; * Domaine OUTILS
PARAM<2,1>="OUTILS" ; * Domaine OUTILS
*ENR.INPUT = "" ; * Enregistrement en entree
DIM ENR.KSYS(100); MAT ENR.KSYS = "" ; * Enregistrement de K-SYS
NODR = 0 ; * N° de la DR
SFILES = '' ; * Contient le nom des files utilisées.
NLASTFILE = 2 ; * N° de la dernière file
INPUTFILE = "" ; * Nom du fichier en entree
NB.CLEINPUT = 0 ; * Nombre de cles dans le fichier d'entree
NB.ATTRIBUTES = 0 ; * Nombre d'attributs pour un article
NB.VALUES = 0 ; * Nombre de valeurs dans l'attribut
NB.SSVALUES = 0 ; * Nombre de sous-valeurs d'une valeur
ATTRIB = "" ; * Variable intermédiaire de stockage d'un attribut
PHRASE = "" ; * Ordre d'execution du programme
EXECUTION = "" ; * Ordre d'execution de la selection du fichier
DICT.ARRAY = "" ; * Tableau dynaique de stockage des libellés et formats d'attributs
CRITERES = "" ; * Critères de sélection des enregistrements
DETAIL = "" ; * Utilisation du DICT (D) ou non (vide)
MAXPOS = 0 ; * Dernier attribut déclaré dans le dictionnaire
*
*---- Récupération de l'ordre d'execution
PHRASE = @SENTENCE
PHRASE = TRIM(PHRASE," ","B")
*
PARAM<3,1>=FIELD(SYSTEM(40),"/",DCOUNT(SYSTEM(40),"/")) ; * Nom du programme
PARAM<3,1>=PARAM<3,1>[2,LEN(PARAM<3,1>)]
*
*---- Récupération du nom de fichier potentiel et des paramètres
I=DCOUNT(PHRASE," ")
IF FIELD(UPCASE(PHRASE)," ",1) # "RUN" THEN
INPUTFILE = FIELD(PHRASE," ",2)
DETAIL = UPCASE(FIELD(PHRASE," ",3))
FOR J=4 TO I
CRITERES = CRITERES:' ':FIELD(PHRASE," ",J)
NEXT J
END ELSE
INPUTFILE = FIELD(PHRASE," ",4)
DETAIL = UPCASE(FIELD(PHRASE," ",5))
FOR J=6 TO I
CRITERES = CRITERES:' ':FIELD(PHRASE," ",J)
NEXT J
END
*
IF @USER.TYPE = 0 THEN
*--------- Mise en place écran si en interactif
PRINT @(-1)
PRINT @(4,2):"EXTRACTION SIMPLE DU CONTENU D'UN FICHIER UNIDATA EN XML"
PRINT @(4,3):"========================================================"
PRINT @(4,6):"-------------------------------------------------------------------------"
PRINT @(4,13):"-------------------------------------------------------------------------"
PARAM<6,1>=1 ; * Affichage écran souhaité
*
IF INPUTFILE = "" THEN GOSUB GETFILE
END
*
IF @USER.TYPE <> 0 THEN PARAM<6,1>=0 ; * Pas d'affichage écran
*
*-- Affichage du fichier choisi --
IF INPUTFILE = "" THEN
GOTO FIN ; * Aucun fichier choisi ... On se casse !
END ELSE
IF @USER.TYPE = 0 THEN
PRINT @(5,7):"Fichier sélectionné : ":INPUTFILE
IF DETAIL = "D" THEN PRINT @(5,8):"Utilisation du dictionnaire demandée "
IF CRITERES <> "" THEN PRINT @(5,9):"Sélection des données par : ":CRITERES
END ELSE
PRINT TIMEDATE():" Début d'extraction en XML de ":INPUTFILE
IF DETAIL = "D" THEN PRINT " Utilisation du dictionnaire demandee "
IF CRITERES <> "" THEN PRINT " Selection des donnees par : ":CRITERES
END
END
*
*--------- Initialisation de la file de sortie
SFILES<1> = ''
SFILES<NLASTFILE> = INPUTFILE:'.xml'
DATFILN = NLASTFILE-1
CALL SLIMPRIMANTE(SFILES)
*- Modification car SLIMPRIMANTE ne permet pas de paramétrer le nombre de colonnes or nous en
*- avons besoin de plus de 132
EXECUTE 'SETPTR ':DATFILN:',1024,,,,3,BANNER UNIQUE ':SFILES<NLASTFILE>:',NOHEAD,BRIEF'
*
*--------- Ouverture des fichiers
CODERR = 0
GOSUB OPENFICH
IF CODERR # 0 THEN
PARAM<4,1>=LIBERR
PARAM<5,1>=CODERR
CALL TTCAFF03 (PARAM,CODERR)
GOTO FIN
END
*
*--------- Allons chercher le dictionnaire !
CODERR = 0
IF DETAIL = "D" THEN
GOSUB GETDICT
IF CODERR # 0 THEN
PARAM<4,1>=LIBERR
PARAM<5,1>=CODERR
CALL TTCAFF03 (PARAM,CODERR)
GOTO FIN
END
END
*--- Construction de la commande de SELECT et execution
*-
IF @USER.TYPE = 0 THEN PRINT @(2,22):@(-5):" -> Traitement des enregistrements de ":INPUTFILE:" en cours <-":@(-6):@(-4)
*
EXECUTION = 'SSELECT ':INPUTFILE
IF CRITERES <> "" THEN EXECUTION = EXECUTION :' ':CRITERES
EXECUTE EXECUTION CAPTURING V1
*
*-- Traitement de l'execution du SELECT
*
BEGIN CASE
CASE (@SYSTEM.RETURN.CODE > 0) ; * On a trouvé des enregistrements
*
READSELECT CLEINPUT THEN
*
NB.CLEINPUT = DCOUNT(CLEINPUT,@AM)
IF @USER.TYPE = 0 THEN PRINT @(2,22):@(-4)
IF @USER.TYPE = 0 THEN
PRINT @(2,22):"-> ":NB.CLEINPUT:" enregistrement sélectionnés - ":@(-5):"Traitement en cours":@(-6):" <-"
IF NB.CLEINPUT >= 10 THEN
PRINT @(34,17):"|__________|"
PRINT @(34,18):"| |":@(35,18):
END
END
FOR K=1 TO NB.CLEINPUT ; * Boucle sur les enregistrements sélectionnés
*-- Affichage sympa manière ...
IF (@USER.TYPE = 0 AND NB.CLEINPUT >= 10) THEN
IF MOD(K,INT(NB.CLEINPUT/10)) = 0 THEN PRINT @(35+INT(K/(NB.CLEINPUT/10)),18):@(-13):".":@(-14):
END
*
*---- Lecture de INPUTFILE pour la clée donnée
READ ENR.INPUT FROM FINPUT,CLEINPUT<K> THEN
IF K = 1 THEN ; *-- Ecriture de l'entete du fichier XML
PRINT ON DATFILN '<?xml version ="1.0" encoding="ISO-8859-1" ?>'
*
*-- Quelques remarques d'ordre général et sur le traitement
*
PRINT ON DATFILN '<!-- -->'
PRINT ON DATFILN '<!-- *** Ce fichier peut contenir des données confidentielles propriété du CNRS *** -->'
PRINT ON DATFILN '<!-- -->'
PRINT ON DATFILN '<!-- Extrait automatiquement de la GCF par ':PARAM<3,1>:' -->'
IF CRITERES <> "" THEN
PRINT ON DATFILN '<!-- avec comme critères de sélection ':CRITERES:' -->'
END
IF DETAIL = "D" THEN
PRINT ON DATFILN '<!-- -->'
PRINT ON DATFILN "<!-- Les valeurs ont été converties si nécessaire en utilisant l'attribut -->"
PRINT ON DATFILN "<!-- CONV et en utilisant les nom des attributs définis dans le -->"
PRINT ON DATFILN "<!-- dictionnaire. Si tous les attributs ne sont pas définis dans le -->"
PRINT ON DATFILN '<!-- dictionnaire le fichier XML risque de ne pas être valide à cause de -->'
PRINT ON DATFILN "<!-- l'élément ENREG de la DTD incorrectement représentatif des données -->"
PRINT ON DATFILN '<!-- réellement extraites. -->'
PRINT ON DATFILN '<!-- -->'
END
*-- On ecrit la DTD
PRINT ON DATFILN "<!DOCTYPE FICHIER ["
PRINT ON DATFILN "<!ELEMENT FICHIER (ENREG+)>"
PRINT ON DATFILN "<!ATTLIST FICHIER nom CDATA #REQUIRED"
PRINT ON DATFILN " delegation (1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|25|28|29) #REQUIRED"
PRINT ON DATFILN " nb.enreg CDATA #REQUIRED"
PRINT ON DATFILN " horodatage CDATA #IMPLIED>"
*
*-- On boucle sur les attributs pour préparer l'élément ENREG
PHRASE=""
FLAG=0
FOR DTD=1 TO MAXPOS
IF DETAIL="D" AND DICT.ARRAY<DTD,2,0><>"" THEN
IF LEN(PHRASE) + LEN(DICT.ARRAY<DTD,2,0>) > 1000 THEN ; * On va dépasser les 1024 caractères
IF FLAG=1 THEN
PRINT ON DATFILN " ":PHRASE[1,LEN(PHRASE)]
END ELSE
PRINT ON DATFILN "<!ELEMENT ENREG (":PHRASE[1,LEN(PHRASE)]
FLAG = 1
END
PHRASE=DICT.ARRAY<DTD,2,0>:"?,"
END ELSE
PHRASE=PHRASE:DICT.ARRAY<DTD,2,0>:"?,"
END
END ELSE
PHRASE=PHRASE:"ATTRIBUT":DTD:"?,"
END
NEXT DTD
IF MAXPOS > 0 THEN
IF FLAG=1 THEN
PRINT ON DATFILN " ":PHRASE[1,LEN(PHRASE)-1]:")>"
END ELSE
PRINT ON DATFILN "<!ELEMENT ENREG (":PHRASE[1,LEN(PHRASE)-1]:")>"
END
END ELSE
PRINT ON DATFILN "<!ELEMENT ENREG (#PCDATA)>"
END
*--
PRINT ON DATFILN "<!ATTLIST ENREG xml:space (default|preserve) 'preserve'"
PRINT ON DATFILN " ident CDATA #REQUIRED"
PRINT ON DATFILN " nb.attributs CDATA #REQUIRED>"
*-- On boucle de nouveau sur les attributs connus du dico pour déclarer chacun d'entre-eux
FOR DTD=1 TO MAXPOS
IF DETAIL="D" AND DICT.ARRAY<DTD,2,0><>"" THEN
PRINT ON DATFILN "<!ELEMENT ":DICT.ARRAY<DTD,2,0>:" (#PCDATA|VALEUR|SSV)*>"
PRINT ON DATFILN "<!ATTLIST ":DICT.ARRAY<DTD,2,0>:" multivaleurs CDATA #REQUIRED>"
END ELSE
PRINT ON DATFILN "<!ELEMENT ATTRIBUT":DTD:" (#PCDATA|VALEUR|SSV)*>"
PRINT ON DATFILN "<!ATTLIST ATTRIBUT":DTD:" multivaleurs CDATA #REQUIRED>"
END
NEXT DTD
*-- On finit avec les parties "fixes"
PRINT ON DATFILN "<!ELEMENT VALEUR (#PCDATA|SSV)*>"
PRINT ON DATFILN "<!ATTLIST VALEUR sous.valeurs CDATA #REQUIRED>"
PRINT ON DATFILN "<!ELEMENT SSV (#PCDATA)>"
PRINT ON DATFILN '<!-- Entités mises pour compatibilité selon recommandations [[W3C]] http://www.w3.org/TR/2000/REC-xml-20001006 -->'
PRINT ON DATFILN '<!ENTITY lt "<"> '
PRINT ON DATFILN '<!ENTITY gt ">"> '
PRINT ON DATFILN '<!ENTITY amp "&"> '
PRINT ON DATFILN '<!ENTITY apos "'"> '
PRINT ON DATFILN '<!ENTITY quot """> '
PRINT ON DATFILN "]>"
*-- Fin de la DTD
PRINT ON DATFILN '<!-- -->'
PRINT ON DATFILN '<FICHIER nom="':INPUTFILE:'" delegation="':NODR:'" nb.enreg="':NB.CLEINPUT:'" horodatage="':OCONV(DATE(),'D2/'):' ':OCONV(TIME(),'MTS:'):'">'
PRINT ON DATFILN '<!-- -->'
END
* IF @USER.TYPE = 0 THEN PRINT @(2,15):K:" ":CLEINPUT<K>:@(-4)
CODERR = 0
GOSUB TRAITEENREG ; * On traite les informations
IF CODERR <> 0 THEN
PARAM<4>=MESS
PARAM<5,1>=CODERR
CALL TTCAFF03 (PARAM,CODERR)
GOTO FIN ; * On arrête le carnage
END
END ELSE
*---- Pb a la lecture de INPUTFILE
PARAM<4,1>="Erreur lecture ":INPUTFILE:", cle : ":CLEINPUT<I>
PARAM<5,1>=STATUS()
CALL TTCAFF03 (PARAM,CODERR)
GOTO FIN ; * On arrête le carnage
END
*
NEXT K ; * fin de boucle sur les enregistrements
IF @USER.TYPE = 0 THEN PRINT @(34,18):@(-4):@(34,17):@(-4) ;* On efface les lignes d'avancement
*
END ELSE
PARAM<4,1>="Pb de lecture de liste des enregistrements sélectionnés"
PARAM<5,1>=STATUS()
CALL TTCAFF03 (PARAM,CODERR)
GOTO FIN ; * On arrête le carnage
*
END ; * fin du READSELECT
*
CASE (@SYSTEM.RETURN.CODE = 0) ; * Pas de donnes
IF @USER.TYPE = 0 THEN
PRINT @(2,22):"*** Pas d'enregistrements pour ce fichier ***":@(-4)
END ELSE
PRINT TIMEDATE():" *** Pas d'enregistrements pour ce fichier ***"
END
CASE (@SYSTEM.RETURN.CODE < 0) ; * Y'a eu un souci
PARAM<4,1>="*** Pb lors de la sélection des enregistrements de ":INPUTFILE:" ***"
PARAM<5,1>[email protected]
CALL TTCAFF03 (PARAM,CODERR)
IF @USER.TYPE = 0 THEN PRINT TIMEDATE():" *** Pb lors de la sélection des enregistrements de ":INPUTFILE:" ***"
GOTO FIN ; * On arrête le carnage
END CASE
*
*-- Ecriture de l'en-pied du fichier XML
IF NB.CLEINPUT <> "0" THEN PRINT ON DATFILN '</FICHIER>'
IF @USER.TYPE = 0 THEN PRINT @(7,15):NB.CLEINPUT:" enregistrements(s) traité(s) dans la file ":SFILES<NLASTFILE>:@(-4)
*
*---- On a fini, bien ou mal mais on y est !!
FIN:
IF @USER.TYPE = 0 THEN
PRINT @(2,22):" Fin d'execution ": @(-3)
END ELSE
PRINT TIMEDATE():" Fin d'extraction "
END
CLEARSELECT
CLOSE FINPUT
STOP
*-
*------
OPENFICH:
*-- Sous-Programme d'ouverture des fichiers utilisés par le programme et d'assignation
*-- du n° de la DR
*--
*
OPEN INPUTFILE TO FINPUT ELSE
CODERR = 999
LIBERR = "Erreur ouverture fichier ":INPUTFILE
RETURN
END
*
*-
* Récupération du n° de DR
CALL UTAKSYS("00000000",MAT ENR.KSYS,CODERR,MESS)
IF CODERR <> 0
THEN
LIBERR = MESS
RETURN
END
ELSE
NODR=ENR.KSYS(10)
END
RETURN
*
*------------
TRAITEENREG:
*-- Sous-Programme de traitement de l'enregistrement pour constitution du fichier en sortie
*-- Chaque enregistrement entrée pouvant donner lieu à plusieurs niveaux de balise XML (ENREG,
*-- ATTRIBUTx (ou libellé), VALEUR et/ou SSV. Normalement ces niveaux sont hiérarchisés et on ne
*-- devrait pas trouver de sous-valeurs si il n'y a pas de multi-valeurs mais on en trouve donc
*-- l'algorithme s'en est trouvé un peu compliqué.
*-- Si on veut utiliser le dictionnaire (DETAIL="D") la balise ATTRIBUTx est remplacée par le
*-- libellé du dictionnaire s'il existe et la conversion de la valeur à l'aide de OCONV est elle
*-- aussi effectuée si un format de conversion a été donné dans le dictionnaire.
MESS = ""
CODERR = 0
*- On compte le nombre d'attributs
NB.ATTRIBUTES=DCOUNT(ENR.INPUT,@AM)
*-
CALL UTXMLLITTERALOK(CLEINPUT<K>)
PRINT ON DATFILN '<ENREG ident="':CLEINPUT<K>:'" nb.attributs="':NB.ATTRIBUTES:'">' ; *- Balise ENREG
*--
IF ENR.INPUT<> "" THEN
CALL UTXMLLITTERALOK(ENR.INPUT)
*---------------------------Attributs---------------------------------------------
FOR A=1 TO NB.ATTRIBUTES ; *-- On boucle sur le nombre d'attributs
*
*---------------------------Valeurs-----------------------------------------------
*- On compte le nombre de valeurs
ATTRIB = ENR.INPUT<A,0,0>
NB.VALUES=DCOUNT(ATTRIB,@VM)
*--------
*
IF NB.VALUES > 1 THEN ; *-- On boucle sur le nombre de valeurs
IF DETAIL = "D" AND DICT.ARRAY<A,2,0><>"" THEN
PRINT ON DATFILN '<':DICT.ARRAY<A,2,0>:' multivaleurs="':NB.VALUES:'">' ; *- Balise ATTRIBUT
END ELSE
PRINT ON DATFILN '<ATTRIBUT':A:' multivaleurs="':NB.VALUES:'">' ; *- Balise ATTRIBUT
END
END ELSE
IF DETAIL = "D" AND DICT.ARRAY<A,2,0><>"" THEN
PRINT ON DATFILN '<':DICT.ARRAY<A,2,0>:' multivaleurs="0">' ; *- Balise ATTRIBUT
END ELSE
PRINT ON DATFILN '<ATTRIBUT':A:' multivaleurs="0">' ; *- Balise ATTRIBUT
END
IF DCOUNT(ATTRIB,@SM) <= 1 THEN
IF ATTRIB <> "" THEN
IF DETAIL = "D" AND DICT.ARRAY<A,1,0><>"" THEN
PRINT ON DATFILN OCONV(ATTRIB,DICT.ARRAY<A,1,0>)
END ELSE
PRINT ON DATFILN ATTRIB
END
END
END
END
FOR V=1 TO NB.VALUES
IF ENR.INPUT<A,V,0> <> "" THEN
*---------------------------Sous-Valeurs-------------------------------------------
*- On compte le nombre de sous-valeurs
NB.SSVALUES=DCOUNT(ENR.INPUT<A,V,0>,@SVM)
*
IF NB.SSVALUES > 1 THEN ; *-- On boucle sur le nombre de sous-valeurs
IF NB.VALUES > 1 THEN PRINT ON DATFILN '<VALEUR sous.valeurs="':NB.SSVALUES:'">'; *- Balise VALEUR
FOR S=1 TO NB.SSVALUES
IF ENR.INPUT<A,V,S> <> "" THEN
PRINT ON DATFILN '<SSV>' ; *- Balise SSVALUE
IF DETAIL = "D" AND DICT.ARRAY<A,1,0><>"" THEN
PRINT ON DATFILN OCONV(ENR.INPUT<A,V,S>,DICT.ARRAY<A,1,0>)
END ELSE
PRINT ON DATFILN ENR.INPUT<A,V,S>
END
PRINT ON DATFILN '</SSV>' ; *- Fin Balise SSVALUE
END ELSE
PRINT ON DATFILN '<SSV/>' ; *- Balise vide SSVALUE
END
NEXT S
*---------------------------Sous-Valeurs-------------------------------------------
END ELSE
IF NB.VALUES > 1 THEN
PRINT ON DATFILN '<VALEUR sous.valeurs="0">' ; *- Balise VALEUR
IF ENR.INPUT<A,V,0> <> "" THEN
IF DETAIL = "D" AND DICT.ARRAY<A,1,0><>"" THEN
PRINT ON DATFILN OCONV(ENR.INPUT<A,V,0>,DICT.ARRAY<A,1,0>)
END ELSE
PRINT ON DATFILN ENR.INPUT<A,V,0>
END
END
END
END
IF NB.VALUES > 1 THEN PRINT ON DATFILN '</VALEUR>' ; *- Fin de balise VALEUR
END ELSE
PRINT ON DATFILN '<VALEUR sous.valeurs="0"/>'
END ; *- Balie vide VALEUR
*
NEXT V ; *-- Fin de boucle sur le nombre de valeurs
*---------------------------Valeurs-----------------------------------------------
IF DETAIL = "D" AND DICT.ARRAY<A,2,0><>"" THEN
PRINT ON DATFILN '</':DICT.ARRAY<A,2,0>:'>' ; *- Fin de balise ATTRIBUT
END ELSE
PRINT ON DATFILN '<[[/ATTRIBUT]]':A:'>' ; *- Fin de balise ATTRIBUT
END
NEXT A ; *-- Fin de boucle sur le nombre de valeurs
*---------------------------Attributs---------------------------------------------
END
*
PRINT ON DATFILN '</ENREG>' ; *- Fin de la balise RECORD
*-
RETURN
*------------
GETFILE:
*-- Sous-programme de saisie du nom du fichier à traiter
*--
INDICATEUR=0
LOOP
WHILE INDICATEUR = 0 DO
*
PRINT @(2,21):"Fichier à extraire (# pour finir) :":@(-4)
CALL UTSAISIE(REPONSE,37,21,25)
REPONSE=TRIM(UPCASE(REPONSE))
*
FOR I = 14 TO 20
PRINT @(0,I):@(-4)
NEXT I
PRINT @(0,22):@(-4)
*
BEGIN CASE
CASE (REPONSE="" )
CONTINUE
CASE (REPONSE#"#" AND REPONSE#"?")
CODERR = 0
INDICATEUR=1
INPUTFILE = REPONSE
*
CASE (REPONSE="#")
INDICATEUR=1
*
CASE (REPONSE="?")
PRINT @(2,15):"Vous devez saisir un nom de fichier ayant un dictionnaire.":@(-4)
PRINT @(2,16):"En effet des informations contenues dans ce DICT sont nécessaires a la ":@(-4)
PRINT @(2,17):"bonne execution de ce traitement.":@(-4)
PRINT @(2,18):" ":@(-4)
PRINT @(2,19):" ":@(-4)
END CASE
*
REPEAT
*
RETURN
*------------
GETDICT:
*-- Sous programme de lecture du DICT du fichier (par OCONV T) pour remplir un
*-- tableau dynamique DICT.ARRAY contenant pour chaque attribut du dictionnaire
*-- (sauf la clé) un libellé (le plus long !) et un format de conversion s'il y en a.
*-- Au passage on s'assure que le libellé pourra être utilisé pour faire une
*-- balise XML digne de ce nom en appelant UTXMLBALISEOK pour le transformer si
*-- nécessaire.
*-
CAPDICT = 'SSELECT DICT ':INPUTFILE:' BY LOC BY @ID IF TYP = "D"'
EXECUTE CAPDICT CAPTURING V1
*
BEGIN CASE
CASE (@SYSTEM.RETURN.CODE > 0) ; * On a trouvé des enregistrements
*
READSELECT CLEDICT THEN
NB.CLEDICT = DCOUNT(CLEDICT,@AM)
DICT.ARRAY=""
D = 1
MAXPOS=0
LOOP
WHILE (D <= NB.CLEDICT) DO ; * Boucle sur les attributs de DICT sélectionnés
*
*---- Récupération des infos du DICT de INPUTFILE pour la clée donnée
POS=OCONV(CLEDICT<D>,"TDICT ":INPUTFILE:";X;;2") ; * Position
IF POS > MAXPOS THEN MAXPOS=POS ; * On stocke pour construire la DTD ensuite
CONV=OCONV(CLEDICT<D>,"TDICT ":INPUTFILE:";X;;3") ; * Conversion
* LIBELLE=OCONV(CLEDICT<D>,"TDICT ":INPUTFILE:";X;;4") ; * Libellé
LIBELLE=CLEDICT<D>
*
IF POS > 0 THEN ; * On se fiche de la clé, on la laisse brute
IF CONV <> "" THEN DICT.ARRAY<POS,1,0>=CONV ; * Format
IF LEN(LIBELLE) > LEN(DICT.ARRAY<POS,2,0>) THEN
CALL UTXMLBALISEOK(LIBELLE)
FIND LIBELLE IN DICT.ARRAY SETTING F,V,S ELSE DICT.ARRAY<POS,2,0>=LIBELLE ; * Libellé
END
END
*
D = D + 1
REPEAT ; * fin de boucle sur les enregistrements
*
END ELSE
LIBERR="Pb de lecture de liste du dictionnaire"
CODERR=STATUS()
RETURN ; * On arrête le carnage
*
END ; * fin du READSELECT
CASE (@SYSTEM.RETURN.CODE = 0) ; * DICT vide ?
LIBERR = "Le DICT de ":INPUTFILE:" semble vide !"
CODERR = 1
CASE (@SYSTEM.RETURN.CODE < 0) ; * Pas de dictionnaire ?
LIBERR = INPUTFILE:" n'aurait-il pas de DICT ?"
CODERR = 1
END CASE
RETURN
*-
END
================= Check forbidden chars subroutine ===================
SUBROUTINE UTXMLLITERRALOK(VALEUR) *========================================================================= *= Domaine : OUTILS *= Programme : UTXMLLITERRALOK *= Version 7.4.1.1 *= Date de mise à jour : 15/05/03 *= Date de génération : 15/05/03 *========================================================================= *= L'instruction suivante permet de connaître le numéro de version du *= programme compilé sous unix par la commande : what _[[NomProgramme]] *= [[NumeroDeVersionDuProgramme]] = "@(#)[UTXMLLITERRALOK 7.4.1.1 15/05/03]" *= *========================================================================= *-- Libellé : remplacer les caractères "interdits" dans un littéral XML *-- Date : 15/05/03 *-- Référence : *-- Objet : Sous-Programme permettant de remplacer les caractères "interdits" *-- dans un littéral XML par les entités pré-définies qui doivent *-- les remplacer. *-- On assume que ces entités sont définies au préalable dans la DTD *-- Elles sont : *-- lt, gt, amp, apos, quot *======================================================================== *- SWAP "<" WITH "<"IN VALEUR SWAP ">" WITH ">" IN VALEUR SWAP "&" WITH "&" IN VALEUR SWAP "'" WITH "'" IN VALEUR SWAP '"' WITH""" IN VALEUR * RETURN * END
================= Check forbidden chars in tags subroutine ===================
SUBROUTINE UTXMLBALISEOK(VALEUR)
*=========================================================================
*= Domaine : OUTILS
*= Programme : UTXMLBALISEOK
*= Version 7.4.1.1
*= Date de mise à jour : 15/05/03
*= Date de génération : 15/05/03
*=========================================================================
*= L'instruction suivante permet de connaître le numéro de version du
*= programme compilé sous unix par la commande : what _[[NomProgramme]]
*=
[[NumeroDeVersionDuProgramme]] = "@(#)[UTXMLBALISEOK 7.4.1.1 15/05/03]"
*=
*=========================================================================
*-- Libellé : remplacer les caractères "interdits" des balises XML par des _
*-- Date : 15/05/03 par DSI [HME]
*-- Référence :
*-- Objet : Sous-Programme permettant de remplacer les caractères "interdits"
*-- des balises XML par des _
*-- Si la balise commence par un chiffre on lui colle un _ en tête
*========================================================================
*
FLAGNUMDEB=0
LONG=LEN(VALEUR)
I = 1
FOR I =1 TO LONG
ASCII = SEQ(VALEUR[I,1])
IF (ASCII >=48 AND ASCII <=58) OR (ASCII >=65 AND ASCII <=90) OR (ASCII>=97 AND ASCII<=122) OR (ASCII >=192 AND ASCII <=214) OR (ASCII>=216 AND ASCII <=246) OR (ASCII >=248 AND ASCII<=255) OR (VALEUR[I,1]="-") OR (VALEUR[I,1]=".") THEN
IF I=1 AND (ASCII >=48 AND ASCII <=58) THEN ;* Ne peut pas commencer par un chiffre
FLAGNUMDEB=1
END
END ELSE
IF I=1 AND (VALEUR[I,1] = ":" OR VALEUR[I,1] = "_") THEN ;* Peut commencer par : ou _
CONTINUE
END ELSE
VALEUR[I,1]="_"
END
END
NEXT I
*
IF FLAGNUMDEB=1 THEN VALEUR="_":VALEUR ;* On ajoute un _ car commence par un chiffre
*
RETURN
END
================ General errors handler subroutine ===============
SUBROUTINE TTCAFF03(PARAM,CODRETOUR)
*==========================================================================
*= Domaine : TTAPPLIS
*= Programme : TTCAFF03
*= Version 6.1.1.1
*= Date de mise à jour : 99/11/15
*= Date de génération : 01/02/14
*===========================================================================
*= L'instruction suivante permet de connaître le numéro de version du
*= programme compilé sous unix par la commande : what _[[NomProgramme]]
*=
[[NumeroDeVersionDuProgramme]] = "@(#)[TTCAFF03 6.1.1.1 99/11/15]"
*=
*===========================================================================
*-- Libelle : Gestion de l'erreur bloquante
*-- Date création : 22/09/99
*-- Référence : ASS21238
*-- Objet :
*-- Objet : Générer une file ERR.ABORT et affichage d'un ecran d'erreur
*-- si le traitement appelant est un TP
*=================================================================
*-- PARAMETRES :
*==============
*-- En entree :
*-- PARAM<1,1> : DOMAINE (10L) : Domaine applicatif du programme appelant
*-- PARAM<2,1> : DIAG (30L) : Diagnostic de l'anomalie constatee
*-- PARAM<3,1> : NOMPROG (8L) : Nom du programme ou l'anomalie est constatée
*-- PARAM<4,1> : LIBERR (30L) : Libellé de l'erreur
*-- PARAM<5,1> : CODERREUR (3L) : Code de l'erreur renseigné avec un code erreur
*-- ou la mention "Sans objet"
*-- PARAM<6,1> : AFFICH (1L) : Indicateur precisant si le message doit (1)
*-- ou non (0) etre afficher a l'ecran
*-- En sortie : CODRETOUR
*--
*==================================================================
*
*===========================
* Description des variables
*===========================
* SLFIL : Parametre d'appel au programme SLIMPRIMANTE
* F.ERR : File d'erreur contenant les lignes d'impression
*===========================
* Initialisations
*===========================
*
DOMAINE = PARAM<1,1>
DIAG = PARAM<2,1>
NOMPROG = PARAM<3,1>
LIBERR = PARAM<4,1>
CODERREUR = PARAM<5,1>
AFFICH = PARAM<6,1>
CODRETOUR = 0
SLFIL = ""
SLFIL<1> = ""
SLFIL<2> = "ERR.ABORT"
CALL SLIMPRIMANTE (SLFIL)
F.ERR = 1
*
*===========================
* Ouverture des fichiers
*===========================
* Sans objet
*
*===========================
* Bloc principal
*===========================
*-- Le code erreur est renseigne a Sans objet s'il est a blanc
IF CODERREUR = "" THEN
CODERREUR = "Sans objet"
END
IF MOD((LEN(LIBERR)),66) # 0 THEN
[[NB_LIGNES]] = INT((LEN(LIBERR))/66)+1
END ELSE
[[NB_LIGNES]] = INT((LEN(LIBERR))/66)
END
IF [[NB_LIGNES]] > 3 THEN
*-- on affiche 3 lignes au maximum
[[NB_LIGNES]] = 3
END
*-- Affichage de l'erreur
IF AFFICH = "1" THEN
PRINT @(-1)
PRINT @(0,0):DOMAINE:" : ":DIAG
PRINT @(0,4):"IL Y A EU UN PROBLEME GRAVE LORS DU DEROULEMENT DE VOTRE TRAITEMENT"
PRINT @(0,10):"PROGRAMME : ":NOMPROG
PRINT @(0,11):"ERREUR : ":LIBERR[1,66]
FOR I=2 TO [[NB_LIGNES]]
DEBUT = (66*(I-1))+1
FIN = DEBUT
PRINT @(0,11+I-1):" ":LIBERR[DEBUT,66]
NEXT I
PRINT @(0,11+[[NB_LIGNES]]):"CODE ERREUR : ":CODERREUR
PRINT @(4,22):"IMPRIMER OU NOTER LES REFERENCES CI-DESSUS ET PREVENEZ VOTRE RSI"
INPUT NULL
END
*--- File d'erreur ERR.ABORT
IF MOD((LEN(LIBERR)),64) # 0 THEN
[[NB_LIGNES]] = INT((LEN(LIBERR))/64)+1
END ELSE
[[NB_LIGNES]] = INT((LEN(LIBERR))/64)
END
PRINT ON F.ERR " PROBLEME GRAVE AU COURS DU TRAITEMENT"
PRINT ON F.ERR ""
PRINT ON F.ERR "PROGRAMME : ":NOMPROG
PRINT ON F.ERR "ERREUR : ":LIBERR[1,64]
FOR I=2 TO [[NB_LIGNES]]
DEBUT = (64*(I-1)) + 1
FIN = DEBUT
PRINT ON F.ERR " ":LIBERR[DEBUT,64]
NEXT I
PRINT ON F.ERR "CODE ERREUR : ":CODERREUR
DATE = DATE() "D"
TIME = TIME() "MT"
PRINT ON F.ERR "DATE : ":DATE:" ":TIME
PRINT ON F.ERR "LOGIN : ":@LOGNAME
PRINT ON F.ERR
PRINT ON F.ERR " PREVENEZ VOTRE R.S.I"
PRINT ON F.ERR
PRINT ON F.ERR
*===========================
* Fermeture des fichiers
*===========================
PRINTER CLOSE
*===========================
* Fin de traitement
*===========================
RETURN
*===========================
* Sous routines internes
*===========================
*
* Sans objet
================= General printer assign subroutine ========
SUBROUTINE SLIMPRIMANTE(SLFIL)
*==========================================================================
*= Programme : SLIMPRIMANTE
*= Version 1.1
*= Date de mise à jour : 96/04/25
*= Date de génération : 01/02/14
*===========================================================================
*= L'instruction suivante permet de connaître le numéro de version du
*= programme compilé sous unix par la commande : what _[[NomProgramme]]
*=
[[NumeroDeVersionDuProgramme]] = "@(#)[SLIMPRIMANTE 1.1 96/04/25]"
*=
*===========================================================================
*----------------------------------------------------------------------------
*-- PORTAGE
*-- UDT : Assignation des imprimantes dans un programme
*-- Creation : 17:02:10 16 Jan 1995 par ERG
*-- Version : 1.0
*-- Date de MAJ : 22 mai 1995
*-- MAJ : ajout de la mise a jour du fichier [[SO_HOLD_]]
*-- Compile :
*----------------------------------------------------------------------------
* SLFIL : liste des files a initialiser en MA hormis la 19
*----------------------------------------------------------------------------
PROMPT ""
LTAMPON = @DATA
IFIN = DCOUNT(SLFIL,@AM)
* Recherche si entree verrouillee ou non
THOLD = 0
FOR I = 1 TO IFIN
IF SLFIL<I> # 0 THEN THOLD = 1 ; GO 10
NEXT I
10 NULL
*----------------------------------------------------------------------------
* Modif du 22 mai 1995
SOHOLD = 1
OPEN "DICT _HOLD_" TO FDHOLD ELSE SOHOLD = 0
OPEN "[[SO_HOLD_]]" TO FSOHOLD ELSE SOHOLD = 0
**** Fin modif du 22 mai 1995
*----------------------------------------------------------------------------
* Selection de l'imprimante si pas verrouillee
IF NOT(THOLD) THEN XDEST = ",DEST imp1" ELSE XDEST = ""
* Assignation des lignes
CPT = 0
FOR I = 1 TO IFIN
XNOF = I - 1 ; MSF = SLFIL<I>
* Recherche si verrouillee ou non
IF THOLD THEN XHOLD = 3 ELSE XHOLD = 1
* Recherche si BANNER UNIQUE avec message
IF MSF # 0 THEN XBANNER = " ":MSF ELSE XBANNER = ""
* Preparation de la phrase
PHRASE = 'SETPTR ':XNOF:',,,,,':XHOLD:',BANNER UNIQUE':XBANNER
PHRASE = PHRASE:',NOHEAD':XDEST:',BRIEF'
* Envoi de l'initialisation
EXECUTE PHRASE
**** Modif du 22 mai 1995
IF SOHOLD = 1 AND XHOLD = 3 THEN
READV NUM FROM FDHOLD,"NEXT.HOLD",1 ELSE NUM = 1
NUM = NUM - 1
IF XBANNER = "" THEN ITSOHOLD = "P_0000" ELSE ITSOHOLD = XBANNER[2,40]
ITSOHOLD = ITSOHOLD:"_":NUM "R%4"
WSOHOLD = @DATE:@AM:@TIME:@AM:@LOGNAME:@AM:"N"
READU EXIST FROM FSOHOLD,ITSOHOLD ELSE NULL
WRITE WSOHOLD ON FSOHOLD,ITSOHOLD
END
**** Fin modif du 22 mai 1995
NEXT I
* Assignation de la file 19
EXECUTE 'SETPTR 19,,,,,3,BANNER UNIQUE 19,NOHEAD,BRIEF'
**** Modif du 22 mai 1995
IF SOHOLD = 1 THEN
READV NUM FROM FDHOLD,"NEXT.HOLD",1 ELSE NUM = 1
NUM = NUM - 1
ITSOHOLD = "19_":NUM "R%4"
WSOHOLD = @DATE:@AM:@TIME:@AM:@LOGNAME:@AM:"N"
READU EXIST FROM FSOHOLD,ITSOHOLD ELSE NULL
WRITE WSOHOLD ON FSOHOLD,ITSOHOLD
END
**** Fin modif du 22 mai 1995
* Remise en forme des tampons
NBTAMPON = DCOUNT(LTAMPON,CHAR(13)) - 1
FOR I = 1 TO NBTAMPON
DATA FIELD(LTAMPON,CHAR(13),I)
NEXT I
*
RETURN