IPB

Bienvenido, invitado ( Identificarse | Registrarse )

 
Reply to this topicStart new topic
> Acceso a Datos 09: Altas y Bajas: (1) Sentido Común
Admin
mensaje Apr 2 2009, 06:59 PM
Publicado: #1


Lobo Alfa
Ícono de Grupo

Grupo: Admin
Mensajes: 14606
Registrado: 17-November 05
Desde: Mexico
Miembro nº: 1



Algo que debemos considerar siempre es la posibilidad de que se vaya la luz a media operación, asi que un sistema bien diseñado debe tener el menor numero posible de tablas y bases abiertas, o les pasa lo que sucede con los tristemente célebres programas de ASPEL, COI, NOI, y SAE. A los que conocen mi trabajo recordarán que cuando se va la luz los sistemas se recuperan de manera transparente.

Para poder conseguir esto, lo mejor es abrir y cerrar las bases y/o tablas cada operación excepto en procesos intensos, y rara vez abrir a la vez dos tablas. Claro que ayuda tener no breaks fiables en la medida de lo posible.

Sin embargo, eso está fuera del alcance de este tema, aunque mas adelante lo veremos PARCIALMENTE cuando veamos ADO.

Antes de codificar, vamos a ver a grandes rasgos que pasa cuando alguien da un alta de datos en una tabla, DE LO QUE SEA:

PASOS PARA DAR UN ALTA

....1. Deshabilitar las opciones de altas, bajas y cambios en los menús para evitar problemas por doble click. Habilitar opciones de cancelar y guardar cambios.
....2. Revisar si ya existe el dato que queremos dar en esta tabla.
....3. Si existe
  • Avisar y restablecer botones
  • Cancelar el proceso
....4. Verificamos que existan los datos obligatorios, TODOS.
....5. Si faltan
  • Avisar
  • Llevar a donde falta el dato
  • Cancelar el proceso
....6. Revisar si hay datos duplicados que no deban serlo ( que en la columna unico de nuestra tabla tengan si )
  • Si hay avisar, llevar, restablecer botones y cancelar proceso
....7. Si todo es correcto, guardar. ( Si algo falla preferentemente interceptar )
....8. Restablecer botones y refrescar pantalla

PASOS PARA DAR UNA BAJA

....1. Deshabilitar las opciones de altas, bajas y cambios en los menús para evitar problemas por doble click rapido.
....2. Revisar si el dato que queremos ya esta seleccionado
....3. Si no
  • Pedir que se seleccione
  • Restablecer botones
  • Cancelar el proceso
....4. Verificamos si esta ligado a otra tabla, si es así, avisamos que no se puede borrar (no podemos borrar un banco si tiene cuentas, por ejemplo)
....5. Continuamos SOLO si ya no hay datos ligados
....6. Si procede lo demas, preguntamos si queremos borrar, dando por default no.
....7. Si deciden borrar, borrar
....8. Restablecer botones y refrescar pantalla

Para hacer esto es necesario tratar de convertir todo a código. Es importante mencionar que no todos los pasos se hacen con el mismo botón en altas, solo el primer boton corresponde a altas, y todo lo demas al boton de guardar cambios.

Si se fijan todos los pasos anteriores son elementales. Vamos a referirnos ahora a el código de tiposmovimentos, específicamente de sus botones, lo que nos lleva al evento click de cmdtiposmov.

Nota: Cuando Comenté que se usaran las propiedades index, la finalidad es simplificar la programación. Esto se debe a que si no manejamos un arreglo de botones , tendriamos seis eventos de controles DIFERENTES, y además de tener que repetir código, sería dificil de mantener. De esta manera usaremos un solo procedimiento, para altas, bajas y cambios por cada tabla.

Veremos un ejemplo, que en lo personal es mi base para la mayoría de las veces, porque con hacer unas cuantas modificaciones, terminamos un módulo ABC completo en cuestión de minutos. A varios que me conocen, les consta que en una hora puedo sacar 6 o 7 módulos completos con reportes, aunque no se suele necesitar esa velocidad.

Después de ver el ejemplo veremos varios de esos procesos obvios, son los que tienen un link dentro del documento.

Vean este ejemplo código de un programa de productos, noten que hay procesos obvios por el nombre (con un link a donde está el código) pero que no son ordenes validas, por ejemplo, resaltacontrol. El ejemplo incluye también el manejo de cambios pero eso lo veremos en tres correos o mas junto con las ordenes que faltan, por ejemplo, la explicación de que es DataClass. Si Usan ahora es bajo su propio riesgo.

NOTA: Las líneas que empiezan con // deben ir al final de la línea anterior. Mas adelante subiré el c&oacutedigo en el proyecto, pero necesito que lo vean ahora por referencia.

CODE
Private Sub cmdProd_Click(Index As Integer)
Dim strprov As String
Dim strsubc As String
cmdProd(Index).Enabled = False
Select Case Index

