La selection avec QUERY with ARRAY est elle dans l'ordre du tableau?

Bonjour

Je prépare des mises a jour de champs dans des tableaux.
J’ai un tableau des identifiants et un autre tableau des valeurs à mettre à jour, ces tableaux sont synchrones.

Pour éviter de boucler sur des enregistrements j’utilise

<code 4D>
QUERY WITH ARRAY ([MaTable]Id;$monTableauId)
</code 4D>
puis
<code 4D>
ARRAY TO SELECTION($monTableauChamp;[maTable]Champ)
</code 4D>

Donc cela ne peut fonctionner que si la sélection courante est dans le même ordre que le tableau des Id

Rien n’est mentionné dans la doc, est ce que c’est 100% sûr ?

Bonjour

Ça me semble chaud !

Par contre si tu tries ton tableau et ta sélection par ordre des Id, ça doit marcher, non ?

bonjour,

je réponds juste à la question du titre: clairement c’est non.
Quand on fait un QUERY with ARRAY, 4D fait des recherche avec “ou” entre les les éléments du tableau, c’est tout.

Cela le sujet à déjà été évoqué, mais je ne me souviens plus avec qui (et une solution avait été trouvée, via un peu de code). Et ça marchait de la façon d’un “group by” en SQL. D’abord les voitures bleues, puis les jaunes, puis les rouges…

Il y avait des “sélection to array” pour récupérer les IDs puis des tris synchrones des tableaux…

Si la personne qui avait posé la question s’e souvient, ça serait sympa qu’elle se manifeste :slight_smile:

Bonne recherche (si je retrouve entre-temps, je reviens avec la réponse…)

Roland Lannuzel

Merci pour ces réponses.

Donc je vais faire comme d’habitude, un query with array suivi d’un selection vers array des identifiants et resynchroniser mon tableau du champ en utilisant les 2 tableaux d’identifiants.
Ensuite je ferais array vers sélection

Vincent

J’ai cette relique :
<code 4D>
//Arr_findByArraySorted (champ_p;tableau_p)
//wrappante de CHERCHER PAR TABLEAU avec conservation du tri
//© zetibo
C_POINTER($1)
C_POINTER($2)

C_LONGINT($i_l)
C_LONGINT($type_l)
C_POINTER($field_p)
C_POINTER($searchArr_p)
C_POINTER($table_p)
C_POINTER($typedArr_p)
//_
Case of
: (Count parameters<2)
ErrDev (Current method name+" 2 params attendus")
: (Not(Ptr_isField ($1)))
ErrDev (Current method name+" $1 doit être ->champ")
: (Not(Ptr_isArray ($2)))
ErrDev (Current method name+" $2 doit être ->tableau")
Else
$field_p:=$1
$searchArr_p:=$2
$table_p:=Table(Table($field_p))
QUERY WITH ARRAY($field_p->;$searchArr_p->)
$type_l:=Type($field_p->)
Case of
: ($type_l=Is text) | ($type_l=Is alpha field)
ARRAY TEXT($temp_at;0x0000)
$typedArr_p:=(->$temp_at)
: ($type_l=Is integer)
ARRAY INTEGER($temp_ae;0x0000)
$typedArr_p:=(->$temp_ae)
: ($type_l=Is longint) | ($type_l=Is time)
ARRAY LONGINT($temp_al;0x0000)
$typedArr_p:=(->$temp_al)
: ($type_l=Is real)
ARRAY REAL($temp_ar;0x0000)
$typedArr_p:=(->$temp_ar)
: ($type_l=Is boolean)
ARRAY BOOLEAN($temp_ab;0x0000)
$typedArr_p:=(->$temp_ab)
: ($type_l=Is date)
ARRAY DATE($temp_ad;0x0000)
$typedArr_p:=(->$temp_ad)
//: ($type_l=Est une image )
//TABLEAU IMAGE($temp_ai;0)
//$0:=(->$temp_ai) `tableau image
Else
//retourne nil
End case

	If (Is nil pointer($typedArr_p))
		  //#erreur type non géré
		
	Else 
		ARRAY LONGINT($recNum_al;0x0000)
		SELECTION TO ARRAY($field_p->;$typedArr_p->;$table_p->;$recNum_al)
		  //trouver la pos de chaque recNum dans le tableau de recherche
		ARRAY LONGINT($position_al;Size of array($recNum_al))
		For ($i_l;1;Size of array($recNum_al))
			$position_al{$i_l}:=Find in array($searchArr_p->;$typedArr_p->{$i_l})
		End for 
		  //effacer recNum non trouvés
		For ($i_l;Size of array($position_al);1;-1)
			If ($position_al{$i_l}<=0)
				DELETE FROM ARRAY($position_al;$i_l)
				DELETE FROM ARRAY($recNum_al;$i_l)
			End if 
		End for 
		  //tri recNum par position croissant
		SORT ARRAY($position_al;$recNum_al)
		CREATE SELECTION FROM ARRAY($table_p->;$recNum_al)
	End if 

End case
//_
</code 4D>