ORDA - query et substr

Bonjour,

Je n’arrive pas à trouver une solution simple avec ORDA.

Je chercher à remonter tous les enregistrements ayant le Code Postal commençant par un des départements d’une liste :

Dans l’idée se serait quelque chose du style :

<code 4D>
ds.TABLE.query(“CPostPat[2] in :1”;$listDepartement)

</code 4D>
sauf que le [[2]] n’existe pas dans le query.

Qu’est-ce que j’ai loupé s’il vous plait ?:oops::oops::oops:

Anne-Sophie propose https://forums.4d.com/Post/FR/23813291/1/23813292#23822969d’utiliser une collection>, ça devrait donner un truc de ce genre :
$listDepartement:=nouvelle collection(“7500@;1300@”)
ds.TABLE.query(“CPostPat IN :1”;$listDepartement)
Voir https://doc.4d.com/4Dv17R5/4D/17-R5/dataClassquery.305-4128666.fr.htmlla doc> pour les paramètres du IN.

Arf donc je n’ai rien loupé.

Merci bien en tout cas.

Bonjour,

: Arnaud DE MONTARD

Anne-Sophie propose
https://forums.4d.com/Post/FR/23813291/1/23813292#23822969d’utiliser
une collection>, ça devrait donner un truc de ce genre :
$listDepartement:=nouvelle collection(“7500@;1300@”)
ds.TABLE.query(“CPostPat IN :1”;$listDepartement)
Voir
<https://doc.4d.com/4Dv17R5/4D/17-R5/dataClassquery.305-4128666.fr.htm

la doc> pour les paramètres du IN.

Arnaud, c’est bien de conseiller de relire la doc, mais il faut aussi le faire soit même ! :slight_smile:

Dans la doc, il est nulle part écrit que le IN accepte l’arobase. Je crains onc que ta proposition ne fonctionne pas.
Pour le faire en ORDA efficacement il faudra regarder du côté de la v17R6 …
D’ici là on peut construire un requête du style :
<code 4D>
$coll:=Créer collection()
$coll.push(“75@”)
$coll.push(“85@”)

