Título: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 05:05 am Dado que he puesto un ejercicio 17 que en realidad es un proyecto voy a hacerlo yo aquí paso a paso para que podais seguirme.
Este post está bloqueado para que no se me pierda el hilo, pero si teneis problemas posteadlas y en paz. Voy a utilizar el modelo de objetos DAO por ser mas comprensible. Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 05:28 am Creación de base de datos
Utilizaré la utilidad de devstudio 6.0 para crear la base de datos. La estructura es: Código: Tabla clientes Código: Articulos Código: Tabla facturas Código: tabla EntradasFacturas Como veis en cada tabla creo un índice que me permitirá acceder a cada registro directamente. Por sencillez voy a obviar relaciones entre tablas y no voy a realizar ninguna relación, pero debeis considerar lo siguiente: Cada factura tiene un registro (y solo uno) en la tabla facturas. Aquí se almacenan los datos básicos de la factura. Esto es 'qué cliente', 'Qué fecha','Qué numero','qué importe total','como se paga'. Cada factura tiene un código único que la identifica y en este caso se llama 'codigo'. La tabla facturas está indexada por él para poder acceder directamente a cada factura. En una factura se pueden comprar varias cosas. Por eso hay una segunda tabla llamada 'EntradasFacturas'. Esta tabla almacena las líneas (el detalle) de cada factura. Aquí hay cosas como 'Qué se ha comprado','qué cantidad','a que precio'. Para saber a que factura corresponde cada línea hay un CodigoFactura de manera que si una factura tiene por código el valor '7887' en facturas, todas sus entradas en la tabla 'EntradasFacturas' tienen ese valor en el campo CodigoFactura. Para los interesados sería una buena idea establecer una relación de integridad referencial uno a varios entre estas dos tablas (tema que como dije voy a obviar). Cada entrada también tiene un código que la identifica de forma precisa. Para rellenar esas facturas tendré que acceder a los clientes (razón por la que tengo un código en clientes que identifica a cada cliente y un código en artículos que identifica a cada artículo). Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 05:39 am Realización del módulo inicial de aplicación
Voy a realizar un módulo que se cargará inicialmente al llamar a la aplicación. Su labor: mostrará una página de presentación mientras el programa se carga y además leerá la configuración inicial de un archivo de texto llamado 'config.ini' que estará en c:\' Esta configuración inicial indica donde está la base de datos que queremos usar. Declaración de variables globales. Funcionarán en todo el proyecto. 'BaseDeDatos' es un string que contendrá la dirección completa a mi base de datos mdb. Su valor será algo así como 'c:\documents and Settings\usuario\Mis Documentos\MiBase.mdb' Código: Global BaseDeDatos as string, Trayecto as string Esta es la rutina principal. Para que sea la que se ejecute al inicio habrá que ir a las propiedades del proyecto e indicar que el objeto inicial es Main. Código: Sub main() La función Msg la hago para facilitarme el uso de mensajes durante toda la aplicación. Código: Function Msg(txt As String, opcion As String) Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 06:40 am Realización de formulario de pantalla inicial
Para el formulario inicial he pensado utilizar el asistente para pantallas de bienvenida y modificarlo oportunamente. Para que salgan los datos precisos en este formulario deberías comprobar que las propiedades del proyecto están bien puestas (nombre de aplicación, versión, etc). Se llamará FrmSplash Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 06:56 am Creación de formulario para elegir base de datos a usar
Se llamará CfgDatos (Yo comienzo con Cfg todos los formularios que tienen que ver con configuración). El código del botón de búsqueda (el que está en círculo). Utilizo un CommonDialog llamado Dialogo para seleccionar la base de datos que quiero usar. Código: sub Command1_Click() Dialogo tiene puestas las siguientes propiedades: Código: CancelError = true El botón de grabar tiene el siguiente código Código: Private Sub Command2_Click() El formulario al cargarse realiza el siguiente código Código: Private Sub Form_Load() Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 07:05 am Creación del formulario principal de la aplicación
Utilizaré un formulario MDI al que llamaré 'principal' En el crearé un menú con dos opciones (de momento) tal como se ve en la figura. El código que tiene es el siguiente: Al pinchar en la opción 'Parámetros generales' Código: Private Sub MnuParametros_Click() El código de terminar Código: Private sub MnuFin_Click() Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 07:37 am Gestión de Clientes
Para la gestión de clientes he pensado utilizar un formulario donde saldrá un dbgrid enlazado a un control data (oculto) que mostrará los clientes. Estos datos saldrán de un recordset de tipo snapshot por las siguientes razones: 1. Los datos serán de solo lectura lo que agiliza la consulta de datos 2. Se desea que los datos no sean actualizables aquí 3. Se podrá ordenar por donde se quiera y buscar con facilidad. Al hacer doble click sobre el grid sale un menú que permite agregar, modificar, ver o borrar clientes. Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 07:54 am Formulario principal de clientes
Será un formulario child del mdi y aparecerá maximizado. Se llamará ClientesGeneral Para llamar a este formulario desde el menú principal tendremos que agregar una nueva opción al menú que será la opción de clientes. Al pinchar en aquella opción se ejecuta el siguiente código: Código: Private Sub MnuClientes_Click De esta forma el formulario funcionará en cualquier lugar que esté la base de datos. El código que hay en este formulario es el siguiente: El código del control text Código: Private Sub Text1_Change() Botón de buscar siguiente Código: Private Sub Command2_Click() Los códigos del dbgrid Código: Private Sub DBGrid1_DblClick() Código: Private Sub DBGrid1_HeadClick(ByVal ColIndex As Integer) Y ya hemos terminado. Fijaos que poco código y que bien funciona. Para que funcione perfecto os pongo las propiedades que tienen El dbgrid Código: allowaddnew=false El data Código: visible=false Pues eso. 5 minutos y chachi piruli. Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 7 Julio 2004, 08:00 am Menú de Clientes
El menú de clientes será un formulario modal que saldrá centrado en la pantalla. Luego explico estas opciones. Ahora me voy a cenar!! ;D Título: Re: Proyecto: Gestión de facturas (visita guiada) Publicado por: soplo en 17 Julio 2004, 08:15 am Agregar/Modificar/Ver/Borrar Clientes
Agregar Clientes Para agregar clientes he pensado en utilizar un formulario al que llamaré 'clientesficha.rm' que saldrá en blanco (naturalmente) que al rellenarlo y pulsar grabar se grabe en la tabla de clientes. Voy a hacerlo de manera que el mismo formulario me valdrá luego sin apenas cambios para ver el cliente y modificar sus datos. Fijaos además que inicialmente no hay ninguna conexión del formulario a la tabla. En el momento que se pulsa grabar se abre la conexión (en este caso un recordset dao), se graba y se cierra. Esto es importante cuando hagais programación en red (no es este caso) porque si añadiera un registro inicialmente y luego al pulsar grabar hiciera el update lo que habría conseguido es tener ocupada la página de este registro hasta que el usuario pulse grabar. Mientras tanto esa página permanece bloqueada (no solo ese registro sino 64k bytes de datos) por lo que podría ocurrir que otro usuario no pueda modificar un cliente porque este no ha pulsado aún grabar. Y puede ocurrir que deje el cliente a medio meter y se ponga a hablar por teléfono. Por eso lo que hago es mostrar un formulario simple donde solo se rellenan datos. En el momento que se graba se abre la conexión, se mueven los campos a base de datos y se cierra la conexión. Este el el código que hay al pulsar la opción de agregar clientes Código: Load ClientesFicha Borrar Clientes Para entrar en el menú hicimos doble click sobre un cliente en la pantalla general de clientes (ClientesGeneral.frm). Pues ese cliente es el cliente activo. Si ahora pulso Eliminar cliente elimino a este cliente. Al hacer doble click sobre ese cliente naturalmente el data que proporciona el recordset en clientesgeneral se posicionó en ese registro. Os recuerdo que cada cliente tiene un código único que se genera automáticamente de forma que para saber que cliente es desde otro formulario solo tengo que preguntar por 'ClientesGeneral.data1.recordset.fields("codigo")'. Este es el código para borrar clientes Código: On error goto fallo Este caso solo borra a este cliente y se queda tan ancho, sin embargo tenemos que tener presente que en nuestra aplicación habrá registros de facturas que corresponden a este cliente y no puede ocurrir que haya facturas que no pertenezcan a ningún cliente. Esto tiene dos soluciones a) realizo una relación de integridad referencial entre clientes y facturas de forma que al eliminar el cliente se borran todas sus facturas (en este caso vale el código anterior). Ya indiqué al inicio de esta visita que esa opción la descartaba yo. Este es un curso de visual basic. La otra opción es modificar el código anterior para borrar todos los registros de facturas que sean de este cliente. Dado que aún no hemos tocado el tema de facturas os recuerdo que cada factura tenía un registro (y solo uno) que identificaba de forma inequívoca a cada factura. En esta tabla había un campo llamado CodigoCliente que identifica al cliente de cada factura. El código en este caso sería así Código: With ClientesGeneral.Data1.Recordset.Fields("codigo") Como veis en este caso se debe borrar de dos tablas o de ninguna. Por ello creo una transacción (begintrans) y empiezo a borrar. Si ocurre un error saltará a fallo donde hay una claúsula rollback que devolverá todas las cosas al estado anterior a begintrans. Si no ocurre un error llegará a committrans que hará los cambios ya permanentes. Fijaos que las órdenes sql llevan el parámetro dbfailonerror. Esto es porque si no lo llevan aunque ocurra un error no generan error. Modificar Clienes Para modificar un cliente haré algo muy parecido a la rutina de agregar clientes nuevos. Solo que esta vez en vez de aparecer el formulario de antes (clientesficha) vacío esta vez aparecerá lleno con los datos del cliente. Como en el caso de borrar para llegar aquí hay que pulsar doble click sobre un cliente y como el recordset de allí (clientesgeneral) se habrá posicionado sobre ese registro tengo el cliente que deseo modificar en 'clientesgeneral.data1.recordset.fields("codigo")' Haré exactamente lo mismo posteriormente para consultar un cliente de forma que enviaré un parámetro que será 'M cuando quiera modificar y 'V' cuando quiera ver. Así en todo momento sabré en las rutinas posteriores que es lo que quiero hacer. Como decía el caso es muy parecido al caso de agregar. Solo que necesitaré meter los datos en el formulario 'ClientesFicha' antes de mostrarlo. Para ello utilizaré una rutina llamada 'MoverAPantalla' que hará ese trabajo. Posteriormente hablaré de ella. Ahora el código de este botón Código: On Error GoTo fallo Consultar Cliente El caso de consultar un cliente es exactamente igual que el de modificar un cliente con solo dos modificaciones: En el caso de consultas no existe la posibilidad de grabar Tampoco existe la posibilidad de escribir en los datos que se muestran El código de mostrar un cliente es el siguiente: Código: On Error GoTo fallo Mover campos del recordset a pantalla Por último me queda hacer la rutina de mover los campos del recordset a pantalla. La rutina sería así Código: Sub MoverAPantalla() Fijaos una vez mas. He abierto un recordset de tipo tabla, he buscado lo que necesitaba, lo he movido a los campos del formulario y lo he cerrado. Fijaos que para meter un dato de tipo string en un textbox he hecho esto: Código: .Text1(1) = "" & rec.Fields("Nombre") La razón es que dentro de un campo de base de datos puede haber el valor null, pero ese valor no se puede meter en un textbox. Por eso concateno "" y el campo 'nombre'. Si está vacío meto en text1 el valor "". Si no está vacío meto el valor "" & "el nombre del sujeto". El formulario del cliente Al fin llegamos al formulario del cliente. Este formulario será un formulario sin nada especial. Cuando se muestre puede ocurrir que los textbox estén vacíos (caso de altas de clientes) o que estén llenos. Si están llenos entonces puede ocurrir que tengan puesto locked=true y no exista el botón 'grabar' porque es una simple consulta o bien que no ocurra esto porque es una modificación del cliente. En la práctica solo hay código en dos botones: El código del botón salir sin hacer nada. Como hemos llegado aquí limpiamente no hay nada que deshacer ni recordset que cerrar ni nada. Código: unload me El código de grabar. Este botón solo se ve si se trata de agregar o modificar clientes. El código sería este: Código: Private Sub Grabar_Click() Ya tenemos terminados los clientes |