BUG requete SQL pour période > à un an
Bonjour,
J'utilise des filtres SQL de Tatiak, que je remercie au passage pour le partage de ses compétences
Dès que je veux avoir une période qui pourrait commencer au 01/01/2023 pour aller jusqu'à 04/07/2024 cela BUG si je limite au 31/12/2023 cela fonctionne
'code de Tatiak sur http://tatiak.canalblog.com
Function Get_DevisclientForum(Filtre1 As String, Filtre2 As String, Filtre3 As String, deb As Long, fin As Long) As Long
Dim requete As String
lkmfilter = IIf(lkmfilter = "", Date, lkmfilter)
requete = "SELECT `Id`,`Ref`,`date`,`Société`,`article`,`contact`,`mail`,`tél`,`etat`,`Affaire`,`dmh`,`heures`,`CA`" & _
" FROM [" & Data1 & "$]" & _
" WHERE UCASE(`etat`) LIKE'" & UCase(Filtre1) & "%' " & _
" AND UCASE(`Affaire`) LIKE'" & UCase(Filtre2) & "%' " & _
" AND UCASE(`Société`) LIKE'" & UCase(Filtre3) & "%' " & _
" AND (`date` >" & deb & " or `date` =" & deb & ")" & _
" AND (`date` <" & fin & " or `date` =" & fin & ")"
requete = requete & " ORDER BY " & lkmfilter & " ASC"
Get_Devisclient = SQL.Query(requete)
End FunctionJ'ai tenté de faire d'utiliser des bornes BETWEEN pour limiter la date de Deb et de Fin pour éviter le bug comme si dessous
'code de Tatiak sur http://tatiak.canalblog.com
Function Get_DevisclientForum2(Filtre1 As String, Filtre2 As String, Filtre3 As String, deb As Long, fin As Long) As Long
Dim requete As String
lkmfilter = IIf(lkmfilter = "", Date, lkmfilter)
requete = "SELECT `Id`,`Ref`,`date`,`Société`,`article`,`contact`,`mail`,`tél`,`etat`,`Affaire`,`dmh`,`heures`,`CA`" & _
" FROM [" & Data1 & "$]" & _
" WHERE UCASE(`etat`) LIKE'" & UCase(Filtre1) & "%' " & _
" AND UCASE(`Affaire`) LIKE'" & UCase(Filtre2) & "%' " & _
" AND UCASE(`Société`) LIKE'" & UCase(Filtre3) & "%' " & _
" AND Clng(`date`) BETWEEN " & deb & " AND " & fin
requete = requete & " ORDER BY " & lkmfilter & " ASC"
Get_Devisclient = SQL.Query(requete)
End FunctionCela fonctionne et bug de la même manière.
Avez-vous une explication de ce bug ?
Merci d'avance
Bonjour leakim
Est-ce que le champ est bien un champ date
Comment sont envoyées la date de début et de fin ?
A+
Bonjour leakim, le fil, le forum,
J'ai soumi la fonction à ChatGPT. Sa réponse :
Il semble que votre code VBA tente de sélectionner des enregistrements dans une plage de dates donnée, avec des filtres supplémentaires sur plusieurs champs. Pour garantir qu'il fonctionne correctement même si la période couvre plusieurs années, vous devez vous assurer que le format de la date est correct et que les filtres sont bien appliqués. Voici une version améliorée de votre fonction :
vba
Copier le code
Function Get_Devisclient(Filtre1 As String, Filtre2 As String, Filtre3 As String, deb As Date, fin As Date) As Long
Dim requete As String
Dim lkmfilter As String
' Assurer que lkmfilter est défini, par exemple en le remplaçant par une valeur par défaut si nécessaire
lkmfilter = IIf(lkmfilter = "", "date", lkmfilter)
' Construire la requête SQL
requete = "SELECT `Id`, `Ref`, `date`, `Société`, `article`, `contact`, `mail`, `tél`, `etat`, `Affaire`, `dmh`, `heures`, `CA`" & _
" FROM [" & Data1 & "$]" & _
" WHERE UCASE(`etat`) LIKE '" & UCase(Filtre1) & "%' " & _
" AND UCASE(`Affaire`) LIKE '" & UCase(Filtre2) & "%' " & _
" AND UCASE(`Société`) LIKE '" & UCase(Filtre3) & "%' " & _
" AND (`date` >= #" & Format(deb, "yyyy/mm/dd") & "#) " & _
" AND (`date` <= #" & Format(fin, "yyyy/mm/dd") & "#)"
requete = requete & " ORDER BY " & lkmfilter & " ASC"
' Exécuter la requête et retourner le résultat
Get_Devisclient = SQL.Query(requete)
End Function
Changements et améliorations :
Définition de lkmfilter : Assurez-vous que lkmfilter est correctement défini, en le remplaçant par une valeur par défaut si nécessaire ("date" dans cet exemple).
Formatage des dates : Utilisez le format yyyy/mm/dd pour garantir que les dates sont interprétées correctement dans la requête SQL.
Correction des opérateurs de comparaison : Utilisez >= et <= pour inclure les dates de début et de fin dans la plage.
Nom de la fonction : J'ai corrigé le nom de la fonction à Get_Devisclient au lieu de Get_DevisclientForum pour correspondre à l'appel de fonction dans le reste du code.
Cette version devrait fonctionner correctement même si la période couvre plusieurs années.Bizz
Bonjour messieurs,
J'avais pas pensé à chat GPT
deb = CLng(IIf(.Range("I5").Value <> "", .Range("I5").Value, CDate(X_min)))
fin = CLng(IIf(.Range("J5").Value <> "", .Range("J5").Value, CDate(X_max)))La proposition de Bizarre me cause de bug en lien avec la déclaration des variables Long, Clong, Double ou Date ?
Merci de votre soutien
Bonjour,
Selon moi, d'après le code de bizarre, il attend deb (et fin) en tant que Date (cf. declaration de la fonction). Donc :
With .Range("I5")
If .Value <> "" Then
deb = CDate(.Value)
Else
deb = CDate(X_min)
End
End With
With .Range("J5")
If .Value <> "" Then
fin = CDate(.Value)
Else
fin = CDate(X_max)
End
End WithSinon changer les types dans la déclaration. A voir en fonction des valeurs de votre fichier
Bonsoir,
Cet après-midi, j'ai pris le temps d'anonymiser mon fichier que je vous soumets avec son bug
Vous verrez que dans les cellules I3 et I5 en double cliquant , un calendrier s'affiche ce qui évite les formats de dates aléatoires. Merci Tatiak
Bref, je vous laisse y regarder car je tourne en rond
Merci d'avance
Edit: Fichier buggé retiré après résolution du filsPS: Merci saboh12617 mais cela ne change rien alors peut-être avec le fichier, ce sera mieux.
Bonjour leakim, le fil, le forum,
J'opère Excel de Microsoft 365 Fr.
Mes choix en feuille "TRI Devis" :
État (G5) = Attente
I3 = 08-01-2000
I5 = 30-06-2030
J'obtiens 142 enregistrements du 06-01-2021 au 26-06-2024 sans autres changements que le choix de "État" et des deux dates (I3 et I5).
Feuille "BDD", j'ajoute "Attente" aux lignes 2, 3 et 4, en colonne "N" (etat).
Je retourne actualiser "I3" ou "I5" en feuille "TRI Devis", j'obtiens 145 enregistrements de 26-12-2018 au 26-06-2024.
Observation : la date la plus ancienne est au bas de la liste, la plus récente au haut en ligne 7.
Donc tout fonctionne bien sans changement dans ton fichier.
Bizz
Oh la vache !
Tu as raison cela fonctionne parfaitement avec un argument dans "etat" sauf que la plupart du temps je filtre sans renseigner "état" de sorte à avoir tous les devis quelque soit l'état.
Une idée d'adaptation à faire dans mon code ?
Merci
Bonjour leakim, le fil
Une question leakim, vous arrivez à travailler avec votre ficher
Si je modifie 1 date du filtre, le fichier fige
Pour moi, il suffirait de filtrer directement la feuille "BDD" et de copier coller/valeur les cellules affichées
A+
Bonjour leakim, le fil, le forum,
Où se cache la coquille ?
Ici : i As Byte, dans Sub FilterDevisclient(Ws As String, Optional Sens As Boolean) du module "SQL".
Sub FilterDevisclient(Ws As String, Optional Sens As Boolean)
Dim lig As Long, i As Byte, j As Byte, deb As Long, fin As Long
Dim Filtre1 As String, Filtre2 As String, Filtre3 As String, Filtre4 As String
Dim X_max As String, X_min As String
Dim rng As VariantIl faut donc passer "i" en entier ou long selon le besoin.
Ce "i" représente les lignes de la feuille "BDD", dont le nombre dépasse 255.
Bizz
Bonjour leakim, le fil, le forum,
J'ai regardé à nouveau la chose, seul le "i" est concerné; le "j" représente les colonnes. J'ai donc modifié mon post précédent en conséquence.
Bizz
Bonjour,
Oui, JExceL2fr je l'utilise plutôt bien pour les périodes courtes. Je préfère faire du SQL que du tri sur la BDD car je ne suis pas le seul utilisateur et que les TCD ne sont pas maitrisés par tous , d'autant que j'ai des macro de relance qui se font après le tri.
Et Merci Bizarre
Un grand merci à vous tous.