Oui c'est bien ce que je t'ai dit cette ligne ne concerne pas sql serveur mais excel !
Donc regardes bien mon code et tu verras la différence !
Version imprimable
Oui c'est bien ce que je t'ai dit cette ligne ne concerne pas sql serveur mais excel !
Donc regardes bien mon code et tu verras la différence !
Thum
reprenons à zero :roll:
voici ta ligne de code
puis je la remplacer parCode:CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
celle-ciCode:CnServeur.Open = GenereCSTRING(SQLSERVER2018, ThisWorkbook.FullName)
Non en replace rien par rien!
ThisWorkbook.FullName c'est le fichier Excel sur lequel tu travailles, c'est pas ta base de données SQL Serveur !
Code:
1
2
3
4
5
6 GenereCSTRING(xls, ThisWorkbook.FullName) Dim CnServeur As Object, CnExcel As Object: Set CnServeur = CreateObject("AdoDb.Connection"): Set CnExcel = CreateObject("AdoDb.Connection") CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS") CnExcel.Open GenereCSTRING(xls, ThisWorkbook.FullName)
Thumb
Désolé d'insister
Je comprend la ligne de codemais c'est cette ligne de code ci dessous que je ne parviens à pas à analyserCode:CnServeur.Open = GenereCSTRING(SQLSERVER2018, ThisWorkbook.FullName)
"TblCAB" est le nom du fichier mais si le nom du fichier change quel impact ?Code:CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
et à quoi correspond les 2 "MOI" ?
regarde l'instruction selon choit TYPEBASE!
selon la valeur de TYPEDEBASE on ce connecte à SqlServeur2018 ou Excel!Code:Select Case TYPEBASE
tu n'a pas besoin de modifier la fonction GenereCSTRING car tu lui passe déjà les information en paramètres!
Code:
1
2
3
4 sub test() CnServeur.Open = GenereCSTRING(SQLSERVER2018, "Archive" , "MdP", "exploitation","00.00.00.00") CnExcel.Open GenereCSTRING(xls, ThisWorkbook.FullName) end sub
Code:
1
2
3
4
5
6
7
8
9
10
11 Private Function GenereCSTRING(TYPEBASE As MyAdo, Base As String, Optional User As String, Optional PassWord As String, Optional Server As String, Optional AvecTitre As Boolean = True) Select Case TYPEBASE Case xls GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Base & ";Extended Properties=""Excel 12.0;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";""" Case SQLSERVER2018 GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server Case Else GenereCSTRING = "PAS ASSEZ DE PARAMETRES RENSEIGNES !!!" End Select End Function
Thum
C'est ce que j'ai cru comprendre lol
Donc pour resumer, dans ta ligne de code
On aurait pu mettre n'importe quelle autre expression que "TblCAB" , "moi", "moi" et "DESKTOP-NQG9COU\SQLEXPRESS"Code:CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS"))
oui tu lui donnes le informations utile à la connexion à la base de données!
en revanche il faut rétablir le code de GenereCSTRING au moins comme j'ais fais au poste #25!Code:
1
2
3
4 Base ="Archive" :User="MdP" :PassWord="exploitation" :Server="00.00.00.00") CnServeur.Open = GenereCSTRING(SQLSERVER2018, Base ,User,PassWord,Server) Base = "C:\MyRep\MyFichier.Xlsx" CnExcel.Open GenereCSTRING(xls,Base )
cool merci Thumb
mais mon code me pose un problème au niveau de la requete en elle même :ptdr:.
Je m'explique:
Si ma table MyTblCAB existe dans ma base de donnée customer , Je la supprime. Et je la crée.
ensuite ,j'inserer dans la table MyTblCAB ,les nouvelles données issues de ExcelCode:
1
2 sql = "IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB" & vbCrLf & _ "CREATE TABLE customer.dbo.MyTblCAB (CAB varchar(30))" & vbCrLf
je fais ensuite un print pour pour visualiser ma requete sql.Code:
1
2
3
4
5
6
7
8
9 With CnExcel.Execute("Select [CAB] From [NumCAB$]") If Not .EOF Then[ATTACH=CONFIG]624894[/ATTACH] t = "('" & .GetString(, , "", "'),('", "") t = Left(t, Len(t) - 3) sql = sql & "INSERT INTO customer.dbo.MyTblCAB VALUES " & vbCrLf sql = sql & t & vbCrLf End If .Close End With
et voici ce que j'obtiensCode:Debug.Print sql
Lorsque j'insere ce code dans sql serveur, elle fonctionen trés bien . Elle me donne le résultat escompterCitation:
IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB
CREATE TABLE customer.dbo.MyTblCAB (CAB varchar(30))
INSERT INTO customer.dbo.MyTblCAB VALUES
('CA330624175DE'),('CM918473853DE'),('CC090971735DE'),('6A21054526032'),('6A21054526018'),('6A21054526025'),('9V31125509666'),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('')
Mais lorsque , en vba excel, je poursuit le code avec la ligne de code
J'ai ce message d'erreur qui s'afficheCode:CnServeur.Execute sql
Pièce jointe 624894
En résumer, pourquoi lorsque je suis sur SQL server, je peux supprimer une table et la créer mais lorsque je lance cette suppression et création de table à partir d'Excel, cela ne fonctionne pas
tu utilise le mêmes informations pour te connecter Via Sql Manager?
car le message dit que tu n'as pas les droits! de plus ce n'est plus un un table Temporaire #MyTblCAB!
j'ai fais ce test là et ça a fonctionné!
Code:
1
2
3
4
5
6
7
8
9
10 Sub test() Sql = "if OBJECT_ID('customer.dbo.#MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.#MyTblCAB" Sql = Sql & vbCrLf & "CREATE TABLE customer.dbo.#MyTblCAB (CAB varchar(30))" Sql = Sql & vbCrLf & "INSERT INTO customer.dbo.#MyTblCAB VALUES" Sql = Sql & vbCrLf & "('CA330624175DE'),('CM918473853DE'),('CC090971735DE'),('6A21054526032'),('6A21054526018'),('6A21054526025'),('9V31125509666')" Set CnServeur = CreateObject("AdoDb.Connection") CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS") CnServeur.Execute Sql CnServeur.Close End Sub
Bonjour Thumb
effectivement , tu as raison , je n'utilisais pas les mêmes informations pour me connecter à Sql Manager. 8-)
ET là cà fonctionne..:applo:
Mais j'ai encore quelques questions pour en finir avec cette discussion lol.
Question 1)
La table temporaire local que je crée #MyTblCAB est une table où je n'insère qu'un seul champ (CAB). Ce sont les données de ce champ qui seront amenées à être supprimées et remplacées par des nouvelles données issues de Excel.
Et cette table local est visible uniquement sur la scession où je me connecte. Je me pose alors la question si je dois créer une table temporaire local ou une table définitif qui sera supprimer et créer à chaque fois que je lancerais ce code VBA
Pour toi, tu ferais quoi ? :roll:
Question 2)
Que la table soit temporaire ou définitif, j'essaye de transformer le champ CAB en clef primaire afin que mes requêtes avec ce champ soit optimisées.
Mais je n'y parviens car à cause des violations de clefs primaire.
Voici ce que j'ai fait :
et voila ce que cela me donne avec le printCode:
1
2
3 sql = "IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB" & vbCrLf & _ '"CREATE TABLE customer.dbo.MyTblCAB (CAB varchar(30)," & vbCrLf & _ '"Primary Key(CAB))"
Code:
1
2
3
4 IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB CREATE TABLE customer.dbo.MyTblCAB (CAB varchar(30)) INSERT INTO customer.dbo.MyTblCAB VALUES ('CA330624175DE'),('CM918473853DE'),('CC090971735DE'),('6A21054526032'),('6A21054526018'),('6A21054526025'),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('')
le problème vient de cette redondance deComment faire pour les supprimer ??Citation:
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('')
ci dessous le message d'erreur
Bonjour,
Essais cette requête !
With CnExcel.Execute("Select DISTINCT [CAB] From [NumCAB$] Where [CAB] IS Not Null")
Super ..Avec du recul, c'était simple :P
Thumb, pour ce choix de table temporaire local globale ou définitif tu aurais choisis quelle type de table ?
En fait je choisis pas !
Quand tu ajoutes une table part requête, tu as l'obligation de la dropper !
Si elle doit être définitive autant la créer via sql manager et faire un delete par requête !
Un create table par requête ne peut être que temporaire donc un create table #MyTable a la durée de vie de la session !
Le choix t'appartient table definive via sql manager et delete table, oucreat #table par requête !
Ok ..lol
Thumb , une derniere question
pourrais tu m'expliquer les lignes de code 2 ,3 et 4 de ton code ci dessous
Code:
1
2
3
4
5
6
7 With CnExcel.Execute("Select [CAB] From [NumCAB$] where [CAB] is not null") If Not .EOF Then t = "('" & .GetString(, , "", "'),('", "") t = Left(t, Len(t) - 3) sql = sql & "INSERT INTO customer.dbo.MyTblCAB VALUES " & vbCrLf sql = sql & t & vbCrLf End If
la méthode Execute de l'objet ADODB.CONNECTION execute une requête mais retourne également le résultat de celle-ci sous forme de RecordSet
il ne suffit pas de récupérer le résultat d'une requête dans un recordSet encor faut-il savoir si elle retourne une ou plusieurs valeurs avant de la traiterCode:Set RecordSet= CnExcel.Execute(SQL)
si le recordSet retourne des valeurs on récupère la totalitée des valeurs sou forme de texteCode:if not RecordSet.eof then 'Vérifie si le récorset retourne des valeurs!
fais ce testCode:txt=RecordSet.getString
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Sub test() Dim CnEXCEL As Object Set CnEXCEL = CreateObject("Adodb.Connection"): CnEXCEL.Open GenereCSTRING(xls, ThisWorkbook.FullName) Dim rs As ADODB.Recordset Set rs = CnEXCEL.Execute("Select * From [NumCAB$A1:B10]") Debug.Print rs.GetString Debug.Print "Tous" Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString Debug.Print "Deux lignes" Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString(, 2) Debug.Print "Deux lignes avec sépareteur de colonnes" Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString(, 2, "[Colonne]") Debug.Print "Deux lignes avec sépareteur de colonnes et séparateur ligne" Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString(, 2, "[Colonne]", "[Ligne]") End Sub
Merci pour tout Thumb.:hola:
Je ferme cette discussion