IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Informix Discussion :

Contrôle du nom de fichier avant chargement dans une table SQL


Sujet :

Informix

  1. #1
    Candidat au Club
    Femme Profil pro
    Analyse système
    Inscrit en
    Octobre 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Octobre 2022
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Contrôle du nom de fichier avant chargement dans une table SQL
    Bonjour à tous,

    Je souhaiterais chargé un fichier dans une table SQL.

    Voici le type de nom du fichier à charger :
    ABC_DEF_JKL_MNOPQRS_20221031173750.dat
    Ce nom de fichier est composé de caractères alphanumérique (nom du fichier : ABC_DEF_JKL_MNOPQRS) et suffixé par une date (20221031173750) au format AAAAMMJJHHMMSS

    Au préalable, je souhaiterais faire quelques contrôles et actions avant de charger ce fichier en table (je précise que toutes ces contrôles et actions ne portent uniquement que sur le nom du fichier et non sur le contenu du fichier en lui-même, excepté le fait de vérifier que le contenu du fichier n'est pas vide) :

    - 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)

    -prendre la position 21 à 28, dans notre exemple 20221031 afin de vérifier que c'est bien une date (AAAAMMJJ)

    -vérifier que cette date est cohérente (par exemple année en cours +1 ou autres contrôles...)

    - vérifier que le fichier à charger n'est pas vide

    Ma question : comment écrire cela en informix (je ne connais pas la syntaxe de ce langage).
    J'imagine que ce genre de contrôle a déjà été écrit, auriez-vous des exemples ?

    D'avance, merci pour votre aide !

    Elfy

  2. #2
    Membre éclairé
    Avatar de APL-AML
    Homme Profil pro
    Développeur Gestion (Retraité)
    Inscrit en
    Juin 2020
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur Gestion (Retraité)
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2020
    Messages : 48
    Points : 870
    Points
    870
    Billets dans le blog
    85
    Par défaut Reconstitution dans un shell d’un paramètre multicritères en autant de paramètres qu’il y a de critères
    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.

    Citation Envoyé par elfynuit Voir le message
    - 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 ?

    Citation Envoyé par elfynuit Voir le message
    - 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 :

    1. le code du concours sur 2 à 5 caractères,

    2. le type sur deux caractères (CE pour Concours Externe, CI pour Concours Interne, EP pour Examen Professionnel, etc.)

    3. 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.

      # post_itBDD
      
      clear
      
      LENGTH=`expr "$P" : '.*'`
      if test "$LENGTH" -eq 11
      then 
           P_1=`expr "$P" : '\(.*\)......'`
           P_2=`expr "$P" : '......\(.*\)...'`
           P_3=`expr "$P" : '.........\(.*\)'`
      fi
      if test "$LENGTH" -eq 10
      then
           P_1=`expr "$P" : '\(.*\)......'`
           P_2=`expr "$P" : '.....\(.*\)...'`
           P_3=`expr "$P" : '........\(.*\)'`
      fi
      if test "$LENGTH" -eq 9
      then
           P_1=`expr "$P" : '\(.*\)......'`
           P_2=`expr "$P" : '....\(.*\)...'`
           P_3=`expr "$P" : '.......\(.*\)'`
      fi
      if test "$LENGTH" -eq 8
      then
           P_1=`expr "$P" : '\(.*\)......'`
           P_2=`expr "$P" : '...\(.*\)...'`
           P_3=`expr "$P" : '......\(.*\)'`
      fi
      if test "$LENGTH" -eq 7
      then
           P_1=`expr "$P" : '\(.*\)......'`
           P_2=`expr "$P" : '..\(.*\)...'`
           P_3=`expr "$P" : '.....\(.*\)'`
      fi
      
      echo "                              " $P_1 $P_2 $P_3
      echo ""
      echo "┌EDITION DES NUMEROS DE TABLE───────────────────────────────────────────┐"
      echo "│                                                                       │"
      echo "│- Le lancement de cette édition suppose le PLACEMENT déjà effectué.    │"
      echo "│- L'édition gère les places vides                                      │"
      echo "│  (candidatures supprimées après que le PLACEMENT ait été effectué)    │"
      echo "│- L'édition comprend deux étapes :                                     │"
      echo "│  1. Préparation de l'édition avec mise à jour de la base              │"
      echo "│  2. Edition proprement dite des numéros de table                      │"
      echo "├───────────────────────────────────────────────────────────────────────┤"
      echo "│TRAITEMENT ?   [ <──┘ ]=OK, [Del]=Abandon                              │"
      echo "└───────────────────────────────────────────────────────────────────────┘"
      echo ""
      
      cd ../shell_1
      
      if test -f ${LOGNAME}.prt
         then rm ${LOGNAME}.prt
      fi
      
      if test -f ${LOGNAME}.out
         then rm ${LOGNAME}.out
      fi
      
      SMSO=`tput smso`
      RMSO=`tput rmso`
      
      if [ "$LENGTH" = 0 ]
      then
      
           tput cup 0 0
           echo " CONCOURS : "
           tput cup 0 12
           echo $SMSO"     "$RMSO
           tput cup 0 12
           read P_1
           if [ "$P_1" = "" ]
           then P_1=0
           fi
      
           tput cup 0 0
           echo "                              " $P_1 $P_2 $P_3
           tput cup 0 0
           echo " TYPE     : "
           tput cup 0 12
           echo $SMSO"  "$RMSO
           tput cup 0 12
           read P_2
           if [ "$P_2" = "" ]
           then P_2=0
           fi
      
           tput cup 0 0
           echo "                              " $P_1 $P_2 $P_3
           tput cup 0 0
           echo " SESSION  : "
           tput cup 0 12
           echo $SMSO"  "$RMSO
           tput cup 0 12
           read P_3
           if [ "$P_3" = "" ]
           then P_3=0
           fi
           echo ""
      
           tput cup 0 0
           echo "                              " $P_1 $P_2 $P_3
       fi
      
      # TRAITEMENT ?
        tput cup 11 14
        echo $SMSO" "$RMSO
        tput cup 11 14
        read REPONSE
        tput cup 11 14
        echo " "
      
      tput cup 8 59
      echo "en cours...\c"
      
      sacego -q ../ace_1/post_itBDD $P_1 $P_2 $P_3 $LOGNAME
      
      ed - "${LOGNAME}.out" << !
      \$-1d
      w
      q
      !
      
      cp ../sql_1/post_itBDD.sed ${LOGNAME}.sql
      
      ed - "${LOGNAME}.sql" << !
      ,s/LOGNAME/$LOGNAME/g
      ,s/C_EC/$P_1/g
      ,s/T_EC/$P_2/g
      ,s/S_EC/$P_3/g
      w
      q
      !
      
      if [ "$DBLANG" = "" ]
      then isql -s concours -qcre ${LOGNAME} > /dev/null
      else isql -s concours -lceq ${LOGNAME} > /dev/null
      fi
      
      # {
      # post_itBDD.sed
      # }
      # 
      # lock table ec in exclusive mode;
      # 
      # update ec
      # set    ec.place  = (select max(cec.place)
      #                     from       cec
      #                     where      cec.c_ec = "C_EC"
      #                     and        cec.t_ec = "T_EC"
      #                     and        cec.s_ec = "S_EC")
      # where ec.c_ec = "C_EC"
      # and   ec.t_ec = "T_EC"
      # and   ec.s_ec = "S_EC";
      # 
      # unlock table ec;
      # 
      # lock table tmp in exclusive mode;
      # 
      # delete from tmp where tmp.n_cec is not null;
      # 
      # load from "LOGNAME.out" insert into tmp;
      # 
      # update cec
      # set   (cec.post_it)
      #    = ((select tmp.post_it
      #        from   tmp
      #        where cec.n_cec = tmp.n_cec))
      # where  cec.c_ec = "C_EC"
      # and    cec.t_ec = "T_EC"
      # and    cec.s_ec = "S_EC";
      # 
      # update  ec
      # set   ( ec.place)
      #    = ((select tmp.place
      #        from   tmp
      #        where  tmp.c_ec    = ec.c_ec
      #        and    tmp.t_ec    = ec.t_ec
      #        and    tmp.s_ec = ec.s_ec
      #        and    tmp.flag    = "-"))
      # where   ec.c_ec = "C_EC"
      # and     ec.t_ec = "T_EC"
      # and     ec.s_ec = "S_EC";
      # 
      # unlock table tmp;
      
      # post_itALL
      
      tput cup 9 59
      echo "en cours...\c"
      
      sacego -q ../ace_1/post_itALL $P_1 $P_2 $P_3 $LOGNAME
      
      cat ${LOGNAME}.prt | sed -f ../bull/isoTOascii.sed > ${LOGNAME}.tmp
      mv  ${LOGNAME}.tmp ${LOGNAME}.prt
      lp  ${LOGNAME}.prt > /dev/null
      
      tput cup 13 0
      echo "TERMINE !"
      




    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


    La situation étant désespérée, tout est maintenant possible. John Cage

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/10/2022, 22h23
  2. Importer fichier excel 2003 dans une table SQL Server
    Par fainch dans le forum Développement
    Réponses: 6
    Dernier message: 08/12/2011, 22h59
  3. Nom de fichier image incrémenté dans une boucle for
    Par franck31 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/10/2011, 16h49
  4. Récupérer le nom du fichier en cours dans une variable.
    Par quiky dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/05/2009, 13h28
  5. Réponses: 20
    Dernier message: 22/03/2005, 21h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo