Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je viens de trouver un code pour que les valeurs nulles ne s'affichent plus systématiquement au début lors des tris sur les colonnes numériques d'une datawindow ,donc je partage
au lieu de mettre le nom de la colonne et le sens du tri , il suffit d'ajouter un test 'Isnull' sur le contenu de la colonne (suivant le type de colonne).
je n'ai pas testé tous les types car je ne les utilise pas tous dans mes applications ( non testé: real , ulong, time, timestamp )
Voici ce que j'ai écrit pour 'dans un script' , 'dans les pfc' , 'dans l'interface datawindow'
Dans un script :
j'utilise la fonction des pfc of_usesdisplayvalue(ls_NomColonne) que j'ai copiée dans mon object (elle permet de savoir si la colonne affichée vient d'une ddw ou ddlb ou code_table ou pas)
of_usesdisplayvalue(as_column)
string ls_editstyle string ls_codetable // Check parameters. If IsNull(as_column) or Len(Trim(as_column))=0 Then Return False ls_editstyle = Lower(this.Describe (as_column + ".Edit.Style")) ls_codetable = Lower(this.Describe (as_column + "." + ls_editstyle + ".CodeTable")) IF ls_editstyle = 'dddw' or ls_editstyle = 'ddlb' or ls_codetable = 'yes' THEN Return True END IF Return False
dans l'event clicked de la datawindow ( je n'ai mis ici que la partie qui concerne la préparation du tri)
le variable ib_tri_valeur_affichee doit être à true si on veut que le tri soit sur la valeur affichée et non sur la valeur réelle de la colonne
IF ib_tri_valeur_affichee and of_usesdisplayvalue(ls_NomColonne) THEN // je n'ai pas testé le type de donnees du lookupdisplay ( pour moi toujours string ) ls_sortstring = "if ( isnull(LookUpDisplay(" + ls_NomColonne + ")),'',string(LookUpDisplay(" + ls_NomColonne + "))) " + is_sens_tri ELSE // suivant le type de colonne ls_coltype=this.Describe ( ls_NomColonne+ ".ColType" ) if match(ls_coltype,'^char') & then ls_sortstring = "if (isnull("+ls_NomColonne+"),'',string("+ls_NomColonne+"))" + is_sens_tri else if match(ls_coltype,'^decimal') & then ls_sortstring = "if (isnull("+ls_NomColonne+"), 0 ,"+ls_NomColonne+")" + is_sens_tri else choose case ls_coltype case 'int', 'long' ,'number', 'real', 'ulong' ls_sortstring = "if (isnull("+ls_NomColonne+"), 0 ,"+ls_NomColonne+")" + is_sens_tri case 'date' ls_sortstring = "if (isnull("+ls_NomColonne+"), date('01/01/1900') ,"+ls_NomColonne+")" + is_sens_tri case 'datetime' ls_sortstring = "if (isnull("+ls_NomColonne+"), datetime('01/01/1900') ,"+ls_NomColonne+")" + is_sens_tri case 'time' ls_sortstring = "if (isnull("+ls_NomColonne+"), time('00:00') ,"+ls_NomColonne+")" + is_sens_tri case 'timestamp' ls_sortstring = "if (isnull("+ls_NomColonne+"), timestamp('0') ,"+ls_NomColonne+")" + is_sens_tri end choose end if end if END IF this.SetSort( ls_sortstring)
Pour les pfc modifier le script 'pfc_clicked' de 'pfc_n_cst_dwsrv_sort' dans 'pfc_dwsrv.pbl' :
Pensez à faire of_setusedisplay(true) dans le constructor de votre datawindow si vous voulez trier sur les valeurs affichées quand il y a une ddw ou ddlb affectée à la colonne
string ls_coltype // Build the sort string. IF of_GetUseDisplay() And of_UsesDisplayValue(ls_colname) THEN // ajout d un test pour les tri correct sur les colonne null // avant ajout : ls_sortstring = "LookUpDisplay(" + ls_colname + ") " + is_sortorder // je n'ai pas testé le type de donnees du lookupdisplay ( pour moi toujours string ) ls_sortstring = "if ( isnull(LookUpDisplay(" + ls_colname + ")),'',string(LookUpDisplay(" + ls_colname + "))) " + is_sortorder // > cao ELSE // ajout d un test pour les tri correct sur les colonne null // avant ajout : ls_sortstring = is_sortcolumn + is_sortorder // suivant le type de colonne ls_coltype=idw_Requestor.Describe ( is_sortcolumn+ ".ColType" ) if match(ls_coltype,'^char') & then ls_sortstring = "if (isnull("+is_sortcolumn+"),'',string("+is_sortcolumn+"))" + is_sortorder else if match(ls_coltype,'^decimal') & then ls_sortstring = "if (isnull("+is_sortcolumn+"), 0 ,"+is_sortcolumn+")" + is_sortorder else choose case ls_coltype case 'int', 'long' ,'number', 'real', 'ulong' ls_sortstring = "if (isnull("+is_sortcolumn+"), 0 ,"+is_sortcolumn+")" + is_sortorder case 'date' ls_sortstring = "if (isnull("+is_sortcolumn+"), date('01/01/1900') ,"+is_sortcolumn+")" + is_sortorder case 'datetime' ls_sortstring = "if (isnull("+is_sortcolumn+"), datetime('01/01/1900') ,"+is_sortcolumn+")" + is_sortorder case 'time' ls_sortstring = "if (isnull("+is_sortcolumn+"), time('00:00') ,"+is_sortcolumn+")" + is_sortorder case 'timestamp' ls_sortstring = "if (isnull("+is_sortcolumn+"), timestamp('0') ,"+is_sortcolumn+")" + is_sortorder end choose end if end if END IF
Dans l'interface datawindow
dans le sous menu 'sort' une fois la colonne choisie , double cliquer dessus , une fenêtre 'Modifyexpression" s'affiche , mettre dedans (exemple pour une colonne string)
"if (isnull("+nom de la colonne+"),'',nom de la colonne)"
Voilà je ne suis pas du tout une experte ,donc il y a surement des coquilles ,mais j'espère que cela pourra vous servir
Céline
Hors ligne