miércoles, 4 de diciembre de 2013

Proyecto Tipo de Cambio SUNAT - Perú

Acabo de subir un proyecto a CODEPLEX que muestra como poder obtener el tipo de cambio SUNAT desde su pagina web. Esto mediante la lectura del HTML de su misma web de SUNAT y obtener los valores de cambio de soles a dolares y viceversa.

El proyecto esta desarrollado en el lenguaje C# con visual studio 2010 y es del tipo formularios windows.

La pagina web del tipo de cambio SUNAT la cual extraigo los datos
http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias

El proyecto en CODEPLEX que lee los datos de SUNAT esta en la siguiente dirección
https://tcsunatperu.codeplex.com/

Anteriormente subí una publicación donde detallo como se obtiene los datos de la web de SUNAT
http://r3xet.blogspot.com/2013/12/obtener-el-tipo-de-cambio-de-sunat-del.html

Sáquenle provecho y compartan el conocimiento que es gratis.

lunes, 2 de diciembre de 2013

Obtener el tipo de cambio de SUNAT del mes actual con C#

Después de varios meses de inactividad en el blog, quisiera compartir con todos el código para poder obtener el tipo de cambio del mes desde la web de SUNAT que es tan útil para conversiones de moneda sol a dolar en temas tributarios.

Primero tengo que obtener la librería HtmlAgilityPack que nos ayudara a manejar el HTML de la pagina web de SUNAT (http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias). Para esto, descargamos la versión 1.4.6 de la pagina web del proyecto https://htmlagilitypack.codeplex.com/. Posteriormente, lo importamos como referencia en nuestro proyecto.


Ahora nos toca implementar el código que se encargará de conectarse a la pagina web y obtener el documento HTML.

string sUrl = "http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias";
 
Encoding objEncoding = Encoding.GetEncoding("ISO-8859-1");
WebProxy objWebProxy = new WebProxy("proxy", 80);
CookieCollection objCookies = new CookieCollection();
 
//USANDO GET
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(sUrl);
getRequest.Proxy = objWebProxy;
getRequest.Credentials = CredentialCache.DefaultNetworkCredentials;
getRequest.ProtocolVersion = HttpVersion.Version11;
getRequest.UserAgent = ".NET Framework 4.0";
getRequest.Method = "GET";
 
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(objCookies);
 
Como se puede ver usamos el Httpwebrequest para realizar la petición a la web de SUNAT y con esto deberíamos obtener una respuesta que se cargara en el Httpwebresponse que se muestra continuación.

string sGetResponse = string.Empty;
 
using (HttpWebResponse getResponse = (HttpWebResponse)getRequest.GetResponse())
{
 objCookies = getResponse.Cookies;
 
 using (StreamReader srGetResponse = new StreamReader(getResponse.GetResponseStream(), objEncoding))
 {
  sGetResponse = srGetResponse.ReadToEnd();
 }
}

Se ve que el resultado de la consulta se guarda en la variable sGetResponse y esta contendrá el código HTML de la web de tipo de cambio. Con esta información ya podremos saber cuales son los tipos de cambio de este mes pero nos faltaría obtener los valores de día, venta y compra sin los demás datos redundante del HTML. Para ello, usaremos la librería HtmlAgilityPack que ya tenemos en nuestro proyecto.
//Obtenemos Informacion
HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(sGetResponse);
Como se puede apreciar, se ha cargado la variable sGetResponse, que contiene el código HTML, como  un objeto de tipo HtmlDocument. Con esto ya podemos navegar entre los TAG'S HTML y poder quitar los datos redundante y solo obtener los que necesitamos. Estos datos los colocaremos en una tabla que contendrá 3 columnas (día, compra y venta).
HtmlNodeCollection NodesTr = document.DocumentNode.SelectNodes("//table[@class='class=\"form-table\"']//tr");
if (NodesTr != null)
{
 DataTable dt = new DataTable();
 dt.Columns.Add("Día", typeof(String));
 dt.Columns.Add("Compra", typeof(String));
 dt.Columns.Add("Venta", typeof(String));

 int iNumFila = 0;
 foreach (HtmlNode Node in NodesTr)
 {
  if (iNumFila > 0)
  {
   int iNumColumna = 0;
   DataRow dr = dt.NewRow();
   foreach (HtmlNode subNode in Node.Elements("td"))
   {

    if (iNumColumna == 0) dr = dt.NewRow();

    string sValue = subNode.InnerHtml.ToString().Trim();
    sValue = System.Text.RegularExpressions.Regex.Replace(sValue, "<.*?>", " ");
    dr[iNumColumna] = sValue;

    iNumColumna++;

    if (iNumColumna == 3)
    {
     dt.Rows.Add(dr);
     iNumColumna = 0;
    }
   }
  }
  iNumFila++;
 }

 dt.AcceptChanges();
 this.dgvHtml.DataSource = dt;
 this.dgvHtml.ReadOnly = true;

}
Como se puede apreciar,  se filtra por el TAG
, la cual contiene los datos que necesitamos y procedemos a recorrer la pagina web y extraer los datos que necesitamos colocar en nuestra tabla. El resultado final será esto:


