Voir le flux RSS

Le Blog de DSR57 - Programmation WinDev

[Actualité] WinDev : fonctions de sélection/désélection des champs interrupteurs

Noter ce billet
par , 25/06/2015 à 14h31 (1509 Affichages)
Nouvelles fonctions pour améliorer la gestion de sélection/désélection d'un champ Interrupteur par programmation

Contexte technique et fonctionnel



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

Lors de mes développements personnels, j'ai du manipuler le champ interrupteur, 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, 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 éventuelles retour.


Version de WinDev : 20 et antérieures

Modfication du 22/09/2015 : Une version des fonctions avec le type de variable Champ est disponible dans ce billet WinDev : fonctions de sélection/désélection des champs interrupteurs V2
Version de WinDev : 19 et supérieures


Les fonctions



Nom : case_a_cocher.jpg
Affichages : 1623
Taille : 14,3 Ko

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

InterrupteurSelectionne

Cette fonction permet de sélectionner plusieurs options d'un champ 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
// Résumé : <indiquez ici ce que fait la procédure>
// Syntaxe :
//InterrupteurSelectionne (<ps_champ> est chaîne, <pt_LstIndice> est tableau)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : nom du chqmpde type interrupteur
//        pt_LstIndice (tableau) : Liste des indices à sélectionner
// Valeur de retour :
//         Aucune
//
// Exemple :
// InterrupteurSelectionne(Int_options,[1,2,3])
//
PROCEDURE InterrupteurSelectionne(ps_champ est un chaîne,pt_LstIndice est un tableau d'entiers)
 
//----->Declaration des variables
ls_MessageErreur est une chaîne
li_interrupteurOccurrence 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)."
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typInterr ALORS
                //----->Initialisation des variables
                li_interrupteurOccurrence={ps_champ,indChamp}..Occurrence
 
                POUR li_i=1 _A_ pt_LstIndice..Occurrence
                        SI pt_LstIndice[li_i] <= li_interrupteurOccurrence ALORS
                                {ps_champ,indChamp}[pt_LstIndice[li_i]]=Vrai
                        SINON
                                ExceptionDéclenche(3,ChaîneConstruit(ls_MessageErreur,ps_champ,pt_LstIndice[li_i],li_interrupteurOccurrence))
                        FIN
                FIN
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type interrupteur")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN

Exemple d'utilisation :

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
InterrupteurSelectionne(Int_LstOptions..nom,[1,3,5,7])

InterrupteurSelectionneTout

Cette fonction sélectionne toutes les options du champ interrupteur passé en paramètre

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
// Résumé : Sélectionne toutes les options d'un champ de type interrupteur
// Syntaxe :
//InterrupteurSelectionneTout (<ps_champ> est chaîne)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : Nom du champ de type interrupteur
// Valeur de retour :
//         Aucune
//
// Exemple :
// InterrupteurSelectionneTout(Int_LstOptions..Nom)
//
PROCEDURE InterrupteurSelectionneTout(ps_champ est un chaîne)
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typInterr ALORS
                POUR li_i=1 _A_ InterrupteurOccurrence(ps_champ)
                        {ps_champ,indChamp}[li_i]=1
                FIN        
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type interrupteur")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN

Exemple d'utilisation :

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

InterrupteurDeselectionne

Cette fonction permet de désélectionner plusieurs options d'un champ 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
// Résumé : Déselectionne les options du champ interrupteur passé en paramètre 1 avec les indices passé en paramètre 2 
// Syntaxe :
//InterrupteurDeselectionne (<ps_champ> est chaîne, <pt_LstIndice> est tableau)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : nom du champ interrupteur à manipuler
//        pt_LstIndice (tableau) : Liste des indices des options à désélectionner
// Valeur de retour :
//         Aucune
//
// Exemple :
// InterrupteurDeselectionne (Int_LstOptions..nom,[1,3,7])
//
PROCEDURE InterrupteurDeselectionne(ps_champ est un chaîne,pt_LstIndice est un tableau d'entiers)
 
//----->Declaration des variables
ls_MessageErreur est une chaîne
li_interrupteurOccurrence 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)."
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typInterr ALORS
                //----->Initialisation des variables
                li_interrupteurOccurrence={ps_champ,indChamp}..Occurrence
 
                POUR li_i=1 _A_ pt_LstIndice..Occurrence
                        SI pt_LstIndice[li_i] <= li_interrupteurOccurrence ALORS
                                {ps_champ,indChamp}[pt_LstIndice[li_i]]=Faux
                        SINON
                                ExceptionDéclenche(3,ChaîneConstruit(ls_MessageErreur,ps_champ,pt_LstIndice[li_i],li_interrupteurOccurrence))
                        FIN
                FIN
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type interrupteur")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN

Exemple d'utilisation :

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
InterrupteurDeselectionne(Int_LstOPtions..nom,[1,3,7])

InterrupteurDeselectionneTout

Cette fonction désélectionne toutes les options du champ interrupteur passé en paramètre

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
// Résumé : Déselectionne toutes les option d'un interrupteur
// Syntaxe :
//InterrupteurDeselectionneTout (<ps_champ> est chaîne)
//
// Paramètres :
//        ps_champ (chaîne ANSI) : Nom du champ de type interrupteur
// Valeur de retour :
//         Aucune
//
// Exemple :
// InterrupteurDeselectionneTout(Int_option..nom)
//
PROCEDURE InterrupteurDeselectionneTout(ps_champ est un chaîne)
 
