Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

Versão 1 Próxima »

4.1. Objetivo

Hacer posible a través de scripts en Fluig la ejecución de procedures (reglas de negocio) en programas Progress (BO – Business Object) en Datasul. Las llamadasse podrán hacer a cualquier procedure de manera no persistente, disponibles en programas en el AppServer Progress de Datasul. Se respetarán los parámetros de ida y vuelta de cada procedure sin necesidad de realizar cambios en ellos. El acceso a los proceduress está disponible a través de un Web Services en el Datasul llamado ExecBO. El gráfico 3.1.a a continuación ilustra la estructura general de la solución.

Gráfico 3.1.a

El gráfico 3.1.b presenta la interacción entre los módulos.

Gráfico3.1.b


4.2. Guía de Programación

El WebServices ExecBO posee los siguientes métodos:

Método

Descripción

Parámetros

Devolución

login

Realiza el login del usuario, obteniendo las credenciales a través del HEADER del mensaje SOAP.

No recibe parámetros directamente, pero los obtiene a través del HEADER del mensaje SOAP, donde se deberán informar:

username: nombre del usuario en Datasul

password: contraseña del usuario en formato Base64.

Si el login se realiza con éxito responde con un token de autenticación.

Si las credenciales son inválidas, acciona una exception.

userLogin

La misma función del método login recibe sin embargo las credenciales a través de parámetros normales.

username: nombre del usuario en Datasul

password: contraseña del usuario en formato Base64.

Si el login se realiza con éxito responde con un token de autenticación.

Si las credenciales son inválidas, acciona una exception.

callProcedure

Ejecuta un procedure en un BO Progress, recibiendo el token de autenticación a través del HEADER del mensaje SOAP.

Añadir el parámetro usertoken en el HEADER.

programName:String – nombre del BO o programa Progress. Este programa deberá estar en una carpeta indicada en el PROPATH del AppServer. Si está en una subcarpeta, la misma deberá estar indicada al lado como el nombre del programa.

procedureName:String – nombre del procedure a ejecutar.

jsonParams:String – string en formato JSON conteniendo los parámetros de la procedure.

String en formato JSON con los resultados de la ejecución de la procedure.

callProcedureWithToken

La misma función del método callProcedure, no obstante el token de autenticación se pasa como un parámetro normal del método.

token:String – token de autenticación.

programName – String – nombre de la BO o programa Progress. Este programa deberá estar en una carpeta indicada en el PROPATH del AppServer. Si está en una subcarpeta, se la debe indicar al lado como el nombre del programa.

procedureName – String – nombre de la procedure a ejecutar.

jsonParams – String – string en formato JSON conteniendo los parámetros de la procedure.

String en formato JSON con los resultados de la ejecución de la procedure.

 

La contraseña del usuario en Datasul se debe informar de manera codificada en Base64. Por ejemplo, si la contraseña es 'framework', su codificación resulta en la string 'ZnJhbWV3b3Jr='. Hay varias maneras de realizar esa codificación, en Javascript podemos utilizar la función btoa(), como se muestra en el ejemplo a continuación:

var pwd64 = btoa("framework");

 

El parámetro jsonParams de los métodos callProcedure o callProcedureWithToken contendrá los parámetros de la procedure en formato JSON. De esa manera la string jsonParams deberá representar unArray de objetos, donde cada objeto contiene los siguientes atributos:

  • name: nombre del parámetro, correspondiente en la procedure Progress.

  • type: tipo de parámetro, pudiendo ser: “input”, “output” o “input-output”.

  • dataType: tipo de dato, pudiendo ser: “character”, “integer”, “decimal”, “logical”, “date”, “datetime” o “temp-table”.

  • value: valor del parámetro.

Suponiendo un programa llamado Teste.p que posee una procedure llamada suma. Esa procedure recibe dos valores enteros como parámetros de input, los suma y devuelve también un entero como output. La llamada para la callProcedure en Java quedaría de la siguiente manera:

String result = endpoint.callProcedure(“Teste.p”, “suma”, params);

 

Donde params podría tener el siguiente valor:

[{"dataType":"integer","name":"value1","value":55,"type":"input"},
 {"dataType":"integer","name":"value2","value":99,"type":"input"},
 {"dataType":"integer","name":"result","value":0,"type":"output"}]

 

