/

 

The manual

Self-training

Experimentation

Contact

 

Language

Use states

Use a state to convert

Suppose we have a state whose identifier is 'x / y / z' which contains a column 'name' and a column 'tel' (telephone number).

In the following piece of code, the 'lookup' function will look in the 'x / y / z' state for the row that contains 'Dupont' in the 'name' column and will return the 'tel' column of this same row :

var Str n := "Dupont"
var Str t := lookup "x/y/z" nom tel n

If the report contains several lines whose key (here the 'name' field) corresponds to the value provided, and these lines do not all have the same value in the requested field (here the 'tel' field), then an error is generated.
To avoid this, we can add the following keyword at the end of the 'lookup' instruction:

undefined

If all lines do not have the same value in the requested field, we return the value 'undefined'.
For a character string, 'undefined' is understood as the empty string.

any

If several lines match the key, we return the value corresponding to any of them.

sum

If several lines correspond to the key, then we return the sum of the corresponding values.
This is only applicable for integer or floating point values.
For a character string, we return the concatenation of the values, with a new line between each.

Example:

var Str n := "Dupont"
var Str t := lookup "x/y/z" nom tel n sum

will return all of Dupont's phone numbers, separated by line breaks.

To copy the identifier of a state, switch to edit mode, select the state by clicking in it, then the 'Properties' button in the context menu on the left.
Then, press the Control key, then select the identifier in the sub-title 'Reference to report ...' in the window above.

You can also find the ID of a file:

var Str n := "Dupont"
var Str id := lookup_form_id "x/y/z" nom n

Validation of the entry of a customer code (or any other code field)
     An example of using the 'lookup' instruction

Browse a state

A more general version is the 'report' statement.
It is used to browse all the lines of a report whose specified field contains the specified value.
In the previous scenario, to get all the numbers corresponding to the name 'n', we could write:

var Str n
...
var Str all := ""
report "x/y/z" nom n
  field Str tel
  all += tel+" "

Si l'on ne fourni qu'un paramètre à l'instruction 'report' au lieu de trois, toutes les lignes de l'état seront parcourues:

report "x/y/z"
  ...

Filtrer plus avant et ordonner l'ordre de parcours des lignes

A partir de 2024, il est possible d'ajouter un filtre pour ne parcourir que certaines lignes :

report "x/y/z" ... filter quantity>3
  ...

On peut de plus ordonner le parcours des lignes de l'état suivant la valeur d'un des champs (dans cet exemple, il s'agit du champ 'tel') :

report "x/y/z" ... sort tel
   ...

ou dans l'odre inverse :

report "x/y/z" ... sort tel reversed
   ...

Recalcul automatique

The 'report' function is especially powerful: when a form uses it, the form will be automatically recalculated each time the lines of the report searched change.
It is this specificity that provides Storga with a functional power comparable to that of the relational model.
On peut activer ce recalcul automatique via l'option 'auto' :

report "x/y/z" nom n auto
  ...

The version without parameters is equivalent to:

report "x/y/z" nom n manual
  ...

Attention : avant 2024, le comportement par défaut était le recalcul automatique.

Recapitulatif des options de l'instruction 'report'

Voici l'ensemble des options utilisables dans une instruction 'report'. Ces options sont cumulables, à condition d'utiliser une seule des trois premières, et une seule des deux dernières :

Options de l'instruction 'report'

Action

nom_de_champ valeur

Ne parcourir que les fiches dont la valeur du champ correspond à celle indiquée.

value nom_de_champ valeur

Idem

range nom_de_champ valeur_mini valeur_maxi

Ne parcourir que les fiches dont la valeur du champ est comprise dans l'intervalle indiqué. Les bornes sont incluses.

filter condition

Ne parcourir que les fiches satisfaisant la condition indiquée.

sort valeur

Parcourir les fiches en respectant l'ordre.

reversed

Parcourir les fiches dans l'ordre inverse.

auto

Recalculer automatiquement la fiche, si une ligne de l'état correspondant au couple (nom_de_champ,valeur) indiqué est modifiée.
C'est le comportement par défaut avant 2024.

manual

Ne pas recalculer automatiquement.
C'est le comportement par défaut à partir de 2024.

Attention :

L'erreur de conception la plus classique dans un développement Storga est d'utiliser la séquence suivante, avec un 'if' qui sert à filtrer les lignes pour n'en retenir qu'une petite fraction :

report "x/y/z" champ_clé valeur
  field ...
  if ...
    ...

En effet, une telle séquence de code provoque une explosion algorithmique, c'est à dire une masse de calculs inutiles à la charge du serveur, et les lenteurs associées.

Pour corriger le problème, il faut ajouter éventuellement un champ dans l'état, et utiliser une clé plus discriminante, pour pouvoir idéalement supprimer le 'if' et en tous cas faire que la majorité des lignes soient retenues.

Summary sheet
     An example of using the 'report' statement