SI ChampExiste(ps_champ) ALORS
        SI {ps_champ,indChamp}..Type = typInterr ALORS
                POUR li_i=1 _A_ InterrupteurOccurrence(ps_champ)
                        {ps_champ,indChamp}[li_i]=0
                FIN
        SINON
                ExceptionDéclenche(2,"Le champ '"+ps_champ+"' n'est pas de type interrupteur")
        FIN
SINON
        ExceptionDéclenche(1,"Le champ '"+ps_champ+"' n'existe pas")
FIN

Exemple d’utilisation :

Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
InterrupteurDeselectionneTout(Int_LstOPtions..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 interrupteur
3 Vous avez appelé l'opérateur [] sur le champ %%Champ%%.<br>
"L'indice spécifié [%Indice%%] est invalide. "+RC+...
"Les valeurs valides sont comprises entre 1 et %%Occurrence%% (inclus).

Exemple d'utilisation avec la gestion des exceptions :

InterrupteurSelectionne

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

InterrupteurSelectionneTout

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

InterrupteurDeselectionne

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

InterrupteurDeselectionneTout

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

Conclusion



Par ce billet, je viens de mettre à disposition de la communauté des fonctions pour améliorer la gestion par programmation du champ Interrupteur. 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 des champs interrupteurs » dans le blog Viadeo Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog Twitter Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog Google Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog Facebook Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog Digg Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog Delicious Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog MySpace Envoyer le billet « WinDev : fonctions de  sélection/désélection des champs interrupteurs » dans le blog Yahoo

Mis à jour 03/08/2016 à 23h15 par dsr57

Catégories
WinDev , Fonctions

Commentaires

  1. Avatar de KKJJAK
    • |
    • permalink
    bonjour ,je suis débutant en windev aider moi
    j'ai deux fenêtres ,FEN_VISION, et FEN_FICHE _ARTICLE
    DANS LA FENÊTRE VISION j'ai une (table article) qui regroupe les articles(ID,désignation,prix u,quantité,montant)
    dans la fenêtre FICHE j'ai une autre (table affiche)vide que je veux remplir.quant je sélectionne un article dans la table il apparaît dans la fenêtre FICHE dans un champ combo et ensuite j'utilise le bouton Ajout pour ajouter l'article dans la table affiche.Mais quand je fais cela c'est le même article qui apparaît dans la table et pas en ordre.
    voila le code du bouton AJOUT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // Affiche le nom de tous les articles
    
    HLitRecherchePremier(ARTICLE,IDARTICLE,COL_NOM)
    TableAjouteLigne(TABLE_COMMANDE, ARTICLE.IDARTICLE,ARTICLE.IDARTICLE, ARTICLE.Nomarticle, ARTICLE.quantité,ARTICLE.Prix_U_HT,ARTICLE."Taux de TVA",ARTICLE."Total TTC")
    
    // rafraichissement de la table
    TableAffiche(TABLE_COMMANDE,taCourantEnreg)
    // rafraichissement de la fiche
    FichierVersEcran()
    
    // Remet la quantité d'ajout à 0
    SAI_Ajouter_Quantité = 0
    
    // Reprend la saisie à la quantité (pour effectuer plusieurs saisies à la suite)
    RepriseSaisie(SAI_Ajouter_Quantité)
    ça na marche pas .aidez moi
    merçi d'avance
    Mis à jour 01/09/2015 à 14h16 par dsr57
  2. Avatar de dsr57
    • |
    • permalink
    Bonjour

    Dans un premier temps, mettez en place un test sur le retour de la fonction HLitRecherchePremier, soit en testant le retour, soit en utilisant la fonction HTrouve().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Si HLitRecherchePremier(ARTICLE,IDARTICLE,COL_NOM) alors
           //---->Suite du traitement
    SINON
          Erreur("......;")
    FIN
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HLitRecherchePremier(ARTICLE,IDARTICLE,COL_NOM)
    Si HTrouve(Article) alors
           //---->Suite du traitement
    SINON
          Erreur("......;")
    FIN
    (Cf. documentation en ligne de Pc-Soft : HlitRecherchePremier() )

    Ensuite lors de l'appel de la fonction HlitRecherchePremier, vous passez en troisième paramètre COL_NOM, est ce bien cette colonne qui contient l'identidfiant de l'article ?

    En espérant vous avoir aidé.
    En cas de questions sur WinDev, WinDev Mobile, WebDev, n'hésitez pas à ouvrir une discussion sur les forums et sous-forums : http://www.developpez.net/forums/f22...pement/windev/

    Bon dev
  3. Avatar de dsr57
    • |
    • permalink
    Bonjour à tous ,

    Suite à un signalement de dysfonctionnement dans les procédures du billet WinDev : fonctions de sélection/dé-sélection d'une colonne de type interrupteur, j'ai modifié les fonctions de ce billet pour prendre en compte ces BUGs. Le code présent dans ce billet prend en compte ces corrections.

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


    Merci au développeur pour son retour

    Bon dev à tous