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 :

[Access 2007] Impression d'états à la chaine à partir d'une zone de liste


Sujet :

VBA Access

  1. #1
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 960
    Points : 937
    Points
    937
    Par défaut [Access 2007] Impression d'états à la chaine à partir d'une zone de liste
    Bonjour à tous.
    Alors voilà, j'ai déjà un bouton qui me permet d'imprimer un état individuellement : je sélectionne la ligne dans la zone de liste et je clique sur le petit bouton avec l'imprimante (voir PJ) et mon état s'imprime en mode aperçu.
    Seulement, j'ai environ 300 états à imprimer, donc j'ai pensé qu'il serait judicieux d'imprimer tous les états de la zone de liste d'un coup.
    J'ai donc créé un bouton pour faire cela dont voici le code :
    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
    Private Sub cmdImprimerTout_Click()
        Dim dernLig As Integer
        Dim premLig As Integer
        Dim entCurrLigne As Integer
        Dim selec As Boolean
     
        ' Impression directe de toutes les notes
        ' Si aucune ligne n'est sélectionnée, toutes les notes de la ZdL sont imprimées
        ' Sinon on imprime toutes les notes à partir de la ligne sélectionnée
     
        ' Si aucune ligne n'est sélectionnée, on sélectionne la première ligne
        selec = Me.lstNotes.ItemsSelected.Count > 0
        If selec = False Then
            Me.lstNotes.Selected(0) = True
        End If
     
        dernLig = Me.lstNotes.ListCount - 1
        premLig = Me.lstNotes.ListIndex + 1
     
        ' Sélection de la ligne suivante et impression de l'état correspondant
        For entCurrLigne = premLig To dernLig
            Me.lstNotes.Selected(entCurrLigne) = True
            DoCmd.OpenReport "etaContratsNonTopes"
        Next entCurrLigne
    End Sub
    Le principe est de sélectionner par le code, toutes les lignes de la zdl une par une de la première à la dernière, et d'imprimer à chaque fois l'état correspondant.
    Si une ligne est déjà sélectionnée dans la zdl, on commence l'impression de cette ligne jusqu'à la fin, et si aucune ligne n'est sélectionnée, on imprime tout de la première à la dernière ligne.

    Donc, après débogage, j'ai observé que :
    - Quand aucune ligne n'est sélectionnée, les états s'impriment mais il sont vides d'informations.
    - Quand je sélectionne une ligne, seul l'état correspondant à la ligne sélectionnée s'imprime et en autant d'exemplaires que le nombre d'états qui auraient dû s'imprimer, bien que les lignes défilent correctement.

    Voilà, je crois avoir fait le tour.
    Merci de vos observations et conseils
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    les états s'impriment mais il sont vides d'informations
    je t'avais répondu deux fois:
    cela dépend du contenu de la requete (voir des évenements) de ton Report.

    d'autant que d'envoyer 300 fois 1 état dans la file d'impression c'est pas très efficace.
    joue sur le filtre de ton report, comme cela tu n'auras plus qu'à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.OpenReport "monReport",,,"[IdNotes]>" & premLig
    si ta zdl est ordonées sur <IdNotes>.


  3. #3
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 960
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par vodiem Voir le message
    d'autant que d'envoyer 300 fois 1 état dans la file d'impression c'est pas très efficace.
    joue sur le filtre de ton report, comme cela tu n'auras plus qu'à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.OpenReport "monReport",,,"[IdNotes]>" & premLig
    si ta zdl est ordonées sur <IdNotes>.

    Ben normalement, ça ne devrait pas être 300 fois le même puisqu'à chaque occurrence de la boucle la ligne suivante est sélectionnée.
    Or l'impression d'un seul état en le sélectionnant dans la zdl fonctionne
    C'est ça que je ne comprends pas, j'ai raisonné pour imprimer toutes les notes de la zdl comme quand j'imprime un état individuellement, sauf que j'ai fait une boucle For qui parcourt la zdl

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    dis voir tu tiens secret l'ouverture de ton report?

    si individuellement ca marche, comment sait-il quel état doit-il imprimer?
    tu as mis cela dans sa requete ou dans un code?
    tu vas me trouver gateux mais: c'est quoi ta requete ou le code.

    Citation Envoyé par azertix
    ça ne devrait pas être 300 fois le même
    je n'ai pas dis qu'il s'agissait du même.
    quand tu imprimes un document de 300 pages tu vas 300 fois choisir ta page et l'imprimer ou lui dire d'imprimer toutes les pages: c'est pas pareil.
    la file d'impression d'un coté contient un document de 300 pages et de l'autre 300 documents d'une page.

  5. #5
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 960
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par vodiem Voir le message
    dis voir tu tiens secret l'ouverture de ton report?

    si individuellement ca marche, comment sait-il quel état doit-il imprimer?
    tu as mis cela dans sa requete ou dans un code?
    tu vas me trouver gateux mais: c'est quoi ta requete ou le code.
    Oui, c'est top secret
    Non, sans rire, l'ouverture de l'état est on ne peut plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub cmdImprimer_Click()
        ' Ouverture de l'état en mode aperçu
        DoCmd.OpenReport "etaContratsNonTopes", acViewPreview
    End Sub
    Et voilà la requète source de mon état :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT A.NomAgence, A.NumAgence AS N°Agence, V.NomVendeur, N.NumNote AS N°Note, N.DateNote, V.NumVendeur 
    FROM CONTRAT AS C, NOTES AS N, AGENCE AS A, VENDEUR AS V 
    WHERE C.NumNote=N.NumNote And C.NumAgence=A.NumAgence And C.NumVendeur=V.NumVendeur 
    ORDER BY A.NumAgence;

    Citation Envoyé par vodiem Voir le message
    je n'ai pas dis qu'il s'agissait du même.
    quand tu imprimes un document de 300 pages tu vas 300 fois choisir ta page et l'imprimer ou lui dire d'imprimer toutes les pages: c'est pas pareil.
    la file d'impression d'un coté contient un document de 300 pages et de l'autre 300 documents d'une page.
    Ok, je comprends ce que tu veux dire maintenant
    C'est vrai que c'est pas du tout pareil

    Edit : après relecture de ma requête, c'est vrai que je ne dis à aucun moment quelle note imprimer
    Ben je sais pas trop comment il sait laquelle imprimer, mais en tout cas c'est bien la bonne
    En fait, j'ai appliqué ton principe numéro un : quand ça marche, on touche plus

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    et non la source de ton état est la requete "reqEtat":
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT N.NumNote, N.DateNote, C.NumContrat, C.DateEffetContrat, C.NatureContrat, V.NomVendeur, A.NumAgence, A.NomAgence, Cl.NomCli
    FROM NOTES AS N INNER JOIN (CLIENT AS Cl INNER JOIN (AGENCE AS A INNER JOIN (VENDEUR AS V INNER JOIN CONTRAT AS C ON V.NumVendeur=C.NumVendeur) ON A.NumAgence=C.NumAgence) ON Cl.NumCli=C.NumCli) ON N.NumNote=C.NumNote
    WHERE (C.NumVendeur)=[Forms]![frmContratIrregulier]![lstNotes];
    c'est donc ta clause where qui filtre ton état.
    il suffit donc de travailler dessus.
    en fait il y a plusieur possiblité mais si "reqEtat" n'est pas utilisé ailleur: tu retires la partie WHERE et tu fais:
    pour imprimer tous à partir d'un lstNotes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.OpenReport "monReport",,,"(C.NumVendeur)>=[Forms]![frmContratIrregulier]![lstNotes]"
    sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docmd.OpenReport "monReport",,,"(C.NumVendeur)=[Forms]![frmContratIrregulier]![lstNotes]"

  7. #7
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 960
    Points : 937
    Points
    937
    Par défaut
    Yop !
    J'ai fait comme tu m'as conseillé et je dirais que c'est pire qu'avant
    J'ai du rater quelque chose
    Pour résumer, ce n'est même plus la bonne note qui s'imprime et ça imprime cette note en boucle, bien qu'on voie toujours les lignes défiler sur la zdl.
    Là j'avoue que je m'y perds.
    Je pense que je vais tout recommencer, ça serait peut-être le mieux ...

    Edit : après avoir tout quitté et relancé, l'impression individuelle semble fonctionner.
    C'est vraiment bizarre, on a l'impression qu'il y a un problème de communication entre l'appli et l'imprimante.
    Le code se comporte exactement comme je le voulais, mais :
    - quand je ne sélectionne aucune ligne j'ai x états "vides"
    - quand je sélectionne une ligne, j'ai x fois la ligne sélectionnée uniquement.
    Je sens que la solution n'est pas loin, mais je ne sais pas trop comment résoudre le problème.
    Effectivement, on voit que ça vient bien de l'état ou de la requête source de cet état ou encore du filtre à l'ouverture de l'état.
    Le code réalisant l'impression semble bon

  8. #8
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    oui c'est normal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (C.NumVendeur)=[Forms]![frmContratIrregulier]![lstNotes]
    la valeur [lstNotes] ne change pas pour la requete.
    si tu veux que cela marche ainsi tu dois affecter [lstNotes] dans la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstNotes=lstNotes.ItemData(entCurrLigne)
    avant de lancer l'impression.


  9. #9
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 960
    Points : 937
    Points
    937
    Par défaut
    Salut salut !
    Alors le script que nous avons fait samedi fonctionne bien, mais il ne fait pas ce que j'attendais
    En fait, actuellement, ça m'imprime tous les contrats de tous les vendeurs sur la même note (soit 19 pages), alors qu'il faudrait tous les contrats de chaque vendeur sur une seule note. On envoie ensuite une note à chaque vendeur avec la liste de tous les contrats qui le concernent.
    Exemple :
    NOTE 1
    VENDEUR 56 : Jean DUPONT
    AGENCE XXX
    LISTE DES CONTRATS :
    - 054654546546
    - 243435435434
    - 687876876876
    - 576543467416
    NOTE 2
    VENDEUR 76 : Bastien DURAND
    AGENCE YYY
    LISTE DES CONTRATS :
    - 213587654654
    - 543576465465
    Je remets le script que nous avions fait auparavant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim rq As String
            DoCmd.OpenReport "etaContratsNonTopes", acViewLayout
            rq = "SELECT N.NumNote, N.DateNote, C.NumContrat, C.DateEffetContrat, C.NatureContrat, V.NomVendeur, A.NumAgence, " & _
                 "A.NomAgence, Cl.NomCli, C.NumVendeur FROM NOTES AS N INNER JOIN (CLIENT AS Cl INNER JOIN (AGENCE AS A INNER " & _
                 "JOIN (VENDEUR AS V INNER JOIN CONTRAT AS C ON V.NumVendeur=C.NumVendeur) ON A.NumAgence=C.NumAgence) ON Cl.NumCli=C.NumCli) ON N.NumNote=C.NumNote " & _
                 "WHERE " & IIf(IsNull(Me.lstNotes), "true", ">=" & Me.lstNotes)
           Reports("etaContratsNonTopes").RecordSource = rq
    Edit : Encore mieux, je t'envoie la base par mail, avec les tables en non lié

    Edit 2 : D'autre part, le fait de modifier la source de l'état pose le même problème ensuite, pour mon bouton d'impression individuelle, car il faudrait remettre ensuite la source comme elle était au départ
    En fait je pense qu'il faudrait utiliser une autre méthode car c'est un peu compliqué de changer la source car il faut ouvrir l'état dans un mode où il peut être modifié et ensuite Access demande s'il faut l'enregistrer. Si on l'enregistre la source est modifiée et donc l'impression individuelle ne fonctionne plus. Et puis pour l'utilisateur ce n'est pas simple.

  10. #10
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 960
    Points : 937
    Points
    937
    Par défaut
    Yop !
    J'ai finalement résolu le problème de mon propre code
    En fait l'erreur était toute bête ! Comme j'avais mis les entêtes de colonne, Access considérait que c'était la première ligne. Et c'est pour ça qu'il ne pouvait pas la sélectionner et que l'état était vide d'informations.
    En fait, il suffisait de sélectionner la ligne suivante pour avoir la véritable première ligne de la zdl donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    premLig = Me.lstNotes.ListIndex + 2
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    premLig = Me.lstNotes.ListIndex + 1
    Par contre, dans le cas ou on sélectionne une ligne dans la zdl, si on laisse avec +2, ça ne commence qu'à la ligne d'après, donc j'ai rajouté un simple if afin de corriger le problème

    Voilà ce que donne le code au final :
    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
    Private Sub cmdImprimerTout_Click()
        Dim dernLig As Integer
        Dim premLig As Integer
        Dim entCurrLigne As Integer
        Dim selec As Boolean
     
        ' Impression directe de toutes les notes
        ' Si aucune ligne n'est sélectionnée, toutes les notes de la ZdL sont imprimées
        ' Sinon on imprime toutes les notes à partir de la ligne sélectionnée
     
        ' Si aucune ligne n'est sélectionnée, on sélectionne la première ligne
        selec = Me.lstNotes.ItemsSelected.Count > 0
        If selec = False Then
            Me.lstNotes.Selected(0) = True
        End If
     
        dernLig = Me.lstNotes.ListCount - 1
        If selec = False Then
            premLig = Me.lstNotes.ListIndex + 2
        Else
            premLig = Me.lstNotes.ListIndex + 1
        End If
     
        ' Sélection de la ligne suivante et impression de l'état correspondant
        For entCurrLigne = premLig To dernLig
            Me.lstNotes.Selected(entCurrLigne) = True
            DoCmd.OpenReport "etaContratsNonTopes", , , "[NumVendeur]=" & Me.lstNotes.ItemData(entCurrLigne)
        Next entCurrLigne
    End Sub
    Edit : Pour résoudre le problème de la condition dans l'état, j'ai carrément supprimé cette condition de la requête source de l'état et celle-ci est précisée au besoin lors de l'appel de l'état

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/12/2007, 13h36
  2. Réponses: 2
    Dernier message: 26/01/2007, 15h56
  3. zone de liste à partir d'une zone de liste
    Par ludo50 dans le forum Access
    Réponses: 3
    Dernier message: 22/11/2006, 20h17
  4. Réponses: 5
    Dernier message: 11/08/2006, 22h14
  5. requête à partir d'une zone de liste multiple??
    Par chambon.denis dans le forum Access
    Réponses: 5
    Dernier message: 23/01/2006, 10h46

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