Fichier Excel (avec MSDAORA) fonctionnant sur un poste mais pas sur un autre

Signaler
Messages postés
91
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
19 août 2020
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour !

J'ai un fichier Excel 2003 qui appelle une base Oracle 10g. ça fonctionne très bien sur mon poste Windows XP.

Ensuite, je l'appelle d'un deuxième poste (Windows XP, client Oracle 10g), ça ne marche pas .
Quand j'ouvre le fichier, il me dit :

3709
Impossible d'utiliser cette connexion pour effectuer cette opération. Elle est fermée ou non valide dans ce contexte.


Pourtant ce deuxième poste est plus récent, et le client Oracle fonctionne bien. D'ailleurs la même requête retourne un bon résultat dans le SQLplus Worksheet.

On m'a conseillé d'installer le MDAC 2.8, mais quand j'essaie de l'installer, il me dit :

MDAC2.8 n'est pas compatible avec cette version de Windows. Toute ses fonctionnalités font déjà partie intégrante de Windows.


Alors quel est le problème à votre avis ?

PS : au cas où ça peut servir, voici le code VBA :

Option Explicit
 
Public cN As ADODB.Connection
Public rs As ADODB.Recordset
 
Public Function conNect() As Boolean
    
    On Error GoTo conNect_Err
    Set cN = New ADODB.Connection
    cN.ConnectionString = "Provider=msdaora;Data Source=IOUI;User Id=xxxxxx;Password=xxxxxx;"
    cN.Open
    conNect = True
    Exit Function
    
conNect_Err:
 
    MsgBox Err.Number & vbCr & Err.Description
    conNect = True
    
End Function
 
Public Function DeconNect() As Boolean
 
    On Error Resume Next
    cN.Close
    Set cN = Nothing
    
End Function
 
Private Sub Workbook_Open()
Dim strSQL As String
Dim i As Integer
Dim j As Integer
 
    On Error GoTo Workbook_Open_Err
    Feuil1.Cells(1, 1) = "id_indice"
    Feuil1.Cells(1, 2) = "cote"
    If conNect() = True Then
    
        Set rs = New ADODB.Recordset
        rs.CursorLocation = adUseClient
        
strSQL = ""
strSQL = strSQL & "select cote.indice ind99, "
strSQL = strSQL & "       cote.cote_actuelle cot99 "
strSQL = strSQL & "  from t_detail_vin pr, "
strSQL = strSQL & "       type_vin vin, "
strSQL = strSQL & "      (select ind.id_tvin, "
strSQL = strSQL & "              ind.milesime millesime, "
strSQL = strSQL & "              c.cote cote_actuelle, "
strSQL = strSQL & "              ind.id_indice indice "
strSQL = strSQL & "         from t_indices ind, "
strSQL = strSQL & "              cote_annuelle c "
strSQL strSQL & "        where ind.id_indice c.id_indice"
strSQL = strSQL & "          and ind.format in('Bouteille') "
strSQL = strSQL & "          and c.annee='2010' "
strSQL = strSQL & "          and ind.id_indice not in ('1','2','3') "
'strSQL = strSQL & "          and ind.id_indice < '50') cote "
strSQL = strSQL & "          ) cote "
strSQL strSQL & "  where vin.id_tvin pr.id_tvin "
strSQL strSQL & "    and pr.milesime cote.millesime "
strSQL = strSQL & "    and vin.id_tvin=cote.id_tvin "
strSQL = strSQL & "    and vin.proprietaire not in ('Indifferent') "
strSQL = strSQL & "    and vin.proprietaire is not null "
strSQL = strSQL & "  order by cote.indice"
 
      rs.Open strSQL, cN, adOpenForwardOnly, adLockOptimistic
        
        If rs.RecordCount > 0 Then
        
            j = 1
            i = 1
            
          Do While Not rs.EOF And Not rs.BOF
                
    i = i + 1
    Feuil1.Cells(i, j) = rs("ind99")
    Feuil1.Cells(i, j + 1) = rs("cot99")
    rs.MoveNext
                
Loop
            
        End If
        
        DeconNect
        
    Else
    
        'blablabla
        
    End If
        
    Exit Sub
 
Workbook_Open_Err:
MsgBox Err.Number & vbCr & Err.Description
 
End Sub

9 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Après un ordre de connexion à une DB - surtout quand s'agit d'une DB située sur un réseau - il est bon de tester si la connexion est bonne :
    cN.Open
    ' Attend la fin de connexion (ou erreur)
    Do While cN.State = adStateConnecting
        DoEvents
    Loop
    ' Mémoirise True uniquement si la connexion est ouverte
    conNect CBool(cN.State adStateOpen)
Ca te permettra de savoir si la connexion se fait correctement.
D'ailleurs, à quoi te sert de renvoyer un True à ta fonction conNect puisque même en cas d'erreur, tu renvoies True ? ça n'a pas de sens. Normal donc que tu aies des erreurs ensuite puisque c'est au niveau de la connexion que ça semble déconner.

Je vois que tu n'as toujours pas modifié ta structure de Select.
Ca sert à quoi de poser des questions si tu n'appliques pas les solutions ? Bizarre

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
PS : Au lieu de faire une boucle de lecture de ton RecordSet, pourquoi ne pas utiliser la fonction Excel CopyFromRecordset ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Ta base Oracle se situe où ?
Sur ta machine ou sur une autre machine ?

A quoi correspond 'IOUI' dans le paramétrage de ta ConnectionString ?
Messages postés
91
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
19 août 2020

Merci pour ces conseils, mais je ne veux pas améliorer mon code, il fonctionne très bien.

Je veux savoir pourquoi il ne fonctionne pas sur un autre poste. Il y a surement un soucis de configuration, de pilote, mais je ne vois pas.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Et les réponses à mes questions ?
Messages postés
91
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
19 août 2020

La base Oracle se situe à distance, voici le contenu du fichier tnsnames.ora :

# TNSNAMES.ORA Network Configuration File: C:\oracle\ora\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

IDW.WORLD (DESCRIPTION
    (ADDRESS_LIST (ADDRESS (PROTOCOL = TCP)(HOST = 212.213.174.185)(PORT = 15211))
    )
    (CONNECT_DATA (SID IOUI)
    )
  )


IOUI correspond au service
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Arrives-tu à Pinger cette machine ?
IOUI : connait pô
Le service IOUI est-il installé et en démarrage automatique ?
Messages postés
91
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
19 août 2020

Je répète que tout fonctionne depuis un premier poste. Je ne comprend pas pourquoi tu me poses cette question !!
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Bah parce que tu es une autre machine et qu'il faut être sûr de la connectique et des logiciels avant d'incriminer les programmes, pardi !

Tu ne veux déjà pas vérifier si la connexion se fait correctement après la commande Open, alors que c'est par là qu'il faut commencer.
L'erreur dont tu parles dans ta question initiale n'est qu'une conséquence d'un problème de connexion, comme expliqué dans le message de l'erreur.
Mieux vaudrait se concentrer sur les raisons du problème de connexion, non ?

Mais bon, si ça t'embête de faire ces simples vérifs ...