Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Duda] JSON en Cobol... (https://www.cobolforo.es/showthread.php?t=779)

Fito 7 de diciembre de 2017 18:44

JSON en Cobol...
 
1 Archivos Adjunto(s)
Hola Amigos:

Un cliente contrató un servicio web y para enviar y recibir datos (articulos, clientes, pedidos), tengo que utilizar una API que tienen y pasale y recibir parámetros en JSON. Adjunto un pdf con la explicación.

Mis conocimientos web son mínimos. Quisiera saber si alguien me puede ayudar como hacer esto.

Muchas Gracias.

Fito...

Fito 8 de diciembre de 2017 20:30

Hola:

Buscando encontré este aporte de Rapinto, me parece que acá está la forma o me equivoco.

[Aporte] Ligar ao Site da União Europeia VAT Number - COBOL Foro

Kuk 9 de diciembre de 2017 11:15

Fito, el JSON no es otra cosa que un formato definido. Sigue tratándose de datos en texto plano. En cuanto a la POST request, efectivamente, se puede adaptar los ejemplos que hay en el foro y hacerlas vía COM/OLE2. Así que, no te será fácil al principio, pero es, según yo, perfectamente realizable.

Fito 14 de diciembre de 2017 15:26

Hola Amigos:

Les cuento que gracias al ejemplo de Rapinto y un poco de google, logré comunicarme con la api. Ahora estoy esperando que me envíen un token valido para empezar a probar a full.

Cuando tenga todo listo, voy a subir un ejemplo.

Saludos.

Fito...

---------- Post añadido : 11:26 ---------- Post anterior : 21:14 ----------

Hola Amigos:

Ya logré comunicarme con el webservice, enviarle parámetros y recibir la respuesta.

Esa respuesta está en un json, ahora la tarea es "entender" ese json. Hacerlo en Cobol me parece muy complicado.

Buscando, buscando y buscando, me topé con esto.

[Aporte] Google Maps localización - COBOL Foro

Pregunto a lo mejor una burrada, porque estos temas todavía escapan a mi cerebro.

De acuerdo a este ejemplo, yo podría trabajar el json en javascript, donde tengo buen manejo de este tipo de dato, pasarlo a un txt tipo tabla, y esa funcion llamarla desde cobol. Estoy muy errado? después leería ese txt desde cobol y santo remedio.

Diagn que si, jajajajaja.

Saludos.

Fito...

Rapinto 15 de diciembre de 2017 01:00

Fito,

Não me parece muito complicado fazer uma rotina para abrir o ficheiro de texto
e tentar interpretar :
"PH_CODIGO": "02220160513111442",
"CL_CODIGO": "01554",
"PH_FECINI": "2016-05-13", .......

Se usares o unstring ou o perform varying ... talvez seja fácil, leres a informação que precisas.

Un Saludo,
Rui Pinto

Fito 15 de diciembre de 2017 15:54

Hola Rui:

Sé que se puede hacer con cobol, el tema es el tiempo. Hacer y probar una rutina para interpretar el JSON me va a llevar mucho tiempo, que no tengo. Hay que tener en cuenta niveles, arrays y todas esas cosas. Cuando otros lenguajes lo tienen solucionado de manera sencilla.

En windev, por medio de una función (JSONtoVariant()) lo pasas a un array tipo variant y después con bucles anidados vas sacando todo. Por eso hice un exe en windev, que me lea el JOSN que lo grabo en un archivo, lo proceso y lo meto en otro archivo ya con el formato tipo tabla para leerlo desde cobol, trabajarlo así tipo batch.

Te pego un ejemplo (esto es una pequeña prueba, tengo que desarrollarlo para darle formato de tabla al txt de salida).
Código WinDev:
  1. VP is Variant = JSONToVariant(sJson)
  2.  
  3. FileId = fCreate("d:\yeison\verpedidos.txt",foReadWrite)
  4.  
  5. FOR EACH m OF VP..Member
  6.     LineRead = m..Name
  7.     fWriteLine(FileId, LineRead)   
  8.     FOR EACH m2 OF m..Member
  9.         LineRead = "   --1--   " + m2..Name
  10.         fWriteLine(FileId, LineRead)
  11.         IF m2..Name = "cabecera" THEN
  12.             FOR EACH m3 OF m2..Member
  13.                 LineRead = "   --2--    "+m3..Name +":"+ m3..Value
  14.                 fWriteLine(FileId, LineRead)   
  15.             END
  16.         ELSE
  17.             FOR i = 1 TO m2..Occurrence
  18.                 FOR EACH m3 OF m2[i]..Member
  19.                     LineRead = "   --3--    "+m3..Name +":"+ m3..Value
  20.                     fWriteLine(FileId, LineRead)   
  21.                    
  22.                 END
  23.             END
  24.         END
  25.     END
  26. END
  27.  
  28. fClose(FileId)

Muchas gracias por los aportes. Sigo probando y cuando tenga todo listo posteo el resultado.

Saludos.

Fito...

AHidalgo 2 de junio de 2021 20:22

Ayuda: desde Power Cobol conectar a una API
 
Cita:

Citación del post de Fito (Mensaje 3813)
Hola Rui:

Sé que se puede hacer con cobol, el tema es el tiempo. Hacer y probar una rutina para interpretar el JSON me va a llevar mucho tiempo, que no tengo. Hay que tener en cuenta niveles, arrays y todas esas cosas. Cuando otros lenguajes lo tienen solucionado de manera sencilla.

En windev, por medio de una función (JSONtoVariant()) lo pasas a un array tipo variant y después con bucles anidados vas sacando todo. Por eso hice un exe en windev, que me lea el JOSN que lo grabo en un archivo, lo proceso y lo meto en otro archivo ya con el formato tipo tabla para leerlo desde cobol, trabajarlo así tipo batch.

Te pego un ejemplo (esto es una pequeña prueba, tengo que desarrollarlo para darle formato de tabla al txt de salida).
Código WinDev:
  1. VP is Variant = JSONToVariant(sJson)
  2.  
  3. FileId = fCreate("d:\yeison\verpedidos.txt",foReadWrite)
  4.  
  5. FOR EACH m OF VP..Member
  6.     LineRead = m..Name
  7.     fWriteLine(FileId, LineRead)   
  8.     FOR EACH m2 OF m..Member
  9.         LineRead = "   --1--   " + m2..Name
  10.         fWriteLine(FileId, LineRead)
  11.         IF m2..Name = "cabecera" THEN
  12.             FOR EACH m3 OF m2..Member
  13.                 LineRead = "   --2--    "+m3..Name +":"+ m3..Value
  14.                 fWriteLine(FileId, LineRead)   
  15.             END
  16.         ELSE
  17.             FOR i = 1 TO m2..Occurrence
  18.                 FOR EACH m3 OF m2[i]..Member
  19.                     LineRead = "   --3--    "+m3..Name +":"+ m3..Value
  20.                     fWriteLine(FileId, LineRead)   
  21.                    
  22.                 END
  23.             END
  24.         END
  25.     END
  26. END
  27.  
  28. fClose(FileId)

Muchas gracias por los aportes. Sigo probando y cuando tenga todo listo posteo el resultado.

Saludos.

Fito...

Estimados, les dejo la consulta para saber si pudieron resolver esto. Estoy con el mismo problema y no encuentro soluciones directas. Quiero desde Power Cobol conectarme a una API para bajar las ventas en la nube (me devuelve un json) e incorporarlas a mi sistema windows, ahora se hace manualmente y es una pérdida de tiempo.
Me podrán ayudar por favor?

Saludos
Ana

---------- Post añadido : 15:22 ---------- Post anterior : 12:32 ----------

@Kuk, Help!, me podrás ayudar? :nauf:

Saludos
Ana

Kuk 2 de junio de 2021 20:57

@AHidalgo, hola.
Qué problema tienes exactamente? Para descargar el JSON o parsearlo?

AHidalgo 2 de junio de 2021 21:33

@Kuk, hola, gracias por responder, empecemos desde el principio, probé algunas formas de conectarme a la API y aún no me funcionaron, si conoces alguna forma desde cobol directamente te lo agradecería.

Saludos
Ana

Kuk 2 de junio de 2021 23:21

@AHidalgo, nunca lo he hecho, pero creo que se podrá hacer de manera similar a esto: [Aporte] Ligar ao Site da União Europeia VAT Number - COBOL Foro

Aquí se trata de WSDL Soap, pasando por la clase COM de PowerCOBOL.

Tendrías que mirar ejemplos de cómo trabajar con JSON, pero al fin y al cabo sigue siendo una request HTTP también, o sea que debería funcionar.

Amigos, @Josber, @Nitzer, qué opináis?

Una vez el JSON obtenido, miraremos cómo parsearlo (creo recordar que hay bibliotecas en el foro, o lo mismo estudiamos cómo hacerlo por Java por ejemplo).

fastpho 3 de junio de 2021 02:30

@AHidalgo, Hola Ana , son pocos los datos que nos has dado , como para ayudarte , ni tampoco cuales son las metodos que has probado....
Pero tenes varias formas de hacerlo , para comunicarte con la api podes hacerlo via clase COM ( WinHttp.WinHttpRequest.5.1)

Te paso un ejemplo:
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2. *----------------------------------------------------------------------
  3. * Variables para el Objeto WinHttpRequest
  4. *----------------------------------------------------------------------
  5.  01  HttpJob           pic x(128) value "WinHttp.WinHttpRequest.5.1".
  6.  01  WinHttpReq        usage object reference OLE.
  7. *> POST , GET , PUT
  8.  01  TipoEnvio         pic x(4) value "POST".
  9. * Verdero o falso dependiendo si la comunicacion es asyn -  sync
  10.  01 OLE-TRUE           PIC 1(1)  BIT VALUE B"1".
  11.  01 OLE-FALSE          PIC 1(1)  BIT VALUE B"0".
  12.  
  13.  01 ServerName         pic x(256) value "http://contamen.com.ar/concursocobol/forerosdb.php".
  14.  01 JsonParametro      pic x(256) value '[{"Action":"LeeAllForero"}]'. *> PHP Pide parametros json
  15.  
  16.  01 status-resquest    pic  S9(9) COMP-5.
  17.  01 status-string      pic  x(256).
  18.  01 RespJson           pic  x(8192).
  19.  01 StringNull         pic  x value spaces.
  20. *
  21. * actualiza string que manda [{"fid":"5","fnombre":"emma","Action":"ActualizaForero","finfo":"estudiante","fcumple":"2006-12-06"}]  
  22. * insert    string que manda [{"fnombre":"Lisi Urbano Moyano","Action":"InsertarForero","finfo":"Docente","fcumple":"1963-08-04"}]
  23. *
  24.  
  25. *-------------------------------------------------
  26. * variables para json - script.control
  27. *-------------------------------------------------
  28.  01 jsCodigo         pic X(8192).
  29.  01 jsonArray        pic X(8192).
  30.  01 StringItemArray  pic x(256).
  31.  01 scriptFuncion    pic x(126) value "function js_arrayLength(a){if(a==null||a.length==null||a.length==undefined){return 0}else return a.length;}js_arrayLength(arr)".
  32.  01 CantidadArray    pic s9(9) comp-5.
  33.  01 ResultadoArray   pic X(8192).
  34.  
  35.  01 StringFuncion-Inicio. *> respuesta inicial del json
  36.     02                     pic x(4) value 'arr['.
  37.     02 Indice              pic 9(6).
  38.     02                     pic x(3) value ']["'.
  39.  
  40.  01 StringFuncion-Final.   *> respuesta final del json
  41.     02                     pic x(2) value '"]'.
  42.  
  43.  01 PropObjCodigo          pic x(3)  value 'fid'.        *> 4 enteros
  44.  01 PropObjNombre          pic x(7)  value 'fnombre'.    *> 50 string
  45.  01 PropObjCumple          pic x(7)  value 'fcumple'.    *> date formato aaaa-mm-dd
  46.  01 PropObjInfo            pic x(5)  value 'finfo'.      *> 200 string
  47.  
  48.  01 ArmoJson-General-Inicio.
  49.     02                     pic x(2) value '[{'.
  50.  01 ArmoJson-General-Final.
  51.     02                     pic x(2) value '}]'.
  52.      
  53. *-------------------------------------------------------------
  54.  
  55.  
  56. *--------------------------
  57. * variables para la tabla
  58. *---------------------------
  59.  01 CamposSalida-Codigo       pic x(4).
  60.  01 CamposSalida-Nombre       pic x(50).
  61.  01 CamposSalida-Cumple.
  62.     03 C-SG       pic xx.
  63.     03 C-AA       pic xx.
  64.     03 filler     pic x value "-".
  65.     03 C-MM       pic xx.
  66.     03 filler     pic x value "-".
  67.     03 C-DD       pic xx.
  68.  01 CamposSalida-Info         pic x(200).
  69.  01 LINEA-FECHA-AUX.
  70.     03 L1-D   PIC XX.
  71.     03 filler pic x value "/".        
  72.     03 L1-M   PIC XX.
  73.     03 filler pic x value "/".        
  74.     03 L1-S   PIC XX.
  75.     03 L1-A   PIC XX.
  76. *---------------------------  
  77. * indices
  78.  01 I                         pic 9(6).
  79.  01 W-ROW                     pic s9(9) comp-5.
  80. *-----------------------------------------
  81.  01  LINEA                           PIC X(1024).
  82.  01  OLE-ERROR-METHOD                 PIC X(256).
  83.  01  OLE-ERROR-INFO.                                                
  84.      03  OLE-ERROR-TYPE                  PIC X(001).                          
  85.      03  OLE-ERROR-WCODE                 PIC X(002).                          
  86.      03  ROLE-ERROR-WCODE REDEFINES OLE-ERROR-WCODE  PIC S9(04) COMP-5.
  87.      03  OLE-ERROR-SCODE                 PIC X(004).                          
  88.      03  ROLE-ERROR-SCODE REDEFINES OLE-ERROR-SCODE PIC S9(09) COMP-5.
  89.  PROCEDURE       DIVISION.
  90.  DECLARATIVES.
  91.  OLE-ERROR SECTION.    
  92.        USE AFTER EXCEPTION OLEEXCEPTION.                          
  93.             INVOKE EXCEPTION-OBJECT "GET-ERROR-TYPE"              
  94.                  RETURNING OLE-ERROR-TYPE.  
  95. *      display "OLE-ERROR-TYPE: " ,        OLE-ERROR-TYPE.    
  96.        IF OLE-ERROR-TYPE = "1"                                
  97.             INVOKE EXCEPTION-OBJECT "GET-SCODE"  RETURNING ROLE-ERROR-SCODE                
  98.             INVOKE EXCEPTION-OBJECT "GET-SCODE-TEXT"   RETURNING LINEA                        
  99.             MOVE LINEA TO OLE-ERROR-METHOD                  
  100.             GO TO ERROR-EXIT
  101.        ELSE                                              
  102.             INVOKE EXCEPTION-OBJECT "GET-WCODE"  RETURNING OLE-ERROR-WCODE                
  103.             INVOKE EXCEPTION-OBJECT "GET-SCODE"    RETURNING OLE-ERROR-SCODE  
  104. *           display "   OLE-ERR-WCODE: " , OLE-ERROR-WCODE
  105. *           display "   OLE-ERR-SCODE: " , OLE-ERROR-SCODE        
  106.             GO TO ERROR-EXIT.                
  107.  
  108.  OLE-ERROR-MANEJO.
  109.        EXIT.
  110.  END DECLARATIVES.
  111.  
  112.  
  113.  Programa Section.
  114.        
  115.  Comienzo.
  116. *---------------------------
  117. * Limpio Pantalla
  118.      move spaces to "Text" OF RESP-JSON.
  119.      move spaces to "Text" OF campo-estado.
  120.      move spaces to "Text" OF campo-registros.
  121.      INVOKE table2 "ClearTable".
  122.      INVOKE table2 "Refresh".    
  123.    
  124. *---------------------------
  125. * vacio la respuesta
  126. *    
  127.      INITIALIZE RespJson.
  128.      move spaces to RespJson.    
  129. *---------------------------
  130. * Establece como lenguaje "VBScript" or "JScript".
  131.      move "JScript" to "Language" OF ScriptControl1.
  132.    
  133.      
  134.      
  135. *-----------------    
  136.  INICIO-Peticion.
  137.  
  138.    
  139. *-----------------------------
  140. * Crea el objeto WinHttpRequest      
  141.      invoke OLE "CREATE-OBJECT"   using HttpJob returning WinHttpReq.
  142. *------------------------------
  143. * Open la  HTTP request.
  144.      invoke WinHttpReq  "OPEN" using   TipoEnvio ,  ServerName , ole-true.
  145. *---------------------------------------------------------------------------
  146.    
  147. *------------------------------    
  148. * Envia HTTP request.
  149.      invoke WinHttpReq  "send" using JsonParametro.
  150. *---------------------------------------------------------------------------
  151. *------------------------------    
  152. * Espera la respuesta completa
  153.      invoke WinHttpReq  "WaitForResponse" using  ole-true.
  154. *-------------------------------
  155.  
  156. *--------------------------------------------
  157. * Muesta Estado de comunicacion
  158.  
  159.      invoke WinHttpReq  "get-StatusText" returning status-string.
  160.      invoke WinHttpReq  "get-Status"     returning status-resquest.
  161.      move status-resquest to "Text" OF campo-estado.
  162.      INVOKE campo-estado "Refresh".
  163.    
  164. *     display "status de solicitud: "  , status-resquest
  165.      if status-resquest not = 200 then
  166. /        display "error"
  167.        exit program
  168.       end-if.
  169. *-------------------------------
  170. *   Recibe la respuesta Cabecera
  171.      invoke WinHttpReq  "GetAllResponseHeaders" returning RespJson.
  172. *Muestro la resp pura en el campo      
  173.      move RespJson to "Text" OF campo-cabecera.
  174.      INVOKE campo-cabecera "Refresh".
  175.  
  176. *-------------------------------------------------------------------
  177. *   Recibe la respuesta en formato json segun lo solicitado
  178.      invoke WinHttpReq  "get-ResponseText" returning RespJson.
  179. *-------------------------------
  180. * Libera el objeto creado
  181.      set WinHttpReq            to null.
  182.  
  183. *-----------------------------------------------------------------
  184. *Muestro la resp pura en el campo      
  185. *Analizamos el Json con scriptcontrol.
  186.      move RespJson to "Text" OF RESP-JSON.
  187.      INVOKE RESP-JSON "Refresh".
  188.  
  189.  FIN-Peticion.      
  190.  
  191.  
  192.  PROCESO-Json.
  193.    
  194. *----------------------------------------------------------------------------
  195. * Verifico la cantidad de array en la RespJson
  196. *     CantidadArray
  197. *     devuelve la cantidad de registros en el json
  198.  
  199.      move RespJson to jsonArray.
  200.      perform Funcion-getArrayLenght thru END-Funcion-getArrayLenght.
  201. *----------------------------------------------
  202. * Muestro la cantidad de registros devueltos
  203. *----------------------------------------------
  204.      move CantidadArray to    "Text" OF campo-registros.
  205.      INVOKE campo-registros "Refresh".
  206. *----------------------------------------------------------------------------    
  207. *indice tabla2.
  208.      MOVE 1 TO W-ROW.
  209. *----------------------------------------------------------------------------
  210. * Leo los registros de array en la RespJson
  211. * de acuerdo a la CantidadArray
  212.      move 0              to Indice.
  213.      PERFORM VARYING I FROM 1 BY 1 UNTIL I > CantidadArray
  214. *         *> Primer Obj Codigo  
  215.          move    spaces               to StringItemArray
  216.          string  StringFuncion-Inicio delimited by size
  217.                  PropObjCodigo        delimited by size
  218.                  StringFuncion-Final  delimited by size
  219.                  into StringItemArray
  220.          perform   Funcion-getArrayItem thru END-Funcion-getArrayItem  
  221.         move ResultadoArray to CamposSalida-Codigo
  222.  
  223.  
  224.        
  225. *         *> Segundo Obj Nombre
  226.          move    spaces               to StringItemArray          
  227.          string  StringFuncion-Inicio delimited by size
  228.                  PropObjNombre        delimited by size
  229.                  StringFuncion-Final  delimited by size
  230.                  into StringItemArray
  231.          perform   Funcion-getArrayItem thru END-Funcion-getArrayItem  
  232.          move ResultadoArray to  CamposSalida-Nombre
  233.  
  234. *         *> Tercer Obj Fecha
  235.          move    spaces               to StringItemArray          
  236.          string  StringFuncion-Inicio delimited by size
  237.                  PropObjCumple        delimited by size
  238.                  StringFuncion-Final  delimited by size
  239.                  into StringItemArray
  240.          perform   Funcion-getArrayItem thru END-Funcion-getArrayItem  
  241.          move ResultadoArray to  CamposSalida-Cumple        
  242.          move C-SG TO L1-S
  243.          MOVE C-AA TO L1-A
  244.          MOVE C-MM TO L1-M
  245.          MOVE C-DD TO L1-D
  246.        
  247.  
  248. *         *> Cuartto Obj Informacion
  249.          move    spaces               to StringItemArray          
  250.          string  StringFuncion-Inicio delimited by size
  251.                  PropObjInfo        delimited by size
  252.                  StringFuncion-Final  delimited by size
  253.                  into StringItemArray
  254.          perform   Funcion-getArrayItem thru END-Funcion-getArrayItem  
  255.          move ResultadoArray to  CamposSalida-Info                
  256.          
  257.  
  258.           add 1 to  Indice
  259. *        
  260.                MOVE CamposSalida-Codigo               TO POW-TEXT(W-ROW 1) OF TABLE2
  261.                MOVE CamposSalida-Nombre               TO POW-TEXT(W-ROW 2) OF TABLE2
  262.                MOVE LINEA-FECHA-AUX               TO POW-TEXT(W-ROW 3) OF TABLE2
  263.                MOVE CamposSalida-Info                 TO POW-TEXT(W-ROW 4) OF TABLE2
  264.                ADD 1 TO W-ROW
  265.  
  266.      END-PERFORM.
  267. *
  268. *
  269.  FIN-PROCESO-Json.
  270.  
  271.  TERMINO.
  272.      exit program.    
  273.    
  274. *------------------------------------------------------------------    
  275.  Funcion-getArrayLenght. *> funcion devuelve la cantidad de arrays
  276. *------------------------------------------------------------------
  277. * determina la cantidad de array's
  278.       move zeros  to CantidadArray.
  279.       move spaces to jsCodigo.
  280.  
  281.  
  282.       string "var arr = "
  283.              jsonArray delimited by size into jsCodigo.
  284.       INVOKE ScriptControl1 "ExecuteStatement" USING jsCodigo.
  285.  
  286.       INVOKE ScriptControl1 "Eval" USING scriptFuncion RETURNING CantidadArray.
  287.  
  288.        
  289.  END-Funcion-getArrayLenght. EXIT.
  290. *getSimpleArrayItem    
  291. *---------------------------------------------------------------------------------------
  292.  Funcion-getArrayItem. *> lee los datos del array de acuerdo a la propiedad solicitada
  293. *---------------------------------------------------------------------------------------
  294.  
  295.        move spaces to jsCodigo.
  296.        move spaces to ResultadoArray.
  297.  
  298.        string "var arr = "
  299.              jsonArray delimited by size into jsCodigo
  300.  
  301.        INVOKE ScriptControl1 "ExecuteStatement" USING jsCodigo
  302.        INVOKE ScriptControl1 "Eval" USING StringItemArray     RETURNING ResultadoArray.
  303.  
  304.      
  305.  END-Funcion-getArrayItem. EXIT.
  306. *------------------------------------------------------------------
  307.  
  308.  
  309.  
  310.  
  311.  ERROR-EXIT.
  312.      exit PROGRAM.

y la otra para comunicarte puede ser via el control ScriptControl , luego para parsear el JSON que devuelve la api lo lees con la libreria ocx de chilkat

Te paso un ejemplo:
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01 scriptCode                      pic x(32768).
  3.  01 script redefines scriptCode.
  4.     03 scriptCode1                  pic x(8192).
  5.     03 scriptCode2                  pic x(8192).
  6.     03 scriptCode3                  pic x(8192).
  7.     03 scriptCode4                  pic x(8192).
  8.  01 vbCRLF                          pic x(2) value X"0D0A".
  9.  01 Estado                          pic s9(5) comp-5 VALUE ZEROS.        
  10.  
  11.  01 ReturnValue               pic s9(5) comp-5 VALUE ZEROS.    
  12.  01 CantidadOBJ               pic s9(9) comp-5 VALUE ZEROS.
  13.  
  14.  01 IndiceArray               pic s9(9) comp-5 VALUE ZEROS.
  15.  01 Indice                    pic 9(6).  
  16. ****************
  17. * campos array
  18. ****************
  19.  01 ObjuserId                 pic X(4).
  20.  01 ObjId                     pic X(4).
  21.  01 ObjTitle                  pic X(50).
  22.  01 ObjCompleted              pic X(5).
  23.  
  24.  
  25.  01 ObJsolicitar              pic x(200).
  26. *01 ObjCampo                  pic x(30).
  27. * [url=https://www.chilkatsoft.com/refdoc/xChilkatJsonObjectRef.html]JsonObject ActiveX Reference Documentation[/url]
  28.  01 POW-PCMLIST OBJECT REFERENCE POW-CLISTITEM.
  29.  01 WK-IDX PIC S9(9) COMP-5.
  30.  
  31.  PROCEDURE       DIVISION.
  32. *---------------------------------------------------------------
  33. * LEO usando script
  34.      
  35.       INVOKE pow-self "ThruEvents".
  36.       move  11 to  "MousePointer" OF pow-self.
  37.       move pow-true  to "Visible" OF CmStatic30.
  38.  
  39.      
  40.       move   "VBScript"              to  "Language" OF scriptControl1  *> default script language
  41.       move   spaces                  to  scriptCode
  42.  
  43.             string
  44.                            ' Dim RespJson                                                       ' vbCRLF *>variables globales
  45.                            ' Dim Estado                                                         ' vbCRLF *>variables globales
  46.                            '   Sub FuncionLeer()                                                ' vbCRLF
  47.                            '        Dim RespEstado , jsonresp                                   ' vbCRLF    
  48.                            '        set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") ' vbCRLF
  49.                            '        Set fso=CreateObject("Scripting.FileSystemObject")          ' vbCRLF
  50.                            '        Set Fic = fso.OpenTextFile("ejemplojson.txt", 8, True)      ' vbCRLF *>creo el archivo
  51.                            '                                                                    ' vbCRLF
  52.                            '     WinHttpReq.Open "GET", "https://jsonplaceholder.typicode.com/todos", False ' vbCRLF *> url
  53.                            '                                                                    ' vbCRLF                          
  54.                            '     WinHttpReq.Send()                                              ' vbCRLF        
  55.                            '     WinHttpReq.WaitForResponse()                                   ' vbCRLF
  56.                            '     jsonresp = WinHttpReq.ResponseText                             ' vbCRLF
  57. *                          '          msgbox jsonresp                                           ' vbCRLF
  58.                            '         RespEstado =  WinHttpReq.Status                            ' vbCRLF
  59.                            '         Estado   =  RespEstado                                     ' vbCRLF
  60.                            '      RespJson = jsonresp '  vbCRLF
  61.                            '      RespJson = "{""Objeto"":" & RespJson & "}"                    ' vbCRLF *>agrego un objeto a la resp
  62.                            '     fic.Writeline(RespJson)                                        ' vbCRLF *> escribo las respjson en el archivo
  63.                            '     fic.Close()                                                    ' vbCRLF *> cierro el archivo
  64.                            '   End Sub                                                          ' vbCRLF                  
  65.                      delimited by size into scriptCode1
  66.                end-string    
  67.  
  68.  
  69.       INVOKE scriptControl1 "Reset".
  70.      
  71.       invoke scriptControl1 "AddCode" using scriptCode.
  72.  
  73.       invoke scriptControl1 "ExecuteStatement" using "FuncionLeer".
  74.  
  75.       invoke scriptControl1 "Eval" using "Estado" returning Estado.      
  76.  
  77.       move  0 to  "MousePointer" OF pow-self
  78.       move pow-false  to "Visible" OF CmStatic30.
  79.       move Estado to "Text" OF campo-estado.
  80.  
  81.  
  82. *--------------------
  83. * anda perfecto leyendo un archivo con un object = {"objeto":[.......]}
  84.       INVOKE ChilkatJsonObject1 "LoadFile" USING "C:\fsc5\winhttpDemoElsis\ejemplojson.txt" RETURNING ReturnValue
  85. *      display "resultado load:" , ReturnValue
  86.       if ReturnValue not = 1 then
  87.            INVOKE pow-self "DisplayMessage" USING "error"
  88.            exit program
  89.       end-if.
  90.      
  91.       move  "Size" OF ChilkatJsonObject1 to CantidadOBJ.
  92.    
  93. *      display "ChilkatJsonObject1 size Objeto:" , CantidadOBJ.
  94.  
  95.  
  96.       INVOKE ChilkatJsonObject1 "SizeOfArray" USING "Objeto" RETURNING IndiceArray
  97.      
  98. *      display "IndiceArray: " , IndiceArray.
  99.       move IndiceArray      to  "Text" OF campo-registros.
  100.      
  101.      
  102. ***********************************
  103. * busco un registro x
  104. *arranca desde 0 el primer registro      
  105.  
  106.            move 149  to Indice.
  107.            MOVE SPACES TO ObJsolicitar
  108.            STRING "Objeto["    delimited by size
  109.                   Indice       delimited by size
  110.                   "]"          delimited by size
  111.                   "."          delimited by size
  112.                   "userId"     delimited by size              
  113.                   into ObJsolicitar
  114.                  
  115.            END-STRING
  116.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar  RETURNING ObjuserId.
  117.            
  118.            MOVE SPACES TO ObJsolicitar                      
  119.            STRING "Objeto["    delimited by size
  120.                   Indice       delimited by size
  121.                   "]"          delimited by size
  122.                   "."          delimited by size
  123.                   "id"         delimited by size              
  124.                   into ObJsolicitar
  125.                  
  126.            END-STRING.
  127.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjId.
  128.  
  129.            MOVE SPACES TO ObJsolicitar                      
  130.            STRING "Objeto["    delimited by size
  131.                   Indice       delimited by size
  132.                   "]"          delimited by size
  133.                   "."          delimited by size
  134.                   "title"      delimited by size              
  135.                   into ObJsolicitar
  136.                  
  137.            END-STRING
  138.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjTitle.
  139.  
  140.            MOVE SPACES TO ObJsolicitar                      
  141.            STRING "Objeto["    delimited by size
  142.                   Indice       delimited by size
  143.                   "]"          delimited by size
  144.                   "."          delimited by size
  145.                   "completed"  delimited by size              
  146.                   into ObJsolicitar
  147.                  
  148.            END-STRING.
  149.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjCompleted.
  150.            
  151.  MUESTRO-REGISTRO-X.
  152.            MOVE ObjuserId    TO  "Text" OF CmText1.
  153.            MOVE ObjId        TO  "Text" OF CmText2.
  154.            MOVE ObjTitle     TO  "Text" OF CmText3.
  155.            MOVE ObjCompleted TO  "Text" OF CmText4.
  156.            
  157.  
  158. *
  159. *
  160.  
  161. *
  162. *
  163. *        
  164.  MUESTRO-TODOS-REGISTROS.
  165.        move ZEROS to Indice.
  166.        PERFORM VARYING Indice FROM Indice BY 1 UNTIL Indice = IndiceArray
  167.            INVOKE CMLISTVIEW1 "Add" USING 1 1 RETURNING WK-IDX          
  168.  
  169.            MOVE SPACES TO ObJsolicitar
  170.            STRING "Objeto["   delimited by size
  171.                   Indice      delimited by size
  172.                   "]"         delimited by size
  173.                   "."         delimited by size
  174.                   "userId"    delimited by size              
  175.                   into ObJsolicitar
  176.                  
  177.            END-STRING
  178.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar  RETURNING ObjuserId
  179.  
  180.            MOVE SPACES TO ObJsolicitar                      
  181.            STRING "Objeto["   delimited by size
  182.                   Indice      delimited by size
  183.                   "]"         delimited by size
  184.                   "."         delimited by size
  185.                   "id"        delimited by size              
  186.                   into ObJsolicitar
  187.                  
  188.            END-STRING
  189.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjId
  190.  
  191.            MOVE SPACES TO ObJsolicitar                      
  192.            STRING "Objeto["   delimited by size
  193.                   Indice      delimited by size
  194.                   "]"         delimited by size
  195.                   "."         delimited by size
  196.                   "title"     delimited by size              
  197.                   into ObJsolicitar
  198.                  
  199.            END-STRING
  200.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjTitle
  201.  
  202.            MOVE SPACES TO ObJsolicitar                      
  203.            STRING "Objeto["   delimited by size
  204.                   Indice      delimited by size
  205.                   "]"         delimited by size
  206.                   "."         delimited by size
  207.                   "completed" delimited by size              
  208.                   into ObJsolicitar
  209.                  
  210.            END-STRING
  211.            
  212.            INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjCompleted
  213.            IF WK-IDX > 0 THEN
  214.             MOVE "ListItems"(WK-IDX) OF CMLISTVIEW1   TO POW-PCMLIST
  215.             MOVE ObjuserId      TO "Text"(1) OF POW-PCMLIST
  216.             MOVE ObjId          TO "Text"(2) OF POW-PCMLIST
  217.             MOVE ObjTitle       TO "Text"(3) OF POW-PCMLIST      
  218.             MOVE ObjCompleted   TO "Text"(4) OF POW-PCMLIST
  219.  
  220.             INVOKE CMLISTVIEW1 "Refresh"
  221.            END-IF
  222.                    
  223.            
  224.        end-perform.
Saludos

AHidalgo 3 de junio de 2021 17:08

@Kuk, Gracias!!, pruebo con eso.
Saludos
Ana

Kuk 3 de junio de 2021 23:49

@AHidalgo, échale un vistazo al ejemplo de @fastpho, me parece que es justo lo que necesitas ;)

AHidalgo 4 de junio de 2021 00:29

@fastpho, Gracias!!!, sigo probando la conexion con la API, el proveedor no brinda soporte, hay que arreglarse como se pueda.
Pruebo con esto que me pasas y sino les vuelvo a preguntar, mil gracias!!

Saludos
Ana

Josber 7 de junio de 2021 11:55

Cita:

Citación del post de Kuk (Mensaje 6721)
Amigos, @Josber, @Nitzer, qué opináis?

Hola a todos, antes de nada, perdón por la tardanza pero, tengo las cosas complicadas y no puedo aparecer mucho por aquí, solo lo justo para leer lo nuevo y poco más.

A ver, no he tocado JSON, pero yo creo que tienes razón @Kuk, una vez obtenido, lo difícil es el parseo y, supongo que habrán librerías gratuitas para hacerlo, al igual que las habrán para, por ejemplo, los archivos XML

Un salu2.-

AHidalgo 10 de junio de 2021 17:08

@Kuk, @fastpho, gracias ambos por su ayuda!, luego de muuuchas pruebas con la API RestFull del proveedor y de mucho dolor de cabeza, por una lado encontré que la API esta muy mal hecha, tiene muchos errores que no se capturan, incluido cuando una consulta no tiene datos :cens:
Desde la conexión a la API que ni siquiera funciona con cualquiera de los soft que se prueban normalmente las APIs, solamente con la pagina que ellos proveen para pruebas.
Por todo lo ante dicho, la única forma que encontré que funciona es:
- desde Power Cobol ejecuto un control CmDDE1 con el nombre del archivo BAT.
- previo haber generando el bat con un CURL con todos los parámetros solicitados,
- me devuelve el token en un texto plano, lo leo desde Power Cobol y guardo.
- genero otro bat con el token y la consulta que necesito,
- ejecuto nuevamente el bat con un CmDDE1 y guardo en otro archivo plano la respuesta y el estado de la respuesta por si el token caducó y debo generarlo nuevamente.

En este punto estoy intentando generar una función que me desglose el JSON de la respuesta (parseo) para guardar los datos en formato cobol.

Por casualidad, tienen alguna rutina o función que haga esto?, pregunto para no inventar la rueda.
No puedo usar otros soft que lo hagan porque hasta donde he visto son pagos o versión Trial y no me sirve pues esto lo tengo que instalar luego en mi cliente.

Quedo al pendiente de sus sugerencias!
Saludos
Ana

Kuk 10 de junio de 2021 17:28

Cita:

Citación del post de AHidalgo (Mensaje 6750)
solamente con la pagina que ellos proveen para pruebas

No será problema de que el servidor tiene restricción de interrogación de la API para evitar ataques? Es una medida de seguridad estándar, deshabilitarlo por defecto y dar acceso expresamente a tal o tal IP.

Cita:

Citación del post de AHidalgo (Mensaje 6750)
tienen alguna rutina o función que haga esto?

Has visto esto? [Aporte] Código para recibir archivo json y leerlo - COBOL Foro

AHidalgo 10 de junio de 2021 21:00

@Kuk, no lo había visto, gracias!, estuvo mirando las herramientas de chilkatsoft pero son pagas, ahora me fijo lo que pone @fastpho.

Saludos
Ana

AHidalgo 2 de julio de 2021 00:42

1 Archivos Adjunto(s)
@Kuk, @fastpho, hola nuevamente, aquí estoy de vuelta (luego de una gripe familiar), he estado probando con el ActiveX de Chilkat viendo el ejemplo pero no logro que me levante ni la cantidad en array.
Adjunto un ejemplo del JSON que tengo que parsear. En la prueba que hice adapté los texto de acuerdo a mi estructura de datos pero no logré que me levante lo que necesito.
Me podrán ayudar?

Saludos
Ana

AHidalgo 2 de julio de 2021 19:23

Estimados, desestimen, ya esta resuelto, a veces un buen sueño soluciona todo. :duerme:

Saludos
Ana

Nitzer 2 de julio de 2021 22:07

El json, como el xml, al final son archivos de texto, como decía @Kuk con un formato establecido, lo que toda la vida hemos llamado "chorizos".
Nosotros los coboleros tenemos la suerte que no hemos necesitado de esos formatos ya que podíamos "mapearlos" con variables.
De hecho yo sigo utilizándolo y con bases de datos :).

Para la comunicación no os puedo ayudar, en mi equipo tengo gente experta en .net y yo lo que hago es generar el fichero, se lo paso a ellos (me hacen un exe) y me devuelven un valor 0,1 indicando si ha sido todo correcto o no :)


La franja horaria es GMT +2. Ahora son las 15:21.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.