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 ,pour faire des tris dans une base de données. Cela fonctionne vraiment bien, dans la limite d'une période d'une année.

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 Function

J'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 Function

Cela 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 mais je pense que c'est bien en écho à ce que questionne JExceL2fr Comment sont envoyées la date de début et de fin ?

            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 With

Sinon 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 lorsque l'on mets en I3 une date de début et en I5 et non en J5 comme je l'avais indiqué.

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 fils

PS: 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 Variant

Il 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 je suis passé à coté tellement de fois C'est bien la déclaration de variable du i qui me limitait. Je l'ai passé en long et tout fonctionne !

Un grand merci à vous tous.

Rechercher des sujets similaires à "bug requete sql periode"