Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Unhappy 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
Responder Con Cita
  #2  
Antiguo 20-04-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
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...).
Responder Con Cita
  #3  
Antiguo 20-04-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 20-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 20-04-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 20-04-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 24-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
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?
Responder Con Cita
  #8  
Antiguo 24-04-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita
  #9  
Antiguo 24-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 24-04-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 24-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Thumbs down

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
Responder Con Cita
  #12  
Antiguo 24-04-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por karlaoax
el Datasorce su propiedad DATASET: MyTable1
¿Qué no debería apuntar a MyQuery?

// Saludos
Responder Con Cita
  #13  
Antiguo 24-04-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 24-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Talking Listisimo

Muchas garcias Roman, problema resuelto :P

Codigo funcionando al 100%
Responder Con Cita
  #15  
Antiguo 24-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Talking

Gracias Caral

Ya esta
Responder Con Cita
  #16  
Antiguo 24-04-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #17  
Antiguo 24-04-2007
Avatar de karlaoax
karlaoax karlaoax is offline
Miembro
 
Registrado: oct 2003
Ubicación: Monterrey
Posts: 280
Poder: 21
karlaoax Va por buen camino
Gracias

Buen tip que aplicare con este nuevo componente que se me hace muy interesante :P MyDac & MySQL
Responder Con Cita
  #18  
Antiguo 24-04-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Muy interesante Roman, lo tendre en cuenta si algun dia uso mydac, por ahora con my escaso ado, necesito el mensaje. , que envidia.
Saludos
Responder Con Cita
  #19  
Antiguo 25-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
Problema conuna consulta select...not in (select ...) VRO Firebird e Interbase 2 11-08-2005 08:56:35
5 select de 5 tablas diferentes en un select solo sakuragi SQL 6 15-06-2005 18:57:06
Problemas al hacer SELECT con ADOQuery hunabku Conexión con bases de datos 1 18-05-2005 01:08:28
Select anidado ( Select from select ) Malon Firebird e Interbase 1 05-10-2004 04:14:38
Problemas select en Oracle mateamargo SQL 12 08-07-2004 16:03:59


La franja horaria es GMT +2. Ahora son las 04:39:16.


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