IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Ajouter une procédure à l'ensemble des champs de saisie


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut Ajouter une procédure à l'ensemble des champs de saisie
    Bonjour à tous,

    J'ai un petit soucis ... et malgré deux / trois heures de recherche je n'arrive pas à corriger mon erreur.
    Que je vous explique,

    Sur une fenetre " client " plusieurs champs de saisie s'y trouve. Je désire sur certain champs pouvoir avoir la possibilité en cliquant sur un icone " liste " avoir une nouvelle fenetre avec un contenu, n'arrivant pas à trouver le moyen de reconnaître sur quel champs de saisie est actuellement le curseur (champs de saisie " actif) malgré un xxx..curseur <> 0 ..

    J'ai donc fait ceci, afin de rajouter une procédure à tous mes champs de saisie / interrupteur.

    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
     
    // On liste tous les champs " SAISIE " ou " INTERRUPTEUR ".
    ResChamp est une chaîne
    Resfenetre est une chaîne= "FEN_clients_fiches.ONG_onglet"
    ResChamp=EnumèreSousElément(Resfenetre,enumPremier)
    i est un entier = 0
    TANTQUE ResChamp<>""
    i++
    ResChamp=EnumèreSousElément(Resfenetre)
    SI Gauche(ResChamp,3) = "SAI" OU Gauche(ResChamp,3) = "INT" ALORS
     
    {ResChamp+"..Traitement[trtEntrée]"} = automatique
     
    FIN
    FIN
    dans ma procédure automatique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Procedure automatique()
     
    liste_en_cours = ""
     
    SI MoiMême..Nom = "SAI_C_fam_client" ALORS
    liste_en_cours = "famille"
    FIN
     
    Trace(dbgInfo(dbgTraitement))
    Info("ok")
    Ici je suis obligé de rajouter " RENVOYER(VRAI) " car sinon le programme me dit qu'il y a une erreur : "Erreur à la ligne 25 du traitement Déclarations globales de FEN_clients_fiches.
    La fonction 'Procédure locale automatique' aurait dû renvoyer une valeur."


    et sur mon bouton " liste "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SI liste_en_cours = "famille" ALORS
    Ouvre(FEN_liste_recherche,"REQ_clients_fam","")
    FIN


    et quand je lance ................

    Erreur à la ligne 25 du traitement Déclarations globales de FEN_clients_fiches.


    ----- Informations techniques -----

    Projet : TEST

    Appel WL :
    Traitement de 'Déclarations globales de FEN_clients_fiches' (FEN_clients_fiches), ligne 25, thread 0

    Code erreur : 0
    Niveau : pas d'erreur (EL_NONE)

    Informations supplémentaires :
    EIT_PILEWL :
    Déclarations globales de FEN_clients_fiches (FEN_clients_fiches), ligne 25
    EIT_DATEHEURE : 10/06/2014 17:23:39

    SVP ... un peu d'aide ='(
    Mille mercis
    Alexandra

  2. #2
    Membre averti
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Points : 435
    Points
    435
    Par défaut
    Bonjour,

    Perso, j'utilise un évènement qui détecte l'appui d'une touche de fonction (F4).
    Au moment de l'appui sur F4, on est encore dans le champ, donc on connait son nom (_EVE.nom).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SI _EVE.wParam=115 ET PAS F4_Actif //Touche F4
    	F4_Champ=_EVE.nom
    	 SI F4_Champ~="Table" ET F4_Col<>"" ALORS
    		F4_Champ=F4_Col
    	FIN
    	HlitRecherchePremier(f4_file,CHAMP,F4_Champ)
    	SI HTrouve()
    	       F4_Actif=Vrai
    	       F4_fenOrg=FenEnCours()+"."
    	       Exécute(F4_fenOrg+iif(SansEspace(F4.bouton)="","F4_INV",SansEspace(F4.bouton))+"..Clic")
    	 FIN
    FIN
    Ce code execute par défaut un clic sur un bouton F4_INV, invisible, présent dans toutes les fenêtres où F4 est utilisée.
    Celui-ci ouvre une fenêtre générique "F4_Fen".
    Le fichier F4_File décrit pour chaque champ où F4 peut être utilisée, le fichier à afficher, la clé, le tri, la valeur à renvoyer, un éventuel source compilé dynamiquement pour filtrer, etc...

    L'avantage de ce système est que, pour ajouter une nouvelle liste sur un champ, pas besoin de recompiler le projet, il suffit de décrire le champ dans le fichier F4_file

    C'est juste une piste...

    Patrick

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Cela semble, bien .. mais, si tu connais déjà le code de la liste ? cela fait quand meme apparaitre le fenetre ?
    exemple, tu sais que c'est la famille client 30, tu ne peux pas directement le saisir ?

    J'aimerai bien voir ta fenêtre f4_file & F4_fen tu me prêtes ton code ? *sourire d'ange*

    Aussi, à quel moment lances tu ton code afin qu'il détecte l'appuie de la touche ?!

    Mille mercis pour ton aide en tout cas
    Bises
    Alexandra

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 556
    Points : 1 198
    Points
    1 198
    Par défaut
    Bonjour,

    Par rapport à votre code, il y a une erreur dans votre indirection c'est peut-être cela qui génère votre erreur windev

    Citation Envoyé par neptunia Voir le message
    ...
    {ResChamp+"..Traitement[trtEntrée]"} = automatique
    ...
    Une indirection sert à référencer un "objet" pas une propriété. De manière général, si vous avez un doute sur la syntaxe : écrire le code sans indirection, et remplacer "l'objet" par son indirection.

    Cela devrait donc donner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SAI_MonChamp..Traitement[trtEntrée] = automatique
     
    deviendra :
     
    {ResChamp}..Traitement[trtEntrée] = automatique
    Ensuite je ne sais pas si j'ai saisi le contexte, mais pour moi, pas besoin de gérer d'événement. Si un seul bouton unique ouvre une fenêtre en fonction du champ en cours de saisie. Vous avez la fonction ChampPrécédent() qui devrait faire l'affaire, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Code sur clic de l'icone "liste"
    SELON ChampPrécédent()
    	CAS "SAI_NOM" : ouvre(FEN_Liste, "Nom")
    	CAS "SAI_VILLE" : ouvre(FEN_Liste, "Ville")
    	...
     
    FIN
    De plus si l'idée de la touche de raccourci vous plaît, il suffit de rajouter cette touche d'appel à l'icône liste. Et cela fonctionnera tout aussi bien avec un code plus lisible et maintenable.

  5. #5
    Membre averti
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Points : 435
    Points
    435
    Par défaut
    Citation Envoyé par neptunia Voir le message
    Cela semble, bien .. mais, si tu connais déjà le code de la liste ? cela fait quand meme apparaitre le fenetre ?
    exemple, tu sais que c'est la famille client 30, tu ne peux pas directement le saisir ?

    J'aimerai bien voir ta fenêtre f4_file & F4_fen tu me prêtes ton code ? *sourire d'ange*

    Aussi, à quel moment lances tu ton code afin qu'il détecte l'appuie de la touche ?!

    Mille mercis pour ton aide en tout cas
    Bises
    Alexandra
    On peut saisir dans le champ, c'est la touche F4 qui déclenche l'ouverture de la fenêtre (si le champ est paramétré dans le fichier F4_File)

    La détection de touche se fait par une déclaration d'évènement dans le code du projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wEveHdl=Evénement("F4_Key","*.*",256)
    Pour la fenêtre qui affiche la liste, il y a plusieurs possibilités. Dans ce projet il n'y a qu'une seule fenêtre F4_Fen avec une table générique (Colonnes COL01,COL02, etc...)
    remplie en fonction de la description dans le fichier F4_file pour le champ considéré.

    Je suis d'accord avec Ry_Yo, ça fait un code ardu avec moult indirections, pas très lisible.
    Dans un autre projet, j'ai utilisé un modèle de fenêtre F4_Fen, décliné en autant de fenêtres que de listes possibles. C'est plus simple, mais on perd
    l'avantage de pouvoir rajouter une liste F4 sans recompiler.
    De plus, s'il y a 25 fenêtres avec une recherche de code article (Champ RCH_CodArt par exemple) , on définit une seule fois la liste correspondant à RCH_CodArt
    et elle est implémentée automatiquement sur les 25 fenêtres.

    EDIT: Les champs sur lesquels on peut activer F4 sont repérés par un fond vert.
    La fonction SetCtrlChamp parcours le fichier F4_File et met en fond vert les champs actifs de la fenêtre dont le nom correspond.
    (la 1ère partie de la fonction signale les champs obligatoires)
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    PROCEDURE SetCtrlChamp(pFen)
    i est un entier
    ChObl est une chaîne 
    pFen=Majuscule(pFen)
    // Champs obligatoires (TypCtrl="OBLI"): libelle bleu
    // Le controle du champ est effectué dans ObligOK(), bouton OK de la fenetre
    gHlitRecherche("ctrlch","kFenChCt",Complète(pFen,20))
    TANTQUE HTrouve() // Il y a des champs obligatoires pour cette fenetre
    	ChObl=SansEspace(CC.champ)
    	SI CC.TypCtrl="OBLI" ET Occurrence(ChObl)>0 // Verifie que le champ existe toujours
    		SI ({ChObl}..Etat=Actif ET {ChObl}..Visible=Vrai)                  // Si le champ est actif...
    			{ChObl}..Libellé=gStylo(iBleuClair)+{ChObl}..Libellé  // ... son libelle passe en bleu
    		FIN
    	FIN
    	HLitSuivant("ctrlch","kFenChCt")
    FIN
     
    //------------------------------------------
    // Champs F4 sur fond vert
    SI Occurrence("F4_INV")>0  // Verifie présence du bouton F4_Inv
    	i=1
    	HLit("f4_file",i)      // Lecture de tous les enreg champs
    	TANTQUE PAS HEnDehors()
    		SI (HEtat()=hEtatActif) ET Occurrence(F4.champ)>0 // Si le champ existe dans la fenetre...
    			SI {F4.champ}..Type<>typTable // ... et pas une colonne de table...
    				SI ({F4.champ}..Etat=Actif ET {F4.champ}..Visible=Vrai)         // ... et est actif...
    					{F4.champ}..CouleurFond=RVB(192,255,192) //... il passe en fond vert
    				FIN
    			FIN
    		FIN
    		i++
    		HLit("f4_file",i)  // Champ suivant
    	FIN
    FIN

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/05/2012, 16h53
  2. Réponses: 1
    Dernier message: 04/08/2011, 10h48
  3. Hauteur adapté à l'ensemble des champs d'une ligne: Pas de réponses?!
    Par mikebo74 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 05/12/2007, 15h22
  4. Réponses: 1
    Dernier message: 22/11/2006, 17h38
  5. Réponses: 2
    Dernier message: 27/01/2006, 09h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo