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??
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 ;)
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
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
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 ;)
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????
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.
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!!
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..!
(http://img.photobucket.com/albums/v463/flequi/busqueda.jpg)
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
gracias predicador, ahora me estoy llendo atrabajar cuando llego me voy a poner d evuelta desde ya gracias!!
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 PepeFijate 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.nombreY asi sucesivamente.
Un abrazo
grax Billy Gates !! ya lo solucione!!
Perdon por no llegar antes :(
Pa'lo que necesites chango :D
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
aj, no uses ni visual ni access (VBA) ambos realmente apestan (para mi gusto).
Usa php+mysql .. es multiplataforma y bueno.. opensource :P
la base de acces es muy limitada, y ademas en maquinas con poca ram no funca.
eso es muy cierto, grandes bases de datos cargan la ram y hacen la maquina muy lenta, sql esta mucho mejor diseñada que access.
ChaMeR
Bueno gracias gente voy a tratar!!!!!!
Sino podes usar Access como front-end y un ODBC link a un SQL server como back-end.
Baii.
Hola de nuevo, tengo un problema con un programa q estoy haciendo q no es para nadie pero nunca trabaje con base de datos y quiero probar con visual y access a pesar de las recomendaciones q me dieron ya q aunque no lo cran me resulta facil y una vez q sepa como se hacen lo hare con otra base de datos como ustedes me dijeron y para eso estoy investigando mucho ya q no se visual basic y mi inconveniente es q tengo dos formularios en el q se me repite un mismo dato, por ejemplo:
:arrow: en un formulario (formulario de ingresar al cliente) tengo el numero del cliente y nombre completo, y otros dato q no importan ,pero cuando termina supuestamente el usuario de ingresar los dato y le da guardar despues va a otro formulario el de ventas.
:arrow: en el formulario de venta, cuando se supone q realizaron una venta a ese cliente q ingrese antes quiero q ya me aparezca el numero de cliente y nombre completo. este es mi inconveniente q no se como hacer para q me aparezca cargado una vez q realize la carga del cliente y quiera agregarle una venta .
ahora yo hice la base de datos con el visdata de visual creandola en access, tengo todos los textbox conectados con mi base de datos y no puedo hacer lo q antes les mensione o almenos no encuentro la forma si es con un algoritmo o con algun control q no conozco, no se, ojala puedan ayudarme ya q estoy trabado y me vuelve loco no poder seguir, es q soy una persona testaruda jejejejeje :lol: q le vamos a hacer !!!
cualquier cosa mi mail es :
razorbade@gmail.com
gracias por su tiempo!!!!!!!!
Hola petty.oi,
podes hacerlo de varias maneras, una es http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskcreatinglookuptableforlistboxorcomboboxcontrol.asp y la otra es algo como se explico en este mismo post (http://www.argentop2p.net/foro/viewtopic.php?p=40730#40730) pero levemente modificado:
Asumo que la tabla se llama Clientes y tiene dos campos llamados ID y Nombre y llamarias a este procedimiento cada vez que se abre el formulario de venta para llenar el listbox
DIM BDD As Database
DIM TBL As Recordset
DIM SQL as String
' consultamos la base de datos
SQL = "SELECT * FROM clientes ORDERBY nombre"
Set BDD = OpenDatabase(App.Path & "\base.mdb ") 'abre la base de datos
Set TBL = BDD.OpenRecordset(SQL) 'ejecuta la consulta
' cargamos el resultado del query en un listbox o algun otro combo
TBL.movefirst
do Until TBL.EOF
' algun_combo1 debe estar definido posiblemente como un list box ;)
algun_combo1.additem TBL("nombre")
algun_combo1.ItemData(algun_combo1.NewIndex) = TBL("id")
TBL.movenext
Loop
Luego si queres recuperar el ID del cliente seleccionado usas:
cliente_al_que_le_vendimos = algun_combo1.ItemData(lstRecords.ListIndex)
Baii.
PS: esto te puede servir: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vborilistboxcontrolprogramming.asp
Muchas gracias Predicador por ayudarme voy a intentarlo!!!!!!!!!!!!