FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Tabla que llena un query
Hola a todos, estoy trabajando con los componentes ZEOS, base de datos Firebird y Delphi 7. Me conecto por medio de un Query pero este query es muy dinamico, puede ser utilizado para mostrar informacion de cualquier tabla, aqui viene el problema: Yo puedo recuperar todos los campos que devuelve la consulta por medio del FieldDefs, lo que me falta saber es por medio de que propiedad puedo recuperar la tabla o tablas que llena esta Query?
Gracias por leerme
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#2
|
||||
|
||||
La query está creada en la base de datos o la generas tú??, estoy pensando en parsear el texto de la propiedad sql.text y de ahí sacar las tablas
__________________
Lo importante no es llegar primero, sino saber llegar. Para que puedas llegar mejor lee la Guia de Estilo |
#3
|
||||
|
||||
El nombre de la tabla lo tendrás finalmente en Aux_Table. P.D. He obviado el código correspondiente a la declaración de variables.
__________________
Piensa siempre en positivo ! |
#4
|
||||
|
||||
Pues lo que pensaron ustedes es como lo tengo en estos momentos, solo queria asegurar que no hubiese una propiedad del dataset que guarde la lista de las tablas involucradas
ahora con el monstruo de codigo que coloco gluglu, me puse a sudar, para que es la comparacion con #13 o #10??
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#5
|
||||
|
||||
Al menos yo, utilizo en algunos casos sentencias SQL muy largas que por supuesto detallo en varias líneas, y estas líneas incluyen entonces un #13#10 para salto de línea.
Es por ello que para parsear la sentencia SQL correspondiente al Select elimino previamente esos saltos de línea y los convierto en blancos (' ') para obtener un único string a parsear posteriormente. Y quiero añadir que tu código no sería correcto en varios casos : 1. Que en algún momento decidieras hacer uso de mayúsculas/minúsculas en tu texto SQL. Por eso convierto previamente todo a caracteres mayúsculas con Upper. No recuerdo en estos momentos excatamente si en caso de no hacerlo así, y dejando los saltos de línea, las funciones Copy, Pos y PosEx devuelven valores con sentido. Supongo que en su momento lo analizé y ví que era así, que dichas funciones devuelven valores raros si por medio hay #13#10 de saltos de línea. 2. Que alguno de tus campos de la tabla haya sido nombrado con algun nombre que contenga 'from' como parte del nombre. (Ej. : se me ocurre ahora mismo la palabra 'fromage', que significa queso en francés). Select fromage from mi_tabla_de_fromages En este caso tu código detectaría la 1ª aparición de 'from' en los nombres de los campos de la tabla y no el nombre de tabla que estás buscando. Es por ello que deberías buscar la última aparición de ' from', con un espacio delante, ya que si 'from' está a su vez contenido en el propio nombre de la tabla, si no buscas con el espacio delante, tampoco obtendrás el nombre de la tabla. Por ello incluí el bucle expresado en mi código utilizando PosEx. 3. Tu código tampoco funcionaría correctamente si utilizas un 'alias' para el nombre de la tabla. Select fromage from mi_tabla_de_fromages mtdf where fromage = 1 (je je ... me acabo de dar cuenta que mi código tampoco funciona 100% ... Ahora después me pondré a corregirlo y tener en cuenta las apariciciones de ' from' después de un where ). No debes de buscar el nombre de la tabla hasta el próximo 'where' porque puede haber un alias en medio. Deberás buscar desde la correcta aparición de ' from' hasta el siguiente espacio en blanco para ignorar el alias. Además, por supuesto que se pueden dar multitud de ocasiones de sentencias SQL que no contengan ninguna condición 'where', por lo que dicha palabra ni siquiera aparecerá en la sentencia SQL y tu código tampoco sería correcto. En cualquier caso, también habría que tener en cuenta que 'where' también pudiera formar parte de cualquier nombre de campo. Como verás, finalmente no es asunto tan fácil como cabría pensar. Espero no haberte 'desmoralizado' con las múltiples posibilidades de fallo de tu código.
__________________
Piensa siempre en positivo ! Última edición por gluglu fecha: 09-03-2008 a las 11:31:31. |
#6
|
||||
|
||||
Aquí un humilde TSelectString para crear al vuelo y modificar los sqls.
Se trata de trocear un Sql en Secciones ( el select, el from, el where, etc), poder acceder a cada una de ellas y modificarlas con algo de comodidad.
ss.Sections[pFrom] --> te devolverá desde la palabra "FROM " hasta el "where " (o el final del sql); No es una versión definitiva, pero algo es algo. Edito: - hay algunas unidades que no las tendréis, borrarla del uses, no las utiliza. - "saltolinea" es una constante definida como const saltolinea = #13#10 - Creo eso es todo.... Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 09-03-2008 a las 12:01:42. |
#7
|
||||
|
||||
Ya creo que lo tengo correctamente :
Bastaba con buscar 'from' como palabra 'reservada'. Es decir, basta con buscar ' from ' con espacio delante y detrás. Y revisando el código, me dí cuenta de otra particularidad que no mencioné anteriormente : las subconsultas ! Select fromage, (Select loquesea from mi_otra_tabla where loquesea = 1) from mi_tabla_de_fromages mtdf where fromage = 1 Por eso lo de localizar la última aparición de ' from ' en la sentencia SQL. Saludos
__________________
Piensa siempre en positivo ! |
#8
|
||||
|
||||
Tienes razón, el TSelecStrings no tiene en cuenta las subconsultas (yo no las uso mucho) .
Ahora que lo pienso:
... amos, que si nos ponemos a buscarle fallos, no terminamos. Por suerte y sin tenerlo programado, puedes armar la consulta como:
Por cierto guglu, deja de chatear conmigo Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 09-03-2008 a las 12:16:25. |
#9
|
||||
|
||||
Hola y gracias por la ayuda, me ha servido de mucho, no me desmoraliza las fallas ya habia analizado una serie de escenarios y se que no funcionaria a la perfeccion. Por eso buscaba alguna propiedad magica, que me delvoviera las tablas involucradas.
Yo creo una pantalla de busqueda generica: Una caja de texto, un Grid, un boton y un query, en la inicializacion del form paso como parametro la sentencia que quiero mostrar y automaticamente se arma el grid con la informacion resultante de la consulta. Al darle el boton aceptar devuelve el valor del campo en la posicion 0. Ahorita doy la opcion con un filtro de ir buscando el registro que coincida con lo que se escribe en la caja de texto. Pero como se quiere acceder por medio de internet es muy lento debido a que hay que cargar todos los registros. Lo que pretendo es relanzar la consulta que lleno la tabla con los filtros establecidos por el usuario. Es decir, la primera pudo haber sido por el nombre, luego por el apellido, pense hacerlo como algo parecido a como sugirio Lepe, tres variables: Campos, Tablas y condicion y armar el sql algo asi:
pero tambien le doy a los usuarios avanzados la capacidad de crear sus propias consultas sql. Bueno espero haberme explicado y usare las sugerencias obtenidas. Muchas gracias a todos por sus acertadas participaciones. Saludos
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#11
|
||||
|
||||
Algo parecido estoy haciendo amigo Carlos, pero no puedo trabajar con Filtros porq al traer todos los registros por internet se haria insorpotable la lentitud al abrir la pantalla de busqueda.
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
#12
|
||||
|
||||
A ver, apoyandome en la idea de GluGlu resolvi el problema, aqui esta el codigo para el que le interese, basicamente lo que hace es qe toma la ultima aparicion del WHERE y divide el string en dos, luego inserta el filtro y lo vuelve a unir. Pronto lo subire a mi subdominio para el que lo necesite
__________________
...Yo naci en esta ribera del arauca vibr@d0r Soy hermano de la espuma, de la garza, de la rosa y del sol... Viva Venezuela |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
consulta a un query en vez de a una tabla | eldiegofg | SQL | 10 | 19-09-2007 12:46:39 |
Tabla vacia que el motor de BD reporta llena | Phacko | Conexión con bases de datos | 1 | 28-02-2007 06:02:34 |
que es más rápido query o filtrar tabla? | Manuel | Varios | 27 | 29-10-2006 16:42:41 |
Cómo sincronizar Query y tabla | David | Conexión con bases de datos | 2 | 13-07-2006 11:18:50 |
Tabla externa en query | llonigualker | Conexión con bases de datos | 3 | 28-04-2006 12:14:22 |
|