[Base] Difficulté pour lancer un report à patir d'un bouton de formulaire

Bonjour,
Je voudrais lancer l’impression d’une facture choisie dans un formulaire (contenant un Contrôle de table) à l’aide d’un bouton placé dans le formulaire.
J’ai essayé plusieurs méthodes

  • celle trouvée dans le livre “Guide Base 6.4” de J.M Coste
  • celle trouvée ici même dans le wiki sans doute proposée par Pierre-Yves Samin
    et …
    Je n’arrive pas à les faire marcher
    celle de Pierre-Yves (plutot réservée à l’ouverture d’un template externe je pense) me renvoie aucune facture (problème sans doute dans mon SQL ?)
    celle de JM Coste me renvoie systématiquement sur la première facture (sans doute encore un problème dans la modif du SQL.
    Dans les 2 cas j’aurais aimé utiliser la propriété Filter du report (ça me semblait plus “élégant”) qui je pense devrait permettre de s’affranchir d’ouvrir le SQL. Mais quand on charge le report avant de l’ouvrir la propriété Component (qui contient Filter et CurrentController) est positionnée à grrr!
    Voilà ça fait trois jours que je “xraye” pour comprendre ou je fais l’erreur.
    Pouvez vous m’aider ? merci…
    testFacture.odb (26.9 KB)

Bonsoir,
Après avoir étudié votre BD exemple, je me permets d’ énoncer un certain nombre de remarques.
J’ ai testé votre requête dans la macro avec l’ outil Outils/SQL. Cette requête fonctionne. L’ erreur devrait se situer dans la ligne:

sSQL = sSQL + " AND Factures.fac_ID = " & iNumFac & “”

Je ne vois pas bien ce que voulez faire.
Sur le plan plus général, concernant les tables, voici quelques remarques:
Vous avez bien un ID auto sur chaque table sauf sur la table PayModes!
Dans la table factures, vous utilisez des ID extérieurs à la table. Vous les déclarez en SmallInteger, pour moi, un simple Integer suffirait.
Par principe, il vaudrait mieux que vos clés soient en début de liste des champs, c’est plus facile de s’y retrouver.Par exemple:

ID_Facture en integer auto (clé principale de la table)
ID_Tiers en integer simple( lien vers la table Tiers)
ID_ModPaie en integer simple (idem que ci dessus)
Ensuite tout vos champs

Vous devriez remplir l’ onglet relation existant dans la rubrique Outils/Relations. C’ est important pour le moteur de recherche.
Autre chose, dans votre module macro, il est important de préciser en première ligne de votre module Option Explicit. L’ avantage, c’ est que basic vous signalera toutes erreurs de variables.
Désolé d’ avoir été un peu long mais si vous en êtes au démarrage de votre développement, Réfléchissez bien au but à atteindre. Cela vous évitera une grosse déconvenue au cours de votre avancement.(J’ ai rencontré ce genre de déboires)
Bonne soirée

Oups ! Super ! Merci pour vos remarques.
Je suis bien d’accord avec vous.

Vous avez bien un ID auto sur chaque table sauf sur la table PayModes!
Pour cette table je pense que l’ID auto n’est pas indispensable
Pour l’ordre de champs …
Vous avez peut-être constaté qu’il est impossible de “retrier” les champs de table en mode ébauche et que lorsque on fait une erreur de type le nouveau champ se retrouve en fin de liste. Ce mode ébauche n’est pas très souple.
Pour l’option explicit je me suis aperçu que le basic me signale systématiquement une erreur de non définition.
Je suis en effet au début d’un développement avec apprentissage de Basic et Api pfff! je trouvais Basic Acces plus “simple” mais bon c’était il y 30 ans :grinning_face_with_smiling_eyes:
Merci encore.

Bonjour @reginacoco

Je suis effectivement l’auteur de la fiche sur le wiki…

Ton champ Factures.fac_ID est de type Integer or dans ton sql tu l’entoures de comme si c’était un texte.

J’attire par ailleurs ton attention sur le fait que les deux solutions sont incompatibles dans la même procédure car l’une ajoute un filtre au rapport (qui “surchargerait” la requête mise à jour dans la deuxième.
Cordialement

Bonsoir Pierre-Yves,

oups en effet je vais corriger

oui j’ai bien compris j’ai fais des GoSub qui me permettent d’essayer de voir comment ça marche.
Franchement j’aimerai bien utiliser la propriété Filter à la place d’aller surcharger la requête de fond.
Je n’arrive pas à comprendre pourquoi la propriété Component est nulle après chargement du report, ce qui me met en erreur également sur le .CurrentController pour masquer la vue.
Il est évident qu’a terme je n’utiliserai qu’une solution dans ma procédure.
Merci pour ton aide.

Bonjour

Tu mémorises l’objet avant ouverture :

oDoc = ThisDatabaseDocument.ReportDocuments.getByName("rptFacture")
'oDoc.Component.Filter = " (fac_ID = '" & iNumFac &"')"  'oFacture.Component.Filter =" (fac_ID = '" & iNumFac &"')"
oDoc.Open

Pour qu’il y ait l’objet component :

oDoc = ThisDatabaseDocument.ReportDocuments.getByName("rptFacture").open

Tu vois qu’il sera plus simple de filtrer la source de données (requête) avant :slight_smile:
Cordialement

Oui en effet. Mais alors je ne vois pas trop dans quel cas la propriété Component.Filter est utilisée
Merci Pierre-Yves … je garde ta solution
Bonne journée à toi