Champ dans une formule

Cette fonction reçoit une formule et retourne un pointeur sur le premier champ qu’elle y trouve.
Usage : dans les listbox sélection, je propose souvent de restreindre la recherche au champ de la dernière colonne cliquée. Avec une colonne formule, pas de champ. Cette méthode me permet de détecter si la formule contient une référence de champ et de l’utiliser.
<code 4D>
//FormulaFieldGet (formule_t) -> ptr
//retourne un pointeur sur le 1er champ trouvé dans formule
C_POINTEUR($0)
C_TEXTE($1)

C_TEXTE($formule_t)
ASSERT(Nombre de paramètres>0)

C_POINTEUR($0)
C_TEXTE($1)

C_ENTIER LONG($field_l)
C_ENTIER LONG($table_l)
C_POINTEUR($field_p)
C_POINTEUR($table_p)
C_TEXTE($field_t)
C_TEXTE($formule_t)
C_TEXTE($rx_t)
C_TEXTE($table_t)
TABLEAU ENTIER LONG($len_al;0)
TABLEAU ENTIER LONG($pos_al;0)

ASSERT(Nombre de paramètres>0)

$formule_t:=$1
$rx_t:="\(:?[0-9a-zA-Z_]{1,31})\\b"

Si (Trouver regex($rx_t;$formule_t;1;$pos_al;$len_al))
$table_t:=Sous chaîne($formule_t;$pos_al{1};$len_al{1})
$field_t:=Sous chaîne($formule_t;$pos_al{2};$len_al{2})

Si ($table_t=":@") //token
$table_l:=Num($table_t)
Si (Est un numéro de table valide($table_l))
$field_l:=Num($field_t)
Si (Est un numéro de champ valide($table_l;$field_l))
$field_p:=Champ($table_l;$field_l)
Fin de si
Fin de si
Sinon //name
$table_p:=DB_tablePtrByName ($table_t)
Si (Ptr_isTable ($table_p))
$field_p:=DB_fieldPtrByName (Table($table_p);$field_t)
Fin de si
Fin de si
Fin de si
$0:=$field_p
//_
</code 4D>

Translation…
The function returns a pointer to the 1st field found in formula $1.
Use: in selection listboxes I often let the user restrict the search to the field of the last clicked column. But no field in a formula column. With this method I can read if the formula contains a field reference I can use.

Tu pourrais faire un Trier par formule non :?:

Je voulais surtout résoudre le problème de la recherche sur des colonnes où la formule compliquait une recherche “évidente”. Deux exemples :

  • un champ timestamp stocké en long et affiché en texte, maintenant je peux chercher par date
  • un champ sexe (0=inconnu, 1=homme, 2=femme) affiché en unicode :white_circle:♀♂

J’ai pensé aussi au tri, mais dans l’idée de trier avec le champ, pas avec la formule (clic en-tête, on lit le champ, s’il est adapté on trie avec). Je ne suis pas sûr que beaucoup de formules se prêtent au tri. Sur la première formule ci-dessus le tri direct du champ me semble préférable. Sur la seconde, que ce soit par champ ou par formule le tri n’aurait guère de sens, mais le champ restera plus efficace (heureusement que la formule ne retourne pas une image :wink: ). Ou encore dans l’exemple de formule texte stylé que tu as posté ce matin, le champ sera sans doute préférable…

Je ne vois pas comment tu veux faire fonctionner cela sur mon texte stylé car la formule dans la colonne de la listbox c’est le nom de la fonction ! il peut n’y avoir aucun paramètre donc aucun champ à trouver mais le résultat lui peut rester triable…

Ha, ok, pas vu.

Bin taka passer ce p… champ en paramètre comme ça ta fonction elle marchera avec d’autres colonne et tu pourras trier
ronchonna-t-il avec sa mauvaise foi coutumière