Ir al contenido


Foto

Zeos chafa para Firebird


  • Por favor identifícate para responder
18 respuestas en este tema

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 07 abril 2011 - 04:04

Hola a todos y todas...


  :undecided: Ahora no vengo con una pregunta si no con una queja      ... Resulta que estoy utilizando Zeos + Firebird y trataba de ejecutar ésta sentencia:



SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE
NUM_COBO = "'151'" AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = "'151'")




Pues resulta que Zeos me manda un error de columna '151' desconocida, pero la sentencia es correctamente ejecutada si lo hacemos desde IBExpert o desde un IBQuery.


  :s  (li) y pues sólo quería comentarles esa "pequeñísima" curiosidad con la que me encontré...


Saludox ! :)
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 abril 2011 - 04:29

Hola
Y asi:
SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE
NUM_COBO = ''151'' AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = ''151'')

O mejor con parametros.
SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE
NUM_COBO = :com1  AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = :com2)

Uno de los problemas mas grandes que tuve con ib fue que sin parametros me costaba mucho que no me diera errores, usando parametros solucione todo.
Saludos
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 07 abril 2011 - 04:35

Pues me temo que así tendrá que ser amigo... dándole un poco la vuelta al problema  *-)


Saludox ! :)
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 08 abril 2011 - 01:55

Está claro que el problema está en el valor 151 que comparamos con NUM_COBO.

Lo que no entiendo es que lo delimites con doble comillas + comillas, no me sorprende que haga cosas extrañas (debes estar volviendo loco al parser de Zeos). Con unas comillas simples basta para delimitar el valor (es más, al ser un valor numérico no precisa de ningún tipo de delimitación, por lo que podría ir sin ningún tipo de comillas).

En cualquier caso, estoy de acuerdo con los compañeros en que siempre es más aconsejable usar una consulta con parámetros.

Saludos.
  • 0

#5 hecjona

hecjona

    Newbie

  • Miembros
  • Pip
  • 9 mensajes
  • LocationHermosillo, Sonora

Escrito 08 abril 2011 - 03:22

En el standard SQL cuando escribes algo entre dobles comillas ( "ALGO" ) ese algo es un objeto de la base de datos ej: tablas, campos, etc..y cuando te refieres a cadena de texto lo pones con comillas simples ('HOLA').

Select "ID", "NOMBRE" from "usuarios" where "Nombre"='Hector';

  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 11 abril 2011 - 08:09

Definitivamente sé que la loquera le da al momento de querer delimitarlo con comillas dobles y luego simples pero es mera necesidad amigos...


Los valores guardados en ese campo son de tipo String y están almacenados de esa manera: '151', '250', '1', etc...


Si yo envio en la sentencia algo así : WHERE NUM_COBO = '151' obviamente siempre me dice que ese valor no existe, ya que lo lee como 151, yo deseo que lo lea como '151'


Ahora mi referencia a que es un detalle interesante en Zeos es porque en otros componentes no presenta el problema, yo mando la consulta tal como la publiqué y obtengo los valores que deseo sin problemas...


Saludox ! :)


P.D. Se preguntarán porqué en la tabla están almacenados los valores de esa manera... y es una historia larga de contar  ^o| :D
  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 11 abril 2011 - 10:29

Para pasarle unas comillas dentro de un texto has de paserle las comillas dobles, es decir, dos comillas simples donde quieras una simple:


SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE
NUM_COBO = '''151''' AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = '''151''')


Nosotros en delphi usamos QuotedStr(Texto) para esto, esta funcion añade comillas al principio y final del texto y duplica las comillas simples que contenga el texto, con lo que en delphi se veria asi:



delphi
  1. //Valor contiene el texto que quieres pasarle
  2. //es decir '150' con las comillas parte del texto
  3. Query.Text:= 'SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE
  4. NUM_COBO = '+QuotedStr(Valor)+' AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = '+QuotedStr(Valor))';


  • 0

#8 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 13 abril 2011 - 10:01

Saludos Fena, y no pensaste usar la siguiente sentencia?



delphi
  1. sSQL := 'SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE NUM_COBO = '+QuoteStr('151')+' AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = '+QuoteStr('151')+ ')';




y pasarle la variable al SQL.Add(sSQL); de tu TZQuery

Saludos
  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 abril 2011 - 10:19

Saludos Fena, y no pensaste usar la siguiente sentencia?



delphi
  1. sSQL := 'SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE NUM_COBO = '+QuoteStr('151')+' AND FEC_EDO IN (SELECT MAX(FEC_EDO)FROM CBOO_COBBIT WHERE NUM_COBO = '+QuoteStr('151')+ ')';




y pasarle la variable al SQL.Add(sSQL); de tu TZQuery

Saludos



De hecho tuve que hacer por ahí algo interesante, porque el valor de 151 es variable... Hice ésto:


delphi
  1. sAux := QuotedStr(s); // s es una variable que contiene el valor pero sin comillas, para eso utilicé el QuotedStr
  2. sSQLx := 'SELECT CVE_CAPT, MOD_BIT FROM CBOO_COBBIT WHERE NUM_COBO ='''''+sAux+
  3.                 ''''' AND FEC_EDO IN (SELECT MAX(FEC_EDO) FROM CBOO_COBBIT WHERE NUM_COBO ='''''+sAux+''''')

 


Y de ésta manera pude pasarlo al TZQuery y lograr el resultado que necesitaba... En realidad tenía que buscar la manera de que resultara, mi punto en éste mensaje es que para IBExpert y para los IBQuery no resultó mayor problema como lo hice inicialmente, pero con el TZQuery se puso difícil...


