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

Cobol Discussion :

[PC-Percobol] Vérifier une saisie.


Sujet :

Cobol

  1. #21
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Tu n'as pas bien lu,
    on passe par une zone de travail en PIC X de même longueur (ou mieux, plus grande) pour le Reverse. Juste pour le calcul du nbre de chiffres significatifs.
    Puis on fait l'extraction sur la donnée d'origine (le contenu de la zone de travail ne nous interesse pas en tant que donnée)

  2. #22
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Citation Envoyé par Homer-ac Voir le message
    Tu n'as pas bien lu,
    on passe par une zone de travail en PIC X de même longueur (ou mieux, plus grande) pour le Reverse. Juste pour le calcul du nbre de chiffres significatifs.
    Puis on fait l'extraction sur la donnée d'origine (le contenu de la zone de travail ne nous interesse pas en tant que donnée)
    Oui mais je manipule quelque chose que je ne comprends pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    000100 IDENTIFICATION DIVISION.
    000200 PROGRAM-ID. test.
           DATA DIVISION.
           WORKING-STORAGE SECTION.
               77 W-NUMERIC PIC 9(6).
               77 W-ALPHANUM PIC X(6).
               77 W-TEMP PIC X(6).
               77 WS-CNT PIC 9.
               77 W-WORK PIC X(6).
           PROCEDURE DIVISION.
           DEBUT.
             MOVE 123 TO W-ALPHANUM
             MOVE FUNCTION REVERSE(W-ALPHANUM) TO W-WORK
             MOVE 0 TO WS-CNT
             INSPECT W-WORK TALLYING WS-CNT FOR LEADING SPACE
             COMPUTE WS-CNT = LENGTH OF W-ALPHANUM - WS-CNT
             Move W-ALPHANUM(1:WS-CNT) to W-NUMERIC
             IF W-ALPHANUM IS NUMERIC THEN
               DISPLAY "["W-NUMERIC"]"
             END-IF
             ACCEPT W-TEMP
           FIN.
    C'est plus de l'ordre de ce que je dois faire ?

    Si oui, une seule remarque :3

    Lorsque je lui demande de l'afficher si c'est un numérique, il ne m'affiche rien
    Si je lui demande de m'afficher si c'est un non numérique, il me sort [000123]

    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  3. #23
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Move W-ALPHANUM(1:WS-CNT) to W-NUMERIC
             IF W-ALPHANUM IS NUMERIC THEN
               DISPLAY "["W-NUMERIC"]"
             END-IF
    W-ALPHANUM ne nous intéresse pas, il n'est pas (le plus souvent) numérique
    W-NUMERIC est déclaré en Pic 9. Il contiendra la bonne valeur sauf si bien entendu ce qu'il y a avant les blancs ne l'est pas. Dans ce cas la bonne formule est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Move W-ALPHANUM(1:WS-CNT) to W-NUMERIC
             IF W-ALPHANUM(1:WS-CNT) IS NUMERIC THEN
               DISPLAY "["W-NUMERIC"]"
             END-IF
    NB. On peut aussi bien tester directement IF W-NUMERIC is NUMERIC sur une zone en Pic 9. Un Move ne provoque pas de plantage, c'est une opération non controlée, même un IF (sauf cas de test NUMERIC) sur une zone en PIC 9 qui peut planter ensuite.

  4. #24
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Bonjour à tous.

    Beaucoup de bonnes solutions et de variantes.

    @Deallyra, les autres aussi
    - Dans la solution d'Homer-ac :
    Le bon résultat est dans W-NUMERIC, W-ALPHANUM est resté tel quel.
    Il faudrait faire le test sur W-NUMERIC, si tu veux le faire avec W-ALPHANUM (qui est en pic X...), il faut remettre W-NUMERIC dédans.
    Cette solution, qui marche bien, est du pur et dur Cobol. Pour qu'elle soit encore plus efficace et traiter le cas où la saisie commencerait par des blancs, fait un inspect replacing all leading space by zero avant de faire le reverse, ça remplace les blancs de début par des zéros, chose qui n'est pas gênante, plutôt souhaitable même.

    - Function NUMVAL est préférable si tu l'as, elle permet de cadrer entre autre sur le point décimal si tu en saisis un (. ou ,), bien entendu pour d'autres traitements.

    - Dans le cas précis que tu as tu 'as même pas à tester la numéricité : tu fais la conversion et tu enchaîne par la recherche du n° de vol, si INVALID il est mauvais, alpha, inexistant, etc... en tous cas pas dans le fichier des vols.

    - les autres solutions ne sont pas à négliger, même la "bourrinique" de mon ami el_slapper que j'utilise d'ailleurs moi-même mais en plus chiadé avec suppression de tous les caractères superflus, recherche du point décimal, cadrage et tutti quanti.

    - Une autre solution consiste à faire de la saisie formatée, davantage sous le contrôle du système (enfin le logiciel Cobol et l'OS) que par ton programme, en utilisant une SCREEN SECTION si ton compilo le permet.

    EDIT: Télescopage avec le post d'Homer-ac : Sorry

  5. #25
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    NB. On peut aussi bien tester directement IF W-NUMERIC is NUMERIC sur une zone en Pic 9. Un Move ne provoque pas de plantage, c'est une opération non controlée, même un IF (sauf cas de test NUMERIC) sur une zone en PIC 9 qui peut planter ensuite.
    Hum...

    Lorsque je place un "f" dans une zone 9(X), il m'affichera X fois un 0.

    Mais ce n'est pas 0 qu'il aura en mémoire ?

    EDIT : Ta solution fonctionne, merci beaucoup.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  6. #26
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    @Hédhili Jaïdane

    Mon compilateur me permet en effet les SCREEN SECTION mais je ne comprends pas trop leur utilité pour, par exemple, ne faire la demande que du numéro de vol à saisir.


    J'ai prit en compte toutes les remarques précédentes, dont celle qui fait que si je teste le START sur une mauvaise clef saisie, j'aurais l'exception INVALID KEY de soulevée.

    Je l'avoue franchement, je n'y avais pas pensé... A le gérer ainsi.


    Merci à tous pour vos contributions à mon problème.
    Passez une bonne fin de soirée.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  7. #27
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Télescopage Hédhili Jaïdane, et un bonjour en passant.
    J'ajouterai juste que la méthode que j'ai proposé sur un Reverse dans une zone de travail à l'avantage de faire appel à une fonction assez commune, tout au moins pour les langages que je pratique. Je fais assez souvent du REXX sous z/OS et ça m'a souvent servi. Au fait, REXX, en tant que langage SAA existe aussi sur iseries non ?. Sous z/OS en tous cas il est souvent la parade pour résoudre les cas que l'on ne sait pas traiter par ailleurs. Langage facile mais boulet en termes de performances.
    Nb. J'ai posté ce jour un COBOL de 2/3 pages pour faire ce que fait un REXX de 10 lignes (en commentaires dans le source). Sauf que COBOL fera ça 20 fois plus vite au minimum !

  8. #28
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    ...Mon compilateur me permet en effet les SCREEN SECTION mais je ne comprends pas trop leur utilité pour, par exemple, ne faire la demande que du numéro de vol à saisir.
    ça t'évitera de faire la conversion, déjà à la frappe, le système ne te permettra de saisir que du numérique puis il fera le cadrage nécessaire.
    J'ai pris en compte toutes les remarques précédentes, dont celle qui fait que si je teste le START sur une mauvaise clef saisie, j'aurais l'exception INVALID KEY de soulevée. Je l'avoue franchement, je n'y avais pas pensé... A le gérer ainsi....
    Un START est inutile si tu n'as pas de recherche séquentielle à faire, un READ INVALID et le tour est joué, si on interroge un vol c'est qu'on veut aussi afficher des informations, donc un READ sera nécessaire.

    - Tiens bien compte de l'histoire de l'INSPECT que j'ai évoqué dans le post précédent.

    Bonsoir.

  9. #29
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    C'est noté pour l'inspect

    Pour le read invalid... Invalid était une cause que je ne connaissais pas au READ :/

    Mais... Un read suffit ? Si oui, c'est si je dois parcourir séquentiellement le fichier seulement.

    Je ne vais pas pouvoir cibler directement l'enregistrement par son identifiant.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  10. #30
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Lorsque je place un "f" dans une zone 9(X), il m'affichera X fois un 0.
    Mais ce n'est pas 0 qu'il aura en mémoire ?
    En codification ASCII, f vaut x'66'
    En codification ABCDIC, f vaut x'86'
    Le compilateur va forcer le signe du dernier caractère en Pic 9 pour s'assurer qu'il est numérique, il y a donc altération du contenu de ce seul caractère qui peut effectivement passer numérique. Tu as raison, tu élimines les risques de seul cas en testant la zone d'origine soit : IF W-ALPHANUM(1:WS-CNT) IS NUMERIC THEN ...

  11. #31
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Homer-ac Voir le message
    Télescopage Hédhili Jaïdane, et un bonjour en passant.
    J'ajouterai juste que la méthode que j'ai proposé sur un Reverse dans une zone de travail à l'avantage de faire appel à une fonction assez commune, tout au moins pour les langages que je pratique. Je fais assez souvent du REXX sous z/OS et ça m'a souvent servi. Au fait, REXX, en tant que langage SAA existe aussi sur iseries non ?. Sous z/OS en tous cas il est souvent la parade pour résoudre les cas que l'on ne sait pas traiter par ailleurs. Langage facile mais boulet en termes de performances.
    Nb. J'ai posté ce jour un COBOL de 2/3 pages pour faire ce que fait un REXX de 10 lignes (en commentaires dans le source). Sauf que COBOL fera ça 20 fois plus vite au minimum !
    Itou. Un plaisir de te voir toujours actif sur z/OS et Cobol.
    REXX existe sur iSeries, je ne sais pas s'il s'agit du même ou c'est différent. Je ne le pratique pas souvent.

    Mes connaissances des mainframe datent des années 78/83 (360-370-43xx) DOS, DOS/VS, DOS/VSE, CICS

  12. #32
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    ... Invalid était une cause que je ne connaissais pas au READ :/
    La documentation !!!
    Mais... Un read suffit ? Si oui, c'est si je dois parcourir séquentiellement le fichier seulement.

    Je ne vais pas pouvoir cibler directement l'enregistrement par son identifiant.
    Si ta clé est bien renseignée, le READ direct accède à l'enregistrement qui a cette valeur de clé et en même temps te renvoie les données, contrairement au START EQUAL qui ne fait que pointer sur l'enregistrement.

    Maintenant supposons que ta clé est composée de 2 zones : le N° du vol et le N° du dossier passager.
    - si tu as le N° du vol et le N° du dossier, tu accèdes directement aux infos du passager par un seul READ,
    - par contre si tu as le N° du vol mais pas le N° du dossier et tu veux le chercher ou lister tous les dossiers, alors on renseigne la partie majeure de la clé qui est le N° du vol, on initialise par la plus petite valeur (SPACES, ZEROS ou LOW-VALUE) la clé mineure (la partie mineure) qui est le N° du dossier, on fait un START NOT LESS ou GREATER puis on lit en séquence (READ NEDXT) jusqu'au changement de la clé majeure ou la fin du fichier.
    - on peut combiner dans le même programme et sur le même fichier, si son organisation le permet, un accès DIRECT ou RANDOM et un accès SEQUENTIAL en déclarant un accès DYNAMIC. Certains compilateurs vont jusqu'à permettre l'accès au premier enregistrement READ FIRST (ce n'est pas la lune), au dernier READ LAST et en marche arrière READ PRIOR.

    AMHA une lecture de la doc éditeur, même en diagonale, te montrera ce que ton compilo est capable de faire.

  13. #33
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    SAA veut dire Standard Architecture, un concept IBM depuis VM (les années 70). Donc peu de différences entre REXX zseries et iseries. Comme Cobol, quelques fonctions en + ou en -, et des différences éventuelles dans l'ordre EXECIO pour les lectures écritures. Pas de pb de conversion de données en tous cas avec ce langage (il n'y a pas de déclaration de variable, ni de format, ni de longueur), le rêve, si ce n'était un langage interprété donc à la rame.

  14. #34
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Homer-ac Voir le message
    SAA veut dire Standard Architecture, un concept IBM depuis VM (les années 70)....
    Oui, ça je sais. Par contre pour les différences entre les REXX, s'il y en a ou pas, comme je ne pratique pas, je préfère dire que je ne sais pas ...

  15. #35
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 176
    Points : 188
    Points
    188
    Par défaut
    Je suis un boulet :
    C'est normal que ca te fasse erreur overflow sur mon exemple :

    Unstring découpe ta string a chaque fois qu'il croise un espace.

    ici, il croise 123, puis 3 espaces

    il va donc mettre 123 dans la première variable
    rien dans la 2e
    rien dans la 3e
    rien dans la 4e

    comme tu n'en as défini qu'une, ca fait un overflow (mais un overflow pas grave)

    donc en fait ca fonctionne mais ca te remonte un display d'erreur alors que c'est un fonctionnement normal.

    retire juste le "erreur unstring" puisque ce n'est pas une erreur.

    Attention cependant, comme l'unstring découpe selon espace donc si tu notes "1(espace)test" ca prendra 1 et ca ne sortira pas d'erreur

    Je pense que ma proposition et/ou celle d'homer (on se rejoint dans l'idée, le but étant de déterminer la taille de l'enregistrement numérique pour ensuite faire le test "is numeric" seulement sur cette partie) sont un peu plus simple, mais en revanche moins puissante (au niveau de la gestion des décimales, etc...) donc a voir selon tes besoins

  16. #36
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            UNSTRING W-ALPHANUM DELIMITED BY " " 
              INTO W-NUMERIC COUNT IN W-LG
              ON OVERFLOW
              DISPLAY "Erreur overflow"
            END-UNSTRING
    UNSTRING identifier-1
    [DELIMITED BY [ALL] {identifier-2|literal-1} [OR [ALL] {identifier-3|literal-2}]…]
    INTO {identifier-4 [DELIMITER IN identifier-5] [COUNT IN identifier-6]} …
    [WITH POINTER identifier-7]
    [TALLYING IN identifier-8]
    [ON OVERFLOW imperative-statement-1]
    [NOT ON OVERFLOW imperative-statement-2]
    [END-UNSTRING]
    Avec "12 345" saisi dans la zone, pour récupérer 12 puis 345, j'aurais donc du faire ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            UNSTRING W-ALPHANUM DELIMITED BY " " 
              INTO W-NUMERIC-1 COUNT IN W-LG, W-NUMERIC-2 COUNT IN W-LG
              ON OVERFLOW
              DISPLAY "Erreur overflow"
            END-UNSTRING
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  17. #37
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Aucun des tests qu'a pu faire Deallyra avec SQL n'a abouti lors de la compilation. Je suis donc assez sûr que SQL n'est supporté en Percobol que si on lui ajoute quelque chose, mais quoi, je vous le demande ?

  18. #38
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Et pourtant, dans la documentation :

    Each of these SQL statements begins with EXEC SQL and ends with END-EXEC. The SQL statement itself is between the EXEC and END-EXEC. The SQL statements may not be streamed together; each must have its own EXEC and END-EXEC.
    Some Cobol systems use a pre-compiler to compile the Cobol with SQL code into plain Cobol code, where the Cobol code may have certain calls out to system functions to perform the SQL operations. Rather than using a separate pre-compiler, PERCobol supports embedded SQL directly, compiling it to support JDBC code.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  19. #39
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Vous savez quoi ? Moi je suis pour reprendre la solution d'el_slapper, d'étendre le test à tous les caractères non numériques. Elle aura l'avantage d'extraire les digits 0 à 9 quelques que soient les autres caractères qui peuvent s'y mêler.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    000010$SET VSC2 OSVS COMP
    000020 Identification Division.
    000030 Program-Id. ESSNUMB-CBL.
    000040***************************************************************
    000050*                                                             *
    000060*     Test Saisie d'un Numérique en format libre              *
    000070*                                                             *
    000080***************************************************************
    000090*
    000100 Author. H.JAIDANE.
    000110 Environment Division.
    000120 Configuration Section.
    000130 Source-Computer. IBM-PS2.
    000140 Object-Computer. IBM-PS2.
    000150 Special-Names.
    000160     Decimal-point is comma.
    000180 Input-Output Section.
    000190 File-Control.
    
    000350*
    000360 Data Division.
    000370 File Section.
    000520*
    000530 Working-Storage Section.
    000000 77   X pic x.
    000000 77   I pic 9(4) comp.     
    000000 77   J pic 9(4) comp.     
    000000 01   WMONTANT pic 9(9).     
    000000 01   YMONTANT pic x(9) redefines WMONTANT.     
    000000 01   XMONTANT pic x(9).     
    000000 01   WFIN     pic x.
    000000      88 FIN-TRAIT value "1".     
    005600*
    005610 Procedure Division.
    000000 TRAIT.
    000000     move 0 to WFIN.
    000000     perform SAISIE until FIN-TRAIT.
    000000     stop run.
    008360 SAISIE.
    000000     display " "
    000000     display "Donner Montant : "
    000000     accept XMONTANT
    000000     if XMONTANT = spaces or low-value move 1 to WFIN
    000000     ELSE move zeros to YMONTANT 
    000000          perform 
    000000          move length of YMONTANT to J add 1 to J
    000000          perform varying I from length of XMONTANT by -1 
    000000                            until I = 0
    000000                  move XMONTANT(I:1) to X
    000000                  if X numeric  
    000000                     subtract 1 from J
    000000                     move XMONTANT(I:1) to YMONTANT(J:1)
    000000          end-perform
    000000          display "Montant Saisie     = " XMONTANT
    000000          display "Montant Transformé = " YMONTANT
    000000          display "Montant Numérique  = " WMONTANT
    000000     end-if.
    ou alors une saisie formatée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    000010$SET VSC2 OSVS COMP
    000020 Identification Division.
    000030 Program-Id. ESSNUMF-CBL.
    000040***************************************************************
    000050*                                                             *
    000060*     Test Saisie d'un Numérique Formaté         *
    000070*                                                             *
    000080***************************************************************
    000090*
    000100 Author. H.JAIDANE.
    000110 Environment Division.
    000120 Configuration Section.
    000130 Source-Computer. IBM-PS2.
    000140 Object-Computer. IBM-PS2.
    000150 Special-Names.
    000160     Decimal-point is comma.
    000180 Input-Output Section.
    000190 File-Control.
    
    000350*
    000360 Data Division.
    000370 File Section.
    000520*
    000530 Working-Storage Section.
    000000 01   WFIN     pic x.
    000000      88 FIN-TRAIT value "1".     
    000000 01   WMONTANT pic 9(6)v999.     
    001820*
    001830 Screen Section.
    001840 01  ECRAN-VIDE.
    001850     03 blank screen line 1 column 1.
    002730*
    002740 01  ECRAN-DONNEES.
    002940     03 Foreground-Color 2 pic x(10) From "Montant : ".
    002950     03 pic x From "[".
    003120     03 Using WMONTANT pic z(5)9,999
    003130        auto Highlight.
    002980     03 pic x From "]".
    005600*
    005610 Procedure Division.
    008360 AFF-ECRAN-VIDE.
    000000     display ECRAN-VIDE.
    000000 TRAIT.
    000000     move 0 to WFIN.
    000000     perform AFF-ECRAN-DONNEES thru CONTROLE-DONNEES-FIN
    000000             until FIN-TRAIT.
    008360     perform AFF-ECRAN-VIDE.
    000000     stop run.
    008360 AFF-ECRAN-DONNEES.
    000000     display ECRAN-DONNEES.
    008550 LEC-ECRAN-DONNEES.
    000000     accept ECRAN-DONNEES.
    008650 CONTROLE-DONNEES.
    000000     if WMONTANT = 0 move 1 to WFIN
    000000     ELSE add 1111,111 to WMONTANT.
    008810 CONTROLE-DONNEES-FIN.

  20. #40
    Membre habitué
    Profil pro
    Inscrit en
    Février 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 176
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Avec "12 345" saisi dans la zone, pour récupérer 12 puis 345, j'aurais donc du faire ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            UNSTRING W-ALPHANUM DELIMITED BY " " 
              INTO W-NUMERIC-1 COUNT IN W-LG, W-NUMERIC-2 COUNT IN W-LG
              ON OVERFLOW
              DISPLAY "Erreur overflow"
            END-UNSTRING
    retire la virgule entre les deux variables et c'est bon:
    ATTENTION : je vois à tes noms de variable que tu essayes de mettre le résultat dans une donnée numérique. Je ne suis pas sur que ca marche (possible que oui comme dans un move, mais possible que non vu que unstring est sensé sortir des chaines de caractères...)

    ce que je proposais au départ, c'est juste d'en profiter pour avoir la taille de la donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    W-ALPHANUM pic X(6)
    W-TEMP-1 pic X(6)
    W-LG PIC 9(2)
    
    (...)
    
            UNSTRING W-ALPHANUM DELIMITED BY " " 
              INTO W-TEMP-1 COUNT IN W-LG
              W-TEMP-2 COUNT IN W-LG2 (si besoin)
              W-TEMP-3 COUNT IN W-LG3 (si besoin)
              W-TEMP-4 COUNT IN W-LG4 (si besoin)
              ON OVERFLOW
              DISPLAY "overflow"
            END-UNSTRING
    Mais dans ton cas, pourquoi devrait il y avoir "12 345"? je croyais que tu étais sensé avoir un test "is_numeric" et "12 345" n'est pas sensé etre considéré comme numérique...

    donc dans ton cas juste ca ca marchera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (data à ajouter par rapport à ce que tu as déjà dans ton code:)
    W-TEMP-1 pic X(6)
    W-LG PIC 9(2)
    
    
            UNSTRING W-TEMP DELIMITED BY " " 
              INTO W-TEMP-1 COUNT IN W-LG          
            END-UNSTRING
    
    if W-W-TEMP(1:W-LG) is numeric
    (...)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. comment vérifier une saisie d'entrée est valide
    Par helene0618 dans le forum C#
    Réponses: 9
    Dernier message: 19/02/2008, 18h27
  2. Réponses: 1
    Dernier message: 06/12/2007, 11h47
  3. Comment vérifier une URL saisie dans mon formulaire ?
    Par cdevl32 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 28/10/2007, 18h32
  4. Réponses: 9
    Dernier message: 05/04/2007, 16h23
  5. [Formulaire]vérifier une saisie dans une zone de liste
    Par ludovicparis dans le forum IHM
    Réponses: 6
    Dernier message: 02/04/2007, 14h51

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