Problème requêtes SQL via VBA

Résolu
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 - 9 mai 2011 à 11:38
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 - 10 mai 2011 à 15:41
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'

champ0 = rs!TimeStmp
champ1 = rs!MessageText
champ2 = rs!UserID







rs.MoveNext

'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?

/list

35 réponses

4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
9 mai 2011 à 13:42
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

Pour la troisième question je ne sais pas.
3
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
10 mai 2011 à 13:39
Tu peux aussi faire:

"WHERE DAY(Timestmp) " & DAY(Tridate) & " AND MONTH(TimeStmp) " & MONTH(Tridate)
ajoutes l'année sur le même principe s'il y a lieu.



Calade
3
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
9 mai 2011 à 14:57
Bonjour à tous les 2 et désolé de m'immiscer.

Pour ta recherche:
"WHERE TIMEstmp = 'DateVoulue'" ' pas tout à fait

Si date voulue est de type date:
"WHERE TIMEstmp = #" & DateVoulue & "#"
si c'est du caractère
"WHERE TIMEstmp = '" & DateVoulue & "'"

ce qui est sur c'est qu'il faut sortir datevoulue des guillemets.

Calade
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
9 mai 2011 à 15:54
Calade "Désolé de m'immiscer" non! ne le soit pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
9 mai 2011 à 16:10
Merci à vous deux pour vos réponses =)

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)
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
9 mai 2011 à 16:41
Dans ce cas j'avais raison (Avec du bolle) il faut

"WHERE TIMEstmp = '"02/05/2011 14:25:46"'"

Mais là tu commais une grosse erreur d'analyse car ton champs est un string. Il faut le changer en date et mettre ta requête comme Calade te montre.

Tu peux gérer la date pare des string mais c une autres paire de manche.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
9 mai 2011 à 16:42
Ma syntaxe devait marcher en utilisant une variable pas une date littérale, dans ce cas il eut fallu utiliser:

"WHERE TIMEstmp = " & #02/05/2011 14:25:46#

dans le cas précédent, cela dépend du type de datevoulue. Quel est-il ?


Calade
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
9 mai 2011 à 16:50
C'est une date de type jj/mm/aaaa hh:mm
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
9 mai 2011 à 16:54
Alors comme je te l'ai dit, cela devrait marcher:

"WHERE TIMEstmp = #" & DateVoulue & "#"


Calade
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
9 mai 2011 à 17:23
Calade à raison, mais tu dois faire la chose corectment c a dir

...
DateVoulue = "02/05/2011 14:25:46"
"WHERE TIMEstmp = #" & DateVoulue & "#"
...

Si tu ne respecte par cette ordre des choses ta syntaxe sera incorecte.
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
9 mai 2011 à 19:45
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.

Bonne soirée et encore merci
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
10 mai 2011 à 07:34
Bonjour,

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.


Calade
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
10 mai 2011 à 09:02
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.

Bonne journée.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
10 mai 2011 à 09:09
C'est normal, Tridate à ce niveau là est du caractère à cause des instructions

TriDate Format(TriDate, "DD/MM/YYYY HH:MM") TriDate "02/05/2011 00:00"

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.


Calade
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
10 mai 2011 à 09:19
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.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
10 mai 2011 à 09:29
Oui, mais dans ce cas là tu la convertit en String.

Mets: Tridate = CDate("02/05/2011 00:00")


Calade
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
10 mai 2011 à 10:03
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 ^^
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
10 mai 2011 à 10:10
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


0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
10 mai 2011 à 10:17
Non g fais faux teste plus tot cela

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

'Sélection de la table Actions_OPE'

End With
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
10 mai 2011 à 10:32
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".
0
Rejoignez-nous