Ds.limit?

Bonjour,
Je viens de faire quelques recherche mais je ne sais pas comment fixer une limite en exécutant une query dans le datastore…

Exemple :
Je voudrais fixer une limite à 1000 sur cette boucle…

<code 4D>
For each ($O_personne;ds.personne.query(“rang IS Contact”))

End for each

</code 4D>

J’ai essayé des choses du genre :
ds.personne.query(“rang IS Contact”).limit(1000) ou ds.personne.query(“rang IS Contact LIMIT 1000”)
Mais rien…

Du coup je me contente de travailler sans le .ds avec
<code 4D>
SET QUERY LIMIT (1000)
QUERY([personne];[personne]rang=“Contact”)
While (Not(End selection([personne])))

NEXT RECORD([personne])
End while

SET QUERY LIMIT (0)
</code 4D>

Mais c’est bien plus de ligne et galère pour la suite de la méthode qui attend un objet personne.

Vous avez des pistes ?

Je pense que la doc dehttp://doc.4d.com/4Dv17/4D/17/For-eachEnd-for-each.300-3754311.en.html For each> te donne une piste :

<code 4D>
$increment:=0
$limite:=1000

For each($O_personne;ds.personne.query(“rang IS Contact”)) While ($increment<=$limite)
$increment:=$increment+1
// Ajoute ce qui te as à faire ici
End for each
</code 4D>

Dans ce cas je pourrais faire simplement :

For each($O_personne;ds.personne.query(“rang IS Contact”);0;1000)
//Ajoute ce qui te as à faire ici
End for each

Mais c’est pas terrible en terme de perf…
J’ai 260 000 personnes dans la BDD, j’oblige le moteur de la BDD à faire le tour des 260 000 enregistrements.

Alors qu’il existe des commandes avec 4D ou mysql pour stopper la recherche une fois la limite atteinte… :o)

Avec for each, tu boucles de 1 à N. Donc si tu demande à t’arrêter à 1000, tu ne touches que les 1000 premiers. Pourquoi dis-tu que tu passes au travers de tes 260 000 enregistrements.

For each te permet de charger une entité contenue dans une sélection d’entités. Dans ton cas, je ferai la sélection d’entités avant d’entrer dans le For each.

Patrick

Bonjour,

Ce que vous cherchez c’est l’équivalent de “SET QUERY LIMIT” (“FIXER LIMITE RECHERCHE” en VF)

En ORDA, ça se dit “slice”. La documentation est http://doc.4d.com/4Dv17/4D/17/entitySelectionslice.301-3775162.en.htmlici>

<code 4D>
$first1000:=ds.tracks.all().slice(0;1000)
</code 4D>

note : Attention, le dernier indice est non inclus.
Ça renverra bien les entités de 0 à 999 soit 1000)

Roland