PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → [WIN26]  condition si colonne vide ?
[WIN26] condition si colonne vide ?
Started by frank scaldaferro, May, 06 2021 10:38 AM - 19 replies
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 10:38 AM
Bonjour,

Dans une table : TABLE_Dossier
je colore une ligne si le champ de la ligne COL_D_date_relance est inférieur ou égal à la date jour.
ça fonctionne bien, sauf que si le champ COL_D_date_relance n'est pas rempli, ma ligne se colore.

//colore la couleur sur les lignes selon le contenu
SI delai <= dDate ALORS
//TABLE_Dossier[TABLE_Dossier]..CouleurFond=iVertClair
TABLE_Dossier[TABLE_Dossier]..CouleurFond=RVB(245,166,47)
SINON
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iTransparent
FIN


J'ai tenté un
SINON SI TABLE_Dossier.COL_D_date_relance.Vide = Vrai ALORS// si champ est vide
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iTransparent

Mais évidemment, j'ai une erreur. Car ce n'est pas de cette façon que je dois déclarer ma ligne vide...
Registered member
170 messages
Popularité : +18 (18 votes)
Posted on May, 06 2021 - 11:02 AM
Bonjour,

Je ne voit pas dans ton code de référence à :
- COL_D_date_relance
- la date jour

cependant, et si le code présenté se trouve dans l'évènement "affichage d'une ligne", le code suivant devrait solutionner ton problème :
SI delai <= dDate ET val(COL_D_date_relance) <> 0 ALORS
...


--
Hth,
Padbrain
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 11:20 AM
Autant pour moi,

// Récupère la date système
dDate est une Date = DateDuJour()
delai est une Date = COL_D_date_relance
Registered member
113 messages
Popularité : +8 (8 votes)
Posted on May, 06 2021 - 11:22 AM
Bonjour,

Avec la fonction DateValide ?
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 11:46 AM
Merci ER, je vais voir pour utiliser cette fonction.
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 11:50 AM
J'ai tenté :
// Récupère la date système
dDate est une Date = DateDuJour()
delai est une Date = COL_D_date_relance
//colore la couleur sur les lignes selon le contenu
SI delai <= dDate ALORS // si la date delai est inférieur à la date du jour
//TABLE_Dossier[TABLE_Dossier]..CouleurFond=iVertClair
TABLE_Dossier[TABLE_Dossier]..CouleurFond=RVB(245,166,47)
SINON SI DateValide(delai) = Faux ALORS// si champ est vide
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iRougeClair
SINON // ne colore rien
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iTransparent
FIN


Et j'ai toujours les lignes sans contenu dans la colonne délai en orange.
C'est une bonne piste le DateValide, je dois mal l'utiliser.
Registered member
170 messages
Popularité : +18 (18 votes)
Posted on May, 06 2021 - 12:20 PM
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iTransparent

SI delai <= dDate ALORS // si la date delai est inférieur à la date du jour
TABLE_Dossier[TABLE_Dossier]..CouleurFond=RVB(245,166,47)
FIN

SI val(delai) = 0 ALORS// si champ est vide
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iRougeClair
FIN


PS : Le mot délai a une connotation de durée et ne représente pas une date => il s'agit d'une mauvaise pratique dans le nommage de tes variables. Autant nommer cette variable date_de_relance puisque c'est ce qu'elle représente.

De même pour dDate. Est-ce que ce nom représente la date du jour. Il serait plus facile de lire ton code si cette variable était nommée : date_du_jour.

--
Hth,
Padbrain
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 12:31 PM
Merci Padbrain pour ton retour.
Effectivement, ma façon de nommer mes variables ne m'aident pas à comprendre, je vais de ce pas les modifier.

Je viens de lire ta ligne de code, et je déçu de ne pas avoir compris tout de suite ce que je devais faire. Merci beaucoup.
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 12:34 PM
Si tu as 2mn et m'expliquer pourquoi je ne peux pas utiliser un SINON et que je dois créer 2 conditions séparés.
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 06 2021 - 12:39 PM
Effectivement c'est carrément plus lisible. Merci.
// Récupère la date système
date_du_jour est une Date = DateDuJour()
date_de_relance est une Date = COL_D_date_relance
//colore la couleur sur les lignes selon le contenu
SI date_de_relance <= date_du_jour ALORS // si la date delai est inférieur à la date du jour
TABLE_Dossier[TABLE_Dossier]..CouleurFond=RVB(245,166,47)
FIN
SI Val(date_de_relance) = 0 ALORS// si champ est vide
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iTransparent

FIN
Registered member
3,889 messages
Popularité : +227 (347 votes)
Posted on May, 06 2021 - 2:18 PM
Bonjour,
frank scaldaferro a écrit :
> Si tu as 2mn et m'expliquer pourquoi je ne peux pas utiliser un SINON et que je dois créer 2 conditions séparés.
Simplement perce qu'une date vide est inférieure à toute date valide

Par ailleurs, lorsque tu déclare un champ Date, Il s'initialise toujours avec la date par défaut. Si tu n'as pas modifié cette prorpiété via DetaHeureParDéfaut dans la zone de visibilité de ta variable, c'est la date du jour.

--
Il y a peut être plus simple, mais, ça tourne
Registered member
170 messages
Popularité : +18 (18 votes)
Posted on May, 06 2021 - 3:29 PM
Voroltinquo t'as répondu. Pour compléter sa réponse, avec le sinon, imagine que la date de relance soit à "00000000", voici ce qui se passe :

SI date_de_relance <= date_du_jour ALORS
// ceci est vrai et est exécuté
SINON SI Val(date_de_relance) = 0 ALORS
// ceci est tout aussi vrai mais ne sera pas exécuté puisque tu as déjà souscris à la première condition
SINON
....
FIN


De même, dans les deux conditions séparées, tu dois gérer toi même l'ordre des conditions séquentiellement.
En fonction de la couleur la plus importante pour ton métier, sur les deux conditions qui seront vraies, celle qui sera jouée en dernier restera.

--
Hth,
Padbrain
Registered member
3,889 messages
Popularité : +227 (347 votes)
Posted on May, 06 2021 - 4:29 PM
Si tu veux utiliser un SI ALORS SINON, il faut combiner des conditions dans ton SI
SI (DateRelance<=DateJour()) ET (Val(DateRelance)<>0) ALORS //La date n'est pas nulle et est antérieure à Aujourd'hui
//ORANGE
SINON
SELON Val(DateRelance)
CAS 0: //La date est nulle
//Transparent
AUTRE CAS : //La date n'est pas nulle et la condition est fausse donc DateRelance> aujourd'hui (enfin un bon payeur :) )
//Vert
FIN
.FIN


--
Il y a peut être plus simple, mais, ça tourne
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 11 2021 - 10:02 AM
Bonjour, merci à tout les 2 d'avoir répondu en détail à ma/mes question(s).
Je vais prendre le temps de bien analyser vos réponses. Je reviendrais surement sur ce sujet.
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 17 2021 - 5:59 PM
Bonjour, je reviens vers vous toujours dans la même idée. Et plus ça va, moins je comprends.

Je fais un essai sur la même table :

sRelance_faite est une chaîne = COL_D_relance_faite

// test si champ vide alors on met en vert : OK
SI sRelance_faite ="" ALORS// si champ est vide
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iVertClair
FIN


ça fonctionne à merveille.

Mais si j'écris cela, ça ne fonctionne pas. Que ma colonne COL_D_relance_faite soit vide ou rempli d'un oui, cela ne change rien...

// Récupère la date système
dAte_du_jour est une Date = DateDuJour()
date_de_relance est une Date = COL_D_date_relance
sRelance_faite est une chaîne = COL_D_relance_faite
//colore la couleur sur les lignes selon le contenu
SI date_de_relance <= dAte_du_jour ET sRelance_faite = "" ALORS // si la date delai est inférieur à la date du jour et que la case relance est vide alors
TABLE_Dossier[TABLE_Dossier]..CouleurFond=RVB(245,166,47)
FIN

// test si champ vide alors on met en vert : OK
//SI sRelance_faite ="" ALORS// si champ est vide
// TABLE_Dossier[TABLE_Dossier]..CouleurFond=iVertClair
// FIN
//
SI Val(date_de_relance) = 0 ALORS// si champ est vide
TABLE_Dossier[TABLE_Dossier]..CouleurFond=iTransparent

FIN
Registered member
170 messages
Popularité : +18 (18 votes)
Posted on May, 17 2021 - 9:08 PM
Bonsoir,
frank scaldaferro a écrit :
...

// Récupère la date système
dAte_du_jour est une Date = DateDuJour()
...

Met un point d'arrêt sur cette instruction puis exécute ensuite pas à pas. lorsque tu arriveras devant la première instruction SI, vérifie les valeurs de tes variables dans le débogueur et tu sauras pourquoi tu ne rentres pas dans le SI...

--
Hth,
Padbrain
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 18 2021 - 9:04 AM
Merci Padbrain. Je vais ce de pas regarder de plus près avec le débogueur.
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 18 2021 - 9:21 AM
Si dans la première ligne dans la COL_D_relance_faite je met le mot TEST.
Quand je lance le debugogueur j'ai sRelance_faite = "TEST"
idem si je met
sRelance_faite = Null.


J'en conclu que je ne lui dit pas ce que j'attends, à savoir que je veux vérifier que cette variable est vide.
Direction les tutos
Registered member
80 messages
Popularité : +2 (2 votes)
Posted on May, 18 2021 - 12:39 PM
Bon, cette fois çà fonctionne, c'est juste le rafraichissement de la table pour les couleurs qui n'est plus instantané.

// Récupère la date système
dAte_du_jour est une Date = DateDuJour()
date_de_relance est une Date = COL_D_date_relance
//sRelance_faite est une chaîne = COL_D_relance_faite
//j'échappe les espaces
sRelance_faite est une chaîne = SansEspace(COL_D_relance_faite)


//colore la couleur sur les lignes selon le contenu Si date de relance <= à la date du jour et relancefaite est vide
SI date_de_relance <= dAte_du_jour ET sRelance_faite = "" ALORS // si la date delai est inférieur à la date du jour et que la case relance est vide alors //ET Val(sRelance_faite) = 0
TABLE_Dossier[TABLE_Dossier]..CouleurFond=RVB(245,166,47)
FIN


Merci Padbrain, cela m'a permis de voir de plus près le débogueur.
Registered member
170 messages
Popularité : +18 (18 votes)
Posted on May, 18 2021 - 2:17 PM
;)

--
Hth,
Padbrain