Convertir une boucle VBA en requête SQL

Résolu/Fermé
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - 17 févr. 2012 à 06:19
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - 20 févr. 2012 à 21:43
Bonjour à tous,

je me mets à Access car Excel ne suffit hélas plus. Du coup, je bute quant à la convertion de cette boucle en une requête SQL car elle est un peu particulière.

Dim TabEntrée(), TabSortie() As Variant
    xlApp.Cells.Sort Key1:=xlApp.Cells(1, 1), order1:=xlAscending, Header:=xlYes
    ColMax = xlApp.Cells(1, 1).End(xlToRight).Column
    TabEntrée = xlApp.Range(xlApp.Cells(1, 1), xlApp.Cells(LigMax, ColMax)).Value
    ReDim TabSortie(LigMax, ColMax) As Variant
    x2 = 0
    For x1 = 1 To UBound(TabEntrée, 1) - 1
        If Not TabEntrée(x1 + 1, 1) = TabEntrée(x1, 1) Then
            TabSortie(x2, 0) = TabEntrée(x1 + 1, 1)
            TabSortie(x2, 2) = TabEntrée(x1 + 1, 3)
            x = x1 + 1
            Do While Month(TabEntrée(x, 3)) = Mois And Year(TabEntrée(x, 3)) = Année
                If x = x1 + 1 Then TabSortie(x2, 1) = 0
                If TabSortie(x2, 1) = 0 And Not TabEntrée(x + 1, 1) = TabEntrée(x, 1) And Not TabEntrée(x - 1, 1) = TabEntrée(x, 1) Then
                    TabSortie(x2, 1) = TabSortie(x2, 1) + TabEntrée(x, 2)
                    Exit Do
                End If
                If TabEntrée(x + 1, 1) = TabEntrée(x, 1) Or TabEntrée(x - 1, 1) = TabEntrée(x, 1) Then
                    TabSortie(x2, 1) = TabSortie(x2, 1) + TabEntrée(x, 2)
                End If
                If Not TabEntrée(x + 1, 1) = TabEntrée(x, 1) Then Exit Do
                x = x + 1
            Loop
            x2 = x2 + 1
        End If
    Next x1


Elle s'exécute sur un classeur ou il y a le détail de toutes les ventes avec chaque quantité vendue et chaque date de vente. Chaque article apparaît donc plus d'une fois.

L'objectif est de :
- ne garder que la dernière date de vente pour chaque article
- faire le cumul des ventes uniquement pour le mois en cours et si l'article enregistre des ventes pour ce mois.

Exemple, nous sommes en février 2012 :
si l'article n'a pas fait de ventes en février 2012, je garde simplement la dernière date à la quelle il a été vendu.
si l'article a été vendu au cours de février 2012, je fais le total des ventes uniquement pour février 2012 (j'égnore les ventes antérieurs) et je garde sa dernière date de vente.

Je ne connais rien au SQL, et je suis bien incapable de le faire, mais je serai très reconnaissant si quelqu'un pouvait juste m'indiquer quelles sont les commandes à utiliser, car je ne veux pas non plus demander qu'on fasse tout le boulot à ma place.

Merci d'avance
@+
Phoe

1 réponse

Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
Modifié par Phoenellion le 20/02/2012 à 21:58
Bonjour à tous.

N'étant pas très doué avec Access, j'ai contourné le problème autrement.

J'ai directement passé la table access en variable tableau, puis en adaptant le code initial, j'ai pu obtenir le résultat escompté. pour ceux que ça intéresserait, voici mon code :

Dim TabEntrée, TabSortie As Variant  
Dim DetFact As Recordset  
Set DetFact = CurrentDb.OpenRecordset("Prépa_DetFact")  
Dim Row, x1, x2, x As Long  
Dim Mois, Année As Integer  
Mois = 2  
Année = 2012  
ReDim TabEntrée(DetFact.RecordCount, 3)  
'Chargement de la table Prépa_DetFact  
DetFact.MoveFirst  
x = 1  
For x = 1 To DetFact.RecordCount  
If DetFact("NART") <> "" Then  
    TabEntrée(x, 0) = DetFact("NART")  
    TabEntrée(x, 1) = DetFact("QTE")
    TabEntrée(x, 2) = DetFact("DATFACT")  
End If  
DetFact.MoveNext  
Next x


A partir de là, toute opération est possible. Et contrairement à ce que l'ont pourrait penser, c'est très rapide.
3 500 000 enregistrements chargés en 30 secondes (core i7, 4Go).

@+
Phoe
0