Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/12/2010, 08h40   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 10
Points : 10
Par défaut Erreur (object variable or with block variable not set), Aide ADODB

Bonjour à tous,

j'ai longtemps hésité à venir poster, mais la je suit vraiment bloquer :s

Donc voila j'ai une bdd en ms sql serveur 2005 et je programme une interface en vb6.

J'ai déjà fait quelques programmes qui communiquent entre les 2 logiciel pas de problème et là j'ai voulu faire une boucle pour la copie de champs, d'habitude dans ma boucle j'avais une seul valeur a récuperer (while not eof etc...) ici je récupere 5 collone par ligne et dès que j'arrive sur une autre commande de récupération de champs sa plante.

Bon voici mon code sa sera plus clair !

Code :
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
' VARIABLE

' Pour recherche du PV
Public Date_PV1 As String
Public Date_PV As String
Public NbrePV As Integer
Public TabPV() As String
Public IDPerso As Integer
Public NomPerso As String

'Declaration d'objet pour la BDD
Public ConnecDB As ADODB.Connection
Public rst As ADODB.Recordset
Public rst1 As ADODB.Recordset


' PROGRAMME

Public Sub RecherchePV() 'Recherche le PV selon les critères
'   (1)
 Set ConnecDB = New ADODB.Connection
 ConnecDB.Provider = "SQLOLEDB.1"
 ConnecDB.ConnectionString = "Persist Secutity Info= False;User ID= user;Password= X;Initial Catalog= TEST;Data Source= X\SQLEXPRESS;"
 ConnecDB.Open
'   (2)
 Set rst = New ADODB.Recordset
'   (3)
rst.Open "SELECT * From PV_DMS Where (DateCreationPV >= " & Date_PV & ") And (DateCreationPV < " & Date_PV1 & ") And (IDProduit = " & choixidproduit & ") And (IDPresse = " & choixidpresse & ")", ConnecDB
'   (4)
 If rst.EOF = False Then
    rst.MoveFirst
    NbrePV = 0
    While Not rst.EOF
        NbrePV = NbrePV + 1
        rst.MoveNext
    Wend
    ReDim TabPV(1 To NbrePV)
    NbrePV = 0
    rst.MoveFirst
    While Not rst.EOF
        NbrePV = NbrePV + 1
        IntRecupData = rst("IDPV")
        TabPV(NbrePV) = IntRecupData
        Frm_Page_Principale.MSFlexGrid1.AddItem (IntRecupData)
        Frm_Page_Principale.MSFlexGrid1.Row = NbrePV
        
        IDPerso = rst("Monteur1")
        RecupNomPerso
        Frm_Page_Principale.MSFlexGrid1.Col = 1
        Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
        
        IDPerso = rst("Monteur2") 'JE PLANTE ICI
        RecupNomPerso
        Frm_Page_Principale.MSFlexGrid1.Col = 2
        Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
        
        IDPerso = rst("Regleur")
        RecupNomPerso
        Frm_Page_Principale.MSFlexGrid1.Col = 3
        Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
        
        IDPerso = rst("GapLeader")
        RecupNomPerso
        Frm_Page_Principale.MSFlexGrid1.Col = 4
        Frm_Page_Principale.MSFlexGrid1.Text = NomPerso
        
        rst.MoveNext
    Wend
    For x = LBound(TabPV) To UBound(TabPV)
        Frm_Page_Principale.Combo7.AddItem (TabPV(x))
    Next x
    Frm_Page_Principale.Combo7.Text = ""
Else

 End If
'   (5)
 ConnecDB.Close
 Set rst = Nothing
 Set ConnecDB = Nothing
End Sub
NB j'ai mit en rouge l'endroit ou sa plante.

Donc j'ai déjà éssayé pas mal de chose et la je désespère....

Merci d'avance pour vos réponses !!
Louis.Gruhn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 09h04   #2
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 936
Points : 7 936
bjr,

mettre le message complet pour avoir plus de chances de réponses, erreur 91 ne parle pas à tout le monde

je suppose que Monteur2 est bien un champ de la table PV_DMS?

que contient RecupNomPerso?
quelque chose qui pourrait expliquer la perte du recordset?
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2010, 09h15   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 10
Points : 10
Citation:
Envoyé par Arkham46 Voir le message
bjr,

mettre le message complet pour avoir plus de chances de réponses, erreur 91 ne parle pas à tout le monde

je suppose que Monteur2 est bien un champ de la table PV_DMS?

que contient RecupNomPerso?
quelque chose qui pourrait expliquer la perte du recordset?
Super la rapidité de réponse

Donc Monteur2 est bien un champs de la table PV_DMS

RecupNomPerso est une procédure car dans la table PV_DMS je récupère un ID et avec recup nom perso je fait une autre requete sql pour obtenir le nom associé à l'ID.

