Bonjour, je suis actuellement en train de manipuler une BDD SQL Server en VBA et je me heurte à plusieurs problèmes. Tout d'abord voici une partie de mon code :
Public Sub DTPicker1_CallbackKeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer, ByVal CallbackField As String, CallbackDate As Date)
End Sub 'Macro calendar'
Sub Action_Bouton()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Date_Debut, Date_Fin As String
Dim Jour, Jour1, Jour2 As Date
Dim i As Integer
Dim champ0 As String
Dim champ1 As String
Dim champ2 As String
Set cn = New ADODB.Connection 'Connexion à la DB'
With cn
.ConnectionString "Provider SQLOLEDB;Data Source=Masource;Initial Catalog=MaBDD;Uid=Login;Trusted_Connection=yes" 'Chaîne de connexion Sql Server'
.Open
End With
Set rs = New ADODB.Recordset 'Lecture de la DB'
With rs
.ActiveConnection = cn
.Open "SELECT * FROM Actions_OPE"
'Sélection de la table Actions_OPE'
End With
i = 1
rs.MoveFirst 'placement du curseur au premier enregistrement'
Do Until rs.EOF 'Actions à effectuer jusqu'au dernier enregistrement'
'Copie dans les cellules Excel'
Range("A" & i).Value = Format(champ0, "dd:mm:yyyy:hh:mm")
Range("B" & i).Value = champ1
Range ("C" & i)/value= champ2
i = i + 1
Loop
End Sub
Voici mes problèmes :
[list]
[*] Ma chaine "champ2" retourne quelques fois une valeur nulle. Du coup, j'ai le message d'erreur "Utilisation incorrecte de Null". Comment pourrais je en VBA, faire en sorte que lorsque ma chaine contient la valeur NULL de mettre un blanc dans la cellule?
[*] J'aimerais extraire de ma BDD seulement les champ à une date donnée. Le problème est que je ne connais pas la syntaxe pour y arriver car lorsque que j'ajoute "WHERE TIMEstmp=DateVoulue" j'ai une erreur de syntaxe
[*] Une fois le filtre par date ajouté, j'aimerai choisir la date via un calendar excel. Puis utiliser la date "CallbackDate" déclarée tout en haut du code dans ma requête SQL?
Question Ma chaine "champ2" retourne quelques fois une valeur null
Rponse : Je pense que Open "SELECT * FROM Actions_OPE IS NOT NULL" devrais marcher mais dans le cas contraire
if not isnull( rs!TimeStmp
) then champ0 = rs!TimeStmp
if not isnull(rs!MessageText
) then champ1 = rs!MessageText
if not isnull(rs!UserID
) then champ1 = rs!MessageText
champ2 = rs!UserID
Question J'aimerais extraire de ma BDD seulement les champ à une date donnée.
Réponse : "WHERE TIMEstmp = 'DateVoulue'" Mais suis pas sursur. Tout dépand si ton champs TIMEstmp est de type date ou de type texte
Concernant les valeurs nulles, le paramètre de requête "IS NOT NULL" n'a pas marché pour moi j'ai donc utilisé ta deuxième solution 4u4me4us et ça a marché =).
Concernant la requête sur la date, lorsque je fais :
"WHERE TIMEstmp = #" & 02/05/2011 14:25:46 & "#"
j'ai un message d'erreur qui me dis : "Erreur de syntaxe" alors que lorsque j'effectue ma requête en string :
[code=vb]"WHERE TIMEstmp = '02/05/2011 14:25:46'code] ça marche nikel.
Et sinon je n'arrive décidemment pas à extraire la valeur de mon calendar (DPICKERS)
Ah bah niquel j'essayerai ça demain au boulot =). Par contre avez vous des idées pour récupérer la valeur d'un DTPicker car c'est avec cela que je lancerai mes requêtes de date dans ma BDD.
Tu devais avoir une propriété .Value ou .Text.
Si .Value, privilégie-là sur .Text. L1ère devrait ramener la date au format date défini dans ton masque, le second au format caractère.
Mais vérifie dans ton aide, ce que je dis est vrai pour la version VB6 donc pas forcément pour la version .NET.
J'ai essayé ta syntaxe calade mais j'ai un message d'erreur "Syntaxe incorrecte vers '#'".
Sub Action_Bouton()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Date_Debut, Date_Fin As String
Dim Jour, Jour1, Jour2 As Date
Dim i As Integer
Dim champ0 As String
Dim champ1 As String
Dim champ2 As String
Dim TriDate As Date
TriDate = Format(TriDate, "DD/MM/YYYY HH:MM")
TriDate = "02/05/2011 00:00"
Set cn = New ADODB.Connection 'Connexion à la DB'
With cn
.ConnectionString "Provider SQLOLEDB;Data Source=Masource;Initial Catalog=MaBDD;Uid=Login;Trusted_Connection=yes" 'Chaîne de connexion Sql Server'
.Open
End With
Set rs = New ADODB.Recordset 'Lecture de la DB'
With rs
.ActiveConnection = cn
.Open "SELECT * FROM Actions_OPE WHERE TimeStmp= #" & TriDate & "#"
'Sélection de la table Actions_OPE'
End With
Sinon Concernant le DTPickers j'ai tenté ça
Public Sub DTPicker1_CallbackKeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer, ByVal CallbackField As String, CallbackDate As Date)
DTPicker1_CallbackKeyDown.Value = DateChoisie
End Sub
Puis dans ma Sub située dans le module1 où je fais mes requêtes SQL j'ai mis DateChoisie = TriDate mais la valeur DateChoisie ne retourne malheureusement rien.
dont la 2ème est inutile. Je ne sais pas d'où provient Tridate avant que tu ne la convertisses en string, mais c'est là qu'il faut vérifier qu'elle est du type Date.
Eh bien J'ai juste mis une date dans TriDate pour tester mes requêtes SQL. Le but de mon application est de choisir la valeur TriDate avec un DTPickers. Alala c'est pas facile VBA ^^. Merci pour ton aide en tout cas.
Je viens de trouver comment récupérer la valeur de mon DTPicker. Ducoup je n'ai pas à effectuer des instruction sur la valeur TriDate du coup ça me donne :
Dim TriDate As Date
TriDate = UserForm1.DTPicker1.Value 'Association TriDate à la valeur du calendar'
Set cn = New ADODB.Connection 'Connexion à la DB'
With cn
.ConnectionString "Provider SQLOLEDB;Data Source=FR-LAN-RSVIEW-2\SQLEXPRESS;Initial Catalog=FT_log;Uid=Administrateur;Trusted_Connection=yes" 'Chaîne de connexion Sql Server'
.Open
End With
Set rs = New ADODB.Recordset 'Lecture de la DB'
With rs
.ActiveConnection = cn
.Open "SELECT * FROM Actions_OPE WHERE TimeStmp= #" & TriDate & "#"
'Sélection de la table Actions_OPE'
If rs.EOF Then MsgBox "Aucun résultat"
End With
Et là il me met toujours l'erreur de syntaxe alors que j'ai bien déclaré TriDate comme étant une date. La valeur du DTPickers doit également être une date. Alors pourquoi cela ne marche pas =( ?
On va y arriver ^^
Je crois avoir compris! Tu utilise MS SQL 200X!? Donc tu doit faire DbChange.Execute "USE ".
Teste le code suivant
Set cn = New ADODB.Connection 'Connexion à la DB'
With cn
.ConnectionString "Provider SQLOLEDB;Data Source=Masource;Initial Catalog=MaBDD;Uid=Login;Trusted_Connection=yes" 'Chaîne de connexion Sql Server'
.Open
.Execute "USE (NOM DE LA BASE DE DONNEE"
End With
Set rs = New ADODB.Recordset 'Lecture de la DB'
With rs
.ActiveConnection = cn
.Open "SELECT * FROM Actions_OPE WHERE TimeStmp= #" & TriDate & "#"
'Sélection de la table Actions_OPE'
End With
Set cn = New ADODB.Connection 'Connexion à la DB'
With cn
.ConnectionString "Provider SQLOLEDB;Data Source=Masource;Initial Catalog=MaBDD;Uid=Login;Trusted_Connection=yes" 'Chaîne de connexion Sql Server'
.Open
.Execute "USE (NOM DE LA BASE DE DONNEE)"
End With
Set rs = New ADODB.Recordset 'Lecture de la DB'
With rs
.Open "SELECT * FROM Actions_OPE WHERE TimeStmp= #" & TriDate & "#",cn,, adOpenStatic, adLockOptimistic
Eh bien ça me met un autre message d'erreur :"Les arguments sont de type incorrect en dehors des limites autorisées ou en conflit les uns avec les autres".