Dictionnaire de données croisées pour requêtage

Bonsoir à tous,

Je vous demande de l'aide. A tout point de vue, stratégie globale, développement et performance temps de réponse.

Mon classeur a 3 tableaux structurés (TS) que je voudrais croiser en une seule bibliothèque de données afin de la requêter. Les TS sont évolutifs. La bibliothèque finale pourrait représenter dans les 100000lignes. Le temps de construction et d'accès devra être de l'ordre de la seconde...

J'ai fait des jolis dessins :

EDIT = la construction d'une bibliothèque de données est FACULTATIVE. Le but est de résoudre les objectifs 1, 2 et 3 (voir dernière image)

3tables resultat requete

Un énorme merci d'avance ....

bonjour tomato,

un fichier est toujours mieux et je ne comprends pas d'où viennent les cellules "coeff" etc.

La première et 2eme ligne du nouveau tableau, pouvez-vous les expliquer ?

Bonjour à tous,

@Bart si j'ai bien compris il s'agit des valeurs du 2e tableau "positions" ou "tbl_coefficients". On part du tableau de droite pour construire le tableau global.

image

Mais il me semble que c'est un problème parfait pour PowerQuery. C'est avec cet outil que vous aurez le meilleur temps de réponse sur de gros volumes. Je vais regarder mais je ne suis pas expert.

Partager votre fichier d'exemple serait d'une grande aide. Merci.

Bonjour à tous ,

Je ne vois pas trop l'intérêt de TbL_assemblage qui introduit une redirection inutile. Il suffit de remplacer les en-têtes de Tbl_coefficients par assA assB, assC, ..., pour avoir tout ce dont on a besoin. Le premier TS ne contient pas d'information pertinente par rapport aux deux autres. Du moins me semble-t-il ? Mais on pourra faire avec .

Et on n'a toujours pas de classeur représentatif .

Bonsoir la team,

Merci de l'intérêt que vous portez à mon topic : voici un fichier en PJ. Je vous tire mon chapeau d'avoir le courage d'entrer dans des sujets parfois complexes comme j'imagine celui-ci...

Vous comprendrez peut être davantage l'idée à l'aide de l'illustration suivante (j'ai pris pour base le sublime planning perpétuel 2018 de LouReed).

Objectif : Ce qui est pour moi le premier pas est de déterminer la "qte besoin" par composant pour chaque date (semaine cible). Ainsi que la quantité de besoin total cumulé pour un composant entre deux dates.

Stratégie : Je ne sais pas s'il est globalement plus utile et performant de constituer une bibliothèque de données récapitulative ou plutôt de développer une fonction de requêtage directement à partir des arguments suivants :

<composant> ; <date de début de période> ; optional <date de fin de période>

... en se servant des TS passés dans des dictionnaires (pour la rapidité d'accès à l'info) ...

explik
14tomato.zip (327.47 Ko)

Rebonsoir, et pour répondre à vos questions :

MaFraise, effectivement il n'y a, dans mon exemple préliminaire, pas d'intérêt de repérer assA, assB, ... par un index 1, 2, ... (vous comprenez avec mon fichier pourquoi j'agis alors de la sorte)

Saboh, j'ai pensé à query mais je ne suis pas familier avec (même si j'aime le SQL ^^). Ca me semble très intéressant mais mon niveau quasi null en query m'interdit d'explorer cette piste dans un contexte de calendrier dynamique tel qu'ici...

Bart, les qte coeff sont issues du second TS Tbl_coefficient. L'union des 3 TS permet de construire le 4eme final et déterminer par composant et par date, quelle sera la quantité totale (qte assemblage X qte coeff du composant)

Bonsoir ,

Avec le classeur ça ne devient pas plus clair. Quand on n'est pas de la partie, ça semble assez confus.

Je n'ai considéré que la feuille nommée "Feuil1" (méthode via VBA) :

  • activer la feuille Feuil1
  • cliquez sur le bouton Hop !
16tomato-pivot-v1a.xlsm (157.97 Ko)

Le code se trouve dans le module "module1". Il est un peu commenté. La dernière partie qui est la plus longue n'est là que pour le formatage.

Le résultat est dans un tableau structuré nommé "Tbl_BdD". Avec ce type de tableau, les requêtes seront effectivement simplifiées. Souvent un Somme.Si.Ens() devrait suffire.

...

Héhéhé j'adore

La première étape est superbement accomplie, merci maFraise. En + c'est trèèès commenter, j'ai pu tout bien suivre

Je vais vite fais adapter tout ça à mon cas et tester le temps de construction de la tRes sur un grand volume de données.

Pour le reste de ma problématique j'ai a peu prêt l'idée de comment faire mais ca m'étonnnerait pas que je revienne vers vous, donc je ne mets pas encore résolu hihihi

