PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 28 → Rupture dans table
Rupture dans table
Débuté par Roland, 28 nov. 2022 06:33 - 10 réponses
Posté le 28 novembre 2022 - 06:33
Bonjour,
j'ai une table avec des ruptures et je souhaiterai compter dans chaque rupture, le nombre de ligne qui on
une cellule vide par ex:

Compter le nombre de "date_ départ" pas saisie pour chaque rupture

compter le nombre total par rupture c 'est bon , mais avec un filtre de sélection ??

Par avance merci
Membre enregistré
3 282 messages
Popularité : +227 (347 votes)
Posté le 28 novembre 2022 - 10:03
Bonjour,
Pourquoi ne pas ajouter dans ta requête le compte de ces dates vides pour l'élément de rupture.
Il suffit ensuite d'affecter cette valeur à un libellé situé dans la rupture

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
5 messages
Posté le 28 novembre 2022 - 10:16
bonjour,
merci pour la piste , j avais déjà toutes les données dans table je pensais plus simple
de parcourir les ruptures et compter les valeurs vide ou nulle comme font les calculs automatique
dans les tables mais avec une condition, c est pas possible?

Merci
Membre enregistré
3 282 messages
Popularité : +227 (347 votes)
Posté le 28 novembre 2022 - 11:44
9a doit être possible, mais
1-Ce n'est pas élégant
2-Cela risque d'augmenter énormément ton temps de traitement, surtout si tu as de nombreuses données (ordre n^2)
Pour chaque rupture
VerifierTable
Afficher DateVide
FinPour

n parcours
VérifierTable :
Pour chaque Ligne
SI Ligne est DANS rupture
SI Date vide OU nulle
NbDateVide++
FinSi
FinSi
FIN

n parcours
VérifierTable est exécuté n fois, il y a donc n^2 parcours d'où l'ordre n^2

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
5 messages
Posté le 28 novembre 2022 - 11:53
Merci, bon rien de bien simple apparemment , j ai peur de partir dans une usine a gaz !!

je vais y réfléchir

Cordialement
Membre enregistré
3 282 messages
Popularité : +227 (347 votes)
Posté le 28 novembre 2022 - 13:11
Prenons le cas suivant :




On veut afficher les commandes des clients (rupture sur client.)
Les dates de commandes vide se récupèrent via la requête :
SELECT
Commande.FK_Client AS FK_Client,
--Compte les dates vides ou NULL
COUNT(NVL(Commande.NDX_DateCommande,'')) AS NbDateVide --NVL permet d'affecter une valeur à la colonne si elle est NULL
--Normalement elle est passe-partout. Toutefois, en fonction de la base utilisée, il faudra employer :
--IF NULL, ISNULL ou COALESCE (se reporter à la doc de la base)
FROM
Commande
WHERE
NVL(Commande.NDX_DateCommande,'') = '' --Pas d'espace
GROUP BY
Commande.FK_Client

Il suffit d'ajouter cette sous-requête à la requête principale :
SELECT
Client.AK_NoClient AS NoClient,
Client.NDX_NomClient AS NomClient,
Commande.AK_NoCommande AS NoCommande,
REQ_DateVide.NbDateVide AS NbDateVide
FROM
(
Client
INNER JOIN
Commande
ON Client.PK_Client = Commande.FK_Client
)
LEFT OUTER JOIN
(
SELECT
Commande.FK_Client AS FK_Client,
--Compte les dates vides ou NULL
COUNT(NVL(Commande.NDX_DateCommande,'')) AS NbDateVide --NVL permet d'affecter une valeur à la colonne si elle est NULL
--Normalement elle est passe-partout. Toutefois, en fonction de la base utilisée, il faudra employer :
--IF NULL, ISNULL ou COALESCE (se reporter à la doc de la base)
FROM
Commande
WHERE
NVL(Commande.NDX_DateCommande,'') = '' --Pas d'espace
GROUP BY
Commande.FK_Client
) REQ_DateVide
ON REQ_DateVide.FK_Client = Client.PK_Client
ORDER BY Client.AK_NoClient


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
5 messages
Posté le 28 novembre 2022 - 14:08
merci beaucoup pour la requête sql je vais m y mettre (pas trop le choix on dirait)

j ai contourné comme j ai pu , j ai le nb total de la rupture par un calcul automatique (comptage),

j'ai une colonne caché avec des 1 si date est vide donc avec le total de la colonne et un calcul auto (somme)

le nb a diviser , car en fait c est pour un calcul de % , mais j arrive pas encore a trouvé a quel moment , en fin de rupture

je suppose, je peux faire le calcul avec les libellé dans la rupture qui ont les bonnes valeurs.

j ai essayé de mettre une copie écran mais impossible bug le site veut pas.

