4.5 Les attributs calculés

4.5.1 Présentation

Un attribut calculé est un attribut dont la valeur est calculée par Dynacase. Ce calcul est effectué à chaque appel de la méthode Doc::refresh(), qui est appelée très fréquemment sur les documents. Dans de nombreux cas, il sera préférable d'utiliser les hooks du document (en particulier Doc::postStore).

Le calcul de l'attribut peut être

  • local

    Par exemple : attr_c = attr_a * attr_b

  • global

    Par exemple : attr_d = nombre de documents du même auteur

  • externe

    Par exemple : attr_e = quantité en stock dans l'ERP

Ce calcul peut être effectué au moyen :

  • d'une méthode publique de la classe du document contenant l'attribut,
  • d'une méthode statique d'une autre classe.

Elle doit retourner un résultat sous forme d'une chaîne de caractères. Le résultat est mis dans l'attribut sur lequel s'applique le calcul (sauf redirection explicite faite lors de la déclaration de l'attribut).

Le calcul est effectué lors du rafraîchissement des documents (voir la méthode Doc::refresh()).

Les attributs en visibilité I ne sont pas modifiés lors de l'actualisation. Pour que ces attributs soit modifiés, il est nécessaire qu'un contrôle de vue modifie cette visibilité pour l'utilisateur courant. Si l'attribut est en visibilité I au moment du calcul, un message d'avertissement sera écrit dans les logs système.

D'un point de vue utilisateur, un attribut calculé est rafraîchi avant chaque consultation de document.

4.5.2 Syntaxe

La syntaxe définissant les attributs calculés est la suivante :

computeMethod:callMethod:targetAttributeNamecallMethod:staticClass::methodName(methodInputs)methodInputs:methodInput,methodInputmethodInput:<spaces>sourceAttributeNamefamilyParameterNametextkeyWord<spaces>text:'<text>'[^',]+'"[^",]+"keyWord:THISK

Ce qui donne en BNF :

computeMethod   ::= callMethod ( ( ':' targetAttributeName ) |  )
 
callMethod      ::= ( staticClass |  ) '::' methodName '(' ( methodInputs |  ) ')'
 
methodInputs    ::= methodInput ( ',' methodInput )*
 
methodInput     ::= '<spaces>'* ( sourceAttributeName | familyParameterName | text | keyWord ) '<spaces>'*
 
text            ::= ( "'" '<text>' ) | ( "'" "[^',]+" "'" ) | ( '"' '[^",]+' '"' )
 
keyWord         ::= 'THIS' | 'K'

avec les éléments suivants :

targetAttributeName

Un nom d'attribut existant dans la famille.

Le résultat de la méthode sera affecté à cet attribut.

Si targetAttributeName n'est pas renseigné, alors c'est l'attribut sur lequel est définie la méthode de calcul qui reçoit la valeur.

sourceAttributeName

Un nom d'attribut existant dans la famille.

La méthode de calcul recevra la valeur de l'attribut au moment de l'appel.

Lorsque attributeName est dans un array, alors la valeur passée est :

  • la valeur sur la même ligne si l'attribut calculé est dans le même tableau
  • la valeur de la colonne (sous la forme d'un tableau php) si l'attribut calculé est en dehors du tableau
  • la valeur sur la même ligne si l'attribut est dans un autre tableau, ce qui peut conduire à des comportements surprenants.
familyParametername

Un nom de paramètre existant dans la famille.

La fonction de calcul recevra la valeur du paramètre au moment de l'appel.

keyWord

Un mot clé qui est remplacé par une valeur dynamique

THIS

L'objet du document en cours.

Cela est utile dans le cas d'un appel à une méthode statique.

K

L'index de la ligne en cours si l'attribut est dans un tableau.

Si l'attribut n'est pas dans un tableau, la valeur passée est -1

4.5.3 Exemples

4.5.3.1 Calcul d'un prix total

Extrait de la définition de la famille

attrid label type visibility phpfunc
article_qte Quantité int W
article_prix_unitaire Prix unitaire double W
article_prix_total Prix total R ::computePrice(article_qte,article_prix_unitaire)

Extrait du fichier de méthodes associé

public function computePrice($qte, $price){
    return intval($qte) * floatval($price);
}

Note: on pourrait aussi utiliser une méthode statique, qui aurait sûrement plus de sens ici :

attrid label type visibility phpfunc
article_qte Quantité int W
article_prix_unitaire Prix unitaire double W
article_prix_total Prix total R MathUtils::mult(article_qte,article_prix_unitaire)
class MathUtils {
    public static function mult($a, $b){
        return floatval($a) * floatval($b);
    }
}
×