Crear Archivo XML desde Progress 4gl
Bienvenidos a otra semana en nuestro blog de programación, les quiero compartir un ejemplo de como crear un archivo XML desde Progress 4gl, esto es necesario en casos de comunicación con otros sistemas.
OUTPUT STREAM sat-cat TO VALUE(vc-file) PAGE-SIZE 0
CONVERT SOURCE "ISO8859-1" TARGET "UTF-8".
/* Headers */
FOR FIRST tablesat_mstr WHERE tablesat_code = "001" NO-LOCK:
PUT STREAM sat-cat UNFORMATTED
"<?xml version=" + QUOTER("1.0") + " encoding=" +
QUOTER("UTF-8") + "?> "
SKIP.
PUT STREAM sat-cat UNFORMATTED
"<catalogocuentas:Catalogo xsi:schemaLocation=" +
QUOTER(tablesat_loc) +
" xmlns:xsi=" + QUOTER(sat_xsi) +
" Version=" + QUOTER(sat__qad1) +
" RFC=" + QUOTER(vc-rfc) +
" Mes=" +
QUOTER(FILL("0", 2 - LENGTH(STRING(periodo))) +
STRING(periodo)) +
" Anio= " + QUOTER(STRING(Anio)) +
" xmlns:catalogocuentas=" + QUOTER(sat_doc) + ">"
SKIP.
END. /* FOR FIRST tablesat_mstr WHERE tablesat_code = "001"NO-LOCK: */
/* Details XML */
FOR EACH tablesat2_mstr WHERE tablesat2_rfc = vc-rfc:SCREEN-VALUE AND
tablesat2_active = true NO-LOCK:
vc_account = "".
vc_account = REPLACE(tablesat2_desc, "&", "") .
vc_account = REPLACE(vc_account, "%", "") .
PUT STREAM sat-cat UNFORMATTED
"<catalogocuentas:Ctas CodAgrup=" +
QUOTER(sat2_cod_agrup) +
" NumCta=" + QUOTER(CAPS(sat2_acct)) +
" Desc=" + QUOTER(vc_account) +
" Nivel=" + QUOTER(STRING(sat2_level)) +
" Natur=" + QUOTER(CAPS(sat2_origin)) + "/>"
SKIP.
END. /* FOR EACH sat2_mstr NO-LOCK: */
PUT STREAM sat-cat UNFORMATTED
"</catalogocuentas:Catalogo>"
SKIP.
OUTPUT STREAM sat-cat CLOSE.
Como Hacer funciones en Progress
Primero que es un archivo XML son siglas de Extensible Markup Language , es un lenguaje que maneja etiquetas para definir la estructura de un layout para comunicar información, almacenar información y que se definan las reglas o características de la información para siempre hablar en los mismos término.
Para poder leer un XML siempre tendremos su contrapartida que es un XSD que nos sirve para definir la longitud de los campos, el tipo de campo si es carácter, entero o decimal.
Por ejemplo en México que tenemos el tema de facturación/complementos de facturación y contabilidad electrónicos para integrar la información al SAT esta institución entrega la definición del XML, por ejemplo el documento se ve así como las siguientes imágenes
La explicación en diagrama
Ejemplo
El objetivo del XML es que sea fácil de leer y de programar, veamos un ejemplo de como generar un archivo XML desde Progress 4gl
Primero un XML es un archivo con texto así que en Progress como generar un CSV es decir se trata igual como un archivo plano, la diferencia es como ir tratando las etiquetas, les voy a enseñar parte de un programa para generar el XML de Cuentas para contabilidad Electrónica
CONVERT SOURCE "ISO8859-1" TARGET "UTF-8".
/* Headers */
FOR FIRST tablesat_mstr WHERE tablesat_code = "001" NO-LOCK:
PUT STREAM sat-cat UNFORMATTED
"<?xml version=" + QUOTER("1.0") + " encoding=" +
QUOTER("UTF-8") + "?> "
SKIP.
PUT STREAM sat-cat UNFORMATTED
"<catalogocuentas:Catalogo xsi:schemaLocation=" +
QUOTER(tablesat_loc) +
" xmlns:xsi=" + QUOTER(sat_xsi) +
" Version=" + QUOTER(sat__qad1) +
" RFC=" + QUOTER(vc-rfc) +
" Mes=" +
QUOTER(FILL("0", 2 - LENGTH(STRING(periodo))) +
STRING(periodo)) +
" Anio= " + QUOTER(STRING(Anio)) +
" xmlns:catalogocuentas=" + QUOTER(sat_doc) + ">"
SKIP.
END. /* FOR FIRST tablesat_mstr WHERE tablesat_code = "001"NO-LOCK: */
/* Details XML */
FOR EACH tablesat2_mstr WHERE tablesat2_rfc = vc-rfc:SCREEN-VALUE AND
tablesat2_active = true NO-LOCK:
vc_account = "".
vc_account = REPLACE(tablesat2_desc, "&", "") .
vc_account = REPLACE(vc_account, "%", "") .
PUT STREAM sat-cat UNFORMATTED
"<catalogocuentas:Ctas CodAgrup=" +
QUOTER(sat2_cod_agrup) +
" NumCta=" + QUOTER(CAPS(sat2_acct)) +
" Desc=" + QUOTER(vc_account) +
" Nivel=" + QUOTER(STRING(sat2_level)) +
" Natur=" + QUOTER(CAPS(sat2_origin)) + "/>"
SKIP.
END. /* FOR EACH sat2_mstr NO-LOCK: */
PUT STREAM sat-cat UNFORMATTED
"</catalogocuentas:Catalogo>"
SKIP.
OUTPUT STREAM sat-cat CLOSE.
Ejecución del programa nos crea el siguiente archivo
Este es solo un ejemplo, pero puede funcionar para comunicar 2 sistemas diferentes, enviar información entre usuarios y un tip para leer el XML en modo tabla , pueden abrirlo en Excel, lo que hago es arrastrar el archivo XML a una ventana de Excel y me pregunta como quiero abrir el archivo, selecciono XML como tabla
Espero les sea de utilidad y les recomiendo leer también el POST dentro de este mismo blog acerca de como leer XML con Python
https://www.programacionparatodos.com/2019/05/programapython.html
https://www.programacionparatodos.com/2019/05/programapython.html
También si quieren ver más programas en Progress 4gl les comparto las ligas
Como utilizar ACCUM en Progress como SUM de SQL
Como Hacer vectores dinámicos en Progress
Como importar un archivo XML en progress 4gl para leer su información???
ResponderBorrarHola para leerlo es un input file y lRetOK = hDSet:READ-XML(cSourceType, cFile, cReadMode, cSchemaLocation,
ResponderBorrarlOverrideDefaultMapping, cFieldTypeMapping, cVerifySchemaMode).
Mira la ayuda de Progress
https://docs.progress.com/bundle/openedge-abl-reference-117/page/READ-XML-method.html