[Résolu][Base]Mise à jour formulaire non fait

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
nlbmoi
Membre cOOnverti
Membre cOOnverti
Messages : 320
Inscription : 04 août 2011 10:10

[Résolu][Base]Mise à jour formulaire non fait

Message par nlbmoi »


La modération vous a écrit: les termes dans macro sont inutiles dans la section macros et API => supprimés

Bonjour,

Dans ma base, sur le formulaire "Recherche", j'utilise une macro pour rechercher un terme dans mes entrées (par le numéro de série).
Je souhaite que lorsque j'appuie sur le bouton rechercher, le contrôle de table 1 soit mis à jour avec l'affichage des entrées avec le numéro de série indiqué : j'ai dû faire une mauvaise manipulation à un moment quand j'ai adapté le code mais je ne retrouve pas l'erreur.
Pourriez-vous m'aiguiller ?
Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par nlbmoi le 24 sept. 2021 07:44, modifié 2 fois.
Maison : LibreOffice 7.0.4.2, windows 7 ; Travail : Libre Office 6.2.2 (Obligation de version), windows 10 64 bits
Ce qui nous tue pas nous rend plus fort.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base]Mise à jour formulaire non fait

Message par Dude »

Salut,

Comme d'habitude, il faut publier le code de la macro concernée. Cela évite d'avoir à télécharger des documents et faire ce travail à ta place.

Code : Tout sélectionner

Sub PysRechercher()
    dim PysTexte as string, PysForm as object
    dim PysSQL as string

   PysForm = thisComponent.DrawPage.Forms.getByName("Formulaire")      'Accès au formulaire
    PysTexte = PysForm.getByName("Zone de texte 1").Text                  'Accès au texte de la zone

    If  PysTexte="" THEN
    MsgBox ("Il faut indiquer tout ou partie d'un numéro de série",48)
    Else
    PysSQL = "SELECT * FROM T_appareil WHERE UPPER (num_serie) LIKE UPPER('%" + PysTexte + "%')"
    PysForm.command = PysSQL            'Redéfinition de la source du formulaire
    PysForm.reload                     'Recharge le formulaire
    
' Mise à jour de la requête 
	'PysSQL = "SELECT T_appareil.id_appareil, T_typeappareil.typeappareil, T_modele.modele, T_marque.marque, T_appareil.num_serie, T_appareil.date_achat, T_maintenance.date_depart, T_maintenance.date_retour,T_typereparation.typereparation, T_maintenance.descriptif FROM T_appareil, T_marque, T_typeappareil, T_modele, T_maintenance, T_typereparation WHERE T_maintenance.id_appareil = T_appareil.id_appareil AND T_appareil.id_modele = T_modele.id_modele AND T_appareil.id_typeappareil = T_typeappareil.id_typeappareil AND T_maintenance.id_type = T_typereparation.id_typereparation AND T_marque.id_marque = T_appareil.id_marque AND num_serie LIKE '%" + PysTexte + "%'"  
	PysSQL = "SELECT * FROM T_appareil LEFT JOIN T_typeappareil ON T_appareil.type_appareil = T_typeappareil.typeappareil LEFT JOIN T_marque ON T_appareil.marque = T_marque.marque LEFT JOIN T_modele ON T_appareil.modele = T_modele.modele LEFT JOIN T_salle ON T_appareil.salle = T_salle.salle WHERE UPPER (num_serie) LIKE UPPER ('%" + PysTexte + "%')"
	oConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	oConnexion.queries.getByName("Req_NumSerie").Command = PysSQL
   'ThisDatabaseDocument.ReportDocuments.getByName( "Requête_HistoriqueAppareil" ).open	
    PysForm.command = PysSQL            'Redéfinition de la source du formulaire
    PysForm.reload                     'Recharge le formulaire
	End If
    End Sub
Pourquoi exécutes-tu deux requêtes ?
nlbmoi
Membre cOOnverti
Membre cOOnverti
Messages : 320
Inscription : 04 août 2011 10:10

Re: [Base]Mise à jour formulaire non fait

Message par nlbmoi »

Salut,

Désolé pour le code.
Je ne me souviens plus pourquoi : c'est un fichier d'il y a quelques années que j'ai repris dernièrement mais comme ça je dirai qu'une macro me servait uniquement à mettre à jour le formulaire et une autre pour afficher la liste dans un document
Maison : LibreOffice 7.0.4.2, windows 7 ; Travail : Libre Office 6.2.2 (Obligation de version), windows 10 64 bits
Ce qui nous tue pas nous rend plus fort.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base]Mise à jour formulaire non fait

Message par Dude »

nlbmoi a écrit :je dirai qu'une macro me servait uniquement à mettre à jour le formulaire et une autre pour afficher la liste dans un document
Il n'y a qu'une macro mais deux requêtes qui s'exécutent.
Commence par neutraliser l'une puis l'autre pour le débogage.
nlbmoi
Membre cOOnverti
Membre cOOnverti
Messages : 320
Inscription : 04 août 2011 10:10

Re: [Base]Mise à jour formulaire non fait

Message par nlbmoi »

Bonjour

