Excel exec procédure stockée SQL [Fermé]

Signaler
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
-
Ludivine50
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
-
Bonjour à tous,
Je suis bloquée depuis un mois sur le même problème.
A partir d'Excel, je veux exécuter une procédure SQL SERVER. J'arrive à me connecter, et à exécuter des procédures simples, mais dès que je met mon code SQL complet dans la procédure stockée, j'ai des plantages. J'ai déjà résolu plusieurs d'entre eux en m'ajoutant des droits assez spécifiques, mais l'un deux m'a définitivement bloquée:

Si j'ai dans ma procédure SQL, une instruction INSERT, lors de l'exécution de la procédure stockée via Excel, j'ai le message suivant:
le fournisseur OLE DB Microsoft Jet OLEDB du serveur lié a retourné le message Impossible de démarrer votre application. Le fichier d'informations du groupe de travail est absent ou ouvert en mode exclusif par un autre utilisateur

Sur un autre forum, on m'a conseillé d'ajouter un "sp_addlinkedsrvlogin" à ma procédure SQL, mais avec cette modification j'ai l'erreur : Le fournisseur OLE DB Microsoft.Jet.OLEDB.4.0 du serveur lié 'Excel_conso_tel_liste_fichiers' a rapporté une erreur. Le fournisseur n'a donné aucune information quand à cette erreur.

Bien sûr lorsque j'exécute ma procédure directement dans SQL SERVER, elle fonctionne parfaitement.

Voilà tout, j'espère que quelqu'un pourra m'aider.

5 réponses

Messages postés
230
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
22 août 2009
32
Dans un module, VBA place ce qui est en gras
Dans le menu outils/références de VBA, selectionne Mircrosoft ActiveX Data Objets 2.? Library ou le ? depends de ce que tu as sur ton PC

Les 2 procedures ci-dessous, parcourt la feuille passer en parametre dans
call Exporte_SQL("feuill1").
Cela ecrit dans SQL les tranchesa et tranchesB des salaires ainsi que le nom d'utilisateur selon les trimestres ( c'est du code que j'avais tapé, donc c'est juste pour exemple )



Private DataBase_Commande As String 'COMMANDE A EFFECTUER SUR LA BASE DE DONNNES
Private DataBase_Connection As ADODB.Connection 'CONNECTION A LA BASE DE DONNEES
Private DataBase_ConnectionString As String 'CHAINE DE CONNECTION A LA BASE DE DONNEES
Private DataBase_ResultatCommande As ADODB.Recordset 'TABLEAU DE DONNEES RENVOYEES PAR LA REQUETE

Public Sub Exporte_SQL(Feuille As Worksheet)

Dim Ligne As Long
Ligne = 2
Do Until Feuille.Cells(Ligne, 20).Value = "" 'exporte jusqu'a ce que la cellule de la colonne 20 soit vide
Call Recap_SQL(Feuille.Cells(Ligne, 20).Value, Feuille.Name, Feuille.Cells(Ligne, 18).Value, Feuille.Cells(Ligne, 19).Value) 'exporte les cellules des colonnes 20,18,19 de la ligne en cours
Ligne = Ligne + 1
Loop

MsgBox "Exportation Terminée", vbInformation, "Nicolas : Information"

End Sub

Public Sub Recap_SQL(Fk_Employe As Integer, Periode As String, Tranche_A As Double, Tranche_B As Double)

Dim Requete As String

DataBase_ConnectionString = "Provider=SQLOLEDB.1;Password=motdepasse;Persist Security Info=True;User ID=sa;Initial Catalog=database;Data Source=serveur"

Select Case Periode
'-----------------------------
'-----------------------------
Case "1er Trim 2008"
Requete = "UPDATE Tb_Employe SET Trim_01_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_01_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2008 AU 31/12/2008')"
Case "2 Trim 2008"
Requete = "UPDATE Tb_Employe SET Trim_02_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_02_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2008 AU 31/12/2008')"
Case "3 Trim 2008"
Requete = "UPDATE Tb_Employe SET Trim_03_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_03_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2008 AU 31/12/2008')"
Case "4 Trim 2008"
Requete = "UPDATE Tb_Employe SET Trim_04_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_04_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2008 AU 31/12/2008')"
'-----------------------------
'-----------------------------
Case "1er Trim 2009"
Requete = "UPDATE Tb_Employe SET Trim_01_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_01_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2009 AU 31/12/2009')"
Case "2 Trim 2009"
Requete = "UPDATE Tb_Employe SET Trim_02_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_02_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2009 AU 31/12/2009')"
Case "3 Trim 2009"
Requete = "UPDATE Tb_Employe SET Trim_03_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_03_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2009 AU 31/12/2009')"
Case "4 Trim 2009"
Requete = "UPDATE Tb_Employe SET Trim_04_Tranche_A =" & Replace(Tranche_A, ",", ".") & ", Trim_04_Tranche_B =" & Replace(Tranche_B, ",", ".") & " WHERE Fk_Employe =" & Fk_Employe & " AND (Periode = 'DU 01/01/2009 AU 31/12/2009')"
'-----------------------------
'-----------------------------
End Select

