Mes premiers pas dans les macros avec Base

Bonjour,

Je ne suis pas novice dans la programmation mais chaque environnement a ses spécificités.

Pour le cas présent je voudrais réaliser 3 actions dans un formulaire de saisie d’adhérents.
J’ai bien trouvé la liaison entre le champ de saisie et le déclenchement de la macro (Propriété du contrôle / Événements)

Par contre je bute sur la méthode pour récupérer / renvoyer le contenu du champ sur lequel je souhaite effectuer le contrôle en VB (je pense que l’objet ThisComponent est une piste à suivre …)

A titre d’exemple :

  • Sur un champ “Sexe” je voudrais :
    1) afficher une msgBox si la saisie est différente de H ou F
    2) passer le contenu du champ en majuscules

  • Sur le champ “Nom”, le passer systématiquement en majuscules après saisie

Un autre cas :

  • Pour la saisie des villes/codes postaux j’ai récupéré la codification officielle ici Base officielle des codes postaux - data.gouv.fr et j’ai généré, dans une table secondaire, des records “PrimaryKeyCP, code postal et ville” pour mon département

  • En conséquence il n’y a ni ville ni CP dans mon record Adhérent mais juste la PrimaryKeyCP

  • Du coup j’ai organisé le formulaire comme ceci
    Capture d’écran 2021-10-09 à 10.46.20

  • La zone de liste (triée sur le nom de la commune) fonctionne très bien mais les mises à jour des champs sous-jacents (Commune, Code postal, PrimaryKeyCP) ne se fait que lors d’une réactualisation du formulaire

  • Donc pour ce cas, grâce à une macro déclenchée après la sélection dans la liste, je souhaite que tous les champs sous-jacents soient instantanément mis à jour (nettement plus confortable pour la personne qui saisi :slight_smile: )

Voili vouilou

Any help ?

Merci d’avance - Jean-Paul

Bonjour @jpr105

Pour limiter la saisie (ex. F/H) il est préférable d’utiliser une liste déroulante présentant ces entrées (d’un point de vue ergonomique).

Pour la capitalisation les macros ne sont pas nécessaires. Je présente toutefois les deux possibilités (avec/sans macro) dans cette FAQ.

Pour le rafraîchissement après choix dans une liste, tu devrais trouver dans le guide base sur notre wiki. C’est un guide très complet incluant les exemples type de macro.

[Ajout 11-10-2021 18:30]

Disposant d’un peu plus de temps, ci-dessous un exemple de macro pour l’actualisation du sous-formulaire. Elle est à associer à l’événement Modifié de la liste déroulante.


Sub PysOnList(oEvt)
dim oList as object, oForm as object, oSubForm as object

oList = oEvt.source.model
oList.commit

oForm = oList.parent

if oForm.isNew then
	oForm.insertRow
elseif oForm.isModified then
	oForm.updateRow
end if

oSubForm = oForm.getByName("SubForm")
oSubForm.reload


End Sub

Partant de l’événement déclencheur (transmis dans oEvt),

  • on “remonte” à la liste afin de valider le choix (commit)
  • on “remonte” au parent de la liste, i.e. le formulaire
  • si on est sur un nouvel enregistrement on le crée (insertRow),
  • sinon on valide la modification (updateRow)
  • on “accède” au sous-formulaire (dans mon exemple il se nomme “SubForm”, nom à adapter éventuellement).
  • puis on recharge uniquement le sous-formulaire.

Pour la gestion “question/réponse”, ce site n’est pas un “chat”. La “réponse” est prévue pour les personnes qui répondent afin d’apporter une solution. Cela dit, tu devrais pouvoir éditer ta question initiale pour joindre un fichier exemple (attention aux données personnelles ou confidentielles).

Enfin, les fichiers joints sont visibles par tous sur ce site. La participation de tous les bénévoles est bienvenue :slight_smile: (et je ne peux répondre aux MP).

Cordialement

2 Likes

Merci @PSY pour tes réponses.

J’ai déjà réglé les points 1 et 2 (j’ai choisi l’option Macro pour la capitalisation … un bon exercice)

Le point 3 va être un peu plus long (j’ai récupéré le PDF sur les macros)

Par contre j’ai vu, sur votre serveur Discourse, que je ne peux pas répondre à ton post (juste le bouton “Comment” ni t’envoyer de mail en MP … question de droits ?

Ce serait bien pratique si un jour je souhaite t’envoyer ma base, par exemple :wink:

Bon dimanche et encore merci

Merci @PYS pour l’update

[Ajout 11-10-2021 18:30]

C’est vrai qu’il fallait faire un update du sous-formulaire seul car un refresh “global” effaçait tout, y compris la valeur saisie :roll_eyes:

Je garde ta solution car elle pourrait bien me servir …

Par contre j’ai trouvé autre chose de plus simple :

Capture d’écran 2021-10-12 à 15.23.45

La liste déroulante permet de sélectionner la commune via la requête SQL du contrôle :

SELECT CONCAT( CONCAT( “Commune”, ’ - ’ ), “Code_postal” ), “ID_CP” FROM “T_CP_Localités_Mon_Dep” ORDER BY CONCAT( CONCAT( “Commune”, ’ - ’ ), “Code_postal” ) ASC

La liaison entre les deux tables est réalisée par “ID_CP” (PrimaryKeyCP)

Merci pour ton aide :pray:

PS : si j’ai une autre question sur mon projet, je continue sur ce fil ou bien j’en ouvre un autre ?

Merci pour ton “retour”.

L’affichage par concaténation dans la liste est plus simple mais souvent inadéquat quand les données liées sont nombreuses (sélection d’un client par ex.). Dans ton cas, en effet, c’est efficace.

Pour les éventuelles futures questions il vaut mieux ouvrir un nouveau fil à chaque fois. Il est plus facile de comprendre (et donc de répondre à) une question précise.

Cordialement

Mille MERCIS @PYS !!!
Je débute sur Base, trois jours que je cherchais cette solution, qui fonctionne parfaitement pour mon application !
La solution de @jpr105 est très intéressante aussi, je m’y étais attelé sans succès.
Excellente année 2022 à toi, et à tous ceux qui passeront par là !