Après avoir dû laisser mon problème de côté, j'essaye de le reprendre.
En conservant l'une ou l'autre des requêtes, je trouve toujours le même souci : le clic sur le bouton rechercher ne met pas à jour la table.
Maison : LibreOffice 7.0.4.2, windows 7 ; Travail : Libre Office 6.2.2 (Obligation de version), windows 10 64 bits
Ce qui nous tue pas nous rend plus fort.
nlbmoi
Membre cOOnverti
Membre cOOnverti
Messages : 320
Inscription : 04 août 2011 10:10

Re: [Base]Mise à jour formulaire non fait

Message par nlbmoi »

Bonjour,

Je relance le sujet, ayant repris mon fichier d'inventaire après une année mis de côté.
Dans la macro "Rechercher", je vois bien que la recherche est bien faite sur le numéro de série que je rentre car la barre de navigation m'indique le bon nombre d'enregistrements une fois cliqué sur Rechercher, de même en faisant ouvrir la requête Requête_HistoriqueAppareil les bonnes données s'affichent. Par contre, la mise à jour du sous-formulaire ne se fait toujours pas directement quand je clique sur Rechercher : j'aimerais que la liste des appareils s'affiche (actuellement, c'est le cas uniquement si je ferme le formulaire puis le rouvre, ce qui n'est pas très pratique).

Il doit sans doute manquer une liaison entre la recherche et le sous-formulaire mais je ne vois pas ce qui ne fonctionne pas.

Pourriez-vous m'aider ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Maison : LibreOffice 7.0.4.2, windows 7 ; Travail : Libre Office 6.2.2 (Obligation de version), windows 10 64 bits
Ce qui nous tue pas nous rend plus fort.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base]Mise à jour formulaire non fait

Message par Dude »

Salut,

Refais une base en mettant juste l'exhaustif visant à comprendre et reproduire.
Tu joins ce document avec uniquement les tables concernées, le formulaire et la macro.
Tu ajoutes des copies écran avec l'effet de départ et d'arrivée et/ou escompté

Il y a fort à parier qu'en faisant cet exercice, tu résolves toi-même le problème.
nlbmoi
Membre cOOnverti
Membre cOOnverti
Messages : 320
Inscription : 04 août 2011 10:10

Re: [Base]Mise à jour formulaire non fait

Message par nlbmoi »

Bonjour,

*
Dans le formulaire Recherche, je souhaite que lorsque je saisis un numéro de série d'un (ou plusieurs) appareil(s) dans la zone de texte et que je clique sur le bouton Rechercher, le résultat de tous les appareils dont une partie du numéro de série coincide s'affiche dans le sous-formulaire.
Par exemple, en tapant "MAT", je m'attends à obtenir ceci :
copie_attendu.jpg
Actuellement, j'obtiens le résultat de la précédente recherche par exemple :
copie_reel.jpg
La recherche se fait bien car lorsque je ferme le formulaire puis que je le rouvre, le sous-formulaire contient les données de la précédente recherche ; de plus, on voit dans l'image précédente que la barre de navigation dans le sous-formulaire affiche bien le bon nombre d'enregistrements (7 dans le résultat attendu).

Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Maison : LibreOffice 7.0.4.2, windows 7 ; Travail : Libre Office 6.2.2 (Obligation de version), windows 10 64 bits
Ce qui nous tue pas nous rend plus fort.
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1398
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Base]Mise à jour formulaire non fait

Message par jeanmi2403 »

Bonjour,
Premier détail, la mise à jour du Formulaire "Formulaire" ne suffit pas, car le contrôle table se trouve dans un sous formulaire.
Pour sa mise à jour (dans la méthode PysRechercher):

Code : Tout sélectionner

    SousForm =Pysform.getByName("Sousformulaire")
    Sousform.reload
Second détail, la source de ce sous formulaire est une requête enregistrée qui ne semble s'appliquer qu'à l'ouverture du formulaire en question, et si la modification de la requête est effectuée après l'ouverture, elle n'est pas prise en compte de manière dynamique, mais seulement à la prochaine ouverture.
Il suffit donc de modifier la source du formulaire (Type de contenu = Requête SQL) et de la modifier par :

Code : Tout sélectionner

  	SousForm.command = PysSQL
Juste avant le reload.
appareil_et_materielphysique.odb
Remarque : le code de Pierre-Yves est toujours très efficace, mais il vaut mieux se l'approprier pour l'adapter. Personnellement je reconstruis avec mes propres noms de variables et de procédure, je m'y retrouve mieux.....mais c'est ma vision !
Tu devrais pouvoir baliser [Résolu] (avec la coche verte..)
Cordialement,
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Jean-Michel
LibO 7.5.9 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 7.6 sur OpenSuse & Linux MX
nlbmoi
Membre cOOnverti
Membre cOOnverti
Messages : 320
Inscription : 04 août 2011 10:10

Re: [Base]Mise à jour formulaire non fait

Message par nlbmoi »

Merci beaucoup
Maison : LibreOffice 7.0.4.2, windows 7 ; Travail : Libre Office 6.2.2 (Obligation de version), windows 10 64 bits
Ce qui nous tue pas nous rend plus fort.