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 :

Numéro d'ordre dans table triée, par SQL ou VBA


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Numéro d'ordre dans table triée, par SQL ou VBA
    Bonjour,

    Je suis nouveau sur ce forum. Je maitrise les bases d'Access, y compris VBA. Essentiellement en me basant sur des exemples trouvés dans différentes aides.

    J'essaye de piloter depuis Access la création dans Word de documents correspondant à un formulaire. J'utilise le principe du publipostage, mais document par document. Tout est en place. Mais je dois relancer Word par une procédure événementielle pour chaque création.

    Je souhaite garder Word chargé et demander la création d'un nouveau document depuis Access.

    Une solution possible serait de créer à chaque création de document une table triée alphabétiquement par un champs principal NOM et comportant un champ Numéro_d_ordre correspondant à l'ordre de tri. Cette nouvelle serait basée sur une table existante qui est non triée sur ce même champ, les enregistrements étant créés au fur et à mesure de la saisie. Cela me permettrait de récupérer ce champ Numéro_d_ordre pour demander l'affichage dans Word.

    Je n'ai pas trouvé le moyen de créer ce champ Numéro_d_ordre par une requête SQL ou par VBA.

    Merci de votre bout de requête SQL ou code VBA.

  2. #2
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Ci joint un lien vers une discussion qui traite d'un sujet similaire : "Numéroter les lignes d'une requête"
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Et si ton numéro n'a pas vraiment d'importance, tu pourrais peut-être utiliser un champ Numéro Auto de Access qui te garanti un numéro séquentiel croissant unique.
    Note qu'il peut y avoir des "trous" dans cette numérotation car elle n'est pas conçue pour compter les enregistrements mais pour les identifier de manière unique.
    Ce numéro est attribué à la création de l'enregistrement dans la table.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Merci de vos réponse.

    Le NumAuto ne me convient pas, car ne correspondant pas à l'ordre alphabétique.

    La requête avec NumOrdre, correspondant à l'ordre alphabétique, fonctionne. Je suis en train de finir la fonction Création dans Word depuis Access. Dès que c'est OK, je vous fais un retour ici.

    Q : Est-il possible d'en faire un tuto, un exemple de réalisation ? Est-ce réservé aux gestionnaires de ce site ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonsoir,

    Je patauge !

    Je voudrais faire depuis Access ce qu'il est possible de faire facilement avec Word :
    - ouvrir un modèle de publipostage
    - choisir autant de fois que je veux un document pour l'enregistrer.

    J'ai enregistré une Macro dans Word. Mais je n'arrive pas à la faire fonctionner depuis Access.
    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
    ' << faire une fois pour ouvrir le modèle
        Documents.Add Template:= _
            "C:\Users\aphil\Documents\Modèles Office personnalisés\Modèle Recette impression Multi.dotm" _
            , NewTemplate:=False, DocumentType:=0
    ' << faire autant de fois que besoin
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord ' ou tout autre action, dans Access avec liste déroulante
        With ActiveDocument.MailMerge
            .Destination = wdSendToNewDocument
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
                .LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
            End With
            .Execute Pause:=False
        End With
        ChangeFileOpenDirectory "D:\Cuisine\Papinette_Recettes\"
        ActiveDocument.SaveAs2 FileName:="Bouchées à la reine.docx", FileFormat:= _
            wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
            :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
            :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
            SaveAsAOCELetter:=False, CompatibilityMode:=15
        ActiveWindow.Close
    '  << fin de faire
    Il n'y a que cette partie qui me pose problème, n'ayant jamais traité ce genre de fonction. Tout l'environnement est prêt.

    Je n'arrive pas à mettre les "With" et les "."là où il faut !

    Merci de vos suggestions.

    Bonne soirée

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonsoir,

    Il faudrait déjà piloter Word depuis Access en utilisant des variables objets pour l'application Word et pour le document :

    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
    Dim wApp As Word.Application
    Dim wDoc as Word.Document
     
    Set wApp = New Word.Application
    wApp.Visible = True 'permet d'afficher à l'écran l'application 
     
    'ouverture du document Word
    'Set wDoc = wApp.Documents.Open(cheminDocument) ' en commentaire
     
    Set wDoc = wApp.Documents.Add Template:= _
            "C:\Users\aphil\Documents\Modèles Office personnalisés\Modèle Recette impression Multi.dotm" _
            , NewTemplate:=False, DocumentType:=0
    ' << faire autant de fois que besoin
        wDoc.MailMerge.DataSource.ActiveRecord = wdFirstRecord ' ou tout autre action, dans Access avec liste déroulante
    ...
    ...
    'Libération de variables à la fin :
    set wDoc=Nothing
    set wApp=Nothing
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Ça fonctionne. Mais avant de poster la solution complète je voudrais voir s'il est possible de simplifier un bricolage que j'ai été obligé de faire.

    Le formulaire permet de créer, éditer et imprimer des recettes de cuisine. Ceci à travers une requête qui prend toutes les données de la table TabRecettesPréparation (N° (NuméroAuto), Nom, Sous_titre, Présentation, Ingrédients, Prépartion, Complément). Tous ces champs sont affichés dans des zones de texte. Plus un champ NumOrdre qui est mis à jour avec la procédure évènementielle SélecteurImpression_AfterUpdate (voir plus bas)

    Un sélecteur permet de sélectionner une recette : une zone de liste déroulante, colonne liée : 2 , contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T1.Nom, T1.N°, (SELECT Count(Nom)     FROM   TabRecettesPréparation T2        WHERE T2.Nom<T1.Nom)+1 AS NumOrdre
    FROM TabRecettesPréparation AS T1
    ORDER BY T1.Nom;
    qui rend : Nom, N°, NumOrdre

    Le code pour trouver la bonne recette (sélecté a pour Source de contrôle : N°)
    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
     
    Private Sub Sélecteur_AfterUpdate()
    On Error GoTo Sélecteur_Err
        With CodeContextObject
            DoCmd.GoToControl "sélecté"
            DoCmd.FindRecord .Sélecteur, acEntire, False, , False, , True
        End With
        Sélecteur = Sélecté
        DoCmd.GoToControl "Sélecteur"
        Call ActualTabRecettesImpressionMulti
     Sélecteur_Exit:
        Exit Sub
    Sélecteur_Err:
        MsgBox Err.Description
        Resume Sélecteur_Exit
    End Sub
    ActualTabRecettesImpressionMulti crée un table TabRecettesImpressionMulti (N°, NumOrdre, Nom, Sous_titre, Présentation, Ingrédients, Prépartion, Complément) qui est liée avec Word :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT T1.N°, (SELECT Count(Nom)
        FROM   TabRecettesPréparation T2   
        WHERE T2.Nom<T1.Nom)+1 AS NumOrdre, T1.Nom, T1.Sous_titre, T1.Présentation, T1.Ingrédients, T1.Préparation, T1.Complément INTO TabRecettesImpressionMulti
    FROM TabRecettesPréparation AS T1
    ORDER BY T1.Nom;
    Ce Sélecteur me permet de me déplacer dans les recettes avec . Mais il ne permet pas d'indiquer à Word le numéro NumOrdre qu'il a besoin car la table TabRecettesImpressionMulti est trié par ordre alphabétique du champ Nom, ordre qui est codé dans le champ NumOrdre. Raison de cela : il est plus facile de se déplacer dans un ordre alphabétique que dans l'ordre aléatoire de création.

    J'ai donc créé un deuxième SélecteurImpression, avec les mêmes données mais lié à la colonne 3 des données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub SélecteurImpression_AfterUpdate()
    On Error GoTo SélecteurImpression_Err
        With CodeContextObject
            NumOrdre = SélecteurImpression     
        End With    
        Call ActualTabRecettesImpressionMulti
    SélecteurImpression_Exit:
        Exit Sub
    SélecteurImpression_Err:
        MsgBox Err.Description
        Resume SélecteurImpression_Exit
    End Sub
    NumOrdre est utilisé par la procédure événementielle qui ouvre Word pour l'enregistrement et l'impression éventuelle d'une recette


    Question : Est-il possible de combiner ces deux Sélecteurs en seul, qui mette à jour le champ sélecté, qui trouve le bon enregistrement, et qui mette à jour le champ NumOrdre ? La difficulté venant du fait que ces deux champs proviennent d'une requête et qu'il n'est possible d'associé qu'un seul champ à une liste déroulante.

    J'espère avoir été clair et complet.

    Merci de votre réponse

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    Pour choisir une colonne dans le sélecteur vous pouvez utiliser Sélecteur.Column(0) pour la 1ère colonne,Sélecteur.Column(1) pour la 2ème colonne et Sélecteur.Column(2) pour la 3ème colonne de la liste, par exemple si NumOrdre est sur la 3ème colonne.

    ça pourrait ressembler à ça :

    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
     
    Private sub sélecteur_afterupdate()
     
        with Me.RecordSetClone
     
    	.FindFirst "[N°]=" & Sélecteur.value
     
             Me.Bookmark = .Bookmark
    ...
       end with
     
        With CodeContextObject
               NumOrdre = Sélecteur.Column(2)     
        End With    
     
      Call ActualTabRecettesImpressionMulti
     
    end sub
    Cdlt,

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonsoir,

    Merci à User pour la solution. Cela simplifie le formulaire.

    Juste une question avant de faire la synthèse.

    TabRecettesImpressionMulti est la table passée à Word contenant les données de publipostage. Lorsque je lance deux créations/enregistrements de suite, c.-à-d. sans fermer Word entre les deux, j'ai le message suivant :

    Vous avez essayé de verrouiller la table «TabRecettesImpressionMulti» pendant son ouverture, mais elle ne peut pas être verrouillée, car elle est en cours d'utilisation. Attendez un moment et recommencez l'opération.

    Cela n'empêche pas une nouvelle création/enregistrement, à condition de ne pas créer une nouvelle recette, le champ NumOrdre n'étant pas à la bonne valeur.

    Y a t-il une solution ? Ou faut-il vivre avec ?

    Merci

  10. #10
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonsoir,

    Il semblerait que votre table Access soit déjà ouverte. Votre document précédent n'a peut-être pas été bien fermé ou la table reste ouverte côté Access.

    Pouvez-vous poster votre code complet pour voir si les variables objet sont toutes bien fermées entre 2 lancements ?

    Voici, une discussion sur le même sujet :
    https://www.developpez.net/forums/d1...ment-deplacee/

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  11. #11
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    C'est bien le même souci : Word verrouille la table et je ne peux pas la mettre à jour.

    Pour l'instant cela me serait utile de pouvoir traiter plusieurs recettes en série car je viens de reprendre la bdd d'un blog. Mais quand la reprise sera terminée, je traiterai les recettes une par une.

    La solution de créer une table avec le date dans le nom serait intéressante. Mais il faut supprimer la table après. Mais comme je ne ferme pas Word depuis Access parce que certaines recettes doivent être modifiées 'à la main' dans la partie ingrédients, cela serait trop lourd à gérer.

    Donc je ne vais pas me contraindre plus.

    Merci et bonne journée

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Sans créer une nouvelle table tu pourrais peut-être avoir une base et une table séparée.
    Donc au lieu de prendre tes données dans ta base principale, tu les prendrais dans une base auxiliaire.
    Ce qui te permettrai peut-être de continuer avec ta base principale.
    Ça donnerai quelque chose comme :

    Base Frontale (interface)

    -> Base Dorsale Principale (tes données "vivantes")
    -> Base Dorsale Auxiliaire (juste une table, celle pour Word)

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Pour conclure

    Le formulaire ForRecettesPréparation permet de créer, éditer avec Access et d'enregistrer/imprimer avec Word des recettes de cuisine.

    La table : TabRecettesPréparation (N° (NuméroAuto), Nom, Sous_titre, Présentation, Ingrédients, Prépartion, Complément).

    Une requête ReqRecettesPréparation prend toutes les données de cette table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TabRecettesPréparation.N°, TabRecettesPréparation.Nom, TabRecettesPréparation.Sous_titre, TabRecettesPréparation.Présentation, TabRecettesPréparation.Ingrédients, TabRecettesPréparation.Préparation, TabRecettesPréparation.Complément
    FROM TabRecettesPréparation
    ORDER BY TabRecettesPréparation.Nom;
    Tous ces champs sont affichés dans des zones de texte d'un formulaire. Plus un champ NumOrdre qui est mis à jour avec la procédure évènementielle Sélecteur_AfterUpdate (voir plus bas)

    Un sélecteur Sélecteur permet de sélectionner une recette : une zone de liste déroulante, colonne liée : 3, contenu de la liste déroulante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1.Nom & (",  "+T1.Sous_titre) AS NomSousitre, (SELECT Count(Nom)     FROM   TabRecettesPréparation T2        WHERE T2.Nom &" "& T2.Sous_titre<T1.Nom &" "& T1.Sous_titre )+1 AS NumOrdre, T1.N°
    FROM TabRecettesPréparation AS T1
    ORDER BY T1.Nom, T1.Sous_titre;

    qui rend : Nom, N°, NumOrdre

    Les procédures associées au sélecteur
    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
     
    Private Sub Sélecteur_AfterUpdate()
    On Error GoTo Sélecteur_Err
        With Me.RecordsetClone
            .FindFirst "[N°]=" & Sélecteur.Value
            Me.Bookmark = .Bookmark
        End With    
        With CodeContextObject
            NumOrdre = Sélecteur.Column(1)
        End With    
        DoCmd.GoToControl "Sélecteur"    
        Call ActualTabRecettesImpressionMulti
    Sélecteur_Exit:
        Exit Sub
    Sélecteur_Err:
        MsgBox Err.Description
        Resume Sélecteur_Exit
    End Sub
     
    Private Sub Sélecteur_GotFocus()
    On Error GoTo Sélecteur_Err
        DoCmd.Requery "Sélecteur"
    Sélecteur_Exit:
        Exit Sub    
    Sélecteur_Err:
        MsgBox Err.Description
        Resume Sélecteur_Exit    
    End Sub
    Elles permettent de trouver le bon enregistrement (N°), de fournir le NumOrdre .

    La requête ActualTabRecettesImpressionMulti crée un table TabRecettesImpressionMulti (N°, NumOrdre, Nom, Sous_titre, Présentation, Ingrédients, Préparation, Complément) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.N°, (SELECT Count(Nom)
        FROM   TabRecettesPréparation T2   
        WHERE  T2.Nom&" "& T2.Sous_titre<T1.Nom&" "& T1.Sous_titre )+1 AS NumOrdre, T1.Nom, T1.Sous_titre, T1.Présentation, T1.Ingrédients, T1.Préparation, T1.Complément, T1.Nom & ( ", " + T1.Sous_titre) AS Nom_SousTitre INTO TabRecettesImpressionMulti
    FROM TabRecettesPréparation AS T1
    ORDER BY T1.Nom, T1.Sous_titre;
    NumOrdre est utilisé par la procédure événementielle qui ouvre Word pour l'enregistrement et l'impression éventuelle d'une recette par appui sur le bouton ImprimeMulti

    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
    Private Sub ImprimeMulti_Click()    
     
        Dim wdapp As Word.Application
        Dim wDoc As Word.Document
        Dim RecetteChemin As String
        Dim RecetteNom As String
        Dim RecetteNomComplet As String
     
        RecetteChemin = "D:\Cuisine\Papinette_Recettes"
        RecetteNom = [Forms]![ForRecettesPréparation]![Nom]
        RecetteNomComplet = RecetteChemin & "\" & RecetteNom & ".docx"
     
        Call ActualTabRecettesImpressionMulti
        NumOrdre = Sélecteur.Column(1)
     
        ' Démarrer Word
        Set wdapp = New Word.Application
        wdapp.Visible = True
        With wdapp
     
            ' Ouvrir le document
            Documents.Add Template:= _
                 "C:\Users\aphil\Documents\Modèles Office personnalisés\Modèle Recette impression Multi.dotm" _
                , NewTemplate:=False, DocumentType:=0
     
            '  Connecter la bdd et la table
            ActiveDocument.MailMerge.OpenDataSource Name:= _
            "D:\Cuisine\Livre_Cuisine_Recette.accdb", ConfirmConversions:=False, _
            ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
            PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
            WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
            Connection:= _
            "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=D:\Cuisine\Livre_Cuisine_Recette.accdb;Mode=Read;Extended Properties="""";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB" _
            , SQLStatement:="SELECT * FROM `TabRecettesImpressionMulti`", _
            SQLStatement1:="", SubType:=wdMergeSubTypeAccess
     
            ' Lancer le publipostage
            With ActiveDocument.MailMerge
                .Destination = wdSendToNewDocument
                .SuppressBlankLines = True
                With .DataSource
                    .FirstRecord = [Forms]![ForRecettesPréparation]![NumOrdre]
                    .LastRecord = [Forms]![ForRecettesPréparation]![NumOrdre]
                End With
                .Execute Pause:=False
            End With
     
            ' Enregistrer le document
            MsgBox "Enregistrement de la recette " & "< " & RecetteNom & " >"
     
            ActiveDocument.SaveAs2 FileName:=RecetteNomComplet, FileFormat:= _
                wdFormatXMLDocument, LockComments:=False, Password:="", AddToRecentFiles _
                :=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts _
                :=False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
                SaveAsAOCELetter:=False, CompatibilityMode:=15
     
          '.ActiveDocument.Close ' à activer si pas de modif du document, idem pour ci-dessous
        End With  'With wdapp
     
        ' Fermer et libérer les objets
        ' wdapp.Quit
        ' Set wdapp = Nothing
    End Sub
    Ce code a été obtenu en enregistrant une macro dans Word : exécution depuis le début de toute la séquence de création d'un publipostage.

    Restriction : il faut fermer Word à chaque création/enregistrement/création d'une recette. Voir les messages précédents pour quelques idées de solution.

    Je répondrai à toute question.

    Bonsoir

    28/06 : mise à jour avec les dernières corrections

Discussions similaires

  1. BIRT numéro de pages dans table des matières
    Par martinfa dans le forum BIRT
    Réponses: 1
    Dernier message: 29/06/2012, 11h25
  2. [AC-2003] créer numéro d'ordre dans une requête (en mode graphique)
    Par willytito dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/02/2012, 14h30
  3. Inclure des numéros d'ordre dans BIRT
    Par arestos dans le forum BIRT
    Réponses: 1
    Dernier message: 01/12/2011, 18h24
  4. Chargement table Oracle par SQL Loader
    Par Mike-lb dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 28/08/2006, 12h30
  5. [SQL] Pb d'insertion donnée dans table, pb requête SQL
    Par PuppeT mAsTer dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 03/07/2006, 11h26

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