oguruma
XLDnaute Impliqué
Bonjour,
Toujours suite à un projet récent concernant une certification d'applications, pour l'exemple du post on suppose que l'on reçoive un fichier texte csv comportant des résultats de traitements comme suit
DOMAINE;APPLI;CERTIF_1;CERTIF_2;CERTIF_3;OK
Domaine_1;Appli_1_1;16;21;25;57
Domaine_1;Appli_1_2;20;29;21;56
Domaine_1;Appli_1_3;16;20;20;49
Domaine_1;Appli_1_4;21;30;16;54
Domaine_1;Appli_1_5;22;17;15;45
Domaine_1;Appli_1_6;16;17;29;56
Domaine_1;Appli_1_7;29;18;17;59
Domaine_1;Appli_1_8;27;20;18;57
Domaine_1;Appli_1_9;22;29;27;64
Domaine_1;Appli_1_10;19;25;24;57
Domaine_2;Appli_2_1;17;21;29;66
Domaine_2;Appli_2_2;15;26;15;48
Domaine_2;Appli_2_3;25;23;17;51
Domaine_2;Appli_2_4;16;15;23;41
Domaine_2;Appli_2_5;27;28;16;64
Domaine_2;Appli_2_6;25;24;20;64
Domaine_2;Appli_2_7;26;27;22;66
Domaine_2;Appli_2_8;25;21;26;69
Domaine_2;Appli_2_9;19;25;20;54
Domaine_3;Appli_3_1;26;18;22;63
Domaine_3;Appli_3_2;17;26;15;48
Nous avons :
une colonne domaine
une colonne applications du domaine
une colonne nbr de traitements par phase de certification
une colonne nbr de traitement ok pour toute la période de certification
C'est juste un scénario simplifié permettant de mettre en oeuvre les calculs multiples pendant l'ajout d'une colonne.
Cible : à l'issue de l'importation du fichiers données on souhaite obtenir ceci
		
		
	
	
		 
	
Soit pour une application :
- le total des traitements
- en déduire le total des traitements ko
- le % des ok
- le % des ko
Méthode 1
On importe le fichier via powerquery puis on le charge dans une feuille Excel et on effectue les calculs via des formules Excel classique
Avantage : rapide, traitements légers dans powerquery
Inconvénient : les formules sont sous Excel - à voir les performances en cas de forte volumétrie - feuille lourde
Méthode 2
On importe le fichier via powerquery on effectue les calculs dans powerquery en ajoutant les colonnes nécessaires puis on charge la requête dans une feuille Excel
Avantage : la feuille Excel est dépourvue de formules
Inconvénient : un peu plus compliqué en powerquery il faut maîtriser les ajouts de colonnes et les calculs en powerquery - une étape à chaque ajout de colonne ce qui peut ralentir les traitements
Méthode 3
On importe le fichier via powerquery on effectue les calculs dans powerquery en ajoutant les colonnes nécessaires puis on charge la requête dans une feuille Excel MAIS les calculs sont réalisés en une seule étape
Avantage : cas de la solution 2
Inconvénient : un peu plus compliqué en powerquery il faut maîtriser les ajouts de colonnes et les calculs en powerquery - cependant avec l'avantage que les calculs sont réalisés en une seule étape ce qui va améliorer les performances
Environnement PowerQuery
		 
	
Importation du fichier de données
Les données sont enregistrées dans la table TBL_SRC_DATA_Traitements
	
	
	
	
	
		
		 
	
Méthode 1 détaillée
On charge la table via la requête
	
	
	
	
	
		
La table des données une fois chargée on écrits les formules dans Excel
TOTAL=SOMME(QRY_Traitements_V1[@[CERTIF_1]:[CERTIF_3]])
KO=[@TOTAL]-[@OK]
PCT_OK=[@OK]/[@TOTAL]
PCT_KO=[@KO]/[@TOTAL]
ALERTE==SI([@[PCT_KO]]>=0.1;"OUI";"NON")
Méthode 2 détaillée
	
	
	
	
	
		
Jusque-là rien de compliqué. Il suffit d'utiliser les assistants.
Méthode 3 détaillée
	
	
	
	
	
		
La difficulté se trouve ici
	
	
	
	
	
		
Voici les étapes
		 
	
L'étape TBL_AddCalculs va créer en fait un RECORD pour chaque enregistrement.
		 
	
Détail du RECORD
		 
	
Il suffit à l'issue de développer les RECORDs de chaque enregistrement. C'est l'étape TBL_ComputeColumns
Résultat
		 
	
Et il ne reste plus qu'à charge la table dans une feuille de calculs.
MISE EN OEUVRE DES TCD
		 
	
3 méthodes pour y parvenir.
Méthode 1
La cible étant d'obtenir cette présentation
		 
	
	
	
	
	
	
		
Cette solution comporte un inconvénient majeur : List.Sum([TOTAL]) est effectué 3 fois - ce qui peut avoir un impact sur les performances.
Notez au passage la manière de provoquer un CR/LF (Windows) "#(cr)#(lf)". Attention pour cela il faut activer cette option sous Excel :
		 
	
Méthode 2
A travers cette méthode on va utiliser l'astuce des calculs multiples dans une colonne.
	
	
	
	
	
		
Les calculs multiples sont ici
	
	
	
	
	
		
On réutilise [Total OK] calculé à l'étape précédente !
Et enfin si on souhaite avoir une synthèse par domaine
		 
	
	
	
	
	
	
		
Pour conclure, à vous selon cet exemple d'adapter vos requêtes PWQ pour obtenir ces résultats.
	
		
			
		
		
	
				
			Toujours suite à un projet récent concernant une certification d'applications, pour l'exemple du post on suppose que l'on reçoive un fichier texte csv comportant des résultats de traitements comme suit