Merci
Membre enregistré
3 282 messages
Popularité : +227 (347 votes)
Posté le 28 novembre 2022 - 16:24
Là encore, il faut passer par une sous-requête COUNT
SELECT
Commande.FK_Client AS FK_Client,
COUNT(Commande.NDX_DateCommande) AS NbCommande
FROM
Commande
GROUP BY
Commande.FK_Client

Ce qui donne :
SELECT
Client.PK_Client AS PK_Client,
Client.AK_NoClient AS NoClient,
Client.NDX_NomClient AS NomClient,
Commande.AK_NoCommande AS NoCommande,
Commande.NDX_DateCommande AS DateCommande,
NVL(REQ_DateVide.NbDateVide,0) AS NbDateVide,
REQ_NbCommande.NbCommande AS NbCommande,
NVL((NbDateVide/NbCommande)*100,0) AS PctCommandeVide
FROM
(
(
(
SELECT
Commande.FK_Client AS FK_Client,
COUNT(NVL( Commande.NDX_DateCommande , '') ) AS NbDateVide
FROM
Commande
WHERE
NVL( Commande.NDX_DateCommande , '') = ''
GROUP BY
Commande.FK_Client
) REQ_DateVide
RIGHT OUTER JOIN
Client
ON REQ_DateVide.FK_Client = Client.PK_Client
)
INNER JOIN
Commande
ON Client.PK_Client = Commande.FK_Client
)
INNER JOIN
(
SELECT
Commande.FK_Client AS FK_Client,
COUNT(Commande.NDX_DateCommande) AS NbCommande
FROM
Commande
GROUP BY
Commande.FK_Client
) REQ_NbCommande
ON REQ_NbCommande.FK_Client = Client.PK_Client
ORDER BY
Client.AK_NoClient

En supposant que tu désires afficher cela dans ton bas de rupture (RUPT_NonRenseigné), il suffit d'ajouter un libellé (LIB_NonRenseigné)
Le code d'affichage du bas de rupture devient :
nIndBasRupture est un entier

nIndBasRupture = TableIndiceRupture(RUPT_NonRenseigné)
//COL_NonRenseigné est non visible
TABLE_CommandeClient[nIndBasRupture].LIB_NonRenseigné = ...
ChaîneConstruit("%1 % Non renseigné",NumériqueVersChaîne(COL_NonRenseigné,"4,2f"))


--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 28 novembre 2022 - 16:25
Membre enregistré
5 messages
Posté le 28 novembre 2022 - 16:52
J avais vu se code (de vous apparemment sur un autre forum)


nHaut est un entier
nBas est un entier

nHaut=TableIndiceRupture(RUPT_HautRupture1)
nBas=TableIndiceRupture(RUPT_BasRupture1)
SI nHaut=nBas ALORS
TABLE_Test[nBas].LIB_NbLigne="1 Ligne"
SINON
TABLE_Test[nBas].LIB_NbLigne=ChaîneConstruit("%1 Lignes",nBas-nHaut+1)
FIN


avec les indice de début et de fin de la rupture il n'y a pas moyen de cumuler une colonne ? entre le début et la fin ?
Message modifié, 28 novembre 2022 - 16:53
Membre enregistré
3 282 messages
Popularité : +227 (347 votes)
Posté le 29 novembre 2022 - 08:37
ROLLLY a écrit :
avec les indice de début et de fin de la rupture il n'y a pas moyen de cumuler une colonne ? entre le début et la fin ?

Si, il suffit de parcourir le champ table entre l'indice de haut de rupture et l'indice de bas de rupture lors de l'affichage de la rupture
un truc du style :
nRuptureHaut est un entier
nRuptureBas est un entier
nNbLigne est un entier
nNbVide est un entier
xPctVide est numérique (3,2)

nRuptureHaut= TableIndiceRupture(RUPT_Client) //Haut de rupture
nRuptureBas= TableIndiceRupture(RUPT_NonRenseigné)
nNbLigne= nRuptureBas-nRuptureHaut+1
nNbVide= RechercherDatesVides(nRuptureHaut,nRuptureBas)
xPctVide= nNbVide/nNbLigne*100

TABLE_CommandeClient[nRuptureBas].LIB_NonRenseigné = ChaîneConstruit("%1% Non renseigné",xPctVide)

Avec :
//[ <Résultat> = ] RechercherDatesVides (<nIndHaut> est entier, <nIndBas> est entier)
//
// Paramètres :
// nIndHaut (entier) : Indice du haut de rupture
// nIndBas (entier) : Indice du bas de rupture
// Valeur de retour :
// entier : Nb de ligne dont la date est vide
//
Procedure RechercherDatesVides(LOCAL nIndHaut est entier,LOCAL nIndBas est entier)
nNbVide est un entier
nLigneEnCours est un entier

POUR nLigneEnCours=nIndHaut _À_ nIndBas
SI COL_DateCommande[nLigneEnCours]="" ALORS
nNbVide++
FIN
FIN

RENVOYER nNbVide


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
5 messages
Posté le 29 novembre 2022 - 10:09
Merci beaucoup