Bon... j'ose te poser la question puisque tu as été d'un grand secours et que ca se fait sûrement en modifiant quelque peu ton code actuel. Voila mon but ultime c'est de sortir ceci à partir d'une liste de dates (j'ai mis Tbl_date pour la blague) : ce qui est épineux c'est le cumul des quantités des dates hors champs, j'ai noté "avant/après".

jose

Pour les curieux, un pas supplémentaire grâce à l'aide de maFraise.

Le projet n'est pas encore clos puisque si les besoins de composant sont enfin lisibles par date, je vais maintenant devoir intégrer les ressources disponibles en stock et cumuler ces résultats entre Semaine S, S+1, S+2 etc..

13tomato.zip (330.69 Ko)

Finalement

Option Explicit
Sub Calculation()
'//// Version : 250306
'/// Objectif : Calcul des points d'arrêt
Call AppIn
Dim ansmnStk&, ansmn_starter&, ansmn_laster&
Dim cle$, ass$, jour As Date, smn%, an%, dat&, qte%, bes#, ind%, stk#
Dim i&, j&, k%, n%
Dim Rng, dComp As Object, dDate As Object, indAss As Object

    '*** Initialisation variables
    Call Planif_init
    Call BdDAss_init
    ansmnStk = 202412
    ansmn_starter = Year([starter_day]) & Right("0" & WorksheetFunction.WeekNum([starter_day], vbMonday), 2)
    ansmn_laster = Year([laster_day]) & Right("0" & WorksheetFunction.WeekNum([laster_day], vbMonday), 2)

    '*** dictionnaire indexé des composants actifs
    Set dComp = CreateObject("Scripting.Dictionary")
    With TblComp
        If .ListRows.Count = 0 Then Exit Sub
        Rng = .DataBodyRange.Value
        For i = LBound(Rng) To UBound(Rng)
            cle = Rng(i, ColTBC_comp)
            dComp.Add i, cle
        Next i
    End With

    '*** dictionnaire indexé de la chronologie
    Set dDate = CreateObject("Scripting.Dictionary")
    With [Planif_cal]
        Rng = .Rows(1).Value
        dDate.Add "avant", 1
        dDate.Add "après", UBound(Rng, 2)
        For i = LBound(Rng, 2) + 1 To UBound(Rng, 2) - 1
            jour = [starter_day] + 7 * (i - 2)
            smn = WorksheetFunction.WeekNum(jour, vbMonday)
            an = Year(jour)
            cle = an & Right("0" & smn, 2)
            dDate.Add cle, i
        Next i
    End With

    '*** dictionnaire des index d'assemblage
    Set indAss = CreateObject("Scripting.Dictionary")
    With TblAss
        Rng = .DataBodyRange.Value
        For i = LBound(Rng) To UBound(Rng)
            If .DataBodyRange(i, ColTBA_act).Value = "OUI" _
            And .DataBodyRange(i, ColTBA_ass).Value <> "" Then
                cle = Rng(i, ColTBA_ass)
                If Not indAss.exists(cle) Then
                    indAss.Add cle, i
                End If
            End If
        Next i
    End With

    '**************************
    Dim tBes: ReDim tBes(1 To dComp.Count, 1 To dDate.Count)
    With BdDAss
        For i = 1 To .ListRows.Count
            ass = .DataBodyRange(i, ColBDA_ass).Value
            qte = .DataBodyRange(i, ColBDA_qte).Value
            smn = .DataBodyRange(i, ColBDA_smn).Value
            an = .DataBodyRange(i, ColBDA_an).Value
            dat = an & Right("0" & smn, 2)
            If dat >= ansmnStk Then
                If indAss.exists(ass) Then
                    ind = ColTBC_A1 - 1 + indAss(ass)
                    With TblComp
                        For j = 1 To .ListRows.Count
                            If .DataBodyRange(j, ind) <> "" Then
                                bes = -qte * .DataBodyRange(j, ind)
                                If dat < ansmn_starter Then
                                    k = dDate("avant")
                                ElseIf dat > ansmn_laster Then
                                    k = dDate("après")
                                Else
                                    k = dDate(CStr(dat))
                                End If
                                If k > 0 Then tBes(j, k) = tBes(j, k) + bes
'                                cle = dComp(j) & "|" & dDate.Item(dat)
'                                conso.Add cle, conso(cle) + bes
                            End If
                        Next j
                    End With
                End If
            End If
        Next i
    End With

    '*** Intégration du stock disponible et cumul
    For i = 1 To UBound(tBes)
        stk = TblComp.DataBodyRange(i, ColTBC_stk)
        n = 0
        For j = LBound(tBes, 2) To UBound(tBes, 2)
            If tBes(i, j) <> "" Then
                If n = 0 Then
                    tBes(i, j) = tBes(i, j) + stk
                    n = n + 1
                Else
                    tBes(i, j) = tBes(i, j) + qte
                End If
                qte = tBes(i, j)
            End If
        Next j
    Next i

    [Planif_cal] = tBes

FIN:
Set Rng = Nothing: Set dComp = Nothing: Set dDate = Nothing: Set indAss = Nothing
Call AppOut
End Sub

Bonne nuit

Rechercher des sujets similaires à "dictionnaire donnees croisees requetage"