Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-08-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Mostrar consulta SQL con parámetros

Buen día a todos y gracias por tomarse el tiempo para leer mi pregunta.

Antes de hacer la pregunta busqué pero no encontré cómo poder ver mi consulta SQL con parámetros.

Tengo esta consulta en código delphi:
Código Delphi [-]
Query.Close;
Query.Clear;
Query,SQL.Add(' INSERT INTO ventas (folio, fecha, clave, producto) ');
Query.SQL.Add(' VALUES (:folio, :fecha, :clave, roducto) ');
Query.ParamByName('folio').AsInteger      := '1'; 
Query.ParamByName('fecha').AsString      := '2021-08-31';
Query.ParamByName('clave').AsString      := 'AB001';
Query.ParamByName('producto').AsString := 'Azúcar';
Query.Prepared := true;
Query.ExecSQL;
Si hago un:
Código Delphi [-]
ShowMessage(Query.SQL.text);
Me muestra la consulta de la siguiente manera:
Código SQL [-]
INSERT INTO ventas (folio, fecha, clave, producto) VALUES (:folio, :fecha, :clave, roducto)
Y yo quisiera ver la consulta así:
Código SQL [-]
INSERT INTO ventas (folio, fecha, clave, producto) VALUES (1, '2021-08-31', 'AB001', 'Azúcar')
Cómo puedo lograr esto ?

Última edición por Casimiro Notevi fecha: 31-08-2021 a las 10:22:18.
Responder Con Cita
  #2  
Antiguo 31-08-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ethangio Ver Mensaje
Cómo puedo lograr esto ?
No usando parámetros.
Pero es mejor usar parámetros.
Depende de la base de datos que estés usando, puedes ver las sentencias que ejecuta la misma.
Responder Con Cita
  #3  
Antiguo 31-08-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Siempre puedes construir tú mismo un procedimiento que haga eso.
Responder Con Cita
  #4  
Antiguo 31-08-2021
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Cita:
Empezado por ethangio Ver Mensaje
Buen día a todos y gracias por tomarse el tiempo para leer mi pregunta.
Código Delphi [-]Query.Close; Query.Clear; Query,SQL.Add(' INSERT INTO ventas (folio, fecha, clave, producto) '); Query.SQL.Add(' VALUES (:folio, :fecha, :clave, roducto) '); Query.ParamByName('folio').AsInteger := '1'; <---- Aqui tengo la duda Query.ParamByName('fecha').AsString := '2021-08-31'; Query.ParamByName('clave').AsString := 'AB001'; Query.ParamByName('producto').AsString := 'Azúcar'; Query.Prepared := true; Query.ExecSQL;
Hola


Solo una observacion. Si haces Query.ParamByName('folio').AsInteger ¿Porque envias el valor entrecomillado? ¿No te da error ahi?
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #5  
Antiguo 31-08-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No usando parámetros.
Pero es mejor usar parámetros.
Depende de la base de datos que estés usando, puedes ver las sentencias que ejecuta la misma.
Me confunde tu respuesta ...

Entiendo que no es posible entonces. Estoy usando ZeosLib y MySQL.

Gracias por responder. Saludos.
Responder Con Cita
  #6  
Antiguo 31-08-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Cita:
Empezado por kuan-yiu Ver Mensaje
Siempre puedes construir tú mismo un procedimiento que haga eso.
Pensé en hacerlo pero no quería reinventar la rueda , pensé que algo ya había para ver la consulta SQL.

Enviaré los parámetros como argumentos a una función se me ocurre.

Les comento que esto que quiero hacer es para guardar en una tabla la consulta ejecutada.
Responder Con Cita
  #7  
Antiguo 31-08-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Cita:
Empezado por Caminante Ver Mensaje
Hola


Solo una observacion. Si haces Query.ParamByName('folio').AsInteger ¿Porque envias el valor entrecomillado? ¿No te da error ahi?
Si tienes razón causa error, una disculpa hice el ejemplo al momento de formular mi pregunta.

Solo era para ejemplificar . Saludos.
Responder Con Cita
  #8  
Antiguo 31-08-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ethangio Ver Mensaje
Me confunde tu respuesta ...
Entiendo que no es posible entonces. Estoy usando ZeosLib y MySQL.
Lo que quiero decir es que algunas BD lo permiten y otras no, desconozco si con MySql se puede.

Cita:
Empezado por ethangio Ver Mensaje
Les comento que esto que quiero hacer es para guardar en una tabla la consulta ejecutada.
Precisamente, con Firebird puedes hacerlo, todas las sentencias sql puedes ir viéndolas, guárdandolas en una tabla o como quieras.
Responder Con Cita
  #9  
Antiguo 31-08-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Sigo investigando y encontré que en MySQL si cambiamos los valores de las variables log_output y general_log las consultas realizadas podemos verlas en la base de datos mysql en la tabla general_log.

Estos son los pasos:

Código SQL [-]
SET GLOBAL log_output = 'TABLE';
SET GLOBAL general_log = 'ON';

Se me ocurre que cuando haga una consulta SQL inmediatamente vaya a esa base de datos y de esa tabla tome la ultima consulta ejecutada para guardarla en mi base de datos y en mi tabla.

Las preguntas que me surgen son:

Está bien hacer eso ?
Es seguro ?
Es una buena manera de hacer las cosas o debería hacer mi propia función o procedimiento ?
Que problemas futuros puedo encontrarme ?
Responder Con Cita
  #10  
Antiguo 01-09-2021
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por ethangio Ver Mensaje
Código Delphi [-]
Query,SQL.Add(' INSERT INTO ventas (folio, fecha, clave, producto) ');
Query.SQL.Add(' VALUES (:folio, :fecha, :clave, roducto) ');
Query.ParamByName('folio').AsInteger      := '1'; 
Query.ParamByName('fecha').AsString      := '2021-08-31';
Query.ParamByName('clave').AsString      := 'AB001';
Query.ParamByName('producto').AsString := 'Azúcar';
Si hago un:
Código Delphi [-]
ShowMessage(Query.SQL.text);
Ahi mismo en tu ejemplo esta la solucion. Recorre los params del objeto y los imprimes "debajo" del sql o haces una substitucion. Un tip si quieres hacer reemplazo: Ordena los nombres de mayor a menos y reemplazas, no lo hagas directo, asi no te saldran problemas si un param es menor a otro (como "var" y "variable")
__________________
El malabarista.
Responder Con Cita
  #11  
Antiguo 01-09-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Ahi mismo en tu ejemplo esta la solucion. Recorre los params del objeto y los imprimes "debajo" del sql o haces una substitucion. Un tip si quieres hacer reemplazo: Ordena los nombres de mayor a menos y reemplazas, no lo hagas directo, asi no te saldran problemas si un param es menor a otro (como "var" y "variable")
Agradezco mucho tu respuesta. No sé hacerlo pero lo voy a investigar y hacerlo hasta que lo logre.

Saludos y de nuevo gracias.
Responder Con Cita
  #12  
Antiguo 01-09-2021
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
Como ya te han recomendado es posible que la mejor opción para tí sea utilizar el propio log de Mysql que como leo estas investigando, o hacerte una función que recorra los parámetros de la query y los sustituya por el valor.


De todas formas basándome en tu ejemplo, algo rápido para salir del paso y desde luego nada reutilizable puede ser algo de este estilo:


Código Delphi [-]
Query.Close;
Query.Clear;
strInsert := ' INSERT INTO ventas (folio, fecha, clave, producto) ';
strValuesAUtilizar := ' VALUES (:folio, :fecha, :clave, roducto) ';

Query,SQL.Add(strInsert);
Query.SQL.Add(strValuesAUtilizar);
Query.ParamByName('folio').AsInteger      := 1; 
Query.ParamByName('fecha').AsString      := '2021-08-31';
Query.ParamByName('clave').AsString      := 'AB001';
Query.ParamByName('producto').AsString := 'Azúcar';
Query.Prepared := true;
                                                          
strValuesParaLog := format(' VALUES (%d, %s, %s, %s) ',  [Query.params[0].asInteger,
                                                          quotedstr(Query.params[1].asstring),
                                                          quotedstr(Query.params[2].asstring),
                                                          quotedstr(Query.params[3].asstring)]);                                                          
