Erreur 3021 incompréhensible

poulpor78

XLDnaute Junior
Bonjour,

voici mon projet : j'ai d'un coté une base Access. J'ai de l'autre coté des fichiers excel. Dans ces fichiers excel, je fais remplir des prévisions aux commerciaux, quand ils sauvent leurs prévisions, ça génère une version hebdomadaire des prévisions dans la bases Access. Je reviens chercher dans excel en fin de procédure le total prévu, l'heure de remontée que je stocke dans le fichier excel (c'est là où j'ai un bug)

En DAO, je n'avais pas de problème. Avec Excel 365 dont certains postes sont en 64 bits, je peux oublier le DAO.
donc Je travaille depuis pas mal de temps pour passer de DAO à ADO.

Je rencontre des difficultés nouvelles. Par exemple, je fais un select simple depuis excel dans ma base pour écrire dans le fichier excel :


Code:
Function MyUpdatingManagement(MYSELLERID)


    Dim Mysql As String    'chaine sql
    Dim fso As Object    'objet Local
    Dim Response As Variant    ' boite de dialogue
    Dim ToProtectUPDT As Boolean    ' Fichier à protéger en fin de code ?

    INTERNAL.MyPath

...


    ActiveWorkbook.Sheets("UPDATING REPORT").Select
    Dim BaseSource As ADODB.Connection
    Set BaseSource = New ADODB.Connection
    BaseSource.Mode = adModeReadWrite
   
       Dim strConn As String
    
      If BaseSource.State = adStateClosed Then
         strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Mdbsource & ";Persist Security Info=False;"
         BaseSource.ConnectionString = strConn
         BaseSource.Open
                 
      End If

    Mysql = "SELECT T_FORECASTS.FCST_IDRELEASE, T_FORECASTS.FCST_IDSELLER, T_FORECASTS.FCST_DATE, Sum([UNWEIGHTED]*[EXPECTANCY]) AS SumWeighted, Sum(T_FCSTDATA.UNWEIGHTED) AS SumUNWEIGHTED"
    Mysql = Mysql & " " & "FROM T_FORECASTS INNER JOIN T_FCSTDATA ON T_FORECASTS.ID_FORECASTS = T_FCSTDATA.FCST_IDFORECASTS"
    Mysql = Mysql & " " & "GROUP BY T_FORECASTS.FCST_IDRELEASE, T_FORECASTS.FCST_IDSELLER, T_FORECASTS.FCST_DATE"
    Mysql = Mysql & " " & "HAVING T_FORECASTS.FCST_IDSELLER=" & MYSELLERID & " ORDER BY T_FORECASTS.FCST_IDRELEASE;"

    'Debug.Print Mysql
    'Stop

  Dim MySelection2 As ADODB.Recordset

Set MySelection2 = New ADODB.Recordset
MySelection2.Open Mysql, BaseSource, adOpenDynamic, adLockOptimistic


    If MySelection2.RecordCount <> 0 Then

        While Not MySelection2.EOF

            Sheets("UPDATING REPORT").Cells(MySelection2("FCST_IDRELEASE") - 126, 5).Value = MySelection2("FCST_DATE")
            Sheets("UPDATING REPORT").Cells(MySelection2("FCST_IDRELEASE") - 126, 6).Value = MySelection2("SumUNWEIGHTED")
            Sheets("UPDATING REPORT").Cells(MySelection2("FCST_IDRELEASE") - 126, 7).Value = MySelection2("SumWeighted")
            MySelection2.MoveNext
        Wend

    MySelection2.Close
    Set MySelection2 = Nothing

    End If

    If ToProtectUPDT = True Then Sheets("UPDATING REPORT").Protect (MyPassword)

    Application.Calculation = xlCalculationAutomatic

End Function


Le symptôme : je n'ai aucun recordset retourné dans excel 2007 ...sauf si je mets un point d'arrêt et que je passe en mode pas à pas. D'ailleurs, si je prends le sql généré et que je le teste dans Access, j'ai au moins un enregistrement.
En version 2013 sur mon poste (qui n'est pas sur le Terminal serveur contrairement à Excel 2007), je n'ai aucun problème.

Peut-être un peu trop vite mais j'ai évacué le problème de SQL puisque dans certaines conditions cela fonctionne.

J'ai plus douté de la manière dont je me connecte, des références ADO, de la manière dont je crée le recordset.


Avez-vous une idée de ce qui se passe ?

Merci par avance.

poulpor
 

poulpor78

XLDnaute Junior
Re : Erreur 3021 incompréhensible

Bonjour,

J'ai pas mal bosser sur les sujets ADO ces derniers temps et je me réponds moi même au cas où ca intéresserait une personne.

Dans le cas précis ci-dessus, le problème ne provenait pas du code mais de la mise en place du code. Cela marchait par DAO - cela marche sur 2013 sur mon poste - mais cela ne marche pas sur le TSE 2007 (la faute au TSE ou à 2007 ???).

Rappel du contexte :

Lors d'une mise à jour d'un Forecast, j'efface l'ancienne version (si elle existe) avant de monter la version de mon fichier, puis je vais requêter le résumé de la mise à jour (heure de sauvegarde, montant total du forecast).

Les symptômes après analyse :

Dans le cas où ça marche : quand je requête le résumé de ce que je viens de monter, j'ai bien ce qu'il me faut.

Dans le où ça ne marche pas : quand je requête le résumé, il me manque ma toute dernière mise à jour que je viens d'effectuer. Pourtant, cette mise est bien là dans la base.
C'est pour cette raison qu'en faisant un point d'arrêt ou un msgbox, le résultat devenait satisfaisant. Comme si j'envoyais ma requête alors que la base n'a pas eu encore le temps de se mettre à jour (pour info, j'ai tenté un 'wait' sans succès).

Comment j'ai remédier à cela sans trop comprendre :

Avant: j'avais une procédure faisant appel à la fonction Upload (destruction si existant du forecast de la semaine puis remplacement par le nouveau Forecast); cette fonction upload appelant la fonction d'obtention du résumé.

Après : ma procédure fait appel à la fonction Upload puis à la fonction de résumé

Et là, ça marche dans tous les cas.

J'admets que c'est assez énigmatique. Je suis preneur d'explications rationnelles.

Poulpor
 

Staple1600

XLDnaute Barbatruc
Re : Erreur 3021 incompréhensible

Bonjour à tous


Personnellement je mettrais ce code dans une Sub pas dans une Function.
A voir (par curiosité) si cela change quelque chose.

Quand à ton erreur, ce n'est pas Ce lien n'existe plus qui manque ;)
 
Dernière édition:

poulpor78

XLDnaute Junior
Re : Erreur 3021 incompréhensible

Bonjour Stapple,

J'ai évidemment lu la littérature. Erreur 3021 veut dire qu'on n'a pas d'enregistrement en retour, ce qui peut provenir de X raisons.

Par contre, cette littérature ne traite pas de mon cas : ce sont souvent des erreurs d'étourderie.


Pour être tout à fait franc sur ta remarque (Sub ou fonction) aui est sans aucun doute une piste à exploiter, je ne suis pas certain d'avoir saisi toutes les nuances entre sub et fonction.


Merci pour ton retour.

Poulpor
 

Staple1600

XLDnaute Barbatruc
Re : Erreur 3021 incompréhensible

Bonsoir à tous

Par contre, cette littérature ne traite pas de mon cas : ce sont souvent des erreurs d'étourderie.
Puisque tu parles littérature , voici de quoi lutter contre les étourderies qui parfois font peur ;)
(A lire les nuits de pleine lune ou d'insomnie )

Sinon Sub ou Function (ALT+F11 puis F1 pour éclairer ta lanterne ;) )
 

Discussions similaires

Réponses
0
Affichages
225
Réponses
5
Affichages
201

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16