Duda de una base de datos con Visual Basic

Estimado Luis:
Tengo un form DOCUMENTOS donde la clave la forman dos campos: LETRA+NUMERO. El campo LETRA lo cojo, mediante un cuándo combinado, desde la tabla LETRAS, y dentro de ésta tabla tengo un campo que me indica el último número de orden creado en la tabla DOCUMENTOS dentro de ésta letra.
La tabla DOCUMENTOS ya tiene muchos datos, y hay números dentro de la LETRA que no existen, y quisiera empezar desde 1 a crear los siguientes registros, comprobando si esa clave ya existe y asignarle un NUMERO libre.
A su vez, éste NUMERO, actualizarlo en la tabla LETRAS como último registro creado dentro de ésta LETRA.
Mis conocimientos de vb6 son muy escasos y me gustaría me ayudaras a darle forma a este problema.
Te lo agradezco de antemano y espero tengas paciencia conmigo.
Muchas Gracias.

1 Respuesta

Respuesta
1
Otra vez, en esta última pregunta has echado carne al asador y me resulta un poco confusa al final, de momento estoy liado con otro asunto durante unos días pero te ayudare en lo que pueda.
Te podría facilitar una función para comprobar si un registro ya existe en una tabla con lo que se podría solucionar parte del problema. Respecto a la parte de la pregunta en la que indicas las actualizaciones que tiene que sufrir el campo NUMERO de la tabla LETRAS me pierdo (esa tabla no tiene ningún campo NUMERO 'creo').
Estimado Luis:
El campo número en la tabla LETRAS lo he añadido posteriormente a haberte enviado la base de datos.
Esperaré a que tengas tiempo.
Muchas gracias.
Corrígeme con un mensaje si me equivoco en este planteamiento:
Si un letra tiene que tener asociado un número de documento y un documento tiene que tener asociado una letra obtenemos una relación de muchos a muchos en la que estaríamos repitiendo registros en la tabla letras que no tendría sentido ya que ya estarían en la tabla documentos, ya que la tabla letras lo único que contiene es letra y número.
Si es así contestame con un mensaje y te propongo otra forma de controlar el tema, de lo contrario te enviaré una solución tal y como está ahora aunque se tenga que realizar muchas cosas.
Disculpa por la respuesta que te di el día 21/05 no es valida, ya que aun tenía algunas lagunas en cuanto al número de la tabla LETRAS. Ahora lo que entiendo es que en la tabla de LETRAS lo que quieres es actualizar ese número (yo entendía que lo que querías era añadir un nuevo registro letra, número por cada documento que se diera de alta, con lo que se crearía una relación 1<->1 'disculpa esta torpeza')
Bien después de aclarar este punto, la solución que te propongo requiere unos pasos previos a tener en cuenta:
En la relación que tienes entre Documentos->Prestamos a través del campo número, tienes que activar la integridad referencial 'actualizar en cascada' para que cualquier cambio en el número de la tabla documentos actualice el número de la tabla de prestamos.
Una vez echo esto, te propongo actualizar todos los números de los documentos actuales comenzando desde 1 por medio del siguiente código: (create un formulario vacío con un botón al que le asignas este código)
'*******************************************
Private Sub ActualizaNumDocs_Click()
Dim rs As Recordset
Dim LetraActual As String
Dim ContadorNumeros As Long
' Abrimos el recordset de la tabla documentos
Set rs = CurrentDb.OpenRecordset("Documentos", dbOpenDynaset)
' Recorremos todos los registros de la tabla
Do While Not rs.EOF
LetraActual = rs!L ' Obtenemos la letra del documento
ContadorNumeros = 1 ' Inicializamos el contador de numeros
' Mientras estemos leyendo la misma letra de documento, actualizamos sus números
Do While rs!L = LetraActual
rs.Edit ' Editamos
rs!Num = ContadorNumeros ' Asignamos
ContadorNumeros = ContadorNumeros + 1 ' Incrementamos
rs.Update ' Actualizamos
rs.MoveNext ' Siguiente registro
If rs.EOF Then Exit Do ' Si es el final salimos del bucle
Loop
Loop
' Cerramos el recordset
rs.Close
Set rs = Nothing
End Sub
'*******************************************
Una vez actualizados los números de la tabla documentos cada vez que des de alta un registro en el formulario de documentos, asignando el siguiente código al evento afterupdate del cadro combinado de letras, obtendrás el siguiente número libre documento a utilizar:
'*******************************************
Private Sub L_AfterUpdate()
' ValorMaximo de un campo de una tabla con una condición (la condición puede ser opcional)
Me.Num = ValorMaximo("DOCUMENTOS", "NUM", "L='" & Me.L & "'")
End Sub
Function ValorMaximo(Tabla As String, Campo As String, Optional SHaving As String = "") As Long
Dim SQL As String
Dim rs As Recordset
Dim Condicion As String
If Len(SHaving) > 0 Then
Condicion = "HAVING " & SHaving
Else
Condicion = ""
End If
SQL = "SELECT MAX(" & Campo & ") FROM " & Tabla & " " & Condicion
Set rs = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
If Not rs.EOF Then
ValorMaximo = Nz(rs(0), 0) + 1
Else
ValorMaximo = 1
End If
End Function
'*******************************************
Con esto te evitarías tener que actualizar el valor del campo numero de la tabla de letras para saber cual fue el último número utilizado para esa letra, pero si de todas maneras quieres hacerlo, en el evento afterinsert del formulario DOCUMENTOS tendrías que incluir las instrucciones que actualizan este campo de la tabla LETRAS:
Private Sub Form_AfterInsert()
Dim rs As Recordset
Dim SQL As String
SQL = "SELECT * FROM LETRAS WHERE L='" & Me.L & "';"
Set rs = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
rs.Edit
rs!Num = Me.Num
rs.Update
rs.Close
Set rs = Nothing
End Sub
Hasta luego y espero que después de todo este royo te sirva para algo.
Excelente. No podía renumerar los documentos por que cada documento físico ya tiene escrito su número, pero me has dado la solución.
Muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas