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

WinDev Discussion :

CHAINE MULTILIGNE : remplir une table [WD18]


Sujet :

WinDev

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 71
    Points : 62
    Points
    62
    Par défaut CHAINE MULTILIGNE : remplir une table
    Bonjour

    Je retourne vers vous après une journrnée de tentative afin d'extraire la chaine suivante pour remplir une table.
    Voici la chaine à traiter contenue dans fichier texte
    REF+100100
    Date+110717
    QTE+10
    REF+200200
    Date+110717
    QTE+20
    Resultat souhaite :

    100100 110717 10
    200200 110717 20
    J arrive uniquement avoir les REF mais pas les dates ni les qtés , voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    / ouvre le fichier à lire
    Handelfichier = fOuvre("D:\Texte.txt",foLecture) //ouverture fichier à lire passé en paramètre
    SI Handelfichier=-1 ALORS // traitement erreur
    Info(ErreurInfo())
    SINON
    // Début lecture du fichier texte
    LigneLue = fLitLigne(Handelfichier)
    TANTQUE LigneLue<>EOT // tant qu'on n'a pas atteint la fin du fichier
    Schaine = ExtraitChaîne(LigneLue,1,"+",DepuisDébut)
    SI Schaine = "REF" ALORS
    REF = ExtraitChaîne(LigneLue,2,"+",DepuisDébut)	
    Tableajouteligne(Table_test,REF)
    Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il suffit de remplacer ton SI dans la boucle par un SELON, de noter le numéro de la ligne ajoutée dans le cas d'une REF, et d'affecter les bonnes colonnes dans les autres cas.

    Tatayo.

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 266
    Points
    5 266
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Je traduis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nCompteur++
    SELON Majuscule(sChaine) //On n'est pas à l'abri d'une faute de frappe dans le fichier txt
         CAS "REF":
              sRef=ExtraitChaîne(LigneLue,2,"+",DepuisDébut)
         CAS "DATE":
             sDate=ExtraitChaîne(LigneLue,2,"+",DepuisDébut)
         CAS "QTE":
            sQte=ExtraitChaîne(LigneLue,2,"+",DepuisDébut)
    FIN
    Si nCompteur=3 ALORS
         Tableajouteligne(Table_test,sRef,sDate,sQte)
         nCompteur=0
    FIN
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Bonjour,

    En plus simple,
    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
    sToto est une chaîne = [
    	REF+100100
    	Date+110717
    	QTE+10
    	REF+200200
    	Date+110717
    	QTE+20 
    ]
    Chaine_a_ajouter est chaîne 
     
    // Début lecture du fichier texte
    POUR TOUTE CHAÎNE schaine DE sToto SEPAREE PAR RC
    	Chaine_a_ajouter += [TAB] + ExtraitChaîne(schaine,2,"+",DepuisDébut)
    	SI ExtraitChaîne(schaine,1,"+",DepuisDébut) ~= "qte" ALORS
    		TableAjoute(TABLE_SansNom1,Chaine_a_ajouter)
    		Chaine_a_ajouter = ""
    	FIN
    FIN
    Adapté à ton code ça donne:
    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
    // ouvre le fichier à lire
    Handelfichier = fOuvre("D:\Texte.txt",foLecture) //ouverture fichier à lire passé en paramètre
    SI Handelfichier=-1 ALORS // traitement erreur
    	Info(ErreurInfo())
    SINON
    	// Début lecture du fichier texte
    	LigneLue = fLitLigne(Handelfichier)
    	TANTQUE LigneLue<>EOT // tant qu'on n'a pas atteint la fin du fichier
    		Chaine_a_ajouter += [TAB] + ExtraitChaîne(LigneLue,2,"+",DepuisDébut)
    		SI ExtraitChaîne(LigneLue,1,"+",DepuisDébut) = "QTE" ALORS
    			TableAjoute(TABLE_SansNom1,Chaine_a_ajouter)
    			Chaine_a_ajouter = ""
    		FIN
    	FIN
    FIN
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans la documentation de la fonction fOuvre, il est dit cela:
    Pour manipuler des fichiers externes de type texte, il est conseillé d'utiliser les fonctions fChargeTexte/fSauveTexte et fChargeBuffer/fSauveBuffer.
    En suivant cette recommandation, le code serait plutôt comme cela:
    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
    Handelfichier=fChargeTexte("D:\Texte.txt")
    sREF est une chaine=""
    sDate est une chaine=""
    sQTE est un numérique=0
    sColonne est une chaine=""
    POUR TOUTE CHAÎNE sContenuLigne DE sToto SEPAREE PAR RC
          sColonne=SansEspace(ExtraitChaine(sContenuLigne,1,"+"))
          SELON Majuscule(sColonne)
               CAS "REF"
                      sREF=SansEspace(ExtraitChaine(sContenuLigne,2,"+"))
               CAS "DATE"
                      sDate=SansEspace(ExtraitChaine(sContenuLigne,2,"+"))
               CAS "QTE"
                      sQTE=Val(ExtraitChaine(sContenuLigne,2,"+"))
          FIN
     
          SI Majuscule(sColonne)="QTE" Alors
                TableAjouteLigne(TABLE_SansNom1,sREF,sDate,sQTE)
                sREF=""
                sDate=""
                sQTE=0
          FIN
    FIN
    @philouZ: dans la documentation de la fonction TableAjoute, il est marqué cela :
    Remarque : Il est conseillé d'utiliser la fonction TableAjouteLigne.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Citation Envoyé par romulus001 Voir le message
    Bonjour,
    @philouZ: dans la documentation de la fonction TableAjoute, il est marqué cela :
    Yes je sais !!! Mais dans son cas, cela va beaucoup plus vite car il n'y a pas de tabulation dans sa chaine. Le TableAjoute pose problème si dans une de tes chaines tu as des tabulations, sinon dans ce cas précis, simplification de code.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par philouZ Voir le message
    Le TableAjoute pose problème si dans une de tes chaines tu as des tabulations
    Je suis au courant de cela et c'est justement pour cela que je n'en sers pas, en même temps, ce qui est pratique avec TableAjouteLigne, c'est qu'on voit les noms des attributs (à condition de ne pas faire de saut de ligne), contrairement à TableAjoute.
    Ce que j'ai voulu dire c'est qu'il fallait prendre de bonnes habitudes en suivant les recommandations de PC SOFT, c'est tout

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Ce que j'ai voulu dire c'est qu'il fallait prendre de bonnes habitudes en suivant les recommandations de PC SOFT, c'est tout
    Je suis 100% d'accord avec toi. Perso je n'utilise jamais TableAjoute pour les problèmes cités c'était le moment de l'utiliser...
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Maintenant, j'utilise de moins en moins la fonction TableAjouteLigne, je fais plutôt un remplissage par databinding à l'aide d'une variable globale, je trouve que c'est encore plus souple de procéder ainsi, car si on insère une nouvelle colonne, mettre à jour les paramètres de TableAjouteLigne peut parfois être un vrai calvaire :p
    En faisant un remplissage par databinding à l'aide d'une variable globale, il n'y a aucune question à se poser

  10. #10
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    Bonjour

    Je vous remercie tous c'est intéressant , grace à vous conseils j'arrive a avoir le resultat souhaité , avant de mettre cette discussion en resolue , une dernière question, supposons que j a'i la chaine suivante :
    CDE+A100
    REF+100100
    Date+110717
    QTE+50
    REF+200200
    Date+110717
    QTE+60
    CDE+A200
    REF+100100
    Date+110717
    QTE+10
    REF+200200
    Date+110717
    QTE+20
    comment peut on avoir pour chaque CDE les valeurs correspondantes : on creant l'entete de la commande valeur "CDE" avec ses lignes les REF + DATE + QTE.

    Merci infiniment.

    Crdt
    Totik

  11. #11
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    Bonjour

    Enfin , j ai trouvé ce que je souhaite avoir comme traitement, voici le code au cas cela peut servir à quelqu'un. merci à vous tous encore une fois :

    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
     
    //
    Lignelue est une chaîne
    SAI_commande est une chaîne = ""
    COE est une chaîne = ""
    CDE est une chaîne = ""
    REF est une chaîne = ""
    DATTE est une chaîne = ""
    DATTTE est une Date 
    QTE est un entier = 0
    Scolonne est une chaîne = ""
    Lignelue = fChargeTexte("D:\test.txt")
    POUR TOUTE CHAINE sContenuLigne DE Lignelue SEPAREE PAR RC
      Scolonne=SansEspace(ExtraitChaîne(sContenuLigne,1,"+"))
      SELON Majuscule(Scolonne)
        CAS "COE"
          COE = SansEspace(ExtraitChaîne(sContenuLigne,2,"+"))
        CAS "CDE"
          CDE = SansEspace(ExtraitChaîne(sContenuLigne,2,"+"))	
          HLitRecherchePremier(Client,Code,COE)
          HLitDernier(Commande,IDCOMMANDE)
          ....
          HAjoute(Commande)
        CAS "REF"
          REF = SansEspace(ExtraitChaîne(sContenuLigne,2,"+"))	
        CAS "DATE"
          DATTE = SansEspace(ExtraitChaîne(sContenuLigne,2,"+"))	
        CAS "QTE"
          QTE = Val(SansEspace(ExtraitChaîne(sContenuLigne,2,"+")))
      FIN
      SI Majuscule(Scolonne)="QTE" ALORS
        HLitRecherchePremier(articles,Référence,REF)
        .....
        HAjoute(LigneCde)
        CDE = ""
        REF = ""
        DATTE = ""
        QTE = ""
        COE = ""
      FIN
    FIN
    Crdt

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Totik Voir le message
    SAI_commande est une chaîne = ""
    ce choix de nom de variable n'est pas très judicieux car les champs de saisi ont par défaut, un nom qui commence par SAI, de plus, cette variable n'est pas utilisée dans le bout de code donc cette ligne peut être supprimée.

  13. #13
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Ton problème est résolu... parfait.

    Dans les lignes 31 à 40 de ton code, tu passes par un SI ... ALORS ...FIN.
    Pourquoi ne pas avoir mis cela dans le SELON ... FIN ?

    Par ailleurs, j'ajouterais des commentaires dans le code ; si tu ajoutes ces commentaires aujourd'hui, tu auras moins de problème le jour où tu en auras besoin.

    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
     
    // Ce code traite des fichiers  du type :
    //CDE+A100
    //REF+100100
    //Date+110717
    //QTE+50
    //REF+200200
    //Date+110717
    //QTE+60
    //CDE+A200
    //REF+100100
    //Date+110717
    //QTE+10
    //REF+200200
    //Date+110717
    //QTE+20
     
    // A partir de ce fichier, le programme va écrire 4 enregistrements ( CDE=A100, REF=100100,DATE=110717,QTE=50  ; A100,200200,110717,100  ; A200,100100,110717,10  ;  A200,200200,110717,20 )
    // L'ordre des enregistrements est très important, si au lieu d'avoir   REF puis DATE puis QTE  on a  REF puis QTE puis DATE, le programme donnera un résultat faux.
    En effet, dans ton traitement, tu exploites le fait que la QTE arrive après la REF et la DATE.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplir une Table avec 2 tables
    Par Titouf dans le forum Oracle
    Réponses: 4
    Dernier message: 03/11/2005, 09h35
  2. comment remplir une table
    Par donny dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/07/2005, 11h22
  3. remplir une table en fonction des résultats
    Par Psychomantis dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 19/10/2004, 12h22
  4. [SWT] Comment remplir une Table ?
    Par simon77 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 23/08/2004, 10h31
  5. remplir une table avec UTL_FILE.GET_LINE
    Par delphim dans le forum SQL
    Réponses: 9
    Dernier message: 12/03/2004, 10h15

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