Recuperar clave identity

Te comento que estoy utilizando VB 6.0 y Sql Server 2005.
Tengo estas tablas:
Voluntario
    NumVoluntario
    NumDador
    ApeVol
    NomVol
    FNacVol
    TipoDocumento
    NumDocumento
    DomicilioParticular
    TelefonoParticular
    Celular
    EMail
    Profesión
Dador
    NumDador
    FechaInscDador
    DomicilioLaboral
    TelefonoLaboral
    Grupo
    Factor
    Pesor
    FechaUltDonacion
    Disponible
Como verás, en la tabla de Voluntarios tengo un atributo; que en la tabla de abajo es clave.
Lo que hago de momento es: Utilizo un form para Ingresar un Voluntario, luego abro otro form de ModificarVoluntario en el cual tengo todos los datos del Voluntario, incluida su clave, en este mismo form tengo un botón (Ingresar como Dador) el cual me abre un nuevo form para cargar los datos del dador, en este form tengo 2 botones, uno para ingresarlo como Dador y otro para agregar el código de ese dador a la tabla de Voluntarios.
Lo que quiero hacer es: recuperar la clave que se le genera como Dador para ingresarla a la tabla de Voluntarios. El problema lo tengo en que la clave para las dos tablas es que las declaré como Identity con incremento en 1, con lo cual tengo problemas al recuperarla.
Sé que el código para recuperar un código Identity es algo así:
SELECT MAX(NumDador) As ID FROM Dadores. Con este código tendría el número más alto y por énde el último ingresado.
Pero no me doy cuenta como ejecutarlo para ingresarlo a la tabla de Voluntarios.
¿Me podrás orientar?

1 Respuesta

Respuesta
1
¿Pero una persona puede ser dador y voluntario al mismo tiempo?
yo haría una tabla de personas y pondría un campo de estado (1=dador, 2=voluntario, etc)
Con esto solucionas el problema de una clave incremental.
Si esto no te sirve, avisame que tratamos de solucionar lo otro
Hola. Gracias por responder y preocuparte.
Te comento, sí, un Voluntario puede ser Dador y Socio. Hice una tabla de Voluntarios para que no haya redundancia de datos. Lo de la tabla personas lo había tenido en cuenta pero la profesora al final me dijo que opte por Voluntarios ya que es lo mismo.
Como podría llevar a cabo lo que me dices de estado 1= Dador, estado 2= Voluntario.
Te paso lo que tengo armado en código a ver si de ahí puedes orientarme.
Con el  SELECT MAX(NumDador) as ID from DADOR,  lo que quiero es  traer el maximo o ultimo registro ingresado en Dadores ya que de esa forma actualizo la tabla de Voluntarios con el número que toma en ese momento el Dador. El ambiente no es de muchos usuarios, es más sólo una persona va a manejar el sistema. Lo hago en Sql Server xq me pidieron que lo haga en ese gestor pero este sistema no lo van a usar en un ambiente de multiples concurrencias.
En el formulario de Dadores (utilizo uno de "Modificación de Dadores" en el cual me aparece la clave de el Voluntario en el que estoy parado en ese momento, en una caja de texto).
Ahora, en esta parte no entiendo como debería hacerlo:
SELECT MAX(NumDador) As ID FROM Dadores
En que evento debo poner el código para que después de ingresar los datos de dadores, poder capturar el código de NumDador ( como ejecutar el SELECT MAX. Y otra duda también es como armar el string del Update en el sentido de como usar las comillas)
Private Sub cmdGuardaDador_Click()
    Dim ConsultaSql As String
    Dim X As Integer
        Set Base = New ADODB.Connection
        AbrirBase
        Set rstVoluntarios = New ADODB.Recordset
     ' este string me tira el error: Sintaxis incorrecta cerca de la palabra clave 'Update'
 ConsultaSql = "(Update Voluntarios SET NumDador = "
    ConsultaSql = ConsultaSql & SQLNumber(txtNumDadorVol.Text) & " Where " & " NumVoluntario = " & txtNumVolDador.Text & ")"
     Base.Execute (ConsultaSql)
    Base.Close
End Sub
Y en el form Load agrego ese código para tomar el núm de Voluntario:
 