Saludox !  :)


P.D. Ya pongo este hilo como resuelto (y)



  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 abril 2011 - 10:57

Hola.

Y de ésta manera pude pasarlo al TZQuery y lograr el resultado que necesitaba... En realidad tenía que buscar la manera de que resultara, mi punto en éste mensaje es que para IBExpert y para los IBQuery no resultó mayor problema como lo hice inicialmente, pero con el TZQuery se puso difícil...


Pero no es un problema propiamente del TZQuery. Es un problema de Delphi, ya que la comilla es el delimitador de cadena en Delphi, y tú quieres construir cadenas con comillas dentro. Por eso no tienes el problema en IB-Expert, y en cambio habrías tenido el mismo problema con cualquier componente de acceso que hubieses usado (IBX, FibPlus, dbExpress, ...).

Saludos.
  • 0

#11 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 abril 2011 - 11:09

Hola.


Y de ésta manera pude pasarlo al TZQuery y lograr el resultado que necesitaba... En realidad tenía que buscar la manera de que resultara, mi punto en éste mensaje es que para IBExpert y para los IBQuery no resultó mayor problema como lo hice inicialmente, pero con el TZQuery se puso difícil...


Pero no es un problema propiamente del TZQuery. Es un problema de Delphi, ya que la comilla es el delimitador de cadena en Delphi, y tú quieres construir cadenas con comillas dentro. Por eso no tienes el problema en IB-Expert, y en cambio habrías tenido el mismo problema con cualquier componente de acceso que hubieses usado (IBX, FibPlus, dbExpress, ...).

Saludos.


No amigo Marc, utilizando un IBQuery desde el mismo Delphi, no me causó tampoco ningún problema... hice otra prueba en un manejador de firebird que fue desarrollado aquí en la empresa (en Delphi claro) y tampoco tuve problemas para ejecutar la sentencia, sólo que no estoy segura de los componentes que fueron utilizados para la comunicación...

Insisito, Zeos me quedó mal esta vez :p

Saludox ! :)
  • 0

#12 casi

casi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 191 mensajes

Escrito 13 abril 2011 - 02:02

Pero no es un problema propiamente del TZQuery. Es un problema de Delphi, ya que la comilla es el delimitador de cadena en Delphi, y tú quieres construir cadenas con comillas dentro. Por eso no tienes el problema en IB-Expert, y en cambio habrías tenido el mismo problema con cualquier componente de acceso que hubieses usado (IBX, FibPlus, dbExpress, ...).Saludos.


Yo opino lo mismo que Marc, toda la vida ha sido así, con todos los componentes, eso es cosa de delphi, por eso es mejor usar el quotedstr(lavariablequesea) o hacerlo con parámetros y nos ahorramos de estar "construyendo" la sentencia sql.
También se puede hacer con las comillas, evidentemente, pero es más fácil equivocarse ''''hola'''+''''hasta luego'''; :)

  • 0

#13 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 abril 2011 - 02:26

De nuevo mi cuestionamiento... y porqué con IBQuery no tengo problemas desde Delphi en esa consulta en específico ? :


Todo lo que han dicho de que es mejor hacerlo de una u otra manera no lo discuto para nada, pero en este caso no existe un error como tal al momento de construir la sentencia, que es confusa, tal vez es cierto no lo niego, pero no hay un error como tal  ^o|


Saludox ! :)
  • 0

#14 casi

casi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 191 mensajes

Escrito 13 abril 2011 - 02:28

De nuevo mi cuestionamiento... y porqué con IBQuery no tengo problemas desde Delphi en esa consulta en específico ? :


uuummm... ¿Seguro de eso, amiga?

  • 0

#15 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 abril 2011 - 02:37


De nuevo mi cuestionamiento... y porqué con IBQuery no tengo problemas desde Delphi en esa consulta en específico ? :


uuummm... ¿Seguro de eso, amiga?


Si amigo Casi, hice pruebas porque me dio mucha curiosidad el error que causaba la sentencia, y más porque cargaba la misma sentencia construida tanto a los componentes desde Delphi como en el IBExpert, además te cuento que inclusive junto con Egostar hice otra prueba con un TCientDataSet construyendo la misma sentencia y bualá !, no tuvo el más mínimo problema...

: porqué no me creen ?

Saludox ! :)
  • 0

#16 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 abril 2011 - 02:47

Acabo de hacer una nueva prueba....
1. Sentencia Original publicada en Post # 1
2. TZConnection + TZquery + DataSource + DBGrid -> Error !
3. IBDatabase + IBTransaction + IBQuery + DataSource + DBGrid -> Visualizo los valores correctamente en DBGrid !


  ^o|


Saludox !  :)
  • 0

#17 casi

casi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 191 mensajes

Escrito 13 abril 2011 - 04:29

Pues sí que es extraño.
Yo no tengo zeos, a ver si saco tiempo y hago una pruebecita.

  • 0

#18 mightydragon_lord

mightydragon_lord

    Advanced Member

  • Miembros
  • PipPipPip
  • 73 mensajes

Escrito 02 mayo 2011 - 02:31

Extraño no es, Zeos falla con Firebird 2.5 xD, ya lo intenté y la verdad me saca varios errores, con el 2.1 funciona perfecto.
  • 0

#19 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 02 mayo 2011 - 03:32

Extraño no es, Zeos falla con Firebird 2.5 xD, ya lo intenté y la verdad me saca varios errores, con el 2.1 funciona perfecto.


Lo raro amigo es que yo uso Firebird 1.5 y es donde me genera los errores :(  :p

Saludox ! :)
  • 0




IP.Board spam blocked by CleanTalk.