Cómo recuperar una clave identity en el programa informático Visual Basic

Estoy muy agradecido por tu aporte anterior. Estuvo muy bueno.
Ahora... Vuelvo con el tema de recuperar una clave identity.
Quisiera ver si está bien armada esta consulta de selección:
Private Sub Form_Terminate()
    Dim UltRegistro As String
        Set Base = New ADODB.Connection
        Set rstvol = New ADODB.Recordset
        UltRegistro = "SELECT MAX(NumVoluntario) As ID FROM Voluntarios"
        rstvol = Base.Execute(UltRegistro)
        txtVoluntario(0).Text = rstvol!NumVoluntario
End Sub
Lo que si sé es que está mal usado en este procedimiento de evento (¿cuál me aconsejas usar?)

1 respuesta

Respuesta
1
¿Pero vos lógicamente cuando lo quieres recuperar? ¿
al entrar al form?, ¿Al salir?
Porque ahí hasta que no cerras el form no lo busca
Claro. Exactamente eso era lo que yo te decía: que ya sabía que estaba mal planteado. El tema es que no sé en que procedimiento de evento ponerlo (más allá de que tampoco sé si está bien armada la consulta - que también quería ver si me podías decir como armarla.-).
Qué es lo que quiero hacer: Tengo los text para ingresar los datos del Voluntario: Nombre, Apellido, FechaNacimiento, etc. También tengo un text para el Numero de Voluntario, el cual, en la base de datos lo declaré como autonumérico (Identity, con incremento en 1) y no se como ejecutar el procedimiento SELECT MAX (en que evento) para que luego de guardar los datos del voluntario se pueda tomar ese num de Voluntario y ponerlo en el textbox txtNumVoluntario.
Bueno amigo. Espero se haya entendido lo que quiero y que me puedas dar una mano.
Gracias. Daniel.
Eso tendría que ir en el load del form, cuando ingresas al form que te traiga el ultimo numero de id y lo ponga directamente en el text para dar el alta.
Set Rs = clase_datos.Abre("SELECT MAX(legajo) as ultleg FROM alumnos WHERE cod_colegio = '" & Col & "'")
If Not IsNull(Rs!ultleg) <> False Then
    txtultleg.Text = Rs!ultleg
 Else
    MsgBox "No Hay Ningun Alumno Cargado", vbInformation, "Control Alumnos"
End If
    Rs.Close