Query.ExecSQL;                                                            
showmessage(strInsert + #13 +strValuesParaLog);
Responder Con Cita
  #13  
Antiguo 01-09-2021
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Yo tengo esta (no es mía sino de un compañero):
Código Delphi [-]
   if query.sql.Text <> '' then
   begin
      consulta := stringReplace(query.sql.Text, #13#10, ' ', [rfreplaceall]);

      for i:= 0 to query.ParamCount-1 do
      begin
         try
            if query.Params[i].DataType = ftString then
                  consulta := stringReplace(sSql, ':'+ query.Params[i].Name, QuotedStr(query.Params[i].AsString), [rfreplaceall, rfIgnoreCase])
            else if query.Params[i].DataType = ftDateTime then
                  consulta := stringReplace(sSql, ':'+ query.Params[i].Name, QuotedStr(FormatDateTime('yyyy/mm/dd', query.Params[i].AsDateTime)), [rfreplaceall, rfIgnoreCase])
            else  consulta := stringReplace(sSql, ':'+ query.Params[i].Name, query.Params[i].AsString, [rfreplaceall, rfIgnoreCase]);
         except
            // Lo que quieras hacer si falla
         end;
      end;

      // Devuelves 'consulta' o lo grabas o lo que necesites
   end;
Responder Con Cita
  #14  
Antiguo 01-09-2021
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Otra opción es usar el monitor que tienen los componentes. En el caso de ZeosLib (no he usado esta suite) creo que el monitor es el TZSQLMonitor
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #15  
Antiguo 01-09-2021
Avatar de ethangio
ethangio ethangio is offline
Miembro
 
Registrado: jul 2008
Posts: 63
Poder: 16
ethangio Va por buen camino
Cita:
Empezado por kuan-yiu Ver Mensaje
Yo tengo esta (no es mía sino de un compañero):
Cita:
Empezado por engranaje Ver Mensaje
Como ya te han recomendado es posible que la mejor opción para tí sea utilizar el propio log de Mysql que como leo estas investigando, o hacerte una función que recorra los parámetros de la query y los sustituya por el valor.
Muchas gracias a ambos, con ayuda de los 2 pude hacer mi procedimiento:
Código Delphi [-]
procedure GuardaConsulta(Query: TZQuery; Conexion: TZConnection);
var
  QInsert          : TZQuery;
  FechaHora      : TDateTime;
  ConsultaSQL,
  VarTmp          : String;
  i                    : Integer;
begin
  // Cadena de consulta SQL
  ConsultaSQL := Query.SQL.Text;

  // Remplazamos los parámetros por sus valores
  for i := 0 to Query.Params.Count-1 do
  begin
    // Creamos el nombre del parámetro para remplazarlo
    VarTmp := ':'+Query.Params.Items[i].Name;
    if query.Params[i].DataType = ftString then
      ConsultaSQL := StringReplace(ConsultaSQL, VarTmp, QuotedStr(Query.Params.Items[i].Value), [rfIgnoreCase])
    else if query.Params[i].DataType = ftInteger then
      ConsultaSQL := StringReplace(ConsultaSQL, VarTmp, Query.Params.Items[i].Value, [rfIgnoreCase])
    else
      ConsultaSQL := StringReplace(ConsultaSQL, VarTmp, QuotedStr(Query.Params.Items[i].Value), [rfIgnoreCase]);
  end;

  // Insert del query
  QInsert := TZQuery.Create(nil);
  try
    //
    FechaHora := now();
    QInsert.Connection := Conexion;
    ReadySQL(QInsert);
    QInsert.SQL.Add(' INSERT INTO consultas_sql (query, fechahora) ');
    QInsert.SQL.Add(' VALUES('+ QuotedStr(ConsultaSQL) + QuotedStr(FormatDateTime('yyyy-mm-dd hh:nn:ss', FechaHora)) +')');
    QInsert.ExecSQL;
  finally
    //
    QInsert.Free;
  end;

end;

Muchas gracias movorack por el tip y a todos por sus respuestas. Saludos desde Puebla, México

Última edición por ethangio fecha: 01-09-2021 a las 21:43:48.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta con sql, parametros liito16 SQL 6 30-08-2010 18:01:11
Consulta con parametros betiitooo SQL 3 16-06-2008 22:12:50
Parametros en consulta SQL csja SQL 8 23-03-2008 23:37:34
Parametros integer en consulta php jgutti PHP 2 14-06-2006 21:16:20
Parametros en Consulta SQL joi Varios 2 31-10-2005 19:36:49


La franja horaria es GMT +2. Ahora son las 12:05:18.


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
Copyright 1996-2007 Club Delphi