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 :

Hlitrecherche Hfiltre et cle composé [WD23]


Sujet :

WinDev

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2009
    Messages : 55
    Points : 0
    Points
    0
    Par défaut Hlitrecherche Hfiltre et cle composé
    Bonjour,
    J'avance a petit pas sur mon souci d'import et d'injection. J'ai une table que j'ai alimenté que j'aimerai maintenant injecté dans un fichier avec des controles.
    Mais je bute sur la recherche d'un enregistremnt existant dans le fichier. J'ai essayé avec des hfiltre, les clecompposé je dois louper une compréhension quelquepart.
    Mon but est de cherché pour chaque police (ligne de mon tableau) si elle existe dans mon fichier Police.
    Ensuite pour chaque Police (et donc ligne) de mon tableau, j'aimerai rechercher :
    1. si un enregistrement existe pour cette police dans mon fichier COURTAGE trié par IDPolice
    2. si dans les enregistrement existant trouvé, si il y en a un dont les champs booleen Validé et Cloture sont vierge (a 0)

    Je suis désolé j'essaie de détaillé au maximum car j'ai du mal a me concentré.

    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
    42
    43
    44
    45
    POUR TOUTE LIGNE DE ImportXML
    	HLitRecherche(Police,NuméroPolice,ImportXML.NoContract) //je cherche si j'ai bien toute les polices existantes
    		SI HTrouve(Police) ALORS //oui j'ai toute les polices
    		// maintenant ce que j'aimerai faire c'est aller chercher dans mon fichier COURTAGE, si un enregsitrement existe déjà avec les valeurs de Cloture et Validé
    		//qui sont des booleens (case a cocher) =0, enfin pas coché. 
    		//J'ai une clé composé existante OptimCleComp_Valid_Clotu sur ces deux booleens.
    		//Si cette ligne existe alors je la complète avec Hmodifie ci dessous. 
    		//Si elle existe pas je la Hajoute. 
    		//dans le fichier Courtage, cherche la premiere ligne correspondant au IDPolice dont les valeurs validé et cloturé sont à 0 (donc pas coché)
    		HLitRecherche(Courtage,IDPolice,FEN_ImportXLM.ImportXML.COL_IDPolice)
    				SI HTrouve(Courtage) ET Courtage.Cloture= 0 ALORS //si je trouve une ligne existante qui n'est pas encore cloturé
    				Trace(Courtage.IDCourtage)
    				Courtage.IDPolice=Police.IDPolice
    				Courtage.IDGestionnaire=Police.IDGestionnaire
    				Courtage.NomAgent=Police.NomAgent
    				Courtage.CourtageRecu=ImportXML.Montant
    				Courtage.DateReception=ImportXML.DateTo
    				Courtage.DateVersement=SAI_DateBank
    				Courtage.ComAgent=ImportXML.COL_ComGest
    				Courtage.ComSSAgent=ImportXML.COL_ComAgent
    				Courtage.Observations="Commission décompteXML ligne existante"
    				Courtage.Cloture=1
    				Courtage.Validé=1
    				HModifie(Courtage)
    					SINON //si je ne trouve pas de ligne alors j'en creer une
    						Courtage.IDPolice=Police.IDPolice
    						Courtage.IDGestionnaire=Police.IDGestionnaire
    						Courtage.NomAgent=Police.NomAgent
    						Courtage.CourtageRecu=ImportXML.Montant
    						Courtage.DateReception=ImportXML.DateTo
    						Courtage.DateCourtagedu=DateSys()
    						Courtage.DateCreation=DateSys()
    						Courtage.SaisiePar="ImportXLM"
    						Courtage.DateVersement=SAI_DateBank
    						Courtage.ComAgent=ImportXML.COL_ComGest
    						Courtage.ComSSAgent=ImportXML.COL_ComAgent
    						Courtage.Observations="Commission décompteXML ligne creer"
    						Courtage.Cloture=1
    						Courtage.Validé=1
    						HAjoute(Courtage)
    		FIN
    	SINON  //non il m'en manque une
    		Info("police non trouvé, arret de la procédure")
    	FIN
    FIN

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 392
    Points
    9 392
    Par défaut
    En ligne 10, tu recherches un enregistrement dans le fichier courtage, avec le bon n° de police.
    Si l'enregistrement que tu as trouvé convient (cloture=0), tout va bien.
    Mais si l'enregistrement trouvé ne convient pas , tu dis que tu voudrais regarder les suivants... mais tu ne les regardes pas.

    Pour lire tous les enregistrements correspondants à ce n° de police, jusqu'à en trouver un qui convient, il faut une boucle. Et donc une instruction TANTQUE ...
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2009
    Messages : 55
    Points : 0
    Points
    0
    Par défaut
    Le souci est que je ne trouve que le dernier enregistrement.
    Pour mes tests, en l'occurrence il y a trois lignes de courtage existante sur un ligne Police dont une ou mes valeurs (valide et cloturé sont coché) et donc sont rapprochés. donc deux a trouver.

    Si je fais une boucle telle que celle ci, il me renvoi directement sur j'ai pas d'enregistrement:
    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
    HLitRecherche(Police,NuméroPolice,ImportXML.NoContract) //je cherche si j'ai bien toute les polices existantes
    		SI HTrouve(Police) ALORS //oui j'ai toute les polices pas besoin d'en creer
    				Trace(Police.NuméroPolice) //donne la liste de toute les polices pour test
    			HLitRecherche(Courtage,IDPolice,FEN_ImportXLM.ImportXML.COL_IDPolice)
    				Trace(Courtage.IDPolice)
    			TANTQUE PAS HEnDehors(Courtage)
    				SI HTrouve(Courtage) ET Courtage.OptimCleComp_Valid_Clotu=0
    				//HLitRecherche(courtage,OptimCleComp_Valid_Clotu,[0])
    				Trace(Police.NuméroPolice,Courtage.IDCourtage)
    				Trace("un courtage existe")
    				HLitSuivant(Courtage,IDCourtage)
    			SINON
    				Trace("je n'ai pas de courtage existant")
    			FIN
    		FIN

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 392
    Points
    9 392
    Par défaut
    En ligne 4 , tu fais hLitRecherche(..) ; le système cherche une ligne. Il fait ce que tu lui demandes. A partir de cette ligne, tu lis les lignes suivantes.
    Si tu veux pouvoir utiliser hLitSuivant, il faut t'assurer que hLitRecherche te positionne sur la 1ère ligne valide. Et donc il faut utiliser ??? ??? hLitRecherchePremier()

    Par ailleurs, dans un seond temps, quand tu fais tous les hLitSuivant(), tu lis toute la fin du fichier. Rien n'est fait pour arrêter la lecture quand on n'est plus sur le même n° de police. Et c'est dommage.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    +1 @tbc92 concernant le HLitRecherchePremier().

    Et je peux même ajouter que dans la description de tes rubriques, il faut penser à cocher les sensible à la casse / accentuation / espaces, ponctuation (pour les rubriques texte), ça peut aider...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2009
    Messages : 55
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    je n'ai pas marqué le sujet en résolu car je suis désolé je dois vraiment être stupide mais je n'y arrive pas. Il y a un truc qui doit m'échapper donc si vous avez de quoi m'aider je suis preneur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sIdpolice est une chaîne = FEN_ImportXLM.ImportXML.COL_IDPolice
     
    POUR TOUTE LIGNE DE ImportXML    //pour chaque ligne de mon tableau 
     
    	POUR TOUT Courtage AVEC IDPolice=sIdpolice  //liste tous les courtages existant selon la police
    		Trace(Police.NuméroPolice, Courtage.IDPolice, Courtage.IDCourtage,Courtage.Validé)	//cela focntionne j'ai bien mes courtages existant pour cette police.
    		//maintenant j'aimerai savoir, si dans ses résultats il y a un enregistrement du fichier courtage avec cet Idpolice qui a la valeur Valide = 0 null, vide
    		//si oui je fais mon traitement et modifie cette ligne
    		//sinon je creer une ligne
    	FIN	
     
     
    Trace("creation du fichier PDF et enregistrement") //edit un etat (ligne saisie EGA puis enregistrment pdf dans un répertoire 
    FIN
    J'ai essayé avec TANT QUE
    POUR TOUT
    Hfiltre
    ....

    Je ne suis pas développeur du tout c'est pas mon boulot mais comme j'ai du faire ce truc je suis un peu obligé de continuer.

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    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 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Si j'ai bien tout compris, tu veux importer une structure XML, puis, en fonction de certaine conditions modifier certaines données.
    Pourquoi ne pas tout simplement utiliser HImporteXML puis faire une requête update sur la table importée ?

    Note Enlève les pages de ta doc concernant HFiltre.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2009
    Messages : 55
    Points : 0
    Points
    0
    Par défaut
    En fait, j'ai un fichier xml concernant des commissions selon des contrats d'assurance que je reçois des compagnies, celui ci je le traite tant bien que mal et je remplit une table.

    J'effectue ensuite une recherche pour savoir si j'ai bien toute les polices / contrat dans mon fichier.
    Si non j'effectue la création puis je refait le processus.
    Si oui alors j'effectue un traitement sur la table, je vais rechercher qui est l'agent et le gestionnaire car ils retouchent des commissions selon un pourcentage.

    Une fois que la table est faite j'aimerai injecter les données dans le fichier courtage contenant toute les commissions / courtage que je reçois sur cette contrat.
    Mais en début d'année je créer toute les ligne de commissions pour tous les contrats en attente, et je les valide lorsque la compagnie paie la commission (selon le décompte XML)
    Du coup maintenant j'aimerais regarder si une ligne existe non validé, si oui alors je la valide et complète la ligne, sinon je créer une nouvelle ligne, la complète et valide.

    En soit c'est juste ce contrôle que je n'arrive pas encore à faire.

    Que veux tu dire par enleve les page pour hfiltre ? il ne faut plus utliser hfiltre ?

  9. #9
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    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 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Commençons déjà par le HFiltre.

    HFiltre est une solution envisageable lorsque le filtre est simple (réduit à une colonne ou deux.) Pour des filtres complexes cela devient l'usine à gaz. A créer tout d'abord, il n'y a pas d'assistant. Mais surtout à maintenir ou à corriger.

    Par ailleurs, on a parfois besoin d'avoir accès à l'ensemble des données et aux données filtrées. Il faut alors jongler avec les HAnnuleFiltre, HSauvePosition etc dans les cas les plus simples.

    Sans oublier les filtre que l'on a omis d'annuler et j'en passe.

    Pour revenir à ton cas, en utilisant HImporteXML, ton problème se règle avec 2 requête

    A la volée :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO Courtage (Liste des colonne)
    SELEC(Colonne à insérer)
    FROM ImportXML
    WHERE Courtage.PK_Courtage<>ImportXML.PK_ImportXML
    Permet la création des nouveaux enregistrement

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    UPDATE Courtage
    SET Cloturé=1
    SET Validé=1
    WHERE Courtage.PK_Courtage IN
         (
         SELECT
              PK_ImportXML
         FROM
              ImportXML
         )
    Pour valider et clôturer les enregistrements issus du XML
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2009
    Messages : 55
    Points : 0
    Points
    0
    Par défaut
    Merci pour la réponse, j'ai tardé a revenir et appliquer ta solution, mais je suis dans la dernière ligne droite ayant résolu pas mal d'autre petits soucis.
    J'ai compris que la solution passe par une requête, par contre je ne peux pas passer par himporteXML car j'ai déjà mes résultats ajouter dans une table, nommé importXLM
    Il y a des traitements dessus et un controle visuel nécessaire.

    Du coup j'ai tout simplement fait une requête dont voici le code SQL :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	Courtage.IDCourtage AS IDCourtage,	
    	Courtage.Validé AS Validé,	
    	Courtage.Cloture AS Cloture,	
    	Courtage.IDPolice AS IDPolice
    FROM 
    	Courtage
    WHERE 
    	Courtage.Validé = 0
    	AND	Courtage.Cloture = 0
    	AND	Courtage.IDPolice = {ParamIDPolice}

    Maintenant je peux traiter le résultat et cela fonctionne a peu près, mon code du bouton traitement :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    POUR TOUTE LIGNE DE ImportXML    //pour chaque ligne de mon tableau 
    	sIdpolice est une chaîne = FEN_ImportXLM.ImportXML.COL_IDPolice
    	// Exécution de la requête listant les lignes ouverte (non cloturé) selon l'IDPolice
    	HExécuteRequête(REQ_courtagevalidecloture,hRequêteDéfaut,sIdpolice)
     
    	HLitPremier(REQ_courtagevalidecloture) //cherche dans la liste de la requète 
    		SI HTrouve(REQ_courtagevalidecloture) ALORS //si je trouve une ligne traitement hmodifie
    			//Trace("Il y a une ligne :"+REQ_courtagevalidecloture.IDPolice+"-"+REQ_courtagevalidecloture.IDCourtage)
    		HLitRecherche(Courtage,IDCourtage,REQ_courtagevalidecloture.IDCourtage)
    		Courtage.IDPolice=REQ_courtagevalidecloture.IDPolice
    		Courtage.IDGestionnaire=ImportXML.COL_Gestionnaire
    		Courtage.NomAgent=ImportXML.COL_Agent
    		Courtage.CourtageRecu=ImportXML.Montant
    		Courtage.DateReception=SAI_PeriotDateTo
    		Courtage.DateVersement=SAI_DateBank
    		Courtage.ComAgent=ImportXML.COL_ComGest
    		Courtage.ComSSAgent=ImportXML.COL_ComAgent
    		Courtage.Observations="Commission complété selon le décompteXML, ligne existante"
    		Courtage.Cloture=1
    		Courtage.Validé=1
    		HModifie(Courtage)
    		SINON
    			//trace("pas de ligne") //il n'y a pas de ligne traitement hajoute
    		HRAZ(Courtage)
    		Courtage.IDPolice=ImportXML.COL_IDPolice
    		Courtage.IDGestionnaire=ImportXML.COL_Gestionnaire
    		Courtage.NomAgent=ImportXML.COL_Agent
    		Courtage.CourtageRecu=ImportXML.Montant
    		Courtage.DateReception=SAI_PeriotDateTo
    		Courtage.DateCourtagedu=DateSys()
    		Courtage.DateCreation=DateSys()
    		Courtage.SaisiePar="ImportXLM"
    		Courtage.DateVersement=SAI_DateBank
    		Courtage.ComAgent=ImportXML.COL_ComGest
    		Courtage.ComSSAgent=ImportXML.COL_ComAgent
    		Courtage.Observations="Ligne de commission créée automatiquement"
    		Courtage.Cloture=1
    		Courtage.Validé=1
    		HAjoute(Courtage)
    		FIN
     
    FIN
     
    designationdecompte est une chaîne = SAI_Compagnie+"_"+SAI_PeriotDateTo
    sVersion est une chaîne = SAI_version
    sCompagnie est une chaîne = SAI_Compagnie
    sDate1 est une chaîne = SAI_PeriodDateFrom
    sDate2 est une chaîne = SAI_PeriotDateTo
    sTotal est une chaîne = SAI_Total
     
    iAperçu(i100, designationdecompte, Vrai)
    iImprimeEtat(ETAT_XML,sVersion,sCompagnie, sDate1,sDate2,sTotal)
    Je ne sais pas si c'est tout à fait juste dans le cheminement mais cela fonctionne à peu près.
    Merci pour votre aide.

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

Discussions similaires

  1. [WD14] Hfiltre sur cle doublon
    Par BENKOUIDER dans le forum WinDev
    Réponses: 2
    Dernier message: 01/12/2009, 15h39
  2. PB sauvgarde en cascade Cle Composé
    Par byounes76 dans le forum Hibernate
    Réponses: 1
    Dernier message: 22/08/2007, 14h04
  3. supprimer une ligne avec cle etrangere
    Par BaBas dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/07/2003, 11h24
  4. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49
  5. cle pour programme
    Par mumu2001 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 04/11/2002, 10h34

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