oK, cela semble fonctionner avec une fenêtre interne qui contient mon champ combo. Ce champ combo est alimenté par programmation et non pas par une requête paramétrée ..
Je fais encore 1-2 test et je reconfirme ...
oK, cela semble fonctionner avec une fenêtre interne qui contient mon champ combo. Ce champ combo est alimenté par programmation et non pas par une requête paramétrée ..
Je fais encore 1-2 test et je reconfirme ...
bon, je ne suis pas plus avancé qu'avant car je devrais maintenant sélectionner un valeur par défaut dans ma liste combo et il y a trop d'éléments en cascade, ça ne marche pas ...
ma combo se trouve ici :le système reconnait bien le chemin jusqu'à ma fenêtre interne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part LigneEncours = ListeCherche(TABLE_CreationClasses[TABLE_CreationClasses].COL_Volee.CFI_ListeVolees.COMBO_REQ_VoleesParAnneeScolaireEtSection, IntituleVolee)mais si j'ajoute encore mon champ combo, cela fait trop.
Code : Sélectionner tout - Visualiser dans une fenêtre à part TABLE_CreationClasses[TABLE_CreationClasses].COL_Volee.CFI_ListeVolees.
Ya-a-t-il un autre moyen d'accéder à mon champ combo ?
J'ai voulu tester.
J'ai créé une fenêtre vierge, une table 'remplie par programmation', j'ai une colonne COL2 qui est de type combo. J'ai juste cliqué sr suivant à chaque occasion, j'ai gardé tous les paramètres par défaut.
J'ai ajouté un bouton avec ce code :
J'obtiens le résultat voulu. J'ai un peu galéré, et c'est cette page de la doc qui m'a donné la réponse.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ch est une chaîne tablesuprimetout(table1) POUR i = 1 À 5 TableAjouteLigne (Table1) ch = "A"+i +"_1" POUR j = 2 _À_ i+2 ch = ch + RC+ "A"+i+ "_" + j FIN Table1.Col2[i]..Contenu = ch Table1.Col2[i] = i FIN
De manière générale, les fenêtre internes ne me semblent pas faites pour ça. Si visuellement, on veut casser la logique de colonnes, et mettre dans une même colonne plusieurs objets, alors on passe par une fenêtre interne. Ok, dans ce cas, pas d'autre solution (ou peut être les conteneurs)
Autre cas, si on veut faire une espèce de boite noire avec 3 ou 4 champs qui communiquent entre eux, on met ces champs dans une fenêtre interne, et ensuite on peut réutiliser cet objet. Le champ fenêtre interne est un facilitateur, pour avoir un code mieux structuré. Mais c'est tout.
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
Oui top et merci pour ton aide ... j'avais également cette solution avant que je ne chercher autre chose car le problème ici est que je ne peux pas afficher un élément spécifique comme valeur par défaut lors de l'affichage de ma combo. Si par exemple j'ai 5 éléments dans ma combo et que j'aimerais afficher le 3e je ne peux pas .. enfin je n'y suis pas arrivé
Je ne comprends pas la question.
Au moment de l'initialisation de la table, tu sais que pour telle ligne, tu veux voir 2025 par exemple, et tu veux que la combo propose les valeurs 2025, 2026 et 2027.
Et pour la ligne suivante, tu veux voir 2030, et la combo devra proposer 20027,2028,2029,2030.
Une solution, c'est d'ajouter une colonne COL_VALEUR_INITIALE qui sera invisible dans la version finale, et qui contient la valeur (2025 et 2030 dans mon exemple)
Et quelque chose comme ça:
Quand je prépare le contenu de ma combo, je regarde quel n° de ligne contient la valeur qui doit être pré-sélectionnée.
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 ch est une chaîne j0 est un entier ch0 est une chaîne POUR i = 1 À 5 TableAjouteLigne (Table1) Table1.COL_VALEUR_INITIALE [i] = NumériqueVersChaîne(2025+(i-1)*5) j0=1 ch = "" POUR j = 1 _À_ i+2 ch0 = NumériqueVersChaîne(2022+j+2*i) ch += [ RC] + ch0 SI ch0 = Table1.COL_VALEUR_INITIALE [i] ALORS j0 = j FIN Table1.Colonne2[i]..Contenu = ch Table1.Colonne2[i] = j0 FIN
La colonne COL_VALEUR_INITIALE n'est pas indispensable, mais ça donne de la 'traçabilité'.
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
Ok je pense voir ce que tu essaies de faire ... donc avec ta dernière commande
le champ combo va se positionner sur cette valeur ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Table1.Colonne2[i] = j0
J'avais tenté un listeselectplus mais ça ne marchait pas car le champ combo remplir de cette manière n'est pas reconnu en tant que liste ..
J'essaie ta méthode cet après-midi et je poste le résultat![]()
Ce que je ne comprends pas, c'est ta "non possibilité" de sélection par défaut. Si tu mets un listeselectplus après le remplissage des combos, ça ne fonctionne pas ?
Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.
Sur internet, tout est vrai ! Honoré de Balzac
Make it real not fantasy... Herman Rarebell
J'ai donc testé avec ajout par "contenu"
comme je traite le contenu d'une requête, ce n'est qu'à la première itération que je crée mon entrée dans la table. Ensuite, j'ajoute juste des valeurs différentes dans ma colonne de contenu..
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 SI HExécuteRequêteSQL(MasourceVolees,hRequêteDéfaut,MaListeVolees) ALORS MonCompteur = 0 POUR TOUT MasourceVolees SI MonCompteur = 0 ALORS MaLigne = TableAjouteLigne(TABLE_CreationClasses,sdMesSections.Intitule,sdMesSections.idsectionFiliere,1,MasourceVolees.IDVolee,sdMaSrcGrille.DescGrille,sdMaSrcGrille.IDGrille,sdMesSections.DénominationClasses,sdMesSections.IDSemestreDemarrage,sdMesSections.NBSemestresDeFormation,sdMesSections.LettreDeDemarrage) TABLE_CreationClasses.COL_Volee[MaLigne].Contenu = MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) SINON TABLE_CreationClasses.COL_Volee[MaLigne].Contenu = TABLE_CreationClasses.COL_Volee[MaLigne].Contenu + RC + MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) FIN MonCompteur++ FIN TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase
Mon champ combo m'affiche bien, pour chaque ligne, les volées liées à l'année scolaire définie
Par contre, au démarrage, et je pense en aison de la ligne :
je n'ai aucune valeur par défaut qui s'affiche alors que j'aurais souhaité que la valeur 23 (sélectionnée en haut de l'écran) s'affiche par défaut
Code : Sélectionner tout - Visualiser dans une fenêtre à part TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase
![]()
La doc dit que ces 2 instructions ci-dessous sont équivalentes :
Mais c'est partiellement vrai.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ListeSelectPlus(<Champ Liste>, <Indice>) <Champ Liste> = <Indice>
Dans les faits, ListeSelectPlus est utile uniquement si on a de la multi-sélection. Dans les autres cas, la 2ème syntaxe est soit identique, soit mieux que la syntaxe avec ListeSelectPlus.
Quand on a un champ combo1 dans une fenêtre, et qu'on a combo1 dans le code, combo1 représente parfois le champ (combo1..x=10 : on déplace le champ combo1 à tel endroit), et parfois, combo1 renvoie un entier, le numéro de la ligne de la combo qui a été sélectionnée par l'utilisateur, ou -si aucune linge n'a été sélectionnée.
Le ""compilateur"" arrive généralement à savoir si combo1 dans le code, ça représente le champ, ou cet entier.
Mais dès qu'on sort du champ combo basique, le compilateur a de plus en plus en plus de mal, et quand il voit Table1.colcombo[3], est-ce que ceci représente le champ combo qui est dans la ligne 3 de table1 en colonne COLCOMBO, (et dans ce cas on peut modifier son contenu, sa couleur, sa police de caractère) , ou bien, est-ce que ça représente le n° de la ligne sélectionnée dans cette même combo, ce n'est jamais très clair. Souvent, on aimerait que ça représente le champ, et au final, c'est juste un entier égal à -1, parce que ça représente un n° de ligne, et s'il n'y a pas de ligne sélectionnée, c'est la valeur -1.
Table1.ColCombo[i]..Contenu : là, ça va, il y a ..Contenu derrière, donc forcément, c'est le champ qu'on veut traiter, et pas l'entier 'ligne sélectionnée'.
Avec la syntaxe <Champ Liste> = <Indice>, on est tranquille. A gauche du signe = , on a forcément un truc qu'on cherche à modifier. Le compilateur ne peut pas se tromper. combo=5, ça veut dire qu'on veut sélectionner la ligne 5 de cette combo.
Avec la syntaxe ListeSelectPlus(<Champ Liste>, <Indice>) ,le compilateur commence par remplacer <Champ Liste> par sa valeur, et en l'occurrence, il fait le mauvais choix, il remplace ce truc par le numéro de ligne actuellement sélectionnée (-1 en général), puis il essaie de faire ListeSelectPlus(-1, <Indice>).
Quelque part, le compilateur a en mémoire la liste des champs 'natifs' : les objets qu'on voit dans la description de la fenêtre. Quand l'objet qu'on manipule est facilement identifiable comme un de ces objets, il ne se trompe pas. Sinon, c'est mort.
Ici, on a aussi cette syntaxe qui fonctionne : Table1.Colonne2[i]..valeur = j0
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
Merci pour toutes ces informations, c'est très sympa et m'aide mais ....
J'ai modifié mon code et après avoir rempli mon champ combo, je fais ceci :
mais cette fois, toutes les lignes de mon champ combo ont été supprimées et remplacées par une valeur unique qui est 'IntituleVoleeBase'...
Code : Sélectionner tout - Visualiser dans une fenêtre à part TABLE_CreationClasses.COL_Volee[MaLigne]..Contenu = IntituleVoleeBase
J'ai dû manquer quelque chose ...
![]()
Oui, là tu dis que tu n'as qu'une valeur dans ta combo.
Il faut que tu regardes du côté de listerecherche et de listeselectplus
Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.
Sur internet, tout est vrai ! Honoré de Balzac
Make it real not fantasy... Herman Rarebell
Je regarde ce code :Ta commande tableAjouteLigne() est plus ou moins condamnée à planter.
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 SI HExécuteRequêteSQL(MasourceVolees,hRequêteDéfaut,MaListeVolees) ALORS MonCompteur = 0 POUR TOUT MasourceVolees SI MonCompteur = 0 ALORS MaLigne = TableAjouteLigne(TABLE_CreationClasses,sdMesSections.Intitule,sdMesSections.idsectionFiliere,1,MasourceVolees.IDVolee, sdMaSrcGrille.DescGrille,sdMaSrcGrille.IDGrille,sdMesSections.DénominationClasses, sdMesSections.IDSemestreDemarrage,sdMesSections.NBSemestresDeFormation,sdMesSections.LettreDeDemarrage) TABLE_CreationClasses.COL_Volee[MaLigne].Contenu = MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) SINON TABLE_CreationClasses.COL_Volee[MaLigne].Contenu = TABLE_CreationClasses.COL_Volee[MaLigne].Contenu + RC + MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) FIN MonCompteur++ FIN //FIN POUR TOUT TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase FIN
Je remplacerais :par
Code : Sélectionner tout - Visualiser dans une fenêtre à part TableAjouteLigne(TABLE_CreationClasses,sdMesSections.Intitule,sdMesSections.idsectionFiliere,1,MasourceVolees.IDVolee,sdMaSrcGrille.DescGrille,sdMaSrcGrille.IDGrille,sdMesSections.DénominationClasses,sdMesSections.IDSemestreDemarrage,sdMesSections.NBSemestresDeFormation,sdMesSections.LettreDeDemarrage)
Pourquoi ? Avant ce TableAJouteLigne, la ligne n'existe pas, évidemment. La combo n'existe pas. Le tableAjouteLigne est donc amené à initialiser la combo, et choisir une ligne de la combo, et ensuite, dans les instructions suivantes, tu vas modifier TABLE_CreationClasses.COL_Volee[MaLigne].Contenu ; ça ne peut pas marcher.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 TableAjouteLigne(TABLE_CreationClasses) MaLigne = tableOccurence (TABLE_CreationClasses) TABLE_CreationClasses.Col_Intitule[i] =sdMesSections.Intitule TABLE_CreationClasses.Col_sectionFiliere[i] =sdMesSections.idsectionFiliere etc
Etape 1 : tu insères une ligne Vide.
Etape 2 : tu remplis tous les champs un par un
Etape 3 : tu crées ta combo TABLE_CreationClasses.COL_Volee[MaLigne].Contenu = ... la liste des volées possibles pour cette ligne.
Etape 4 : tu fais en sorte d'afficher la volée qui a été renvoyée par ta requête : TABLE_CreationClasses.COL_Volee[MaLigne].Valeur = ...
Je viens de comprendre un autre truc dans ton code.
Tu batis le contenu de ta combo 'en direct', c'est à dire en modifiant pas à pas le contenu du champ TABLE_CreationClasses.
En terme de performance, tu as plutôt intérêt à jouer avec des variables autres que celles qui sont visibles à l'écran, et à la fin, informer l'écran : coucou, écran, affiche moi ce truc.
Le truc qui te préoccupe, c'est la ligne TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase
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 contenu_future_combo est une chaine SI HExécuteRequêteSQL(MasourceVolees,hRequêteDéfaut,MaListeVolees) ALORS MonCompteur = 0 contenu_future_combo ="" POUR TOUT MasourceVolees SI MonCompteur = 0 ALORS MaLigne = TableAjouteLigne(TABLE_CreationClasses,sdMesSections.Intitule,sdMesSections.idsectionFiliere,1,MasourceVolees.IDVolee, sdMaSrcGrille.DescGrille,sdMaSrcGrille.IDGrille,sdMesSections.DénominationClasses, sdMesSections.IDSemestreDemarrage,sdMesSections.NBSemestresDeFormation,sdMesSections.LettreDeDemarrage) contenu_future_combo = MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) SINON contenu_future_combo = contenu_future_combo + RC + MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) FIN MonCompteur++ FIN //FIN POUR TOUT TABLE_CreationClasses.COL_Volee[MaLigne]..contenu = contenu_future_combo TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase FIN
IntituleVoleeBase , c'est un nombre , un n° d'année : 23, 24 ou 25 par exemple.
Dans ton instruction contenu_future_combo = contenu_future_combo + RC + MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) , MasourceVolees.Intitule , c'est aussi un n° d'année, et MasourceVolees.IDVolee , c'est un identifiant sans réelle signification pour l'utilisateur (101,102, 103 par exemple)
L'intérêt de gValeurMémorisée(), c'est pour dire : ok, à l'affichage, on voit 23, 24 ou 25, mais la valeur que je veux traiter par programmation, c'est une autre, c'est 101, 102, 103.
Quand tu fais TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase , avec IntituleVoleeBase =23, tu dis au programme : Dans la combo, active la ligne où il y a 23 dans la gValeurMémorisée. Or, il n'y a aucune ligne avec 23 dans la gValeurMémorisée, toutes les lignes ont des numéros 'non-significatifs pour l'utilisateur'.
Je pars du principe qu'à d'autres endroits de ta fenêtre , tu auras effectivement besoin de ces codes 101,102,103, donc on n'y touche pas.
Je vais reproposer un truc très similaire à l'idée précédente :
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 contenu_future_combo est une chaine j0 est un entier SI HExécuteRequêteSQL(MasourceVolees,hRequêteDéfaut,MaListeVolees) ALORS MonCompteur = 0 contenu_future_combo ="" j0=1 POUR TOUT MasourceVolees SI MonCompteur = 0 ALORS MaLigne = TableAjouteLigne(TABLE_CreationClasses ,sdMesSections.Intitule,sdMesSections.idsectionFiliere,1,MasourceVolees.IDVolee, sdMaSrcGrille.DescGrille,sdMaSrcGrille.IDGrille,sdMesSections.DénominationClasses, sdMesSections.IDSemestreDemarrage,sdMesSections.NBSemestresDeFormation,sdMesSections.LettreDeDemarrage) contenu_future_combo = MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) si IntituleVoleeBase =MasourceVolees.Intitule alors j0=1 SINON contenu_future_combo = contenu_future_combo + RC + MasourceVolees.Intitule + gValeurMémorisée(MasourceVolees.IDVolee) si IntituleVoleeBase =MasourceVolees.Intitule alors j0=MonCompteur+1 FIN MonCompteur++ FIN //FIN POUR TOUT TABLE_CreationClasses.COL_Volee[MaLigne]..contenu = contenu_future_combo TABLE_CreationClasses.COL_Volee[MaLigne]..valeur = j0 FIN
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
TABLE_CreationClasses.COL_Volee[MaLigne]..Contenu = IntituleVoleeBase
..Contenu, ça sert à définir le contenu (total) de la combo : la liste de TOUTES les volées possibles.
C'est ..Valeur qui permet de choisir une des années parmi ces années, mais avec des galères, puisque ..Valeur attend un n° d'option : si les options proposées sont 2023, 2024 et 2025, et si on veut sélectionner 2024, il faut dire ..Valeur = 2 , et pas ..Valeur = 2024.
Et ça peut être encore autre chose si on travaille avec les gValeurMémorisée.
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
ouhla, beaucoup de choses, merci beaucoup tbc92...
alors pour cela, j'ai compris merci![]()
J'ai également compris que construire ma liste totale avant de l'affecter à ma liste combo est mieux, merci. Par contre, tu dis que que mon code ne marche pas ... mais il fonctionne. J'ai bien ma liste combo qui est remplie et avec les bonnes valeurs (mais cela ne change pas le fait qu'il est mieux de créer ma liste de valeurs avant de l'affecter à ma combo.)L'intérêt de gValeurMémorisée(), c'est pour dire : ok, à l'affichage, on voit 23, 24 ou 25, mais la valeur que je veux traiter par programmation, c'est une autre, c'est 101, 102, 103.
Quand tu fais TABLE_CreationClasses.COL_Volee[MaLigne] = IntituleVoleeBase , avec IntituleVoleeBase =23, tu dis au programme : Dans la combo, active la ligne où il y a 23 dans la gValeurMémorisée. Or, il n'y a aucune ligne avec 23 dans la gValeurMémorisée, toutes les lignes ont des numéros 'non-significatifs pour l'utilisateur'.
Je pars du principe qu'à d'autres endroits de ta fenêtre , tu auras effectivement besoin de ces codes 101,102,103, donc on n'y touche pas.
je modifie mon code pour coller à ton exemple et je poste le résultat...
Merci infiniment pour toutes ces explications très claires![]()
Fantastique !!
Cela fonctionne très bien !!
L'astuce était bien, comme tu l'as très bien mentionné, dans le fait d'indiquer la valeur pour la recherche et que cette dernière était liée à la valeur mémorisée et non pas à la valeur affichée...
Toutes les volées possibles pour l'année scolaire affichée sont disponibles et la volée par défaut sélectionnée est bien celle affichée en haut de mon écran ... c'est parfait
Code : Sélectionner tout - Visualiser dans une fenêtre à part TABLE_CreationClasses.COL_Volee[MaLigne]..valeur = j0
Un gigantesque merci pour toutes ces explications![]()
Je plussoie tbc92 qui t'a montré plein de trucs vachement bien
Tu as aussi la possibilité d'utiliser ..ValeurAffichée.
Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.
Sur internet, tout est vrai ! Honoré de Balzac
Make it real not fantasy... Herman Rarebell
oui, c'est vraiment génial, je n'aurais pas trouvé cela tout seul ! D'ailleurs il me semble que l'aide Windev n'en parle pas non plus ...
Selon ta remarque et si je comprends bien ...
En utilisant macombo[indice]..valeur = xx j'active la ligne qui contient xx dans la valeur mémorisée
En utilisant macombo [indice]..ValeurAffichée = xx j'active la ligne qui contient xx dans la valeur affichée
est-ce bien cela ?
En utilisant macombo [indice]..ValeurAffichée = xx j'active la ligne qui contient xx dans la valeur affichée ?
Je ne crois pas.
La doc dit que ..ValeurAffichée permet de connaître la valeur Affichée, mais pas de modifier quoi que ce soit. C'est un truc qui est en lecture seule.
N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager