none
Colecciones con clave en Access 2003 RRS feed

  • Pregunta

  • Hola:

    He pasado un recordset a una coleccion de Clientes (previamente definida en un modulo de clase), y le he asignado como Key el Id del cliente en string, es decir:

    colClientes.Add objcliente,"Id_Cliente"

     

    Todo funciona correctamente, pero si por equivocacion intento acceder a la coleccion con una clave "Id_Cliente" no valida, me da el error '5' en tiempo de ejecución: Argumento o llamada a procedimiento no valido.

    Bien, lo que quiero es poder evitar esto de forma que si introduzco una key erronea diga que la clave es erronea pero no de error el programa. La unica forma que se me ocurre es tratando ese error en la parte de errores pero tendría que volver a subir con un Goto, lo cual me gusta mas bien poco, y ademas ese error podría surgir por otro motivo también (sobre todo durante las pruebas de programacion). No se si alguien sabrá una forma mas elegante.

     

    Un saludo.

    martes, 30 de marzo de 2010 18:59

Respuestas

  • Si claro; es una  matriz avanzada, asociativa, donde puedes eliminar,modificar, etc de una manera mucho mas versátil que con una matriz convencional. Ideal para carritos de compra. En la ayuda de Microsoft Access hay cierta (no muy clara) información). Este objeto tambíen lo he usado en páginas ASP sin problema alguno.

    CJ

    jueves, 8 de abril de 2010 1:33

Todas las respuestas

  • Alvaro, pienso que nadie responde porque no (al menos yo) se entiende el planteamiento.

    Eniendo que ya existe el registro en una tabla y lo estas pasando a una colección (volatil). Si das mas detalle de lo que deseas hacer, es posible que surgan varias opiniones.

    Cordialmente,

    CJ

    miércoles, 31 de marzo de 2010 16:33
  • Hola!

    Haber creo que el planteamiento lo puse claro, aunque igual es claro para mi pero no para el resto que no sabe que quiero hacer. Lo expongo en pasos resumido:

    1. Cargo un ADODB.Recordset de una tabla clientes que tiene por ejemplo los campos Id_Cliente y Nombre_Cliente

    2. Tengo una Clase con las propiedades (Let y Get) de Id_Cliente y Nombre_Cliente, entonces creo una coleccion de clientes de la forma:

    Dim cliente As CCliente

    Dim colCliente As Collection

    Set cliente = new CCliente

    Set colCliente = New Collection

    cliente.Id_Cliente = rstId_Cliente

    cliente.Nombre_Cliente=rst!Nombre_Cliente

    (Haria un bucle para todo el recordset pero bueno lo omito por simplicidad)

    Ahora añado el objeto a la coleccion:

    colCliente.Add cliente," & Id_Cliente & "

    Con esto he añadido un objeto cliente a la coleccion asignandole la Key string de Id_Cliente

     

    3. Una vez que tengo la coleccion completa si quiero acceder a un elemtno puedo hacerlo por su id de la forma (por ejemplo):

    Debug.Print colCliente("16").NombreCliente

    Donde "16" es el cliente con Idcliente = 16 y por pantalla obtendría el nombre del cliente con Id_Clitne = 16

     

    Ahora bien, si no existiera un Cliente con ese Id, obtendría un error en tiempo de ejecucion que es: error '5' en tiempo de ejecución: Argumento o llamada a procedimiento no valido.

    La pregunta era como tratar el error para cuando intente acceder a un cliente qu eno existe (porque no existe su key ) en la coleccion. Es algo asi como:

    If no existe colCliente("2343") then ......

     

     

     

     

    colCliente

     

    jueves, 1 de abril de 2010 2:20
  • Alvaro, ahora entiendo perfectamente. No quiero ser atrevido ( como se dice en el mundo del ajedrez: el que está afuera lo ve todo) y de la manera mas cordial te pregunto:

    Has pensado y analizado bién el planteamiento? para qué  creas la colección?  cómo y para qué va el usuario a buscar un item de la colección? para editarlo, eliminarlo...

    Cordialmente CJ

    jueves, 1 de abril de 2010 12:59
  • Buena pregunta:

    Pues basicamente es para operar con dicha coleccion. Es hacer lo mismo que se hace con un recordset, pero con coleecciones, de forma que al haber creado la clases, se puede acceder a cada propiedad de forma mas sencilla. La idea es poder trabajar ocn algo análogo a un recordset desconectado, de forma que pueda buscar un item, eliminarlo, mostrarlo o crearlo, asi como guardarlo si es necesario.

    miércoles, 7 de abril de 2010 19:58
  • ¿No te vale controlar el código de eror?

    on error goto errores

    ...

    'tu código

    ...

    if err.number = xxx ' el nº de error que se produce then

    msgbox "tu mensaje",...

    else

    msgbox err.description,....

    end if

    end function


    Salu2/Regards Ju@nK www.juank.es
    miércoles, 7 de abril de 2010 20:27
  • En el ámbito web se trabaja de esa manera: desconectado;  yo suelo cargar un arreglo através  de getrows() de adodb. Luego cierro  y destruy objetos; luego puedo recorrer el arreglo y paginar resultados.

    También existe el objeto Dictionary, excelente para lo que deseas.

    miércoles, 7 de abril de 2010 22:54
  • Si, controlar el codigo de error sería una opción. El problema es que es un error bastante genérico, con lo cual no me aseguraría del todo a que es debido ese error.
    jueves, 8 de abril de 2010 0:06
  • Si, la idea es la misma, aunque se supone que collection es mas eficiente, y con los arreglos, si intentas acceder a un elemento que no existe, ocurriría el mismo problema, asi que no me soluciona nada. Una pregunta: Existe Dictionary para Access 2003 con vba?
    jueves, 8 de abril de 2010 0:11
  • Si claro; es una  matriz avanzada, asociativa, donde puedes eliminar,modificar, etc de una manera mucho mas versátil que con una matriz convencional. Ideal para carritos de compra. En la ayuda de Microsoft Access hay cierta (no muy clara) información). Este objeto tambíen lo he usado en páginas ASP sin problema alguno.

    CJ

    jueves, 8 de abril de 2010 1:33