lunes, 12 de noviembre de 2012

Instalar WAMP y ISS en un mismo ordenador

Buenas en este post voy a introducir un tema interesante que es como configurar correctamente Wamp para que se puede usar en un ordenador en el que ya tenemos instalado el ISS. Este post será un post donde voy a mostrar como configurar correctamente las 2 aplicaciones aplicaciones y el localhost tendremos el ISS y en localhost:8080 tendremos WAMP. La pregunta puede ser para qué querer instalado en un mismo ordenador tanto el ISS como WAMP. Pues la respuesta es que si queremos trabajar y probar en local como funciona un sitio web ASP o ASP.NET antes de subirlo a un servidor de hosting pues necesitaremos tener instalado el ISS o un servidor web similar tipo “Cassini”.  También cabe recordar que Visual Studio trabaja con un servidor diferente al ISS para probar y depurar nuestros sitios web ASP.NET, es el servidor de desarrollo integrado que se instala por defecto con el IDE. La mayoría de las empresas de hosting para .NET usan el ISS, pocas he visto con "Cassini" todo y el resultado es igual de eficiente. Es interesante ir probando como funciona nuestro sitio web en local antes de subir todos los archivos al servidor ya que así podemos ir haciendo cambios y verlos como quedarían en producción. No hace falta que recuerde lo importante que es comprobar que características ofrece nuestro hosting ya que luego nos podemos encontrar con cosas que funcionan en local y que luego no funcionan cuando lo subimos al servidor. Eso es por una parte, pero hay gente que no se conforma con programar en .NET y también le gusta programar en PHP. Pues una buena solución son aplicaciones tipo WAMP, XAMPP, EASYPHP o APPSERV (esta última no actualizada desde hace bastante tiempo). Estas aplicaciones son servidores que tienen todo lo necesario para testear en local tus sitios web PHP. Vienen con apache, con MySQL para las bases de datos y PHP, y son muy útiles para empezar a programar con php ya que te instalan y configuran todo lo que necesitas. A parte son gratuitos. Pues bien el código lo escribes usando el IDE que más te guste: NetBeans, Eclipse, DreamWeaver, etc,... y luego mueves los archivos que has creado a la carpeta “www” de WAMP y con esto ya puedes testear cómo funciona la página PHP en tu servidor local. Ya sabes según desarrolles con una tecnología u otra los características de tu hosting seran diferentes. Para .NET necesitarás un hosting tipo "Windows" con el ISS, mientras que para PHP necesitarás un hosting tipo "Linux" con apache. Pero ya sabes en local puedes tener los dos sin coste y eso es lo que vamos a ver.

En principio si sólo trabajas sólo con .NET o sólo con php no vas a tener problemas. Este vídeo está enfocado pues a dar una visión del proceso de instalación de WAMP y para aquellas personas que trabajan tanto con .NET como con PHP a la hora de desarrollar sitios web. A parte voy a tratar el tema de cómo configurar correctamente PHPMyAdmin, que para quienes no sepan sería como un SQL SERVER, es decir, un gestor de bases de datos, y el problema que tenemos es que al instalar WAMP es que el usuario “root” no tiene contraseña. Eso en principio no sería problemático si por ejemplo el ordenador donde tienes instalado WAMP no lo usa nadie más que tú. Pero en un ordenador compartido por más gente puede ser peligroso. Imagínate que alguien que tu no sabes tiene acceso al PHPMyAdmin y te borra las bases de datos que necesitas para tu sitio web. Por ejemplo has instalado Joomla usando como servidor WAMP y una vez lo tienes configurado como te gusta, alguien te borra la base de datos. Por eso es importante añadir contraseña al usuario administrador. 

Por último en el vídeo voy a enseñar como instalar un CMS como Joomla o Drupal en tu ordenador usando WAMP. El proceso es muy sencillo y sólo me centraré en los puntos que plantean más dudas: el rellenar el servidor y la contraseña, porque lo demás es sólo darle a continuar al asistente. La idea sirve para todos los demás CMS y sitios web basados en PHP que quieras tener en tu servidor local antes de subir a tu hosting. 

jueves, 16 de agosto de 2012

Actualizar versiones anteriores de aplicaciones en .NET

Buenas voy a retomar la escritura de artículos en mi blog para tratar un tema bastante cortito pero interesante que es cómo crear un proyecto de instalación en .NET que nos permita actualizar versiones anteriores de nuestra aplicación. En sí es la continuación de post anterior pero ahora voy a añadir la explicación de cómo poder actualizar nuestras aplicaciones de forma fácil, si lo que hemos distribuido a nuestros clientes es un archivo de instalación que les ha instalado en su ordenador nuestra aplicación.
Pues bien la gran diferencia de las aplicaciones de Windows Forms con las aplicaciones web es que si tienes una aplicación web y tienes que modificarla o actualizarla el proceso es mucho más simple ya que modificas el archivo que tienes que cambiar en local y lo vuelves a subir al servidor o lo modificas directamente en el servidor y una vez hecho esto tus cambios estarán disponibles al momento para todos los usuarios que se conecten a tu servidor. En cambio en las aplicaciones para Windows Forms hay que actualizar los archivos instalados en cada ordenador y este proceso puede ser más costoso.
Pues bien voy a partir de un simple formulario con 3 cajas de texto y un botón, para sumar el contenido de las cajas de texto y mostar el resultado, nada del otro mundo. Lo que voy a hacer es agregar un nuevo proyecto de instalación, que ya expliqué en un post anterior como se hacía, lo voy a configurar cambiando algunas propiedades como el nombre del autor, el nombre del producto y que me desinstale las versiones anteriores de la aplicación y además voy recordar como añadir accesos directos. Pues bien una vez generado el proyecto voy a explicar cómo distribuir la aplicación para que el cliente la instale en su ordenador. Hasta aquí nada nuevo, lo nuevo será explicar cómo hacer cambios en la aplicación y distribuirla para que cuando se instale en el ordenador del usuario final desinstale la versión anterior, eso sí sin borrar archivos como bases de datos y demás información que el usuario haya guardado y no quiera ser borrada, e instale la nueva versión actualizada.
Los puntos más interesantes es que si en el proyecto de instalación que creas cambias la propiedad 'RemovePreviousVersion' a True, el instalador cuando detecte una versión anterior de la aplicación no la va a desinstalar automáticamente si en la propiedad 'Product Code' el código es el mismo. Te dirá que has de ir a 'Agregar y quitar programas'  para desinstalarla tu manualmente y el programa no continuará. Si el 'Product Code' no es el mismo no tenemos garantias que actualize todos los ficheros de la aplicación a menos que nos descarguemos el programa Orca.msi y nosotros modifiquemos el archivo .msi añadiéndole a la table 'property' la propiedad REINSTALLMODE y el valor amus. Lo mismo también se puede hacer modificando el archivo .msi desde la consola de MSDOS y escribiendo msiexec.exe /i [nombre del archivo].msi REINSTALLMODE=amus y pulsar intro.
 Otro punto interesante es el hecho que queramos que algunos archivos de la aplicación no se borren cuando se desinstale, como pueden ser bases de datos -a menos que hagamos una copia de seguridad antes-, archivos de configuración, etc. Para ello si estoy en mi proyecto de instalación, en este caso estoy en los 'Archivos de contenido' busco la propiedad Permanent y cambio el valor a True y con eso ya lo conseguimos.
Para explicar todo esto cuelgo el siguiente vídeo donde todo quedará más claro y verás que es mucho más sencillo de lo que parece.

Bueno ya sé que he estado sin colgar nada durante bastante tiempo básicamente por motivos de mucho trabajo y de estudios pero he querido retomar un poco las publicaciones en este blog para ir colgando cosas interesantes y quiero empezar dentro de poco a explicar no sólo como crear aplicaciones de escritorio sino también sitios web, ya sea aspx o php-mysql, que son las 2 tecnologías que más estoy usando en los últimos meses de trabajo.

domingo, 17 de junio de 2012

Formulario de Login con Base de datos Access