Resultado de web de SUNAT

Resultado de la aplicación después de manipular los datos que queremos mostrar.


Espero que sea tan útil como me sirvió a mi y les dejo el link de los archivos para que puedan descargarlo








lunes, 10 de junio de 2013

TIPS PARA SER UN MEJOR PROGRAMADOR

1. Estudia, estudia y estudia
El estudiar nos permite perfeccionarnos, cuanto mas estudiemos mas oportunidades de programar mejor tendremos, no solamente estoy hablando de universidades, ni tampoco de cursos, hoy por hoy gracias a internet existen infinidad de tutoriales y manuales, sin ir mas lejos el sitio oficial de PHP es realmente muy bueno.
2. Busca antes de preguntar
Esto es un mal común del que quiere aprender a programar, es mas fácil preguntarle a alguien que sepa, pero realmente no tiene que ser así por varias razones, primero por que es algo de muy de vago, luego que cuando alguien nos da la respuesta fácil no aprendemos nada, lo interesante cuando se nos presenta un problema es buscar la solución nosotros mismos, sino damos con la respuesta recién ahí preguntar, este ejercicio realmente es muy beneficio, nos permite preparar nuestra cabeza para solucionar futuros problemas.
3. Busca scripts ya desarrollados
Por lo general podemos encontrar muchas funciones, scripts listos para utilizar, pero lo interesante es estudiarlos, ver como funcionan, de ahí aprendemos si copiamos y pegamos vamos mal.
4. Lee el código fuente libre
Yo muchas veces descargo algunas aplicaciones para ver como están programadas, de verdad que se aprende mucho, a medida que realicemos esta practica cada vez iremos aprendiendo mas, en especial si estas aplicaciones son de uso popular en donde miles de programadores del mundo “meten” mano para mejorarla. Un buen ejemplo de esto es WordPress.
5. No copies y pegues
Es fácil, entramos a google buscamos una función que sirva para lo estamos necesitando y listo. Pero la realidad es que no siempre lo que descargamos es correcto, y si luego tenemos que solucionar un problema lo mas probable es que no tengamos ni idea por donde empezar. Ni hablar del factor aprendizaje cero que esta practica implica.
6. Buscar el momento para programar
Estas sentado delante de tu ordenador, llaman por teléfono, tu compañero de trabajo o familiar te pregunta algo, realmente es lo mas molesto e incomodo que hay, es difícil concentrarse, es preferible hacer algo mas “Light” antes de programar algo mal y después tener que arreglarlo.
7. Ten tu propia Wiki
Esto lo recomiendo muchísimo, es muy sencillo instalar una Wiki en nuestra pc, simplemente podemos descargar el Easyphp y tener en nuestro ordenar un servidor funcional, y mejor aun si quieres hacer la instalación “a mano”. La wiki es interesante para poder almacenar rutinas que usamos frecuentemente, en mi caso suelo guardar validaciones, etc. Una vez que aprendimos a hacer algo y lo tenemos lo mejor posible es interesante tenerlo a mano para no perder tiempo escribiendo lo mismo una y otra vez.
8. Comenta todo lo que sea necesario
Escribir comentarios en el código suele ser bastante molesto y parecer innecesario, pero comentar las cosas importantes nos puede ahorrar mucho tiempo cuando tengamos que retocar el código meses después.
9. Participa en foros/comunidades
Es interesante para interactuar con otras personas que estén en nuestra misma sintonía, muchas veces ayudaremos nosotros y otra vez nos podrán ayudar. En línea general estas comunidades tienen muy buena onda, y la ayuda mutua es lo que abunda, unas líneas de código pueden ser útiles para muchas personas, de ahí que entre todos se puede perfeccionar. Recuerden respetar el punto 2.
10. Habla con otros programadores
Mensajería instantánea, en un café, por teléfono, etc. Es interesante tener amigos que están en lo mismo, no solamente por el tema de la ayuda mutua, estos grupos suelen ser también de ayuda “emocional” del programador, unos chistes, algún comentario puede ser una inyección de energía para continuar con un problema que no podemos resolver.
11. Tiempo libre para otras cosas
Me encanta programar, pero entendi que no es lo unico en la vida, a veces es bueno una salida, una película, realmente es necesario desenchufarnos.
12. Arma tu bunker
Tener un espacio de trabajo acorde con tus gustos es indispensable para programar, un buen sillón que no dañe nuestra columna, un lindo escritorio que nos permita desparramar CDS, libros, etc. También hay que ser organizado, pero siempre a nuestro gusto, es bueno que sea TU espacio y que nadie meta mano, uno a la larga lo termina sintiendo como un refugio.
13. Tu equipo en condiciones
Otro punto importante, una buena computadora, que no tenga problemas, si es necesario un poco mas de RAM, no hace falta tener una supermáquina para programar con PHP pero si algo que no se este colgando cada 2 seg.
14. Usa herramientas gratuitas
Si no podes pagar ciertas herramientas realmente ni te gastes en bajar las versiones piratas, en PHP no se necesita mucho y realmente no vale la pena estar trucando programas.
15. Organiza tu propia biblioteca de scripts
Relacionado con el punto 7. La wiki es muy buena, pero hay que tenerla organizada, sino encontrar algo puede llevarnos mas tiempo que volverlo a escribir. Yo soy bastante desorganizado, pero con los años aprendí a manejar mi problemita :D
16. Se agradecido con los que te ayudan
Si alguien te ayuda, por favor al menos di gracias. Recuerda que las personas que te rodean no son tu soporte técnico (Al menos que les pagues). Si alguien se molesta en responder a tus consultas agradécele, para la próxima esa persona seguirá teniendo buena predisposición.
17. Se humilde (IMPORTANTE)
Esencial. Siempre hay alguien que sabe más que uno y mas en este “rubro” en donde hay verdaderos cráneos, Yo hace varios años que programo en PHP y sin embargo siempre aprendo algo nuevo, y en parte eso es lo que me gusta de programar, siempre se puede mejorar.
18. Siempre busca perfeccionarte
Relacionado con el punto anterior. Las tecnologías evolucionan y nosotros debemos hacer lo mismo. Una linda practica cuando tenemos un poco de tiempo libre es tratar de optimizar un código nuestro de unos meses anteriores, si aprendimos cosas nuevas de seguro que podemos hacerlo mejor que antes.
19. Intenta ser eficiente y luego inténtalo de nuevo
Que funcione no quiere decir que este bien. También una de las cosas más lindas de programar: Siempre se puede hacer una función mas eficiente, que consuma menos recursos, no hay que conformarse que arroje los resultados que queremos, probablemente lo podemos hacer mejor.
20. Programa primero lo que menos te gusta
Esto es bastante personal, pero por lo general me da buenos resultados. Cuando me siento a programar algo los primeros minutos son de “ambientación” luego tengo un periodo de concentracion digamos maxima, en ese momento las cosas que parecen o son mas complicadas son cuando mas rápido y mejor salen, luego cuando uno esta mas cansado puede dedicarse a las cosas mas sencillas y rutinarias.

