Bonjour,
cette fois-ci je voudrais vous faire partager une astuce bien connue des utilisateurs de Microsoft Access, mais qui manque à l’arsenal de Windev/HFSQL.
Il nous arrive souvent de vouloir connaitre simplement la valeur d’une rubrique d’un fichier de données pour un enregistrement particulier.
Par exemple si vous vouliez connaitre la DateFacturation de la COMMANDE numéro 2 classiquement, sous HFSQL vous feriez quelque chose comme suit :
Mais là ou le système se complique un peu c’est lorsque vous avez plusieurs critères, cette syntaxe ne le permet plus, et vous vous retrouvez avec quelque chose comme :
… ce qui rallonge pas mal le code.
La fonction DLookup(), que j’appellerai ici DomaineRechercheValeur() pour rester dans l’esprit des conventions de nommage Windev, permet de remédier à cela avec la syntaxe suivante :
il s’agit simplement de lui fournir en entrée la clause SELECT, FROM, WHERE, et optionnellement GROUP BY, mais sans avoir à saisir les mots clés.
Voici le prototype de base de cette procédure que j’ai donc créé, que vous pourrez améliorer à votre guise. Elle retourne simplement la valeur de la première rubrique du premier enregistrement trouvé correspondant au critère recherché, ou NULL en cas de problème ou de résultat vide. Assurez vous donc de n’avoir qu’un seul nom de rubrique dans le sFrom.
*** VOUS TROUVEREZ LE CODE SOURCE EN COMMENTAIRE A CE POST POUR LE COPIER/COLLER!
Cela fonctionne donc aussi bien sur 1 seul critère, puisque si l’on reprend le premier cas d’exemple on écrirait alors :
Ou même si vous cherchez une valeur MAX() ou MIN() :
Ici l’astuce, comme ma fonction demande un critère sWHERE obligatoire, mais que nous n’en avons pas besoin, je fais en sorte d’avoir WHERE 1=1 , ce qui correspond à WHERE TRUE (dans d’autres syntaxes SQL), et donc qui correspond à ne pas fournir de WHERE dans notre SQL, pour une clause WHERE qui n’aura donc aucune influence sur le résultat.
J’obtiens bien la plus grande date de facturation de mon fichier de commande :
POUR ALLER PLUS LOIN :
vous pouvez décliner cette fonction en diverses saveurs, par exemple :
– DomaineMax() … qui vous donne directement le MAX sans avoir à utiliser la syntaxe de l’exemple ci dessus.
– DomaineMin() … idem pour récupérer la valeur minimum
– DomaineRechercheEnregistrement() qui renvoie directement un enregistrement (type de variable enregistremement). Intéressant si vous voulez pouvoir manipuler tout votre enregistrement.
– DomaineOccurrence() : qui vous retourne le nombre de résultats d’une requête donnée (DCount() sous Access)
– DomaineExiste() : qui vous renvoie VRAI uniquement si la requete a des résultats
bien sur, il serait bien de les coder en cascade … pour éviter les redondances, puisque DomaineMin() ou DomaineMax() pourrait utiliser DomaineRechercheValeur(), de même que DomaineExiste() peut renvoyer le résultat de DomaineOccurence()>0
… voila quelques idées. A vous de jouer.
Source