jueves, 16 de mayo de 2019

Programa_Python

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 lo complicado en verdad fue encontrar las librerías correctas, en cuanto lineas de código, pero que 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.



viernes, 3 de mayo de 2019

Programa_batch_MSDOS

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 /e %fol_org%"\*.* " %fol_des%)
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. 

viernes, 26 de abril de 2019

Programar en VB en una Macro de Excel

En la paqueteria de Offices de Microsoft se puede  realizar programas para automatizar tareas, estos son Macros hay forma de guardar comandos sencillos en Excel o escribir programas que hagan tareas más específicas, como por ejemplo generar un archivo de salida con nuevos datos o un reporte.

Las macros se programan con Visual Basic que es el lenguaje de programación.

Veamos un ejemplo, primero el objetivo del programa es generar un archivo CSV (comma-separated values) que son archivos separados por comas que cumpla con la estructura de un archivo que queremos utilizar en otro sistema.

  • Primero habilitamos la pestaña de Desarrollador, para ello vamos al menú, Archivo-Opciones-Personalización Barra-Desarrollador 
  • Vamos agregar  un botón en una hoja de Excel, seleccionamos el botón insertar y elegimos del parte de ActiveX

  • Damos doble click sobre el botón creado o tambien pueden seleccionar las teclas ALT+F11

Nos abrirá una nueva pantalla, aquí es donde comenzaremos a programar nuestra macro
Nuestro programa es el siguiente:


Private Sub CommandButton1_Click()
Dim Fila, fila2, cont As Integer
Dim rngOrigen As Excel.Range

Hoja3.Rows("1:65500").Clear

Fila = 19
fila2 = 1
cont = 1
Do While Hoja2.Cells(Fila, "A") <> ""


Hoja3.Cells(fila2, "a") = Hoja2.Cells(Fila, "a") 'UUID
Hoja3.Cells(fila2, "b") = Hoja2.Cells(Fila, "b") 'Monto factura
Hoja3.Cells(fila2, "c") = Hoja2.Cells(Fila, "i") 'RFC-emisor
Hoja3.Cells(fila2, "d") = Hoja2.Cells(Fila, "d") 'Moneda
Hoja3.Cells(fila2, "e") = Hoja2.Cells(Fila, "e") 'Tasa cambio
If Hoja3.Cells(fila2, "e") = "" Then Hoja3.Cells(fila2, "e") = 1
Hoja3.Cells(fila2, "f") = "|" + Hoja2.Cells(Fila, "f") + Hoja2.Cells(Fila, "g")  'Numero factura, serie +a folio
Hoja3.Cells(fila2, "g") = Format(Hoja2.Cells(Fila, "h"), "MM/DD/YYYY")     'fecha facura
Hoja3.Cells(fila2, "h") = " "                   'codigo proveedor
Hoja3.Cells(fila2, "i") = Hoja2.Cells(Fila, "c")   'rfc_receptor
Hoja3.Cells(fila2, "j") = " "                   'nombre del proveedor
Hoja3.Cells(fila2, "k") = Hoja1.Cells(5, "b")   ' domnio
Hoja3.Cells(fila2, "l") = Hoja1.Cells(6, "b")   ' entidad
Hoja3.Cells(fila2, "m") = " "   ' poliza


Fila = Fila + 1
fila2 = fila2 + 1
Loop

Call copiarHOjaaLibroNuevo
End Sub


Sub copiarHOjaaLibroNuevo()
mio = ActiveWorkbook.Name
nombre = Sheets(2).Range("B3").Value
Workbooks.Add
otro = ActiveWorkbook.Name
Workbooks(mio).Activate
' Sheets("Hoja1").Range("a5").Copy after:=Workbooks(otro).Sheets("Hoja1").Range("a1")
Sheets(3).Copy after:=Workbooks(otro).ActiveSheet
Application.DisplayAlerts = False
Workbooks(otro).Sheets(1).Delete
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Replace(nombre, "/", ""), FileFormat:=xlCSV
Application.DisplayAlerts = False
ActiveWorkbook.Close False

End Sub


Vamos a desmenuzar el programar :

Private Sub CommandButton1_Click()
Dim Fila, fila2, cont As Integer
Dim rngOrigen As Excel.Range


  • Definición de variables

Hoja3.Rows("1:65500").Clear


  • Esta instrucción limpia todos los datos de una hoja de Excel


Do While Hoja2.Cells(Fila, "A") <> ""


  • Esta instrucción es un ciclo que se detendrá hasta que no encuentre datos en la columna A