En form principal:
Dim conn As ADODB.Connection
Dim rsVoluntario As ADODB.Recordset 'Voluntarios
Dim rsDador As ADODB.Recordset ' Dadores 
Private Sub Form_Load()
Set conn = New ADODB.Connection
conn.Open strConnect
En modulo .Bas
Option Explicit
Public Const strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User;Initial Catalog=CruzRoja;Data Source=xxxxx-C7A03134\SQLEXPRESS"
'"driver=" & strDriver & ";" & "server=" & strServer & ";" & "uid=" & strUsuario & ";" & "pwd=" & strPassward & ";" & "database=" & dbsR
Public rstDadores As New ADODB.Recordset
Public rstVoluntarios As New ADODB.Recordset
Public Base As New ADODB.Connection
Public Sub AbrirBase()
    Set Base = New ADODB.Connection
    Base.ConnectionString = strConnect
    Base.CursorLocation = adUseClient
    Base.ConnectionTimeout = 30
    Base.Open
End Sub
Formulario alta voluntarios
Dim rstVoluntarios As ADODB.Recordset
Private Sub cmdGuardar_Click()
Dim ConsultaSql As String
    Set Base = New ADODB.Connection
    AbrirBase
    Set rstVoluntarios = New ADODB.Recordset
    ConsultaSql = "INSERT INTO Voluntarios("
    ConsultaSql = ConsultaSql & "ApeVol, "
    ConsultaSql = ConsultaSql & "NomVol, "
    ConsultaSql = ConsultaSql & "FNacVol, "
    ConsultaSql = ConsultaSql & "TipoDocumento, "
    ConsultaSql = ConsultaSql & "NumDocumento, "
    ConsultaSql = ConsultaSql & "DomicilioParticular, "
    ConsultaSql = ConsultaSql & "TelefonoParticular, "
    ConsultaSql = ConsultaSql & "Celular, "
    ConsultaSql = ConsultaSql & "EMail, "
    ConsultaSql = ConsultaSql & "Profesion "
    ConsultaSql = ConsultaSql & ")values ("
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(0).Text) & ", " 'Apellido
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(1).Text) & ", " 'Nombre
    ConsultaSql = ConsultaSql & SQLText(DTPFNac.Value) & ", "   'FechaNacimiento
   ConsultaSql = ConsultaSql & SQLText(cmbTipoDoc.Text) & ", "  'TipoDocumento
    ConsultaSql = ConsultaSql & Val(txtVoluntario(2).Text) & ", " 'NumeroDocumento
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(3).Text) & ", " 'Domicilio
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(4).Text) & ", " 'Teléfono particular
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(5).Text) & ", " 'Celular
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(6).Text) & ", " 'E-mail
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(7).Text) & ");" 'Profesión
    Base.Execute (ConsultaSql)
    MsgBox "Cómo desea ingresar a este Voluntario", vbInformation
    Base.Close   
     cmdGuardar.Enabled = False
End Sub
Formulario modificar voluntarios
Private Sub Mostrar()
     Dim cadenaconexion As String
     cadenaStr = "Select * from Voluntarios"
     Set rstVoluntarios = Base.Execute(cadenaStr)
     If rstVoluntarios.EOF = False Then
        txtModVoluntario(0).Text = rstVoluntarios!NumVoluntario
        txtModVoluntario(1).Text = rstVoluntarios!ApeVol
        txtModVoluntario(2).Text = rstVoluntarios!NomVol
        DTPFNac.Value = rstVoluntarios!FNacVol
        cmbTipoDoc.Text = rstVoluntarios!TipoDocumento
        txtModVoluntario(3).Text = rstVoluntarios!NumDocumento
        txtModVoluntario(4).Text = rstVoluntarios!DomicilioParticular
        txtModVoluntario(5).Text = rstVoluntarios!TelefonoParticular
        txtModVoluntario(6).Text = rstVoluntarios!Celular
        txtModVoluntario(7).Text = rstVoluntarios!EMail
        txtModVoluntario(8).Text = rstVoluntarios!Profesion
    End If
