Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
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 01/10/2007, 13h38   #1
Nouveau Membre du Club
 
Étudiant
Inscription : mars 2007
Messages : 74
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 74
Points : 34
Points : 34
Par défaut VBA/Base de données

Bonjour,
Je travail actuellement sous VB 6 avec word. Pour 16 cas différents, il faut que je récupère les données depuis une base de données.

Le problème c'est qu'en appelant ces fonctions dans une procédure j'ai ce message d'erreur "Trop de variable locales non statiques" et le fait d'ouvrir et fermer à chaque fois ma base de données augmente le temps mis (4 fois) par l'application pour générer le rapport.

Exemple de l'une des 16 fonctions
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
 
 
Function getDonneesCoronaireDeuxiemeMarginale(NITH As Long, niP As Variant, nilib As Variant) As DonneesLesionCoronaires
  ...  
  On Error GoTo TreatError
 
  'Connection BDD production
  If (wsODBC Is Nothing) Then
     Set wsODBC = CreateWorkspace("toto", "tata", "titi", dbUseODBC)
     Set ds = wsODBC.OpenConnection("pass", dbDriverNoPrompt, True)
  End If
 
 'récupération des données
 .....  
  getDonneesCoronaireDeuxiemeMarginale = marg2
 
Fin:
 
  'Fermeture de la connexion
  ds.Close
  wsODBC.Close
 
  Exit Function
 
TreatError:
  Call TreatError
 
  If Not (ds Is Nothing) Then
    ds.Close
  End If
  If Not (wsODBC Is Nothing) Then
    wsODBC.Close
  End If
  End
 
End Function
Appel de ces fonctions dans ma procédure
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
 
Sub LesionsCoronairesNatives(dr As DonneesRapport, lngNITH As Long, titre_coro_native As Integer)
 
For i = 1 To (UBound(dr.Lesion_coronaire))
  If Trim(dr.Lesion_coronaire(i, 1)) = "Coronaire droite proximale" Then
  'On va récupérer les données de la lésion coronaire correspondante
  dl = getDonneesCoronaireDroiteProximale(lngNITH, dr.niPatient, dr.Lesion_coronaire(i, 2))
  'on va ensuite constituer le message a afficher
   etc ....
 
   End If
 
  If Trim(dr.Lesion_coronaire(i, 1)) = "Coronaire droite moyenne" Then
   dl = getDonneesCoronaireDroiteMoyenne(dr.lngNITH, dr.niPatient, dr.Lesion_coronaire(i, 2))
'    etc...
 
  end if
Next i
 
End If    
 Exit Sub
TreatError:
  Call TreatError
  End
End Sub
Le problème c'est qu'à partir du 9ième appel, de ce type de fonction getDonneesCoronaireDroiteMoyenne(), il y'a ce message d'erreur "Trop de variables locales non statiques". J'ai alors regroupé les 16 fonctions en une seule quitte à récupérer des infos plusieurs fois. Mais au niveau de la connexion à la BD, je ne sais pas comment résoudre ce problème pour réduire le temps d'exécution.

J'ai essayé de crée deux fonctions, pour ouvrir la BD de données une fois l'application lancée, et la fermer à la fin, ce qui me permettra, une fois la BD ou verte, de passer le "descripteur" de la BD en argument dans les différentes fonctions, mais là encore il y a un bug! au niveau de mes requête sql.
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

Function OpenDataBase() As Connection
  
  Dim ds As Connection
  Dim wsODBC As Workspace

  'Connection BDD production
  If (wsODBC Is Nothing) Then
      Set wsODBC = CreateWorkspace("toto", "tata", "titi", dbUseODBC)
      Set ds = wsODBC.OpenConnection("loulou", dbDriverNoPrompt, True)
  End If

  Set OpenDataBase = ds

End Function

Function CloseDataBase(ds As Connection)
  
  Dim wsODBC As Workspace
  
Erreur

End Function

Sub LesionsCoronairesNatives(dr As DonneesRapport, lngNITH As Long, titre_coro_native As Integer)
        
    Dim ds As Connection
    set ds = OpenDataBase()
   
 If Not IsEmpty(dr.Lesion_coronaire) Then
     ....   
        For i = 1 To (UBound(dr.Lesion_coronaire))
        'Récupération des données
       dl = getDonneesLesionsCoronaires(ds,lngNITH, dr.nipatient, dr.Lesion_coronaire(i, 2))

      ....

end sub

Function getDonneesLesionsCoronaires(ds as connection,lngNITH As Long, nipatient As Variant, nilib As Variant, fermeture_connection As Integer) As DonneesLesions
  
  dl as DonneesLesions
  'récupération des données
  dl.cdp_localisation = getQuestRepListNILIBSUP(ds, 9249, lngNITH, nipatient, "C", , nilib) 'CORO 9404
  dl.cdp_restenose = getQuestRepListNILIBSUP(ds, 9803, lngNITH, nipatient, "C", , nilib) 'CORO 9804
 etc...

Function getQuestRepListNILIBSUP(cx As Connection, lngNIQ As Long, lngNITH As Long, nipatient As Variant, libelle As String, Optional lngNict As Long, Optional nilibsup As Variant) As Variant
  Dim strSQL As String, intNbVal As Integer, i As Integer
  Dim varReponse() As Variant
  Dim varResult As Variant
  
  strSQL = " SELECT distinct bm_rep_s.reponse, "
  varResult = getSQLValue(cx, strSQL)
  ...
End Function
Mais il y'a un soucis au niveau de la fonction getQuestRepListNILIBSUP() à cause du "ds" que je lui passe en argument.

Voilà, ça me bloque et j'aimerais vraiment pouvoir ouvrir ma base de données une et une seule fois, passer en argument à toutes les fonctions qui ont besoin le "descripteur" de la BD, et de fermer la BD une fois le rapport généré.

Merci d'avance...
cupidette92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 13h59   #2
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 810
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 810
Points : 3 011
Points : 3 011
Bonjour,

Je ne sais pas si ça aura une incidence, mais c'est plus propre.

Pour chaque création du style
Code :
1
2
 
Set toto = quelquechose
Il est bien de faire à la fin
Code :
1
2
 
Set toto = Nothing
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 14h06   #3
Nouveau Membre du Club
 
Étudiant
Inscription : mars 2007
Messages : 74
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 74
Points : 34
Points : 34
Merci...
Je l'ai testé mais ça ne change pas grand chose.
Le problème se pose vraiment au niveau du passage en argurment du descripteur de la BD, au niveau de l'appel de la fonction suivante (par exemple) :
getQuestRepListNILIBSUP(ds, 9803, lngNITH, nipatient, "C", , nilib)

(Cf. défintion et appel de la fonction plus haut)
cupidette92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 16h49   #4
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 677
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 677
Points : 7 625
Points : 7 625
Citation:
Envoyé par cupidette92 Voir le message
Je travail actuellement sous VB 6 avec word
Juste une précision.
Travailles-tu en VBA (dans Word) ou en VB6 (l'application Visual Basic)?
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 19h12   #5
Nouveau Membre du Club
 
Étudiant
Inscription : mars 2007
Messages : 74
Détails du profil
Informations personnelles :
Âge : 26

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2007
Messages : 74
Points : 34
Points : 34
je travaille, en VBA sous word, mais MS Visual Basic m'a été installé pour une utilisation future.
cupidette92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h20.


 
 
 
 
Partenaires

Hébergement Web