Ir al contenido


Foto

Benditos Apostrofes ' Delphi XE


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

#1 ovivasar

ovivasar

    Newbie

  • Miembros
  • Pip
  • 3 mensajes

Escrito 26 marzo 2012 - 03:45

Hola gente
una consulta sobre los apostrofes, toda la tarde probe la forma enviar en un String un apostrofe
especificamente para un script SQL de consulta a una Base de Datos, y no me permite obtener una cadena correcta:



delphi
  1. function Lista_Empresas_Autorizadas(strLogin: String): TClientDataSet;
  2.   var
  3.   strSQL: String;
  4.   fecha: TDate;
  5. begin
  6.   fecha:= date();
  7.   strSQL:='SELECT ';
  8.   strSQL:=strSQL+' mad_empleado.codigo_empresa as codigo,';
  9.   strSQL:=strSQL+' mad_empresa.razon_social as descripcion';
  10.   strSQL:=strSQL+' FROM mad_empresa INNER JOIN mad_empleado';
  11.   strSQL:=strSQL+' ON (mad_empleado.codigo_empresa = mad_empresa.codigo_empresa)';
  12.   strSQL:=concat(strSQL,' WHERE mad_empleado.login = ', #39, strLogin,#39);
  13. //  strSQL:=concat(strSQL,' WHERE mad_empleado.login = ', QuotedStr(strLogin));
  14.   strSQL:=strSQL+' ORDER BY mad_empresa.razon_social';
  15.  
  16.   result:=Consulta(strSQL);
  17. end;


Despues de probar 'n' sintaxis de concatenacion y ejecutar esta funcion la cadenita strSQL queda asi, Fíjense en la línea con comentario:

SELECT  mad_empleado.codigo_empresa as codigo, mad_empresa.razon_social as descripcion
FROM mad_empresa INNER JOIN mad_empleado
ON (mad_empleado.codigo_empresa = mad_empresa.codigo_empresa)
WHERE mad_empleado.login = ''Administrador''    //ME MANDA 2 APOSTROFES
ORDER BY mad_empresa.razon_social


Si le quito el #39 ó la funcion QuotedStr La linea en cuestión, me la manda así:

WHERE mad_empleado.login = Administrador 
   

0 apostrofes, 


En cualquiera de los dos casos, la base de datos no reconoce una cadena con una cantidad par de apostrofes. Lo correcto es que se reciba así:

WHERE mad_empleado.login = 'Administrador'   
 

1 apostrofe, pero desde Delphi no llega.
Esto debería llegar, pero probando con más apostrofes, siempre Delphi exige una cantidad impar, pero su contenido fuera de Delphi es con una cantidad par,

En varios foros resuelven el problema pero de versiones 2006, ¿alguna solución para esta versión por favor?

Hago una aclaración: estoy utilizando la modalidad de envío de cadenas SQL directamente a la base de datos, pues es más directo, más ligero. Sólo armo la cadena de de inserción o modificación o lo que sea y nada más; siempre trabajé así, soy nuevo en Delphi y me estoy encontrando con algunas cosillas que en teoría funcionan, pero en la práctica no se como hacerlas todavía.

Muchas gracias de antemano por el apoyo.

  • 0

#2 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 26 marzo 2012 - 03:59

Puedes pasar estos datos como parámetros o bien más fácil para tu caso, usa la función QuotedStr:

http://delphi.about....tlQuotedStr.htm

Saludos
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 26 marzo 2012 - 04:27

O intenta así:



delphi
  1. strSQL:=concat(strSQL,' WHERE mad_empleado.login = '''+strLogin+'''');



Saludox ! :)

  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 26 marzo 2012 - 06:54

ovivasar ¡no nos grites!  :@
He editado tu mensaje para borrar esas mayúsculas tan molestas.
Respeta nuestras normas por favor.

Saludos,
  • 0

#5 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 26 marzo 2012 - 08:04

Hola
Yo usaria el concepto de Fena con algunas modificaciones:


delphi
  1. function Lista_Empresas_Autorizadas(strLogin: String): TClientDataSet;
  2.   var
  3.   strSQL: String;
  4.   fecha: TDate;
  5. begin
  6.   fecha:= date();
  7.   strSQL:= 'SELECT '+
  8.           ' mad_empleado.codigo_empresa as codigo, '+
  9.           ' mad_empresa.razon_social as descripcion  '+
  10.           ' FROM mad_empresa INNER JOIN mad_empleado '+
  11.           ' ON (mad_empleado.codigo_empresa = mad_empresa.codigo_empresa) '+
  12.           ' WHERE mad_empleado.login = '''+strLogin+''''+
  13.           ' ORDER BY mad_empresa.razon_social ';
  14.   result:=Consulta(strSQL);
  15. end;


Saludos
  • 0

#6 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 27 marzo 2012 - 01:01

Has probado con  CHR(39)
  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 marzo 2012 - 01:19

Buenas,

Yo quitaría la variable fecha, dado que no se usa para nada, y así te ahorras un Hint molesto xD

Bromas a parte, la función QuotedStr debería de funcionarte. Si bien es cierto que si debugueas parece que te está devolviendo dos comillas simples, realmente no es así (al menos en XE2 update 3)

Nos leemos

  • 0

#8 ovivasar

ovivasar

    Newbie

  • Miembros
  • Pip
  • 3 mensajes

Escrito 27 marzo 2012 - 08:32

Muchas gracias
definitivamente en delphi los apostrofes se miran con par, pero por fuera son impares
gracias
problema resulto

mil disculpas
novato en crecimiento xD
  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 27 marzo 2012 - 08:45

Muchas gracias
definitivamente en delphi los apostrofes se miran con par, pero por fuera son impares
gracias
problema resulto

mil disculpas
novato en crecimiento xD


Qué bueno que lo has resuelto amigo (y)... esperamos seguir viéndote por aquí :)

Saludox ! :)
  • 0

#10 Sergio

Sergio

    Advanced Member

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

Escrito 27 marzo 2012 - 01:01

Es algo que ocurre en todos los lenguajes cuando quieres poner dentro de un texto el propio caracter que se usa para delimitar los textos, en delphi es el apóstrofe ' pero en otros es la " o en HTML sería el < o el >,  y siempre se termina teniendo que "marcar" ese caracter de alguna forma, bien poniéndolo doble, o bien poniéndole delante algún caracter especial... pero si usas un caracter especial, vuelves a tener el problema de tener que usar ese caracter en el texto.... y la historia suele terminar teniendo que poner repetido ese "último" caracter especial.

Si te acostumbras a escribir el ´doble dentro de los textos, la ventaja es que si te falta o te sobra uno, lo ves en el editor porque los textos cambian de color al pasar de estar dentro de una cadena a estar fuera. Aunque yo siempre uso QuotedStr() para variables y dobles ´para literales, como en tu ejemplo pero me funciona sin problemas.
  • 0




IP.Board spam blocked by CleanTalk.