domingo, 19 de mayo de 2013

Pirámide invertida en lenguaje C (reprogramado)

Tal  como indicaba en el post anterior (http://pai-torneiros.blogspot.com.es/2013/05/piramide-de-asteriscos-invertida-en.html) también es posible enfrentarse a la problemática de la pirámide invertida, intentando resolver el problema de la pirámide invertida, en lugar de apañar el de la pirámide normal.


Para resolver este problema, es preciso analizar como varían el número de espacios y asteriscos a imprimir con respecto al número de línea que se está imprimiendo.

Analizando la situación para un caso sencillo, se puede obtener la relación entre el número de espacios y asteriscos a imprimir y la línea que se está imprimiendo.



En este caso la relación del número de espacios parece evidente, es igual al número de línea menos uno.

En cuanto al número de asteriscos se puede calcular mediante la siguiente fórmula:
(Total de lineas X 2) - (número de espacios X 2) - 1

Para el caso del ejemplo resultará:
línea 1 - (3 X 2) - (0 X 2) - 1 = 6 - 0 - 1 = 5
línea 2 - (3 X 2) - (1 X 2) - 1 = 6 - 2 - 1 = 3
línea 3 - (3 X 2) - (2 X 2) - 1 = 6 - 4 - 1 = 1

Aplicando estos conocimientos se obtiene el código que se puede ver a continuación.

Enlace a compilador web Codepad
http://codepad.org/fYOsqpfe


#include <stdio.h>
#include <stdlib.h>

int main()
{
    int total_lineas = 10, nlinea = 1, nast = 0, nesp = 0;

    printf ("Piramide de asteriscos:\n");
    printf ("Indique cuantos pisos desea que tenga la piramide (Maximo 40 pisos): ");
    scanf("%d", &total_lineas);

    while (nlinea <= total_lineas)
    {
            while (nesp < (nlinea - 1))
            {
                printf(" ");
                nesp++;
            }

            while (nast < ((total_lineas * 2) - (nesp * 2) - 1))
            {
                printf("*");
                nast++;
            }

    nesp = 0;
    nast = 0;
    nlinea++;
    printf("\n");
    }
    return 0;
}

Pirámide de asteriscos invertida en lenguaje C.

Partiendo del código de la pirámide de asteriscos (http://pai-torneiros.blogspot.com.es/2011/08/piramide-de-asteriscos.html), a petición de un lector del blog lo modificaré para que la pirámide aparezca invertida.


Las modificaciones necesarias son mínimas, se trata simplemente de comenzar con el número de línea igual al del total de líneas, mientras que en el final del bucle while en lugar de sumar una línea se le resta (en el código se pueden localizar por ser las líneas que están a continuación de las de los comentarios).

De esta forma con dos cambios mínimos se puede reutilizar el código anterior, sin embargo también se podría reescribir el código para que quedase más claro. Eso lo veremos en otro post.

Enlace a compilador web CodePad
http://codepad.org/NMvMY8EP


#include <stdio.h>
#include <stdlib.h>

int main()
{

    int total_lineas = 10, nlinea = 0, nast = 0, nesp = 0;

    printf ("Piramide de asteriscos:\n");
    printf ("Indique cuantos pisos desea que tenga la piramide (Maximo 40 pisos): ");
    scanf("%d", &total_lineas);

    // inicializo nlinea al numero total de lineas
    nlinea = total_lineas;

    while (nlinea > 0)
    {
            while (nesp < total_lineas - nlinea)
            {
                printf(" ");
                nesp++;
            }
            while (nast < ((nlinea * 2) - 1))
            {
                printf("*");
                nast++;
            }
    nesp = 0;
    nast = 0;
    //resto una linea cada vez
    nlinea--;
    printf("\n");
    }
    return 0;
}

sábado, 24 de diciembre de 2011

Mensaje navideño de fin de curso


Mensaje navideño de fin de curso





Este post es solo para desearos Feliz Navidad a todos.

Solo recordaros que aquellos que que estéis interesado en que se haga referencia a que vuestro trabajo en este blog, os pongáis en contacto conmigo.

También podéis elegir si lo que queréis es un texto con capturas de imagen, vídeos, o incluso incluir un enlace de descarga al ejecutable.

Sin más os deseo lo mejor en estas fiestas y que el futuro os sonría.

Vicente Arosa

Fuente Imagen: Foto realizada por Vicente Arosa

martes, 13 de diciembre de 2011

Atención al cliente

Presentación sobre la atención al cliente

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Presentación
https://docs.google.com/presentation/d/1bh9eo_lManfQRgUvFD4bviLESv1bU95gfBO6KpkJ8_o/edit

lunes, 12 de diciembre de 2011

Grabación de soportes opticos


Métodos de Grabación o Quemado de soportes gráficos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Presentación

https://docs.google.com/presentation/d/1rCP5WuXTDQ250DT_kbPengDNRnrtTLWLSiLhK5vU1PY/edit

Seguridad del software

Seguridad del software

Métodos de protección de aplicaciones informáticas.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Presentación

https://docs.google.com/presentation/d/1dsOumQLeA2i0emMDDCh4DyFxvnw99kY4ECqGS3_LhSI/edit




lunes, 5 de diciembre de 2011

Autoejecutables


Creación de CDs Autoejecutables.

Presentación:
https://docs.google.com/presentation/d/1xkjGYQJeXy5jyAk0ejZL2RN2YE-kCmMCwwbNB8NqmNI/edit





Cd autoejecutable
Introducción

En Windows, los parámetros de autoejecución se definen en un documento de texto sin formato llamado Autorun.inf, que se debe guardar en la carpeta principal de la unidad en cuestión.

Aunque es posible utilizarlo en unidades USB, es necesario activarlo modificando el registro de windows.


Comandos

Los posibles comandos son:


  • icon
  • label
  • open
  • shellexecute
  • shell
  • shell\verb



Comentarios

El comentario es el punto y coma ;



Asignar un icono al CD
Icon

Establece un icono al medio removible, el cual es visible en el Explorador de Windows y en Mi PC.

El archivo debe tener extensión .ico o .bmp en caso de que se trate, exclusivamente, de un archivo de imagen.

Ejemplos:

icon=icono.ico


Asignar un icono al CD
Icon

También se puede emplear un icono incrustado en un archivo ejecutable (.exe) o uno de librería (.dll).

Se puede añadir una coma y un número a continuación en el caso de que el archivo elegido contenga más de un icono.

Ejemplos:
icon=archivo.exe,1

O también podemos escribirlo de la siguiente forma para el caso de los archivos .exe y .dll que contengan varios iconos:

icon=icono.exe
IconIndex=1


Abrir aplicaciones

Open

Abre una aplicación o archivo ejecutable guardado en el medio extraíble.

Se emplea, fundamentalmente, para iniciar la instalación de un programa de forma automática.

Ejemplo (para archivos ejecutables):

open=setup.exe


Abrir aplicaciones

Open

Se puede especificar el nombre de cualquier tipo de archivo, cuidando de que, si no es un archivo ejecutable (.exe, .bat, .com), se anteponga el comando "Start" a la ruta del mismo.

Ejemplo (para archivos no ejecutables):
open=Start 5años.pps

Ejemplo (para archivos no ejecutables con programa especifico):
open=programa.exe archivonoejecutable.extensión

Ejemplo (en caso de tener un archivo no ejecutable con espacios el nombre de este deberá ir entre comillas)
open=Start "mi presentación.pps"


Cambiar nombre dispositivo

Label

Etiqueta el medio extraíble con un nombre que sustituirá al nombre integrado.

En windows la etiqueta tiene un maximo de 32 caracteres, al sobre pasar esta cantidad, es posible no recibir un mensaje de error del S.O., tampoco se mostrarán más de 32 caracteres.

Ejemplo: (no se pone con comillas)
label=TPV Bar Arosa


Abrir archivos no ejecutables

Shellexecute

Abre un archivo no ejecutable, como por ejemplo, una página web o un documento PDF.

Ejemplo:
shellexecute=Inicio2007.html


Menú contextual

Shell\verb
Agregar opciones al menú contextual del medio extraíble (CD, DVD, etc.), accesible desde el Explorador de Windows.

Se pueden añadir tantas opciones como se desee.

La forma de usarlo es la siguiente:

shell\verb=&Instalar
shell\verb\command=Setup.exe
shell=verb


Menú contextual

Shell\verb

La palabra verb es un objeto de tipo MenuItem.

Los objetos MenuItem deben ser únicos, cuya línea de comando (command) respectiva deberá ser también la misma palabra.

La palabra command es la línea de comandos que el sistema operativo ejecutará, cuando se haga click en el menú.

El símbolo & indica que la letra que le sigue se definirá como tecla de acceso directo para ejecutar dicha opción.


Menú contextual


Cuando se hace doble clic a la unidad se ejecuta la acción definida por shell=verb donde verb es alguno de los objetos definidos anteriormente, además pasa a ser el primer ítem del menú contextual.

Si no se define, la acción por defecto será abrir la unidad en una ventana nueva.
Menú contextual

Ejemplo. Agregar 2 opciones nuevas al menú contextual sustituyendo la palabra verb por ejemplo y WindowsMSN, hacer de ejemplo la acción por defecto de la unidad:

shell\ejemplo=&Ejemplo
shell\ejemplo\command=ejemplo.exe

shell\WindowsMSN=&Instalar mensajero
shell\WindowsMSN\command=msnInstall.exe

shell=ejemplo


Autoejecución
UseAutoPlay

Especifica al sistema operativo si debe hacer caso o no de la información de autoejecución (autorun.ini) contenida en el medio extraíble. Si el valor es igual a 1se está indicando que sí. Un valor igual a 0 le indicará que lo omita.

En caso de que autoplay esté habilitado, significa que el sistema puede mostrar su diálogo de opciones de auto ejecución.

Con Windows, es soportado desde su versión Windows XP, en adelante.

UseAutoPlay=1


Descripción de contenido
[Content]
Establece el tipo de archivos multimedia (música, vídeo, imágenes) que se muestra en el diálogo Autoplay de windows.

Sólo para Windows Vista.

La finalidad de esta sección es permitir al autor que comunique que tipo de contenido se muestra en el Autoplay. Por ejemplo, un CD puede ser mostrado como que sólo tiene contenido de música aunque también contenga imágenes y vídeos, de otro modo mostraría que tiene contenido mixto.

MusicFiles, PictureFiles y VideoFiles.

Para que se muestren se pueden usar los valores: 1, y, yes, t, true. Para que no se muestren se pueden usar los valores: 0, n, no, f, false.


Descripción de contenido

Ejemplo:

[Content]
MusicFiles=Y
PictureFiles=0
VideoFiles=false


Contenido

[ExclusiveContentPaths]

Disponible a partir de Windows Vista.

Las carpetas listadas en esta sección limitan a Autoplay a buscar contenido sólo en esas carpetas y subcarpetas.

Esto permite al autor limitar las áreas de disco donde se encuentran los contenidos y mejorar el rendimiento a la hora de buscar contenido ya que no se escanea la unidad entera.

Los siguientes ejemplos son rutas válidas:
[ExclusiveContentPaths]
\music
\music\more music
music2


Contenido

[IgnoreContentPaths]

Disponible a partir de Windows Vista.

Hace lo inverso al anterior, es decir, ignora las carpetas y subcarpetas que le indiquemos.

Se puede usar junto a ExclusiveContentPaths para eliminar búsquedas en subcarpetas.

Ejempplo: [IgnoreContentPaths]
\music\covers
\images
music3


Controladores

[DeviceInstall]

Sólo soportado en Windows XP.

Establece la ruta para la búsqueda recursiva de archivos de controladores en la unidad.

Sólo es usado a la hora de instalar controladores y no como operaciones de Autorun.

Si no se pone la entrada DriverPath en [DeviceInstall] o la entrada DriverPath, no tiene ningún valor, entonces la unidad es ignorada durante una búsqueda de archivos de controladores.


Controladores

Ejemplos:

[DeviceInstall]
DriverPath=drivers

Buscará en la carpeta drivers y todos sus subdirectorios.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

[DeviceInstall]
DriverPath=drivers\video
DriverPath=drivers\audio

Buscará recursivamente sólo en los subdirectorios video y audio de la carpeta drivers.


Ejemplo
[autorun]
;open=5040_Messagebox.exe
icon=icono.ico

label=TPV_TACTIL_V1

SHELL\EXPLORAR=Explorar o contido do DVD
SHELL\EXPLORAR\COMMAND=EXPLORER.EXE /E,\

SHELL\INSTALAR=Instalar a aplicación
SHELL\INSTALAR\COMMAND=5040_Messagebox.exe

SHELL = INSTALAR


Conclusión
El caso más habitual es asignar un icono y activar la ejecución de un fichero.



NOTA:
Independientemente de si está habilitada la autoejecución de los CDs o no, las entradas icon y label siempre se ejecutan.









miércoles, 30 de noviembre de 2011

Empaquetar aplicaciones

Para crear paquetes de distribución de aplicaciones, se puede utilizar el entorno de programación, o aplicaciones externas.

Entre las aplicaciones GPL disponibles destaca
Inno Setup http://www.jrsoftware.org/isinfo.php
Enlace de descarga del ejecutable -> http://mlaan2.home.xs4all.nl/ispack/isetup-5.4.2.exe

Sobre esta aplicación se pueden ejecutar otras aplicaciones que facilitan la creación de los paquetes de distribución:

IsTool -> http://sourceforge.net/projects/istool/files/1.%20ISTool/release-5.2.1/istool-5.2.1.exe/download
InnoIDE -> http://www.innoide.org/

jueves, 24 de noviembre de 2011

Try Catch Finally


Control extructurado de errores (excepciones) mediante Try Catch Finally

https://docs.google.com/presentation/d/15nXdmA8MPU-EtWKsMemRCxFMBCELyPEWGgyATyErRek/edit





Una vez subsanados los errores de sintaxis en tiempo de diseño, conocidos como errores de compilación. La aplicación ya se puede compilar.

Sin embargo pueden seguir existiendo errores, que al no deberse a mala sintaxis no son detectables por el IDE.

Estos errores se detectarán al ejecutar la aplicación desde el IDE, y provocan que la ejecución de la aplicación se detenga de forma no deseada.

Los errores detectados en esta etapa se conocen como errores en tiempo de ejecución o excepciones.

Los errores en tiempo de ejecución, usualmente se pueden solucionar reescribiendo el código de la parte afectada.

ej.En una división, en la que se producirá una excepción si se intenta dividir entre cero.

La mayor parte de este tipo de errores se puede solucionar, incluyendo en el código validaciones previas a la ejecución del código que provoca el error.

Sin embargo a pesar de validar los datos que se introducen, se puede dar el caso de que se produzcan excepciones.

Un ejemplo sería el caso de un fichero dañado o incompatible.

Para obtener un listado de las excepciones se puede acceder a la web de MSDN:
La clase Exception representa todas las excepciones que se producen durante la ejecución de una aplicación
http://msdn.microsoft.com/es-es/library/system.exception.aspx

En concreto las excepciones que más nos interesan son las de sistema:
La clase SystemExcepciton es la clase base para las excepciones predefinidas en el espacio de nombres System
http://msdn.microsoft.com/es-es/library/system.systemexception.aspx

Entre ellas podemos encontrar:

Fichero inexistente (FileNotFoundException)
Excepción que se produce cuando se produce un error al intentar tener acceso a un archivo que no existe en el disco.
http://msdn.microsoft.com/es-es/library/system.io.filenotfoundexception.aspx

División por cero (DivideByZeroException)
Excepción que se produce cuando se intenta dividir un valor entero o decimal entre cero.
http://msdn.microsoft.com/es-es/library/system.dividebyzeroexception.aspx

Asignación incorrecta (InvalidCastException)
Indica una conversión de tipos o una conversión explícita de otra naturaleza que no es válida.
http://msdn.microsoft.com/es-es/library/system.invalidcastexception.aspx

Indice de matriz incorrecto (IndexOutOfRangeException)
Se produce cuando se intenta tener acceso a un elemento de una matriz con un índice que está fuera de los límites de la matriz.
http://msdn.microsoft.com/es-es/library/system.indexoutofrangeexception.aspx

La forma de tratar estas excepciones es a través de

Try ..... Catch .... Finally

Esta instrucción permite capturar las excepciones y ejecutar las instrucciones deseadas para controlarlas.

Es posible indicar vários bloques Catch, de los cuales solo se ejecutará uno, comenzando a evaluarlos por el primero.

Se aconseja indicar en el primer bloque Catch las excepciones más concretas y en los subsiguentes las más genéricas.

Bibliografía
MSDN.
Wikipedia.

viernes, 18 de noviembre de 2011

Implementación de ayudas con HelpProvider

Uso del control HelpProvider para implementar ayudas en programas Visual Basic.

El uso de este control permite mostrar información contextual sobre los controles de un formulario de forma sencilla.

Cuando se usa este control, se activa un botón en la barra de título del formulario con un interrogante. Al pulsar en ese interrogante se cambia el icono del ratón, y pulsando en cualquier control se muestra una ayuda contextual acerca del funcionamiento de ese control.



El mismo efecto produce pulsar la tecla F1 sobre un control que tenga el foco activado.

Este control está pensado para ser usado en cuadros de diálogo, por lo que exige el cumplimiento de unos requisitos.

1 - Activar el botón de ayuda
HelpButton = True

2 - Desactivar el botón Minimizar
Me.MinimizeBox = False

3 - Desactivar el botón Maximizar
Me.MaximizeBox = False

NOTA: En caso de no desactivar los botones de minimizar y maximizar, el botón de ayuda (HelpButton) no se mostrará aunque se haya activado.


    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.MaximizeBox = False
        Me.MinimizeBox = False
    End Sub

En caso de realizar el proceso correctamente los cuadros que aparecen en la parte superior derecha del formulario se cambian. de la siguiente manera:

Estado originalTras aplicar cambios



Una vez realizadas estas operaciones ya se pueden asignar los valores deseados a las propiedades de los controles.

Tras insertar el control HelpProvider, en todos los controles aparecerán cuatro nuevas propiedades:

  1. HelpKeyword.
  2. HelpNavigator.
  3. HelpString.
  4. ShowHelp.

El comportamiento de la ayuda contextual variará dependiendo de los valores asignados a estas propiedades.

En primer lugar, si se asigna el valor False a la propiedad ShowHelp, no se mostrará ayuda contextual.




Por lo tanto para poder usar este control se debe asignar el valor True a la propiedad ShowHelp

























    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        HelpButton = True
        Me.MaximizeBox = False
        Me.MinimizeBox = False
    End Sub

Otros usos de Visual Basic


Presentación otros usos de Visual Basic

https://docs.google.com/presentation/d/1SeDRmuJhFYupB0h-9sM1Vwqe1WrXjtMPmKN_kWnyIfo/edit


jueves, 17 de noviembre de 2011

Implementación de ayudas con Help.ShowHelp

Implementación de ayudas con Help.ShowHelp

Net Framework implementa la clase Help que permite gestionar los ficheros de ayuda, tanto ficheros de tipo chp, hlp como html.

Estos ejemplos se realizarán con el fichero con un fichero CHM, creado con HelpNDoc.







        'Abre la ayuda en contenido
        Help.ShowHelp(Me, "c:/ejemplo.chm")








        'Abre la ayuda en indice
        Help.ShowHelpIndex(Me, "c:/ejemplo.chm")









        'Abre la ayuda en indice
        Help.ShowHelp(Me, "c:/ejemplo.chm", HelpNavigator.Index)








        'Abre la ayuda en búsqueda
        Help.ShowHelp(Me, "c:/ejemplo.chm", HelpNavigator.Find, "")







        'Abre la ayuda en topic
        Help.ShowHelp(Me, "c:/ejemplo.chm", HelpNavigator.TopicId, "7")







        'Abre la ayuda en Keyword
        'si el keyword esta asignado a varios topics abre la ventana de seleccion
        Help.ShowHelp(Me, "c:/ejemplo.chm", HelpNavigator.KeywordIndex, "numeros")


miércoles, 9 de noviembre de 2011

Diagrama de Gantt

Enlace a la presentación sobre el diagrama de Gantt

https://docs.google.com/presentation/d/1Gi2OCTg24fdiLPWMud6Z5NEytPVByklc68LPlplWF3Q/edit

Rellenar un DataGridView

En este ejemplo se muestra como rellenar un DataGridView, a partir de una tabla, sin haber creado con anterioridad las columnas.

Se parte de un formulario en el que se incluye un DataGridView, sin configurar ninguna columna.

Tanto las columnas como las filas serán anexadas mediante código.



El resultado final será un DataGridView, que contendrá todas las columnas que devuelva la consulta a la base de datos. Incluyendo la posibilidad de añadir otras mediante código.


ACLARACIÓN:


En el caso de conocer cuantas columnas nos devolverá la consulta se pueden añadir de una en una con la instrucción DataGridView1.Columns.Add, pasandole como parámetro el nombre de cada columna, y el texto que aparecerá en la cabecera de la misma.
Suele ser habitual que ambos sean iguales, aunque no es imprescindible.

Con esto se puede recuperar el nombre de la tabla:
DataGridView1.Columns.Add(lector.GetName(0), lector.GetName(0))

O también se puede asignar el nombre que se desee:
DataGridView1.Columns.Add("Nombre columna", "Texto Cabecera Columna")

En caso de no conocer cuantas columnas devolverá la consulta, es posible realizar un bucle que añada columnas hasta alcanzar el valor indicado por el lector, en la propiedad FieldCount.

For i As Integer = 0 To lector.FieldCount - 1
      DataGridView1.Columns.Add(lector.GetName(i), lector.GetName(i))
Next

En cuanto al proceso de rellenar las filas se pueden añadir como se mostró en el ejemplo anterior o utilizando una tabla de cadenas de caracteres.
En el detalla se muestra esta solución:

 DataGridView1.Columns.Add("Importe", "Importe")
        Dim tabla_cadenas(lector.FieldCount) As String
        While lector.Read()
            'Se añade una fila al grid con un string por cada columna
            For j As Integer = 0 To lector.FieldCount - 1
                tabla_cadenas(j) = lector.GetValue(j).ToString
            Next
            DataGridView1.Rows.Add(tabla_cadenas)
        End While

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ejemplo de código
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

'1 - Importar espacio de nombres
Imports System.Data.OleDb

Public Class Form5

    Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '2 - crear conexion
        Dim conexion As New OleDbConnection

        '3 - cadena de conexion
        conexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\factura_cliente.accdb;Persist Security Info=False;"

        '4 - abrir conexion
        conexion.Open()

        '5 - crear la sentencia SQL
        Dim comando_SQL As New OleDbCommand("SELECT * FROM Lineas_factura WHERE Numero_factura_fk = " & Form2.factura_numero, conexion)

        '6 - se crea el reader
        Dim lector As OleDbDataReader = comando_SQL.ExecuteReader

        ' *****************************************************************
        '7 - Mostrar valores del reader en el DataGridView
        DataGridView1.Rows.Clear()
        'DataGridView1.Columns(0).HeaderText = lector.GetName(0)
        'DataGridView1.Columns.Add(lector.GetName(0), lector.GetName(0))
        'DataGridView1.Columns.Add(lector.GetName(1), lector.GetName(1))
        'DataGridView1.Columns.Add(lector.GetName(2), lector.GetName(2))
        'DataGridView1.Columns.Add(lector.GetName(3), lector.GetName(3))
        'DataGridView1.Columns.Add(lector.GetName(4), lector.GetName(4))

        'Otra opción de añadir columnas
        For i As Integer = 0 To lector.FieldCount - 1
            DataGridView1.Columns.Add(lector.GetName(i), lector.GetName(i))
        Next

        DataGridView1.Columns.Add("Importe", "Importe")

        Dim tabla_cadenas(lector.FieldCount) As String

        While lector.Read()
            'Se añade una fila al grid con un string por cada columna
            'DataGridView1.Rows.Add(lector.GetValue(0), lector.GetValue(1), lector.GetValue(2), lector.GetValue(3), lector.GetValue(4))

            For j As Integer = 0 To lector.FieldCount - 1
                tabla_cadenas(j) = lector.GetValue(j).ToString
            Next

            DataGridView1.Rows.Add(tabla_cadenas)

        End While

        'punto final cerrar conexion
        conexion.Close()

        Dim total_factura As Single
        Dim parcial_factura As Single

        'Se restan 2 a DataGridView1.Rows.Count para descartar la línea en blanco
        For i As Integer = 0 To DataGridView1.Rows.Count - 2
            parcial_factura = CSng(DataGridView1.Rows(i).Cells(3).Value) * CSng(DataGridView1.Rows(i).Cells(4).Value)
            total_factura += parcial_factura
            DataGridView1.Rows(i).Cells(5).Value = parcial_factura
        Next

        '**********************************************************************

        TextBox1.Text = Form2.factura_numero
        TextBox2.Text = Form2.factura_fecha
        TextBox4.Text = Form1.codigo_cliente
        TextBox5.Text = Form1.dato_Nombre_fiscal
        TextBox6.Text = Form1.dato_Cif
        TextBox7.Text = Form1.dato_Direccion
        TextBox3.Text = Form1.dato_Nombre_comercial
        TextBox5.Text = Form1.dato_Nombre_fiscal

        TextBox8.Text = total_factura.ToString
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form6.Show()
    End Sub
End Class

martes, 8 de noviembre de 2011

Ejercicio final de curso - Enunciado


Ejercicio final de curso

Sois autónomos y tenéis una empresa de programación en la que sois el único empleado.

Un día os llama por teléfono el jefe de camareros del “Bar Arosa”, indicándoos que han conseguido una buena oferta por un TPV, pero no tiene programa, y que pretenden cambiar la caja registradora actual por este dispositivo.

Le ha indicado un conocido común que os dedicáis a la programación y os quiere solicitar la creación de una aplicación para la venta en barra de la cafetería.

Las aplicaciones comerciales le vienen un tanto grandes, y os pide un desarrollo a medida.

Os solicita un programa con las siguientes características:
Que sea fácil de usar, ya que lo tienen que utilizar los camareros y los que actualmente trabajan no tienen conocimientos informáticos, y están acostumbrados al uso de la caja registradora.
El programa será muy sencillo, solo tiene que permitir realizar las ventas y controlar el stock, también deberá permitir reimprimir tickets en caso de que el cliente así lo solicite.
Muestra su preocupación por el tema de los permisos de los usuarios y también por las posibles pérdidas de datos.
No es capaz de concretaros si se utilizará lector de código de barras o no, ni si será preciso realizar algún tipo de listado.

Puntuación
Concepto
2
Pseudocódigo en un fichero tipo Word
0,5
Añadir Clientes, Artículos y Proveedores
0,5
Modificar Clientes, Artículos y Proveedores
0,5
Eliminar Clientes, Artículos y Proveedores
0,5
Eliminar tickets, facturas
0,5
Imprimir tickets venta
0,5
Consultar ticket venta – factura compra
0,5
Listado de stock de artículos, cliente y proveedor a pantalla
0,5
Exportación de listados de stock a ficheros de texto
0,5
Listado 347 para clientes y proveedores, pantalla y texto
1
Permisos de usuario
1
Interfaz táctil
0,5
Copia de seguridad de base de datos a FTP
1
Facilidad de uso


Nota:
Cualquier aclaración sobre el contenido del enunciado se solicitará y será respondida a través del blog, estando disponible una entrada para cada alumno, a fin de personalizar las respuestas a cada caso.
Las consultas de tipo genérico podrán ser respondidas en clase.





Buenos días, soy el señor Arosa, propietario del Bar Arosa.


Acabo de recibir a mi jefe de camareros, al que le pedí que se pusiese en contacto con ustedes para indicarles que me hiciesen un programa para el TPV que he comprado de segunda mano.


En concreto el modelo que he adquirido es un Toshiba ST-A10
Características TPV Toshiva ST-A10


He tenido la oportunidad de recibir demostraciones de diversos programas de TPV comerciales, y se me hacen demasiado grandes, con demasiadas funciones.


Lo que necesito es un programa que permita a los camareros que vendan de forma sencilla.


Se imprimirán todos los tickets de venta.


Me gustaría que fuese fácilmente configurable, pudiendo asignar a cada artículo una posición en la pantalla.


También me interesaría poder obtener información de las últimas compras, sin tener que andar llamando por teléfono a mi gestoría que es quien tiene todas las facturas.


También me interesa poder saber el stock de un artículo a seleccionar, así como los artículos y cantidades vendidas a un cliente o compradas a un proveedor

Rellenar un DataGridView


Rellenar un DataGridView a partir de una base de datos Microsoft Access mediante un DataReader.

La intención es poder leer y filtrar los datos almacenados en una tabla de la Base de Datos.

Es resultado final esperado es el mostrado en la siguiente imagen:



Para ello se parte de un formulario en el que se incluyen dos Labels y dos Textbox para indicar el filtro a aplicar.

También se incluye un Button para aplicar el filtro.

Finalmente para albergar los datos se utiliza un control DataGridView.

Para simplificar el proceso y dado que se conoce de antemano el número de campos que devolverá la consulta a la Base de Datos, se añaden las columnas adecuadas en tiempo de diseño.


El proceso para agregar las columnas, implica acceder a las propiedades del control DataGridView1, Seleccionar la opción Columns, en la ventana que aparece, pulsar el botón Agregar.


Aparece una nueva ventana (Agregar columna), en la que se indicarán dos datos:
Nombre - Será el nombre de la columna, que nos servirá para acceder a ella mediante código.
Texto del encabezado - Será el texto que aparecerá en la cabecera de la columna.
Suele ser normal aplicar el mismo valor a estas dos propiedades, definiendo tanto el nombre como el texto al mismo valor.


El código para agregar filas al DataGrid es el siguiente:


    '7 - Mostrar valores del reader en el DataGridView
        DataGridView1.Rows.Clear()


        While lector.Read()
            'Se añade una fila al grid con un string por cada columna
            DataGridView1.Rows.Add(lector.GetValue(0), lector.GetValue(1), lector.GetValue(2), lector.GetValue(3), lector.GetValue(4))
        End While


En este código primero se eliminan las filas existentes.
DataGridView1.Rows.Clear()



Luego se ejecuta un bucle hasta que se llegue al final del lector que es un DataReader.
While lector.Read()


Dentro del bucle While se ejecuta el procedimiento Add que permite añadir filas en el DataGridView.
Recibe como parámetros una variable de tipo objeto con el contenido de cada celda de la fila a añadir.

DataGridView1.Rows.Add(lector.GetValue(0), lector.GetValue(1), lector.GetValue(2), lector.GetValue(3), lector.GetValue(4))


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ejemplo de código
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


'1 - Importar espacio de nombres
Imports System.Data.OleDb

Public Class Form1

    Public codigo_cliente As String

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        '2 - crear conexion
        Dim conexion As New OleDbConnection

        '3 - cadena de conexion
        conexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\factura_cliente.accdb;Persist Security Info=False;"

        '4 - abrir conexion
        conexion.Open()

        '5 - crear la sentencia SQL
        Dim comando_SQL As New OleDbCommand("SELECT * FROM Clientes WHERE Id_cliente BETWEEN " & TextBox1.Text & " AND " & TextBox2.Text & " ORDER BY Id_cliente", conexion)

        '6 - se crea el reader
        Dim lector As OleDbDataReader = comando_SQL.ExecuteReader

        ' *****************************************************************
        '7 - Mostrar valores del reader en el DataGridView
        DataGridView1.Rows.Clear()

        While lector.Read()
            'Se añade una fila al grid con un string por cada columna
            DataGridView1.Rows.Add(lector.GetValue(0), lector.GetValue(1), lector.GetValue(2), lector.GetValue(3), lector.GetValue(4))
        End While

        '**********************************************************************

        'punto final cerrar conexion
        conexion.Close()
    End Sub
End Class
Related Posts Plugin for WordPress, Blogger...