DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Gestion des bases de données / HFSQL / Fonctions HFSQL
  • Borne minimale et borne maximale sur une rubrique clé de type texte ou clé composée
  • Filtre et parcours filtré
  • Condition de sélection
  • Activation/Désactivation d'un filtre
  • Filtre sur une clé composée
  • Tables non HFSQL
WINDEV
WindowsLinuxJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac Catalyst
Autres
Procédures stockées
Définit et active un filtre sur une table, une vue ou une requête.
Après son exécution, les cas suivants sont les plus fréquents:
  • le filtre ne peut pas être créé: la fonction HFiltre renvoie une chaîne vide. La fonction HErreur permet de récupérer l'identifiant de l'erreur.
  • le filtre est créé: la fonction HFiltre renvoie la clé de parcours optimale à utiliser pour réaliser le parcours de la table, de la vue ou de la requête.
Exemple
// Filtre simple avec une condition: Rechercher les clients d'une ville 
CléParcours est une chaîne
maville est une chaîne
maville = "MONTPELLIER"
CléParcours = HFiltre(Client, "VILLE='" + maville + "'")
HLitPremier(Client, CléParcours)
TANTQUE HEnDehors() = Faux
	// Traitement de l'enregistrement 
	...
	HLitSuivant(Client, CléParcours)
FIN
// Annule le filtre
HDésactiveFiltre(Client)
// Filtre réalisé avec une clé de parcours bornée et une condition: la clé de parcours est fixée
CléParcours est une chaîne
// Filtre les factures comprises entre le 1/1/2005 et le
// 31/12/2005 dont le total est supérieur à 1500 Euros TTC
// avec une remise dont le type est passé en paramètres (rubrique texte)
CléParcours = HFiltre(Facture, DateFacture, "20050101", "20051231", ...
	ChaîneConstruit("TotalTTC>1500 ET TypeRemise = '%1'" + , ...
	Remplace(sTypeRemise, "'", "\'")))
// La fonction Remplace permet de préfixer les apostrophes 
// que peut contenir sTypeRemise d'un antislash
SI CléParcours <> "" ALORS
	HLitPremier(Facture, CléParcours)
	TANTQUE HEnDehors() = Faux
		// Traitement de l'enregistrement: envoi d'une lettre de remerciement
		Envoi_Lettre()
		HLitSuivant(Facture, CléParcours)
	FIN
FIN
...
// Annule le filtre
HDésactiveFiltre(Facture)
Syntaxe

Filtre construit avec une clé de parcours bornée et une condition Masquer les détails

<Résultat> = HFiltre(<Table> , <Clé de parcours> , <Borne minimale> [, <Borne maximale> [, <Condition de sélection>]])
<Résultat> : Chaîne de caractères
Rubrique de parcours. Correspond:
  • soit à la clé de parcours de la table si le filtre est activé.
  • soit à une chaîne vide ("") si le filtre ne peut pas être mis en place.