DOMAINE;APPLI;CERTIF_1;CERTIF_2;CERTIF_3;OK
Domaine_1;Appli_1_1;16;21;25;57
Domaine_1;Appli_1_2;20;29;21;56
Domaine_1;Appli_1_3;16;20;20;49
Domaine_1;Appli_1_4;21;30;16;54
Domaine_1;Appli_1_5;22;17;15;45
Domaine_1;Appli_1_6;16;17;29;56
Domaine_1;Appli_1_7;29;18;17;59
Domaine_1;Appli_1_8;27;20;18;57
Domaine_1;Appli_1_9;22;29;27;64
Domaine_1;Appli_1_10;19;25;24;57
Domaine_2;Appli_2_1;17;21;29;66
Domaine_2;Appli_2_2;15;26;15;48
Domaine_2;Appli_2_3;25;23;17;51
Domaine_2;Appli_2_4;16;15;23;41
Domaine_2;Appli_2_5;27;28;16;64
Domaine_2;Appli_2_6;25;24;20;64
Domaine_2;Appli_2_7;26;27;22;66
Domaine_2;Appli_2_8;25;21;26;69
Domaine_2;Appli_2_9;19;25;20;54
Domaine_3;Appli_3_1;26;18;22;63
Domaine_3;Appli_3_2;17;26;15;48
Nous avons :
une colonne domaine
une colonne applications du domaine
une colonne nbr de traitements par phase de certification
une colonne nbr de traitement ok pour toute la période de certification
C'est juste un scénario simplifié permettant de mettre en oeuvre les calculs multiples pendant l'ajout d'une colonne.
Cible : à l'issue de l'importation du fichiers données on souhaite obtenir ceci
Soit pour une application :
- le total des traitements
- en déduire le total des traitements ko
- le % des ok
- le % des ko
Méthode 1
On importe le fichier via powerquery puis on le charge dans une feuille Excel et on effectue les calculs via des formules Excel classique
Avantage : rapide, traitements légers dans powerquery
Inconvénient : les formules sont sous Excel - à voir les performances en cas de forte volumétrie - feuille lourde
Méthode 2
On importe le fichier via powerquery on effectue les calculs dans powerquery en ajoutant les colonnes nécessaires puis on charge la requête dans une feuille Excel
Avantage : la feuille Excel est dépourvue de formules
Inconvénient : un peu plus compliqué en powerquery il faut maîtriser les ajouts de colonnes et les calculs en powerquery - une étape à chaque ajout de colonne ce qui peut ralentir les traitements
Méthode 3
On importe le fichier via powerquery on effectue les calculs dans powerquery en ajoutant les colonnes nécessaires puis on charge la requête dans une feuille Excel MAIS les calculs sont réalisés en une seule étape
Avantage : cas de la solution 2
Inconvénient : un peu plus compliqué en powerquery il faut maîtriser les ajouts de colonnes et les calculs en powerquery - cependant avec l'avantage que les calculs sont réalisés en une seule étape ce qui va améliorer les performances
Environnement PowerQuery
Importation du fichier de données
Les données sont enregistrées dans la table TBL_SRC_DATA_Traitements
		PowerQuery:
	
	
	let
    Source = Csv.Document(File.Contents(PRM_STR_FichierTxt),[Delimiter=";", Columns=6, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    TBL_Promote = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    TBL_ModifTypeEntier = Table.TransformColumnTypes(TBL_Promote,{{"CERTIF_1", Int64.Type}, {"CERTIF_2", Int64.Type}, {"CERTIF_3", Int64.Type}, {"OK", Int64.Type}})
in
    TBL_ModifTypeEntierMéthode 1 détaillée
On charge la table via la requête
		PowerQuery:
	
	
	let
    Source = TBL_SRC_DATA_Traitements
in
    SourceLa table des données une fois chargée on écrits les formules dans Excel
TOTAL=SOMME(QRY_Traitements_V1[@[CERTIF_1]:[CERTIF_3]])
KO=[@TOTAL]-[@OK]
PCT_OK=[@OK]/[@TOTAL]
PCT_KO=[@KO]/[@TOTAL]
ALERTE==SI([@[PCT_KO]]>=0.1;"OUI";"NON")
Méthode 2 détaillée
		PowerQuery:
	
	
	let
    Source = TBL_SRC_DATA_Traitements,
    TBl_AddColumnTotal = Table.AddColumn(Source, "TOTAL", each [CERTIF_1] + [CERTIF_2] + [CERTIF_3]),
    TBl_AddColumnKO = Table.AddColumn(TBl_AddColumnTotal, "KO", each [TOTAL] - [OK]),
    TBl_AddColumnPCTOK = Table.AddColumn(TBl_AddColumnKO, "PCT_OK", each [OK]/[TOTAL]),
    TBl_AddColumnPCTKO = Table.AddColumn(TBl_AddColumnPCTOK, "PCT_KO", each [KO]/[TOTAL]),
    TBl_AddColumnAlerte = Table.AddColumn(TBl_AddColumnPCTKO, "ALERTE", each if [PCT_KO] >= 0.1 then "OUI" else "NON"),
    TBL_ReorderColumns = Table.ReorderColumns(TBl_AddColumnAlerte,{"DOMAINE", "APPLI", "CERTIF_1", "CERTIF_2", "CERTIF_3", "TOTAL", "OK", "KO", "PCT_OK", "PCT_KO", "ALERTE"})
in
    TBL_ReorderColumnsJusque-là rien de compliqué. Il suffit d'utiliser les assistants.
Méthode 3 détaillée
		PowerQuery:
	
	
	let
    Source = TBL_SRC_DATA_Traitements,
    TBL_AddCalculs=Table.AddColumn(Source, "ComputeColumns",
                        each [
                                TOTAL=[CERTIF_1] + [CERTIF_2] + [CERTIF_3],
                                KO= TOTAL - [OK],
                                PCT_OK=[OK]/TOTAL,
                                PCT_KO=KO/TOTAL,
                                ALERTE=if PCT_KO>=0.1 then "OUI" else "NON"
                        ]
                    ),
    TBL_ComputeColumns = Table.ExpandRecordColumn(TBL_AddCalculs, "ComputeColumns", {"TOTAL", "KO", "PCT_OK", "PCT_KO", "ALERTE"}, {"TOTAL", "KO", "PCT_OK", "PCT_KO", "ALERTE"}),
    TBL_ReorderColumns = Table.ReorderColumns(TBL_ComputeColumns,{"DOMAINE", "APPLI", "CERTIF_1", "CERTIF_2", "CERTIF_3", "TOTAL", "OK", "KO", "PCT_OK", "PCT_KO", "ALERTE"})
in
    TBL_ReorderColumnsLa difficulté se trouve ici
		PowerQuery:
	
	
	each [
                                TOTAL=[CERTIF_1] + [CERTIF_2] + [CERTIF_3],
                                KO= TOTAL - [OK],
                                PCT_OK=[OK]/TOTAL,
                                PCT_KO=KO/TOTAL,
                                ALERTE=if PCT_KO>=0.1 then "OUI" else "NON"
                        ]Voici les étapes
L'étape TBL_AddCalculs va créer en fait un RECORD pour chaque enregistrement.
Détail du RECORD
Il suffit à l'issue de développer les RECORDs de chaque enregistrement. C'est l'étape TBL_ComputeColumns
Résultat
Et il ne reste plus qu'à charge la table dans une feuille de calculs.
MISE EN OEUVRE DES TCD
3 méthodes pour y parvenir.
Méthode 1
La cible étant d'obtenir cette présentation
		PowerQuery:
	
	
	let
    Source = QRY_Traitements_V3,
   // #"Lignes groupées" = Table.Group(Source, {"DOMAINE"}, {{"Nombre", each Table.RowCount(_), Int64.Type}}),
    TBL_TCCD=Table.Group(Source,{"DOMAINE"},
                {
                    {"Total traitements", each List.Sum([TOTAL]), type nullable number},
                    {"Total OK", each List.Sum([OK]), type nullable number},
                    {"Total KO", each List.Sum([KO]), type nullable number},
                    {"Pct OK", each List.Sum([OK])/List.Sum([TOTAL]), type nullable number},
                    {"Pct KO", each List.Sum([KO])/List.Sum([TOTAL]), type nullable number},
                    {"Applications", each Text.Combine(List.Distinct([APPLI]), "#(cr)#(lf)")}
                }
 
    ),
    TBL_AddColumnAlerte = Table.AddColumn(TBL_TCCD, "Alerte", each if [Pct KO] >= 0.1 then "OUI" else "NON")
in
    TBL_AddColumnAlerteCette solution comporte un inconvénient majeur : List.Sum([TOTAL]) est effectué 3 fois - ce qui peut avoir un impact sur les performances.
Notez au passage la manière de provoquer un CR/LF (Windows) "#(cr)#(lf)". Attention pour cela il faut activer cette option sous Excel :
Méthode 2
A travers cette méthode on va utiliser l'astuce des calculs multiples dans une colonne.
		PowerQuery:
	
	
	let
    Source = QRY_Traitements_V3,
    TBL_TCCD=Table.Group(Source,{"DOMAINE"},
            {
                {"Total traitements", each List.Sum([TOTAL]), type nullable number},
                {"Total OK", each List.Sum([OK]), type nullable number},
                {"Total KO", each List.Sum([KO]), type nullable number},
                {"Applications", each Text.Combine(List.Distinct([APPLI]), "#(cr)#(lf)")}
            }
 
    ),
    TBL_AddCalculs=Table.AddColumn(TBL_TCCD, "ComputeColumns",
            each [
                    PCT_OK=[Total OK]/[Total traitements],
                    PCT_KO=[Total KO]/[Total traitements],
                    ALERTE=if PCT_KO>=0.1 then "OUI" else "NON"
            ]
    ),
    TBL_ExpandRecord = Table.ExpandRecordColumn(TBL_AddCalculs, "ComputeColumns", {"PCT_OK", "PCT_KO", "ALERTE"}, {"PCT_OK", "PCT_KO", "ALERTE"})
in
    TBL_ExpandRecordLes calculs multiples sont ici
		PowerQuery:
	
	
	            each [
                    PCT_OK=[Total OK]/[Total traitements],
                    PCT_KO=[Total KO]/[Total traitements],
                    ALERTE=if PCT_KO>=0.1 then "OUI" else "NON"
            ]On réutilise [Total OK] calculé à l'étape précédente !
Et enfin si on souhaite avoir une synthèse par domaine
		PowerQuery:
	
	
	let
    Source = QRY_Traitements_V3,
    TBL_TCCD=Table.Group(Source,{"DOMAINE"},
            {
                {"Total traitements", each List.Sum([TOTAL]), type nullable number},
                {"Total OK", each List.Sum([OK]), type nullable number},
                {"Total KO", each List.Sum([KO]), type nullable number}
            }
 
    ),
    TBL_AddCalculs=Table.AddColumn(TBL_TCCD, "ComputeColumns",
            each [
                    PCT_OK=[Total OK]/[Total traitements],
                    PCT_KO=[Total KO]/[Total traitements],
                    ALERTE=if PCT_KO>=0.1 then "OUI" else "NON"
            ]
    ),
    TBL_ExpandRecord = Table.ExpandRecordColumn(TBL_AddCalculs, "ComputeColumns", {"PCT_OK", "PCT_KO", "ALERTE"}, {"PCT_OK", "PCT_KO", "ALERTE"})
in
    TBL_ExpandRecordPour conclure, à vous selon cet exemple d'adapter vos requêtes PWQ pour obtenir ces résultats.
Pièces jointes
			
				Dernière édition: 
			
		
	
								
								
									
	
		
			
		
		
	
	
	
		
			
		
		
	
								
							
							 
	 
 
		 
 
		