Article
· Avr 9 4m de lecture

Interroger une base de données SQL externe pour l'utiliser dans une production

Introduction

Il existe une option d'assistant de procédure de liaison dans le portail de gestion (Système > SQL > Assistants > Procédure de liaison) avec laquelle j'ai eu des problèmes de fiabilité, j'ai donc décidé d'utiliser cette solution à la place.

Problème

Vous devez interroger une base de données SQL externe pour utiliser la réponse dans un espace de noms. Ce guide suppose que vous disposez déjà d'une procédure stockée fonctionnelle dans SSMS, bien que vous puissiez utiliser un bloc SQL dans l'opération. Les procédures stockées dans SSMS sont préférables pour maintenir l'intégrité, Embedded SQL peut devenir très confus si vous avez une déclaration SQL compliquée.

Dans cet exemple, j'utilise l'identifiant d'un patient, j'interroge une base de données SQL et je récupère les coordonnées de son médecin traitant.

Solution

  1. Créez un DSN sur le serveur sur lequel tourne votre production à l'aide d'ODBC.
  2. Créer une nouvelle connexion SQL Gateway
  3. Créer une classe de message qui étend Ens.Request et qui contiendra les champs que vous utiliserez dans votre requête SQL.
  4. Créer une classe de message qui étend Ens.Response et qui contient les champs que vous voulez récupérer de la requête.
  5. Créer une classe d'opération
  6. Créer une nouvelle opération dans le portail de gestion et lier la classe créée au point 5 (Interopérabilité > Configuration > Configuration de la production).
  7. Ajouter le DSN dans les paramètres de l'opération (à partir du point 2).

 

1. Créez un DSN sur le serveur sur lequel tourne votre production en utilisant ODBC.

À la fin de ce processus, assurez-vous que le test est réussi, sinon le reste échouera. Une fois que cela a été mis en place sur le serveur, vous pouvez l'utiliser dans l'ensemble de votre production.

 

2. Créer une nouvelle connexion SQL Gateway

Cela permet de relier le DSN du serveur à quelque chose de significatif dans le portail de gestion.
N'oubliez pas de vérifier la connexion.

 

3. Créez une classe de message qui étend Ens.Request et qui contiendra les champs que vous utiliserez dans votre requête SQL.

Class ABCD.Messages.General.GPdataRequest Extends Ens.Request
{
Property mrn As %String;
}

Il contient les éléments de données que vous devez transmettre à votre procédure stockée/bloc de code SQL.

 

4. Créez une classe de message qui étend Ens.Response et qui contient les champs que vous souhaitez obtenir en retour de la requête.

Class ABCD.Messages.General.GPdataResponse Extends Ens.Response
{
Property NatGPCode As %String;
Property NatLocCode As %String;
Property Result As %String;
}

Il contient la réponse de la procédure stockée ou du bloc de code SQL.

 

5. Créer une classe d'opérations

Class ABCD.Operations.getGPDataByMRN Extends Ens.BusinessOperation
{

Parameter ADAPTER = "EnsLib.SQL.OutboundAdapter";
Property Adapter As EnsLib.SQL.OutboundAdapter;
Parameter INVOCATION = "Queue";
Method OnMessage(pRequest As ABCD.Messages.General.GPdataRequest, pResponse As ABCD.Messages.General.GPdataResponse) As %Status
{
	Set snapshot = ##class(EnsLib.SQL.Snapshot).%New()
	Set tSC =$$$OK
	//Build the execute statement
	Set query = " [dbo].[sp_get_GPdata_by_MRN] "
	Set query = query _ ", @MRN = '"_pRequest.IMSmrn_"'"
	//Simple trace to check the execute statement. You should be able to lift this trace and run directly in SQL server.
	$$$TRACE("Query looks like this= "_query) //example [dbo].[sp_get_GPdata_by_MRN] @MRN = '123456'
	//Execute the statement
	$$$QuitOnError(..Adapter.ExecuteQuery(snapshot,query))
	
	//Prepare to get results back, setting responses to null and "Failure" by default for error handling. A positive result will overwrite these.
	Set pResponse = ##class(ABCD.Messages.General.GPdataResponse).%New()
	Set (pResponse.NatGPCode, pResponse.NatLocCode) = ""
	Set pResponse.Result = "Failure"
		//Check the snapshot for any rows.		
        IF snapshot.RowCount>0
			{
			Set pResponse.Result = "Success"
			$$$TRACE(snapshot.Get("NationalGPCode",1))
			Set pResponse.NatGPCode  = snapshot.Get("NationalGPCode",1)
			Set pResponse.NatLocCode = snapshot.Get("NationalLocationCode",1)
			}	
	Quit tSC
}

}

 

6. Créer une nouvelle Business Operation dans le portail Iris (Interoperability > Configuration > Production Configuration) et lier la classe créée au point 5

 

7. Ajouter le DSN dans les paramètres de l'opération (à partir du point 2)

Si vous utilisez des informations d'identification ici, n'oubliez pas que les informations d'identification se rapportent à un espace de noms.

Une fois que cela a fonctionné, j'ai créé un processus commercial pour appeler cette opération commerciale et la renvoyer au processus pour qu'il l'utilise selon les besoins.

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