Set Rs = Nothing
Este es donde sacas el max vos tienes que incrementarlo en 1 y listo.
Pero el numero de voluntario lo tienes que poner antes de dar el alta, si entras ahí es para dar una alta, directamente lo pones y listo.
Hola. Creo que por ahí va la cosa aunque sigue sin convencerme el evento en el que pones al código. Yo ingreso un Voluntario sin problemas porque tengo la clave como identity y con incremento en 1. El tema es que quiero que luego de guardar el registro me muestre la clave en el text. Por eso mi duda es en que evento ejecutar el código para que una vez guardado me muestre el último registro ingresado (que siempre será el que haya ingresado recién), y en base al número que me muestra hacer el alta de Socio u alguna otra tabla que tenga en la BD.
Bueno, espero saberme explicar, y que me puedas dar una mano. Gracias!
Eso va al final del código de alta, no va en ningún evento aparte
Después de vaciar los casilleros y dar el mensaje de alta ok ahí buscas el ultimo
Amigo. Está muy buena tu explicación. Igual, por desgracia me surgió un error de compilación: Uso no válido de la propiedad y me marca toda esta línea que te paso en amarillo, y la parte de la asignación del recordset en azul.
Te paso la cadena armada con mis datos, pero, la primer parte de la asignación no la entiendo: clase_datos.Abre
rsVol = clase_datos.Abre("SELECT MAX(ID) as ultID FROM Voluntarios WHERE NumVoluntario = '" & NumVoluntario & "'")
Desde ya muchas gracias por tomarte el tiempo de explicarme, y espero puedas ayudarme a terminar con este tema que me hace doler la cabeza. jaja.
Saludos. Daniel.
Amigo. Te paso el código completo por las dudas. En el apartado anterior estaba mal escrito una parte del código, lo corregí pero igual me tira el mismo error pero sólo me marca en azul la variable recordset hasta la asignación. rsVol =
He aquí el código completo:
Private Sub cmdGuardar_Click()
Dim rsVol As ADODB.Recordset
Dim ConsultaSql As String
    'Dim x As Integer
    Set Base = New ADODB.Connection
    AbrirBase
    Set rstVoluntarios = New ADODB.Recordset
    'ConsultaSql es un string. lo que va adentro es String así que va ence _
    rrado entre "", luego, la unión de cadenas se hace con &
    ConsultaSql = "INSERT INTO Voluntarios("
    'ConsultaSql = ConsultaSql & "NumVoluntario, "
    'ConsultaSql = ConsultaSql & "NumSocio, "
    'ConsultaSql = ConsultaSql & "NumDador, "
    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 & "Tipo_Contribucion "
    ConsultaSql = ConsultaSql & ")values ("
    'ConsultaSql = ConsultaSql & SQLText(txtVoluntario(0).Text) & ", " 'Num Voluntario
    'ConsultaSql = ConsultaSql & Val(Trim(txtVoluntario(1).Text)) & ", " 'Num Socio
    'ConsultaSql = ConsultaSql & Val(Trim(txtVoluntario(2).Text)) & ", " ''Num Dador
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(1).Text) & ", " 'Apellido
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(2).Text) & ", " 'Nombre
    'cambiar por esta:
    ConsultaSql = ConsultaSql & SQLText(DTPFNac.Value) & ", "   'FechaNacimiento
    'Esta línea me daba error:
    'ConsultaSql = ConsultaSql & SQLDate(txtVoluntario(3).Text) & ", "  'FechaNacimiento
    ConsultaSql = ConsultaSql & SQLText(cmbTipoDoc.Text) & ", "  'TipoDocumento
    ConsultaSql = ConsultaSql & Val(txtVoluntario(3).Text) & ", " 'NumeroDocumento
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(4).Text) & ", " 'Domicilio
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(5).Text) & ", " 'Teléfono particular
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(6).Text) & ", " 'Celular
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(7).Text) & ", " 'E-mail
    ConsultaSql = ConsultaSql & SQLText(txtVoluntario(8).Text) & ");" 'Profesión
    'ConsultaSql = ConsultaSql & SQLText(cmbTipoContribucion.Text) & ");"  'Tipo Contribución
    Base.Execute (ConsultaSql)
    MsgBox "Cómo desea ingresar a este Voluntario", vbInformation
    Base.Close
    'Limpiar_Text
    'Limpiar_Combos
    Set rstvol = New ADODB.Recordset
    rsVol = clase_datos.Abre("SELECT MAX(ID) as ultID FROM Voluntarios WHERE NumVoluntario = '" & NumVoluntario & "'")
If Not IsNull(rstvol!ultID) <> False Then
    txtVoluntario(0).Text = rsVol!ultID
 Else
    MsgBox "No Hay Ningun Voluntario Cargado", vbInformation, "Control de Voluntarios"
End If
    rsVol.Close
Set rsVol = Nothing
     cmdGuardar.Enabled = False
End Sub
Bueno, muchas gracias nuevamente!
Saludos. Daniel.
Primero lo de consultasql = consultasql eso ya deja de usarlo. Queda mal y no es un buen estilo de programación.
El error del recordset esta acá
Dim rsVol As ADODB.Recordset
Dim ConsultaSql As String
    'Dim x As Integer
    Set Base = New ADODB.Connection
    AbrirBase
    Set rstVoluntarios = New ADODB.Recordset
