Sac à dos du pauvre

L’autre jour, sur un client distant, je constate une lenteur exaspérante en faisant clic, majuscule+clic et autres cmde+clic dans une listbox sélection. Comme cette liste est accompagnée de l’inévitable commentaire « X enregistrements sur Y dans la table », la cause est entendue : appel à Enregistrements dans table = requête à chaque clic, ce qui rappelle un certain sac à dos du dernier world tour. Là, comme il me fallait quelque chose de simple et rapide à implémenter sans tout casser, j’ai simplement fait une méthode qui permet de forcer un délai minimal entre 2 requêtes Enregistrement dans table.
<code 4D>
//Rec_inTable (table_l {;nbreSecondes_l)
//wrappante de Enregistrements dans table
//permet de limiter les requêtes au serveur
//par exemple quand on fait des sélections en listbox sélection
//$2 optionnel : nombre de secondes entre deux interrogations
// 0 secondes si non passé - équivaut à la fonction 4D
C_ENTIER LONG($0)
C_ENTIER LONG($1)
C_ENTIER LONG($2)

C_ENTIER LONG($delay_l)
C_ENTIER LONG($now_l)
C_ENTIER LONG($params_l)
C_ENTIER LONG($table_l)

Si (Faux)
C_ENTIER LONG(Rec_inTable ;$0)
C_ENTIER LONG(Rec_inTable ;$1)
C_BOOLEEN(Rec_inTable ;$2)
Fin de si
//_
$params_l:=Nombre de parametres
ASSERT($params_l>0;Nom methode courante+" $1 table number missing")
$table_l:=$1

Si (Est un numero de table valide($table_l))
$delay_l:=0 //immédiat
Si ($params_l>1)
$delay_l:=$2
Fin de si
//exceptionnellement, déclarer / dimensionner c’est kif kif
TABLEAU ENTIER LONG(<>recordsInTable_a2l;1;Lire numero derniere table)
//indice=num table;c0=nbre enregs;c1=TimeStamp
//on utilise la colonne 0 car la ram coûte lapoducu
$now_l:=TS_encodeDH
Si (($now_l-<>recordsInTable_a2l{1}{$table_l})>$delay_l) //need update
<>recordsInTable_a2l{0}{$table_l}:=Enregistrements dans table(Table($table_l)->)
<>recordsInTable_a2l{1}{$table_l}:=$now_l
Fin de si
$0:=<>recordsInTable_a2l{0}{$table_l}
Fin de si
//_
</code 4D>

pas testé mais pour ceux qui préfèrent le français (et il manque la méthode TS_encodeDH…)

<code 4D>
// BASE_nombreEnregistrementsTotal ( table ; { nbreSecondes } )
// par Arnaud de Montard
// wrappante de Enregistrements dans table
// permet de limiter les requêtes au serveur
// par exemple quand on fait des sélections en listbox sélection
// $2 optionnel nombre de secondes entre deux interrogations
// 0 secondes si non passé équivaut à la fonction 4D

C_ENTIER LONG($0;$1;$2;$delai;$maintenant;$table)

$table:=$1

Si (Est un numéro de table valide($table))

Si (Nombre de paramètres>=2)
	$delai:=$2  // en secondes
Sinon 
	$delai:=0  // immédiat
Fin de si 

TABLEAU ENTIER LONG(<>recordsInTable;1;Lire numéro dernière table)

  // indice = table; élément 0 = nombre total de fiches dans la table ; élément 1 = TimeStamp

Si ((DATE_secondesEcouleesDepuis (<>recordsInTable{1}{$table})>$delai)  // mise à jour nécessaire
	<>recordsInTable{0}{$table}:=Enregistrements dans table(Table($table)->)
	<>recordsInTable{1}{$table}:=Heure courante  // pas de *
Fin de si 

$0:=<>recordsInTable{0}{$table}

Fin de si

</code 4D>

<code 4D>
// DATE_secondesEcouleesDepuis ( heureDepart ; { Maintenant } ) -> nombre de secondes
// NOTE : Ne marche que sur une journée maximum

C_HEURE($1;$2)
C_ENTIER LONG($0;$nombreSecondes)
C_HEURE($maintenant)

Si (Nombre de paramètres>=2)
$maintenant:=$2
Sinon
$maintenant:=Heure courante // pas de * pour l’heure
Fin de si

$nombreSecondes:=($maintenant+0)-($1+0)

Si ($nombreSecondes<0)
$nombreSecondes:=$nombreSecondes+86400 // nombre de secondes dans une journée
Fin de si

$0:=$nombreSecondes

</code 4D>

: Herve LE MARCHAND

(et il manque la méthode TS_encodeDH…)
Si je préfère travailler avec des timestamps (horodatages), c’est simplement que ça m’évite de me demander à quels jours début et fin appartiennent (maxlong secondes ~ 68 ans, le double avec les valeurs négatives).
TS_encodeDH est http://forums.4d.com/Post/FR/14701949/1/14706493#14701950là>, ça prend 3 secondes à trouver. Je ne prétends pas que ce soit bug free (d’ailleurs je m’en fous, c’est gratuit), quand au travail de traduction il promet d’être exténuant.

D’habitude, je suis assez détendu, surtout le vendredi ; et là, je sais pas pourquoi, je ressens comme une légère irritation.

Ne sois pas irrité mon Arnaud ! déjà, si je me suis donné du mal à la réécrire à ma sauce (sans programmation défensive, sans suffixe, variables traduites), c’est parce que j’y trouve un intérêt. Le fait de signaler qu’il manque une sous-méthode c’est juste pour faire en sorte que ce fil soit exploitable par tout le monde.