Set DataBase_Connection = New ADODB.Connection 'NOUVELLE CONNECTION A LA BASE DE DONNEES
On Error Resume Next 'MISE EN PLACE DE LA GESTION D'ERREUR
With DataBase_Connection 'TRAVAILLE DIRECTEMENT AVEC LA CONNECTION
.ConnectionTimeout = 5 'DELAI DE DECONNECTION SI ERREUR
.ConnectionString = DataBase_ConnectionString 'CHAINE DE CONNECTION A LA BASE DE DONNEES D'INTERFACE
.Open 'OUVRE LA CONNECTION
End With 'ARRETE DE TRAVAILLER DIRECTEMENT AVEC LA CONNECTION
If Err.Number = 0 Then 'SI ERREUR LORS DE LA CONNECTION A LA BASE DE DONNEES
Call DataBase_Connection.Execute(Requete) 'RESULAT DE LA COMMANDE
If Err.Number = 0 Then 'SI ERREUR
DataBase_Connection.Close
Set DataBase_Connection = Nothing
Else
DataBase_Connection.Close
Set DataBase_Connection = Nothing
MsgBox Err.Description, vbExclamation, "Nicolas : Avertissement"
End If
Else
DataBase_Connection.Close
Set DataBase_Connection = Nothing
MsgBox Err.Description, vbExclamation, "Nicolas : Avertissement"
End If
On Error GoTo 0 'ARRET DE LA GESTION D'ERREUR

End Sub


et voila...
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 80992 internautes nous ont dit merci ce mois-ci

Ludivine50
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
7
Merci NicoDisso pour ton aide. J'ai un peu de boulot pour réécrire mon code, donc je m'y attaque mercredi. Je te tiens au courant. Bonne journée.
Messages postés
230
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
22 août 2009
32
peux tu afficher ta chaine de connection à ton serveur en masquant les parties serveur, utilisateur et mdp.
Je pense que c'est ton provider qui fait que tu as l'erreur.


Ludivine50
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
7
Bonjour NicoDisso et merci pour ta réponse,

J'utilise la chaîne de connexion suivante:
Dans le module CONNEXION:
Public cN As ADODB.Connection
Public Sub conNect()
    Set cN = New ADODB.Connection
    dbPath = Path
    cN.ConnectionString = "Provider=SQLOLEDB;Data Source=XXXXXXX;Initial Catalog=XXXXXXX; User ID=XXXXX;Password=XXXXXXXX;"
    cN.Open
End Sub


Dans le module DELTA:
Sub TEST()
    CONNEXION.conNect
    cN.Execute ("exec PS_TEST")
End Sub
Messages postés
230
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
22 août 2009
32
alors la je ne comprends pas poruquoi dans ton message d'erreur du as du "Jet" alors que tu lui dis bien que tu fait du "SQLOLEDB" ...
tu as essayé de t'y connecter avec l'utilsateur SA et faire la manip ?
Ludivine50
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
7
Bonjour NicoDisso,

je n'ai pas encore pu tester avec "sa" car la personne qui a le mot de passe n'était pas dispo. Je vais tester lundi. Pour le "Jet", j'ai peut-être un indice. Ma procédure SQL crée un nouveau serveur lié à chaque exécution (car le fichier source change). Et j'utilise donc le code:
-- Déclaration du lien avec Excel
Exec sp_addlinkedserver @Excel_conso_tel_liste_fichiers,
	'Jet 4.0',
	'Microsoft.Jet.OLEDB.4.0',
	'\\10.5.5.5\Telecom\!ExportSql.xls',
	Null,
	'Excel 5.0'

Mais si ma procédure ne contient que ce bout de code, l'exécution de ma procédure s'exécute bien par excel (blocage sur le INSERT).
A noter que je n'ai aucun problème pour exécuter ma procédure directement dans SQL.
Messages postés
230
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
22 août 2009
32
Je suis désolé, mais je ne peut pas t"aider la dessus.
Par contre elle fait quoi ta procedure, si c'est pour exporter dans excel, il y a les lots DTS...
Ludivine50
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
7
Bonjour NicoDisso, ce n'est pas pour exporter dans excel, c'est à l'inverse pour exporter les données du fichier excel dans SQL SERVER.
A partir du fichier excel, on lance une procédure SQL SERVER qui importe le fichier excel.
Au départ, j'utilisais un "travail" sous SQL SERVER, mais les users voudraient qu'on puisse exporter vers sql server dès qu'on le souhaite, et pas attendre le soir que le travail SQL se soit exécuté.
A + et merci de ton aide.
Messages postés
230
Date d'inscription
mardi 26 mai 2009
Statut
Membre
Dernière intervention
22 août 2009
32
Ok Alors pourquoi ne pas faire une macro dans excel qui "ecrive" dans SQL et non pas sql qui va lire dans excel ?
Ludivine50
Messages postés
114
Date d'inscription
lundi 9 février 2009
Statut
Membre
Dernière intervention
1 février 2016
7
Parce que je ne sais pas faire lol! Et ma procédure SQL est déjà écrite... C'est dommage de devoir la jeter et tout recommencer, mais j'ai l'impression de ne pas avoir d'autres solutions effectivement.
Est-ce que c'est compliqué d'écrire de Excel vers SQL? Peux-tu me conseiller un tuto simple?
Merci