vos declaras rsvol y no declaras rstvoluntarios
saludos
Leandro
Estimado amigo. Gracias por tomarte el tiempo para contestar!
Tenías razón pero he hecho esta modificación y no me muestra nada más que el número cero en el text que he designado para que me lo muestre.
Te paso el código a ver si encuentras adonde falla. Gracias!
Private Sub Form_Load()
    'Dim CadenaVol As String
    'Dim CadenaSocio As String
    'Dim cadenaDador As String
    Dim NumSoc As Integer
    Dim NumDad As Integer
    Dim rstVolS As ADODB.Recordset
    Me.Left = (Screen.Width - Me.Width) / 2
    Me.Top = (Screen.Height - Me.Height) / 6
    AbrirBase
    Mostrar
    MostrarSocio
End Sub
Private Sub Mostrar()
       Dim cadenaconexion As String
       Dim cadenaStr As String
       cadenaStr = "Select * from Voluntarios"
       rstVoluntarios.Open cadenaStr, Base
       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
Private Sub MostrarSocio()
    Dim CadenaSocio As String
    CadenaSocio = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Set rstVolS = New ADODB.Recordset
    rstVolS.Open CadenaSocio, Base
    If Not IsNull(rstVolS!numsocio) Then
        txtNumSocio.Text = rstVolS!numsocio
    Else
        txtNumSocio.Text = 0
    End If
    End Sub
Saludos! Daniel.
Llego 2 veces ¿?
Sí. Llegó 2 veces. jaja. Ya que estamos t hago una consulta
Quiero hacer un procedimiento para que me muestre el Número de socio que le asigné a un voluntario en un formulario distinto, en el cual me muestre todos los datos del voluntario y además la clave que fue asinada a ese Voluntario, para lo cual declaré un registro rstVols. Mi problema está en que no me lo muestra, y que tampoco se donde usar el procedimiento. Te paso el código para ver si ves donde estoy fallando. La única forma que no m mostró el cero y sí me mostró un número fue cuando eliminé unos cuantos registros hasta que el actual fue uno que sí tenía Número de socio, pero luego me pasó lo mismo, me mostró ese mismo número para todos los demás registros!
Otro problema que tengo es cuando elimino un registro, lo elimina pero me lo sigue mostrando en el formulario.
Private Sub Form_Load()
    Dim NumSoc As Integer
    Dim NumDad As Integer
    Dim rstVolS As ADODB.Recordset
    AbrirBase
    Mostrar
    MostrarSocio
End Sub
Private Sub Mostrar()
    'Dim CadenaSocio As String
    Dim cadenaconexion As String
    Dim cadenaStr As String
    'CadenaSocio = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    cadenaStr = "Select * from Voluntarios"
    rstVoluntarios.Open cadenaStr, Base
       If rstVoluntarios.EOF = False Then
           'txtNumDador.Text = rstVoluntarios!NumDador + 1
           'txtNumSocio.Text = rstVoluntarios!NumSocio + 1
           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
Private Sub MostrarSocio()
    Dim CadenaSocioVoluntario As String
    CadenaSocioVoluntario = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Set rstVolS = New ADODB.Recordset
    rstVolS.Open CadenaSocioVoluntario, Base
    If rstVolS.EOF = False Then
        If Not IsNull(rstVolS!numsocio) <> False Then
            txtNumSocio.Text = rstVolS!numsocio
        Else
            txtNumSocio.Text = 0
        End If
    End If
    End Sub
y el código de eliminar xq no anda tampoco lo puedo ver.
Private Sub cmdEliminarVol_Click()
    Dim rstVolElim As ADODB.Recordset
    Dim StrElimVol As String
    Set rstVolElim = New ADODB.Recordset
    StrElimVol = "DELETE FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Base.Execute (StrElimVol)
    MsgBox "Voluntario Eliminado"
 End Sub
