Qlik: la sync 12 mois passe — sonde fournisseur bornee, commentaires rectifies

Premier run reussi : 12 mois couverts, 40 411 produits ecrits dans le
cache, statut final=success.

Ce que la sonde paginee montre enfin :

    Periode « (aucune) » → master exposee : 2024-01…2026-07 (31 mois)

Sans aucune Periode selectionnee, « Quantite N » couvre 31 mois, et une
seule passe (Annee=2026) sert les 12 mois de la fenetre. L'etat libre
etait donc le bon depuis le debut ; ce sont deux defauts de l'outil de
MESURE qui le cachaient — la sonde tronquee a 60 lignes, puis le Clear
appele sur le list object. Le commentaire de choisirPeriode affirmait
l'inverse (« sans Periode la master est morte ») : il est rectifie, avec
la mesure a l'appui.

Sonde fournisseur : elle lisait 1 207 205 codes en 240 pages avant de
conclure, trois fois de suite — 87 s pour un rejet joue d'avance. La
lecture s'arrete desormais des le plafond depasse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DfqUihgixw4K1AmJhizWiu
This commit is contained in:
Claude committed 2026-08-01 07:24:56 +00:00
1 parent fee267004f
commit b6225f1920
1 file changed
+31 -17
+31 -17
View File
@@ -850,6 +850,12 @@ export async function fetchNetworkMetricsPlaywright(
const selectionnerParFournisseur = async (): Promise<boolean> => {
if (!fournisseurCode || codes.length === 0) return false;
const attendus = new Set(codes.map((c) => c.trim()));
/**
* Au-delà de ce nombre de codes visibles, la sélection fournisseur
* ne restreint rien (elle laisse tout le catalogue) : inutile de
* finir la lecture, la réponse est déjà connue.
*/
const plafond = attendus.size * 3;
/** Codes articles visibles sous la sélection courante. */
const lireCodesVisibles = async (): Promise<Set<string>> => {
@@ -882,6 +888,11 @@ export async function fetchNetworkMetricsPlaywright(
const c = String(r[0]?.qText ?? "").trim();
if (c && c !== "-") vus.add(c);
}
// Inutile de lire tout le catalogue pour conclure : au-delà
// du plafond, la sélection ne restreint manifestement rien.
// Mesuré : 1 207 205 codes lus en 240 pages, ×3 champs =
// 87 s perdues avant un rejet joué d'avance.
if (vus.size > plafond) break;
}
return vus;
} finally {
@@ -918,9 +929,9 @@ export async function fetchNetworkMetricsPlaywright(
// 1 207 205 articles visibles, soit tout le catalogue — la
// sélection n'avait rien restreint, et la « couverture » de 97 %
// ne faisait que constater que le catalogue contient nos codes.
if (visibles.size > attendus.size * 3) {
if (visibles.size > plafond) {
diag(
" champ « " + champ + " » = « " + fournisseurCode + " » → " + visibles.size +
" champ « " + champ + " » = « " + fournisseurCode + " » → plus de " + plafond +
" articles visibles pour " + attendus.size + " demandés : la sélection ne restreint rien, ignorée",
);
await rpc("Clear", {}, h);
@@ -980,23 +991,26 @@ export async function fetchNetworkMetricsPlaywright(
/**
* Choisit la valeur de `Période` sous laquelle l'extraction aura lieu.
*
* ⚠️ Correction majeure. La version précédente mesurait la couverture
* d'une `Période` **sans sélection d'année**, puis effaçait `Période`
* si aucune valeur ne couvrait les 12 mois. Or :
* CE QUE DIT LA MESURE (production, 2026-08-01, sonde paginée) :
*
* - sans `Période`, `Type_Cal` ne résout rien : « Quantité N » est
* morte partout (mesuré : couverture 0/12). Les passes annuelles
* renvoyaient bien 270 056 lignes, mais **toutes mesures nulles** —
* d'où « 0 point mensuel ajouté » et le refus final ;
* - « Année à date » ne vaut « janvier → aujourd'hui » que pour
* l'année EN COURS. Avec `Année=2025` sélectionnée, la même valeur
* donne l'année 2025 COMPLÈTE — c'est exactement ce que montre
* l'app : « Période d'analyse : Du 02/01/2025 au 31/12/2025 ».
* Période « (aucune) » → master exposée : 2024-01…2026-07 (31 mois)
*
* La couverture d'une `Période` ne veut donc rien dire hors du contexte
* d'année dans lequel elle sera utilisée. On la mesure désormais comme
* l'**union des passes annuelles** — 2025 puis 2026 — c'est-à-dire
* exactement ce que fera `monthDimPath`.
* Sans aucune `Période` sélectionnée, « Quantité N » couvre **31 mois**,
* et une seule passe (`Année=2026`) sert les 12 mois de la fenêtre.
* L'état libre est donc le bon — encore fallait-il pouvoir le voir.
*
* Deux erreurs successives l'avaient masqué, toutes deux dans l'outil
* de mesure et non dans le modèle Qlik :
* 1. la sonde ne lisait que les 60 premières lignes du cube `[Mois]`,
* donc jamais les mois récents → « 0/12 » pour toute valeur ;
* 2. `Clear` était appelée sur le list object au lieu du champ, ce qui
* faisait avorter la cartographie entière avant son premier essai.
*
* D'où le principe retenu ici : **ne rien présumer, tout mesurer**. La
* couverture est évaluée par année et dans le contexte exact où elle
* sera exploitée (`monthDimPath` pose la même valeur), l'état sans
* `Période` étant un candidat comme un autre — et, en l'occurrence, le
* gagnant.
*/
const choisirPeriode = async (annees: number[]): Promise<number> => {
const fenetre = new Set(monthlyPayload.map((m) => m.label));