lunes, 4 de febrero de 2013

Diccionario de Acrónimo Técnicos



Acrónimo
Ingles
Español
RAD rapid application development Desarrollo rápido de aplicaciones
SOLID Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion Responsabilidad única, Abierto-Cerrado, Sustitución de Liskov, Segregación de la interface, Inversión de dependencia.
TDD Test-driven development Desarrollo guiado por pruebas de software
DTO
Data transfer object
Objetos de trasferencia de datos
REST
Representational State Transfer
Transferencia de Estado Representacional
SOAP
Simple Object Access Protocol

lunes, 21 de enero de 2013

Paginación de registros en Informix

Para poder realizar una paginación de una consulta en la base de datos Informix se requiere definir el valor inicial (skip) y la cantidad de registros (first):

En este ejemplo queremos obtener el resultado paginado de 50 registros a la vez, por lo tanto se esta definiendo el valor "first 50" y para la primera pagina se define el valor "skip 0".

Página 1
select skip 0 first 50 * from table1;

Página 2
select skip 51 first 50 * from table1;

Página 1
select skip 101 first 50 * from table1;

Como se aprecia, para la pagina 2 en adelante se multiplica la constante (50) por el valor de la pagina menos uno (Pagina Actual - 1) y por último se le suma 1.


Pagina Valor Skip Formula
1 0 (1-1)*50
2 51 (2-1)*50+1
3 101 (3-1)*50+1
4 151 (4-1)*50+1
5 201 (5-1)*50+1