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 :

[WD 11] cumul de periodes entre plusieurs contrats


Sujet :

WinDev

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut [WD 11] cumul de periodes entre plusieurs contrats
    salut
    je cherche à calculer le cumul de plusieurs périodes, et le test se fait entre deux tables, c'est à dire, j'ai la table info qui contient matricule,nom,site... et j'ai la table contrat qui contient matricule,date de début, date fin
    Le principe c'est avec une boucle tant que je dois parcourir la table info par matricule, à chaque matricule de cette table je lance une boucle sur table contrat qui parcoure toute la table en testant la correspondance entre les matricules, si info.matricule égale à contrat.matricule, alors la il calcule la période de contrat et l'ajoute au cumule (somme de toutes les périodes de contrats d'une matricule) et 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
    14
    15
    16
    17
    18
    19
    20
    21
     
    matr est un entier
    cumul est une chaîne
    HLitPremier(info, matricule)
    TANTQUE PAS HEnDehors()
    	matr=info.matricule
    	HLitPremier(embauche,matricule)
    	TANTQUE PAS HEnDehors()
    		SI matr = embauche.matricule ALORS
    			 cumul=cumul+Age(embauche.date_embauche,embauche.date_fin_contrat)
    		HLitSuivant(embauche,matricule)
    	SINON
    		HLitSuivant(embauche,matricule)
    	FIN
    	FIN
     
    	Trace(cumul)
     
    Table.années=Milieu(cumul,3,2)
    	HLitSuivant(info, matricule)
    FIN
    a chaque fois cumul sera affiché dans une table
    mais la mon programme se bloque et je ne sais pas pourquoi, pouvez vous alors m'expliquer comment se procéder
    merci

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    salut,

    Je serais toi, je mettrai le nom du fichier dans les hEnDehors.

    Ensuite, pour faire plus "propre", je mettrai le "HLitSuivant(embauche,matricule)", une seule fois, après le FIN.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    salut
    dans initialisation de la table j'ai mis sa:
    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
     
    matr est un entier
    cumul est une chaîne
    HLitPremier(info, matricule)
    TANTQUE PAS HEnDehors(info)
    	matr=info.matricule
    	HLitPremier(embauche,matricule)
    	TANTQUE PAS HEnDehors(embauche)
    		SI matr = embauche.matricule ALORS
    			cumul=cumul+Age(embauche.date_embauche,embauche.date_fin_contrat)
    			FIN
    			HLitSuivant(embauche,matricule)
    			FIN
     
    	Trace(cumul)
     
    Table.années=Milieu(cumul,3,2)
    	HLitSuivant(info, matricule)
    FIN
    mais je n'ai rien dans trace et toujours blocage

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Peux-tu essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    matr est un entier
    cumul est une chaîne
    HLitPremier(Info, matricule)
    TANTQUE HTrouve(Info)
    	matr=Info.matricule
    	HLitPremier(embauche,matr)
    	TANTQUE HTrouve(embauche)
    		cumul=cumul+Age(embauche.date_embauche,embauche.date_fin_contrat)
    	FIN
     
    	Trace(cumul)
     
    	Table.années=Milieu(cumul,3,2)
    FIN
    Si ça ne fonctionne pas ou "bloque", peux-tu être plus précis ? Le Trace boucle à l'infini ou autre chose ?

  5. #5
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Je vois pas trop pourquoi ça bloque mais j'ai essayer ça et ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cumulEnJour est un entier
    POUR TOUT info SUR matricule
    	cumulEnJour  = 0
    	POUR TOUT embauche AVEC matricule = info.matricule
    		cumulEnJour += DateDifférence(embauche.date_embauche,embauche.date_fin_contrat)
    	FIN
    	Trace(cumulEnJour )
    	Table.années = cumulEnJour /365
    FIN
    «Un problème bien défini est un problème à moitié résolu.»

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    bonjour
    toujours même probléme, j'ai essayé sa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sCumul est une chaîne
    POUR TOUT info SUR matricule
            POUR TOUT embauche AVEC matricule = info.matricule
    		sCumul=sCumul+Age(embauche.date_embauche,embauche.date_fin_contract)
    	FIN
    	Table.années = sCumul
    FIN
    mais il y'a toujours le blocage et aucune resultat

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Bonjour,

    Peux-tu être plus explicite sur le "blocage" ?

    Si tu mets un point d'arrêt au niveau du premier POUR TOUT et que tu suis pas à pas (F7), que se passe-t-il ?

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    j'ai fait ça , malgré que je n'ai rien compris, mais en dirai qu'il ne fait pas le parcoure et que scumul toujours est vide, existe t'il une autre solution pour faire se calcul, car j'ai besoin de calculé l'anciannité (cumul de toutes les périodes des contrat en mode calendaire)

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    ^^ le Pas à Pas permet de suivre ligne par ligne le déroulement de ton code et te permet de connaitre les valeurs de tes différentes variables.

    Si tu met la souris au-dessus d'une variable, tu as en info-bulle sa valeur.

    Lorsque tu arrives sur le point d'arrêt et que tu fais F7, rentres-tu dans la boucle ?

    Pour info, je pense qu'il serait préférable de renommer ta table "Info", parce que ce mot est utilisé couramment par Windev.

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    d'essais maintenant se code
    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
     
    sCumul est une chaîne
    matr est un entier
    POUR TOUT info SUR matricule
    matr= info.matricule
    HLitPremier(embauche,matricule)
    TANTQUE PAS HEnDehors(embauche)
    		SI matr=embauche.matricule
    		sCumul=sCumul+Age(embauche.date_embauche,embauche.date_fin_contract)
    	FIN
    	HLitSuivant(embauche,matricule)
     
    FIN
    Table.années = sCumul
    FIN
    avec le point d'arrêt+f7 les test fonctionnent mais lorsque je fais le test "GO" sans point d'arrêt, c'est à dire sur la totalité de la fenêtre, la ma fenêtre reste fixe (bloqué) et rien ne fonctionne, je ne sais pas si le problème est du au nombre d'enregistrements dans les deux tables (plus de 2000 enregistrements au minimum dans chaque table) ou peut être au niveau de calcule "cumul" car avec f7 je ne peux pas tester toutes la boucle (trop long à tester une par une)

  11. #11
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    oui en effet ça peut être long parce que en gros ça fait (2000*2000) passages pour ton traitement.

    Il faudrait mieux passer par une requête qui te fait le cumul par matricule, et ensuite tu parcours les enregistrements de cette requête pour l'affichage.

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Lo² Voir le message
    oui en effet ça peut être long parce que en gros ça fait (2000*2000) passages pour ton traitement.

    Il faudrait mieux passer par une requête qui te fait le cumul par matricule, et ensuite tu parcours les enregistrements de cette requête pour l'affichage.
    oui, je pense vraiment à ça, je vais essayer de le faire et je vais vous dire les résultats

  13. #13
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Tu ferais déjà ça, ça irait mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    POUR TOUT info SUR matricule
    	HLitrecherchePremier(embauche,matricule,info.matricule)
    	TANTQUE htrouve(embauche)
    		sCumul=sCumul+Age
    		HLitSuivant(embauche,matricule)
    	FIN
    FIN
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  14. #14
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    En effet, j'avais oublié dans mes boucles exemples le HLitSuivant... je suis trop habitué des SQLAVANCE ^^

  15. #15
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    salut
    j'ai fait sa:
    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
     
    nMatr est un entier
    nCumul est un entier
    HLitPremier(info,matricule)
    TANTQUE PAS HEnDehors(info)
    REQ_Requête_matr.matr=info.matricule
    	HExécuteRequête(REQ_Requête_matr,hRequêteDéfaut)
    	HLitPremier(REQ_Requête_matr,matricule)
    	TANTQUE PAS HEnDehors(REQ_Requête_matr)
    		nCumul=nCumul+Milieu(Age(embauche.date_embauche,embauche.date_fin_contract),3,2)
            HLitSuivant(REQ_Requête_matr,matricule)
    	FIN
    HAnnuleDéclaration(REQ_Requête_matr)
    	HLitSuivant(info,matricule)
    FIN
    req_requete_matr est une requete qui filtre la table embauche par matricule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    	embauche.etat AS etat,	
    	embauche.matricule AS matricule,	
    	embauche.date_embauche AS date_embauche,	
    	embauche.date_fin_contract AS date_fin_contract
    FROM 
    	embauche
    WHERE 
    	embauche.etat = 1
    	AND	embauche.matricule = {matr}
    mais en dirais que rien ne marche toujours est fixé sur le 1ere enregistrement de la table info et rien ne se passe.

  16. #16
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Je ferai plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    nCumul est un entier = 0
    HExécuteRequête(REQ_Requête_matr,hRequêteDéfaut)
    HLitPremier(REQ_Requête_matr, matricule)
    TANTQUE PAS HEnDehors(REQ_Requête_matr)
    	nCumul=nCumul+Milieu(Age(embauche.date_embauche,embauche.date_fin_contract),3,2)
    	HLitSuivant(REQ_Requête_matr, matricule)
    FIN
    HAnnuleDéclaration(REQ_Requête_matr)

  17. #17
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Lo² Voir le message
    Je ferai plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    nCumul est un entier = 0
    HExécuteRequête(REQ_Requête_matr,hRequêteDéfaut)
    HLitPremier(REQ_Requête_matr, matricule)
    TANTQUE PAS HEnDehors(REQ_Requête_matr)
    	nCumul=nCumul+Milieu(Age(embauche.date_embauche,embauche.date_fin_contract),3,2)
    	HLitSuivant(REQ_Requête_matr, matricule)
    FIN
    HAnnuleDéclaration(REQ_Requête_matr)
    j'ai mis se code et j'ai ajouté trace aprés le n cumul, toujours ncumul égale à zéro, en plus je dois faire le test en se basant sur la table info, c'est à dire je lit la table info.matricule (une par une) et je teste si cette matricule se trouve cette matricule se trouve dans la table embauche, et à chaque fois je fais le cumul des periodes (calendaires) de cette matricule.
    NB :le code est inséré dans l'initialisation de la table
    aussi même probléme pour le code de mogwai162

  18. #18
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    ok, je comprend mieux.

    Dans la requête, fait un INNER JOIN entre "embauche" et "info" sur le matricule, comme cela le tri se fera automatiquement.

    Ensuite, à la place du trace(ncumul), fait plutôt de la valeur que tu veux ajouter à nCumul, cad milieu(age(...

  19. #19
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    478
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2005
    Messages : 478
    Points : 89
    Points
    89
    Par défaut
    salut
    je ne sais pas comment mettre le INNER JOIN entre embauche et info, car je ne connais pas bien en SQL et la requête que j'ai fait c'est avec nouveau>requête>requête de sélection

  20. #20
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 328
    Points : 3 841
    Points
    3 841
    Par défaut
    Modifie la requête par l'assistant et ajoute par exemple le matricule de la table info.

    Ensuite Windev va faire la liaison comme un grand si dans ton analyse les fichiers sont liés sinon je ne sais pas comment ça va se dérouler, ou sinon tu peux passer par du code SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    	embauche.etat AS etat,	
    	embauche.matricule AS matricule,	
    	embauche.date_embauche AS date_embauche,	
    	embauche.date_fin_contract AS date_fin_contract
    FROM embauche
            INNER JOIN info ON info.matricule = embauche.matricule
    WHERE 
    	embauche.etat = 1
    	AND	embauche.matricule = {matr}
    Edit : tu peux même enlever le paramètre comme cela la requête va te renvoyer tous les "embauches" correspond à "info".

Discussions similaires

  1. liaison entre plusieurs base de donnee
    Par GMI dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/12/2004, 18h42
  2. partager un schema entre plusieurs utilisateurs
    Par jrman dans le forum Oracle
    Réponses: 5
    Dernier message: 15/12/2004, 16h53
  3. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  4. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24
  5. [Technique] Conflits entre plusieurs requêtes
    Par Neowile dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 24/03/2003, 09h37

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