<Table> : Chaîne de caractères
Nom de la table, de la vue HFSQL ou de la requête manipulée.
<Clé de parcours> : Chaîne de caractères
Nom de la rubrique clé utilisée pour parcourir la table, la vue ou la requête. Cette rubrique doit être une clé de parcours de la table, de la vue ou de la requête. C'est sur cette rubrique que s'appliquent les bornes minimales et maximales.
<Borne minimale> : Type de la rubrique de parcours
Valeur minimale incluse de la rubrique de parcours (si la clé de parcours est définie avec un sens de parcours ascendant dans le schéma des données). Les enregistrements correspondant à cette valeur minimale seront inclus dans le filtre. Dans le cas d'un parcours descendant (c'est-à-dire si la clé de parcours est définie avec un sens de parcours descendant dans le schéma des données), c'est la valeur maximale de la rubrique de parcours.
Le type de ce paramètre doit correspondre au type de la rubrique de parcours. Par exemple, si la rubrique de parcours est une chaîne, la borne minimale doit être une chaîne.
<Borne maximale> : Type de la rubrique de parcours, paramètre optionnel
Valeur maximale incluse de la rubrique de parcours (cas d'un parcours ascendant). Les enregistrements correspondant à cette valeur maximale seront inclus dans le filtre. Le type de ce paramètre doit correspondre au type de la rubrique de parcours. Par exemple, si la rubrique de parcours est une chaîne, la borne maximale doit être une chaîne.
Dans le cas d'un parcours descendant, c'est la valeur minimale de la rubrique de parcours.
Si ce paramètre n'est pas précisé, la borne maximale du filtre correspond à la valeur du paramètre <Borne minimale>.
<Condition de sélection> : Chaîne de caractères optionnelle
Condition de sélection pour créer le filtre (voir Notes). Cette condition de sélection peut être une chaîne de caractères au format Ansi ou Unicode.

Filtre construit avec une condition Masquer les détails

<Résultat> = HFiltre(<Table> , <Condition de sélection>)
<Résultat> : Chaîne de caractères
Rubrique de parcours. Correspond:
  • soit à la clé de parcours de la table si le filtre est activé
  • soit à une chaîne vide si le filtre ne peut pas être mis en place
<Table> : Chaîne de caractères
Nom de la table, de la vue HFSQL ou de la requête manipulée.
<Condition de sélection> : Chaîne de caractères
Condition de sélection pour créer le filtre (voir NOTES). Cette condition de sélection peut être une chaîne de caractères au format Ansi ou Unicode.
Remarques

Borne minimale et borne maximale sur une rubrique clé de type texte ou clé composée

Si la borne minimale et la borne maximale sont identiques:
  • pour réaliser un filtre à l'identique sur une valeur, il suffit de préciser cette valeur dans le paramètre "Borne min".
    Par exemple, pour sélectionner les clients dont le nom correspond à "Dupon":
    HFiltre(Client, Nom, "Dupon")

    Le client "Dupontel" ne sera pas sélectionné.
  • pour réaliser un filtre générique sur une valeur, il suffit de:
    • compléter la borne minimale avec la constante hValMin pour lui donner la valeur minimale.
    • compléter la borne maximale avec la constante hValMax pour lui donner la valeur maximale.
    Par exemple, pour sélectionner les clients dont le nom commence par "Dupon":
    HFiltre(Client, Nom, "Dupon" + hValMin, "Dupon" + hValMax)

    Les clients "Dupon" et "Dupontel" seront sélectionnés.
Remarques:
  • La constante hValMin est équivalente à Caract(0).
  • La constante hValMax est équivalente à Caract(255).

Filtre et parcours filtré

Après l'exécution de la fonction HFiltre, le parcours de la table doit obligatoirement être effectué sur la rubrique renvoyée par la fonction HFiltre. Si une autre rubrique est utilisée pour le parcours de la table, le filtre ne sera pas pris en compte.
Lorsqu'un filtre est défini et activé sur une table (une vue ou une requête), tout enregistrement lu correspond au filtre. Si il n'y a plus d'enregistrement correspondant au filtre lors du parcours:
  • la fonction HEnDehors renvoie Vrai.
  • l'enregistrement en cours correspond au dernier enregistrement lu avec le filtre.
Par exemple:
Sur une table filtrée, après la fonction:l'enregistrement en cours est:
HLitPremierle premier enregistrement de la table correspondant au filtre
HLitDernierle dernier enregistrement de la table correspondant au filtre
HLitSuivant (ou HAvance)l'enregistrement suivant (ou le nième suivant) correspondant au filtre
HLitPrécédent (ou HRecule)l'enregistrement précédent (ou le nième précédent) correspondant au filtre

Condition de sélection

La syntaxe générale d'une condition a la forme suivante:
"NomCli>'Dupont' et (CodePos=34 ou CodePos=32)"
Les opérateurs acceptés sont variables en fonction du type des rubriques utilisées dans la condition:
>Plus grandValable pour tous les types
>=Plus grand ou égalValable pour tous les types
<Plus petitValable pour tous les types
<>DifférentValable pour tous les types
<=Plus petit ou égalValable pour tous les types
 =Strictement égalValable pour tous les types
]Contient: prend en compte la casse des caractèresValable pour les types chaîne uniquement
]=Commence par: prend en compte la casse des caractèresValable pour les types chaîne uniquement
~]Contient: ne prend pas en compte la casse des caractèresValable pour les types chaîne uniquement
~~Égalité très souple: ne différencie pas les caractères majuscules des caractères minuscules, ne tient pas compte des espaces situés avant et après la chaîne à tester, ne tient pas compte des caractères accentués minuscules, ne tient pas compte des espaces et des ponctuations à l'intérieur des chaînes.Valable pour les types chaîne uniquement
~=Environ égal: ne tient pas compte des espaces à droite, ni des accents, ni de la casse des caractèresValable pour les types chaîne uniquement

