Visual Basic

Publicado por Flequi, Julio 13, 2005, 01:46:11

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Flequi

A ver, gente quien me puede ar una mano, a lo mejor estoy preguntando algo simple,,pero la verdad q despues de varias horas de programar medio q mi cabez ano da mas y nesesita ayuda je!!

les explico, quiero cargar un combo con nombres de clientes q tengo almacenado en una base de datos (access), los cuales los nombres se repiten (ya q cada cliente puede ser cargado varias veces) la cuestion es q quiero cargar en un combo (para hacer una busqueda) los nombres de los clientes pero sin duplicados...

aclaracion no estoy usando sql, creo q seria un poco mas facil, peor no lo domino muy bien q digamos, la base de datos esta ordenada por id (o sea estan todos los nombres desordenados) , la quise ordenar por nombre, asi me resulta mas facil , pero no me deja..

como puedo hacer paa q los datos entren a un combo sin duplicados??

me explico??

Predicador

Hola Flequi, si mal no recuerdo aunque la BD este en Access podes hacer la lectura en SQL usando Recordsets, la cadenas SQL de consulta deberia ser "SELECT DISTINCT clientes.nombre FROM clientes;" (suponiendo que la tabla se llama clientes y posee el campo nombre que contiene el nombre).
Luego pasas la info del recordset generado al combo.
Baii.

PS: pilas con sql que es mas facil de lo que parece, en dos dias vas a estar dominandolo ;)
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Flequi

gracias predicador, ya lo hice y funciona de 10, lo pongo aca por si alguien lo nesesita

declaro las variables de la base de dato y recordset

Dim BDD As Database 'Objeto para manejar la base de datos
Dim TBL As Recordset 'Objeto para manejar la Tabla

y esto en el form load

Set BDD = OpenDatabase(App.Path & "\base.mdb ") 'Abre la base de datos
Dim SQL As String

SQL = "SELECT DISTINCT nombre FROM Clientes"  'almacena todos los nombres sin repetirlos


Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst
Do Until TBL.EOF
  combo.AddItem TBL("nombre")
  TBL.MoveNext
Loop

Flequi

ya q esta pregunto, capas q con sql se puede hacer mas simple...
lo q quiero hacer es una consulta, con distintos combos y quiero q todas las opciones de busquedas se opcionales, pero a medidfa q tengas seleccionado alguna se te vaya discriminando la buscada cuando apretas el boton buscar.

yo lo pienso hacer, con muchoooooooss if revisando q el combo no este vacio y cuanod este vacio q no compare ese dato con el de la base , me explico no? asi seria un chorizo de if y seguramente me voya perder en el camino.... no hay otra forma de hacerlo

pense q podria controla cuando cada combo tenga algo y cuanod tenga algo voy armando en una variable la consulta, peor no se podra hacerlo,,,
haceto sugerencia, si es mas facil con sql avisenme!!!
  grax, sino me explique bien, preguntenme nomas

Predicador

Flequi, si mal no entendi.. de la forma que vos decis seria la mas adecuada, pero quizas te estas complicando de mas ya que solo tendrias un IF por condicion (o combo). La idea es contruir la consulta en el aire.... algo como:

SQL = "SELECT * FROM clientes WHERE true"

if not isnull(combo1) then
  SQL = SQL & " AND nombre = '" & combo1 & "'"  ' como nombre es string el valor debe ir cerrado entre comillas simples (las de comentarios)
end if
if not isnull(combo2) then
  SQL = SQL & " AND edad > " & combo2
end if
if not isnull(combo3) then
  SQL = SQL & " AND cuit = '" & combo3 & "'"
end if


y aca despues corres la consulta usando el string SQL (cuyo contenido se genero en tiempo real de acuerdo a los valores de los combo boxes).

Si entendi cualquier cosa avisame, y si no entendiste algo, avisame tambien que trato de explicarlo mas profundamente (no se que tanto es tu conocimiento de programacion).
Baii y exitos ;)

EDIT: corregi un errorcito ;)
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Flequi

claro entiendo le codigo.. va entrar a los if si el valor no es null, pero compararia y mostarria?? o sea quiero q todo sea discriminativo, ponele en el ejemplo q vos dice

si selecciono el nombre y el cuit, quiero q me aparesca el usuario con ese nombre y cuit y si despues selecciono la edad quiero me discrimime aparte de esos dos datos , la edad (digamos q no son buenos datos para el ejemplo. pero s eentendio no??)

como concateno la busqueda depeus? que me compare todo??


Update, aha..estamos agregandole a SQL toda la cadena!! aja!! toy entendiendo.... depsues como llamo la exprecion SQL ..... SQL.execute????

Predicador

Lo que tenes al final de todos los IF es la cadena SQL con el query generado, lo que debes hacer despues es como lo mismo que hiciste en el primer codigo para ejecutar una consulta sql:

' defini las variables antes, claro
Set BDD = OpenDatabase(App.Path & "\base.mdb ")

' aca el codigo de los IFs que contruyen
' la consulta SQL

Set TBL = BDD.OpenRecordset(SQL)

y listo, en TBL de tipo recordset tendrias el resultado.

[  Pasa que yo en el codigo puse solo la forma de construir la consulta, ya que vos mismo habias mostrado antes codigo donde usabas recordset y cosas asi, las asumi sabidas :)  ]

Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Flequi

mmm se me hizo un lio.. lo q pasa q no manejo casi nada de sql .....

o sea una ves q hago lo que vos me dijiste, como hago para q los datos los muestre en una grillla...

me podrias poner todo el ejemplo completo

SQL = "SELECT * FROM clientes WHERE true"

if not isnull(combo1) then
  SQL = SQL & " AND nombre = '" & combo1 & "'"  ' como nombre es string el valor debe ir cerrado entre comillas simples (las de comentarios)
end if
if not isnull(combo2) then
  SQL = SQL & " AND edad > " & combo2
end if
if not isnull(combo3) then
  SQL = SQL & " AND cuit = '" & combo3 & "'"
end if


eso me devuelve los datos q corresponden a la busqueda que realise, ahora como los vuelco a la grilla?

yo soin utilizar sql lo hago distinto, o lo mejor al implementar esti s eme hace un lio y es una boludes!!
desde ya gracias!!

Flequi

esto es lo q quiero ahcer... y como diria homero me estoy volviendo chango para q todas las busquedas sean opcionales!! la forma q decia yo es imposible tendria q poner 200 if (una para cada conbinacion) ..
ver si el valor del combo es distinto de vacio y ir concatenando lo probe y no me anda..!


Predicador

Hola Flequi, realmente no se ni cuntas tablas estas usando, si el query incluye algun JOIN o no, pero en fin, aca va un ejemplo simple que deberia ser ejecutado cuando la persona apreta el boton BUSCAR

DIM BDD As Database
DIM TBL As Recordset
DIM SQL as String

SQL = "SELECT * FROM clientes WHERE true"
IF not isnull(combo_nombre) THEN
  SQL = SQL & " AND nombre LIKE '" & combo_nombre & "'"  ' como nombre es string el valor debe ir cerrado entre comillas simples (las de comentarios)
END IF
IF not isnull(combo_edad) THEN
  SQL = SQL & " AND edad > " & combo_edad
END IF
IF not isnull(combo_cuit) THEN
  SQL = SQL & " AND cuit LIKE '" & combo_cuit & "'"
END IF

' hasta aca no se hiso busqueda alguna, solo se chequeo si los combo boxes contienen valor, si lo tenian entonces se agrego una condicion a la cadena de busqueda
debug.print SQL  ' esto es para que veas en modo debug como se formo la consulta

Set BDD = OpenDatabase(App.Path & "\base.mdb ") 'abre la base de datos
Set TBL = BDD.OpenRecordset(SQL) 'ejecuta la consulta

TBL.movefirst
do Until TBL.EOF
 algun_combo.additem TBL("nombre")  ' algun_combo debe estar definido ;)
 TBL.movenext
Loop

Esto deberia andar si o si, es un codigo muy simple, un IF por cada condicion de busqueda.
Suponiendo que los combos combo_nombre y combo_edad tienen valores (Pepe y 66 respectivamente) y combo_cuit esta vacio, cuando la persona presione buscar, se ejecutara el codigo y la linea debug.print SQL imprimira:
CitarSELECT * FROM clientes WHERE true AND nombre LIKE 'Pepe' AND edad > 66
Espero que esto ayude, creo que no puedo ser mas exlicito sin ver el codigo o al menos saber el formato de las tablas que usas.
Baii.

PS: perdon por tomar tanto en responder, pero esta durmiendo jejee, los usos horarios molestan a veces :P
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Flequi

gracias predicador, ahora me estoy llendo atrabajar cuando llego me voy a poner d evuelta desde ya gracias!!

Billy Gates

Cita de: Flequimmm se me hizo un lio.. lo q pasa q no manejo casi nada de sql .....

o sea una ves q hago lo que vos me dijiste, como hago para q los datos los muestre en una grillla...

me podrias poner todo el ejemplo completo

SQL = "SELECT * FROM clientes WHERE true"

if not isnull(combo1) then
  SQL = SQL & " AND nombre = '" & combo1 & "'"  ' como nombre es string el valor debe ir cerrado entre comillas simples (las de comentarios)
end if
if not isnull(combo2) then
  SQL = SQL & " AND edad > " & combo2
end if
if not isnull(combo3) then
  SQL = SQL & " AND cuit = '" & combo3 & "'"
end if


eso me devuelve los datos q corresponden a la busqueda que realise, ahora como los vuelco a la grilla?

yo soin utilizar sql lo hago distinto, o lo mejor al implementar esti s eme hace un lio y es una boludes!!
desde ya gracias!!

SELECT * FROM clientes WHERE true INTO CURSOR Pepe

Fijate que el into te genera un cursor (tabla en memoria)... de esta manera, podes tratar este cursor como una tabla. Con todas sus sentencias y metodos.
Lo que se me ocurre haciendo este cursor es que hagas la copia a la grilla desde este cursor[tabla].

En sql, seria de esta manera...

INSERT Cursor_Pepe(nombre,apellido,estoesunejempo)
INTO Tabla_que_contiene_la_grilla(en memoria...seria un query o algo asi)

Espero te sirva.

PD: No se nada de VB... pero en Fox lo haria asi...



Select Grilla
Replace Campo1 with cursorpepe.nombre


Y asi sucesivamente.

Un abrazo
Porque aceptar lo que ellos dicen que esta mal, si su verdad es tan falsa?

Flequi

grax  Billy Gates !! ya lo solucione!!

Billy Gates

Perdon por no llegar antes :(
Pa'lo que necesites chango :D
Porque aceptar lo que ellos dicen que esta mal, si su verdad es tan falsa?

petty.oi

Hola gente estoy por iniciar un programa de facturacion y no se que me sirve mejor si hacerlo con access, en visual usando el data manager o a la antigua con archivos, el programa ingresa a los clientes, el personal y los productos.


lo estuve haciendo en access y despues pase a visual con el data manager y se complica me faltan tanto en acces como en visual conocer algunos comandos para simplificarme las cosas. si alguno me recomienda algo para no enquilombarme les agradezco.
El temas es q quiero algo q me simplifique lo de la base de datos y no tener q programar mucho y sino bue tendre q programar y no salga de esos dos (access y visual)

Saludos