Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   no puedo correr consulta (https://www.clubdelphi.com/foros/showthread.php?t=4029)

marcelofabiani 29-09-2003 18:08:42

no puedo correr consulta
 
Estoy tratando de hacer correr esta consulta

procedure Tfrmbusqueda.Button1Click(Sender: TObject);
var
busqueda:string;
begin
busqueda:='select * from :tabla where :campo like'''+ edit1.text+'%''';
dm.qybusqueda.Close;
dm.qybusqueda.SQL.Clear;
dm.qybusqueda.SQL.Add(busqueda);
dm.qybusqueda.Params[0].AsString:=combobox1.Text;
dm.qybusqueda.Params[1].AsString:=cb2.Text;
dm.qybusqueda.Open;
end;

Pero cuando la hago correr me sale un error en ingles de algo relacionado a un token podria alguien decirme que estoy haciendo mal

Esto es para realizar una busqueda en una base de datos mysql, lo que pienso es que el like lo estoy utilizando mal:mad:

Ojala alguien me guie por el camino correcto:)

delphi.com.ar 29-09-2003 18:16:05

No creo que puedas poner el nombre de la tabla como parámetro. Tienes que tener en cuenta que el parámetro es del tipo String y para el servidor de BD el nombre de la tabla no es un string, es un identificador y/o parte del código del Sql.
Cuando tengas un error y publiques un mensaje en el foro, por favor envíanos la descripción completa del error!

Saludos!

__cadetill 29-09-2003 19:04:35

Cita:

Posteado originalmente por delphi.com.ar
No creo que puedas poner el nombre de la tabla como parámetro. Tienes que tener en cuenta que el parámetro es del tipo String y para el servidor de BD el nombre de la tabla no es un string, es un identificador y/o parte del código del Sql.
Siento contradecirte amigo delphi.com.ar, pero lo que hace marcelofabiani lo encuentro correcto. La propiedad SQL de un TQuery (u otro componente de Querys) es de tipo TStrings, por lo que se le ha de pasar un string o conjunto de ellos (válido/s, claro está).
Yo me inclino más a pensar en que los parámetros que le está pasando no son correctos, es decir, un nombre de tabla que no existe o un nombre de campo que no pertenece a la tabla seleccionada o algo así.
En lo que sí estoy de acuerdo contigo es en que debería especificar el error que da (no le había contestado antes precisamente por eso)

Nos leemos

Onti 29-09-2003 21:19:56

Hola:

Como alternativa puedes generar la cadena de la consulta y luego realizar la consulta. es decir

LSql :='SELECT * FROM '+combobox1.Text;+ 'WHERE .....';

dm.qybusqueda.SQL.Clear;
dm.qybusqueda.SQL.Add(Lsql);
dm.qybusqueda.Open;



Salu2 a to2

mosorio 29-09-2003 22:59:37

Hola a todos!
Creo que el problema esta al crear la sentencia SQL y las comillas, por eso cuando hago una sentencia que va a ser fija mediante código la creo en una constante asignandole variables de %s y luego construyo la consulta.
Lo hago de la siguiente forma:
Cita:

procedure Tfrmbusqueda.Button1Click(Sender: TObject);
const
SQL = 'Select * From %s Where %s Like %s';

begin
dm.qybusqueda.Close;
dm.qybusqueda.SQL.Clear;
dm.qybusqueda.SQL.Add(Format(SQL, [Tabla, Campo, QuotedStr(Condicion+'%')]));
dm.qybusqueda.Open;
end;

Espero que con esto les sirva y continúen en el desarrollo

Saludos

marcelofabiani 30-09-2003 01:15:14

Pues gracias por las respuestas el error que me da es el siguiente:

---------------------------
Debugger Exception Notification
---------------------------
Project elsolar.exe raised exception class EDBEngineError with message 'Invalid use of keyword.
Token: ?
Line Number: 1'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Haber si con esto y las respuestas que tengo puedo solucionar el problema

marcelofabiani 30-09-2003 01:59:02

pues la respuesta de mosorio fue la que soluciono mi problema pero habia un detalle que cadetill me hizo notar y es que en el tquery no estaba especificado el dtabasename.

lo unico que me falto fue agregarle algunas lineas al codigo de mosorio aqui les mando como quedo finalmente

procedure Tfrmbusqueda.Button1Click(Sender: TObject);
const
SQL = 'Select * From %s Where %s Like %s';
var
tabla,campo,condicion:string;
begin
tabla:=combobox1.Text;
campo:=cb2.Text;
condicion:=edit1.Text;
dm.qybusqueda.Close;
dm.qybusqueda.SQL.Clear;
dm.qybusqueda.SQL.Add(Format(SQL, [tabla, campo, QuotedStr(Condicion+'%')]));
dm.qybusqueda.Open;
end;

Una pregunta mas esto lo muestro en un form2 que es llamado desde form1, como deberia hacer para elegir uno de los datos y mandar todos eso datos al form1.
:D :D

__cadetill 30-09-2003 09:48:01

Si sólo quieres enviar un campo de todos los que se muestran, yo crearí en Form2 una variable publica de tipo Variant (porque puede devolver Integers, Floats, Strings o lo que quieras) y asignarle el valor a ésta en un dlble clic o Enter o algo así.
Antes de liberar el Form2 desde Form1, acceder al valor de la variable y ya lo tienes.

Si fueran varios valores a devolver, utilizaría un array dinámico de variants con el mismo procedimiento

mosorio 30-09-2003 11:15:50

Hola marcelofabiani!
No era necesario crar las variables, ya que puedes utilizar los mismos objetos en los que yo había definido como parámetros, asi te ahorras memoria definiendo las variables e implementas o asignas los valores directamente de los objetos, de todas formas no esta mal lo que has hecho, la programación es muy diversa y se hace de mil maneras, solo que estoy aprendiendo o he aprendido a ver estos detallitos que aunque no molesta con el espacio de las variables algunos piensan que es bueno ahorrar memoria ya que cuesta en el momento de utilizar la aplicación desarrollada con otras en la misma máquina.

Con respcto a lo que dice cadetill me parece bien, pero si tienes declarada la qry en el DM y este esta en los diferentes módulos definidos, puedes también acceder a la misma una vez se haya ejecutado obteniendo los valores de esta.


Saludos

marcelofabiani 30-09-2003 22:22:02

Dos cuestiones:


Cita:

No era necesario crar las variables, ya que puedes utilizar los mismos objetos en los que yo había definido como parámetros, asi te ahorras memoria definiendo las variables e implementas o asignas los valores directamente de los objetos
Al no declarar las variables me salia un error por eso es que las declare


Cita:

Antes de liberar el Form2 desde Form1, acceder al valor de la variable y ya lo tienes.
Yo estoy trabajando o la busqueda la hago en form2, como accedo y libero la form con algo como form2.close?


La franja horaria es GMT +2. Ahora son las 22:29:35.

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