AndroidWidget AndroidJavaPHP Les opérateurs ~~ et ~= ne doivent pas être utilisés. Ces opérateurs sont interdits.
Remarques sur la condition de sélection:
  • Les chaînes constantes doivent être encadrées de simples quotes.
  • Si le nom de la rubrique contient des simples quotes, elles doivent être doublées.
    Par exemple: ‘Rubrique‘‘avec‘‘quotes‘
  • Les comparaisons entre chaînes se font en fonction des paramètres spécifiés pour les index.
  • Les mémos binaires et les clés composées ne peuvent pas faire partie d'une condition de sélection.
    Pour les clés composées, il est conseillé d'utiliser la première syntaxe. Il n'est pas possible d'utiliser la syntaxe suivante:
    HFiltre(NOMFICHIER, "CLECOMP~]'AAA' ET CLECOMP]='" + HConstruitValClé(NOMFICHIER, CLECOMP, 0) + "'")
  • Si une chaîne de caractères (constante ou variable) contient une simple quote, il faut faire précéder cette simple quote par un anti-slash ( \ ).
  • Pour optimiser le parcours du filtre, utilisez la fonction HStatCalcule sur la table avant de créer le filtre. En effet, le moteur HFSQL schéma des données la condition de sélection et s'appuie ensuite sur ces statistiques pour déterminer les rubriques les plus discriminantes qui permettront d'optimiser le parcours de la table.
  • Cette condition de sélection peut être une chaîne de caractères au format Ansi ou Unicode.
  • Il n'est pas possible d'utiliser dans la condition:
    • plus de 6000 opérandes dans la condition.
    • plus de 420 opérandes logiques de type ET/OR/XOR dans la condition.
    Dans le cas contraire, une erreur 70209 apparaît: "Erreur lors de l'initialisation du filtre. Le nombre maximale d'opérandes a été atteint.".

Activation/Désactivation d'un filtre

La fonction HDésactiveFiltre permet de désactiver un filtre.
La fonction HActiveFiltre permet de ré-activer un filtre.
Lorsque la table (la requête ou la vue) est fermée (fonction HFerme par exemple), le filtre est supprimé.
A un même instant, il ne peut exister qu'un seul filtre sur une table (une requête ou une vue). Si la fonction HFiltre est utilisée plusieurs fois, seul le dernier filtre sera pris en compte: le(s) filtre(s) précédent(s) seront supprimés.
WINDEVWEBDEV - Code ServeuriPhone/iPadJavaCode Utilisateur (MCU)PHPAjaxHFSQL ClassicHFSQL Client/ServeurProcédures stockées

Filtre sur une clé composée

Pour construire un filtre sur une clé composée, plusieurs méthodes sont disponibles:
  • Méthode 1: Utilisation d'une liste de valeurs dans la fonction HFiltre.
  • Méthode 2: Utilisation de l'instruction POUR TOUT.
  • Méthode 3: Utilisation de la fonction HConstruitValClé.