¿No hay un método similar al refresh para que se refresquen los registros luego de eliminar?
Bueno amigo. Me despido. Espero me ayudes a encontrar la solución. Saludos. Daniel
Vamos a cerrar esta pregunta y seguimos en la otra porque creo que también te la coneste sin quieres
porque vos llamas a select * voluntarios sin where entoncers te trae todo lo que este en la base, como política de programación el * no se usa, si es necesario para una tabla chiquita pero muy chiquita y donde uses todos los campos de todos los registros
acá no vas a usar todos los registros, con el where vas a seleccionar cual quieres mostrar.
Saludos y por favor termínala y la seguimos en la otra
Amigo, si quieres la termino a la pregunta pero no has respondido lo que yo he solicitado.
Yo quiero eliminar un registro que coincida con el número que tengo en el cuadro de texto por eso es que tengo que usar el where.
y en esta consulta no uso el *(asterísco en ningún momento):  CadenaSocioVoluntario = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
Y lo que quiero hacer es seleccionar el socio que es voluntario. ¿Qué es lo que no se entiende?
Y este procedimiento:
Private Sub MostrarSocio()
    Dim CadenaSocioVoluntario As String
    CadenaSocioVoluntario = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Set rstVolS = New ADODB.Recordset
    rstVolS.Open CadenaSocioVoluntario, Base
    If rstVolS.EOF = False Then
        If Not IsNull(rstVolS!numsocio) <> False Then
            txtNumSocio.Text = rstVolS!numsocio
        Else
            txtNumSocio.Text = 0
        End If
    End If
    End Sub 
Lo quiero usar para que me traiga el número de socio del Voluntario que se inscribió como tal, porque no todos los voluntarios son socios, pero no me anda y por eso te consulto ya que tu eres el experto.
Saludos. Daniel.
Me estas mareando! Si lees para arriba hay como 4 consultas en el mismo hilo...
Pensé que otra vez vino repetida y no la leí, disculpame.
hola el delete no te funciona¿?
No podes ver los datos porque vos tienes que llamar cuando terminas de borrar o modificar al procedimiento mostrar datos.
La pregunta es ¿dónde se tiene que refrescar los datos que vos eliminas?
¿En qué componente? El procedimiento de mostrar lo tienes. Solo lo tienes que llamar y aplicárselo al componente necesario.
Porque si eliminas con delete lo va a borrar y no te tiene que mostrar nada, porque no veo que estés usando grilla o listbox.
veamos esto "DELETE FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
Si numvoluntario es numérico esta mal empleado el uso de las comillas simples, solo los campos string van en comillas simples
seria "DELETE FROM VOLUNTARIOS WHERE NumVoluntario = " & txtModVoluntario(0).Text
Ese puede ser un motivo que no te este eliminando si el campo numvoluntario es numérico.
Vamos a la segunda parte
Es lo mismo que ante si numvountario es string la consulta no tendría que estar dando problema al menos que el textvoluntario(0) este vacío.
Hace una interrupción en el código en la consulta haber que dato tiene el textbox.
Amigo. Las disculpas aceptadas. El delete no me funcionaba y me sigue sin funcionar. Como verás puse el procedimiento mostrarVoluntarios luego de eliminar pero me dice, la operación no está permitida si el objeto está abierto y me marca esta línea como la del error: rstVoluntarios.Open cadenaStr, Base del procedimiento MostrarVoluntarios.
Private Sub cmdEliminarVol_Click()
    Dim rstVolElim As ADODB.Recordset
    Dim StrElimVol As String
    Set rstVolElim = New ADODB.Recordset
    StrElimVol = "DELETE FROM VOLUNTARIOS WHERE NumVoluntario = " & txtModVoluntario(0).Text
    Base.Execute (StrElimVol)
    MsgBox "Voluntario Eliminado"
    MostrarVoluntarios  
End Sub 
Private Sub MostrarVoluntarios()
    Dim cadenaconexion As String
    Dim cadenaStr As String
    cadenaStr = "Select * from Voluntarios"
    rstVoluntarios.Open cadenaStr, Base 'Línea donde me marca error.
       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
y también, como te comentaba antes, con este procedimiento:
Private Sub MostrarSocio()
    Dim CadenaSocioVoluntario As String
    CadenaSocioVoluntario = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Set rstVolS = New ADODB.Recordset
    rstVolS.Open CadenaSocioVoluntario, Base
    If rstVolS.EOF = False Then
        If Not IsNull(rstVolS!numsocio) <> False Then
            txtNumSocio.Text = rstVolS!numsocio
        Else
            txtNumSocio.Text = 0
        End If
    End If
    End Sub
