Bonjour,
Je passais dans le coin par hasard. Ce n’est pas très réactif mais ça fait au moins un message sur le forum en 2023.
Tu évoques une table SQL mais SQL est un langage, pas une BDD. Tu dois vouloir dire ISQL.
Envoyé par
elfynuit
- prendre les 19 premiers caractères du fichier afin de vérifier que le nom du fichier soit bien le bon (dans notre exemple : 19 premiers caractères = ABC_DEF_JKL_MNOPQRS)
En quoi consiste ce contrôle ? Vérifier que les caractères 4, 8, 12 et 20 sont des caractères underscore ? D’autres contrôles que le shell ne pourrait faire ?
Envoyé par
elfynuit
- vérifier que cette date est cohérente (par exemple année en cours + 1 ou autres contrôles...)
Vérifier les valeurs de l’année, du mois et du jour ? Vérifier la cohérence du jour par rapport au mois ?
Tout cela se fait par des commandes Unix. Un contrôle via un programme batch Informix peut se faire mais il doit se justifier. Rien dans ton message ne permet de l’envisager. J’ai pratiqué Informix pendant 17 ans et je ne vois pas vraiment comment je m’y prendrais pour faire ce genre de contrôles.
Autre chose : tu cites un exemple de nom de fichier mais comment automatiser l’obtention de ce nom de fichier ? Ce fichier se repère comment dans son répertoire ? Par son suffixe ".dat", mais encore s’il existe plusieurs fichiers suffixés ".dat" ?
Par ailleurs, on ne sait rien de ton environnement de développement.
Je propose le shell unix ci-dessous qu’il convient de compléter, d’adapter au besoin et surtout de tester et corriger si nécessaire car je n’ai pas écrit de commandes shell depuis plus de quinze ans.
Certaines commandes en commentaires sont des "au cas où".
# controle
# exemple : ABC_DEF_JKL_MNOPQRS_20221031173750.dat
# Paramètres
#
# P_DATA = Nom complet du fichier (38 caractères)
# P_NOM = Nom du fichier (19 caractères)
# P_AAAA = Année ( 4 caractères)
# P_MM = Mois ( 2 caractères)
# P_JJ = Jour ( 2 caractères)
# P_04 = Underscore 04 ( 1 caractère)
# P_08 = Underscore 08 ( 1 caractère)
# P_12 = Underscore 12 ( 1 caractère)
# P_20 = Underscore 20 ( 1 caractère)
P_DATA=`ls –l *.dat`
LENGTH=`expr "$P_DATA" : '.*'`
if test "$LENGTH" -eq 38
then
P_NOM =`expr "$P" : '\(.*\)...................'`
P_AAAA=`expr "$P" : '....................\(.*\)..............'`
P_MM =`expr "$P" : '........................\(.*\)............'`
P_JJ =`expr "$P" : '..........................\(.*\)..........'`
P_04 =`expr "$P" : '...\(.*\).............................'`
P_08 =`expr "$P" : '.......\(.*\).........................'`
P_12 =`expr "$P" : '...........\(.*\).....................'
P_20 =`expr "$P" : '...................\(.*\).............'`
else echo "Erreur : Nom de fichier <> 38 caractères"
break
fi
clear
echo "P_DATA = Nom complet du fichier : " $P_DATA
echo "P_NOM = Nom du fichier : " $P_NOM
echo "P_AAAA = Année : " $P_AAAA
echo "P_MM = Mois : " $P_MM
echo "P_JJ = Jour : " $P_JJ
echo "P_04 = Underscore 04 : " $P_04
echo "P_08 = Underscore 08 : " $P_08
echo "P_12 = Underscore 12 : " $P_12
echo "P_20 = Underscore 20 : " $P_20
echo "┌CONTRÔLE───────────────────────────────────────────────────────────────┐"
echo "│ │"
echo "│TRAITEMENT ? [ <──┘ ]=OK, [Del]=Abandon │"
echo "└───────────────────────────────────────────────────────────────────────┘"
echo ""
cd ../shell
# if test -f ${LOGNAME}.out
# then rm ${LOGNAME}.out
# fi
P_ERREUR=0
SMSO=`tput smso`
RMSO=`tput rmso`
# TRAITEMENT ?
tput cup 12 14
echo $SMSO" "$RMSO
tput cup 12 14
read REPONSE
tput cup 12 14
echo " "
tput cup 14 0
echo "en cours...\c"
if [ "$P_04" <> "_" ]
or [ "$P_08" <> "_" ]
or [ "$P_12" <> "_" ]
or [ "$P_20" <> "_" ]
then tput cup 1 45
echo "ERREUR !"
P_ERREUR=1
fi
P_YEAR=eval $ (date + '$ ( (% Y + 1) ) ')
If P_AAAA <> P_YEAR
then tput cup 2 45
echo "ERREUR !"
P_ERREUR=1
fi
if [ "$P_MOIS" = "01" ]
or [ "$P_MOIS" = "02" ]
or [ "$P_MOIS" = "03" ]
or [ "$P_MOIS" = "04" ]
or [ "$P_MOIS" = "05" ]
or [ "$P_MOIS" = "06" ]
or [ "$P_MOIS" = "07" ]
or [ "$P_MOIS" = "08" ]
or [ "$P_MOIS" = "09" ]
or [ "$P_MOIS" = "10" ]
or [ "$P_MOIS" = "11" ]
or [ "$P_MOIS" = "12" ]
then continue
else then tput cup 3 45
echo "ERREUR !"
P_ERREUR=1
fi
Etc.
if [ "P_ERREUR" = "0" ]
then ${LOGNAME}.sql="load from $P_DATA insert into table"
if [ "$DBLANG" = "" ]
then isql -s nom_bdd -qcre ${LOGNAME} > /dev/null
else isql -s nom_bdd -lceq ${LOGNAME} > /dev/null
fi
fi
# sacego -q ../ace/controle $P_NOM $P_AAAA $P_MM $P_JJ
tput cup 14 13
echo "Terminé !"
■ Et quel est le rapport avec Informix ? Et bien, je vais vous le dire…
C’est simple, j’avais besoin dans les items du menu Informix de mon application de gestion des Examens-Concours, de transmettre au shell trois paramètres :
- le code du concours sur 2 à 5 caractères,
- le type sur deux caractères (CE pour Concours Externe, CI pour Concours Interne, EP pour Examen Professionnel, etc.)
- et la session sur deux caractères, c’est-à-dire les deux derniers chiffres de l’année.
La longueur de l’attribut progname de la table sysmenuitems du système de menus Informix étant limitée à 60 caractères, il n’était pas possible d’envisager l’export de trois paramètres.
En concaténant les trois paramètres à transmettre au shell, un seul export faisait l’affaire, charge au shell de reconstituer les trois paramètres avant de lancer le traitement.
■ Exemple d’un item du menu
Il s’agit de lancer l’édition des numéros de table pour le Concours Externe de Secrétaire Administratif Scolaire et Universitaire, session 2007.
- Le sous-menu que voient les gestionnaires
┌────────────────────────────────────────────────────────────────────────────────┐
│ │
│ SASU CE 07 │
│ │
│ 1. ┌──────────┤La valise├──────────┐ 15. ┌──────────┤Anonymat ├──────────┐ │
│ 2. │LISTE D'APPEL │ 16. │AFFECTATION DES N° D'ANONYMAT │ │
│ 3. │LISTE D'EMARGEMENT │ 17. │LISTE PAR NUMERO DE PLACE │ │
│ 4. │N° DE TABLE (1ère fois) │ 18. │LISTE PAR NUMERO D'ANONYMAT │ │
│ 5. │N° DE TABLE (Mise à jour) │ 19. │ETIQUETTES D’ANONYMAT │ │
│ 6. │N° DE TABLE (Places libres) │ 20. │ │ │
│ 7. │CONVOCATION CHEF DE SALLE │ 21. │ │ │
│ 8. │CONVOCATIONS NON NOMINATIVES │ 22. │ │ │
│ 9. │EXPORTATION -> LECTEUR OPTIQUE │ 23. │ │ │
│ 10. │ │ 24. │ │ │
│ 11. │ │ 25. │ │ │
│ 12. │ │ 26. │ │ │
│ 13. │ │ 27. │ │ │
│ 14. └───────────────────────────────┘ 28. └───────────────────────────────┘ │
│ │
│ │
│Use space bar, arrow keys, or type number to make selection. │
│Enter 'e' to return to previous menu or exit. │
│Enter carriage return to execute selection: 4 │
│ │
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────┘
- Le système de menus d’Informix ISQL
Ce système de menus utilise deux tables : sysmenus et sysmenuitems
- La table sysmenus
{ TABLE "informix".sysmenus row size = 78 number of columns = 2 index size = 33 }
{ unload file name = sysme00100.unl number of rows = 3331 }
create table "informix".sysmenus
(
menuname char(18),
title char(60)
);
revoke all on "informix".sysmenus from "public";
create unique index "informix".sysmenidx on "informix".sysmenus (menuname);
- La table sysmenuitems
{ TABLE "informix".sysmenuitems row size = 143 number of columns = 5 index size =
39 }
{ unload file name = sysme00101.unl number of rows = 33882 }
create table "informix".sysmenuitems
(
imenuname char(18),
itemnum integer,
mtext char(60),
mtype char(1),
progname char(60)
);
revoke all on "informix".sysmenuitems from "public";
create unique index "informix".meniidx on "informix".sysmenuitems (imenuname,itemnum);
- L’item de la table sysmenuitems
SASU_CE-07|4|│N° DE TABLE (1ère fois) │|P|P=SASU_CE_07; export P; ../shell_1/post_itBDD|
- Le shell post_itBDD
Ce shell prévoit d’être exécuté par les gestionnaires via l’item du menu ci-dessus mais également depuis le prompt par le développeur. Les trois paramètres doivent alors être saisis manuellement.
Pour information
Ces exemples d’item de menu et de shell complètent ma discussion et mon billet de blog :
Discussion : Sujet d’algorithmie original : imprimer des numéros de table en piles
Billet : Imprimer des numéros de table en piles
Partager