Article
· Jan 8 3m de lecture

Comment rejouer certaines lignes d'une source SQL en utilisant un adapteur SQL (EnsLib.SQL.InboundAdapter)

Bonjour La Communauté,

en utilisant un Business Service de type SQL, il peut arriver que nous ayons besoin de rejouer certaines lignes de la table source.

Prenons comme exemple le Business Service "from customer SQL"  utilisant la classe générique EnsLib.SQL.Service.GenericService

 

Différents cas se présentent, en fonction des paramétres utilisés sur ce Business Service.

Premier cas :

Si le Business Service utilise uniquement un champ clé (KeyFieldName)

Dans ce cas, pour retraiter les ID 123, 456 et 789, il suffira de les supprimer de la globale ^Ens.AppData pour le Business Service concerné sur la référence "adapter.sqlrow": 

kill ^Ens.AppData("from customer SQL","adapter.sqlrow",123)
kill ^Ens.AppData("from customer SQL","adapter.sqlrow",456)
kill ^Ens.AppData("from customer SQL","adapter.sqlrow",789)

Autre option : si vous n'avez pas accès au terminal ou si vous souhaitez éviter de manipuler des globales systèmes de l'interopérabilité d'IRIS, il est aussi possible de dupliquer le Business Service temporairement en indiquant dans la requête les lignes que l'on souhaite retraiter 

Exemple :

Avec la requête :

En regardant le contenu de la globale ^Ens.AppData, on valide bien que les lignes concernées ont été retraitées sous le nom de notre nouveau Business Service "from customer SQL - temporaire" :  

NB : si vous supprimez le Business Service temporaire après avoir retraité les lignes souhaitées, n'oubliez pas que la globale ^Ens.AppData ne sera pas supprimée. Ce qui veut dire qu'en cas de recréation du Business Service sous le même nom, avec des lignes déjà traitées par ce Business Service temporaire, celles-ci ne seront pas prises en compte. La solution reviendra donc, soit à supprimer les données concernées directement sur ^Ens.AppData, soit à veiller à donner un nom de Business Service temporaire toujours unique. Exemple ci-dessous avec une copie de "from customer SQL" en "from customer SQL - retraitement du 8 janvier 2024"

Et le résultat dans ^Ens.AppData :

 

Deuxième cas :

Si le Business Service est paramétré avec une requête de suppression (DeleteQuery) de type :

UPDATE app.customer SET processed=1 WHERE ID=?

Et une requête de type :

Dans ce cas, pour retraiter le client correspondant à l'ID 123, il suffira d'exécuter une mise à jour sur la source du type :

UPDATE app.customer SET processed=0 WHERE ID = 123

Et pour retraiter les ID 123, 456 et 789, une requête du type 

UPDATE app.customer SET processed=0 WHERE ID in (123, 456, 789)

NB : ce cas suppose que vous avez accès à la source SQL avec un compte utilisateur autorisé en mise-à-jour sur la table concernée, ce qui n'est pas toujours garanti.

Autre option :  comme dans le premier cas, vous avez toujours la possibilité de créer un nouveau Business Service temporaire en copiant le Service initial et en l'adaptant aux besoins de retraitement. (cf. Autre option du premier cas)

 

Troisième cas :

Si le Business Service utilise le paramètre %LastKey, il ne sera pas possible d'indiquer isolément les différents lignes à retraiter comme dans le cas précédent, mais uniquement les ID supérieurs à la valeur de %LastKey. 

Avec une requête de type :

Dans ce cas, il suffit de mettre à jour la globale ^Ens.AppData en lui indiquant la valeur minimale de %LastKey pour le Business Service concerné de la référence "adapter.sqlparam":

set ^Ens.AppData("from customer SQL","adapter.sqlparam","%LastKey")=120

Autre option :  comme dans le premier cas, vous avez toujours la possibilité de créer un nouveau Business Service temporaire en copiant le Service initial et en l'adaptant aux besoins de retraitement. (cf. Autre option du premier cas)

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer