Agregar/Modificar/Ver/Borrar ClientesAgregar ClientesPara 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
Load ClientesFicha
ClientesFicha.Tag = "Agregar"
ClientesFicha.Show vbModal
Unload Me
Borrar ClientesPara 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
On error goto fallo
resp% = Msg("¿Desea borrar este cliente con todos sus documentos correspondientes?", "SiNo")
If resp% = vbYes Then
base.Execute "delete * from clientes where codigo=" & ClientesGeneral.data1.Recordset.Fields("codigo), dbFailOnError
Msg "El cliente se ha borrado satisfactoriamente.", "Ok"
endif
exit sub
fallo:
msg "No se ha podido borrar al cliente. La causa ha sido el error nº " & err.number & "(" & err.description & "),"Ok"
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í
With ClientesGeneral.Data1.Recordset.Fields("codigo")
resp% = Msg("¿Desea borrar este cliente con todos sus documentos correspondientes?", "SiNo")
If resp% = vbYes Then
BeginTrans
base.Execute "delete * from facturas where codigocliente=" & .Value, dbFailOnError
base.Execute "delete * from clientes where codigo=" & .Value, dbFailOnError
CommitTrans
Msg "El cliente se ha borrado satisfactoriamente.", "Ok"
End If
ClientesGeneral.Data1.Refresh
End With
Exit Sub
fallo:
rollback
Msg "No se ha borrado el cliente. Error número: " & Err.Number & "(" & Err.Description & ")", "Ok"
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 ClienesPara 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
On Error GoTo fallo
Load ClientesFicha 'cargar el formulario en memoria
ClientesFicha.Tag = "M" 'este es el parámetro que envío.
MoverAPantalla 'mover los campos al formulario
ClientesFicha.Show vbModal 'mostrar el formulario
Unload Me 'descargar el menú
Exit Sub
fallo:
Consultar ClienteEl 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:
On Error GoTo fallo
Load ClientesFicha
With ClientesFicha
.Grabar.Visible = False 'que no se vea el botón de grabar
For x% = 0 To ClientesGeneral.text.count-1 'para cada textbox del formulario
.Text1(x%).Locked = True 'impedir escribir en todos los campos
Next x%
.PideFpago.Locked = True
MoverAPantalla 'mover los campos al formulario
.Show vbModal 'mostrar el formulario
End With
Unload Me 'descargar el menú
Exit Sub
fallo:
Mover campos del recordset a pantallaPor último me queda hacer la rutina de mover los campos del recordset a pantalla.
La rutina sería así
Sub MoverAPantalla()
Dim rec As Recordset 'creo un recordset tabla indexado
Set rec = base.OpenRecordset("clientes", dbOpenTable)
rec.Index = "codigo"
rec.Seek "=", ClientesGeneral.Data1.Recordset.Fields 'busco el cliente solicitado
If rec.NoMatch Then 'si no se encuentra
Exit Sub 'salir
End If
With ClientesFicha
.Text1(0) = rec.Fields("codigo")
'.PideFecha = rec.Fields("fecha")
.Text1(1) = "" & rec.Fields("Nombre")
'.Text1(2) = "" & rec.Fields("Apellidos")
.Text1(2) = "" & rec.Fields("Direccion")
.Text1(3) = "" & rec.Fields("Poblacion")
.Text1(4) = "" & rec.Fields("CodigoPostal")
.Text1(5) = "" & rec.Fields("Telefono")
.Text1(6) = "" & rec.Fields("Dni")
End With
rec.close
End Sub
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:
.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 clienteAl 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.
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:
Private Sub Grabar_Click()
Dim rec As Recordset
Set rec = base.OpenRecordset("clientes", dbOpenTable)
rec.Index = "codigo"
If Me.Tag <> "M Then 'si se ha recibido el parámetro M se trata de una modificación
rec.AddNew 'como no se ha recibido hay que agregar
Else
rec.Seek "=", Text1(0) 'como si se ha recibido hay que buscar el cliente a modificar en la tabla
rec.Edit 'y editarlo
End If
rec.Fields("Nombre") = Text1(1)
rec.Fields("Direccion") = Text1(2)
rec.Fields("Poblacion") = Text1(3)
rec.Fields("CodigoPostal") = Text1(4)
rec.Fields("Telefono") = Text1(5)
rec.Fields("DNI") = Text1(6)
rec.Update
ClientesGeneral.Data1.Refresh 'actualizar el panel general
Unload Me
End Sub
Ya tenemos terminados los clientes