Requête SQL - problème date - where - récupération celllule

rcan7412

XLDnaute Occasionnel
Bonjour,

Je cale depuis des heures sur un problème de requête sql qui emploie un critère de date.

L'application doit extraire d'un fichier DBF, des données.
Je souhaiterais que les données extraites soient limitées en fonction du critère suivant :
DATESOR (champ date de la table de donnée) soit vide ou supérieur à la valeur date stockée dans la cellule nommée "DateSortie" de la feuille "Start" (cellule E13).

J'avais compris que la date des requêtes était au format américain (mm/dd/yyyy).
J'ai essayé plein de choses mais je n'y arrive pas.

Je joins en annexe le fichier avec le code VBA et le fichier des dossiers (normalement format dbf mais renommé en xls pour l'import sur le forum) et un fichier de données (idem dbf > xls)

Voici le code

Cible = "SELECT CODE,LIBELLE,FOURNI,DATEE,COMPTE,VALACHAT,TYPE,CUMUL,DUREA,PCOMPTA,DATSOR FROM " & laBase & " ORDER BY DATEE ;"

Je voudrais que ceci fonctionne :

WHERE DATSOR < DateSort OR DATSOR is null

DATESOR est le champ qui contient la date dans le fichier de données.
DateSort est la variable qui renvoie le contenu de la cellule nommée "DateSortie" de la feuille "Start" (cellule E13)

Si quelqu'un pouvait m'aider, car je désespère.

Merci d'avance

VB:
Private Sub CommandButton1_Click()
'bouton d'importation pour le processus d'import du fichier comptes.dbf et appel de la procédure d'import de lign.dbf
Application.ScreenUpdating = False
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim chemin As String, Cible As String, laBase As String
Dim Fld As ADODB.Field
Dim i As Integer
Dim DateSort As Date


If ComboBox1.ListIndex = -1 Then Exit Sub

chemin = ComboBox1.List(ComboBox1.ListIndex, 1)
laBase = "IMMOS.dbf"
DateSort = Format(Range("DateSortie"), "MM/DD/YYYY")



'efface la feuille comptes

Sheets("ImmoCiel").Select
    Columns("A:k").Select
    Range("k1").Activate
    Selection.ClearContents


Range("A1").Select


Set Cn = New ADODB.Connection
Cn.Open _
"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & _
chemin & ";"

'WHERE DATSOR < DateSort ORDER BY DATEE  WHERE DATSORT > DateSort"

Cible = "SELECT CODE,LIBELLE,FOURNI,DATEE,COMPTE,VALACHAT,TYPE,CUMUL,DUREA,PCOMPTA,DATSOR FROM " & laBase & " ORDER BY DATEE ;"



Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic

For Each Fld In Rs.Fields
i = i + 1
Sheets("ImmoCiel").Cells(1, i) = Fld.Name
Next Fld


Do While Not Rs.EOF
Sheets("ImmoCiel").Range("A2").CopyFromRecordset Rs
Loop

        
Rs.Close
Cn.Close

Sheets("Start").Select
Range("DOS") = ComboBox1
Range("REPDOS") = ComboBox1.List(ComboBox1.ListIndex, 1)
Range("CODEDOS") = ComboBox1.List(ComboBox1.ListIndex, 2)

Calculer
Application.ScreenUpdating = True
End Sub
 

Pièces jointes

  • Dossiers.xls
    18.8 KB · Affichages: 3
  • IMMOS.xls
    8.1 KB · Affichages: 4
  • Procédure Transfert Investissements CIEL vers Octopus V7.xlsm
    127.8 KB · Affichages: 3

rcan7412

XLDnaute Occasionnel
Yes !!! Il y a du neuf.

Toutefois j'ai adapté la requête sur :
DATSOR>=" & DateSort

= et non < pour avoir les enregistrements dont la date de sortie est supérieure au égale à la date choisie dans le tableur.

On est bien d'accord que Feuil1 n'est qu'une feuille intermédiaire qui ne sert que de passage et qui reste vide en bout de processus ?

Autrement il reste un problème de positionnement. Les enregistrements commencent en ligne 44 de la feuille ImmoCiel pour un dossier. Pour d'autres, cela commencent plus loin voire au début. J'ai testé en vain plusieurs choses. Le problème ne viendrait-il pas de ce code ? :

VB:
With Sheets("ImmoCiel")
                    .Range("A:K").ClearContents 'efface la feuille comptes
                    .Range("A1").Resize(1, UBound(Th, 1) + 1) = Th
                    .Range("A2").Resize(UBound(T, 1) + 1, UBound(T, 2) + 1) = T
                End With
 

rcan7412

XLDnaute Occasionnel
Tu voulais écrire "Next i" et pas "Next cl" je présume ?

Autrement cela fonctionne :)

Je te remercie vivement pour tout le temps passé à trouver une solution à mon problème.
Cela va vraiment me servir professionnellement.

Si je peux me permettre, dans le nouveau logiciel comptable qui se trouve dans le cloud, j'aimerais aussi pouvoir exploiter les données dans excel.
Mon ancien logiciel était installé en local et mes applications excel allaient directement lire les informations dans les fichiers de données à structure DBF.
Pour le nouveau, je n'ai pas les compétences pour pouvoir développer une approche API pour récupérer les données du serveur.
Toutefois, ce nouveau logiciel permet l'export en format fichier excel ou CSV des données (à faire manuellement à chaque actualisation des données).

Je pensais donc baser mes nouvelles applications sur ces fichiers (excel par exemple, plutôt que CSV) qui seraient téléchargés sur mon pc local.

Ma question d'ordre général : Est-il judicieux de de réaliser des query sql sur ces fichiers excel (fermés) pour récupérer des informations déjà en partie synthétisées ? Ces requêtes sql sont-elles plus efficaces en travaillant en amont sur les données que de charger les données parfois nombreuses dans un classeur et de les traiter en VBA ? Je ne sais pas si je suis clair ?
 

rcan7412

XLDnaute Occasionnel
Merci,

que penses-tu du conseil prodigué dans le tuto ci-après qui propose de s'aider d'access (et basculer en mode sql) pour avoir le code d'une requête ?
Un peu comme l'enregistreur de macro d'excel.
Pour les non-initiés, coucher du code n'est pas chose aisée et pourtant il peut rendre tellement de services.

Dans mon métier, j'ai déjà vu des personnes utiliser excel comme un traitement de texte, et pour l’addition, on écrit le total manuellement... un comble !

 
Haut Bas