End Sub
Formulario alta dadores
Private Sub cmdGuardaDador_Click()
    Dim ConsultaSql As String
    'Dim IngresaNumDador As String
    Dim IngresaCodDador As String
    Dim X As Integer
        Set Base = New ADODB.Connection
        AbrirBase
        Set rstDadores = New ADODB.Recordset
    ConsultaSql = "INSERT INTO Dadores("
    ConsultaSql = ConsultaSql & "FechaInscDador, "
    ConsultaSql = ConsultaSql & "DomicilioLaboral, "
    ConsultaSql = ConsultaSql & "TelefonoLaboral, "
    ConsultaSql = ConsultaSql & "Grupo, "
    ConsultaSql = ConsultaSql & "Factor, "
    ConsultaSql = ConsultaSql & "Peso "
    ConsultaSql = ConsultaSql & ")values ("
    ConsultaSql = ConsultaSql & SQLText(DTPFInscDador.Value) & ", " 'FechaInscDador
    ConsultaSql = ConsultaSql & SQLText(txtDador(0).Text) & ", " 'DomicilioLaboral
    ConsultaSql = ConsultaSql & SQLText(txtDador(1).Text) & ", " 'TelefonoLaboral
    ConsultaSql = ConsultaSql & SQLText(cmbGrupo.Text) & ", "    'Grupo
    ConsultaSql = ConsultaSql & SQLText(cmbFactor.Text) & ", "   'Factor
    ConsultaSql = ConsultaSql & SQLText(txtDador(2).Text) & ");"  'Peso
    Base.Execute (ConsultaSql)
    Base.Close
Set Base = New ADODB.Connection
    AbrirBase
    Set rstVoluntarios = New ADODB.Recordset