Quand a la perte du recordset c'est bien sa mon problème j'arrive pas à comprendre, il pourrait y avoir un conflit avec la procédure RecupNomPerso (qui utilise aussi une connexion avec la bdd)
Louis.Gruhn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 09h22   #4
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 936
Points : 7 936
Citation:
Envoyé par Louis.Gruhn Voir le message
Quand a la perte du recordset c'est bien sa mon problème j'arrive pas à comprendre, il pourrait y avoir un conflit avec la procédure RecupNomPerso (qui utilise aussi une connexion avec la bdd)
oui c'est possible, c'est pour ça que je demandais le contenu de la procédure
il y a peut-être une petite erreur, genre une fermeture de rst au lieu de rst1...
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2010, 09h25   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 10
Points : 10
Citation:
Envoyé par Arkham46 Voir le message
oui c'est possible, c'est pour ça que je demandais le contenu de la procédure
il y a peut-être une petite erreur, genre une fermeture de rst au lieu de rst1...
Je viens de tilter et j'ai modifier le code de RecupNomPerso

J'y ai rajouter rst1 (avant j'avais rst)

Citation:
Public Sub RecupNomPerso() 'Récupéré le nom de la presse selon l'id (conversion du id en nom)
' (1)
Set ConnecDB = New ADODB.Connection
ConnecDB.Provider = "SQLOLEDB.1"
ConnecDB.ConnectionString = "Persist Secutity Info= False;User ID= user;Password= Password1;Initial Catalog= TEST;Data Source= FRBLHWDT8042\SQLEXPRESS;"
ConnecDB.Open
' (2)
Set rst1 = New ADODB.Recordset
' (3)
rst1.Open "SELECT Nom_Prenom FROM personnel WHERE IDPersonnel =" & IDPerso, ConnecDB
' (4)
If rst1.EOF = False Then
rst1.MoveFirst
NomPerso = rst1("Nom_Prenom")
End If
' (5)
ConnecDB.Close
Set rst1 = Nothing
Set ConnecDB = Nothing
End Sub
Faut il aussi que je crée un ConnecDB1 ? car j'ai encore le même problème sur le ConnecDB.close a la fin de RecherchePV. (Mais en tout cas j'ai récup tout mes données et msflexgried est à jour)


Finalement j'ai retirer le ConnecDB.close à la fin de RecherchePV vu que de toute facon la connexion sera fermé dans le RecupNomPerso.

En tout cas merci beaucoup !! Je pense que le problème est clos

Bonne journée !!
Louis.Gruhn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 09h55   #6
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 936
Points : 7 936
bjr,

Effectivement il ne faut pas utiliser la même connection.

La variable ConnecDB étant public au niveau module, c'est la même variable ConnecDB qui est utilisée partout.
Et donc RecupNomPerso ferme cette connection qui n'est plus utilisable par la suite de RecherchePV.
(En plus la cible n'est pas la même, donc il faut bien 2 connections distinctes.)

L'inconvénient c'est que tu ouvres et fermes la connection à chaque appel de la procédure RecupNomPerso.
Si tu as 1000 entrées dans ta table et que tu appelles 4 fois RecupNomPerso pour chaque entrée, tu fais 4000 ouvertures et fermeture de la connection.
Cela peut peut-être être un peu long si la base est en réseau?

Tu peux éventuellement déclarer une variable public ConnectDBNom :
Code :
public ConnectDBNom as ADODB.Connection
Tu ouvres cette connection au début de RecherchePV (une seule fois avant la boucle While) et tu la fermes à la fin (une seule fois après le Wend).
Dans RecupNomPerso tu utilises cette connection mais tu ne l'ouvres et fermes pas, c'est déjà fait dans RecherchePV.
Comme ça tu ne fais qu'une seule ouverture et fermeture.

Il faut juste être bien carré dans con code pour faire les ouvertures et fermetures au bon moment.

Pour les connections et recordset utilisés uniquement par une seule procédure, il faut mieux les mettre en privé dans cette procédure.
Par exemple rst1 qui est utilisé par RecupNomPerso, le déclarer au début la procédure :
Code :
Private rstNom as ADODB.Recordset
Comme ça on n'est sûr de ne pas l'utiliser par erreur dans une autre procédure.

Au passage, j'évite les variables genre rst et rst1, on ne sait plus ensuite qui fait quoi.

Et une dernière chose :
NomPerso est public et garde donc sa valeur entre chaque exécution de RecupNomPerso.
Il faudrait l'initialiser au début de la procédure, sinon s'il n'est pas trouvé il gardera la valeur précédente.
Code :
1
2
3
Public Sub RecupNomPerso() 'Récupéré le nom de la presse selon l'id (conversion du id en nom)
' (0)
NomPerso = "" ' Initialise le nom au cas où non trouvé
Ou mieux utiliser une fonction au lieu d'une procédure et une variable public.

Pour finir, un tuto pratique pour débuter en VBA et comprendre les variables, fonctions, ... :
Initiation au VBA Office

Bon courage.
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 10h21   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Âge : 21
Localisation : France

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 10
Points : 10
Effectivement cette application est en réseau, j'ai donc suivi tous tes conseils.

Merci pour l'attention apporté à mon problème.

Je vais pouvoir continuer

Merci beaucoup arkham.

Bonne journée,
Louis.Gruhn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h23.


 
 
 
 
Partenaires

Hébergement Web