Lo que quiero es que me muestre el número de socio que fue asignado a ese Voluntario pero me muestra el número del primer registro, ya sea 0 (si es que todavía no se inscribió como socio), 1, 10 o cualquier número y no me muestra los números de otros voluntarios que se inscribieron como socio.
Bueno amigo espero no haberte mareado nuevamente y que puedas responder a mis consultas.
Muchas gracias! Daniel.
Vamos con el delete, la consulta esta bien echa, queda revisar paso a paso que la variable tenga datos, y que sentencia este funcionando Base. Execute (StrElimVol)
despues el error del recordset.open es que nunca cerrar un recordset cuando terminas de usarlo, tenes que acostumbrarte a cerrar con rs.close y set rs = nothing
la ultima parte estoy medio perdido con la logica
yo entiendo que primero si se ejecuta  mostrarvoluntarios.
La consulta "Select * from Voluntarios" estas diciendo que te traiga todos los registros de la tabla voluntarios y después lo pasas a un text ¿? Siempre te va a quedar el primer registro del recordset clavado, o le ingresas un where y lo haces único o vas a tener que ver otra manera de mostrar los datos.
select * from voluntarios trae 100 registros ¿como hace una coleccion de text para verlos a todos?, si los text siempre pueden ver 1 y otra cosa del codigo es que nunca moves el recordset, preguntas si el recordset tiene datos, despues asignas cada text a los campos de la tabla y termino.
Faltaría el rs.movenext para que siga avanzando y cuando termina y sale del if tienes que cerrar el recordset.
(Para solucionar este tema te aconsejo que dejes los text pero para mostrar utilices una grilla hiperchical flex grid donde podes poner todos los datos, y después seleccionas cual quieres modificar.)
Es por eso que el mostrarsocio actúa raro, soluciona lo de arriba y mostrarsocio va a traer. Pero acá quiero que veas algo que tienes que unificar porque no le veo motivo para hacer 2 procedimiento bajo la misma consulta.
Pregunta ¿un voluntario tiene un numero de socio solamente?
Entonces esto lo tenemos que resolver en una solo procedimiento.
Si pasas que todos los datos se carguen en una grilla
insertas el componente en el form y debajo de
cadenaStr = "Select * from Voluntarios"
    RstVoluntarios. Open cadenaStr, Base 'Línea donde me marca error.
pone set nombregrilla.datasource = recordset
rs.close
set rs = nothing
ahora ahi vas a poder ver todos los registros de voluntarios, y al seleccionar en una fila de la grilla
ejemplo!!!!
        txtModVoluntario(0).Text = .TextMatrix(.RowSel, 1)
        txtModVoluntario(1).Text = .TextMatrix(.RowSel, 2)
        txtModVoluntario(2).Text = .TextMatrix(.RowSel, 3)
Y asi hasta cantidad de columnas tengas.
Bueno espero que te sirva.
Estimado amigo: es verdad, primero se ejecuta mostrarvoluntarios.
La consulta "Select * from Voluntarios" es para que me traiga todos los registros de la tabla voluntarios y después lo pasas a un text. Esto lo hago en el load del formulario, luego en dos commandbutton que puse hago que el cursor vaya avanzando o retrocediendo y me los muestra a todos.
Ahora, si hago un select * from voluntarios, agregando los campos NumDador y NumSocio. ¿Cómo hago para que si es nulo no me tire error?
Saludos.
primero al ser un campo numerico no podes permitir que sean nulos, cargales un cero por default,
pero si en el futuro te topas con alguno la consulta la asi
select isnull(numdador,0) from tabla
aca siempre el recordset te va a traer un registro por lo menos que si es nulo lo va a transformar en cero, pero te repito si es un campo numerico revisa la base porque no puede tener nulo nunca.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas