Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problemas con Select (https://www.clubdelphi.com/foros/showthread.php?t=42714)

karlaoax 20-04-2007 16:30:21

Problemas con Select
 
Hola estoy empezando a trabajar con el componente MyDac para delphi - MySql. y tengo un problema al momento de hacer consultas. Tengo una base llamada Articulo con los campos: Codigo,Stock,StockMinimo.

Los componentes q utilizo en delphi 7:
1 Myconection
1 Datasource
1 Mytable
1 Myquery
1 Edit (llamado txtcodigo)
2 DBEdits

Todos enlazados como corresponde.

El codigo que tengo eb MyQuery:
SELECT codigo,stock,stockminimo
FROM articulo
WHERE codigo=:codigo // Lo paso como parametro

En mi boton:
MyQuery.close;
MyQuery.Sql.Add('SELECT codigo,stock,stockminimo');
MyQuery.Sql.Add('FROM articulo');
MyQuery.Sql.Add('WHERE codigo='+txtcodigo);
MyQuery.Sql.Open;
MyQuery.Execute;

Pero me manda este mensaje de Error:
Project1.exe raised exception class en myerror with the message 'You have an error in your Sql Sintax; check the manual that corresponds to your MySql server version for the right syntax to use near 'Select codigo,stock,stockminimo From articulo where codigo=3" at line 4

Cuando escribo en txtcodigo un valor ejemplo 3, si lo pasa, pero despues manda el mensaje de arriba, Ya probe la sintaxis en mysql y si la ejecuta, con el componente MyQuery, tambien funciona lo he probado con ejecutar.

Pero no se si mi codigo de mi boton tenga un error. Si alguien tiene una suregencia se lo agradecere.

P.D En mi Base de Datos tengo declartado como Integer Codigo, de todas formas, ya lo he convertido en delphi de inttostr y no funciona.

Atte. Karla :confused:

basti 20-04-2007 18:29:21

Lo que no entiendo es si tienes definida la consulta con el parámetro :codigo, porque vuelves a crearla.

Prueba así, quizás te solucione el problema:

Código Delphi [-]
MyQuery.Close;
MyQuery.ParamByName('codigo').DataType := ftInteger;
MyQuery.ParamByName('codigo').AsInteger := StrToInt(txtcodigo.text);
MyQuery.Open;

No conozco los componentes MyDac, pero supongo que MyQuery.Execute sobra, ya que se suele utilizar para consultas que no devuelven ningún resultado (tipo INSERT, DELETE...).

Caral 20-04-2007 18:41:35

Hola
Para mi:
Codigo es integer y lo llamas deste un edit que es string:
Prueba esto:
Código Delphi [-]
MyQuery.close;
MyQuery.Sql.Text:= 'SELECT codigo,stock,stockminimo'+
                   'FROM articulo'+
                   'WHERE codigo='+IntToStr(txtcodigo.Text);
MyQuery.Sql.Open;
MyQuery.Execute; // esto no lo veo necesario
Para mi si te da error de sintaxis es porque busca txtcodigo como un texto y el campo es numerico por eso al poner el numero 3 en vez de este, te funciona.
Saludos

Lepe 20-04-2007 19:15:04

Resumiendo:
El codigo que tengo eb MyQuery:
Código SQL [-]
SELECT codigo,stock,stockminimo
FROM articulo
WHERE codigo=:codigo // Lo paso como parametro
En mi boton:
Código Delphi [-]
MyQuery.Close;
if not MyQuery.Prepared then MyQuery.Prepare;
MyQuery.ParamByName('codigo').DataType := ftInteger;
MyQuery.ParamByName('codigo').AsInteger := StrToInt(txtcodigo.text);
MyQuery.Open;

Saludos

roman 20-04-2007 19:36:20

De hecho, si se usa AsTipodeDatos, no es necesario especificar el tipo de datos:

Código Delphi [-]
procedure TParam.SetAsInteger(Value: Longint);
begin
  FDataType := ftInteger;
  Self.Value := Value;
end;

// Saludos

basti 20-04-2007 21:02:35

Cita:

Empezado por roman
De hecho, si se usa AsTipodeDatos, no es necesario especificar el tipo de datos:

Código Delphi [-]procedure TParam.SetAsInteger(Value: Longint); begin FDataType := ftInteger; Self.Value := Value; end;


// Saludos

Interesante Román, y yo tecleando siempre...
Apuntado para la próxima.

karlaoax 24-04-2007 21:13:24

De todas formas he tratado de varias formas y:
1.- No me sale el erro mencionado, pero no me muestra los datos que le corresponden a la clave del producto, y ya cheque que los DBedit's estuvieran bien

2.- sigue saliendo el error

Mi codigo esta probado con Interbase y qsi sale....

Sera un error del componente MyDac?

roman 24-04-2007 21:26:09

¿Cuál es el tipo de datos del campo codigo?

Por otra parte, si donde esté la componente MyQuery incluyes la unidad MyDacVCL, puedes poner la propiedad Debug de MyQuery en true para que te muestre las consultas que va a mandar al servidor. Así te darás cuenta exacta de la consulta que se está mandando.

// Saludos

karlaoax 24-04-2007 21:35:03

listo, mira siempre que ejecuto mi codigo:

En MYQUERY:
SELECT codigo,stock,stockminimo
FROM productos
WHERE codigo=codigo // Pasado como parametro

En un _Boton
MyQuery1.close;
MyQuery1.SQL.text:='SELECT *FROM productos WHERE codigo="'+txtcodigo.text+'"';
MyQuery1.Open;

Donde txtcodigo es el parametro q le pase de mi consulta, hasta aqui todo bien. Pero cuando pongo un valor cualquiera en txtcodigo de mi formulario, siempre me muestra el registro 1 de mi tabla, y no el que realmente deber de corresponderle al valor escrito. Ya cheque que todo este bien, y no hay problema, ya cambie en mi tabla de Integer a Varchar el campo codigo, y el resultado sigue siendo el mismo.

Creo que el componente tiene fallas, pues ya lo cheque con Interbase y ahi si que funciona. Estoy empezando a utilizar MyDac y ando un poco perdida

Caral 24-04-2007 21:37:17

Hola
Que tal asi:
Código Delphi [-]
MyQuery.close;
MyQuery.Sql.Text:= 'SELECT codigo,stock,stockminimo'+
                   'FROM articulo'+
                   'WHERE codigo='+IntToStr(txtcodigo.Text);
MyQuery.Sql.Open;
Showmessage(MYQuery.SQL.Text);
Con esto veo que datos me envio la sentencia sql.
Correcto Roman?
Saludos

karlaoax 24-04-2007 21:44:16

Revisado, si pasa mi parametro recibido en mi txtcodigo.
Pero sigue sin mostrarme la informacion que le corresponde a stock y stockminimo.

mis dbedits apuntan a: DATASOURCE1
y el Datasorce su propiedad DATASET: MyTable1

No entiendo que parte de mi codigo esta fallando, si realmente recibe el parametro que le paso, por que no muestra la informacion que le corresponde a mi txtcodigo en sus dbedits correspondientes.

Mi campo CODIGO en mysql es Varchar.

Karla

roman 24-04-2007 21:48:20

Cita:

Empezado por karlaoax
el Datasorce su propiedad DATASET: MyTable1

:confused: ¿Qué no debería apuntar a MyQuery?

// Saludos

Caral 24-04-2007 21:56:00

Hola
Claro Roman, el problema esta en esto:
Cita:

1 Mytable
1 Myquery
Para mi los dbedit estan apuntando a MyTable y no a MyQuery.
Tienes razon
Ademas, para que los dos?
Saludos

karlaoax 24-04-2007 21:57:31

Listisimo
 
Muchas garcias Roman, problema resuelto :P

Codigo funcionando al 100%

karlaoax 24-04-2007 21:59:02

Gracias Caral

Ya esta

roman 24-04-2007 22:06:54

Cita:

Empezado por Caral
Hola
Que tal asi:
Código Delphi [-]
MyQuery.close;
MyQuery.Sql.Text:= 'SELECT codigo,stock,stockminimo'+
                   'FROM articulo'+
                   'WHERE codigo='+IntToStr(txtcodigo.Text);
MyQuery.Sql.Open;
Showmessage(MYQuery.SQL.Text);
Con esto veo que datos me envio la sentencia sql.
Correcto Roman?
Saludos

En cuanto a esto: MyDac tiene la facilidad de depurar las sentencias SQL que se mandan sin tener que recurrir a poner ShowMessages aquí y allá :)

