martes, 28 de mayo de 2019

Como Programar en Progress 4gl, Leer archivo csv generar reporte y enviarlo por correo

Hola buen día amigos:


Esta semana me gustaría platicarles de un lenguaje que se llama Progress 4gl, es parte de los conocidos lenguajes de cuarta generación que son del año 1970 al 1980 que sobretodo están enfocados a lenguajes de bases de datos, he tenido la oportunidad de trabajar con Informix 4gl, Progress 4gl y un poco de ABAP que es también 4gl y es lenguaje en que se programa SAP.


La idea de este lenguaje es poder extraer de manera sencilla la información de bases de datos de negocios, por lo que su sintaxis es simple. 

Las palabras reservadas, sintaxis y ejemplos del lenguaje lo pueden encontrar en https://www.progress.com/documentationhttps://www.progress.com/papershttps://knowledgebase.progress.com/articles/Article/P182203

Veamos un ejemplo:


Objetivo del programa:


Leer un archivo csv de entrada de datos de números de parte, extraer de la base de datos del ERP de QAD, la descripción y la cantidad total de inventario, enviar los datos a un archivo y enviar por correo el reporte.

En este programa les voy a dar un consejo, las palabras reservadas o que son propias de cada lenguaje escribanlo en mayúsculas para que en caso de revisar su código después sea mas rápido de leer.


Primera parte definir variables


Los comentarios, que es el código que no queremos que considere el programa va entre /*cmmts */

/*Definición de variables*/
DEF VAR i              AS CHARACTER NO-UNDO.
DEF VAR vc-desc     AS CHARACTER NO-UNDO.
DEF VAR vc-subject AS CHARACTER NO-UNDO. 
DEF VAR lvc-email  AS CHARACTER NO-UNDO.
DEF VAR vd-qty      AS DECIMAL      NO-UNDO.
DEF VAR lvc-ofile    AS CHARACTER NO-UNDO INITIAL "/home/telqond/file_out.csv".
DEF VAR lvc-file  AS CHARACTER NO-UNDO INITIAL "/home/azamora/FA/DepreFA.csv".
DEF STREAM s-excel.  

/*area de librerias*/

 {us/mf/mfdtitle.i}

/*inicio del programa*/ 

OUTPUT STREAM s-excel TO VALUE(lvc-ofile) PAGE-SIZE 0.    
INPUT FROM VALUE(lvc-file).
    REPEAT:
    IMPORT DELIMITER "," i.
    vc-desc = "".
    /*buscar decripcion del item*/
    FOR FIRST pt_mstr WHERE pt_domain = global_domain 
                                   AND pt_part      = i NO-LOCK:
          vc-desc = pt_desc1 + pt_desc2.
    END.
    /*buscar inventario*/
   vd-qty = 0.
    FOR EACH in_mstr WHERE in_domain = global_domain 
                                    AND in_part      = i NO-LOCK:
          vd-qty = vd-qty + + in_qty_oh + in_qty_nonet .
    END.

    PUT STREAM s-excel UNFORMATTED  i  ","

           vc-desc ","
           vd-qty   ","
           SKIP.
  END. /*repeat*/
INPUT CLOSE.
OUTPUT STREAM s-excel CLOSE. 

lvc-email = "programacionparatodos@gamil.com".

vc-subject  = "test".

IF SEARCH(lvc-ofile) <> ? THEN DO:
   OS-COMMAND SILENT uuencode
   VALUE(lvc-ofile) VALUE(lvc-ofile)
   mailx -s value('"' + vc-subject + '" ' + TRIM(lvc-email)).
   DISPLAY "reporte enviado".
END.


Hay una instrucción que es muy poderosa y es el invocar comando del sistema operativo OS-COMMAND SILENT, donde le pasamos como entrada los comandos y parámetros en este caso el comando fue mailx, que nos permite enviar correos electrónicos y adjuntar archivos. 

Este programa no tiene ninguna salida a pantalla, ni tiene una pantalla para ingresar datos, pero si se fuera necesario se adiciona y de igual forma podemos agregar en la lista de crontab su ejecución como una tarea programada.


Como pueden ver no es un programa muy largo , las palabras reservadas son parecidas hablar ingles, pueden llamar a comandos del sistema operativo, pueden hacer búsquedas de datos de manera ágil, el motor de la base de datos en bueno.

Les comparto una pagina que tiene más información acerca de las funciones de Progress

https://progress-4gl.programmingpedia.net/

Espero les haya gustado este post y nos compartan, saludos y espero se animen a crear sus propios programas. 

jueves, 16 de mayo de 2019

Usos de python: leer XML y sumar nodos

Bienvenidos a otra semana de este blog, Python es hasta el momento el último lenguaje que he aprendido, les puedo decir que es muy sencillo de aprender es simple su lógica, sobretodo se utilizan funciones en librerías que ya existen, hay incluso varios memes que dicen el tiempo en definir qué quieres que haga el programa pero es más tiempo que tardas encontrando la librería correcta en Python.



Para aprender este lenguaje y tener un certificado, hice un curso en la plataforma de Coursera que se llama Python for everybody de la Universidad de Michigan consiste en 5 módulos, el Dr. que imparte el curso a mi gusto es el mejor maestro que he tenido Charle Severance tiene una forma muy simple de explicar las cosas complejas y da muchos ejemplos en el curso, todo está documentado en varios idiomas, inglés, francés, alemán, español, etc.., hay videos tambien de las clases, hay presentaciones de power point, exámenes, tareas prácticas y al finalizar cada módulo te otorgan un certificado de la universidad de Michigan con valor curricular.
Tambien hay APPS para aprender yo utilizo una que se llama Tutorial Python 3.0, me gusta porque son sesiones breves , te ponen ejercicios, hay duelos de programación, foros y puedes ejecutar los programas desde el celular y te otorga también un certificado.

