Voir le flux RSS

Le Blog de DSR57 - Programmation WinDev

WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur

Noter ce billet
par , 25/08/2015 à 12h37 (1911 Affichages)
Nouvelles fonctions pour améliorer la programmation de la sélection/désélection d'une colonne de type interrupteur dans un champ Table

Contexte technique et fonctionnel



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

Lors de mes développements, j'ai du manipuler le champ table, celui-ci peut être manipuler par programmation avec les fonctions proposés par WinDev :


L'ensemble de ces fonctions permettent un certains nombre d'actions mais ne couvraient pas l'ensemble de mes besoins. notamment dans les étapes :
  • importation d'enregistrements ;
  • exportation d'enregistrements ;
  • impression de plusieurs enregistrements.

Dans ces étapes., j'ai pris l'habitude d'afficher une fenêtre récapitulative listant dans un champ table les informations qui vont être taitées, cela permet à l'utilisateur :
  • effectuer une vérification ;
  • effectuer une sélection pour ne pas traiter l'ensemble.

L'utilisateur a les possibiltés suivantes :
  • Sélectionner tout ;
  • Désélectionner tout ;
  • Effectuer une sélection plus restritive.

Dans certain cas, je devais pré-sélectionner des lignes de la table avec des indices connues à l'ouverture de la fenêtre. L'ensemble de ces actions me demandait de mettre en place soit une boucle de parcours soit une liste d'affectation. J'ai donc créé de nouvelles fonctions et j'ai décidé de les partager pour permettre :
  • à la communauté de les utiliser ;
  • une évolution de celles-ci avec les éventuels retour.


Version de WinDev : 20 et antérieures



Les fonctions




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

Le nom des fonctions a été créé en conservant la même syntaxe que celles proposées par PC-Soft

TableSelectionne

Cette fonction permet de sélectionner plusieurs cases d'une colonnes de type interrupteur en passant les indices en paramètres

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
 