Hoja3.Cells(fila2, "a") = Hoja2.Cells(Fila, "a") 'UUID
Hoja3.Cells(fila2, "b") = Hoja2.Cells(Fila, "b") 'Monto factura
Hoja3.Cells(fila2, "c") = Hoja2.Cells(Fila, "i") 'RFC-emisor
Hoja3.Cells(fila2, "d") = Hoja2.Cells(Fila, "d") 'Moneda
Hoja3.Cells(fila2, "e") = Hoja2.Cells(Fila, "e") 'Tasa cambio
If Hoja3.Cells(fila2, "e") = "" Then Hoja3.Cells(fila2, "e") = 1
Hoja3.Cells(fila2, "f") = "|" + Hoja2.Cells(Fila, "f") + Hoja2.Cells(Fila, "g")  'Numero factura, serie +a folio
Hoja3.Cells(fila2, "g") = Format(Hoja2.Cells(Fila, "h"), "MM/DD/YYYY")     'fecha factura
Hoja3.Cells(fila2, "h") = " "                   'código proveedor
Hoja3.Cells(fila2, "i") = Hoja2.Cells(Fila, "c")   'rfc_receptor
Hoja3.Cells(fila2, "j") = " "                   'nombre del proveedor
Hoja3.Cells(fila2, "k") = Hoja1.Cells(5, "b")   ' dominio
Hoja3.Cells(fila2, "l") = Hoja1.Cells(6, "b")   ' entidad

Hoja3.Cells(fila2, "m") = " "   ' poliza

En esta parte estamos asignando en una nueva Hoja del mismo libro de Excel los valores del archivo que vamos a crear con datos de la Hoja2.

Fila = Fila + 1
fila2 = fila2 + 1

Estas son nuestras variables que nos sirven para ir avanzando en el archivo de Excel, la variable Fila es para recorrer la Hoja2 y la fila2 para recorrer la Hoja3.

CopiarHOjaaLibroNuevo

Esta es una función, las funciones son procesos que podemos reutilizar en otras macros y que no están ligadas a un solo resultado, es decir son reutilizables, de hecho casi siempre tenemos funciones que utilizamos en una ocasión y volvemos a copiar en otro nuevo programa, Hay un concepto en programación que se llama DRY (Don’t Repeat Yourself) que es que si ya tienes un código hecho lo reutilices y no lo re-escribas.

mio = ActiveWorkbook.Name
nombre = Sheets(2).Range("B3").Value
Workbooks.Add
otro = ActiveWorkbook.Name
Workbooks(mio).Activate
' Sheets("Hoja1").Range("a5").Copy after:=Workbooks(otro).Sheets("Hoja1").Range("a1")
Sheets(3).Copy after:=Workbooks(otro).ActiveSheet
Application.DisplayAlerts = False
Workbooks(otro).Sheets(1).Delete
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Replace(nombre, "/", ""), FileFormat:=xlCSV
Application.DisplayAlerts = False
ActiveWorkbook.Close False

Esta función lo que permite es copiar los datos de una hoja a un nuevo libro de Excel.

En las macros hay muchas funciones, si quieren que veamos algún otro ejemplo lo podemos hacer, escriban sus comentarios.

jueves, 25 de abril de 2019

Programar en Logo


Hace muchos años atrás mi mamá tomaba cursos de computación, yo tendría 7 años  cuando me llevo con ella un día a su clase y vi una tortuguita en el monitor de una computadora, en ese momento aprendí  que  una computadora era capaz de seguir las instrucciones mientras yo le hablara en un idioma que me entendiera, claro que en ese momento no sabía que estaba haciendo mi primer programa. Desde entonces quedé fascinada de la computación y todo lo que conlleva.
En ese entonces no estaba google ni tenía un Smartphone o una Tablet para preguntarle a Google que era lo que estaba aprendiendo.
Esa tortuga que yo había visto es un lenguaje de programación que se llama LOGO, después de muchos años recordé ese momento y comencé a investigar, leí que es el segundo software más viejo de la historia.
Les comparto un liga de un curso de LOGO


Me parece que es software que hoy en día seguiría cumpliendo el objetivo de enseñar a niños los conceptos básicos de programación, la sintaxis es muy simple y como cualquier lenguaje de programación las aplicaciones son infinitas.

Vamos hacer un programa que dibuje una cuadrado en LOGO,

Primero vamos hacer una simulación en papel, es decir un dibujo
Algoritmo
  • Pintar linea de 5 cm
  • mover cursor hacia arriba
  • pintar linea de 5 cm
  • mover cursor a la izquierda
  • pintat línea de 5 cm
  • mover cursor hacia abajo
  • pintar linea de 5 cm

