Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

état : modifier la position des contrôles suivant valeur et occurence

5 réponses
Avatar
Hugo Degueldre
Bonjour,

Voici mon cas.
Pendant des années scolaires qui débutent le 01/09 et se terminent le 30/06,
des profs prestent des fonctions suivant une fraction.

Il faut calculer leur ancienneté de fonction :
- si la fraction est égale ou supérieure à 1/2, un jour compte pour un
jour avec un maximum de 300 par année scolaire
- si la fraction est inférieure, un jour compte pour un demi-jour avec
un maximum de 150 jours par année scolaire.

Il faut aussi calculer leur ancienneté de service
- tous les jours dont la somme des fractions des fonctions est égale ou
supérieure à 1/2 comptent pour 1 jour
- les autres comptent pour 1/2
Le maximum est de 300 par année scolaire.

Par une série de requêtes analyse croisée et regroupement, je crée une
nouvelle table mais elle contient tellement de champs (toutes les fonctions
effectuées par tous les profs) que le résultat en est ILLISIBLE.

Un formulaire est forcément trop long.

Idem pour un état (trop de pages) et souvent, une partie des données est sur
la 1ère, la suite sur la troisième et la fin sur la 5ème. Pas pratique.

Pour m'en sortir, j'ai essayé ce qui suit dans un état automatique basé sur
la dernière table, mon but étant la lisibilité du document, donc de rendre
invisible les contrôles ne comportant pas de données.

Private Sub Détail_Print(Cancel As Integer, PrintCount As Integer)
Dim allControls
Dim ctrl As Control
Set allControls = Me.Controls

For Each ctrl In allControls
If Left(ctrl.Name, 5) = "Somme" Then ' (les contrôles qui m'intéressent
se nomment SommeDeSommeDe112, p.ex)
If Right(ctrl.Name, 2) = "te" Then 'ça c'est pour repérer les
étiquettes
Dim laRef
laRef = Mid$(ctrl.Name, 15, Len(ctrl.Name) - 23)
If IsNumeric(laRef) Then
ctrl.Caption = DLookup("[Intitulé]", "CodesUF", "[numAdm] = " &
laRef) 'pour remplacer le teste de l'étiquette SommeDeSommeDe112 par son
équivalent dans la table des fonctions
Else
ctrl.Caption = ctrl.Caption
End If
Else
If IsNull(ctrl.Value) Then

ctrl.Visible = False
Else
ctrl.Visible = True
End If

End If
Else
End If
Next ctrl

End Sub

Ca marche, mais il me reste encore à déplacer les contrôles pour que la
première valeur non vide soit à 5 cm de hauteur,la 2ème à 6cm, la 3ème à 7
cm, etc.
Etatnt donné que personne n'a plus de 15 fonctions sur la même année
scolaire, l'ensemble serait visualisable sur une même page.
Là, je coince. Dommage, il me semblait avoir fait le plus compliqué.

Si en plus la taille de l'étiquette pouvait être adaptée à son contenu, j'en
serais ravi.

J'ai sûrement comliqué qqchose qui pourrait être simple pour un vrai
programmeur. Sorry.
Quelqu'un peut-il m'aider à avancer ou à reculer pour mieux sauter ?

Déjà merci

hd

5 réponses

Avatar
3stone
Salut,

"Hugo Degueldre"

<snip>

Ca marche, mais il me reste encore à déplacer les contrôles pour que la
première valeur non vide soit à 5 cm de hauteur,la 2ème à 6cm, la 3ème à 7
cm, etc.
Etatnt donné que personne n'a plus de 15 fonctions sur la même année
scolaire, l'ensemble serait visualisable sur une même page.
Là, je coince. Dommage, il me semblait avoir fait le plus compliqué.



Si je comprends ton "parcours" ;-)


Il y a dans les états, une propriété prévue pour les contrôles/sections vides,
c'est la propriété "Auto-réductible", mais, cela dépend fortement de la
construction de ton état (et de la base...)

Si tu as un regroupement avec 15 sections détails pour les 15 fonctions,
cela fonctionnera (les "vides" ne seront pas affichés et la section sera réduite...)
si par contre, tu as une section détail qui liste en vertical les 15 fonctions ;-(
cela empêchera l'utilisation de cet "automatisme"


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------

Avatar
Hugo Degueldre
Bonjour,

C'est malheureusement le second cas qui se présente et en (beaucoup) pire
que ce tu peux imaginer puisque cet état comprend 160 contrôles. Je ne peux
pas en réduire le nombre puisqu'il se trouve exister ce nombre de formations
et que tout ce qui risque d'arriver est qu'il augmente.

Je me disais (on peut rêver) que dans la boucle qui teste si la valeur du
contrôle est vide, il pourrait y avoir une autre boucle qui incrémenterait
un nombre et qui servirait à déterminer la propriété .Top du contrôle

Un truc du style
If IsNull(ctrl.value) Then
With ctrl
.Top = 0
.Visible = False
End With

Else
i = i + 1
With ctrl
.Top = 567 * i
.Visible = Tue
End With
End If

Mais si je touche à la propriété .Top, je reçois le message "erreur
d'exécution 2101 : le paramètre entré n'est pas valide pour cette
propriété".

J'ai essayé les valeurs 5000, 50, 10 cm. Toujours le même message.

Ne ferais-je pas mieux de virer ma table vers Excel ? et tenter de repoduire
une feuille dont le contenu des 15 colonnes qui suivent les données
identificatrices seraient la 1ère, 2ème et ainsi de suite occurence de
cellules non vides ? Je dois avoir qq part des exemples de fonctions Excel
de recherche de ce type.

Qu'en penses-tu ?

hugo

"3stone" a écrit dans le message news:
#
Salut,

"Hugo Degueldre"

<snip>

Ca marche, mais il me reste encore à déplacer les contrôles pour que la
première valeur non vide soit à 5 cm de hauteur,la 2ème à 6cm, la 3ème
à 7


cm, etc.
Etatnt donné que personne n'a plus de 15 fonctions sur la même année
scolaire, l'ensemble serait visualisable sur une même page.
Là, je coince. Dommage, il me semblait avoir fait le plus compliqué.



Si je comprends ton "parcours" ;-)


Il y a dans les états, une propriété prévue pour les contrôles/sections
vides,

c'est la propriété "Auto-réductible", mais, cela dépend fortement de la
construction de ton état (et de la base...)

Si tu as un regroupement avec 15 sections détails pour les 15 fonctions,
cela fonctionnera (les "vides" ne seront pas affichés et la section sera
réduite...)

si par contre, tu as une section détail qui liste en vertical les 15
fonctions ;-(

cela empêchera l'utilisation de cet "automatisme"


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------








Avatar
3stone
Salut,

"Hugo Degueldre"
C'est malheureusement le second cas qui se présente et en (beaucoup) pire
que ce tu peux imaginer puisque cet état comprend 160 contrôles. Je ne peux
pas en réduire le nombre puisqu'il se trouve exister ce nombre de formations
et que tout ce qui risque d'arriver est qu'il augmente.

Je me disais (on peut rêver) que dans la boucle qui teste si la valeur du
contrôle est vide, il pourrait y avoir une autre boucle qui incrémenterait
un nombre et qui servirait à déterminer la propriété .Top du contrôle

<snip>


Qu'en penses-tu ?


Que tu as du boulot sur la planche... ;-))

Et d'abord, ton code tu dois le mettre "Au formatage" de la section détail...


Voilà ce que j'ai testé:

Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)

Me.Détail.Height = 1900

If IsNull([txtTest]) Then
txtTest.Top = 833
Else
txtTest.Top = 633
End If

Me.Détail.Height = (txtTest.Top + txtTest.Height + 100)

End Sub


Pour la marche à suivre...
- Tu devrais définir des constantes, une pour chaque "mesure"
- le Top de chaque controle, la hauteur des controles,
la hauteur "normale" de la section détail...
- ne pas oublier que si tu déplace un contrôle, tous les suivants prendront
également cette position. Donc, placer chaque contrôle à *chaque* fois.


Ca roule ?


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------

Avatar
Hugo Degueldre
Salut,
Merci de m'avoir mis sur la piste.

Juste pour te faire rire, je t'envoie ce que j'ai fait.

Ca me donne un résultat qui me convient.

Bonne journée

hd

Private Sub Détail_Format(Cancel As Integer, PrintCount As Integer)

Dim allControls
Dim ctrl As Control
Dim ht1
ht1 = 2000
Dim ht2
ht2 = 450
Dim i, j
i = 1
j = 1
Set allControls = Me.Controls

For Each ctrl In allControls
If Left(ctrl.Name, 5) <> "Somme" Then
Else

If Right(ctrl.Name, 2) = "te" Then

