Pas de problème (pb), que du PowerBuilder (PB) ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 19-05-2021 15:44:34

celine  
Membre
Date d'inscription: 28-06-2010
Messages: 8
Pépites: 42
Banque: 0

Astuce: Datawindow - trier correctement les valeurs null

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)

Code: pb

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

Code: pb

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

Code: pb

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)

Code: pb

"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

 

Pied de page des forums

Propulsé par FluxBB 1.2.22