El retorno del método también es una Lista de ABLTO. En ese ejemplo el valor de la variable result sería:

[{"dataType":"integer","name":"result","value":154,"type":"output"}]

 

Ahora veremos un ejemplo de llamada a una procedure que recibe una temp-table como parámetro y devuelve el mismo poblado.

String result = endpoint.callProcedure(“Teste.p”, “getPaises”, params);

 

Donde params poseel a string JSON con la declaración de la siguiente TEMP-TABLE:

DEFINE TEMP-TABLE ttPais
   FIELD código AS CHARACTER LABEL Código
   FIELD nombre AS CHARACTER LABEL Nombre.

 

String JSON de la TEMP-TABLE ttPais:

[{"name":"ttPais",
  "type":"input-output",
  "dataType":"temptable",
  "value":{"name":"ttPais",
           "fields":[{"name":"código","label":"Código","type":"integer"},
                     {"name":"nombre","label":"Nombre","type":"character"}],
           "records":[]
          }
}]

 

El retorno puede ser el siguiente string JSON:

[{"name":"ttPais",
  "type":"input-output",
  "dataType":"temptable",
  "value":{"name":"ttPais",
           "fields":[{"name":"código","label":"Código","type":"integer"},
                     {"name":"nombre","label":"Nombre","type":"character"}],
           "records":[{"código":55,"nombre":"Brasil"},
                      {"código":1,"nombre":"USA"},
                      {"código":33,"nombre":"Italia"},
                      {"código":15,"nombre":"Canadá”}]
          }
}]

 

Para obtener el WSDL del servicio utilizar la siguiente URL:

 

		http://server:port/wsexecbo/WebServiceExecBO?wsdl

Donde server:port es el servidor y puerto de Datasul.

 

Ejemplo de Llamada al Servicio ExecBO a través de un Proceso en Fluig

A través de Fluig Studio registrar el servicio WSExecBO de acuerdo con los siguientes pasos:

a. A partir de la perspectiva Fluig seleccionar la tab Visualización de Servicio y luego Incluir Servicio de acuerdo con el gráfico 3.2.a.

Gráfico 3.2.a

 

b. Archive el nuevo servicio de manera similar al gráfico 3.2.b.

Gráfico 3.2.b

 

c. Seleccione la opción Consulta Servicio, para probar la comunicación con el WebServices ExecBO y listar las operaciones disponibles, como muestra el gráfico 3.2.c.

Gráfico 3.2.c

 

d. Cree un script para el evento de un proceso donde haya necesidad de obtener informaciones de una BO en Datasul. A continuación veremos un ejemplo para el evento afterTaskSave de un proceso.

function afterTaskSave(colleagueId,nextSequenceId,userList) {
   try {
      // Utiliza el ServiceManager para obtener una referencia al servicio.
      var serviceProvider = ServiceManager.getService('WSEXECBO');
      var serviceLocator = 
          serviceProvider.instantiate('com.totvs.framework.ws.execbo.service.WebServiceExecBO');
      var service = serviceLocator.getWebServiceExecBOPort();
           
      var params = new Array();
 
      // Prepara los parámetros de procedure para hacer llamada en Progress
      var param1 = new Object();
      param1.dataType = "integer";
      param1.name = "value1";
      param1.value = 55;
      param1.type = "input";
      params[0] = param1;
 
      var param2 = new Object();
      param2.dataType = "integer";
      param2.name = "value2";
      param2.value = 99;
      param2.type = "input";
      params[1] = param2;
 
      var param3 = new Object();
      param3.dataType = "integer";
      param3.name = "result";
      param3.type = "output";
      params[2] = param3;
 
      var jsonParams = JSON.stringify(params);
      log.info(">>> Parámetros de procedure:");
      log.info(jsonParams);
 
      // Hace login y recibe el token de autenticación
      var token = service.userLogin("framework", "ZnJhbWV3b3Jr=");
 
      // Llama a procedure pasando los parámetros y el token de autenticación.
      var resp = service.callProcedureWithToken(token, "testeProcedure.p", "soma", jsonParams);
 
      // Convierte el resultado a un objeto
      var respObj = JSON.parse(resp);
 
      // Presenta el resultado en el log.
      log.info(respObj[0].value);

   } catch (error) {
      log.error(error.message);
   }
}


    
  • Sem rótulos