IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Export XML avec XSD imposé


Sujet :

VBA Access

  1. #41
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonsoir,

    Tout est parfait, ça fonctionne nickel.

    Merci beaucoup.

    J'ai une dernière question:

    Lorsque je suis dans mon formulaire [Piges], comment créer un bouton qui fasse le lien avec [annonce] ?
    Ce qui me pose problème, c'est que la requête de la macro, utilise le champs de [Piges] actuellement "ouvert" en l'occurrence [N° Mandat] qui correspondant à [annonces.reference].
    Avec aussi la possibiltée de créer une annonce si elle n'existe pas.
    Je ne sais pas faire sans être obligé de renseigner manuellement le champ [reference]
    Est'il possible également que ce bouton ne s'affiche que sous certaines conditions qui seraient:

    [Piges.Mandat] Vrai
    [Piges.vivante] Vrai

    Gérard

  2. #42
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour Gérard,

    Lorsque je suis dans mon formulaire [Piges], comment créer un bouton qui fasse le lien avec [annonce] ?
    Ce qui me pose problème, c'est que la requête de la macro, utilise le champs de [Piges] actuellement "ouvert" en l'occurrence [N° Mandat] qui correspondant à [annonces.reference]
    Depuis le formulaire [Piges] tu veux ouvrir le formulaire [annonce] et te positionner (ou filtrer) sur l'annonce correspondante ?

    Avec aussi la possibiltée de créer une annonce si elle n'existe pas.
    Je ne sais pas faire sans être obligé de renseigner manuellement le champ [reference]
    Il faudrait que je sache comment se fait la liaison entre les tables Piges et annonce, et les types (nombre/texte) des champs.
    Au besoin, poste une base exemple. Je ne suis pas du tout certain d'avoir compris.

    Est'il possible également que ce bouton ne s'affiche que sous certaines conditions qui seraient:
    [Piges.Mandat] Vrai
    [Piges.vivante] Vrai
    Oui, programmation événementielle.
    Événement «sur activation» du formulaire.
    Événement «après MAJ» de Mandat.
    Événement «après MAJ» de vivante.

    Dans le formulaire, copier/coller cette sub:
    (remplacer "NomDuBouton" par le vrai nom)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub NomDuBouton_Visibilite()
     
    Me.NomDuBouton.Visible = ((Nz(Me.Mandat, 0) <>0) And (Nz(Me.vivante, 0) <>0))
     
    end sub
    Ensuite dans le code événementiel des trois événements mentionnés plus haut, faire un appel à la sub.

    Événement «sur activation» du formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Current()
    NomDuBouton_Visibilite
    End Sub
    Événement «après MAJ» de Mandat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Mandat_AfterUpdate()
    NomDuBouton_Visibilite
    End Sub
    Événement «après MAJ» de vivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub MFR_vivante()
    NomDuBouton_Visibilite
    End Sub
    A+
    Christophe

  3. #43
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonsoir Christophe,

    Au besoin, poste une base exemple. Je ne suis pas du tout certain d'avoir compris.
    L'idéal serait que je t'envoie ma base vierge, mais je ne sais pas faire comment, j'ai vidé toutes les tables, mais elle fait toujours 62 Mo (je me demande bien pourquoi ?) et zippé encore 36 Mo.
    Il y peut être un moyen d'enregistrer uniquement la structure ?

    Depuis le formulaire [Piges] tu veux ouvrir le formulaire [annonce] et te positionner (ou filtrer) sur l'annonce correspondante ?
    C'est tout à fait ça.

    Il faudrait que je sache comment se fait la liaison entre les tables Piges et annonce, et les types (nombre/texte) des champs.
    Le lien entre ces 2 tables est [Piges.N° Mandat] (texte) avec [annonce.reference] (texte aussi bien sur).

    Exemple :
    Je suis "dans" le formulaire Piges, et je visualise la "fiche" [Piges.ID]= 423 (NumAuto), le champ [Piges.N° Mandat]="1304" (exemple). Ce champ |Piges.N° Mandat] est lié à [annonce.reference]. C'est le seul lien qui existe entre les 2 tables.
    Ce que je ne sais pas faire, c'est utiliser le champ [Piges.N° Mandat] avec sa valeur actuelle soit ici "1304" pour ouvrir le formulaire [annonce] avec comme critère [Piges.ID]=[annonce.reference].

    Autrement dit, je ne sais pas utiliser le contenu du champ [Piges.N° Mandat] pour effectuer l'ouverture sous condition du formulaire [annonce]

    A+
    Gérard

  4. #44
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir Gérard,

    Est-ce que tu as essayé de compacter la base après l'avoir vidée ?
    Bouton Office > Gérer > Compacter une base de données

    Pour la macro, je verrai quelque chose comme ça:
    (La macro se nomme mac_Ouvrir_AnnoncePige)
    Nom de macro
    Condition
    Action
    Arguments
    CpteDom("*";"annonce";"[reference]='" & [Formulaires]![fmPiges]![N° Mandat] & "'")>0 ExécuterMacro Nom de macro: mac_Ouvrir_AnnoncePige.OuvrirAnnonce
    BoîteMsg Message: Pas d'annonce
    Bip: Oui
    Type: Information
    Titre: Alerte
    OuvrirAnnonce OuvrirFormulaire Nom du formulaire: fmAnnonces
    Affichage: Formulaire
    Condition Where: ="[reference]='" & [Formulaires]![fmPiges]![N° Mandat] & "'"
    ArrêtToutesMacros

    La condition CpteDom("*";"annonce";"[reference]='" & [Formulaires]![fmPiges]![N° Mandat] & "'")>0 vérifie qu'il y a bien un enregistrement dans la table annonce, dont le champ [reference] correspont au contenu du contrôle [N° Mandat] du formulaire [fmPiges] (remplacer par [Piges] si ton formulaire s'appelle Piges).
    Si oui, elle exécute la sous-macro OuvrirAnnonce de la macro mac_Ouvrir_AnnoncePige.
    Si non, on passe à la ligne suivante qui affiche un message. On verra plus tard pour ajouter l'enregistrement manquant dans la table annonce.

    La sous-macro OuvrirAnnonce ouvre le formulaire fmAnnonces (remplacer par annonce si ton formulaire s'appelle annonce), filtré sur le champ [reference], lequel doit être égal au contrôle [N° Mandat] du formulaire [fmPiges] (remplacer par [Piges] si ton formulaire s'appelle Piges).
    Attention à bien conserver le premier "=" de l'argument Condition Where.
    Tu devra "brancher" l'événement "sur clic" de ton bouton à cette macro mac_Ouvrir_AnnoncePige.

    Concernant l'ajout d'un enregistrement à la table annonce depuis le formulaire, je pense que le plus simple est de passer par une requête ajout qui prendra des éléments du formulaire ([N° Mandat] en priorité) pour les ajouter à la table annonce.
    Une fois que tu l'aura mise au point, il suffira de modifier la macro mac_Ouvrir_AnnoncePige, pour qu'au lieu d'afficher un message, elle exécute la requête ajout, puis ouvre le formulaire en appelant la sous-maco.

    A+
    Christophe

  5. #45
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour Christophe,

    Citation Envoyé par LedZeppII Voir le message
    OuvrirAnnonce OuvrirFormulaire Nom du formulaire: fmAnnonces
    Affichage: Formulaire
    Condition Where: ="[reference]='" & [Formulaires]![fmPiges]![N° Mandat] & "'"
    J'ai créé ce bouton, et ça marche super.

    Citation Envoyé par LedZeppII Voir le message
    CpteDom("*";"annonce";"[reference]='" & [Formulaires]![fmPiges]![N° Mandat] & "'")>0
    ExécuterMacro Nom de macro: mac_Ouvrir_AnnoncePige.OuvrirAnnonce
    BoîteMsg Message: Pas d'annonce
    Bip: Oui
    Type: Information
    Titre: Alerte
    Je ne l'ai pas fait, car je ne sais pas où mettre cette condition dans une macro, mais cela n'a aucune importance car dans le formulaire [Piges] il y a un champ [Piges.Annonce] (Oui/Non) qui est renseigné par une réquête MAJ chaque fois que j'ouvre le formulaire [Piges]

    Si l'annonce n'existe pas, la bouton Annonce ouvre une Annonce vierge, ce qui me va très bien.

    En ce qui concerne ton message précédent :

    Citation Envoyé par LedZeppII Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub Annonce_Visibilite()
     
    Me.Annonce.Visible = ((Nz(Me.Mandat, 0) <>0) And (Nz(Me.vivante, 0) <>0))
     
    end sub
    J'ai intégré ce Sub dans le formulaire (Mode création, clic droit, créer un code évènement et copier/coller)

    Mais,
    Citation Envoyé par LedZeppII Voir le message
    Ensuite dans le code événementiel des trois événements mentionnés plus haut, faire un appel à la sub.

    Événement «sur activation» du formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Current()
    NomDuBouton_Visibilite
    End Sub
    Événement «après MAJ» de Mandat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Mandat_AfterUpdate()
    NomDuBouton_Visibilite
    End Sub
    Événement «après MAJ» de vivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub MFR_vivante()
    NomDuBouton_Visibilite
    End Sub
    Je sais pas où et comment faire, j'imagine que c'est dans "Propriétés de la feuille" Mais je n'ai pas trouvé comment faire.

    En tout cas, merci merci car ce qui primait c'était surtout le bouton Annonce et de comprendre son fonctionnement pour d'autre chose que j'ai envie de faire.

    Gérard

  6. #46
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir Gérard,

    Mon tableau pour la macro représentait les premières colonnes de la macro en partant de la gauche.
    Pour les rendre toutes visibles (elles ne le sont pas par défaut), il faut, lorsque tu es en mode création sur la macro, cliquer sur les boutons du ruban "Noms de macros" et "conditions" dans le groupe de boutons "Afficher/Masquer".

    Mon but était, en une seule macro, de répondre aux questions «comment ouvrir l'annonce correspondant à l'enregistrement de Piges» et «comment créer une annonce lorsqu'elle n'existe pas».

    Maintenant, en ce qui concerne les procédures vba.
    Voici en image, un module de code d'un formulaire.

    Nom : 2015-01-19_193150.png
Affichages : 145
Taille : 502,9 Ko

    Il se décompose de la façon suivante:

    • Une section «Déclarations».
      Elle sert à déclarer des constantes et des variables communes à tout le module (il n'y a ni l'un ni l'autre dans mon exemple)
      Elle est toujours au début du module. Elle commence à partir de la première ligne, et se termine au premier mot-clé Sub ou Function (lequel peut être précédé de Public ou Private).


    • Des procédures (Sub ... End Sub) et/ou des fonctions (Function ... End Function).
      Dans mon exemple il n'y a que des procédures (Sub).


    Les procédures ont une première ligne qui commence toujours par Sub (avec un préfixe optionnel Public ou Private) suivit du nom de cette procédure, puis d'éventuels arguments entre parenthèses.
    La dernière ligne d'une procédure est toujours End Sub.

    Les fonctions ont une première ligne qui commence toujours par Function (avec un préfixe optionnel Public ou Private) suivit du nom de cette fonction, puis d'éventuels arguments entre parenthèses, puis (en option) du type de valeur renvoyé.
    La dernière ligne d'une procédure est toujours End Function.

    Tout ce qui est surligné en jaune vif marque les débuts et fins de procédures.

    Dans un module de code d'un formulaire on trouve principalement des procédures événementielles.
    Le nom d'une procédure événementielle est composé du nom du contrôle (surligné en couleur saumon), d'un underscore (_), puis du nom de l'événement (surligné en bleu clair).

    -/-

    Pour accéder au module de code d'un formulaire:
    Ouvrir le formulaire en mode création.
    Sur le ruban, cliquer sur le bouton «Visualiser le code» (bouton représentant un carré transparent avec trois petits objets de couleur rouge, bleu et jaune, dans le dernier groupe à droite intitulé «Outils»).

    -/-

    Pour coller une procédure ou une fonction "non événementielle" (c'est le cas de Annonce_Visibilite), il faut le faire ...
    - après la section «Déclarations»
    - après une fin de procédure (End Sub) ou de fonction (End Function)
    ou
    avant un début de procédure (Sub) ou de fonction (Function)
    Le but est qu'il n'y ait jamais aucun chevauchement entre les séquences Début .. Fin.

    -/-

    Pour coller le code d'une procédure événementielle...
    -Cliquer sur le contrôle du formulaire.
    -Afficher la fenêtre de propriétés
    -Aller a l'onglet «Événements»
    -Double-cliquer sur le nom de l'événement pour que [Procédure événementielle] s'affiche en face de lui.
    (Au besoin répéter plusieurs fois le double-clic)
    -cliquer sur le bouton [...] à droite de [Procédure événementielle]
    Cela va créer le corps de la procédure (Private Sub NomControle_NomEvenement ... End Sub) et lier l'événement à cette procédure.
    Le code vba à coller, doit l'être à l'intérieur de la procédure (entre la première ligne et la dernière).
    Donc, dans notre cas il ne faut copier/coller que cette partie:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    NomDuBouton_Visibilite
    ... c'est à dire l'intérieur de la procédure (qui ici ne se compose que d'une ligne, mais c'est souvent bien plus)

    A+

  7. #47
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour Christophe,

    Merci pour tes explications toujours très claires et précises.
    Je les ai suivi à la lettre et tout est OK.

    Merci, merci, merci.

    Gérard

  8. #48
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour Christophe,

    Je reviens à nouveau vers toi :

    Dans la table [Piges], il y a (entre autres) 2 champs, [Piges.Nb Demandes] et [Piges.Nb Visites].

    La table [Piges] est liée à une table [Historique contacts Pige] qui contient (entre autres) 2 champs [Historique contacts Pige.Type] et [Historique contacts Pige.Lien]. La liaison se fait par [Piges.ID] (NumAuto) et [Historique contacts Pige.lien]

    Ces 2 tables sont dans le formulaire [Piges]
    La table [Historique contacts Pige], n’est pas affichée par l’intermédiaire d’un sous-formulaire , mais Table.Historique contacts Pige.

    Mon but serait que dans le formulaire [Piges] le champ [Piges.Nb Demandes] soit de type =CpteDom(…………….) pour compter le nombre de demandes que j’ai eu pour ce bien (Dans ce cas la valeur de [Historique contacts Pige.Type]= «Demande acquéreur »,
    Et que le champ [Piges.Nb Visites] soit de type =CpteDom(…………….) pour compter le nombre de visites que j’ai fait pour ce bien (Dans ce cas la valeur de [Historique contacts Pige.Type]= «Visite avec acquéreur»

    Je ne sais pas si j’ai été clair… ?

    Gérard

  9. #49
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour Gérard,

    Je ne sais pas faire un champ d'une table qui s'actualise à partir d'une expression (DCount ou autre).
    Ce genre de champ s'appelle un champ calculé et il sa place est dans une requête de type sélection, tandis que la vocation des champs d'une table est de stocker de l'information.

    Il y a donc un choix à faire à propos des champs [Nb Demandes] et [Nb Visites] de ta table Piges.
    • Soit tu veux stocker l'information et il faut trouver un ou des moyens d'actualiser ces deux champs.
      Personnellement je ne pense pas qu'il soit possible de garantir l'exactitude des valeurs que l'on trouvera dans ces deux champs.
      A partir d'Access 2010 on peut le faire grâce à une nouvelle fonctionnalité du moteur de données: les triggers (je n'ai jamais pratiqué).
      A défaut de trigger, le moyen le plus immédiat pour actualiser ces deux champs est une requête mise à jour:
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      UPDATE Piges 
      SET Piges.[Nb Demandes] = DCount("*","Historique contacts Pige","([lien]=" & [ID] & ") And ([Type]='Demande acquéreur')")
         , Piges.[Nb Visites] = DCount("*","Historique contacts Pige","([lien]=" & [ID] & ") And ([Type]='Visite avec acquéreur')") ;
      Et une variante ne s'appliquant qu'à l'enregistrement de la table Piges actuellement actif sur le formulaire (fmPiges):
      Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      UPDATE Piges 
      SET Piges.[Nb Demandes] = DCount("*","Historique contacts Pige","([lien]=" & [ID] & ") And ([Type]='Demande acquéreur')")
         , Piges.[Nb Visites] = DCount("*","Historique contacts Pige","([lien]=" & [ID] & ") And ([Type]='Visite avec acquéreur')")
      WHERE (((Piges.ID)=[Formulaires]![fmPiges]![ID]));
    • Soit tu veux l'information 'temps réel' (expression DCount) et dans ce cas la présence de ces deux champs dans la table Piges n'est pas justifiée.
      Pour le faire au niveau du formulaire:
      Ajouter deux zones de texte indépendantes (non liées à un champ) au formulaire.
      Afficher la feuille de propriétés. Aller à l'onglet «Données»
      Pour Nb Demandes, coller cette expression (signe égal inclus) dans la propriété «Source contrôle»:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      =CpteDom("*";"Historique contacts Pige";"([Lien]=" & [ID] & ") And ([Type]='Demande acquéreur')")
      Pour Nb Visites, coller cette expression dans la propriété «Source contrôle»:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      =CpteDom("*";"Historique contacts Pige";"([Lien]=" & [ID] & ") And ([Type]='Visite avec acquéreur')")
      Dans mes deux expressions, [ID] fait référence au nom de la zone de texte liée au champ ID de la table Piges.


    A+

  10. #50
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CpteDom("*";"Historique contacts Pige";"([Lien]=" & [ID] & ") And ([Type]='Demande acquéreur')")
    Pour Nb Visites, coller cette expression dans la propriété «Source contrôle»:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CpteDom("*";"Historique contacts Pige";"([Lien]=" & [ID] & ") And ([Type]='Visite avec acquéreur')")
    Dans mes deux expressions, [ID] fait référence au nom de la zone de texte liée au champ ID de la table Piges.
    C'est exactement ce que je voulais faire !
    Ce que je faisais jusqu'à présent, (pour d'autre chose), je créais un champ, et en mode création formulaire remplaçais le Nom du Champ par :=CpteDom(.......................).
    Je ne connaissais pas la syntaxe: ([Lien]=" & [ID] & ") And ([Type]='Visite avec acquéreur').

    Je vais m'en servir pour beaucoup d'autres choses.

    Merci, merci, si tu n'existais pas il faudrait d'inventer.

  11. #51
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour Christophe,

    Le bouton de Commande pour ajouter et visualiser des photos dans le formulaire [annonce] fonctionne parfaitement:

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Private Sub cmdAjouterPhotos_Click()
    Dim sCheminPhoto As String, l As Long, sRef As String, sParent As String
    Dim rs As DAO.Recordset
    Dim oFileDlg As Object
     
    ' Est-ce que le formulaire est intégré en tant que sous-formulaire ?
    sParent = ""
    On Error Resume Next
    sParent = Me.Parent.Name
    On Error GoTo 0
    If Len(sParent) = 0 Then
       MsgBox "Cette fonction n'est pas applicable lorsque le formulaire est ouvert directement.", vbInformation, "Attention!"
       Exit Sub
    End If
     
    sRef = Nz(Me.Parent.Controls(CS_CHP_CLE), "")
    If Len(sRef) = 0 Then
       MsgBox "La référence doit être renseignée dans le formulaire principal.", vbInformation, "Attention!"
       Exit Sub
    End If
     
    sCheminPhoto = GetParam("CHEMIN_PHOTOS", "TParamsAnnonce")
    If Len(sCheminPhoto) = 0 Then
       MsgBox "Paramètre CHEMIN_PHOTOS non initialisé", vbExclamation, "Erreur paramètre"
       Exit Sub
    End If
     
    Set oFileDlg = Application.FileDialog(1)    ' 1=msoFileDialogOpen
    oFileDlg.AllowMultiSelect = True
    oFileDlg.InitialFileName = sCheminPhoto
    oFileDlg.Filters.Clear
    oFileDlg.Filters.Add "Photos", "*.bmp;*.jpg;*.jpeg;*.gif;*.png"
    oFileDlg.Filters.Add "Tous", "*.*"
    If oFileDlg.Show Then
       Set rs = Me.RecordsetClone
       For l = 1 To oFileDlg.SelectedItems.Count
           rs.AddNew
           rs(CS_CHP_CLE) = sRef
           rs("photo") = GetFileFromPathFile(oFileDlg.SelectedItems(l))
           rs.Update
       Next
       Set rs = Nothing
       Me.Refresh
    End If
    Set oFileDlg = Nothing
     
    End Sub
     
    Private Sub Form_Current()
    Dim fm As Access.Form
    Dim sCheminPhoto As String, sFichPhoto As String
    Dim sCheminCompletPhoto As String
    Dim lDirLen As Long
     
    On Error GoTo ErrH
     
    Set fm = GetParentForm()
    If (fm Is Nothing) Then
       Exit Sub
    End If
     
    sFichPhoto = Nz(Me.photo, "")
    If Len(sFichPhoto) = 0 Then
       AfficherPhotoAbsente
       Exit Sub
    End If
     
    sCheminPhoto = GetParam("CHEMIN_PHOTOS", "TParamsAnnonce")
    If Len(sCheminPhoto) = 0 Then
       AfficherPhotoAbsente
       MsgBox "Paramètre CHEMIN_PHOTOS non initialisé", vbExclamation, "Erreur paramètre"
       Exit Sub
    End If
     
    sCheminCompletPhoto = sCheminPhoto & "\" & sFichPhoto
    On Error GoTo ErrNext
    lDirLen = Len(Dir(sCheminCompletPhoto, vbNormal))
    On Error GoTo ErrH
    If lDirLen = 0 Then
       AfficherPhotoAbsente
       MsgBox "Fichier non trouvé:" & vbCrLf & sCheminCompletPhoto, vbExclamation, "Erreur Photo"
       Exit Sub
    End If
     
    ' Ne changer la photo que si ce n'est pas la même
    If fm.Controls("imgPhoto").Picture <> sCheminCompletPhoto Then
       fm.Controls("imgPhoto").Picture = sCheminCompletPhoto
       fm.Controls("lblPhoto").Caption = sFichPhoto
    End If
     
     
    ExitP:
        Exit Sub
     
    ErrH:
        MsgBox "Error No." & err.Number & " : " & err.Description, vbCritical, "fmPhotosListe.Form_Current()"
        Resume ExitP
     
    ErrNext:
        Resume Next
    End Sub
    J’aimerais faire la même chose dans le formulaire [Piges], sauf que :
    Une seule photo est suffisante, donc le bouton devrait ajouter une photo, s’il n’y en a pas, ou modifier s’il y en a déjà une.
    L’index principal est [Piges.ID] (NumAuto)

    Gérard

  12. #52
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour Gérard,

    On peut reprendre le même principe.
    Une table photosPiges (cle_Piges, photo) où cle_Piges stockera la clé [Piges].[ID] et photo le nom du fichier.
    Le chemin du dossier photos sera le même (celui stocké dans la table TParamsAnnonce sous le nom de paramètre CHEMIN_PHOTOS).
    Un formulaire (qui sera intégré en tant que sous-formulaire) affichant la photo.
    La liaison père/fils se fera sur [Piges].[ID] = [photosPiges].[cle_Piges]

    On pourra même avoir plusieurs photos par [Piges].[ID].

    Je vais regarder ça.

    Cdlt
    Christophe

  13. #53
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour Gérard,

    Tu trouvera ici une base exemple : bd Gege1963 d1481812 6.zip
    Pour "jouer" avec, ouvrir la table «TParamsAnnonce» et renseigner le chemin d'accès aux photos

    Objets à importer dans ta base:
    table «photosPiges»
    requête «R_fmPhotosPiges»
    formulaire «fmPhotosPiges»

    Modifier ton formulaire «Piges», et intégrer le formulaire «fmPhotosPiges» en tant que sous-formulaire.
    Dans les propriétés du contrôle sous-formulaire, aller à l'onglet «Données» et créer la liaison Père/Fils.
    Champs pères: ID
    Champs fils: cle_Piges

    Si je n'ai rien oublié, ça devrait fonctionner.

    A+
    Christophe

  14. #54
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonsoir Christophe,

    Comme d'ab, tout est parfait.

    Merci, merci

    Gérard

  15. #55
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour Christophe,

    Dans mon formulaire « Piges » il y a « Table.historique contacts Piges » qui contient 3 champs :
    [Historique contacts Piges.Date du contact], format date
    [Historique contacts Piges .Type], format texte
    [Historique contacts Piges.Qui], format texte
    Et un autre champ [Historique contacts Piges.Lien] (entier) qui n’est pas affiché et qui sert à la relation avec [Piges.ID]
    Le champ [Historique contacts Piges.Qui] est rempli par une zone de liste : SELECT Acquéreurs.Nom FROM Acquéreurs ORDER BY Acquéreurs.Nom;

    L’idée serait que une fois le champ [Historique contacts Piges.Qui] renseigné, un champ (à créer) contienne le contenu de [Acquéreurs.ID] qui correspond, pour avoir la possibilité en cliquant (sur un autre champ ? un bouton ? (présent donc sur chaque ligne affichée) qui ouvrirait le formulaire « Acquéreurs » correspondant à [Historique contacts Piges.Qui]


    Idem, dans mon formulaire « Acquéreurs » il y a « Table.historique contacts Acquéreurs » qui contient 3 champs :
    [Historique contacts Acquéreurs.Dernier contact]
    [Historique contacts Acquéreurs Type] format texte
    [Historique contacts Acquéreurs .Bien] format texte
    Et un autre champ [Historique contacts Acquéreurs.Lien] (entier) qui n’est pas affiché et qui sert à la relation avec [Acquéreurs.ID]
    Le champ [Historique contacts Acquéreurs.Bien] est rempli par une zone de liste : SELECT Piges.Nom FROM Piges WHERE (((Piges.Vivante)=True) AND ((Piges.Mandat)=True)) ORDER BY Piges.Nom;

    L’idée serait que une fois le champ [Historique contacts Acquéreurs.Bien] renseigné, un champ (à créer) contienne le contenu de [Acquéreurs.ID] qui correspond, pour avoir la possibilité en cliquant (sur un autre champ ? un bouton ? (présent donc sur chaque ligne affichée) qui ouvrirait le formulaire « Acquéreurs » correspondant à [Acquéreurs.Bien]

    Je ne sais pas si j’ai été clair…

    A+
    Gérard

  16. #56
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour Gérard,

    Citation Envoyé par GEGE1963 Voir le message
    Dans mon formulaire « Piges » il y a « Table.historique contacts Piges » qui contient 3 champs :
    [Historique contacts Piges.Date du contact], format date
    [Historique contacts Piges .Type], format texte
    [Historique contacts Piges.Qui], format texte
    Et un autre champ [Historique contacts Piges.Lien] (entier) qui n’est pas affiché et qui sert à la relation avec [Piges.ID]
    Le champ [Historique contacts Piges.Qui] est rempli par une zone de liste : SELECT Acquéreurs.Nom FROM Acquéreurs ORDER BY Acquéreurs.Nom;

    L’idée serait que une fois le champ [Historique contacts Piges.Qui] renseigné, un champ (à créer) contienne le contenu de [Acquéreurs.ID] qui correspond, pour avoir la possibilité en cliquant (sur un autre champ ? un bouton ? (présent donc sur chaque ligne affichée) qui ouvrirait le formulaire « Acquéreurs » correspondant à [Historique contacts Piges.Qui]
    Tu te retrouves dans cette situation parce que les choses ne sont pas faites dans le bon ordre.
    Comme je l'ai dit précédemment il faut au maximum travailler avec les clés.
    Le champ [Historique contacts Piges].[Qui] est bien moins utile que celui qui te manque et qui aurait été la clé de la table Acquéreurs (ce qu'on appelle une clé étrangère).
    Ce qu'il aurait fallut c'est [Historique contacts Piges].[cle_acquereur] et ce champ cle_acquereur aurait pu être affiché en tant que zone de liste à deux colonnes : SELECT Acquéreurs.ID, Acquéreurs.Nom FROM Acquéreurs ORDER BY Acquéreurs.Nom;
    La première colonne (ID) étant la colonne liée qui va alimenter cle_acquereur, et la seconde la colonne affichée.
    Cela se réalise en masquant la première colonne à l'aide de la propriété «Largeur colonnes» en mettant 0.

    Ce que je suggère c'est d'ajouter le champ manquant. Pour rester dans ta convention de nommage, je propose lienAcquereur.
    Configure le en mode d'affichage liste déroulante comme décrit plus haut.
    Mettre ce champ à jour à l'aide d'une requête mise à jour.
    Supprimer le champ [Qui] qui ne sert plus.

    Comme toujours: faire une copie de sauvegarde de la base avant de procéder aux modifications.

    Cdlt
    Christophe

  17. #57
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Bonjour Christophe,

    Tu te retrouves dans cette situation parce que les choses ne sont pas faites dans le bon ordre.
    Comme je l'ai dit précédemment il faut au maximum travailler avec les clés.
    Le champ [Historique contacts Piges].[Qui] est bien moins utile que celui qui te manque et qui aurait été la clé de la table Acquéreurs (ce qu'on appelle une clé étrangère).
    Ce qu'il aurait fallut c'est [Historique contacts Piges].[cle_acquereur] et ce champ cle_acquereur aurait pu être affiché en tant que zone de liste à deux colonnes : SELECT Acquéreurs.ID, Acquéreurs.Nom FROM Acquéreurs ORDER BY Acquéreurs.Nom;
    La première colonne (ID) étant la colonne liée qui va alimenter cle_acquereur, et la seconde la colonne affichée.
    Cela se réalise en masquant la première colonne à l'aide de la propriété «Largeur colonnes» en mettant 0.

    Ce que je suggère c'est d'ajouter le champ manquant. Pour rester dans ta convention de nommage, je propose lienAcquereur.
    Configure le en mode d'affichage liste déroulante comme décrit plus haut.
    Mettre ce champ à jour à l'aide d'une requête mise à jour.
    Supprimer le champ [Qui] qui ne sert plus.
    Tout ça le l'ai fait sauf:

    Pour la requête MAJ, j'ai exécuté:
    UPDATE [Historique contacts Pige] SET [Historique contacts Pige].lien_acquereur = [Qui];
    Mais la valeur de [Acquéreurs.ID] a t'elle été prise en compte ?

    Gérard

  18. #58
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour Gérard,

    Non, il faut une requête mise à jour avec les deux tables [Historique contacts Pige] et [Acquéreurs], et une jointure
    entre [Historique contacts Pige].Qui et Acquéreurs.Nom:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE [Historique contacts Pige] INNER JOIN Acquéreurs ON [Historique contacts Pige].Qui = Acquéreurs.Nom
    SET [Historique contacts Pige].lien_acquereur = Acquéreurs.ID;
    Ainsi on recopie Acquéreurs.ID dans [Historique contacts Pige].lien_acquereur uniquement lorsque [Historique contacts Pige].Qui = Acquéreurs.Nom.

    Pour être rigoureux il faudrait s'assurer qu'il n'y a pas de doublons dans Acquéreurs sur le champ Nom.
    Requête pour vérifier s'il y a des doublons sur le champ Nom:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Acquéreurs.*
    FROM Acquéreurs
    WHERE (((Acquéreurs.Nom) In (SELECT Nom FROM Acquéreurs GROUP BY Nom Having Count(*)>1)));
    S'il y a des doublons, il faudra que tu renseigne à la main le champ lien_acquereur dans la table [Historique contacts Pige] si le champ Qui contient un des noms reportés par la requête de recherche de doublons.

    A+
    Christophe

  19. #59
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2014
    Messages : 55
    Par défaut
    Christophe,


    ’idée serait que une fois le champ [Historique contacts Acquéreurs.Bien] renseigné, un champ (à créer) contienne le contenu de [Acquéreurs.ID] qui correspond,
    Pour ça tout est OK.

    pour avoir la possibilité en cliquant (sur un autre champ ? un bouton ? (présent donc sur chaque ligne affichée) qui ouvrirait le formulaire « Acquéreurs » correspondant à [lien_acquereur]
    Est-ce possible ?

    A+

    Gérard

  20. #60
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir Gérard,

    -Ajouter un bouton au formulaire.
    Le nommer cmdOuvrirAcquereur (propriété «Nom» dans l'onglet «Autres» de la fenêtre de propriétés)
    -Aller à l'onglet «Evénements»
    Créer une procédure événementielle pour l'action «sur clic».
    Rappel: choisir [Procédure événementielle] en face de «Sur clic» puis cliquer sur le petit bouton à droite représentant trois point (...).
    (voir #46)
    -Copier/coller le code ci-dessous (sauf 1ère et dernière ligne qui représentent le corps de la procédure) à l'intérieur de la nouvelle procédure cmdOuvrirAcquereur_Click.
    Code vba : 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 = "fmAcquereurs"
    ' Nom du contrôle sous-formulaire dont l'objet source est «Table.historique contacts Piges»
    sNomCtlSsFormulaire = "sfmHistContactsPige"
    ' 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
    -Adapter le code à ton contexte en remplaçant les noms d'objets par les tiens (lignes 9, 11, 13, 22).
    9: Nom du formulaire à ouvrir. Remplacer fmAcquereurs par ...
    11: Nom du contrôle sous-formulaire. Remplacer sfmHistContactsPige par ...
    13: Nom du champ à lire. Remplacer lien_acquereur par ... (celui la devrait être bon)
    22: Nom du champ clé de Acquéreurs. Remplacer ID par ... (celui la devrait être bon)

    A+
    Christophe

Discussions similaires

  1. [XSD] Valider partiellement XML avec XSD
    Par =FdK= dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/12/2008, 13h51
  2. [JAXB] Problème parsing XML avec XSD validant
    Par vano dans le forum Persistance des données
    Réponses: 2
    Dernier message: 26/08/2008, 09h59
  3. [WD 12] MSXML - validation xml avec xsd externe
    Par nicol9 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/07/2008, 15h08
  4. [SAX] validation d'un xml avec xsd
    Par salmamah dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 25/04/2008, 17h22
  5. Valider XML avec XSD
    Par neilbgr dans le forum Langage
    Réponses: 10
    Dernier message: 26/03/2008, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo