PDA

Ver la Versión Completa : Error desconocido al tratar de acceder un registro


Farko
25-05-2015, 01:54:38
Hola amigos; trabajo hace mucho en delphi con BDE. Ahora estoy tratando de migrar a Firebird. Por lo cual e estado haciendo algunas pruebas básicas para ambientarme y entender un poco el manejo de datos en esta nueva plataforma.

Les comento mi problema:
Tengo una pequena base de datos creada con IBExpert, la cual tiene una tabla (Productos) con tan solo 5 registros:

** Estructura de la tabla Productos
Field Name Field Type Size
Codigo CHAR 20
Nombre CHAR 50


** Registros contenidos
Codigo Nombre
============
001 Producto 1
002 Producto 2
003 Producto 3
004 Producto 4
005 Producto 5


Tengo un formulario con un componente SQLConecction, y un SQLDataSet. El SQLConecction conectado a la base de datos, y el SQLDataSet conectado al SQLConecction, tambien un componente TMemo para mostrar el resultado de la consulta.

Hice un pequeno programa para leer un registro especifico de la tabla, el cual funciona perfectamente bien. Si le asigno a la variable "sCodigo" el valor '002', me encuentra y muestra el "Producto 2", si lo cambio a sCodigo:='001', lo mismo, muestra el producto 1, y con cualquier numero de "000 a 99999999", ningun problema. Si lo encuentra lo muestra, de lo contrario, no muestra nada (obvio).

El problema se produce cuando le asigno a la variable "sCodigo" algo como esto: sCodigo := 'R002', o sCodigo := 'ABC'.., el punto es que basta con poner una letra en la variable de buqueda y delphi me entrega el siguiente error: "Project Project1.exe raised exception class TDBXError with message 'Column Uknown R002 At line 1, column 38'", y lo mismo si hubieramos asignado sCodigo := ÁBC", el error sera: Project Project1.exe, ........... 'Column Uknown ABC .......'", el contenido de la variable, al parecer se valida como nombre de una columna.

Ahora bien si yo en mi tabla "Productos", incorporo un nuevo registro con CODIGO=ABC, y Nombre=Producto 6.

** Registros contenidos
Codigo Nombre
============
001 Producto 1
002 Producto 2
003 Producto 3
004 Producto 4
005 Producto 5
ABC Producto 6 <---- Nuevo registro

..., y vuelvo a correr el programa para buscar nuevamente el producto sCodigo := '002' (el cual era encontrado sin problemas antes de incorporar este nuevo registro), Delphi me entrega el siguiente error: "Project Project1.exe raised exception class TDBXError with message 'Conversion error from string "ABC '".

No logro entender que pasa. La variable "codigo", esta definida como Char, pero me da error si el codigo de busqueda tiene alguna letra, o la base de datos contiene en el campo codigo alguna letra.

Adjunto codigo delphi.


procedure TForm1.Button1Click(Sender: TObject);
var
sTabla : String;
SQL_Text: String;
sCampo : String;
sCodigo : String;

begin
sTabla := 'Productos';
sCampo := 'Codigo';
sCodigo:= '002';

SQLDataSet1.Close;

SQLDataSet1.CommandType := ctQuery;

SQL_Text := 'SELECT * FROM '+
sTabla + ' ' +
'WHERE ' +
sCampo + '= ' +
sCodigo + ';';

SQLDataSet1.CommandText := SQL_Text;

SQLDataSet1.Active := True;


Espero, haber sido claro al expresarme, y haber entregado toda la informacion para que se entienda bien el problema que me ocurre.

De antemano, gracias a todos por su ayuda.
Farko

Casimiro Notevi
25-05-2015, 10:39:02
Hola, pon un punto de ruptura en SQLDataSet1.Active := True; y mira el contenido de SQL_Text, a ver si es correcto.

Por cierto, te aconsejo otro método para trabajar con firebird, sigue este sencillo y práctico tutorial (http://www.intitec.com/varios/Delphi_conexion_firebird_con_ibx.pdf), te aclarará mucho las cosas.

orodriguezca
25-05-2015, 15:10:28
El contenido de la variable sCodigo debe ir entre comillas simples:


SQL_Text := 'SELECT * FROM '+
sTabla + ' ' +
'WHERE ' +
sCampo + '= ' +
QuotedStr(sCodigo) + ';';


Además me uno a la sugerencia de casimiro de hecharle un vistazo al tutorial.

Farko
25-05-2015, 20:50:03
Casimiro Notevi, y orodriguezca;
les agradezco a ambos por haberse tomado la molestia de leer mi pregunta y responder. Con la modificacion propuesta por orodriguezca, funciono perfectamente para todas las alternativas de busqueda. Tambien agradezco a Casimiro Notevi, por su instructivo, muy facil de entender, y muy practico para alguien que esta comenzando en firebird.

Gracias,
ambos fueron de gran ayuda.

Saludos,
Farko