// Résumé : Active les options des lignes passées en paramètres
// Syntaxe :
//[ <Résultat> = ] TableSelectionne (<ps_champ> est chaîne, <pt_LstIndice> est tableau)
//
// Paramètres :
//	ps_champ (chaîne ANSI) : Nom de la colonne de type interrupteur
//	pt_LstIndice (tableau) : Liste des indices à sélectionner
// Valeur de retour :
// 	booléen : vrai si toutes les indices passé en paramètres ont été traité avec succès
//
// Exemple :
// TableSelectionne(Colonne3..nom,[1,5,8,20])
//
PROCEDURE TableSelectionne(ps_champ est un chaîne,pt_LstIndice est un tableau d'entiers)
 
//----->Declaration des variables
lb_retour est un booléen
ls_MessageErreur,ls_nomTable  est une chaîne
li_tableOccurrence est un entier
 
//----->Initialisation des variables
ls_MessageErreur="Vous avez appelé l'opérateur [] sur le champ %1."+RC+...
"L'indice spécifié [%2] est invalide. "+RC+...
"Les valeurs valides sont comprises entre 1 et %3 (inclus)."
 
//----->Initialisation des variables
lb_retour=Faux
 
SI ChampExiste(ps_champ) ALORS
	SI {ps_champ,indChamp}..Type = typInterr ALORS
 
		ls_nomTable={ps_champ,indChamp}..NomComplet
		ls_nomTable=ExtraitChaîne(ls_nomTable,2,".",DepuisDébut)
 
		SI {ls_nomTable,indChamp}..Type = typTable ALORS
			//----->Initialisation des variables
			li_tableOccurrence={ls_nomTable,indChamp}..Occurrence
 
			POUR li_i=1 _A_ pt_LstIndice..Occurrence
				SI pt_LstIndice[li_i] <= li_tableOccurrence ALORS
					{ps_champ,indChamp}[pt_LstIndice[li_i]]=Vrai
				SINON
					ExceptionDéclenche(3,ChaîneConstruit(ls_MessageErreur,ps_champ,pt_LstIndice[li_i],li_tableOccurrence))
				FIN
			FIN
		SINON
			ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type table ou colonne")
		FIN
 
		lb_retour=Vrai
	SINON SI {ps_champ,indChamp}..Type = typTable ALORS
 
		li_tableOccurrence={ps_champ,indChamp}..Occurrence
 
		POUR li_i=1 _A_ {ps_champ,indChamp}..NombreColonne
			SI {ps_champ,indChamp}[1,li_i]..Type = typInterr ALORS
				POUR li_j=1 _A_ pt_LstIndice..Occurrence
					SI pt_LstIndice[li_j] <= li_tableOccurrence ALORS
						{ps_champ,indChamp}[pt_LstIndice[li_j],li_i]=Vrai
					SINON
						ExceptionDéclenche(3,ChaîneConstruit(ls_MessageErreur,ps_champ,pt_LstIndice[li_i],li_tableOccurrence))
					FIN
				FIN
				lb_retour=Vrai
				SORTIR
			FIN
		FIN
	SINON
		ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type table ou colonne")
	FIN
SINON
	ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN
 
RENVOYER lb_retour

Exemple d'utilisation :

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
TableSelectionne(Col_Select..nom,[1,5,8,20])

TableSelectionneTout

Cette fonction permet de sélectionner toutes les cases d'une colonne de type interrupteur.

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
 
// Résumé : Sélectionne toutes les cases d'une colonne interrupteur.
// Syntaxe :
//[ <Résultat> = ] TableSelectionneTout (<ps_champ> est chaîne)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : Nom de la colonne ou nom de la table
// Valeur de retour :
//         booléen :  Vrai si toutes les lignes ont été sélectionnées
//
// Exemple :
// TableSelectionneTout(Col_activer..nom)
//
//        ps_nomColonne (chaîne ANSI - valeur par défaut="") : <indiquez ici le rôle de ps_nomColonne>
PROCEDURE TableSelectionneTout(ps_champ est un chaîne)
 
//----->Declaration des variables
lb_retour est un booléen
 
//----->Initialisation des variables
lb_retour=Faux
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typColonne ALORS
                POUR li_i=1 _A_ TableOccurrence(ps_champ)
                        {ps_champ,indChamp}[li_i]=1
                FIN        
                lb_retour=Vrai
        SINON SI {ps_champ,indChamp}..Type = typTable ALORS
                POUR li_i=1 _A_ {ps_champ,indChamp}..NombreColonne
                        SI {ps_champ,indChamp}[1,li_i]..Type = typInterr ALORS
                                POUR li_j=1  _A_ TableOccurrence(ps_champ)
                                        {ps_champ,indChamp}[li_j,li_i]=Vrai
                                FIN
                                lb_retour=Vrai
                                SORTIR
                        FIN
                FIN
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type table ou colonne")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN
 
RENVOYER lb_retour

Exemple d'utilisation :

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
TableSelectionneTout(Col_Select..nom)

Cette fonction peut prendre en paramètre le nom d'un champ table, la fonction sélectionnera toutes les cases de la première colonne de type interrupteur

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
TableSelectionneTout(Tab_ListeClientAExporter..nom)

TableDeselectionne


Cette fonction permet de désélectionner plusieurs cases d'une colonne de type interrupteur en passant les indices en paramètres.

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
 
 
// Résumé : Désélectionne les options des lignes passées en patamètres
// Syntaxe :
//[ <Résultat> = ] TableDeSelectionne (<ps_champ> est chaîne, <pt_LstIndice> est tableau)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : niom de la colonne de type interrupteur
//        pt_LstIndice (tableau) : Liste des indices des lignes à désélectionner
// Valeur de retour :
//         booléen :  vrai si toutes les indices passé en paramètres ont été traité avec succès
//
// Exemple :
// Indiquez ici un exemple d'utilisation.
//
PROCEDURE TableDeSelectionne(ps_champ est un chaîne,pt_LstIndice est un tableau d'entiers)
 
//----->Declaration des variables
lb_retour est un booléen
ls_MessageErreur,ls_nomTable  est une chaîne
li_tableOccurrence est un entier
 
//----->Initialisation des variables
ls_MessageErreur="Vous avez appelé l'opérateur [] sur le champ %1."+RC+...
"L'indice spécifié [%2] est invalide. "+RC+...
"Les valeurs valides sont comprises entre 1 et %3 (inclus)."
 
//----->Initialisation des variables
lb_retour=Faux
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typInterr ALORS
 
                ls_nomTable={ps_champ,indChamp}..NomComplet
                ls_nomTable=ExtraitChaîne(ls_nomTable,2,".",DepuisDébut)
 
                SI {ls_nomTable,indChamp}..Type = typTable ALORS
                        //----->Initialisation des variables
                        li_tableOccurrence={ls_nomTable,indChamp}..Occurrence
 
                        POUR li_i=1 _A_ pt_LstIndice..Occurrence
                                SI pt_LstIndice[li_i] <= li_tableOccurrence ALORS
                                        {ps_champ,indChamp}[pt_LstIndice[li_i]]=Faux
                                SINON
                                        ExceptionDéclenche(3,ChaîneConstruit(ls_MessageErreur,ps_champ,pt_LstIndice[li_i],li_tableOccurrence))
                                FIN
                        FIN
                SINON
                        ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type table ou colonne")
                FIN
 
                lb_retour=Vrai
        SINON SI {ps_champ,indChamp}..Type = typTable ALORS
 
                li_tableOccurrence={ps_champ,indChamp}..Occurrence
 
                POUR li_i=1 _A_ {ps_champ,indChamp}..NombreColonne
                        SI {ps_champ,indChamp}[1,li_i]..Type = typInterr ALORS
                                POUR li_j=1 _A_ pt_LstIndice..Occurrence
                                        SI pt_LstIndice[li_j] <= li_tableOccurrence ALORS
                                                {ps_champ,indChamp}[pt_LstIndice[li_j],li_i]=Faux
                                        SINON
                                                ExceptionDéclenche(3,ChaîneConstruit(ls_MessageErreur,ps_champ,pt_LstIndice[li_i],li_tableOccurrence))
                                        FIN
                                FIN
                                lb_retour=Vrai
                                SORTIR
                        FIN
                FIN
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type table ou colonne")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN
 
RENVOYER lb_retour

TableDeselectionneTout


Cette fonction permet de désélectionner toutes les cases d'une colonne de type interrupteur.

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
 
// Résumé : désélectionne toutes les options d'une colonne de type interrupteur
// Syntaxe :
//[ <Résultat> = ] TableDeselectionneTout (<ps_champ> est chaîne)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : nom de la colonne ou nom de la table
// Valeur de retour :
//         booléen : vrai si toutes les options de la colonne interrupteur ont été désélectionnées
//
// Exemple :
// Indiquez ici un exemple d'utilisation.
// TableDeselectionneTout(Col_Export..nom)
//       
PROCEDURE TableDeselectionneTout(ps_champ est un chaîne)
 
//----->Declaration des variables
lb_retour est un booléen
 
//----->Initialisation des variables
lb_retour=Faux
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typColonne ALORS
                POUR li_i=1 _A_ TableOccurrence(ps_champ)
                        {ps_champ,indChamp}[li_i]=0
                FIN        
                lb_retour=Vrai
        SINON SI {ps_champ,indChamp}..Type = typTable ALORS
                POUR li_i=1 _A_ {ps_champ,indChamp}..NombreColonne
                        SI {ps_champ,indChamp}[1,li_i]..Type = typInterr ALORS
                                POUR li_j=1  _A_ TableOccurrence(ps_champ)
                                        {ps_champ,indChamp}[li_j,li_i]=0
                                FIN
                                lb_retour=Vrai
                                SORTIR
                        FIN
                FIN
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type table ou colonne")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN
 
RENVOYER lb_retour

Exemple d'utilisation :

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
TableDeselectionneTout(Col_Select..nom)

Cette fonction peut prendre en paramètre le nom d'un champ table, la fonction sélectionnera toutes les cases de la première colonne de type interrupteur

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
TableSelectionneTout(Tab_ListeClientAExporter..nom)

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 Vous avez appelé l'opérateur [] sur le champ %%Champ%%.<br>
L'indice spécifié [%Indice%%] est invalide.<br>
Les valeurs valides sont comprises entre 1 et %%Occurrence%% (inclus).

Exemple d'utilisation avec la gestion des exceptions :

TableSelectionne


Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
QUAND EXCEPTION DANS 
	TableSelectionne(Col_SelectClient..Nom,[1,3,4,20])
FAIRE
	//Gestion des exceptions
FIN

TableSelectionneTout


Code Windev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
QUAND EXCEPTION DANS 
	TableSelectionneTout(Col_SelectClient..Nom)
FAIRE
	//Gestion des exceptions
FIN

TableDeselectionne


Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
QUAND EXCEPTION DANS 
	TableDeSelectionne(Col_SelectClient..Nom,[1,3,4,20])
FAIRE
	//Gestion des exceptions
FIN

TableDeselectionneTout


Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
QUAND EXCEPTION DANS 
	TableDeSelectionneTout(Col_SelectClient..Nom)
FAIRE
	//Gestion des exceptions
FIN

Conclusion



Ces fonctions permettent de faciliter la gestion d'une colonne de type interrupteur dans un champ table en proposant un ensemble de possibilité pour gérer la sélection/désélection. N'hésitez pas à me faire part de vos retours pour améliorer, compléter la liste de ces fonctions.
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 sélection/désélection d'une colonne de type interrupteur » dans le blog Viadeo Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog Twitter Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog Google Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog Facebook Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog Digg Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog Delicious Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog MySpace Envoyer le billet « WinDev : fonctions de sélection/désélection d'une colonne de type interrupteur » dans le blog Yahoo

Mis à jour 03/08/2016 à 12h44 par dsr57

Catégories
WinDev , Fonctions

Commentaires

  1. Avatar de dsr57
    • |
    • permalink
    Bonjour à tous ,

    Suite à un signalement de dysfonctionnement dans les procédures :
    • TableSelectionne ;
    • TableDeselectionne.

    Je vous informe de la correction de celles-ci, le code présent dans ce billet prend en compte ces corrections.

    Le problème se situait aux lignes de tests sur les occurences
    Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
    SI pt_LstIndice[li_i] < li_TableOccurrence ALORS

    Merci au développeur anonyme pour ce retour

    Bon dev à tous