Private Sub cmdActualizarVol_Click()
''''Acá lo que quiero hacer es ingresar el código de Dador a la tabla de Voluntarios!!! _
Se puede hacer desde el botón de comando o debe ser en otro procedimiento??
End Sub
Bueno amigo, espero no haberme extendido demasiado, lo que pasa es que quería que entiendas bien lo que quería hacer.
Un Saludo. Daniel.
Saltee el código porque así puesto me pierdo totalmente.
Mira sigo insistiendo que vos tienes una persona que tiene 2 estados o es dador o es voluntario. Si necesitas también podes hacer otra tabla con los datos de cuando una persona cambia de estado para que tengas ese registro.
De esta manera solucionas todos tus problemas de id, y la lógica del sistema me parece lo más normalizada en cuanto a la base de datos.
Creo que tendrías que hablarles a tu profesora y mostrarle las tablas relacionadas personas (id_persona, nombre, apellido, fecha_nac, COD_ESTADO), otra tabla de persona_estado (cod_estado, descripción) así tienes relacionado, ¿que pasa si en el futuro aparece una tercera opción de personas ejemplo dador, voluntario, por_empresa
bueno vamos a tratar de resolver problema por problema.
Para tomar el id del dador, si en alguna pantalla lo capturas lo podes elevar a una variable global (solo aceptable en visual basic 6.0), la declaras en un modulo así public idpersona as string
cada vez que seleccionas un dador, lo guardas en esa variable y después lo usas donde quieras.
Vos me escribís estos...
Ahora, en esta parte no entiendo como debería hacerlo:
SELECT MAX(NumDador) As ID FROM Dadores
En que evento debo poner el código para que después de ingresar los datos de dadores, poder capturar el código de NumDador ( como ejecutar el SELECT MAX. Y otra duda también es como armar el string del Update en el sentido de como usar las comillas)
Para seleccionar el id y usarlo con una variable global creo que estaría solucionado.
despues el update...
Private Sub cmdGuardaDador_Click()
    Dim ConsultaSql As String
    Dim X As Integer
        Set Base = New ADODB.Connection
        AbrirBase
        Set rstVoluntarios = New ADODB.Recordset
ConsultaSql = "Update Voluntarios SET NumDador = "
    ConsultaSql = ConsultaSql & SQLNumber(txtNumDadorVol.Text) & " Where " & " NumVoluntario = " & txtNumVolDador.Text & ")"
Vos tienes esto, yo te la armo abajo de como lo haría
ConsultaSql = "Update Voluntarios SET NumDador = " & txtNumDadorVol.Text & " Where NumVoluntario = " & txtNumVolDador.Text"
Doy por entendido que txtnumdadorvol es numérico sino iría '" & txtnumdadorvol.text & ""
Empecemos por ahí y vallamos pregunta por pregunta
gracias y suerte
Estimado. Pude solucionar el ingreso del número de Dador a la tabla Voluntarios modificando las comillas como me sugeriste, pero me tira el siguiente error cuando dejo el form de dadores una vez ingresado este como Dador y Voluntario, y me vuelvo al form de Modificar Voluntarios y quiero seguir avanzando en los registros, y no sé porque me tira el siguiente error.
P.D: El mismo error me tira en el form de Dadores luego de ingresar un Dador como Voluntario y quiero seguir avanzando en los registros de Dadores
Error '3704' en tiempo de ejecución:
La operación no está permitida si el objeto está cerrado.

Este es el código que me tira error: (está en el form de Modificar Voluntarios que te comentaba más arriba)
No sé porque me lo tira ya que no lo tengo cerrado en ninguna parte del código.
Private Sub cmdSiguiente_Click()
    rstVoluntarios.MoveNext  'Me marca esta línea como la del error.
    If rstVoluntarios.EOF Then
        MsgBox " es el último registro", vbExclamation, "Sistema"
        rstVoluntarios.MovePrevious
        Else
            txtModVoluntario(0).Text = rstVoluntarios!NumVoluntario
            txtModVoluntario(1).Text = rstVoluntarios!ApeVol
            txtModVoluntario(2).Text = rstVoluntarios!NomVol
            'DTPFNac.Value = rstVoluntarios.Fields("")
            DTPFNac.Value = rstVoluntarios!FNacVol
            cmbTipoDoc.Text = rstVoluntarios!TipoDocumento
            txtModVoluntario(3).Text = rstVoluntarios!NumDocumento
            txtModVoluntario(4).Text = rstVoluntarios!DomicilioParticular
            txtModVoluntario(5).Text = rstVoluntarios!TelefonoParticular
            txtModVoluntario(6).Text = rstVoluntarios!Celular
            txtModVoluntario(7).Text = rstVoluntarios!EMail
            txtModVoluntario(8).Text = rstVoluntarios!Profesion
        End If
End Sub
No sé porque ya que no lo tengo cerrado en ninguna parte del código.
P.D: Si te sirve de algo para orientarme mejor te envío el sistema a un mail. Muchas gracias de antemano!
Saludos!
Esa parte del código te permite hacer algo ¿?
Porque no veo la parte donde rstvoluntarios es seteado
El formulario, en un principio era solamente para recorrer los registros que tenía ingresado en la tabla Voluntarios, pero luego le agregué la funcionalidad de que pueda llamar a los otros formularios para ingresar los datos específicos ya sea de Dador o de cualquier otra cosa, y es ahí donde me aparece este inconveniente y no se como solucionarlo, y el recordset no lo cierro en ninguna parte.
Por ahí la ayuda que necesito es que me des los pasos a seguir para usar bien un recordset...
Cuando cerrarlo y volverlo a abrir por ej.
Bueno, muchas gracias por responder y preocuparte.
Espero tu respuesta. Gracias nuevamente!
asi los uso yo
call abre
Set Base = New ADODB.Connection
        AbrirBase
        Set rstDadores = New ADODB.Recordset
ConsultaSql = "select * from datos_prof"  
    Base.Execute (ConsultaSql)
    Rs.AddNew
        Rs!cuil = ArmaCuil
        Rs!legajo = txtleg.Text
        Rs!apellido = txtnombre.Text
        If txtcargo.Text <> "" Then
            Rs!cargo = txtcargo.Text
        End If
    Rs.Update
esto uso para un alta, hay muchas modelos distintos para hacerlo
despues para recorrerlo
una vez que lo abris uso
do while not rs.eof
text1 = rs!campo1
asi con todos
rs.movenext
loop
rs.close
set rs=nothing
empezamos y vemos como vamos
OK. Muchas gracias! Lo pruebo y te comento. Saludos!
Estimado amigo. Gracias por responder y poner tanto interés. Resulta que no me anduvo ni siquiera en el form que antes me andaba por lo menos antes de abrir el otro formulario. Este código ni siquiera me permite avanzar más de 2 registros, y luego me tira El error:
Error '3704' en tiempo de ejecución. La operación no está permitida si el objeto está cerrado.
He aquí el código:
      Private Sub cmdSiguiente_Click()
      set rstVoluntarios = New ADODB.Recordset
          Do While Not rstVoluntarios.EOF ' línea que me marca error!
                txtModVoluntario(0).Text = rstVoluntarios!NumVoluntario
                txtModVoluntario(1).Text = rstVoluntarios!ApeVol
                txtModVoluntario(2).Text = rstVoluntarios!NomVol
                'DTPFNac.Value = rstVoluntarios.Fields("")
                 DTPFNac.Value = rstVoluntarios!FNacVol
                 cmbTipoDoc.Text = rstVoluntarios!TipoDocumento
                 txtModVoluntario(3).Text = rstVoluntarios!NumDocumento
                 txtModVoluntario(4).Text = rstVoluntarios!DomicilioParticular
                 txtModVoluntario(5).Text = rstVoluntarios!TelefonoParticular
                 txtModVoluntario(6).Text = rstVoluntarios!Celular
                 txtModVoluntario(7).Text = rstVoluntarios!EMail
                 txtModVoluntario(8).Text = rstVoluntarios!Profesion
                 rstVoluntarios.MoveNext
       Loop
       rstVoluntarios.Close
       Set rstVoluntarios = Nothing
End Sub
Bueno amigo. Espero tu respuesta. Muchas gracias!
No encuentro ningún agujero en el código
Proba esto hace una interrupción en set rstvoluntarios y hace un paso a paso con F8 y decime en que linea te da el error
Hola amigo. Gracias por responder.
Esta es la línea que me marca error:
 Do While Not rstVoluntarios.EOF
Saludos!
¿Pero la consulta para llenar el recordset donde la haces?
En ese código faltaría llamar a la conexión con la base y pasarle la consulta para que llene el recordset
Set rstDadores = New ADODB.Recordset
ConsultaSql = "select * from datos_prof"  
    Base. Execute (ConsultaSql)
Estimado amigo. Lo que hago es: en el form load Abro la base con un procedimiento y llamo a este procedimiento también desde el form load, con lo cual, al cargar el formulario ya tengo las asiganaciones hechas, y lo que hago después el moverme entre los registros.
Private Sub Mostrar()
       Dim cadenaconexion As String
    cadenaStr = "Select * from Voluntarios"
    Set rstVoluntarios = Base.Execute(cadenaStr)
       If rstVoluntarios.EOF = False Then
        txtModVoluntario(0).Text = rstVoluntarios!NumVoluntario
        txtModVoluntario(1).Text = rstVoluntarios!ApeVol
        txtModVoluntario(2).Text = rstVoluntarios!NomVol
        DTPFNac.Value = rstVoluntarios!FNacVol
        cmbTipoDoc.Text = rstVoluntarios!TipoDocumento
        txtModVoluntario(3).Text = rstVoluntarios!NumDocumento
        txtModVoluntario(4).Text = rstVoluntarios!DomicilioParticular
        txtModVoluntario(5).Text = rstVoluntarios!TelefonoParticular
        txtModVoluntario(6).Text = rstVoluntarios!Celular
        txtModVoluntario(7).Text = rstVoluntarios!EMail
        txtModVoluntario(8).Text = rstVoluntarios!Profesion
    End If
End Sub
Ahora: luego de mostrar e ir recorriendo los registros, lo que hago es que al presionar un command en este formulario se me aparezca un form en el cual cargo los datos específicos del dador (x ej.), lo grabo, y luego de finalizada la carga de este, cierro este form, y me queda el form de Voluntarios, y lo que quiero es poder seguir recorriendo los registros de Voluntarios para poder ingresar otro voluntario como Dador (en este caso) y no me deja seguir recorriendo los registros.
Me sale el error: Error '3704' en tiempo de ejecución.
La operación no está permitida si el objeto está cerrado.
Presiono Depurar y la línea que me marca error es : rstVoluntarios.MoveNext
Este es el código armado del botón siguiente:
Private Sub cmdSiguiente_Click()
    rstVoluntarios.MoveNext
    If rstVoluntarios.EOF Then
        MsgBox " es el último registro", vbExclamation, "Sistema"
        rstVoluntarios.MovePrevious
        Else
            txtModVoluntario(0).Text = rstVoluntarios!NumVoluntario
            txtModVoluntario(1).Text = rstVoluntarios!ApeVol
            txtModVoluntario(2).Text = rstVoluntarios!NomVol
            'DTPFNac.Value = rstVoluntarios.Fields("")
            DTPFNac.Value = rstVoluntarios!FNacVol
            cmbTipoDoc.Text = rstVoluntarios!TipoDocumento
            txtModVoluntario(3).Text = rstVoluntarios!NumDocumento
            txtModVoluntario(4).Text = rstVoluntarios!DomicilioParticular
            txtModVoluntario(5).Text = rstVoluntarios!TelefonoParticular
            txtModVoluntario(6).Text = rstVoluntarios!Celular
            txtModVoluntario(7).Text = rstVoluntarios!EMail
            txtModVoluntario(8).Text = rstVoluntarios!Profesion
        End If
End Sub
Bueno amigo. Desde ya muchas gracias, y espero me ayudes a dilucidar este problema.
Saludos. Daniel.
En el form que abrís el recordset se llama del mismo nombre¡?
Porque si tiene el mismo nombre estas abriéndolo 2 veces.
Fíjate y me avisas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas