Problème requêtes SQL via VBA [Résolu]

Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
- - Dernière réponse : pitipilot
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
- 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
Afficher la suite 

20/35 réponses

Meilleure réponse
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
3
Merci
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.

Dire « Merci » 3

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

Codes Sources 185 internautes nous ont dit merci ce mois-ci

Commenter la réponse de 4u4me4us
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
3
Merci
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

Dire « Merci » 3

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

Codes Sources 185 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Calade
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
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
Commenter la réponse de Calade
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
0
Merci
Calade "Désolé de m'immiscer" non! ne le soit pas.
Commenter la réponse de 4u4me4us
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
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)
Commenter la réponse de pitipilot
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
0
Merci
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.
Commenter la réponse de 4u4me4us
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
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
Commenter la réponse de Calade
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
C'est une date de type jj/mm/aaaa hh:mm
Commenter la réponse de pitipilot
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Alors comme je te l'ai dit, cela devrait marcher:

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


Calade
Commenter la réponse de Calade
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
0
Merci
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.
Commenter la réponse de 4u4me4us
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
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
Commenter la réponse de pitipilot
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
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
Commenter la réponse de Calade
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
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.
Commenter la réponse de pitipilot
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
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
Commenter la réponse de Calade
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
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.
Commenter la réponse de pitipilot
Messages postés
1212
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
8
0
Merci
Oui, mais dans ce cas là tu la convertit en String.

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


Calade
Commenter la réponse de Calade
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
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 ^^
Commenter la réponse de pitipilot
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
0
Merci
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


Commenter la réponse de 4u4me4us
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
0
Merci
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
Commenter la réponse de 4u4me4us
Messages postés
111
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
2 juin 2015
0
Merci
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".
Commenter la réponse de pitipilot