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 :

Se positionner avec clé composée


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 251
    Points : 98
    Points
    98
    Par défaut Se positionner avec clé composée
    Bonsoir.

    J'ai un fichier facture, avec un clé composé IdClient+DateFacture
    Je souhaite connaitre la dernière date de facture d'un client.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HLitRechercheDernier( Factures, idClientDateFacture , [Client.IdClient, 99991231 ] )
    HLitPrécédent( Factures, idClientDateFacture )
    Cela ne marche pas!

  2. #2
    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
    Je mettrais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitDernier( Factures, idClientDateFacture )
    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

  3. #3
    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,

    HLitDernier ne permet pas de préciser la valeur de la clé et entraînerait donc un parcours non optimisé du fichier avec la nécessité de tester la valeur de l'Id pour chaque enregistrement.
    Il faut effectivement utiliser HLitRechercheDernier, comme proposé par no_me_entero.
    D'après le contexte de la question, cette clé composée est a priori organisée de manière ascendante.

    Quant à la clé composée, la liste de valeurs est la méthode préconisée.

    Comme la date de facture est inconnue, je crois qu'il ne faut pas la mentionner et utiliser une liste (càd avec les crochets, comme proposé), mais réduite à la seule valeur de l'Id et sans "," (qui provoquerait une erreur ou une alerte de l'éditeur de code).
    Windev va traiter cette liste incomplète comme une valeur (l'Id) et une valeur vide ou nulle.
    Comme je n'utilise pas les clés composées de WD (je préfère générer mes propres clés sous forme de chaînes de caractères), je n'ai pas d'expérience spécifique, mais c'est comme cela que WD se comporte d'habitude avec les listes entre [ ].

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HLitRechercheDernier( Factures, idClientDateFacture , [Client.IdClient] )
    HLitPrécédent( Factures, idClientDateFacture )

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 251
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    En fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitRechercheDernier( Factures, idClientDateFacture , [Client.IdClient, 99991231 ] )
    fonctionne tout seul!
    C'est troublant car Htrouve = Faux, et HEnDehors = Faux

    Parcontre controler HEnDehors n'est pas suffisant car sil nexiste pas d'enregistrement pour un IdClient, il retourne un facture d'sun client suivant, avec HEnDehors = Faux!
    Donc oblige a vérifier Client.IdClient = Facture.IdClient

    Tout cela en fait est pour plalier la lenteur de HFSQL sous Linux, face à MySQL sur le même serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HFiltre( Facture, idClientDateFacture , hValMin, hValMax, ...
    	"IdClient=" + Client.IdClient+"")
     
    	// Parcours des enregistrements filtrés
    	HLitDernier( Facture, idClientDateFacture )
    Ce traitement est 5 fois plus lent avec HFSQL, donc je cherche un solution pour améliorer.

    HLitRechercheDernier, n'améliore pas la vitesse, elle chute avec les 2 bases.
    Donc je dois continuer à chercher.

    Merci

  5. #5
    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 no_me_entero Voir le message
    Parcontre controler HEnDehors n'est pas suffisant car sil nexiste pas d'enregistrement pour un IdClient, il retourne un facture d'sun client suivant, avec HEnDehors = Faux!
    Donc oblige a vérifier Client.IdClient = Facture.IdClient
    De mémoire, il est mentionné quelque part dans la documentation que ce n'est pas parce que l'enregistrement demandé n'a pas été trouvé que HF n'a pas lu quelque chose.
    Il est au minimum resté sur l'enregistrement précédant l'opération qui a échoué. De là aussi l'intérêt de faire un HRAZ(Factures) avant toute lecture.

    Attention également au fait que le premier contrôle c'est HTrouve : Vrai ou Faux, les autres contrôles (HEnDehors, HErreurBloquage) ne servant qu'à affiner le diagnostic si HTrouve = Faux.
    Mais, si on ramène "quelque chose" accompagné d'un HTrouve = Faux, ce quelque chose n'est pas l'information cherchée, "point à la ligne".
    Et quelle que soit la Facture trouvée, elle ne concerne pas le client ciblé.


    En terme de vitesse, je ne connais pas la différence des mécanisme mis en jeu, mais je commencerais par remplacer les HFiltre par des query. (C'est même recommandé par la doc ...)
    Et dans ces query, je ne rapatrierais que le nombre minimum de colonnes pour faire un éventuel test, quitte à refaire une lecture complète de la ligne de table à modifier.
    Si vous travaillez avec des query, vous pouvez aussi vous limiter à un update limité aux colonnes cibles.
    Tout cela concourt à améliorer vos accès.

  6. #6
    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
    Désolé pour la réponse en dehors de la plaque, mais je vais essayer de me rattraper en donnant quelques idées.

    Au moins, il y aura la possibilité de faire des tests de rapidité.

    Par une requête ? Le premier résultat de cette requête est la dernière date de facture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL SELECT ... ORDER BY DateFacture DESC
    Par une vue ? C'est la même chose que la requête SQL, c'est juste pour savoir si cette méthode est plus rapide.
    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

  7. #7
    Membre émérite
    Femme Profil pro
    .
    Inscrit en
    Janvier 2012
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 999
    Points : 2 525
    Points
    2 525
    Par défaut
    Allez, je te met +1, tu t'es bien rattrapé.
    Les vues, je suis adepte depuis WD5.5, c'est tout de même très pratique.

  8. #8
    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
    Merci pour le +1.

    Je suis adepte également, mais il faut que le contexte s'y prête (clés + volumétrie fichier/performances machine). Une vue, c'est une requête SQL "déguisée" (cf discussion avec michel.souris sur ce sujet). Je pratique depuis longtemps également.
    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

  9. #9
    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
    Citation Envoyé par no_me_entero Voir le message
    Bonsoir.

    J'ai un fichier facture, avec un clé composé IdClient+DateFacture
    Je souhaite connaitre la dernière date de facture d'un client.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HLitRechercheDernier( Factures, idClientDateFacture , [Client.IdClient, 99991231 ] )
    HLitPrécédent( Factures, idClientDateFacture )
    Cela ne marche pas!
    Bonjour,
    afin de faire une recherche à l'aide d'une clef composée, tu as la fonction "hconstruitvalcle".

    Ensuite tu peux lancer ta recherche à l'aide du résultat de cette fonction

    Bon dev

Discussions similaires

  1. E-mail de l'expéditeur avec le composant serveur Outlook
    Par DavFau dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 19/01/2008, 10h09
  2. Comment joindre un fichier avec le composant CDONT
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 31/12/2004, 17h28
  3. Erreur de socket avec le composant Indy idHTTP
    Par Etanne dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/10/2004, 11h27
  4. Impression avec le composant TRvSystem
    Par tarbala dans le forum Composants VCL
    Réponses: 3
    Dernier message: 02/10/2004, 17h03
  5. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58

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