Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
[PB 10.5] [XP]
Salut a tous.
Est ce que quelqu'un sait comment savoir rapidement si tous les rows d'une colonne d'une dw sont remplis ou si l'un d'eux est à null.
X Y
1 1
1 1
1
1 1
1 1
1 1
1 1
un truc de ce genre
lb_nullX = IsNull(dw_coordonnées.object.x)--------->FALSE
lb_nully = IsNull(dw_coordonnées.object.y)--------->TRUE
Et sans faire de compute comme le propose l'aide PB.
Merci
Hors ligne
Moi je dirai avec un compute dans la DW ? ok je sors! --> []
Hors ligne
pourquoi ne pas mettre une valeur par defaut dans ta requete SQL ?
lorsque ton X ou Y est à nul ?
Hors ligne
Je ne peux pas mettre de DefaultValue car c est un champs qui doit être choisi par l utilisateur pour etre entré en base. En fait, si tout est rempli je peux activer un bouton d enregistrement.
D autres idées?
Sans quoi je ferai un compute (super idée the zerg )
Dernière modification par hellkinder (20-11-2006 09:17:59)
Hors ligne
bah, on appelle ca un controle de validation avant la mise à jour...
il suffit de faire les controles sur chaque colonne...
tu fais une boucle...et un test. si tu rencontres un null, tu quittes la boucle et tu affiches un message d'information obligeant l'utilisateur à saisir sur la ligne detéctée.
si tu n'as que les colonnes X, Y à controler, la solution du compute sum est intéressant.
A+
Hors ligne
J'ai trois colonne a verifier,
ok bon ben je vais faire cette fichu boucle que j'aurais tant aimé éviter. C'est dommage qu'une fontion generique sur une colonne de dw ne soit pas gerer pour savoir si un champs de la colonne est a null. Je pense ecrire à sybase, voire pourter plainte
Merci en tout cas.
Dernière modification par hellkinder (20-11-2006 11:17:43)
Hors ligne
tu peux ecrire toi meme une fonction generique...
genre, tu mets la couleur de fond de la colonne en une autre couleur, pour signifier que cette colonne est obligatoire.
et avec ta fonction, si tu detectes cette couleur de fond, tu parcours la colonne...ect...
on le fait souvent ca...
a++
Hors ligne
Merci pour ces precieux conseils Keep CUI ! Je vais proposer...
Dans tout les cas tu peux mettre le topic a résolu je pense, car il faut faire une boucle ou un compute pour ce probleme. Y'a pas d'autres solutions.
TcHô
Hors ligne
Hello,
Et donc après 2 ans , vous l'avez faites finalement cette fonction générique ?
Je suis nouveau sur pb et je regarde un peu partout , j'ai vraiment du mal avec ce langage :s
J'ai voulu faire , plutôt que de tester 1 à 1 les valeurs de la DW
int li_i boolean lb_filledin lb_filledin=true for li_i = 1 to 6//dw_1.rowcount( ) //if(isnull(dw_1.object.v_machine[1]) or dw_1.object.v_machine[1]="") then if(isnull(dw_1.getItemString(li_i,1)) or dw_1.getItemString(li_i,1)="") then lb_filledin=false end if next if(not lb_filledin) then messagebox("!!!","Veuillez remplir tous les champs") else . . .
Mais bien évidemment... ça ne fonctionne pas
Hors ligne
ça ne fonctionne pas... càd ? message d'erreur ?
pour info getitemstring pour les valeurs chaines uniquement
dans ce cas-là il vaut mieux utiliser la notation pointée pour récupérer une variable Any
Hors ligne
Et bien premièrement , si à la place de "6" , je laisse dw_1.rowcount( ), j'ai 1 comme nombre de row
Ensuite, dw_1.getItemString(1,1) me donne bien ma première valeur mais dw_1.getItemString(2,1) et ceux qui suivent sont nuls !
Hors ligne
micmx a écrit:
Et bien premièrement , si à la place de "6" , je laisse dw_1.rowcount( ), j'ai 1 comme nombre de row
Ensuite, dw_1.getItemString(1,1) me donne bien ma première valeur mais dw_1.getItemString(2,1) et ceux qui suivent sont nuls !
Normal: Si le dw_1.rowcount()e retourne 1, c'est que tu n'as qu'une seule ligne dans ta datawindow
Hors ligne
Apparemment je confond les lignes avec les colonnes , j'ai vraiment du mal..
J'ai du faire comme ci-dessous mais ce n'est pas très professionnel..
int li_i,li_columncount boolean lb_filledin any al_cc lb_filledin=true al_cc = dw_1.object.datawindow.column.count li_columncount=integer(al_cc) for li_i = 1 to li_columncount if(li_i <3) then //if(isnull(dw_1.object.v_machine[1]) or dw_1.object.v_machine[1]="") then if(isnull(dw_1.getItemString(1,li_i)) or dw_1.getItemString(1,li_i)="") then lb_filledin=false end if else if(isnull(dw_1.getItemNumber(1,li_i)) or dw_1.getItemNumber(1,li_i)=0) then lb_filledin=false end if end if next if(not lb_filledin) then messagebox("!!!","Veuillez remplir tous les champs") else . . .
Dernière modification par micmx (19-02-2009 09:12:08)
Hors ligne
Bonjour,
Juste une suggestion, par expérience les utilisateurs font souvent des choses inattendues et contourne les interdits.
Je te conseille de modifier le test pour éviter les champs remplis par des espaces de la façon suivante :
Trim(dw_1.getItemString(1,li_i))=""
Hors ligne
Merci du conseil !
Existe-t-il une fonction plus standard qui irait chercher les données et retournerait un "any" pour ensuite tester cet élément avec un "CHOOSE CASE ClassName(var)" ?
Car ça me semble un peu sale la façon dont j'ai procédé :$
Hors ligne
micmx a écrit:
Existe-t-il une fonction plus standard qui irait chercher les données et retournerait un "any"
erasorz a écrit:
pour info getitemstring pour les valeurs chaines uniquement
dans ce cas-là il vaut mieux utiliser la notation pointée pour récupérer une variable Any
Any la_value la_value = dw_1.Object.Data[no_ligne,no_colonne]
Hors ligne
Ok donc je poste ici le code pour ceux qui à l'avenir chercherons un moyen de vérifier que les données sont biens remplies
int li_i,li_columncount boolean lb_filledin any al_cc Any la_value lb_filledin=true al_cc = dw_1.object.datawindow.column.count li_columncount=integer(al_cc) for li_i = 1 to li_columncount la_value = dw_1.Object.Data[1,li_i] if(isNull(la_value)) then lb_filledin=false else CHOOSE CASE ClassName(la_value) CASE "string" if(Trim(string(la_value))=" ") then lb_filledin=false end if CASE "integer" if(integer(la_value)=0) then lb_filledin=false end if END CHOOSE end if next if(not lb_filledin) then messagebox("!!!","Veuillez remplir tous les champs") else //TRAITEMENT .. ..
Hors ligne
Bonjour,
Dans ton cas une autre solution pourrait être l'utilisation de l'événement ItemChanged, dans la mesure ou tu n'as q'une ligne :
(Tu déclares une variable d'instance de type integer ii_colnull)
IF NOT ISNULL(data) AND trim(data) <> "" THEN ii_colnull += integer(dwo.id) ELSE ii_colnull -= integer(dwo.id) END IF
Lors de la validation :
IF dw_1.AcceptText() < 0 THEN RETURN IF ii_colnum <> 21 THEN messagebox("!!!","Veuillez remplir tous les champs") END IF
L'interêt est que "data" est toujours de type string.
Hors ligne
Je ne comprends pas vraiment la notion de "Rows" en PB
Voici ma DW..
En quoi voit-on qu'elle n'a qu'une ROW ? oO
Hors ligne
Bonjour,
Et bien non, le nombre de lignes est déterminé au moment ou tu récupères les données lorsque tu fait ton "Retrieve".
C'est le nombre de lignes récupérées par le "select" de ta requête SQL.
Dans ce cas, le motif de ton formulaire sera répété à l'affichage autant de fois que le nombre de lignes récupérées avec les différentes données.
Hors ligne
Ok , je comprends .
Merci pour l'info .
Hors ligne