Buenas después de bastante tiempo sin publicar nada por temas de exámenes, en este post voy a tratar el tema del formulario de login (LoginForm) que se puede agregar a cualquier proyecto para WindowsForms en Visual Studio. Es un formulario ya diseñado que nos permitirá que los usuarios de nuestra aplicación puedan entrar su nombre y su contraseña y una vez validado puedan acceder a otros formularios de la aplicación. El problema es que el código brilla por su ausencia. Es sólo un formulario con 2 textboxes añadidos, uno para el nombre de usuario y otro para la contraseña, una imagen en la esquina izquierda y un botón de Ok y otro de Cancel. Hay un link para más información de como implementar la autentificación en http://go.microsoft.com/fwlink/?LinkId=35339) pero no funciona.

Ya sé que el código podría ser tan simple como escribir un simple condicional y comprobar que el usuario y la contraseña introducida coincide con algún valor que ponemos en el código. Sería un simple If PasswordTextBox.Txt = “1234” Then… Esto lógicamente funciona pero tiene el problema de su difícil mantenimiento ya que la contraseña para validar estaría en el código y podría ser fácilmente encontrada si el proyecto se descompila. A parte si la aplicación se distribuye y se quieren agregar más usuarios y más contraseñas se tendría que estar frecuentemente actualizando. Vamos que no es viable.  
La idea es usar bases de datos, en mi caso Access pero con SQL o MySQL sería lo mismo. Pero aquí hay otro problema que es que si alguien abre la base de datos verá el nombre de usuario y la contraseña. Por lo que no nos queda más remedio que encriptar la contraseña en la base de datos por si alguien la abre no pueda ver las contraseñas. Con .NET es sencillo gracias al espacio de nombres System.Security.Cryptography
Bueno en el código que voy a colgar vamos a recordar como hacer operaciones de SELECT, UPDATE e INSERT en una base de datos Access usando ahora un acceso conectado (es decir sin DataSets ni DataAdapters). Lo que vamos a repasar como crear una conexión, crear un comando con parámetros, abrir la conexión, ejecutar el comando y cerrar la conexión. Como lo que vamos a consultar es si existe en la base de datos un usuario ya creado y sino lo crearemos y a parte permitiremos cambiar la contraseña vamos a usar 'comando.ExecuteScalar' para devolver la fila de la base de datos cuyo usuario y contraseña coincide con el especificado en los parámetros de la consulta, y 'comando.ExecuteNonQuery' para los INSERT y UPDATE -y DELETE- en los que no quiero que la consulta nos retorne nada. Hoy no voy a usar 'comando.ExecuteReader' ya que no quiero que me devuelva varias filas de la base de datos.
Un ejemplo de un SELECT en la base de datos Access con 2 parámetros sería el siguiente:
Dim conexion As OleDbConnection = New OleDbConnection()
        ' Asigno la cadena de conexion a la base de datos
        conexion.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\data\Base.mdb;Persist Security Info=True;Jet OLEDB:Database Password=luna"
        ' Creo un comando
        Dim comando As OleDbCommand = New OleDbCommand()
        ' Asigno el texto de la consulta SQL
        comando.CommandText = "SELECT COUNT(user) FROM `Usuarios` WHERE `user`=? and `password`=?"
        comando.Connection = conexion
        ' Añado los parámetros
        comando.Parameters.AddWithValue("user", nombre.ToUpper())
        comando.Parameters.AddWithValue("password", clave)
        Try
            ' Abro la conexión
            conexion.Open()
            Dim resultado As String
            ' Ejecuto la consulta que devolverá 1 si el usuario existe
            resultado = comando.ExecuteScalar
            If resultado < > 1 Then
                'Se ha encontrado el usuario
                             msgbox("Usuario encontrado")
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            err = True
        Finally
            ' Cierro la conexión
            conexion.Close()
            If conexion IsNot Nothing Then
                ' Libero los recursos asignados
                conexion.Dispose()
            End If
        End Try

De hecho como siempre voy a colgar aquí el código por si alguien quiere aportar, mejorar o agregarlo a su repositorio de código.
Lo ideal es que en el Visual Studio vinieran más ejemplos implementados para no tener que perder el tiempo en esos desarrollos que son idénticos a todas las aplicaciones y centrase más en la lógica de tu aplicación que es lo que te dará el valor añadido y no el crear un formulario con dos o tres controles puestos de tal forma. A veces echas de menos estas cosas o por ejemplo sistemas de Login más complejos, a lo CMS, que puedan mostrar contenido independiente para cada usuario. Un ejemplo sería el tema de las páginas donde te puedes descargar facturas electrónicas. Cada cliente tiene acceso sólo a sus facturas y a parte el hecho de subir y crear facturas no tiene que ser complicado ya que se subirían todas pero sólo tú tendrás acceso a la que coinciden con tus datos de Login. Bueno esto ya será un proyecto a más largo plazo y ya como sitio web para subir a un servidor, si es que en versiones siguientes del Visual Studio no se animan a los que trabajamos en el mundo de la empresa a facilitarnos la vida.
En la siguiente entrada colgaré un ejemplo de aplicación demo o con periodo de evaluación (Trial) que se puede hacer de forma sencilla con .NET y así ya cubro 2 temas que siempre generan muchos quebraderos de cabeza a los programadores novatos.

viernes, 13 de abril de 2012

Editor de texto en JAVA con Netbeans

Hola, en este post de primavera voy a crear una pequeña aplicación con Netbeans. Será un simple editor de texto que tendrá la funcionalidad de abrir un archivo, modificarlo y guardarlo. Sólo es para demostrar lo fácil que es también desarrollar y compartir vuestros proyectos usando JAVA. Para ello voy a usar el IDE Netbeans, pero perfectamente se podría usar Elipse u otro similar.

Hasta ahora en este blog he estado desarrollando aplicaciones usando el Visual Studio .NET. Esta herramienta es fantástica ya que de forma muy sencilla se pueden conseguir resultados sorprendentes y que son totalmente válidos para un uso en empresas donde hay miles de usuarios que están trabajando con tu aplicación al mismo tiempo. Eso no quita que hayan también otras tecnologías igualmente buenas y que también puedes usar. JAVA a día de hoy la ventaja que tiene respecto .NET es que multiplataforma, es decir, la sencilla aplicación que he creado se podría utilizar en cualquier ordenador con cualquier sistema operativo (Windows, MAC, Linux, etc…) con tan sólo que tenga instalada la JRE o la máquina virtual de JAVA. Quizás en aplicaciones de escritorio esto es una ventaja. En otro tipo de aplicaciones, tipo páginas web, aquí el problema ya no es tan grande debido a que lo único que necesitas es un navegador. Tú envías html, ese html se procesa en el servidor y te devuelve html con el resultado. Es decir que no te tienes que preocupar si el servidor trabaja con Linux, Apache y MySql, si lo hace con Windows, IIS y SQL Server o si trabaja con Windows, MySql y GlassFish.

De todas maneras siempre es bueno antes de desarrollar una aplicación diseñarla evitando los errores de lógica y será en la fase de implementación cuando, según los recursos y tecnologías que disponemos, decidiremos con cual lenguaje y tecnología nos decantaremos. Como siempre cuelgo el código fuente del proyecto que está disponible aquí y el vídeo explicativo es el siguiente:

sábado, 25 de febrero de 2012

Programa de Ayuda Modelo 202 beta 0.2

Buenas en este nuevo post voy a colgar otra aplicación que como va siendo habitual esta relacionada con optimizar algún proceso en el ámbito de un departamento financiero. En este caso le toca el turno al área de tributación. La aplicación esta diseñada para ayudar a cumplimentar el modelo 202 y generar el fichero para la presentación telemática y/o la carta de pago. A esto modelo yo ya le he dedicado algún que otro post, y de hecho en un post anterior colgué un pdf con campos editables que podían ser rellenados por el usuario. En si el modelo 202 es un modelo bastante complejo en cuanto a validación y además es complejo en cuanto a las opciones que hay disponibles. Si no se poseen conocimientos del Impuesto sobre Sociedades, es difícil, por no decir imposible, saber en qué consiste el modelo y con cuales datos cumplimentarlos. Es por eso por lo que me he decantado por este modelo. Este programa es de libre difusión y pretender servir a aquellas empresas y despachos profesionales en la tarea de confección y gestión de sus declaraciones. Para los amantes de la informática está programado en Visual Basic .NET y usa una simple base de datos Access. Ya lo sé hay de motores de bases de datos mejores pero lógicamente no quería instalar SQL Server o MySQL en el ordenador del curro para sólo usarlo para una utilidad tan simple.
También creo recordar que antes también colgué un libro de Excel con un poco de VBA que permitía obtener el fichero del modelo 115 para la presentación telemática. Pues bien, aprovecho para recordar que como han subido a partir del 01/01/2012 el tipo de retención del 19% al 21% he añadido una nueva versión para adaptarse a este cambio normativo. En este caso es fácil y de hecho quien lo hubiese necesitado lo podría haber hecho sin problemas ya que el código estaba desprotegido. Yo no soy de los que reniegan a compartir las creaciones con la comunidad por temas de propiedad intelectual, es más, todos nos copiamos los unos de los otros y lo que importa es incrementar los conocimientos.
Bueno a lo que iba el programa está disponible para descarga en el link de abajo y como el 20 de abril tocará presentar declaraciones del modelo 202 es cuando lo voy a testear ya en producción. En teoría el algoritmo está bien diseñado, el problema es que es un modelo complejo para una sola persona y no puedo pasarme el día haciendo testeos de datos para los miles de posibilidades que nos podemos encontrar. Ya me gustaría tener un equipo de testeadores pero por ahora sólo 1 persona me ha ayudado a testearlo en su casa. Bueno a lo que iba, si alguien ve alguna cosa a mejorar que me lo comente porque yo voy actualizando en la medida de lo posible las descargas a los cambios normativos y mejoras.
Cambios:
1) Cambiados los DateTimePickers de la fecha de devengo y fecha de inicio del periodo impositivo a TextBoxes por el blug que existe a la hora hora de hacer los inserts en la base de datos cuando el usuario no ha seleccionado ninguna fecha y no se guarda correctamente el contenido de la fecha por defecto.
2) Actualizado al nuevo diseño de registro publicado el 13/04/2012 por la AEAT.
3) Añadida la opción de crear declaraciones con bases imponibles negativas para empresas con pérdidas que tributen según la opción el pago fraccionado calculado a través de la cuenta de Pérdidas y Ganancias del ejercicio en curso.
4) Actualizado el algorismo de cálculo y validación para añadir la opción de declaraciones con importe negativo.

viernes, 24 de febrero de 2012

El Intrastat

Hola,
en este post voy a tratar sobre el tema de la declaración estadística del Intrastat y voy a analizar la relación que tiene que el modelo 349 y el modelo 303.Como pone en la página de la AEAT: La declaración Intrastat se presenta con una periodicidad mensual dentro de los doce primeros días naturales, es decir, sábados y domingos incluidos, del mes siguiente a aquel en que se realizaron adquisiciones o entregas intracomunitarias (siempre y cuando estemos obligados a presentarla) y eso incluye también agosto, que a diferencia del iva mensual no se traslada a septiembre.
Atendiendo al volumen de comercio intracomunitario, la Orden EHA/3384/2010, de17 de diciembre, por la que se regulan los umbrales estadísticos vigentes para el ejercicio 2011 establece un único umbral de exención, fijado en 250.000 euros, motivo por el cual, quedan sometidos a la obligación de presentar declaraciones Intrastat en el ejercicio 2011:
·        En el flujo Introducción, los obligados estadísticos que en el ejercicio precedente realizaron adquisiciones intracomunitarias por un importe facturado total, igual o superior a 250.000 euros.
·        En el flujo Expedición, los obligados estadísticos que en el ejercicio precedente realizaron entregas intracomunitarias por un importe facturado total, igual o superior a 250.000 euros.
En pocas palabras si tus adquisiciones o entregas intracomunitarias de bienes en el año anterior superaron los 250.000 € entonces “pringas” y te tocará presentar Intrastat. También pringarás en el caso en el que no superando el año anterior los límites, en algún mes del año actual los superes y a partir este momento tienes que presentar Intrastat. Para ello siempre echa un vistazo a los importes acumulados de adquisiciones o entregas intracomunitarias de bienes que declaras en el 349. ¡Ojo! Las adquisiciones y entregas intracomunitarias de servicios no se declaran en el Intrastat.
Ahora este párrafo está destinado al típico listillo: “Si un operador intracomunitario presenta voluntariamente declaración estadística, estando dispensado de ello por no alcanzar su volumen de comercio intracomunitario los umbrales anteriormente citados, quedará sujeto a las obligaciones formales que se derivan del sistema Intrastat desde ese mismo momento”.

Pues bien en la página de la Agencia Tributaria se pueden rellenar, presentar y gestionar tus declaraciones de Intrastat. Sólo hay que ir a la sección de Intrastat de la Aduanas e Impuestos Especiales de la AEAT. Si pulsamos en 'Presentación de Declaraciones Intrastat' podemos ver los distintos trámites disponibles. A parte si no lo ves porque está un poco oculto hay 3 manuales que detallo aquí:
Manual para la Presentación de Declaraciones Sin Operaciones. Ideal para saber como rellenar en Intratat cuando en el mes que vas a declarar no hay ninguna operación.

Manual para Consulta y Actualización de Declaraciones. Si tienes que consultar lo que has presentado y como actualizar algún dato.

Manual para Presentación de Declaraciones Con Importación de Fichero. Sería perfecto si agregasen el programa que te generase el fichero.

Pues bien para dar una visión general de cómo se rellena y se presenta el Intrastat y su relación con la declaración informativa recapitulativa de operaciones intracomunitarias (modelo 349) y la autoliquidación del IVA (modelo 303) voy a poner un sencillo supuesto práctico en el que una empresa española realiza en febrero del 2012 una adquisición intracomunitaria, en este caso no de existencias sino de un bien de inversión, que consiste en la compra de una locomotora de tren a una empresa Inglesa por 100.000 £. Supongo en este supuesto que la empresa española es ‘Gran Empresa’ por lo que la periodicidad de la presentación del modelo 303 es mensual y además supongo que la periodicidad en la presentación del modelo 349 es también mensual, porque supongo que el importe total de operaciones intracomunitarias ha superado la cifra de 100.000 € pudiendo ser durante el trimestre de referencia o en cada uno de los trimestres naturales anteriores. Nótese que si se mira en el manual del IVA, cuando hace referencia al 349 sólo hablan de ‘entregas y prestaciones de servicios’, dejando de banda el mencionar las adquisiciones, pero en mi opinión se trata de una errata en el manual.
Antes de emitir la factura (que será una factura de una adquisición intracomunitaria para la empresa española)  la empresa inglesa habrá comprobado que la empresa española está dada de alta en el VIES como operador intracomunitario (en la página de la AEAT se puede consultar, con certificado de usuario, en este link y en este otro link en la página de la Comisión Europea, sin certificado). De esta manera la venta sea un entrega intracomunitaria exenta en Gran Bretaña y la empresa Inglesa no tendrá que repercutir el IVA inglés. Es muy importante ya que si la empresa a la que le emites la factura no está en el VIES tu empresa española tiene que repercutir el IVA español, como si fuera a un particular, ya de lo contrario puedes verte en un problema. No pasaría nada si un proveedor te llama y te dice que no estás en el VIES ya que con presentar un simple 036 de alta como operador intracomunitario la AEAT te incluirá. De hecho como comenté en un post anterior, donde además colgué el modelo relleno, Hacienda para evitar fraudes si en 1 año no haces ninguna operación intracomunitaria te da de baja de oficio. La operación de adquisición intracomunitaria, lógicamente, estará sujeta y no exenta en España donde tributará. Aquí vemos un ejemplo de una posible factura para dicha operación.
Como la factura está en libras hay que mirar el tipo de cambio de la fecha de adquisición que en factura es el 1 de febrero. El tipo de cambio para ese día 1 £ = 1,2032208 €. Por lo tanto a la hora de contabilizar tendríamos el siguiente asiento contable:
Además considero que se paga al contado en este supuesto para evitar diferencias de cambio con la cuenta del proveedor a 31/12.
Pues bien si vamos a la página de la AEAT vamos a rellenar el Intrastat. Para ello entramos en el área de aduanas e impuestos especiales y seleccionamos de la lista 'Intrastat'. Al pulsar iremos a otra página y tenemos que seleccionar 'Enlaze a Trámites Telemáticos de Intrastat':
Y como vamos a presentar una declaración con operaciones pulsamos en el enlace de 'Presentación de Declaraciones con Operaciones'. 
En nuestro ejemplo el modelo relleno quedaría de la siguiente manera, suponiendo que para ese código de mercancía no hay más importes a añadir por más facturas de éste u otros proveedores y que la empresa no ha realizado más operaciones intracomunitarias en el mes de febrero.
Una vez presentada la declaración quiero comentar que en el anterior menú de trámites del intrastat tenemos la opción de modificar y actualizar algún registro de la declaración.

Pues bien una vez todo ya está ok tendremos que preparar primero el modelo 349. La clave es la ‘A’ por ser una adquisición intracomunitaria y el importe es el total de la factura (ya que base imponible y total factura coinciden). Como ya sabemos, para los que tengan un programa de contabilidad con un módulo fiscal no muy bueno existe el Programa de Ayuda de la Plataforma Informativas en la página de descargas de la AEAT que entre todas las declaraciones informativas que posee está el modelo 349. Un ejemplo de cómo quedaría la declaración ya lista para generar sería:
Por último el modelo 303 del IVA quedaría de la siguiente manera. Nótese que es importante que los datos de las 3 declaraciones lógicamente coincidan (y si la periodicidad de alguna declaración no es mensual es importante comprobar el agregado de los importes) ya que de lo contrario estaríamos tendríamos algún descuadre.
Para finalizar hay pequeño folleto en el que se explica más a fondo que aquellos operadores que durante el ejercicio anterior hayan superado 6.000.000 € de operaciones intracomunitarias están obligados a rellenar en el modelo del Intrastat las casillas referentes a:
- Valor Estadístico de las mercancías
- Condiciones de Entrega
- Modalidad de Transporte
- Régimen Estadístico
Para los demás no es necesario. Lo adjunto en el siguiente link.

domingo, 15 de enero de 2012

Generar informes en Visual Studio usando el control ReportViewer

Hola,
en este primer post del 2012 voy a centrarme en explicar cómo generar informes para nuestras aplicaciones o sitios web con los datos que tenemos en la base de datos. Para ello voy a crear un sitio web al que le añadiré el control ReportViewer.  El ejemplo es para C# pero sería igual para Visual Basic ya que las líneas de código son pocas y similares y prácticamente quien sabe programar en Visual Basic no le debe plantear problemas C#. En versiones de Visual Studio anteriores a la 2010 también estaba la alternativa de Crystal Reports, pero tenía el problema de al ser una versión gratuita estaba limitada a que no hubiera más de 5 personas al mismo tiempo generando informes. Ésto en una aplicación de escritorio que no estuviera en red no plantearía problemas, pero en un sitio web colgado en un servidor con miles de conexiones al mismo momento era un poco frustrante. De hecho aún podrías descargar e instalar Crystal Reports para tu Visual Studio ya que existe la versión gratuita. Si te fijas en el instalador verás las 3 letras mágicas por el que ya no viene de serie al instalar Visual Studio 2010 (SAP).
Bueno a lo que iba. Poder hacer informes es una de las cosas más interesantes que se pueden hacer con los datos almacenados en nuestra base de datos. Está bien tener los datos guardados pero esos datos hay que usarlos. Puedes consultar los datos de tus clientes, puedes generar archivos de texto o xml para luego subirlos a un servidor, o por ejemplo puedes usarlos para hacer informes. Cuando digo informes, puedo hablar de informes estadísticos donde se analice la media aritmética, la moda y demás indicadores de la estadística descriptiva para una muestra de datos, informes de análisis de la situación financiera y/o patrimonial de una empresa tipo cuadro de mando integral, informes de notificaciones, o por ejemplo informes tipo facturas emitidas a los proveedores. Este último es muy útil ya que a al tener todas las facturas de ventas en tu base de datos, ya puedes saber si vendes más o menos, puedes saber si una rama de actividad te está generando pérdidas o, ya más propiamente para la gente como yo que se encarga de gestionar la empresa, puedes saber lo que hay que rellenar en las casillas del IVA repercutido del modelo 303. Así doy ideas, ya que automatizarlo todo no es muy difícil si sabes lo que buscas y lógicamente has diseñado correctamente tu base de datos para que haciendo las consultas necesarias obtengas esta información.
Pues bien voy a ver un poco de todo. Voy a explicar cómo crear usando el phpMyAdmin  una base de datos MySQL con una única tabla llamada países. Luego como he dicho voy crear un Sitio Web usando C# que se conectará a esta base de datos y que me mostrará a través del control ReportViewer un informe referente a los habitantes de cada uno de los países que tengo en la base de datos así como un gráfico de barras. A parte el usuario podrá filtrar la información que aparecerá en el informe por el número de habitantes.
Esto es importante: para filtrar los datos se puede hacer de 2 formas. En cualquiera de las 2 formas primero hemos editado el DataSet con el diseñador y hemos añadido una consulta que nos devolverá los países cuya población sea superior a la indicada en el parámetro @valor (guardada con el nombre de FillByGente).
Pues bien si queremos filtrar el informe vía código habría que añadir el siguiente código al evento Click de un botón que en mi ejemplo recibe el nombre de ‘Filtrar’:
    protected void Button1_Click(object sender, EventArgs e)
    {
        datosDataSetTableAdapters.paisesTableAdapter ta = new datosDataSetTableAdapters.paisesTableAdapter();
        datosDataSet.paisesDataTable tabla = new datosDataSet.paisesDataTable();
        ta.FillByGente(tabla, int.Parse(TextBox1.Text));

        ReportViewer1.LocalReport.DataSources.Clear();
        ReportDataSource datasource = new ReportDataSource("DataSet1", (DataTable)tabla);
        ReportViewer1.LocalReport.DataSources.Add(datasource);
        ReportViewer1.LocalReport.Refresh();
    }
Lo único que hace el código es crear un objeto paisesTableAdapter llamado ta y un objeto paisesDataTable llamado tabla (lógicamente la table se llama países). El objeto ta tiene el método creado FillByGente que toma como argumentos el DataTable y el contenido de la caja de texto TextBox1. Gracias a este método FillByGente del TableAdapter rellenamos el DataTable. Pues bien ahora borramos los DataSources que tiene nuestro componente ReportViewer y le añadimos uno nuevo que contiene el DataTable con los datos ya filtrados. Finalmente con el método Refresh() refrescamos los datos.
La segunda alternativa es más sencilla y el único código que habría que usar en el evento Click del botón ‘Filtrar’ es:
 ReportViewer1.LocalReport.Refresh();
Para ello yo utilizaré el origen de datos que se me ha agregado al proyecto llamado ObjectDataSource1 y lo configuraré para que en el método SELECT no me utilice el método GetData() que viene por defecto sino el método GetDataByGente(Int32 valor) que toma como parámetro un Int32 llamado valor que representa la población que el usuario ingresa en la caja de texto TextBox1. Visual Studio esto lo sabe y nos mostrará una pantalla para que le digamos donde se encuentra el origen del parámetro. Seleccionamos en ControlID  el TextBox1, que es el lugar donde el usuario indicará el número habitantes para que se filtre el informe por aquellos países cuyo número de habitantes es mayor o igual al indicado por el usuario en este TextBox1.
Como siempre  cuelgo un vídeo en el que todo quedará más claro.

Bueno en la siguiente entrada colgaré una pequeña aplicación relacionada con temas de impuestos y como una de las opciones de esta aplicación es la de generar pdfs expliaré el proceso de cómo crear pdfs de forma fácil, pero está vez tanto para Visual Basic como para Java, usando iTextSharp e iText.