Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con las comillas al conformar una consulta SQL (https://www.clubdelphi.com/foros/showthread.php?t=34700)

kman 18-08-2006 00:53:42

Problemas con las comillas al conformar una consulta SQL
 
Saludos Amigos!

Estoy intentando hacer una actulización de un registro en una tabla y me ha dado la lata:

Código Delphi [-]
procedure TFrLoad.FormCreate(Sender: TObject);
var timer: string;
begin
  edit1.text:= datetostr(now);
  timer:='"%'+edit1.Text+'%"';
With    Module.QrPasswords
Do Begin
Close;
SQL.clear;
SQL.add('SELECT * FROM PASSWORDS where Fecha_Inactiva like '+timer);
SQL.add('UPDATE PASSWORDS SET Status_Password = '0' where Status_Password = '1'');
Open;
end;
end;
end.
Pretendo hacer esto para cuando el programa cargue las claves de usuarios que se han vencido cambien de estado de activo a inactivo y el usuario tenga que cambiar su clave. Pero con '0' me da error de semicolon y si pongo "0" me da error de sintaxis: Falta operador.
La base de datos es de Access, no sé si soporta UPDATE, me gustaría usar Replace, pero leí que no lo soporta.

Agradeciendo sus ayudas de Antemano
Su Amigo Kman.

dec 18-08-2006 01:03:11

Hola,

Código Delphi [-]
SQL.add('UPDATE PASSWORDS SET Status_Password = ''0'' where Status_Password = ''1''');

Fíjate que cuando se quiere incluir en una cadena (que en Delphi se presentan entre comillas simples) el propio símbolo de las comillas simples, esto puede hacerse duplicando dicho símbolo, para que Delphi lo tome como tal y no como el "final de una cadena".

ContraVeneno 18-08-2006 01:06:34

Dependerá tambien de a que tipo de dato esta definido el campo status_password

kman 18-08-2006 01:22:36

Gracias por responder (y corregir el título :D).

Dec: Olvidé mencionarlo, ya había intentado hacerlo como me dices, pero aún me da el Syntax Error:(Missing Operator), Qué operador se requiere? Es solo introducción de caracteres, no es operación lo que hago.

ContraVeneno: Ahora que lo mencionas es de tipo numérico single, (hmm.Será ese mi problema?)

Se puede o no se puede usar REPLACE con ACCESS??

nemesio 18-08-2006 02:48:34

Si es numérico, entonces quita las comillas al cero y colocalo directamente:
Código SQL [-]
SQL.add('UPDATE PASSWORDS SET Status_Password = 0 where Status_Password = 1');
saludos

kman 18-08-2006 05:27:11

Cita:

Empezado por nemesio
Si es numérico, entonces quita las comillas al cero...
saludos

Lo mismo, Syntax Error:(Missing operator) Qué operador?

Lepe 18-08-2006 09:21:13

Yo nunca he visto que en una misma consulta se pueda introducir 2 sqls distintas, una de selección y otra de actualización sin estar anidadas.

Algo del tipo:
Código SQL [-]
  update .... where (select * from ...)
Si es correcto, pero tú estas metiendo 2 sqls totalmente independientes dentro de la misma consulta. La solución sería lanzar la consulta 1 vez con el SELECT y otra vez con el UPDATE cuando se necesite.

Saludos

kman 18-08-2006 15:04:03

Cita:

Empezado por Lepe
Yo nunca he visto que en una misma consulta se pueda introducir 2 sqls distintas...

Cita:

Empezado por Lepe
Si es correcto, pero tú estas metiendo 2 sqls totalmente independientes dentro de la misma consulta.

Saludos Lepe.
Me gustaría que me explicaras, o me mostraras un código(verás soy un poquito novato).
Pensaba que con el Select estaba realizando un tipo de filtro en base a la fecha y que apartir de ahí el update se realizaría, pensaba estar en lo correcto ya que el error de sintaxis apunta a una falta de operador no de otra cosa.

Lepe 18-08-2006 15:24:51

El error de "falta operador" lo puede dar simplemente porque falte el punto y coma final de la instrucción SELECT. Es decir, encuentra un error, muestra el mensaje y no sigue procesando el sql restante.... de ahí que el error que muestra no coincide con el error verdadero.

Ya que has explicado un poco más lo que quieres hacer, creo que la solución sería esta:
Código SQL [-]
UPDATE PASSWORDS SET Status_Password = 0 where Status_Password = 1 and Fecha_Inactiva like +timer

Ahora si estas restringiendo el update a la fecha y a la condición Status_Password. Lo que no me queda claro es usar comodines cuando el campo se llama Fecha. Si en el campo Fecha_inactiva guardas una fecha en formato Datetime, tendrás que acotar de otra forma la restricción, es decir:

Código Delphi [-]
quer1.sql.text := 'UPDATE PASSWORDS SET Status_Password = 0 where Status_Password = 1 and Fecha_Inactiva between :fecha1 and :fecha2'
query1.params.parambyname('fecha1').Value := strtodate(edit1);
query1.params.parambyname('fecha2').Value := strtodate(edit2);

Si el campo de fecha lo tienes declarado como Texto, no eches cuenta a lo de arriba :D.


Un SELECT siempre devuelve datos, en forma de filas y columnas y casi siempre necesitarás un Grid u otro control para ver los resultados.

Un UPDATE / DELETE / INSERT nunca devuelve un conjunto de datos, como mucho devuelve en su propiedad RowsAffected el número de registros afectados por la instrucción (en Access no puedo asegurar que esto último que sea cierto, no he trabajado con él).

Saludos

kman 18-08-2006 15:48:15

Interesante Explicación!
 
Gracias lepe!
Ya me quedó claro lo que debo hacer, gracias por la ayuda la pondré en práctica cuando llegue a casa(Estoy En El Trabajo Fuera De Delphi).
Solo espero que Access no me de problemas.:D

Gracias Mil!

kman 18-08-2006 23:34:28

Cita:

Empezado por kman
Solo espero que Access no me de problemas.:D

Al final si me dio problemas: "Current Provider does not support returning multiple recordsets from a single execution".
Cita:

Empezado por Lepe
...como mucho devuelve en su propiedad RowsAffected el número de registros afectados por la instrucción (en Access no puedo asegurar que esto último que sea cierto, no he trabajado con él).

Que suerte la mia! :mad:

Lepe 19-08-2006 10:58:03

Mirando por el foro he encontrado este hilo, donde dice que la palabra "password" access la tiene reservada, por lo que no puede usarse. En este caso era un campo que se llamaba "password", no sé si pasa lo mismo con el nombre de una tabla.

Antes de hacer modificaciones, expón el código aqui para echarle un vistazo. Al menos, la sql y el procedimiento donde lo usas.

Saludos

AzidRain 19-08-2006 16:25:37

Lo más sencillo para responder a tu pregunta original era utilizar comillas dobles en la consulta de SQL. SQL acepta tanto sencillas como dobles para cadenas.
de manera que
Código SQL [-]
SET USER_PASSWORD='1'
Y
Código SQL [-]
SET USER_PASSWORD="1"
son equivalentes

Así que en Delphi puedes poner:

Código Delphi [-]
  MyQuery.SQL.Add( 'UPDATE TABLA SET USER_PASSWORD="1" ');

Y no tienes problema

kman 19-08-2006 20:06:40

Cita:

Empezado por Lepe
...Antes de hacer modificaciones, expón el código aqui para echarle un vistazo. Al menos, la sql y el procedimiento donde lo usas.
Saludos

Lo voy a dejar como caso perdido, el cambiar el nombre de la tabla implicaría muchos cambios de códigos donde utilizo la tabla. De todas formas pude hacer algo no profesional pero hace el trabajo:Cuando el usuario introduce su ID y clave realizo una busqueda en la tabla y comparo las fecha de vencimiento que si es igual a la actual editar el campo Status_Password igual a cero y blah blah blah.

Pero si estoy agradecido de todas las ayudas en especial las de LEPE, fueron muy instructivas!


La franja horaria es GMT +2. Ahora son las 09:38:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi