Voir le flux RSS

Le Blog de DSR57 - Programmation WinDev

WinDev : fonctions de recherche dans un champ Table

Noter ce billet
par , 06/10/2015 à 23h16 (2963 Affichages)
Nouvelles fonctions de recherche dans un champ Table

Contexte technique et fonctionnel



Nom : contexteTechnique.jpg
Affichages : 2399
Taille : 27,5 Ko

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
  1. la recherche d'un élément dans toutes les colonnes de la table ;
  2. la recherche d'un élément dans un ensemble de colonne ;
  3. la recherche d'un ensemble d'éléments dans une colonne ;
  4. 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.

Nom : ListedesClients.jpg
Affichages : 1782
Taille : 195,2 Ko
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é.

Nom : ListedesClients2.jpg
Affichages : 1578
Taille : 123,9 Ko
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



Nom : photo_programmation_web.png
Affichages : 1425
Taille : 172,3 Ko

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



Nom : practiceTest.jpg
Affichages : 1275
Taille : 8,9 Ko

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

Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Viadeo Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Twitter Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Google Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Facebook Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Digg Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Delicious Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog MySpace Envoyer le billet « WinDev : fonctions de recherche dans un champ Table » dans le blog Yahoo

Mis à jour 04/08/2016 à 11h21 par dsr57

Catégories
WinDev , Fonctions

Commentaires