WinDev : fonctions de recherche dans un champ Table
par
, 06/10/2015 à 22h16 (9336 Affichages)
Nouvelles fonctions de recherche dans un champ Table
Contexte technique et fonctionnel
Je commence ce billet par une affirmation, lors de la programmation sur l'EDI WinDev, nous avons tous utiliser le champ Table (Si non un petit coup d'oeil sur l'aide en ligne est nécessaire pour continuer ce billet : champ Table) et nous avons programmé celui-ci avec les fonctions :
Dans ce billet, nous allons voir les recherches dans un champ Table, WinDev nous met à disposition la fonction TableCherche, d'après l'aide en ligne, cette fonction effectue une recherche un élément dans une colonne. Mais celle-ci ne nous permet pas
- la recherche d'un élément dans toutes les colonnes de la table ;
- la recherche d'un élément dans un ensemble de colonne ;
- la recherche d'un ensemble d'éléments dans une colonne ;
- la recherche d'un ensemble d'éléments dans un ensemble de colonnes.
Afin de rendre moins abstrait ces possibilités manquantes, prenons un exemple. Une fenêtre de recherche client composée d'une table et différents champs de recherche.
Fig. 1 : exemple de fenêtre servant de jeu d'essai
Nous voulons pouvoir rechercher tous les clients avec les critères suivants :
- avoir une numéro de téléphone portable (point 2) ;
- habiter dans les départements 57 et 54 (point 3) ;
- habiter dans les départements du 57, 54 et avoir un téléphone professionnel portable (point 4).
Pour illustrer le point 1, prenons l'exemple d'un tableau affichant le résultat d'un jeu de dé.
Fig. 2 : exemple de fenêtre servant de jeu d'essai
Nous voulons pouvoir rechercher les joueurs qui ont eu un 6.
Les fonctions utilisent le type de variable Champ, les fonctions suivantes sont disponible pour les versions de WinDev : 19 et supérieures.
Les fonctions
Rechercher un élément dans toutes les colonnes
Cette fonction permet de rechercher un élément dans toutes les colonnes d'une table.
Code WinDev : 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
53
54
55
56
57
58
59 // Résumé : Effectue une recherche dans toutes les colonnes d'un champ table. // Syntaxe : //[ <Résultat> = ] TableCherche (<pc_champ> est champ, <pv_ValeurRecherche> est variant [, <pb_rechercheIdentique> est booléen [, <pi_indiceDepart> est entier]]) // // Paramètres : // pc_champ (champ) : Nom du champ table ou de la colonne. // pv_ValeurRecherche (variant) : valeur recherchée. // pb_rechercheIdentique (booléen - valeur par défaut=1) : Vrai recherche à l'identique. Faux recherche générique, dans ce cas, tous les éléments commençant par <Élément recherché> sont retournés // pi_indiceDepart (entier - valeur par défaut=1) : Numéro de la ligne de départ de la recherche dans la table. // Valeur de retour : // entier : Indice de l'élément trouvé, -1 si aucun élément ne correspond à la recherche. // // Exemple : // TableCherche(Tab_listeInfoClient,"mail",faux,1). // PROCEDURE TableCherche(pc_champ est un Champ,pv_ValeurRecherche est un Variant,pb_rechercheIdentique est un booléen=Vrai,pi_indiceDepart est un entier=1) //----->Declaration des variables li_indiceDepart, li_nbColonne est un entier //----->Initialisation des variables li_nbColonne=1 SI ChampExiste(pc_champ..NomComplet) ALORS SI pc_champ..Type = typTable ALORS TANTQUE TableEnumèreColonne(pc_champ..Nom,li_nbColonne)<>"" li_nbColonne++ FIN li_nbColonne-- SI pi_indiceDepart>0 ALORS li_indiceDepart=pi_indiceDepart SINON li_indiceDepart=1 FIN POUR li_i=li_indiceDepart _A_ TableOccurrence(pc_champ) POUR li_j=1 _A_ li_nbColonne SI pb_rechercheIdentique ALORS SI pc_champ[li_i,li_j] = pv_ValeurRecherche ALORS RENVOYER li_i FIN SINON SI ChaîneCommencePar(pc_champ[li_i,li_j],pv_ValeurRecherche,ccNormal) ALORS RENVOYER li_i FIN FIN FIN FIN SINON ExceptionDéclenche(2,"Le champ '"+pc_champ..NomComplet+"' n'est pas de type table") FIN SINON ExceptionDéclenche(1,"Le champ '"+pc_champ..NomComplet+"' n'existe pas") FIN RENVOYER -1
Exemple :
Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 li_resRech est un entier li_resRech=TableCherche(Tab_LstResultat,"6",vrai) TANTQUE li_resRech<>-1 Trace("Ligne : "+li_resRech) li_resRech=TableCherche(Tab_LstResultat,"6",vrai,li_resRech+1) FIN
Rechecrher une valeur dans plusieurs colonnes
Cette fonction permet de rechercher un élément dans plusieurs colonnes d'un champ de type table.
Code WinDev : 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
53
54
55
56
57
58
59
60
61
62 // Résumé : Effectue une recherche dans plusieurs les colonnes d'un champ table. // Syntaxe : //[ <Résultat> = ] TableCherche (<pt_LstColonne> est tableau, <pv_ValeurRecherche> est variant [, <pb_rechercheIdentique> est booléen [, <pi_indiceDepart> est entier]]) // // Paramètres : // pt_LstColonne (tableau) : Liste des colonnes. // pv_ValeurRecherche (variant) : valeur recherchée. // pb_rechercheIdentique (booléen - valeur par défaut=1) : Vrai recherche à l'identique. Faux recherche générique, dans ce cas, tous les éléments commençant par <Élément recherché> sont retournés. // pi_indiceDepart (entier - valeur par défaut=1) : Numéro de la ligne de départ de la recherche dans la table. // Valeur de retour : // entier : Indice de l'élément trouvé, -1 si aucun élément ne correspond à la recherche. // // Exemple : // TableCherche([Col_info,col_mailperso,Col_mailPro],"@",faux,1). // PROCEDURE TableCherche(pt_LstColonne est un tableau de Champ,pv_ValeurRecherche est un Variant,pb_rechercheIdentique est un booléen=Vrai,pi_indiceDepart est un entier=1) //----->Declaration des variables li_indiceDepart, li_nbColonne est un entier ls_nomTable est une chaîne lo_ChampTemp est un Champ //----->Initialisation des variables li_nbColonne=1 //----->Test si le tableau en contient que des colonnes POUR li_i=1 _A_ TableauOccurrence(pt_LstColonne) ls_nomTable=pt_LstColonne[li_i]..NomComplet ls_nomTable=ExtraitChaîne(ls_nomTable,2,".",DepuisDébut) SI {ls_nomTable,indChamp}..Type <> typTable ALORS ExceptionDéclenche(2,"Le champ '"+pt_LstColonne[li_i]..NomComplet+"' n'est pas de type table") FIN FIN SI pi_indiceDepart>0 ALORS li_indiceDepart=pi_indiceDepart SINON li_indiceDepart=1 FIN POUR li_i=li_indiceDepart _A_ TableOccurrence(ls_nomTable) POUR li_j=1 _A_ TableauOccurrence(pt_LstColonne) lo_ChampTemp<-pt_LstColonne[li_j] SI pb_rechercheIdentique ALORS SI lo_ChampTemp[li_i] = pv_ValeurRecherche ALORS RENVOYER li_i FIN SINON SI ChaîneCommencePar(lo_ChampTemp[li_i],pv_ValeurRecherche,ccNormal) ALORS RENVOYER li_i FIN FIN FIN FIN RENVOYER -1
Exemple :
Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 lt_lstColonnes est une tableau de 2 Champ lt_lstColonnes[1]<-Col_TelPerso lt_lstColonnes[2]<-Col_TelPro li_resRech=TableCherche(lt_lstColonnes,"06",Faux) TANTQUE li_resRech<>-1 Trace("Ligne : "+li_resRech) li_resRech=TableCherche(lt_lstColonnes,"06",Faux,li_resRech+1) FIN
Rechercher une liste de valeurs dans une table (ou une colonne)
Cette fonction permet de rechercher une liste de valeurs dans un champ de type table ou dans plusieurs colonnes.
Code WinDev : 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 // Résumé : Effectue une recherche dans un champ table ou colonne // Syntaxe : //[ <Résultat> = ] TableCherche (<pc_champ> est champ, <pt_LstValeurRecherche> est tableau [, <pb_rechercheIdentique> est booléen [, <pi_indiceDepart> est entier]]) // // Paramètres : // pc_champ (champ) : Nom du champ table ou de la colonne. // pt_LstValeurRecherche (tableau) : Liste des valeurs recherchées. // pb_rechercheIdentique (booléen - valeur par défaut=1) : Vrai recherche à l'identique. Faux recherche générique, dans ce cas, tous les éléments commençant par <Élément recherché> sont retournés // pi_indiceDepart (entier - valeur par défaut=1) : Numéro de la ligne de départ de la recherche dans la table. // Valeur de retour : // entier : Indice de l'élément trouvé, -1 si aucun élément ne correspond à la recherche. // // Exemple : // TableCherche(Col_CodePostal,["57","55","54,"88"],faux,1). // PROCEDURE TableCherche(pc_champ est un Champ,pt_LstValeurRecherche est un tableau de Variant,pb_rechercheIdentique est un booléen=Vrai,pi_indiceDepart est un entier=1) //----->Declaration des variables li_indiceDepart est un entier SI ChampExiste(pc_champ..NomComplet) ALORS SI pc_champ..Type = typTable ALORS SI pi_indiceDepart>0 ALORS li_indiceDepart=pi_indiceDepart SINON li_indiceDepart=1 FIN POUR li_i=li_indiceDepart _A_ TableOccurrence(pc_champ) POUR li_j=1 _A_ pc_champ..NombreColonne POUR li_k=1 _A_ pt_LstValeurRecherche..Occurrence SI pb_rechercheIdentique ALORS SI pc_champ[li_i,li_j] = pt_LstValeurRecherche[li_k] ALORS RENVOYER li_i FIN SINON SI ChaîneCommencePar(pc_champ[li_i,li_j],pt_LstValeurRecherche[li_k],ccNormal) ALORS RENVOYER li_i FIN FIN FIN FIN FIN SINON //----->Déclaration de variables ls_nomTable est une chaîne ls_nomTable=pc_champ..NomComplet ls_nomTable=ExtraitChaîne(ls_nomTable,2,".",DepuisDébut) SI {ls_nomTable,indChamp}..Type = typTable ALORS SI pi_indiceDepart>0 ALORS li_indiceDepart=pi_indiceDepart SINON li_indiceDepart=1 FIN POUR li_i=li_indiceDepart _A_ TableOccurrence(ls_nomTable) POUR li_j=1 _A_ pt_LstValeurRecherche..Occurrence SI pb_rechercheIdentique ALORS SI pc_champ[li_i] = pt_LstValeurRecherche[li_j] ALORS RENVOYER li_i FIN SINON SI ChaîneCommencePar(pc_champ[li_i],pt_LstValeurRecherche[li_j],ccNormal) ALORS RENVOYER li_i FIN FIN FIN FIN SINON ExceptionDéclenche(2,"Le champ '"+pc_champ..NomComplet+"' n'est pas de type table ou colonne") FIN FIN SINON ExceptionDéclenche(1,"Le champ '"+pc_champ..NomComplet+"' n'existe pas") FIN RENVOYER -1
Exemple :
Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 li_resRech est un entier li_resRech=TableCherche(Col_CodePostal,["54","57"],Faux) TANTQUE li_resRech<>-1 Trace("Ligne : "+li_resRech) li_resRech=TableCherche(Col_CodePostal,["54","57"],Faux,li_resRech+1) FIN
Rechercher un couple de valeurs
Cette fonction permet de rechercher un couple de valeurs dans un couple de colonnes
Code WinDev : 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 // Résumé : Effectue une recherche d'un couple de valeurs dans des colonnes. // Syntaxe : //[ <Résultat> = ] TableCherche (<pc_champ> est champ, <pt_LstValeurRecherche> est tableau [, <pb_rechercheIdentique> est booléen [, <pi_indiceDepart> est entier]]) // // Paramètres : // pt_LstColonne (tableau) : Liste des colonnes. // pt_LstValeurRecherche (tableau) : Liste des couples de valeurs recherchées. // pb_rechercheIdentique (booléen - valeur par défaut=1) : Vrai recherche à l'identique. Faux recherche générique, dans ce cas, tous les éléments commençant par <Élément recherché> sont retournés. // pi_indiceDepart (entier - valeur par défaut=1) : Numéro de la ligne de départ de la recherche dans la table. // Valeur de retour : // entier : Indice de l'élément trouvé, -1 si aucun élément ne correspond à la recherche. // // // Exemple : //TableCherche([Col_codePostal,col_Ville],[]],faux,1). // PROCEDURE TableCherche(pt_LstColonne est un tableau de Champ,pt_LstValeurRecherche est un tableau dynamique,pb_rechercheIdentique est un booléen=Vrai,pi_indiceDepart est un entier=1) //----->Declaration des variables lb_ligneOK est un booléen li_indiceDepart, li_nbColonne est un entier ls_nomTable est une chaîne //lo_ChampTemp est un champ //----->Initialisation des variables li_nbColonne=1 //----->Test si le tableau en contient que des colonnes POUR li_i=1 _A_ TableauOccurrence(pt_LstColonne) ls_nomTable=pt_LstColonne[li_i]..NomComplet ls_nomTable=ExtraitChaîne(ls_nomTable,2,".",DepuisDébut) SI {ls_nomTable,indChamp}..Type <> typTable ALORS ExceptionDéclenche(2,"Le champ '"+pt_LstColonne[li_i]..NomComplet+"' n'est pas de type table") FIN FIN SI TableauOccurrence(pt_LstColonne) = TableauInfo(pt_LstValeurRecherche,tiDimension) ALORS SI pi_indiceDepart>0 ALORS li_indiceDepart=pi_indiceDepart SINON li_indiceDepart=1 FIN POUR li_i=li_indiceDepart _A_ TableOccurrence(ls_nomTable) POUR li_k=1 _A_ TableauInfo(pt_LstValeurRecherche,tiNombreLignes) lb_ligneOK=Vrai POUR li_j=1 _A_ TableauOccurrence(pt_LstColonne) lo_ChampTemp est un Champ<-pt_LstColonne[li_j] SI pb_rechercheIdentique ALORS SI lo_ChampTemp[li_i] <> pt_LstValeurRecherche[li_k,li_j] ALORS lb_ligneOK=Faux SORTIR FIN SINON SI ChaîneCommencePar(lo_ChampTemp[li_i],pt_LstValeurRecherche[li_k,li_j],ccNormal)=Faux ALORS lb_ligneOK=Faux SORTIR FIN FIN FIN SI lb_ligneOK ALORS SORTIR FIN FIN SI lb_ligneOK ALORS RENVOYER li_i FIN FIN SINON ExceptionDéclenche(3,"La dimension du tableau passé en paramètre 1 est différente de la dimension du tableau passé en paramètre 2") FIN RENVOYER -1
Exemple :
Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 lt_lstColonne est une tableau de 2 Champ lt_lstColonne[1]<-Col_CodePostal lt_lstColonne[2]<-Col_TelPro lt_lstValeurs est une tableau de 0 par 2 Variant lt_lstValeurs= [["57","06"],["54","06"]] li_resRech=TableCherche(lt_lstColonne,lt_lstValeurs,Faux) TANTQUE li_resRech<>-1 Trace("Ligne : "+li_resRech) li_resRech=TableCherche(lt_lstColonne,lt_lstValeurs,Faux,li_resRech+1) FIN
Les exceptions
Comme vous avez pu le constater en lisant le code source des fonctions, celles-ci déclenchent des exceptions en cas de problème. Trois types d'exceptions sont gérées :
Code Message 1 Le champ '%%Champ%%' n'existe pas 2 Le champ '%%Champ%%' n'est pas de type table ou colonne 3 Les dimensions des tableaux passés en paramètre sont différentes.
Pour plus d'informations sur la gestion des exceptions, consulter l'aide en ligne : Mécanisme des exceptions générales.
Conclusion
Ces fonctions augmentent la possibiltié de recherche dans un champ Table. A voir, si PC-Soft intégrera ces propositions dans une future version de son EDI.
Bon dev à tous