Error 3265 en tiempo de ejecución. No se encontró ...

Respuesta de
a
Usuario
Estimado amigo. Resulta que tengo una tabla que tengo una 2 atributos que forman parte de otras tablas, en las cuales, cada uno de ellos es clave.
Hago el ingreso del Voluntario, luego en los otros forms hago el ingreso ya sea como Dador o Socio, y en estos forms tengo un text que toma la clave de Voluntario así actualizo la tabla de Voluntarios agregando cada uno de estos campos. Ahora... Lo que quiero hacer es que me muestre en un formulario todos los datos, incluidas los atributos de NumSocio o NumDador, con una condición de igualdad, Osea, que en el text que tengo asignado por ejemplo para NumDador, o NumSocio, me los muestre para ese Voluntario en particular.
Ej:
NumVoluntario = 1
NumSocio = 10
NumDador = Nada
ApeVol = Perez
NomVol = Juan
FNacVol = 20/05/1983
TipoDocumento = DNI
NumDocumento = 23654897
DomicilioParticular = Azcuenaga 32
TelefonoParticular = 321123123
Celular = 345345
 EMail = perezjuan@yahoo.com.ar
Profesion = Ninguna
Y eh hecho esta porción de código para que me ingrese en la caja de texto en número de socio de esta tabla donde el Numero de Voluntario sea igual al text donde me muestra el número de Voluntario, y me tira el siguiente error:
Error '3265' en tiempo de ejecución: No se encontró el elemento en la colección que corresponde con el nombre o el ordinal pedido.
y me marca esta línea como la del error:
If Not IsNull(rstVolS!NumSocio) <> False Then
Este es el código armado (para que me muestre el número de Socio de ese Voluntario):
Private Sub Form_Load()
    Dim CadenaSocio As String
     Dim rstVolS As ADODB.Recordset ' Voluntario que a su vez es Socio
     AbrirBase
   
     Mostrar
     Set rstVolS = New ADODB.Recordset
     CadenaSocio = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Base.Execute (CadenaSocio)
    If Not IsNull(rstVolS!NumSocio) <> False Then
    txtNumSocio.Text = rstVolS!NumSocio
        Else
        txtNumSocio.Text =0
    End If
    rstVolS.Close
    Set rstVolS = Nothing
Bueno amigo espero puedas ayudarme. Muchas gracias!
   
    
 
 
Experto
Hola
Mira quizás pueda ser que el recordset este vacío entonces estas preguntando a la nada.
despues del base.execute, a veces e conveniente preguntar
if rstvolS.eof then ' esto es si el recordset esta vacio
if rstvolS.eof = false then ' esto es si el recordset tiene uno o mas datos
y ahi seguis con tu instrucción, entonces te permite si esta vacio poner un cartel de que no se encontro el voluntario y es otro control de validación muy importante.
Saludos
Leandro
Usuario
Estimado amigo. He hecho la modificación que me indicaste y lo único que me muestra en el text es un cero en todos los registros.
Te paso el código a ver si encuentras la falla. Muchas gracias!
Private Sub Form_Load()
    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
O lo tendría que hacer desde el mostrar y agregar el text de NumSocio. El problema es que eso no se como hacerlo (mezclar los dos recordsets)
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
           
'txtNumSocio.Text = rstVoluntarios!NumSocio ¿Tendría que agregar esta línea? 
           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) Then
            txtNumSocio.Text = rstVolS!numsocio
        Else
            txtNumSocio.Text = 0
        End If
    End If
    End Sub
Bueno amigo. Gracias por tu tiempo! Saludos. Daniel.
Usuario
Estimado amigo. Gracias por responder!
He hecho la modificación que me has indicado pero no logro que me muestre el número de Socio. Sólo me muestra un cero en el text.
He aquí el código a ver si puedes ver el error. Gracias!
Private Sub Form_Load()
    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 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
           ¿O lo tendría que hacer desde aquí? Lo único es que no sé como hacer para utilizar los dos recordsets!
           '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 CadenaSocio, Base
    If rstVolS.EOF = False Then
        If Not IsNull(rstVolS!numsocio) Then
            txtNumSocio.Text = rstVolS!numsocio
        Else
            txtNumSocio.Text = 0
        End If
    End If
    End Sub
Bueno amigo. Muchas gracias por tu tiempo! Espero puedas ayudarme a ver el error. Saludos. Daniel.
 
