Bonsoir Christophe,
Tout est parfait.
Merci.
Gérard
Bonsoir Christophe,
Tout est parfait.
Merci.
Gérard
Bonjour, Christophe,
Comme je te l'ai dit tout est parfait.
Ce que j'ai du faire c'est créer un formulaire Historique contacts Pige, car avant cette table était affichée dans le formulaire Piges sous forme de feuille de données. (Ce qui était plus pratique, car cela me permettait de présenter les données en les triant, exemple, tri sur Type...)
Est-ce possible de modifier le code ?
Pour utiliser la feuille de données de Table.Historique contacts Pige à la place du sous-formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Private Sub cmdOuvrirAcquereur_Click() Dim sNomCtlSsFormulaire As String Dim sChampAlire As String Dim sId As String Dim sFormulaireAOuvrir As String Dim sCritWhere As String ' Nom du formulaire que l'on veut ouvrir sFormulaireAOuvrir = "Acquéreurs" ' Nom du contrôle sous-formulaire dont l'objet source est «Table.historique contacts Piges» sNomCtlSsFormulaire = "Historique contacts Pige" ' Nom du champ duquel on veut obtenir la clé de Acquéreurs sChampAlire = "lien_acquereur" ' Tentative de lecture du champ à lire dans le contrôle sous-formulaire On Error Resume Next sId = Me.Controls(sNomCtlSsFormulaire).Form.Controls(sChampAlire).Value On Error GoTo 0 ' Si Ok, ouvrir le «formulaire à ouvrir» filtrer sur la clé lue précédemment If Len(sId) > 0 Then sCritWhere = "[ID]=" & sId DoCmd.OpenForm sFormulaireAOuvrir, acNormal, , sCritWhere End If End Sub
A+
Gérard
Bonsoir Gérard,
C'est étonnant que tu ai été obligé de créer un formulaire pour faire fonctionner mon code, j'avais testé avec une table en tant que sous-formulaire.
Tu n'a pas du trouver le nom du contrôle sous-formulaire.
Puisque le code fonctionne avec...
...change l'objet source de ce contrôle pour «Table.historique contacts Piges» au lieu du nom du formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ' Nom du contrôle sous-formulaire dont l'objet source est «Table.historique contacts Piges» sNomCtlSsFormulaire = "Historique contacts Pige"
Ensuite vérifie ou recrée la liaison Père/Fils.
Pour info, un contrôle sous-formulaire n'a pas nécessairement le même nom que le formulaire qu'il intègre.
Je peux avoir un contrôle sous-formulaire (conteneur) qui s'appelle "ctlSfmHistorique" et qui intègre (contenu) un formulaire qui s'appelle "sfmHistorique" ou une table "Table.Historique".
Quand j'écris "contrôle sous-formulaire" je fais toujours référence au conteneur.
A+
Christophe
Bonjour Christophe,
Suite à ton message, j'ai supprimé le sous-formulaire, et l'ai remplacé par une feuille de données et tout fonctionne.
Ce qui s'est passé, c'est que la première fois, je n'avais pas modifié le nom de la feuille qui s'appelait Fille585.
Cette fois je lui ai donné un nom personnalisé.
Merci encore.
Gérard
Bonjour Christophe,
J’espère que tu vas bien.
Tout fonctionne parfaitement, et j’aurai une petite demande à te formuler :
Lorsque je fais visiter un bien, j’ajoute un nouvel enregistrement à la table [Historique contacts Acquéreur] par l’intermédiaire du sous-formulaire [Contact Acquéreurs]. Il compte 4 champs :
- [Historique contacts Acquéreur.Dernier contact]
- [Historique contacts Acquéreur.Type], qui aura comme valeur : « Visite de biens »
- [Historique contacts Acquéreur.Lien_Piges], champ numérique, qui fait le lien avec la table [Piges]
- [Historique contacts Acquéreur.Lien], champ numérique, qui fait le lien avec la table [Acquéreurs]
Serait-il possible de faire que après cet ajout, (uniquement si [Historique contacts Acquéreur.Type]= « Visite de biens ») il soit également ajouter (sans intervention de ma part) un nouvel enregistrement à la table [Historique contacts Pige] ?
[Historique contacts Pige] possède 4 champs :
- [Historique contacts Pige.Date du contact] qui devra donc être égal à [Historique contacts Acquéreur.Dernier contact]
- [Historique contacts Pige.Type] qui devra avoir comme valeur « Visite avec acquéreur »
- [Historique contacts Pige.Lien] qui devra donc être égal à [Piges.ID]
- [Historique contacts Pige.lien_acquereur] qui devra donc être égal à [Acquéreurs.ID]
A+
Bonjour Gérard,
Il faut arriver à trouver un déclencheur qui détecte l'ajout d'un enregistrement ou bien carrément passer par un formulaire de saisie (au lieu de saisir directement dans le sous-formulaire).
Peux-tu me préciser les points suivant ?
-Est-ce que le formulaire principal est le formulaire Piges ?
-Est-ce que les deux sous-formulaire ont une source du type Table.Nom_Table ?
A+
Christophe
Bonjour Christophe,
Le formulaire Piges n'est pas le formulaire principale.
Oui.-Est-ce que les deux sous-formulaire ont une source du type Table.Nom_Table ?
A+
Gérard
Bonjour Gérard,
Voici deux solutions possibles : bdsAjout_20150225.zip
Bases example bd_ d1481812_7SOL1.mdb
Le formulaire fmFormulaire_1 est le formulaire principal qui intègre les tables en tant que sous formulaires.
Comme les sous-formulaires de ce type ne génèrent aucun événement, j'ai remplacé l'objet source du sous-formulaire nommé sfmHistoriqueContactsAcquereur par un formulaire (au lieu de Table.Historique contacts Acquéreur).
Il s'agit du formulaire sfmHistCtcAcquereur. Sa source est la table Historique contacts Acquéreur.
Son mode d'affichage est réglé sur "Feuille de données".
De cette manière il s'affiche comme si la table Historique contacts Acquéreur avait été placée en tant qu'objet source du sous-formulaire sfmHistoriqueContactsAcquereur.
La gestions des événements sfmHistCtcAcquereur du formulaire permet de détecter l'ajout d'un enregistrement à la table Historique contacts Acquéreur.
Événement Avant MAJ: On vérifie que toutes les données requises sont saisies.
Événement Après insertion: On ajoute un enregistrement à Historique contacts Pige si type = "Visite de biens".
Bases example bd_ d1481812_7SOL2.mdb
Le formulaire fmFormulaire_2 est le formulaire principal qui intègre les tables en tant que sous formulaires.
Le sous-formulaire nommé sfmHistoriqueContactsAcquereur est verrouillé pour forcer l'utilisation du bouton "+".
Ce bouton ouvre le formulaire de saisie fmAjoutVisiteCtcAcquereur dont la source est la table Historique contacts Acquéreur.
Il est réglé en mode "Ajout de données seulement":
Propriété Entrée données = Oui
Propriété Ajout autorisé = Oui
Propriété Suppr autorisée = Non
Propriété Modif autorisée = Non
Un bouton "Annuler" annule le processus d'ajout et ferme le formulaire de saisie.
Un bouton "Ajouter" valide les données et les ajoute à Historique contacts Acquéreur, puis à Historique contacts Pige si type="Visite de biens", à l'aide des requêtes R_Ajout Hist Ctc Acqur et R_Ajout Hist Ctc Pige.
Cdlt
Christophe
Bonjour Christophe,
Merci de ta réponse.
C’est la première solution qui me conviendrait le mieux :
Cependant, elle m’oblige pour chaque ajout d’enregistrement de remplir le champ Lien_Piges, ce qui me fait perdre beaucoup de temps.
La solution ne serait-elle pas d’utiliser un vrai sous-formulaire qui permettrait de générer un événement ?
J’ai une autre demande à te soumettre.
La table [acquéreurs] possède le champ [Acquéreurs.Mandant], Numérique, contenu : SELECT Piges.ID, Piges.Nom FROM Piges WHERE (((Piges.Vivante)=True) AND ((Piges.Mandat)=True)) ORDER BY Piges.Nom;; Nbre colonnes :2.
Chaque fois que j’ajoute un enregistrement à la table [Acquéreurs] par l’intermédiaire du formulaire Acquéreurs, je remplis le champ [Acquéreurs.Mandant].
Est-il possible de créer un code qui ajouterait à la table [Historique contact Pige] un enregistrement avec :
Merci, A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 [Historique contact Pige.Date du contact}=[Acquéreurs.Date] [Historique contact Pige.Type]= « Demande acquéreur » [Historique contact Pige.Lien]=[Pige.ID] [Historique contact Pige.lien_acquereur]=[Aquéreurs.ID]
Gérard
Bonsoir Gérard,
La première solution est basée sur un 'vrai' sous-formulaire.
Pour que le champ Lien_Piges se pré-remplisse il faut qu'il y ait une relation père/fils entre le formulaire principal et le contrôle sous-formulaire sfmHistoriqueContactsAcquereur.
Cela suppose que le formulaire principal ait un champ [ID] provenant de la table Piges.
Si par exemple la source du formulaire principal est la table Piges, dans les propriétés de l'onglet «Données» du contrôle sous-formulaire sfmHistoriqueContactsAcquereur on aurait:
Champ Pères: ID
Champs fils: Lien_Piges
Cdlt
Christophe
Rebonsoir Gérard,
C'est possible.
Il suffit de réutiliser la technique que j'ai employée dans bd_ d1481812_7SOL1.mdb
Ouvrir le formulaire «Acquéreurs» en mode création.
Afficher les propriétés du formulaire.
Dans l'onglet «Événements» sélectionner "[Procédure événementielle]" en face de «Après insertion», puis cliquer sur le petit bouton à droite pour créer le corps de la procédure gérant l'événement.
Voila ce que l'on doit avoir au final:
La ligne 8 lAcquId = Nz(Me.ID, 0): If lAcquId = 0 Then Exit Sub récupère l'ID de l'acquéreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Private Sub Form_AfterInsert() Dim lPigeId As Long, lAcquId As Long Dim db As DAO.Database, rs As DAO.Recordset On Error GoTo ErrH ' Un enregistrement vient d'être ajouté à la table Acquéreurs lAcquId = Nz(Me.ID, 0): If lAcquId = 0 Then Exit Sub lPigeId = Nz(Me.Mandat, 0): If lPigeId = 0 Then Exit Sub ' On veut: '[Historique contact Pige.Lien] = [Pige.ID] '[Historique contact Pige.lien_acquereur] = [Aquéreurs.ID] '[Historique contact Pige.Type]= « Demande acquéreur » '[Historique contact Pige.Date du contact}=[Acquéreurs.Date] Set db = CurrentDb Set rs = db.OpenRecordset("Historique contact Pige", dbOpenDynaset) rs.AddNew rs("Lien") = lPigeId rs("lien_acquereur") = lAcquId rs("Type") = "Demande acquéreur" rs("Date du contact") = Nz(Me.[Date], Date) rs.Update rs.Close Set rs = Nothing Set db = Nothing ExitS: Exit Sub ErrH: MsgBox "Error No." & Err.Number & " : " & Err.Description, vbCritical, Me.Name & ".Form_AfterInsert()" If Not (rs Is Nothing) Then If rs.EditMode <> 0 Then rs.CancelUpdate rs.Close End If Resume ExitS End Sub
La ligne 9 lPigeId = Nz(Me.Mandat, 0): If lPigeId = 0 Then Exit Sub récupère l'ID de Piges au travers du champ Mandat de la table Acquéreurs.
Si ce n'est pas ça, remplacer Me.Mandat par Me.XXXXX (où XXXXX est le nom d'un autre champ de la table Acquéreurs).
Cdlt
Christophe
Bonsoir Christophe,
J'ai appliqué, et tout marche parfaitement.
Merci, merci
Gérard
Bonjour,
Une petite question technique:
Lors de l’export des annonces au format XML, par l’intermédiaire du formulaire que tu m’as crée [fmXMLexporter], j’aurais besoin que au préalable la requête suivante soit effectuée :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UPDATE annonce INNER JOIN photos ON annonce.[N° Mandat] = photos.[N° Mandat] SET photos.reference = [annonce.reference] WHERE (((annonce.[N° Mandat])=[photos.N° Mandat]));
Pour l’instant je le fais manuellement mais ce serait plus pratique qu’elle soit incluse dans la procédure cmd Exporter_Click() ou ailleurs mais incluse dans le bouton.
Merci,
Gérard
Bonjour Gérard,
Ouvre le formulaire fmXMLexporter en mode création.
Sélectionne le bouton du formulaire en cliquant dessus.
Affiche ses propriétés, dans la feuille de propriétés va à l'onglet «Événements».
Active la ligne «Sur clic» en cliquant dessus, puis clique sur le petit bouton à droite de [Procédure événementielle].
Tu te retrouves sur le code de gestion de l'événement «Sur clic» du bouton:
Modifie le code (copier/coller) pour qu'il devienne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub cmdExporter_Click() ExporterAnnoncesXml End Sub
Remplace XXXX par le nom de la requête de type "mise à jour" (lignes 4 et 5).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub cmdExporter_Click() Dim sNomReq As String ' Exécuter requête XXXX sNomReq = "XXXX" DoCmd.SetWarnings False DoCmd.OpenQuery sNomReq DoCmd.SetWarnings True ' Appeler la procédure d'export ExporterAnnoncesXml End Sub
Et voila, c'est tout.
La requête sera toujours exécutée avant l'exécution du code d'exportation xml.
Cdlt
Christophe
Bonjour Christophe,
Nickel, merci
Gerard
Bonjour Christophe,
Je rencontre un petit problème avec un formulaire [Acquéreurs] et seulement avec celui-ci.
Lorsque que je l’ouvre :
1) Les variables indépendantes du style (=Int(Maintenant()-[Date])) affichent : Nom
2) Si je veux ajouter un enregistrement à l’un des sous-formulaires [Historique contacts Acquéreur], et pour tous les autres le message d’erreur suivant apparait :
Le paramètre de la propriété ChampsPères est à l’origine de l’erreur suivante : »Return sans GoSub »
Le seul moyen que j’ai trouvé est de supprimer le sous-formulaire et de le remettre ou d’apporter une modification au formulaire : ex ajouter une zone de texte; Tout fonctionne alors normalement, jusqu’à ce que je quitte Access, mais si j’ouvre à nouveau le même problème réapparait.
J’ai essayé de compacter la base, faire des sauvegardes et ouvrir la sauvegarde : toujours pareil !
J’ai cherché sur le site, mais pas trouvé la réponse.
Merci pour ton aide.
Gérard
Bonjour Gérard,
J'ai déjà eu dans le passé des problèmes inexplicables lors de transitions Access 2000 -> 2003 et 2003 -> 2007.
Dans ces cas là, je crée une nouvelle base de données dans laquelle j'importe tous les objets de la base corrompue.
Je le fais en plusieurs étapes:
- Je renomme la base de bdd.mdb en dbb_broken.mdb
Je crée une nouvelle base bdd.mdb- J'importe les modules de code
Je vais dans l'éditeur Visual Basic pour vérifier qu'il ne manque aucune référence Visual Basic.
Ajoute une référence Visual Basic à «Microsoft XML, v6.0» car elle est nécessaire.
Vérifie qu'il ne manque pas d'autre référence en faisant Menu Principal > Débogage > Compiler xxxxxx
Si aucun message d'erreur c'est que rien manque.- J'importe les tables
- J'importe les requêtes
- J'importe tout les reste (Formulaires, Etats, Macros)
- Je redéfini les options de la base de données en cours (Titre Application, Icône Application, Documents fenêtré ou à onglet, ..)
Tout ceci équivaut à une réparation car en principe la partie corrompue n'est pas importée.
Ensuite, je teste la nouvelle base, je la compacte et je la teste à nouveau.
En espérant que ça t'aide.
Christophe
Christophe,
En fait, j'ai ouvert le formulaire [Acquéreurs] ai fait compilier, miraculeusement tout à marché, ai fermé, il m'a demandé si je voulais enregistrer les modifications de Fmpiges (je ne l'avais pas récemment mofifié), fait ok et depuis tout fonctionne à nouveau nickel !
Bonjour
je suis confronté à un probleme similaire
j' ai suivi votre discussion pour essayer de l'appliquer à ma base de données mais j'y arrive il y a certaines ligne de votre code que je ne comprend par exemple le client et codeclient
je n arrive pas à identifier dans quelle table cela appartient
Merci de m'aider je suis dans une situation d'urgent ou je dois realiser ce projet avant le 15 fevrier 2016
Aidez moi svp
Bonsoir,
Client et codeclient sont des variables dont j'avais besoin pour faire identifier mon fichier XML a une autre personne. Ils n'appartiennent à aucune base.
gérard
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager