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 :

difficulté ajout dans table [WD21]


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    resp centre de plongee
    Inscrit en
    Septembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : resp centre de plongee
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 17
    Points : 14
    Points
    14
    Par défaut difficulté ajout dans table
    Bonjour à tous

    Je me remets à la programmation sur WinDev que j'avais laissé de côté depuis un certain temps, cela expliquera ma question.

    de manière sommaire, j'ai un fichier avec un nom prenom date et lieu

    j'affiche ce fichier sous forme de table après l'avoir au préalable trié à l'aide d'une clé "date"

    tout fonctionne, cela m'affiche les noms, prenoms et la bonne date

    maintenant, je souhaite ajouter un même lieu pour toutes les éléments affichés. Je passe par une combo pré renseigné, tout fonctionne bien pour la combo et le choix du lieu
    en revanche pour inscrire le nom du lieu dans toutes les fiches affichées, bin... ça merdoie.

    J'ai fait pour l'instant 2 trucs qui coincent et ne me donnent pas satisfction :

    1 ) pour toute ligne de table_affichée

    col_lieu=combop_lieu

    fin

    hmodifie(fichier)

    là seule la première ligne est modifiée


    2) j'utilise apres pour toute ligne de ... l'ordre tablemodifieligne en rentrant la valeur et là ça merdouille aussi

    une idée simple ??

    Merci par avaznce

  2. #2
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 57
    Points : 102
    Points
    102
    Par défaut
    bonjour,

    le code pour modifier toutes les lignes d'une fichier (une par une ce qui n'est pas optimiser il faudrait faire une requete SQL pour le faire faire a HF en une seule fois) mais bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Hlitpremier(monFichier,maCle)
    tantque pas hendehors(monfichier)
        monFichier.maRubrique="Toto"
        hmodifie(Monfichier)
        hlitsuivant(monFichier,macle)
    Fin
    voila maisz ce serait optimisé avec une requete SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HExécuteRequête("update monFichier Set maRubrique='"+"toto"+"'", hRequêteDéfaut, 1)

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 777
    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 777
    Points : 5 191
    Points
    5 191
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    es-tu allé voir du côte dé TableEnregistre https://doc.pcsoft.fr/?3074008.
    Pour utiliser TableModifieLigne, il faut que la saisie en cascade soit activée.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 57
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Bonjour,
    es-tu allé voir du côte dé TableEnregistre https://doc.pcsoft.fr/?3074008.
    Pour utiliser TableModifieLigne, il faut que la saisie en cascade soit activée.
    plus simple non mais cela fait une maj par ligne
    et si on doit modifier toutes les lignes avec une valeur faudrait un meca qui le fait en une seule fois
    mais la solution est correcte (pas optimiser mais ca marcherait correctement : car cela fait la meme chose cote windev que lecture d'une ligne , maj de la ligne) mais avec une focntion windev
    donc pas de souci de ce cote ca reduit le code pour le parcous de chaque ligne et maj de chaque ligne en une seule ligne de code controlée par windev

    mais cela n'optimise pas le traitement
    on aura pour un fichier de 50 000 ligne (50 000 lecture et 50 000 maj) alors qu'en requete SQL 1 maj de 50 000 lignes
    mais la solution que tu donnes le fait avec une seule ligne de code pour 50 000 lecture et 50 000 maj

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 038
    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 038
    Points : 9 347
    Points
    9 347
    Par défaut
    Pourquoi le code initial ne marche pas ? Ca me paraît important de le comprendre pour ne pas refaire la même erreur.

    Quand tu as une table comme ça qui affiche des données, et que tu modifies ce qui apparaît à l'écran, il se passe quoi ?

    Windev a en tête 2 informations, totalement indépendantes l'une de l'autre. Si tu modifies une ligne de l'écran, il sait quelle est la ligne que tu modifies. Et indépendamment de ça, il a un 'pointeur' vers le fichier de données, qui pointe vers une ligne.

    Pour que le pointeur pointe vers une autre ligne du fichier de données, il faut des instructions comme hLitRecherche(), hLitSuivant(), hRecherche() ... (des fonctions qui commencent par h , comme toutes les fonctions d'accès aux données et qiu sont des fonctions de positionnement, ou de lecture...)

    Donc ici, la démarche c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     - Pour chaque ligne de la table que tu veux modifier  (par exemple, l'utilisateur sélectionne 5 ou 6 lignes avec la touche CTRL, et il faut modifier uniquement ces lignes là)
     -    Dans la ligne , il y a une information qui permet d'identifier clairement l'enregistrement ( code article par exemple)
     -    hLitRecherche( )   basé sur ce code article, pour retrouver l'enregistrement à modifier
     -    fichier.ville= nouvelle_valeur
     -    hmodifie()
     - FIN
    Après l'instruction hLitRecherche(), il faudrait même tester si Windev a bien trouvé la ligne voulue, avec une ligne du type : si pas htrouve() alors ...L'autre option, c'est effectivement de passer par des instructions de type SQL, mais c'est une autre histoire.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Update fichier set ville  = nouvelle_valeur where code_article in ( ... liste des codes à modifier ... )
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Membre à l'essai
    Homme Profil pro
    resp centre de plongee
    Inscrit en
    Septembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : resp centre de plongee
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Bonjour,
    es-tu allé voir du côte dé TableEnregistre https://doc.pcsoft.fr/?3074008.
    Pour utiliser TableModifieLigne, il faut que la saisie en cascade soit activée.
    Merci pour ton orientation, en effet, en utilisant la commande TableEnregistre, plutôt qur TableModifie cela marche bien.
    vpoila le petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Pour TOUTE LIGNE DE Table_Plongeurs_Site
    Table_Plongeurs_Site.COL_IDsite=COMBO_site
    TableEnregistre(TABLE_Plongeur_site)
    FIN
    pour éviter de chercher dans tout le fichier, je le filtre par rapport à la date voulue et je n'affiche que les plongeurs ayant plongés ce jour là.
    puis j'ajoute pour chacun des plongeurs le site choisi dans ma combo.


    MErci pour ton aide

  7. #7
    Membre à l'essai
    Homme Profil pro
    resp centre de plongee
    Inscrit en
    Septembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : resp centre de plongee
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par kool-Paladin Voir le message
    bonjour,

    le code pour modifier toutes les lignes d'une fichier (une par une ce qui n'est pas optimiser il faudrait faire une requete SQL pour le faire faire a HF en une seule fois) mais bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Hlitpremier(monFichier,maCle)
    tantque pas hendehors(monfichier)
        monFichier.maRubrique="Toto"
        hmodifie(Monfichier)
        hlitsuivant(monFichier,macle)
    Fin
    voila maisz ce serait optimisé avec une requete SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HExécuteRequête("update monFichier Set maRubrique='"+"toto"+"'", hRequêteDéfaut, 1)
    Merci pour ton aide. Je ne voulais pas travailler directement sur le fichier, car à la longue j'ai beaucoup de personnes à traiter. C'est la raison pour laquelle j'étais passé par un affichage filtré et je ne traite que les lignes de cet affichage trié.

    C'est peut être un peu moins esthétique, mais je craignais qu'à la longue le traitement soit un peu fastidieux

    Merci pour ton aide

  8. #8
    Membre à l'essai
    Homme Profil pro
    resp centre de plongee
    Inscrit en
    Septembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : resp centre de plongee
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Pourquoi le code initial ne marche pas ? Ca me paraît important de le comprendre pour ne pas refaire la même erreur.

    Quand tu as une table comme ça qui affiche des données, et que tu modifies ce qui apparaît à l'écran, il se passe quoi ?

    Windev a en tête 2 informations, totalement indépendantes l'une de l'autre. Si tu modifies une ligne de l'écran, il sait quelle est la ligne que tu modifies. Et indépendamment de ça, il a un 'pointeur' vers le fichier de données, qui pointe vers une ligne.

    Pour que le pointeur pointe vers une autre ligne du fichier de données, il faut des instructions comme hLitRecherche(), hLitSuivant(), hRecherche() ... (des fonctions qui commencent par h , comme toutes les fonctions d'accès aux données et qiu sont des fonctions de positionnement, ou de lecture...)

    Donc ici, la démarche c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     - Pour chaque ligne de la table que tu veux modifier  (par exemple, l'utilisateur sélectionne 5 ou 6 lignes avec la touche CTRL, et il faut modifier uniquement ces lignes là)
     -    Dans la ligne , il y a une information qui permet d'identifier clairement l'enregistrement ( code article par exemple)
     -    hLitRecherche( )   basé sur ce code article, pour retrouver l'enregistrement à modifier
     -    fichier.ville= nouvelle_valeur
     -    hmodifie()
     - FIN
    Après l'instruction hLitRecherche(), il faudrait même tester si Windev a bien trouvé la ligne voulue, avec une ligne du type : si pas htrouve() alors ...L'autre option, c'est effectivement de passer par des instructions de type SQL, mais c'est une autre histoire.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    Update fichier set ville  = nouvelle_valeur where code_article in ( ... liste des codes à modifier ... )
    merci pour ta réponse
    en fait concernant la modification de ce fichier, je ne souhaitais pas faire de recherche ligne à ligne qui me semblait il prendrait trop de temps à la longue si mon fichier comporte de tres nombreuses lignes. Du coup ce que je fais, mais peut être n'est ce pas "informatiquement correct" c'est le filtrage de mon fichier via une clé, (la date) puis je choisi au travers d'une combo la valeur à ajouter à toutes les lignes filtrées et je les enregistre.
    je pense que c'est plus rapide que de consulter tout le fichier et ajouter la valeur choisie aux items dont la clé de recherche correspondrait. Mais je me trompe peut être.

    Merci encore

  9. #9
    Membre à l'essai
    Homme Profil pro
    resp centre de plongee
    Inscrit en
    Septembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : resp centre de plongee
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 17
    Points : 14
    Points
    14
    Par défaut merci
    Merci à tous pour vos apports, cela m'a permis d'avancer et de résoudre mon problème.

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 038
    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 038
    Points : 9 347
    Points
    9 347
    Par défaut
    En terme de performance, si tu peux EVITER d'afficher à l'écran tes données tu seras toujours gagnant.

    Comme tu fais, tu ne remplaces pas une étape lente par une étape rapide ; tu ajoutes une étape.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Bonjour,

    Contrairement à ce qui a été dit, il faudra utiliser la fonction HExecuteRequeteSQL pour exécuter directement du code SQL.. mais je suppose que vous l'aviez déjà corrigé

    Sinon ce que dit tbc92 est tout à fait exact : pour optimiser votre code, limiter les étapes et surtout les aller-retours entre appli et SGBD. De façon optimal vous pouvez envisager (si votre SGBD le permet) d'exécuter une requête qui fait les deux opérations : sélection et mise à jour.

    Un requête de ce type :

    UPDATE MaTable1 SET Rubrique = 'MaValeur' WHERE IDTable1 IN (SELECT IDTable1 FROM MaTable2 WHERE [critère selection])

    En supposant bien sûr que les tables en question dispose d'une relation

    Bonne journée,
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

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

Discussions similaires

  1. [AC-2002] problème liste déroulante ajout dans table
    Par special-k dans le forum IHM
    Réponses: 9
    Dernier message: 01/10/2010, 19h25
  2. [AC-2003] Vérification de redondances avant ajout dans table
    Par Chov19 dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/05/2009, 15h44
  3. Probleme de requette d'ajout dans table automatiquement
    Par sooprano dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/11/2008, 17h47
  4. Ajout dans table par formulaire
    Par Elendill dans le forum VBA Access
    Réponses: 5
    Dernier message: 25/05/2007, 20h49
  5. Ajout dans table en sql
    Par lito74 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/10/2006, 18h41

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