Ver Mensaje Individual
  #5  
Antiguo 17-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Es cierto Al, el tratamiento a los campos es distinto que a los parámetros. Tal como yo lo decía es incorrecto, ya que, como bien notas, las propiedades AsXXX no hacen una conversión sino que simplemente cambian el tipo de datos (DataType).

Ahora, no me parece descabellado. Más bien habría que ver porqué TField no lo hace. Si yo escribo

Código Delphi [-]
Query.ParamByName(...).AsXYZ := valor;

explícitamente estoy diciendo que quiero tratar el parámetro como un tipo XYZ; ¿por qué, entonces no había de hacerse el cambio de DataType?

Pero no deja de ser raro que el BDE no acepte el paso de un parámetro float como AsString puesto que el motor en sí si acepta consultas como:

Código SQL [-]
update productos
set precio = "1123.58"
where ...

siendo precio un campo numérico.

Por otra parte, los métodos SetAsXYZ de TField en realidad sólo lanzan una excepción; es decir que están hechos para ser redefinidos. Entonces, cuando hacemos algo como

Código Delphi [-]
Table.FieldByName('precio').AsString := '1123.58';

en realidad estamos llamando al método SetAsString, no de TField, sino de TFloatField. Cuando abrimos la tabla, se crean los campos del tipo adecuado según especifique la tabla física, de manera que ya se sabe de antemano que el campo real es de tipo float, y por tanto, el valor que se dé, debe convertirse a ese tipo de datos antes de mandarlo a la base.

Pero en el caso de un Query, no se sabe de antemano a qué tipo de datos corresponde el parámetro en la base, así que tiene que confiar en lo que le decimos y cambiar el valor de DataType.

Bueno, desde luego estoy especulando, pero creo que por ahí va el porqué TParam ajusta DataType y TField (o sus descendientes) no.

// Saludos
Responder Con Cita