Supprimer par morceaux

La suppression d’une grosse sélection est très lente (euphémisme). Apparemment, ça va beaucoup mieux en découpant le problème en morceaux.

Supprimer par morceaux :
<code 4D>
//Sel_deleteByChuncks (table_p { ;tailleEchantillon_l) -> txt
//supprime la sélection de table
// en procédant par morceaux si
// la sélection est importante
//$0 non vide si erreur
C_TEXTE($0)
C_POINTEUR($1)
C_ENTIER LONG($2)

C_TEXTE($error_t)
C_POINTEUR($table_p)
C_ENTIER LONG($tailleEchantillon_l)

C_ENTIER LONG($locked_l)
C_ENTIER LONG($prog_l)
//_
$error_t:=""
$table_p:=$1
$tailleEchantillon_l:=50
Si (Nombre de paramètres>1)
$tailleEchantillon_l:=$2
Fin de si
$found_l:=Enregistrements trouvés($table_p->)
Si ($found_l>0)
$prog_l:=UI_progressStart (-1;Chaîne($found_l)+" enregistrements à supprimer";Nom de la table($table_p))
$rw_b:=RW_write ($table_p) //WWW
Si ($found_l<=$tailleEchantillon_l)
SUPPRIMER SÉLECTION($table_p->)
$locked_l:=Enregistrements dans ensemble(“LockedSet”)
Sinon
TABLEAU ENTIER LONG($rec_a2l;0x0000;0x0000)
Sel_split ($table_p;->$rec_a2l;$tailleEchantillon_l)
Boucle ($i_l;1;Taille tableau($rec_a2l))
CRÉER SELECTION SUR TABLEAU($table_p->;$rec_a2l{$i_l})
UI_progressUpdate ($prog_l;Num_percent ($i_l;1;Taille tableau($rec_a2l)))
SUPPRIMER SÉLECTION($table_p->)
$locked_l:=Enregistrements dans ensemble(“LockedSet”)
Si ($locked_l>0)
$i_l:=Taille tableau($rec_a2l)+1
Fin de si
Fin de boucle
Fin de si
Si ($locked_l>0)
$error_t:=Nom méthode courante+" verrou rencontré "+Chaîne($locked_l)
Fin de si
RW_set ($rw_b;$table_p) //WWW
UI_progressEnd ($prog_l)
Fin de si
$0:=$error_t
//_

</code 4D>

Fabriquer les morceaux
<code 4D>
//Sel_split (table_p;tabLong2d_p {;tailleEchantillon_l)
//retourne les numéros d’enregistrements de table
// dans le tableau 2d d’entiers longs
// avec autant de colonnes que le nécessite
// l’échantillonnage
//$3 option, 1000 par défaut
//ce tableau pourra être utilisé pour créer
// des sous sélection de la sélection d’origine
// avec autant de CRÉER SELECTION SUR TABLEAU
// que de colonnes
C_POINTEUR($1)
C_POINTEUR($2)
C_ENTIER LONG($3)

C_POINTEUR($table_p)
C_POINTEUR($arr_p)
C_ENTIER LONG($size_l)

C_ENTIER LONG($col_l)
C_ENTIER LONG($end_l)
C_ENTIER LONG($start_l)
//_
ASSERT(Ptr_isTable ($1))
ASSERT(Ptr_isArray2D ($2;Est un tableau entierlong))
$table_p:=$1
$arr_p:=$2
$size_l:=1000
Si (Nombre de paramètres>2)
$size_l:=Choisir($3>0;$3;100) //doit être > 0
Fin de si

$start_l:=1
$end_l:=Enregistrements trouvés($table_p->)
TABLEAU ENTIER LONG($rec_a2l;0x0000;0x0000)
TABLEAU ENTIER LONG SUR SÉLECTION($table_p->;$rec_a2l{0})
Tant que (Taille tableau($rec_a2l{0})>0)
$col_l:=Taille tableau($rec_a2l)+1
INSÉRER DANS TABLEAU($rec_a2l;$col_l) //nouvelle colonne
COPIER TABLEAU($rec_a2l{0};$rec_a2l{$col_l})
Si (Taille tableau($rec_a2l{$col_l})>$size_l)
SUPPRIMER DANS TABLEAU($rec_a2l{$col_l};$size_l+1;MAXLONG)
Fin de si
SUPPRIMER DANS TABLEAU($rec_a2l{0};1;$size_l)
Fin tant que
COPIER TABLEAU($rec_a2l;$arr_p->)
</code 4D>