Otra opción son cursos personalizados con https://debite.com.mx/ 


Bueno entrando a un ejemplo como hacemos en este blog, voy a realizar un ejemplo con Python 2.7 

Objetivo:Realizar programa que sume todos los saldos iniciales y finales por cuenta de un XML de  auxiliar de cuentas de Contabilidad Electrónica del SAT 

Programa:
import decimal
sumasaldofin = 0
sumasaldoin = 0
sumasaldodebe = 0
sumasaldohaber = 0

from lxml import etree
from xml.dom import pulldom
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges



parser = make_parser()
xmL = pulldom.parse('C:\Users\Ana Zamora\Desktop\XAXX0101010201808XC.xml')
for event, element in xml:
    if event == pulldom.START_ELEMENT and element.tagName == 'AuxiliarCtas:Cuenta' :
        sumasaldofin = decimal.Decimal(element.getAttribute('SaldoFin')) + sumasaldofin
        sumasaldoin  = decimal.Decimal(element.getAttribute('SaldoIni')) + sumasaldoin
print ("saldo fin",sumasaldofin,"saldoini", sumasaldoin)

Lo que hace es programa es que utilizamos las librerias lxml, xml.dom xml.sax, busca los nodos de XML AuxiliarCtas:Cuenta y los sub-nodos SaldoFin y SaldoIni, 
Este programa sirve para comprobar los datos del XML vs la Balanza contable, cualquier persona me diría pues igual eso lo haces en un Excel, pero resulta que el archivo que tenia  para realizar la comprobación tiene 3,481,919 líneas, pesa 507,161 KB, no se puede abrir en Excel por la cantidad de lineas, la ejecución del programa fue de 5.10 minutos
Lo que puedo decir es un programa muy sencillo de 20 lineas lo complicado en verdad fue encontrar las librerías correctas:

from lxml import etree
from xml.dom import pulldom
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges


Tiene mucha funcionalidad y que es muy rápido, para temas como BigData que manejan muchísima información es una muy buena herramienta, por algo es uno de los lenguajes más populares en empresas de tecnología como Google.

Ejecución del programa:
Aquí vemos la pantalla del resultado mostrando el valor de total.

Espero les haya sido de utilidad este blog y nos compartan, nos leemos en el próximo post.

viernes, 3 de mayo de 2019

Como Programar batch en MSDOS mover archivos de una PC a otra

Que tal amigos espero que se encuentren muy bien:

En este post, les quiero platicar acerca de un lenguaje de programación que en lo profesional me ha sacado de varios apuros, que son scripts de MS-DOS , si señores aun existe y sirve mucho jajajaja. En linux o unix tenemos batch que nos sirven para automatizar tareas en registro de archivos, limpieza de carpetas ,extraer información de bases de datos, etc., pues esto en Windows también se puede hacer y es con archivos .BAT en estos archivos podemos hacer uso de los comando de MS-DOS , que seguramente algunos ya ni conocen o recuerdan, bueno hace muchoooos años existía Windows 3.1 que era la versión gráfica de  MS-DOS que es más ni menos que el sistema operativo de Windows.

Los comando son las instrucciones con las que le hablamos al sistema operativo para que hagan ciertas tareas y nos devuelvan información.

Los comandos que más utilizo son :
  • Dir: listar los archivos y directorios de una carpeta
  • Move: mover un archivo de una carpeta a otra
  • Copy: copiar  un archivo de una carpeta a otra
  • Date: mostrar la fecha 
  • Time: mostrar la Hora
  • CD: moverse a un directorio
  • MKDIR: crear un directorio
Si quieren seguir aprendiendo comandos, les comparto la liga de un curso de la UNAM http://www.facmed.unam.mx/emc/computo/infomedic/presentac/modulos/modulo1/dos/framedos.htm

Ahora vamos hacer un ejemplo

Objetivo: crear un programa que mueva del un servidor de dedicado a un filserver, los archivos de la carpeta c:\facturas\RFC\2019\mayo a la carpeta c:\ar\2019\05 Mayo este programa debe funcionar para los próximos meses y años.

El código es
set Mth=%Date:~3,2%
echo %Mth%
set Day=%Date:~0,2%
echo %Day%
set Yr=%Date:~6,4%
:carpeta origen
set fol_org="C:\facturas\RFC\"%Yr%\%Mth%\%Day%
set ban1=0
if exist %fol_org% (set ban1=1) 
echo %fol_org%  %ban1%
:carpeta destino
set fol_des="Y:\"%Yr%\%Mth%\%Day%
echo %fol_des%
Y:
IF exist %fol_des%  ( echo %fol_des% exists) ELSE ( mkdir %fol_des% && echo %fol_des% created )
If %ban1% == 1 ( xcopy %fol_org% %fol_des% /o /x /e /h /k)
C:


Nota, la unidad Y es un mapeo de la ruta c:\ar\2019\05


Al finalizar vamos a crear una tarea programada en el servidor de origen para que se ejecute diario a las 11:59pm 



Espero les haya gustado y servido este post, gracias por compartirlo, si tienen dudas escriban sus comentarios. 

https://www.programacionparatodos.com