Dim laRef
laRef = Mid$(ctrl.Name, 15, Len(ctrl.Name) - 23)
If IsNumeric(laRef) Then
ctrl.Caption = DLookup("[Intitulé]", "CodesUF", "[numAdm] = " &
laRef)
ctrl.Top = ht1 + (j * ht2)
ctrl.Left = 0
ctrl.Width = 6700
Else
ctrl.Caption = ctrl.Caption
ctrl.Top = ht1 + (j * ht2)
ctrl.Left = 0
ctrl.Width = 6700
'j = j + 1
End If
Else
If IsNull(ctrl.Value) Then
ctrl.Top = 0
ctrl.Visible = False
Else
ctrl.Left = 7000
ctrl.Width = 1200
ctrl.Top = ht1 + (i * ht2)
ctrl.Visible = True
i = i + 1
j = i - 1
End If

End If
End If


Next ctrl
'Me.Détail.Height = (ctrl.Top + (ht1 + (i * ht2)) + 100)
End Sub

----- Original Message -----
From: "3stone"
Newsgroups: microsoft.public.fr.access
Sent: Wednesday, April 07, 2004 1:33 AM
Subject: Re: état : modifier la position des contrôles suivant valeur et
occurence


Salut,

"Hugo Degueldre"
C'est malheureusement le second cas qui se présente et en (beaucoup)
pire


que ce tu peux imaginer puisque cet état comprend 160 contrôles. Je ne
peux


pas en réduire le nombre puisqu'il se trouve exister ce nombre de
formations


et que tout ce qui risque d'arriver est qu'il augmente.

Je me disais (on peut rêver) que dans la boucle qui teste si la valeur
du


contrôle est vide, il pourrait y avoir une autre boucle qui
incrémenterait


un nombre et qui servirait à déterminer la propriété .Top du contrôle

<snip>


Qu'en penses-tu ?


Que tu as du boulot sur la planche... ;-))

Et d'abord, ton code tu dois le mettre "Au formatage" de la section
détail...



Voilà ce que j'ai testé:

Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)

Me.Détail.Height = 1900

If IsNull([txtTest]) Then
txtTest.Top = 833
Else
txtTest.Top = 633
End If

Me.Détail.Height = (txtTest.Top + txtTest.Height + 100)

End Sub


Pour la marche à suivre...
- Tu devrais définir des constantes, une pour chaque "mesure"
- le Top de chaque controle, la hauteur des controles,
la hauteur "normale" de la section détail...
- ne pas oublier que si tu déplace un contrôle, tous les suivants
prendront

également cette position. Donc, placer chaque contrôle à *chaque*
fois.



Ca roule ?


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------




"3stone" a écrit dans le message news:


Salut,

"Hugo Degueldre"
C'est malheureusement le second cas qui se présente et en (beaucoup)
pire


que ce tu peux imaginer puisque cet état comprend 160 contrôles. Je ne
peux


pas en réduire le nombre puisqu'il se trouve exister ce nombre de
formations


et que tout ce qui risque d'arriver est qu'il augmente.

Je me disais (on peut rêver) que dans la boucle qui teste si la valeur
du


contrôle est vide, il pourrait y avoir une autre boucle qui
incrémenterait


un nombre et qui servirait à déterminer la propriété .Top du contrôle

<snip>


Qu'en penses-tu ?


Que tu as du boulot sur la planche... ;-))

Et d'abord, ton code tu dois le mettre "Au formatage" de la section
détail...



Voilà ce que j'ai testé:

Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)

Me.Détail.Height = 1900

If IsNull([txtTest]) Then
txtTest.Top = 833
Else
txtTest.Top = 633
End If

Me.Détail.Height = (txtTest.Top + txtTest.Height + 100)

End Sub


Pour la marche à suivre...
- Tu devrais définir des constantes, une pour chaque "mesure"
- le Top de chaque controle, la hauteur des controles,
la hauteur "normale" de la section détail...
- ne pas oublier que si tu déplace un contrôle, tous les suivants
prendront

également cette position. Donc, placer chaque contrôle à *chaque*
fois.



Ca roule ?


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------







Avatar
3stone
re,

"3stone"

Que tu as du boulot sur la planche... ;-))

Et d'abord, ton code tu dois le mettre "Au formatage" de la section détail...



A tout hasard...

Je précise que, si *tous les contrôles* se trouvent bien en *une* colonne,
donc, tous en vertical dans la zone détail, chacun avec éventuellement
son étiquette, tu devrais t'en sortir rien qu'à l'aide de la propriété
"Auto extensible" et "Auto réductible" que tu mets sur chaque zone de texte
et sur la section détail...



--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------