Experto
Hola mira lógicamente no se entiende podrías cambiar los nombres de los procedimientos para que reflejen un poco mejor que hacen, el segundo ponele mostrar_Id_socio y el de arriba mostrar_datos_socio. Es un consejo fíjate después.
Ya no hay errores de programación, así que vamos al error lógico.
En donde mostrás los datos, primero haces un recordset que te trae un numero de socio cuando en el casillero de txtmodvoluntario(0) hay algo ¿existe datos a la hora de la comparación?
Después ese dato, lo tienes que guardar en una variable si lo vas a seguir usando para el otro recordset, cerras el primer recordset y abrís el segundo.
Fíjate y usa una interrupción y anda paso a paso para ver el camino que esta haciendo la lógica del sistema.
Saludos
Usuario
Primero: Gracias por el consejo.
Segundo: Sí, al usar el procedimiento mostrar me muestra los datos del voluntario. En txtmodvoluntario(0) lo que me muestra es el núm de voluntario. Y quiero que me diga para ese voluntario, el Numero de socio en el text txtNumSocio.
¿Podrías modificar mi código para mostrarme esto que me dices?: Después ese dato, lo tienes que guardar en una variable si lo vas a seguir usando para el otro recordset, cerras el primer recordset y abrís el segundo.
Bueno, muchas gracias!
Saludos. Daniel.
Experto
Hola,
Antes de hacer código quiero entender la lógica porque no entiendo de donde sale el numero de socio y porque arriba tienes 2 consultas echas para la misma tabla voluntarios
haciendo esto no seria lo mismo
"SELECT NumSocio, numvoluntario, nombre, etc FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
Porque estas mostrando los datos, y elegís una tabla sola.
Y si numero de socio y nro de voluntario están en la misma tabla con una sola consulta tienes resuelto la muestra de datos
saludos
Leandro
Usuario
Muy buena tu pregunta.
Por un lado, en un form hago el ingreso de Voluntarios, luego a parte hago el ingreso de socios. La clave que se genera de socios la logro insertar en la tabla de Voluntarios.
Cómo el campo clave de Socios y Dadores en la tabla de Voluntarios la tengo como atributo y permito el nulo en la de Voluntarios.
Cuando hago el ingreso de un socio, en el form de socios tengo un text que me trae la clave que me muestra en el text de Gestión de Voluntarios (uno que uso para hacer el alta del voluntarios como Socio, Dador, etc) en el cual recorro los registros de los voluntarios y los ingreso como te comentaba antes.
Lo que quiero lograr es que cuando vaya nuevamente al de Gestión de Voluntarios me muestre también la clave ya sea de Socio o de Dador, etc, si es que ese Voluntario alguna vez fue ingreso como tal, pero no se como hacerlo.
Por eso es que hice un mostrar (muestra todos los datos de los voluntarios) y un mostrar socio que lo que quiero es que me muestre el número de socio de ese voluntario que me muestra ni bien arranca el formulario, y para ese voluntario tengo en un text aparte de la matriz de controles que tengo para los voluntarios para que me muestre el número de socio de ese voluntario(txtvoluntario(0).text)
Bueno amigo. Espero me entiendas y muchas gracias por tu interés.
Saludos. Daniel.
Experto
Te digo como lo hago yo, porque tengo varios form de esa manera.
Entiendo que vos podes dar más de un alta al mismo tiempo en el form de alta de socios.
Perfecto, y no se tiene porque conectar con el otro formulario, una vez que esta el alta, listo se termino su función.
Al abrir el form gestión de voluntarios en el load del form tienes que tener una llamada al procedimiento mostrar datos, y así pones el código para que te muestre
Muy bien no entiendo que al entrar a la gestión de voluntarios tienes que mostrar los 2 datos, pero ¿los tienes que mostrar para todos?
¿Por qué no esperar que el usuario haga el movimiento de seleccionar un voluntario para mostrarle todos los datos?
Bueno arrancamos por ahí y vamos viendo si estamos en el camino correcto
Saludos
leandro
Usuario
Amigo. Lo que quiero lograr con el form de Gestión de Voluntarios (creí que ya te lo había dicho) es que me muestre si ese voluntario fue agregado como socio o dador, si no tengo completo alguno de estos text (txtNumDador o txtNumSocio) lo que quiero hacer en el mismo formulario agregarlo en la tabla que no es Socio o Dador.
Esta parte de tu aclaración (porque no esperar que el usuario haga el movimiento de seleccionar un voluntario para mostrarle todos los datos) no entiendo lo que me dices ni como hacerlo. Si quieres me explicas. Muchas gracias!
Experto
HOLA estoy tratando de seguirte en dos preguntas al mismo tiempo que me parecen muy parecidas, pensá que no conozco tu sistema ni tu base de datos.
En la otra pregunta cuando te hablaba de la grilla, hacia referencia a la parte de la aclaración que no entendés, que es si el usuario hizo click ahí recién le muestro los datos en cada text box.
¿Cómo hace la lógica para determina si la persona fue agregada como socio o dador?
Sin pasarme el código, solo el camino lógico del momento de la consulta hasta la verificación de que tipo es.
En esta parte "... si no tengo completo alguno de estos text (txtNumDador o txtNumSocio) lo que quiero hacer en el mismo formulario agregarlo en la tabla que no es Socio o Dador..."
Sino encontrás nada tienes que agregar en la tabla que esa persona no es ese tipo ¿?
No basta con solamente decir que es socio o dador, es uno o es otro o hay más tipos de personas ¿?
Saludos
Leandro
Usuario
A ver... Vamos por partes. Tengo 3 tablas: Voluntarios, Socios, Dadores.
La tabla de Voluntarios la uso para ingresar los datos personales de alguien que se quiere inscribir tanto como Dador o Socio por eso es que en la tabla de Voluntarios tengo la un atributo NumDador y NumSocio para llenar luego de que algún voluntario se inscribe como Dador o Socio. El problema mío no es el de ingresos ya que eso lo hago bien.
Ahora, supone que un Voluntario se inscribió como Socio y no como Dador, bueno, para eso tengo un form de Gestión de Voluntarios para poder dar el alta de este Voluntario como dador, pero para eso necesito que me muestre en este formulario de Gesitón de Voluntarios en los text que tengo definidos para tal caso, el NumSocio o el NumDador, ya que si me muestra el NumDador solamente quiere decir que no se inscribió nunca como dador, entonces lo inscribo como tal.
Por eso es que hago este procedimiento para mostrar el número de Socio de ese Voluntario por ej. pero el problema está en que me muestra el número de Socio del primer registro siempre y no cambia el número nunca, aunque haya algúnotro Voluntario ingresado como Socio.
Private Sub MostrarSocio()
    Dim CadenaSocioVoluntario As String
    CadenaSocioVoluntario = "SELECT NumSocio FROM VOLUNTARIOS WHERE NumVoluntario = '" & txtModVoluntario(0).Text & "'"
    Set rstVolS = New ADODB.Recordset
    rstVolS.Open CadenaSocio, Base
    If rstVolS.EOF = False Then
        If Not IsNull(rstVolS!numsocio) Then
            txtNumSocio.Text = rstVolS!numsocio
        Else
            txtNumSocio.Text = 0
        End If
    End If
    End Sub
Bueno, espero se haya entendido mi explicación y que me puedas ayudar.
Saludos. Daniel.
Experto
Hola si muy buena la explicación ahora entiendo un poco mejor.
La consulta que estas haciendo arriba para traer el numero de socio esta bien echa y te tendría que traer un solo socio nada más.
Pero pensá que estas usando recordset. Si tu consulta trae más de 1 opción solamente te va a mostrar el primero de esa lista. Y tienes que recorrerlo para que te muestre los demás.
Entonces antes de plantear la lógica tienes que asegurar que ese recordset cumple esa función. Antes vi en tus códigos que usasbas select * from voluntarios y después el recordset no lo recorrías entonces siempre te mostraba el primero de la lista.
Para resolver si el voluntario es socio o dador si haces un select numsocio, numdador from voluntario where idvoluntario = text y cuando te traen los datos haces la lógica de si es un u otro ¿?
Para entender un poco mejor pásame en limpio como seria la lógica de las 2 opciones.
¿Si es socio que pasa? ¿Si es dador? ¿Puede ser ninguno de los 2?
Saludos
leandro
Usuario
Amigo. La verdad es que si bien has puesto interés no has sabido responder muy bien a preguntas claras y concisas. Le hemos dado muchas vueltas innecesarias. Un saludo y muchas gracias!