[color="#FFFFCC"][b]Case 0: ' altas[/color][/b]

' tomamos proveedor
strprov = lstProv.List(lstProv.ListIndex)
If strprov = "" Then
  Call resaltacontrol(lstProv, "Antes de dar un alta de producto,
  // Seleccione un proveedor")
  GoTo restablece
Else
  'si desea continuar
  'If MsgBox("Desea dar de alta un producto del proveedor " & strprov & "?",
  //vbQuestion + vbYesNo + vbDefaultButton2) <> vbYes Then
  'GoTo restablece
  'End If
End If
' tomamos subclase
strsubc = lstSubcla.List(lstSubcla.ListIndex)
If strsubc = "" Then
  cmdProd(Index).Enabled = True
  Call resaltacontrol(lstSubcla, "Antes de dar un alta de producto,
  //Seleccione una subclase")
  GoTo restablece
Else
  If MsgBox("Desea dar de alta un producto del proveedor "
  // & strprov & " de la subclase " & strsubc & "?",
  // vbQuestion + vbYesNo + vbDefaultButton2) <> vbYes Then
  cmdProd(Index).Enabled = True
  GoTo restablece
  End If
End If
DesSelecciona lstProd
Habilitar_Botones "PROD", False
Activa_TXT "PROD" , True ' que puedan editar
' como es alta no hay existencias en inventario ni precios
'txtProd(4).Text = "0"
'txtProd(5).Text = "0"
'txtProd(7).Text = "0"
'txtProd(8).Text = "0"

txtProd(9).Text = "0"
txtProd(10).Text = "0"
txtProd(11).Text = "0"
txtProd(2).Text = strsubc '  subclase
txtProd(3).Text = strprov ' proveedor
txtProd(0).SetFocus ' da el foco a la clave
Exit Sub

[color="#FFFFCC"][b]Case 1: ' bajas[/color][/b]
Dim strclave As String
strclave = lstProd.List(lstProd.ListIndex)
If strclave = "" Then
  cmdProd(Index).Enabled = True
  Call resaltacontrol(lstProd, "Debe seleccionar un producto
  // antes de poder borrarlo")
  Exit Sub
End If
' revisar que no haya mapas detallados que se refieran a el
  If DataClass.Existe_Where_Reg("MAPASDET", "PROCVE",
  //"PROCVE='" & strclave & "'") Then
MsgBox "Existe un mapa detallado que tiene referencia a este
//producto, revise primero", vbExclamation
GoTo restablece
  End If
' revisar que no hayan remisiones
  If DataClass.Existe_Where_Reg("REMDETALLE", "PROCVE",
//"PROCVE='" & strclave & "'") Then
MsgBox "Existe un producto asignado a una remisión recibida,
//revise primero", vbExclamation
GoTo restablece
  End If
' revisar que no haya desplazamiento en la bitacora.
  If DataClass.Existe_Where_Reg("DESPLAZAM", "PROCVE",
  // "PROCVE='" & strclave & "'") Then
MsgBox "Existe historia de desplazamiento de este producto,
//revise primero", vbExclamation
GoTo restablece
  End If
  ' si ya llegamos aqui todo esta bien
  If MsgBox("Desea dar de baja el producto " & strclave & "?",
  // vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then
Call DataClass.Elimina_Reg("PRODUCTOS", "PROCVE", strclave)
cargaproductos
  End If

[color="#FFFFCC"][b]Case 2: 'cambios[/color][/b]
strclave = lstProd.List(lstProd.ListIndex)
If strclave = "" Then
  cmdProd(Index).Enabled = True
  Call resaltacontrol(lstProd, "Debe seleccionar un producto antes de
// poder hacerle un cambio")
  Exit Sub
End If
If MsgBox("Desea usted hacer un cambio al producto " & strclave & "?",
//vbQuestion + vbYesNo + vbDefaultButton2) <> vbYes Then
  ' siempre no
  cmdProd(Index).Enabled = True
Else
  'si lo voy a cambiar
  Activa_TXT "PROD", True
  Habilitar_Botones "PROD", False
  txtProd(0).Enabled = False ' pero no puedo cambiar clave
  cargaproductodet strclave ' muestar en la pantalla de ,maestro el detalle
  txtProd(1).SetFocus ' damos control al nombre
End If

[color="#FFFFCC"][b]Case 3: 'reporte catalogo[/color][/b]
prodcatalog ("Catálogo")

[color="#FFFFCC"][b]Case 4: ' cancela cambios[/color][/b]
cmdProd(Index).Enabled = True ' siempe activo
If MsgBox("Esta usted seguro de cancelar el proceso?",
//vbYesNo + vbDefaultButton2 + vbQuestion) <> vbYes Then Exit Sub
txtProd(0) = "" ' pone en ceros este valor
Activa_TXT "PROD", False ' que ya no puedan editar
' habilitamos opciones del menu
Habilitar_Botones "PROD", True
txtProd(0).Enabled = False
cargaproductodet lstProd.List(lstProd.ListIndex)
Exit Sub

[color="#FFFFCC"][b]Case 5: 'guardar cambios o altas[/color][/b]
cmdProd(Index).Enabled = True ' siempe activo
' habilitamos opciones del menu
Dim nonulos As Variant
nonulos = Array(0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11)
If Existennulos(txtProd, nonulos, True) Then
Exit Sub
End If
  Habilitar_Botones "PROD", True
txtProd(0).Enabled = True
ProdGraba
Activa_TXT "PROD", False
cmdProd(0).SetFocus ' prepara para dar un alta nueva
Exit Sub
End Select
restablece:
  cmdProd(Index).Enabled = True ' permite dar otro proceso
End Sub

Private Sub Habilitar_Botones(ByVal tipodato As String, ByVal estado As Boolean)
Select Case tipodato
Case "PROD"
  cmdProd(0).Enabled = estado ' altas
  cmdProd(1).Enabled = estado ' bajas
  cmdProd(2).Enabled = estado ' cambios
  'deshabilitamos opciones menu
  cmdProd(4).Enabled = Not estado ' cancelar cambios
  cmdProd(5).Enabled = Not estado ' guardar cambios
  Case Else
MsgBox "TIPO DE DATOS DESCONOCIDO :" & tipodato &
//"(Habilitar_botones)", vbInformation
End Select
End Sub

Public Function Existennulos(ByVal nombrearregloTextBox As Variant,
// ByRef arreglonumerico As Variant, ByVal mostrarmensaje As Boolean) As Boolean
'El proposito de esta funcion es obligar a que los campos
'de una base no sean nulos.

'Lo implementamos pasando en un arreglo los numeros de una
'colleccion de textbox que NO deben de ser nulos, y esto se indica por parámetros:

'ejemplo de uso
'Dim arr As Variant
' creamos arreglo numerico
' txtprod es el conjunto de textbox que queremos revisar
'arr = Array(0, 1, 3, 4, 5, 6, 7, 8, 9, 11, 13)

'If Existennulos(txtProd, arr,true) = False Then
'  no exsisten nulos
'Else
' si existen nulos
' MsgBox "Verifique el proceso; hay datos obligatorios
//  que deben completarse"
'  Exit Sub
'End If
Dim controlpaso As Control
Dim csh As Integer
For csh = 0 To UBound(arreglonumerico)
Set controlpaso = nombrearregloTextBox(arreglonumerico(csh))
With controlpaso
If .Text = "" Then
  Call resaltacontrol(controlpaso, "Hay datos obligatorios
// que deben completarse")
  Existennulos = True
  Exit Function
End If
End With
DoEvents
Next
Existennulos = False
End Function

Public Sub resaltacontrol(controlaresaltar As Control,
// ByVal mensajeamostrar As String)
Dim salvacolor As Long
Dim mostrarmensaje As Boolean
Dim rs As ADODB.Recordset
Dim entabla As Long
' depura urgente
If mensajeamostrar <> "" Then mostrarmensaje = True ' si hay mensaje a mostrar
With controlaresaltar
  if false then
  salvacolor = .BackColor
  Set rs = DataClass.TraeQuery("SELECT EMPCOLORAV from EMPRESA", "FO")
  With rs
If Not .EOF And .BOF Then entabla = .Fields("EMPCOLORAV")
.Close
  End With
  Set rs = Nothing
  endif
.BackColor = IIf(entabla = vbBlack, vbred, entabla)
If mostrarmensaje Then MsgBox mensajeamostrar, vbExclamation
.BackColor = salvacolor ' regreso a lo normal
If .Enabled = True Then' si esta activo entonces
  .SetFocus ' le damos el foco
End If
End With
End Sub

Private Sub Activa_TXT(ByVal tipodato As String, ByVal estado As Boolean)
Dim csh As Integer
Select Case tipodato
Case "PROD"
  For csh = 0 To 11
  With txtProd(csh)
    .Text = "" 'pone en blanco los datos
    .Enabled = estado
End With
txtProd(6).Visible = False
  With chkProd
.Enabled = estado
.Value = vbUnchecked
  End With
  dtCaduc.Enabled = ((estado = True) And (chkProd.Value = vbChecked))
  DoEvents
  Next
  Case Else
MsgBox "TIPO DE DATOS DESCONOCIDO :" & tipodato &
//"(Activa_TXT)", vbInformation
End Select
End Sub

Próximo correo, Continuamos con como se hace un alta y baja..



Mensaje modificado por Nagual el Apr 9 2009, 08:00 AM


--------------------
__________________________
Por la ley y para siempre
For the Rule and forever
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 usuario(s) está(n) leyendo esta discusión (1 invitado(s) y 0 usuario(s) anónimo(s))
0 miembro(s):

 



Versión Lo-Fi Fecha y Hora actual: 31st July 2010 - 11:43 PM