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 :

Actions par code sur Etat Access donne résultat différent d'actions à la main


Sujet :

VBA Access

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut Actions par code sur Etat Access donne résultat différent d'actions à la main
    Bonjour!

    Je m'excuse d'avance si ce problème a déjà été abordé mais j'ai vraiment essayé de chercher partout et il n'y a nulle part ce sujet.

    J'ai crée un etat (Access 2003) lié à une requête de sélection. Le problème est que les actions sur l'etat par code VBA (Impression, aperçu) ne donne pas le même résultat que ces même actions faites à la main.
    En fait, j'ai essayé de faire à la main l'option "regrouper" pour que çà commence à la même ligne. ie: j'ai crée une table triée (temporaire) où certaines informations sont souvent répétitives (sauf la dernière colonne) donc je fais un premier traitement pour supprimer ces informations répétitives (en ne les gardant que sur un seul enregistrement à chaque fois).
    Après ce traitement, quand je crée/imprime l'etat lié à cette table (ou par la requête qui y est liée), les champs qui étaient censé être vides y apparaissent non vides. Mais quand j'ouvre l'etat à la main (après avoir fermé le formulaire contenant le code), ces même champs sont bien vides.

    voilà la partie du code concernée (Table_temp1 est la table temporaire où je récupère mes informations, PDF_P est le nom du PDFCréator)
    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
    'ouverture d'un etat
    Public Sub Ouvre_Etat()
        Dim req As String
        Dim Definition As Variant
        Dim Report_Name As String
        Dim Req_Name As String
        Dim i As Integer
        Dim Exist_Impr As Boolean
     
        Exist_Impr = False
     
            Report_Name = "Liste par Base"
            Req_Name = "Req_par_base"
            DoCmd.SetWarnings (False)
            DoCmd.RunSQL "delete * from Table_temp1;"
            DoCmd.RunSQL "insert into table_temp1 " & _
            "SELECT distinct user.nom, user.prénom, user.[code entité]+""  ""+user.entite AS [Entité], user.admin_profile+""  ""+list_admin_profiles.description AS Profile, habilitations.work_space_id+""  ""+list_dealbook.workspace_name AS [Dealbook associé] " & _
            "FROM [User], list_admin_profiles, list_dealbook, habilitations, habilitation_aux_bases_fermat " & _
            "WHERE (user.user=habilitations.user And habilitations.work_space_id=list_dealbook.work_space_id And user.admin_profile=list_admin_profiles.cd_admin_profile And user.user=habilitation_aux_bases_fermat.user And habilitation_aux_bases_fermat.base_fermat=""" & Form_Le_Formulaire.Detail_Report.Value & _
            """ and isnull(habilitation_aux_bases_fermat.[date suppression])) order by user.nom;"
            Call Traite_Table_Temp1
            DoCmd.SetWarnings (True)
     
     
    '    Set Definition = CurrentDb.QueryDefs(Req_Name)
    '    Definition.sql = req
    '    Definition.Close
     
     
        For i = 0 To Application.Printers.Count - 1
            If Application.Printers(i).DeviceName = PDF_P Then Exist_Impr = True
        Next
     
        If Exist_Impr = True Then
            Set Application.Printer = Application.Printers(PDF_P)
            'DoCmd.OpenReport Report_Name, acViewPreview
            DoCmd.OpenReport Report_Name, acViewNormal
        Else
            If MsgBox("Export au Format PDF impossible car l'application '" & PDF_P & "' est introuvable depuis ACCESS" & Chr(10) & _
            "Voulez-vous Exporter les résultats en format HTML?", vbCritical + vbYesNo, "PDFCreator introuvable") = vbYes Then
                DoCmd.OutputTo acOutputReport, "Liste par base", acFormatHTML, Nom_html_sortie, True
            End If
        End If
     
     
    End Sub

    procédure pour enlever les informations répétitives de la table temporaire (nom + prenom toujours unique)
    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
    Private Sub Traite_Table_Temp1()
        Dim i As Integer
        Dim bo As Boolean
        Dim req As String
        Dim TNom As String
        Dim TPrenom As String
        Dim cnn As New ADODB.Connection
        Dim rst As New ADODB.Recordset
        TNom = ""
        TPrenom = ""
     
        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentDb.name & ""
        req = "SELECT * FROM Table_temp1;"
     
        rst.Open req, cnn, adOpenDynamic, adLockOptimistic
     
        If Not rst.EOF Then
            rst.MoveFirst
            Do
                bo = False
                If TNom = rst![nom] And TPrenom = rst![prénom] Then bo = True
                If bo = True Then
                    rst![nom] = " "
                    rst![prénom] = " "
                    rst![Entité] = " "
                    rst![profile] = " "
                Else
                    TNom = rst![nom]
                    TPrenom = rst![prénom]
                End If
                rst.MoveNext
            Loop Until rst.EOF
        End If
        rst.Close
        cnn.Close
        Set rst = Nothing
        Set cnn = Nothing
    End Sub
    J'espère que quelqu'un pourrait m'aider sur ce point car là je n'y comprend plus rien
    Merci!


    Edit: je n'arrive pas à savoir si les mises à jour de la table ne sont effectives qu'après le fermeture de cette procédure (peu probable) ou c'est l'affichage de l'Etat qui prend l'"Etat" de la table à une date antérieure (ptêt qui sait) ou encore c'est juste un problème de l'etat (mais pourquoi alors quand on ouvre à la main tout est bien comme il faut ).

  2. #2
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    Bon apparemment, ce sont mes modifications par ADO qui prennent du temps à être prises en compte => l'affichage de l'Etat se fait avant que ses modif (via la procédure "Traite_Table_temp1") soient enregistrées ( bizarre!!).
    Quelqu'un pourrait me lancer sur une indice pour éviter celà?
    s'il faut temporiser, jusqu'à quel évènement alors?
    ou existe-t-il une action pour enregistrer tout avant la fermeture de cette procédure??
    Franchement je suis perdu

  3. #3
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    En bidouillant de cette façon, j'arrive des fois (en temporisant quelques secondes sur le premier affichage ) à obtenir le bon résultat au deuxième affichage...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            DoCmd.OpenReport Report_Name, acViewPreview, , , acDialog
            'DoCmd.Close acReport, Report_Name
            MsgBox "titi"
            DoCmd.OpenReport Report_Name, acViewPreview, , , acDialog
    Donc il y a forcément un évènement qui se déclenche à un moment
    j'ai essayé d'attendre les évènement de fermeture de la connection ADO puis la fermeture du recordset, mais c'est toujours pas à ce moment-là que la table est réellement mise à jour dans la base.
    J'ai tenté d'utiliser la connection ADO "withevents" mais google ne m'apporte rien d'exploitable (pour mon niveau) sur comment l'utiliser.
    S'il vous plaît

  4. #4
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 131
    Points : 129
    Points
    129
    Par défaut
    Eh ben merci , il m'a permis de savoir qu'il existe un "recordset Access" qui n'est pas celui de ce d'"ADO", et maintenant, avec celui-là la table se met bien à jour dès la fin de la procédure et le problème est réglé .
    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
    Private Sub Traite_Table_Temp1()
    Dim rst As Recordset
    Dim TNom As String
    Dim TPrenom As String
    Dim bo as Boolean
     
    Set rst = Application.CurrentDb.OpenRecordset("Table_Temp1", dbOpenTable, dbForwardOnly, dbPessimistic)
        If Not rst.EOF Then
            rst.MoveFirst
            Do
                bo = False
                If TNom = rst![nom] And TPrenom = rst![prénom] Then bo = True
                If bo = True Then
                    rst.Edit
                    rst.Fields("nom").Value = ""
                    rst.Fields("prénom").Value = ""
                    rst.Fields("Entité").Value = ""
                    rst.Fields("profile").Value = ""
                    rst.Update
                Else
                    TNom = rst![nom]
                    TPrenom = rst![prénom]
                End If
     
                rst.MoveNext
            Loop Until rst.EOF
        End If
     
    Set rst = Nothing
    End Sub
    Merci quand même à ceux qui ont essayé de se creuser la tête!! mais bon, si quelqu'un a quand même une explication sur ce truc d'ADO, ce ne serait pas de refus.
    Je présume que j'ai dû mal codé quelque part et donc c'était mal utilisé...

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

Discussions similaires

  1. concatenation sur etat access dans etiquette
    Par gui-llaume dans le forum IHM
    Réponses: 9
    Dernier message: 16/03/2018, 13h56
  2. [XL-2003] Réalisation d'un sous total par code sur une liste
    Par will-1981 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/05/2010, 16h37
  3. combobox alimenté par requête sur base access
    Par urbanspike dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/06/2009, 21h11
  4. Utiliser dbgrid par code sans base de donnés
    Par bleuerouge dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/05/2008, 11h12
  5. Valeurs à 0 sur Etats Access
    Par LE VIEUX dans le forum IHM
    Réponses: 4
    Dernier message: 27/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