El código del programa:

RIGHT 90
FORWARD 50
RIGHT 270
FORWARD 50
RIGHT 270
FORWARD 50
RIGHT 270
FORWARD 50

Es una buena práctica escribir las palabras reservadas en mayúsculas, las palabras reservadas son todas las lista de instrucciones que tiene el lenguaje de programación, es como cuando aprender hablar otro idioma y les explican los pronombres, preposiciones, así es es la programación pero tienen otros nombres:

Palabras para Operaciones matemáticas, lógicas o de palabras, Instrucciones para bucles o ciclos.

Sigamos la salida del programa es la siguiente












Guardamos nuestro programa, yo lo llame cuadrado.LGO , .LGO es la extensión de los programas en LOGO , las extensiones nos sirve para identificar con que programa abrir cada archivo, por ejemplo en Excel el xlsx en Word docx en paint .jpg o .png

Y como siempre la programación busca hacer las cosas más fáciles, hay instrucciones que se llaman bucles o ciclos, que nos permiten realizar instrucciones repetitivas sin tener que escribir todo, por ejemplo en logo tenemos la instrucción REPEAT, para decirle cuantas veces repetir las mismas instrucciones, en este caso 4 veces va a caminar hacia adelante y 4 veces va a girar 90 grados, esto en lugar de las primeras 8 lineas que escribimos,

REPEAT 4 [ FORWARD 100 RIGHT 90 ]



Adelante no tengan miedo y comience a escribir sus programas

miércoles, 24 de abril de 2019

¿Qué es programar?

Hola bienvenidos a este blog :)

Me he decidido a compartirles acerca de una de las pasiones de mi vida que es la programación, desde hace 24 años aproximadamente empecé en el mundo de la computadoras, conozco varios lenguajes de programación que más adelante les iré compartiendo, pero empecemos con este primer post.

La primer pregunta que pueden hacer es ¿Qué es la programación? Bueno hay varias definiciones pero yo me acuerdo de una explicación que me dieron en la secundaria:
La programación es una secuencia de instrucciones para llegar a un objetivo.

El maestro en su momento nos dio un ejemplo, nos dijo imaginense que van a prepararse un huevo ahora piensen qué pasos seguir y nos dijo eso que están haciendo de pensar y organizar los pasos es hacer un algoritmo de software y después de hacerlo eliges en que lenguaje de programación quieres hacer el programa eso es programar, traducir a una computadora los pasos a seguir para realizar una tarea.

Para poder ejemplificar un algoritmo, puede ser un listado de pasos o podemos usar diagramas de flujo,  por ejemplo veamos el caso de un huevo estrellado:


Para poder realizar la programación en computadoras, necesitas aprende por lo menos un lenguaje de programación que es como aprender el idioma de las computadoras, hay muchísimos busque rápidamente y según wikipedia hay 672 .

Voy hacer un ejemplo de código de un programa que suma 2 números enteros en Progress 4gl, empecemos con el algoritmo, voy a ponerlo como si fueran enunciados:

  1. Introducir primer número a sumar (variable número entero i)
  2. Introducir segundo número a sumar (variable número entero j)
  3. Realizar suma
  4. Mostrar resultado
En la imagen está el programa escrito 


/*Programa que suma*/                                                           
DEF VAR i AS INTEGER INITIAL 0.                                                 
DEF VAR j AS INTEGER INITIAL 0.                                                 
                                                                                
UPDATE i j.                                                                     
DISPLAY i + j.   
Imagen con la ejecución del programa 


 Ingresar primer numero
 Ingresar segundo numero
 Mostrar resultado

Como verán en base al algoritmo es muy fácil saber qué hacer porque ya sabemos que queremos de salida, porque el objetivo del programa es sumar 2 números enteros, en esta oración estamos delimitando el objetivo y las condiciones, es decir solo quiero sumar 2 números y que no tengan decimales.
Si son 2 numeros necesito 2 variables para ingresar los datos que son la letra "J" e "I" , luego realizó la operación y la muestro en pantalla.
La programación es un proceso finito siempre cumple condiciones y llega a un resultado, la computadora hará lo que nosotros le digamos que haga, claro que siempre habrá excepciones o posibles errores ahí es cuando inicia la revisión de nuestro programa y revisar en qué parte nos falta agregar más condiciones o lógica para evitar esos errores.

Espero les sea de utilidad este post, lo compartan y vayan pensando en que lenguaje de programación quieren aprender.

Saludos amigos programadores.