Excel exec procédure stockée SQL
Ludivine50
Messages postés
114
Date d'inscription
Statut
Membre
Dernière intervention
-
Ludivine50 Messages postés 114 Date d'inscription Statut Membre Dernière intervention -
Ludivine50 Messages postés 114 Date d'inscription Statut Membre Dernière intervention -
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.
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.
A voir également:
- Exec procedure sql server
- Cybera server - Télécharger - Divers Réseau & Wi-Fi
- Ps3 media server - Télécharger - Divers Réseau & Wi-Fi
- Filezilla server - Télécharger - Téléchargement & Transfert
- Mysql community server - Télécharger - Bases de données
- Typsoft ftp server - Télécharger - Téléchargement & Transfert
5 réponses
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...
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...
Ludivine50
Messages postés
114
Date d'inscription
Statut
Membre
Dernière intervention
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.
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.
Je pense que c'est ton provider qui fait que tu as l'erreur.
Bonjour NicoDisso et merci pour ta réponse,
J'utilise la chaîne de connexion suivante:
Dans le module CONNEXION:
Dans le module DELTA:
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
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 ?
tu as essayé de t'y connecter avec l'utilsateur SA et faire la manip ?
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:
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.
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.
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...
Par contre elle fait quoi ta procedure, si c'est pour exporter dans excel, il y a les lots DTS...
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ok Alors pourquoi ne pas faire une macro dans excel qui "ecrive" dans SQL et non pas sql qui va lire dans excel ?
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
Est-ce que c'est compliqué d'écrire de Excel vers SQL? Peux-tu me conseiller un tuto simple?
Merci