Pour plus de détails sur l'utilisation des clés composées dans les filtres, consultez Clés composées et Filtres.
Exemple d'utilisation de la méthode 1: Utilisation d'une liste de valeurs
La valeur de la clé composée sur laquelle le filtre doit être effectué peut être directement construite dans la fonction HFiltre grâce à la syntaxe suivante:
HFiltre(<Nom du fichier>, <Nom de la clé composée>,
[<Liste des valeurs pour la borne minimale de la clé composée>],
[<Liste des valeurs pour la borne maximale de la clé composée>])
Exemple: Recherche de tous les enregistrements du fichier CLIENT dont le nom et le prénom sont compris entre "AA","Barnabé" et "Philomène" et "Tartuffe".
HFiltre(Client, NomPrenom, ["AA","Philomène"], ["Barnabé","Tartuffe"])
Dans cet exemple, "AA","Zorro" est renvoyé par le filtre alors que "Philomène","Zorro" n'est pas renvoyé.
Exemple: Recherche de tous les enregistrements du fichier Taches dont les tâches sont comprises entre le 15/03/2021 00h00 et le 25/03/2021 00h00.
HFiltre(Taches, DateDébutTacheHeureDébutTache, [20210315,0000], [20210325,0000])
WINDEVWEBDEV - Code ServeurEtats et RequêtesAndroidWidget AndroidJavaCode Utilisateur (MCU)PHPAjaxProcédures stockéesOLE DBConnecteurs Natifs (Accès Natifs)

Tables non HFSQL

Composante: wd300hf.dll
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Exemplo de montagem de filtro em variável para aplicar no HFilter
HourGlass(True)

x is int = 30

sMontaFiltro is string = "T002_Produtos_Local.T002_Produtos_ID IN ("

LOOP(5)

x++

sMontaFiltro += (Length(sMontaFiltro)>0 and x<35?", " else "") + X

END

sMontaFiltro += ")"

HFilter(T002_Produtos_Local, sMontaFiltro)

TableDisplay(TABLE_T002_Produtos_PCSOFT,taInit)

gnTotal = TABLE_T002_Produtos_PCSOFT.Count(toTotal)

HourGlass(False)

by Mello
Boller
25 jan. 2023
Exemplo usando a clausula IN
HFilter(T002_Produtos_Local, "T002_Produtos_Local.T002_Produtos_ID IN(36, 37, 38, 32, 27)")

by Mello
Boller
25 jan. 2023
Exemplo com Between de intervalo de valores dinamicos atraves de Stringbuild
2 campos na tela de entrada
Edt_gn_glo_cod_emp = 2
Edt_gn_glo_cod_obra = 120

HourGlass(True)

Hfilter(pla_cus_obra, StringBuild("id_cllientes = %1 and id_obras = %2 and id_insumos > 0", gn_glo_cod_emp, gn_glo_cod_obra))

TableDisplay(pla_cus_obra,taInit)

gnTotal = pla_cus_obra.Count(toTotal)

HourGlass(False)

by Mello
Boller
25 jan. 2023
Exemplo montando um filtro dinamicamente com LOOP ou FOR ou While...
HourGlass(True)

x is int = 30

sMontaFiltro is string

LOOP(5)

x++

sMontaFiltro += "T002_Produtos_Local.T002_Produtos_ID="+x+" OR "

END

//remove o ultimo OR = 4 caracteres

sMontaFiltro = Middle(sMontaFiltro,1,Length(sMontaFiltro)-4)

HFilter(T002_Produtos_Local, (sMontaFiltro))

TableDisplay(TABLE_T002_Produtos_PCSOFT,taInit)

gnTotal = TABLE_T002_Produtos_PCSOFT.Count(toTotal)

HourGlass(False)
Boller
25 jan. 2023
Exemplos com valores Fixos
HourGlass(True)

HFilter(T002_Produtos_Local,("T002_Produtos_Local.T002_Produtos_ID=36 OR T002_Produtos_Local.T002_Produtos_ID = 37 OR T002_Produtos_Local.T002_Produtos_ID = 38 OR T002_Produtos_Local.T002_Produtos_ID = 32 OR T002_Produtos_Local.T002_Produtos_ID = 27"))

TableDisplay(TABLE_T002_Produtos_PCSOFT,taInit)

gnTotal = TABLE_T002_Produtos_PCSOFT.Count(toTotal)

HourGlass(false)
Boller
25 jan. 2023

Dernière modification : 26/01/2025

Signaler une erreur ou faire une suggestion | Aide en ligne locale