Para ello debe agregarse la unidad MyDacVCL en la cláusula uses y poner en true la propiedad Debug de la componente que se desee depurar. Esto- además de la facilidad - tiene la ventaja de que puede verse no sólo el texto de la consulta sino los valores de los parámetros. Por ejemplo, la consulta que aquí nos ocupó, podría (¿debería?) usarse con parámetros:

Código SQL [-]
SELECT *FROM productos WHERE codigo=:codigo

y se sustituye el valor al mandar la consulta:

Código Delphi [-]
MyQuery1.ParamByName('codigo).AsString := txtcodigo.Text;
MyQuery1.Open;

El problema de hacerlo así es que dificulta saber exactamente qué se pasa al servidor, porque MyQuery.SQL.Text contiene el texto antes de sustituir los parámetros. El depurador te mostrará cuáles son esos parámetros.

Cuando lanzas la consulta, MyDac automáticamente te presenta una ventana con estos datos.

// Saludos

karlaoax 24-04-2007 22:09:49

Gracias
 
Buen tip que aplicare con este nuevo componente que se me hace muy interesante :P MyDac & MySQL :cool:

Caral 24-04-2007 22:19:46

Hola
Muy interesante Roman, lo tendre en cuenta si algun dia uso mydac, por ahora con my escaso ado, necesito el mensaje.:D , que envidia.:D
Saludos

Lepe 25-04-2007 01:24:46

El problema de parámetros, tampoco es grabe, en lugar de llamar a ShowMessage, llamamos a nuestra rutina:

Código Delphi [-]
procedure VerSentenciaSql(dt:TMDOQuery);
var i:Integer;
    Sql:string;
    ReplaceTo:string;
begin
  sql := dt.SQL.Text;
  for i := 0 to dt.params.count - 1 do
  with dt.Params[i] do
  begin
    case datatype  of
      ftDate : ReplaceTo := FormatDateTime('dd/mm/yyyy',AsDAte);
      ftDatetime: ReplaceTo := FormatDateTime('dd/mm/yyyy hh:nn:ss', AsDAtetime);
      ftTime : ReplaceTo := FormatDateTime('hh:nn:ss', Astime);
    else
      ReplaceTo := AsString;
    end;
    sql := ReplaceText(sql, ':'+Name,  ReplaceTo);

  end;
  ShowMessage(dt.sql.text);
end;

No incluirá las comillas simples, pero como ya sabemos, eso no es problema cuando se usa parámetros.

Saludos


La franja horaria es GMT +2. Ahora son las 08:11:01.

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