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 :

Parcour de table et suppression de ligne [WD20]


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Parcour de table et suppression de ligne
    Bonjour les amis, j'aimerais qu'on m'aide sur un problème que j'ai rencontré lors du parcours d'une table remplie par programmation.
    Lors du parcours de la table à chaque passage sur une ligne il y a une condition qui selon laquelle on supprime la ligne ou non.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    n est un entier 
    nNbrLigne est un entier = TableOccurrence(TABLE_LISTEDOCPERM)
    POUR i = 1 _A_ nNbrLigne
         TableSelectPlus(TABLE_LISTEDOCPERM,i)
         n = TABLE_LISTEDOCPERM.COL_ID_ParentDocP
         SI n = SAI_Val ALORS
            TableSupprime(TABLE_LISTEDOCPERM,TableSelect(TABLE_LISTEDOCPERM))
            SINON
            Info("Non")	
         FIN	
    FIN
    Le code ne s’exécute pas comment je le souhaite d'aider moi s'il vous plait

  2. #2
    Membre actif
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur COBOL

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Points : 270
    Points
    270
    Par défaut
    Bonjour Beast,

    Tout d'abord quand tu postes un code pour demande d'aide n'oublie pas d'utiliser les balises # ça rend le code lisible

    je reprends ton code en y mettant des balises tu vas voir la différence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    n est un entier 
    nNbrLigne est un entier = TableOccurrence(TABLE_LISTEDOCPERM)
    POUR i = 1 _A_ nNbrLigne
         TableSelectPlus(TABLE_LISTEDOCPERM,i)
         n = TABLE_LISTEDOCPERM.COL_ID_ParentDocP
         SI n = SAI_Val ALORS
            TableSupprime(TABLE_LISTEDOCPERM,TableSelect(TABLE_LISTEDOCPERM))
            SINON
            Info("Non")	
         FIN	
    FIN
    Ensuite tu dis que le résultat n'est pas celui que tu attends à l'exécution - mais encore ? peux tu préciser stp.

  3. #3
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Le code ne supprime qu'une ligne sur deux.
    En effet, on imagine une table de 3 lignes.
    L'indice i de la boucle POUR va donc prendre successivement les valeur 1, 2 puis 3.

    Au premier passage, i=1, on supprime la première ligne, la table ne contient plus que 2 lignes.
    Au deuxième passage, i=2, on supprime donc la 2e ligne de la table (qui était la 3e ligne au début du parcours). La table ne contient plus qu'une ligne.
    Au troisième passage, i=3, et je suppose que le TableSelectPlus et le test qui suit doivent indiquer un "non" (voir planter le programme).

    C'est un problème classique que tout le monde a rencontré au moins 1 fois dans sa vie de développeur.

    La solution la plus simple est de modifier la boucle pour partir de la dernière ligne et remonter la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    POUR i=nNbrLigne _A_ 1 PAS -1

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Tout d'abord merci d'avoir répondu, Comme vous l'aviez remarquer il y a une condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         SI n = SAI_Val ALORS
            TableSupprime(TABLE_LISTEDOCPERM,TableSelect(TABLE_LISTEDOCPERM))
            SINON
            Info("Non")	
         FIN
    la condition s’exécute pas comme je le souhaite quand la condition est vérifié une fois il y a un décalage dans le parcours il saute la prochaine ligne
    Par exemple si il y a 4 ligne dans la table et que la ligne N°1 et N° 2 doivent vérifier la condition pendant le parcours la première sera supprimé mais il vas sauter la seconde qui normalement doit vérifié la condition pour aller sur la ligne N°3.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Narwe Voir le message
    Le code ne supprime qu'une ligne sur deux.
    En effet, on imagine une table de 3 lignes.
    L'indice i de la boucle POUR va donc prendre successivement les valeur 1, 2 puis 3.

    Au premier passage, i=1, on supprime la première ligne, la table ne contient plus que 2 lignes.
    Au deuxième passage, i=2, on supprime donc la 2e ligne de la table (qui était la 3e ligne au début du parcours). La table ne contient plus qu'une ligne.
    Au troisième passage, i=3, et je suppose que le TableSelectPlus et le test qui suit doivent indiquer un "non" (voir planté le programme).

    C'est un problème classique que tout le monde à rencontré au moins 1 fois dans sa vie de développeur.

    La solution la plus simple est de modifier la boucle pour pour partir de la dernière ligne et remonté la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    POUR i=nNbrLigne _A_ 1 PAS -1
    Je viens de tester votre code et le problème est résolu. Grand merci pour votre aide.
    Et Merci à tout ceux qui ont bien voulu m'aider

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

    Là comme ça, je ferais ceci :
    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
    n est un entier 
    nNbrLigne est un entier = TableOccurrence(TABLE_LISTEDOCPERM)
    tabLignesASupprimer est un tableau d'entiers
    POUR i = 1 _A_ nNbrLigne
         TableSelectPlus(TABLE_LISTEDOCPERM,i)
         n = TABLE_LISTEDOCPERM.COL_ID_ParentDocP
         SI n = SAI_Val et TableauCherche(tabLignesASupprimer, TableSelect(TABLE_LISTEDOCPERM))=-1  ALORS
            Ajoute(tabLignesASupprimer, TableSelect(TABLE_LISTEDOCPERM))
          FIN	
    FIN
    TableauTrie(tabLignesASupprimer, ttDécroissant)
    si tabLignesASupprimer..Occurrence>0 Alors
         Info("Je supprime les lignes = "+TableauVersChaîne(tabLignesASupprimer, ", "))
    Sinon
         Info("Je n'ai aucune ligne à supprimer")
    fin
    Les lignes à supprimer sont-elles celles attendues?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/10/2010, 18h10
  2. Réponses: 2
    Dernier message: 26/01/2007, 15h28
  3. Réponses: 2
    Dernier message: 09/01/2007, 19h57
  4. suppression des ligne ds une table
    Par roger.pouamoun dans le forum Oracle
    Réponses: 6
    Dernier message: 28/07/2006, 12h00
  5. Suppression de ligne dans plusieurs table
    Par chris60 dans le forum Oracle
    Réponses: 6
    Dernier message: 27/04/2006, 17h46

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