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 :

Parcourir les éléments d'une table HF [WD17]


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Parcourir les éléments d'une table HF
    Bonjour j'ai un problème des plus banales, désoler pour le dérangement.

    Je dois juste parcourir une table hyperfile et éviter qu'un enregistrement s'effectue à une date de travail qui existe déjà dans la table.
    Nom : pointage.JPG
Affichages : 2257
Taille : 154,7 Ko

    Voila j'ai essayé avec Hlitpremier, HLitRecherche, ca ne fonctionne pas, mais ici j'essaye de parcourir la table et vérifier si la date de travail d'un employé est déja

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //On recherche si un employé a déjà été
    POUR TOUT HeureTravail AVEC CodeSal = COMBO_Employe
    	HLitRecherche(HeureTravail,DateTravail,SAI_DateTravail)
    		SI HeureTravail.DateSaisie = SAI_DateTravail ALORS
    			Info("Un pointage a déja été effectué a cette date......")
    			RepriseSaisie(SAI_DateTravail)
    	FIN
    FIN
    Il y'a des doublons parce que le code ne fonctionne pas correctement.

    Donc en gros si un employé a une date de travail = "18/02/2017". Lorsqu'on veut effectuer un enregistrement de cette employé à cette date la, un message s'affiche que l'enregistrement est impossible à cette date là...

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Première chose à vérifier : les types que vous utilisez dans votre zone de sasie, dans les variables intermédiaires et dans la rubrique du fichier.

    Il faut que toutes soient de type Date ou de type Chaîne.
    Sinon vous devez gérer les conversions avec les fonctions DateVersChaine et ChaineVersDate.
    Si vous travaillez avec des chaînes, organisez vos chaines comme le format date : AAAAMMJJ, ce qui permet les tris et les comparaisons.

    Si cela n'arrange pas le problème, on creusera plus profond.

    Bon travail

    Hemgé

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Hemgé Voir le message
    Bonjour,

    Première chose à vérifier : les types que vous utilisez dans votre zone de sasie, dans les variables intermédiaires et dans la rubrique du fichier.

    Il faut que toutes soient de type Date ou de type Chaîne.
    Sinon vous devez gérer les conversions avec les fonctions DateVersChaine et ChaineVersDate.
    Si vous travaillez avec des chaînes, organisez vos chaines comme le format date : AAAAMMJJ, ce qui permet les tris et les comparaisons.

    Si cela n'arrange pas le problème, on creusera plus profond.

    Bon travail

    Hemgé
    Oui ils sont bien de types dates AAAAMMJJ dans la zone de saisie comme dans le type date du fichier HF.

    J'ai même effectué une conversion en dateversentier pour comparer les entiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //On recherche si un employé a déjà été
    POUR TOUT HeureTravail AVEC CodeSal = COMBO_Employe
    	HLitRecherche(HeureTravail,DateTravail,SAI_DateTravail)
    		SI DateVersEntier(HeureTravail.DateSaisie) = DateVersEntier(SAI_DateTravail) ALORS
    			Info("Un pointage a déja été effectué a cette date......")
    			RepriseSaisie(SAI_DateTravail)
    	FIN
    FIN
    Pour les 1ère enregistrements le code fonctionnent mais quand on commence à avoir une centaine d’enregistrements dans le fichier HF, le code ne fonctionne plus correctement...

    je ne peux pas travailler avec les HLitRecherchePremier ou HLitRechercheDernier, il ne donne que les 1er ou dernier enregistrement, je dois vraiment parcourir toute la table en fonction du code employé en vérifiant les dates...

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 055
    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 055
    Points : 9 394
    Points
    9 394
    Par défaut
    Ton programme est organisé comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    POUR TOUT HeureTravail AVEC CodeSal = COMBO_Employe
    	HLitRecherche(HeureTravail,DateTravail,SAI_DateTravail)
    		//  peu importe le traitement 
    	FIN
    FIN
    La ligne " Pour Tout Heure travail " dit : je prends un pointeur, et je pointeur sur chaque enregistrement du fichier HeureTravail,succesivement.
    Et la ligne en dessous dit : je prends le même pointeur, et je le positionne à un autre endroit du fichier.

    Ca ne peut pas marcher.

    J'essaye de comprendre ce que tu veux faire : "" Je dois juste parcourir une table hyperfile et éviter qu'un enregistrement s'effectue à une date de travail qui existe déjà dans la table.""
    Mais j'ai laissé ma boule de cristal au bureau. Donc impossible de t'aider plus.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    J'essaye de comprendre ce que tu veux faire : "" Je dois juste parcourir une table hyperfile et éviter qu'un enregistrement s'effectue à une date de travail qui existe déjà dans la table.""
    Mais j'ai laissé ma boule de cristal au bureau. Donc impossible de t'aider plus.
    Je ne demande pas de faire le boulot a ma place mais juste d'être guider c'est tout...

    Merci

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Citation Envoyé par pat_eric2012 Voir le message
    Je ne demande pas de faire le boulot a ma place mais juste d'être guider c'est tout...
    Bonsoir,

    J'espère que ce n'est pas vous qui avez "sanctionné" tcb92 ...
    Ce ne serait pas très correct.
    D'autant qu'il n'a pas tort.

    Pour vous aider, nous devons comprendre ce que vous voulez faire et avec quels éléments.
    Et, à part la vérification des types que j'ai pu vous suggérer, le reste n'est pas clair.

    Je dois juste parcourir une table hyperfile et éviter qu'un enregistrement s'effectue à une date de travail qui existe déjà dans la table.
    Une "table hyperfile", cela n'existe pas.
    Avec Windev, c'est soit un fichier Hyperfile, soit une (un champ) Table Windev (et pas hyperfile). Il en faut pas non plus utiliser "table" au sens SQL.

    Quant on regarde votre bout de code, on trouve une instruction de parcours de fichier, avec une comparaison à une valeur sortie d'on ne sait où.
    A lire votre code, on comprend que HeureTravail est un fichier.
    On voit qu'il y a un CodeSal qui est soit une rubrique de ce fichier, soit une variable, soit un champ, l'hypothèse la plus probable étant la rubrique.
    Vous testez cette rubrique (?) dont on ignore le type, par rapport un Combo dont on ne sait ce qu'il renvoie, ni d'où il vient ni quel rapport il entretient avec votre problème.
    Enfin, vous nous affichez une table (Liste CONGECOVAL) dont nous croyons comprendre que c'est par rapport à elle que vous voulez tester les dates, mais nous ne la voyons apparaître nulle part dans le code que vous nous soumettez.

    Conclusion : je suis perdu et perplexe (moi aussi)
    Et il nous faut plus de précisions.

    Enfin, je vous conseille de réinitialiser votre fichier ou en les tous cas de le nettoyer de ses doublons.
    Vous risquez de rencontrer des erreurs qui ne se présenteraient pas avec des données valides. Je n'ai pas poussé plus loin à ce niveau, mais cela arrive.

    Enfin, je vous conseille vivement de régler le problème à l'origine des doublons avant de pousser votre développement plus avant.
    Evitez d'empiler des problèmes.

    Bon travail

    Hemgé

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Hemgé Voir le message
    Enfin, je vous conseille de réinitialiser votre fichier ou en les tous cas de le nettoyer de ses doublons.
    Vous risquez de rencontrer des erreurs qui ne se présenteraient pas avec des données valides. Je n'ai pas poussé plus loin à ce niveau, mais cela arrive.

    Enfin, je vous conseille vivement de régler le problème à l'origine des doublons avant de pousser votre développement plus avant.
    Evitez d'empiler des problèmes
    Merci Hemgé !

    Je crois que je n'ai peut être pas bien expliquer le problème. Les doublons ne sont pas trop un souci.

    En fait cette table provient d'un fichier hyperFiles. Lorsque je dois faire un nouvel enregistrement de pointage journalier (HAjoute).

    Je voudrais parcourir le fichier HF, vérifier si un employé n'a pas déjà été enregistré à cette date de saisie.

    Si c'est le cas, RepriseSaisie(Date) ou enregistrer le pointage journalier dans le fichier.

    Le champ de saisie est de type de date(AAAAMMJJ) et DateTravail du fichier HF est aussi de type de date (AAAAMMJJ).

    Mon algorithme doit pourvoir effectué ces opérations.

    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
    //Je dois parcourir le fichier HF
     
    //Chercher l'employé correspondant au COMBO_EMPLOYE (Type : Texte)
     
    //Si je le trouve()
     
    //Vérifier toutes les dates de travail de cet employé uniquement
     
    //Si parmi ces dates, une date enregistrée = a la nouvelle date saisie
     
    //Blocage et RepriseSaisie(Date)
     
    //Sinon enregistré le pointage dans le fichier
     
    //Hajoute
    C'est plus ou moins ce que je dois faire en gros.

    En attendant je continue les tests, HLitRecherche() s'arrête au premier ou dernier enregistrement du fichier mais ne parcourt pas toute la table pour vérifier toutes les dates du fichier correspondant à un employé.

    Fin voilà et merci a tous de vos aides

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 055
    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 055
    Points : 9 394
    Points
    9 394
    Par défaut
    C'est beaucoup plus clair, et c'est vraiment pas mal d'être capable de reformuler la question de cette façon. Ce n'est pas courant.

    Je te conseille de lire cette partie de la doc : http://doc.pcsoft.fr/fr-FR/?3044178
    C'est sur les clés composées. Si tu as la possibilité de modifier l'analyse de ton programme (ajouter un index qui combinerait l'identifiant de l'employé et la date), alors ça va beaucoup t'aider.

    Sinon, en jouant avec HFiltre(), tu peux arriver à ta solution.

    Dans les 2 cas, la fonction hRecherchePremier() sera très utile ( que tu pourras éventuellement remplacer par hLitRecherchePremier() )
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    914
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 914
    Points : 1 496
    Points
    1 496
    Par défaut
    Bonjour.
    Le premier exemple de :
    http://doc.pcsoft.fr/fr-FR/?3044100&name=HFiltre
    correspond a ce que vous cherchez.

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Donc, à la lumière de vos explications, on oublie la table CONGECOVAL qui n'était destinée qu' illustrer votre fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Si je le trouve()
    //Vérifier toutes les dates de travail de cet employé uniquement
    Dans cette optique, c'est le code suivant qui répondrait à votre souhait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     //On recherche si un employé a déjà été
    POUR TOUT HeureTravail AVEC CodeSal = COMBO_Employe
    	//HLitRecherche(HeureTravail,DateTravail,SAI_DateTravail)
            //Puisqu'on parcourt le fichier avec POUR TOUT, il suffit de tester chaque enregistrement extrait par rapport à la date
    		SI HeureTravail.DateSaisie = SAI_DateTravail ALORS
    			Info("Un pointage a déja été effectué a cette date..........")
    			RepriseSaisie(SAI_DateTravail)
    	        FIN
    FIN
    Nous ne connaissons pas votre analyse.
    A priori, on attend un Id automatique dans le fichier Employé et autant de clé étrangères pointant vers cet Id Employé qu'il y a de fichiers liés à ce fichier Employé, comme par exemple votre fichier HeureTravail.

    Alors, on pourrait optimiser le parcours.
    Au minimum avec une clé sur l'employé, le mieux étant d'avoir dans HeureTravail une clé étrangère (pointeur vers) sur l'Id automatique de l'employé et de définir cette rubrique comme une clé du fichier (avec doublons).
    Je suis étonné que votre COMBO renvoie une valeur de type chaîne, il vaudrait mieux renvoyer directement l'Id automatique de l'employé.

    A ce moment, une fois la valeur reçue de votre COMBO, vous oubliez le parcours POUR TOUT et vous procédez avec HLitRecherchePremier et HLitSuivant.
    La clé composée est aussi une bonne idée, mais alors je préfère la gérer moi-même sous forme de chaîne avec l'Id Employé et la date ("NNNNNAAAAMMJJ")
    Cela vous permet d'effectuer des traitements sur cette clé que la clé composée HF(binaire) ne permet pas.

    Quant aux filtres, il faut savoir que quelque part dans la doc, il est dit qu'il vaut mieux les remplacer par des queries.

  11. #11
    Membre régulier
    Homme Profil pro
    Ex-Jedi dans le Consulting et le développement
    Inscrit en
    Décembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ex-Jedi dans le Consulting et le développement
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2011
    Messages : 46
    Points : 102
    Points
    102
    Par défaut
    Bonjour,
    est ce que votre table est issue d'un fichier ? si la réponse est oui alors peut être qu'une clef composée UNIQUE basée sur le Nom+Date est la solution

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/01/2008, 16h58
  2. chercher les éléments d'une table B qui ne sont pas dans la table A
    Par Cupidon dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/01/2008, 13h40
  3. parcourir les éléments d'une table
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 14/01/2007, 17h50
  4. Appliquer un style à tous les éléments d'une table
    Par licorne dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/01/2007, 14h31
  5. Réponses: 2
    Dernier message: 27/12/2005, 20h09

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