Base : maj sous-formulaire par listbox

Bonjour

En préambule une précision...

Il ne faut pas confondre deux choses :

1.Quand un enregistrement est sélectionné, disposer de listes pour modifier
la valeur d'un des champs. Par exemple, pour une facture, pouvoir choisir
dans la liste des clients. Il va de soi que ce faisant on ne souhaite pas
changer de facture...
2. Rechercher, choisir, sélectionner un enregistrement (une facture, un
client, un contrebassiste, etc.), par exemple d'après son nom. Après cette
opération l'enregistrement courant change : ce n'est plus systématiquement
le premier saisi mais celui trouvé qui est affiché, prêt pour la
consultation ou la modification.

De ce que je comprends tu souhaites réaliser le cas 2... mais ton formulaire
met en oeuvre le cas 1.

Le formulaire principal est fondé sur la table Clients et ta liste
déroulante modifie le contenu du champ NomClient.
Autrement dit, quand on sélectionne dans la liste, on modifie le nom du
client courant... Ce n'est pas ce que l'on veut.

On peut obtenir ce que tu souhaites par macro ou par un "truc" : utiliser
une table "supplémentaire" qui ne servira que pour la sélection. Dans
l'exemple joint je l'ai nommée... Sélection.

Elle ne contient que deux champs :

    ID_Sélection (Integer - clé primaire)
    Sélection (Texte VARCHAR_IGNORECASE)

Fonder le formulaire principal (MainForm) sur cette table Sélection
La liste déroulante sera liée au champ Sélection, ainsi, lorsqu'on
sélectionne dans la liste l'ID client correspondant sera enregistré dans le
champ Sélection de la table Sélection.

Le sous-formulaire (SubForm) reste fondé sur la table Commandes. Il est lié
au formulaire principal par les champs:
Sélection et RefClient.

Pour peaufiner, j'ai ajouté un bouton permettant de rafraîchir le
sous-formulaire après choix dans la liste déroulante.
Il suffit pour cela de choisir cette action dans l'onglet général des
propriétés du bouton.

test.odb <http://nabble.documentfoundation.org/file/n4036108/test.odb>

Je ne détaille pas les solutions macros, car il faut connaître les macros et
je ne sais pas si tu souhaites t'orienter par là.

Cordialement
Pierre-Yves

Bonjour,

Merci pour cette réponse rapide.

En fait, j'essayais de reproduire le fonctionnement de MS Access mais,
apparemment, Base ne fonctionne pas ainsi. La solution est satisfaisante à
un détail près : le fait d'utiliser un bouton pour le refresh; je pensais
que cela se ferait automatiquement.

Serait-il possible/imaginable via une macro de faire un "subform.reload" ou
assimilé qui serait démarré automatiquement après chaque changement de
valeur dans la listbox ?

Dans l'onglet Evénements de la listbox client, en bas, je vois "Après
l'actualisation"; en cliquant sur les "...", une fenêtre "Assigner une
action" s'ouvre, je trouve "Exécuter l'action" et y assigner une macro
démarrant un reload/refresh. Est-ce une bonne piste ?

Encore merci.

Michel

Suite...

Michel ALBERT wrote

En fait, j'essayais de reproduire le fonctionnement de MS Access mais,
apparemment, Base ne fonctionne pas ainsi.

Non en effet...

Michel ALBERT wrote

La solution est satisfaisante à un détail près : le fait d'utiliser un
bouton pour le refresh; je pensais que cela se ferait automatiquement.

Serait-il possible/imaginable via une macro de faire un "subform.reload"
ou assimilé qui serait démarré automatiquement après chaque changement de
valeur dans la listbox ?

Dans l'onglet Evénements de la listbox client, en bas, je vois "Après
l'actualisation"; en cliquant sur les "...", une fenêtre "Assigner une
action" s'ouvre, je trouve "Exécuter l'action" et y assigner une macro
démarrant un reload/refresh. Est-ce une bonne piste ?

Ci-joint nouvelle version avec macro donc :slight_smile:

Quelques explications:
- la macro (dont je joins le texte ci-dessous) est associée à l'événement
"Modifié"
plutôt que "Exécuter l'action" (inutile de lancer la macro si l'utilisateur
n'a fait que
cliquer sans modifier le contenu de la liste).
-la macro "valide" le choix fait dans la liste, puis valide l'enregistrement
du formulaire
MainForm et donc la modification faite dans la table "Sélection".
-elle termine par l'actualisation du sous-formulaire.

test.odb <http://nabble.documentfoundation.org/file/n4036129/test.odb>

Ci-dessous la macro:

option explicit

Sub PysActualiser(oEvent)
'Valider la modification dans la liste
oEvent.source.model.commit
'Valider la modification de l'enregistrement (MainForm)
oEvent.source.model.parent.updateRow
'Recharger les données du sous-formulaire
thiscomponent.drawPage.Forms.getByName("MainForm").getByName("SubForm").reload
End Sub

C'est parfait.Je comprends pourquoi cela faisait quelques jours que je
séchais là-dessus ! Manifestement, Base a un certain retard sur MS Access...
Cela ne change rien pour moi, c'est décidé, je passe à LibreOffice. Mes PC
sont sous Linux Debian, mes "utilisateurs/clients" sont sur PC et Mac. J'en
ai marre de garder un PC Windows uniquement pour MS Access. D'où LibreOffice
qui tourne sur les 3 OS.J'avais développé en 2005-2006 une petite
application MS Access pour une association d'aide au développement pour la
gestion des dons, donateurs avec génération d'attestation fiscale et, depuis
2012, génération d'un fichier xml à destination du ministère des finances.
Donc, je vais devoir (sérieusement) me mettre aux macros et à LibreOffice
basic.Vu que tu as un certain bagage LibreOffice/OpenOffice (à voir le
nombre de tes interventions sur les forum et dans les FAQ (au moins Base)),
as-tu un conseil de lecture/doc/faq pour Base avec macro ?Au risque
d'abuser, vu que c'est toi qui a mis à jour en dernier la FAQ Base
Formulaire avec sous-formulaire (
https://wiki.documentfoundation.org/FR/FAQ/Base/003
<https://wiki.documentfoundation.org/FR/FAQ/Base/003> ), ne pourrais-tu pas
y joindre la db test ? Je ne sais pas si c'est habituel ou même autorisé. Un
petit dessin valant mieux qu'un long discours, cet exemple est (sera) très
utile à d'autres.Encore merci pour ton aide.Michel

Bonjour Michel,

as-tu un conseil de lecture/doc/faq pour Base avec macro ?Au risque
d'abuser, vu que c'est toi qui a mis à jour en dernier la FAQ Base

Le guide de Andrew Pitonyak :
http://www.pitonyak.org/database/AndrewBase.odt

Le livre de Roberto Benitez :
http://www.lulu.com/fr/fr/shop/roberto-benitez/database-programming-with-openofficeorg-base-basic/paperback/product-3568728.html

Le livre de Marcelly/Godard :
http://www.eyrolles.com/Informatique/Livre/programmation-openoffice-org-et-libreoffice-9782212132472

Alex