$string:=""
Boucle ($i;1;$coll.length)
$string:=$string+“CodePostal =:”+Chaîne($i)
Si ($i#$coll.length)
$string:=$string+" OR "
Fin de si
Fin de boucle

$es:=ds.TABLE.query(string;$coll)
</code 4D>

Cordialement,

Alors si ça fonctionne c’est un bug et il faut que je trouve une autre solution ?

<code 4D>
SÉLECTION VERS TABLEAU([Département]Code;$tabCP)
$collCP:=Créer collection
TABLEAU VERS COLLECTION($collCP;$tabCP)
$collCP:=$collCP.map(“VD_map_eachAdd”;"@")
UTILISER ENTITY SELECTION(ds.RSS.query(“CPostPat in :1”;$collCP).RSSvRUM)

</code 4D>

<code 4D>
// ----------------------------------------------------
// Méthode : VD_map_eachAdd
// Description
// Ajoute à chacun des éléments la valeurs $2
// Paramètres
// $2 => Valeur à ajouter
// ----------------------------------------------------
C_OBJET($1)
C_TEXTE($2)
$1.result:=$1.value+$2

</code 4D>

Bonjour,

Alors là je ne comprends pas l’intérêt de venir passer par ORDA dans
le code affiché :

: Vincent DUNAS

<code 4D>

SÉLECTION VERS TABLEAU([Département]Code;$tabCP)
$collCP:=Créer collection
TABLEAU VERS COLLECTION($collCP;$tabCP)
$collCP:=$collCP.map(“VD_map_eachAdd”;"@")
UTILISER ENTITY SELECTION(ds.RSS.query(“CPostPat in
:1”;$collCP).RSSvRUM)

</code 4D>

<code 4D>

// ----------------------------------------------------
// Méthode : VD_map_eachAdd
// Description
// Ajoute à chacun des éléments la valeurs $2
// Paramètres
// $2 => Valeur à ajouter
// ----------------------------------------------------
C_OBJET($1)
C_TEXTE($2)
$1.result:=$1.value+$2

</code 4D>

En effet; si l’on a une selection de la table [Departement] il suffit de projeter la sélection sur la table RSS en utilisant le lien entre les deux tables, via la commande SELECTION RETOUR.
Cela ne fera qu’une manipulation Client Serveur au lieu de trois et beaucoup moins d’élément à mettre dans la mémoire.

Cordialement,

Premièrement parce qu’il n’y a pas de lien entre la table DEPARTEMENT qui ne contient que les codes département et id des région et la table RSS qui contient les codes postaux des patients au moment de leurs passages donc il faut passer par de la mise en tableau, remise en forme et de la sélection par tableau et deuxièmement pour des histoires de temps de réponse entre le travail par orda et le travail par sélection (test fait)

:roll:Il faudrait pour se faire que je fasse une table DEPARTEMENT, CodePostal que je n’ai pas faite. Ca vaudrai peut-être le coup d’ailleur … :mrgreen:

Premièrement, tous les liens doivent être tracé que l’on soit en ORDA ou non. Ici ce n’est pas forcement simple, mais faisable.
Deuxièmement, il est TOTALEMENT faux que ORDA est plus rapide le travail par sélection. Je pourrais vous montrer de nombreux cas ou ce n’est pas le cas. De plus passer d’une entities selection à un selection courante et inversement a un coût qui est ici absolument inutile. Donc attention à ne pas prendre des décisions définitives sur la base de quelques tests …
En l’occurence, ici il faut passer par un CHERCHER PAR TABLEAU.

<code 4D>
SÉLECTION VERS TABLEAU([Département]Code;$tabCP)
Boucle($i;1;taille tableau($tabCP))
$tabCP{$i}:=$tabCP{$i}+"@"
Fin de boucle
CHERCHER PAR TABLEAU([RSS]CPostPat;$tabCP)

</code 4D>

Cordialement,

Bonjour Olivier,

Le IN accepte le @ comme wildcard.

La doc va être mise à jour.

4D 17R5 beta 1 Build 237597

Got it :mrgreen:

The correct syntax does not require =

<code 4D>
C_OBJECT($ent)
$ent:=ds.EVENT.query(“ID in :1”;New collection(23332))

</code 4D>

:doc:
In the querySettings parameter, you can pass an object containing additional options. The following properties are supported:
parameters, queryPlan, queryPath

These work:
<code 4D>
$value1_t:=“a@”
$value2_t:=“b@”
$query_t:="(name = :1 or name = :2)"
$params_o:=New object
$params_o. parameters:=New collection($value1_t;$value2_t)
$found1_l:=ds.PEOPLE.query($query_t;$params_o).length
$found2_l:=ds.PEOPLE.query($query_t;$params_o.parameters[0];$params_o.parameters[1]).length
$found3_l:=ds.PEOPLE.query($query_t;New object:=(“parameters”; New collection($value1_t;$value2_t))).length
</code 4D>

If you want to use collection items as placeholders, I think it’s mandatory to:
1/ use an object
2/ that object must have a property-collection named “parameters”

To be clearer, this will not work:
$found3_l:=ds.PEOPLE.query($query_t;New object:=(“myParameters”; New collection($value1_t;$value2_t))).length

Barak allah oufik,

I confirm this code works perfectly since IN requires a collection:

<code 4D>
C_COLLECTION($C_ID)
$C_ID:=New collection
C_TEXT($T_JSON)
For each ($T_JSON;$C_Intervention)

		C_OBJECT($O_Temp)
		$O_Temp:=JSON Parse($T_JSON)
		$C_ID.push($O_Temp.ID)
	End for each 
	
	C_OBJECT($O_Drop;$O_NotDrop)
	$O_Drop:=ds.EVENT.query("Id_event_L in :1";$C_ID)

</code 4D>

Now that everything runs smoothly, I’m wondering about the existence of the IN versus =!

Why not this:
<code 4D>
C_OBJECT($O_Entity)
$O_Entity:=ds.EVENT.query(“Id_event_L = :1”;New collection(23332))
</code 4D>

Hi Bertrand,

The IN is used to test the equality of a scalar field with any scalar value given in the collection.

The = is used to test the equality between a scalar field and the given parameter’s value.

In your example above, New collection(23332) is a reference in memory and you test if the field Id_event_L is equal to this reference, which makes no sense.

: Marie-Sophie LANDRIEU

In your example above, New collection(23332) is a reference in memory
and you test if the field Id_event_L is equal to this reference,
which makes no sense.

Despite it works, I’ll study that case again.

Maybe your current explaination could be reported in the manual?

: Marie-Sophie LANDRIEU

In your example above, New collection(23332) is a reference in memory
and you test if the field Id_event_L is equal to this reference,
which makes no sense.
Included in
IN
Gets data equal to at least one of the values in a collection or in a
set of values

I had a closer look to the manual and I do not understand why my code is a non-sense.

Your query is like if you are doing

<code 4D>
$myLongintVariable:=123
if ($myLongintVariable=new collection(123))

end if
</code 4D>

and expect to get True

: Marie-Sophie LANDRIEU

In your example above, New collection(23332) is a reference in memory
and you test if the field Id_event_L is equal to this reference,
which makes no sense.

MS,

I really don’t understand you position since I tested this:
<code 4D>
$O_Entity2:=ds.EVENT.query("not(Id_event_L IN :1) ";New collection(23345;23336;23337;10585))

$O_Entity:=ds.EVENT.query("Id_event_L IN :1 ";New collection(23345;23336;23337;10585))

</code 4D>

The table has 15 records and first request returns 4 records and second returns 11 records. exactly what I expect

[PLEASE ALLOW POSTS OF THIS FORUM TO BE EDITABLE]

Upadate : The table has 15 records and first request returns 11 records and second returns 4 records. exactly what I expect