PDA

Ver la Versión Completa : Sql access a Firebird 2 (tercera consulta)


Caral
26-12-2007, 23:02:20
Hola a todos
Bueno sigo con esto, ahora tengo un mensaje que no entiendo la razon.
Tengo esta sentencia:
AdoQuery1.SQL.Text := 'Insert into TransMaterial Values ( '+EdCodigo.Text+ ', '+DateToStr(DTP1.Date)+', '+QuotedStr(EdMaterial.Text)+', '+
QuotedStr(EdReferencia.Text)+', '+QuotedStr(EdSolicita.Text)+', '+QuotedStr(CBtipo.Text)+' ,'+NEdCantidad.Text+', '+QuotedStr(EdUsuario.Text)+', '+QuotedStr(EdNotas.Text)+')';
Showmessage(AdoQuery1.SQL.CommaText);
AdoQuery1.ExecSQL;

Como veis le puse un mensaje para ver que me enviaba, aparentemente, la informacion es la correcta, los campos son los correctos y los tipos tambien.
Me envia este error:
Convertion error from string ''0''.No entiendo de donde sale el error, en ningun campo hay un numero o se genera un numero cero ( 0 ).
No tengo ningun campo que pudiera ser string y que me genere un 0.
Que podra ser?
Saludos

egostar
26-12-2007, 23:50:39
Mucho gusto de saludarlo por este medio amigo Caral, podrías pegar aquí lo que sale en tu ventana de mensaje donde muestras el resultado de la consulta?

Salud OS.

jachguate
27-12-2007, 00:14:30
Hola Caral.

Al no conocer tu estructura, no tengo idea de donde venga el error. En casos como este, para no cambiar el código que ya tenes, podrías no solo mostrar la sentencia SQL generada sino copiarla al clipboard, de manera que podás pegarla en isql o en el administrador de la BD que estes usando.

Esto lo conseguís añadiendo la unidad clipboard al uses de tu unidad y luego el código:


clipbrd.AsText := AdoQuery1.SQL.Text;


Luego, ctrl+v y quizás ya se verá mas claramente donde está el error.

Hasta luego.

;)

Caral
27-12-2007, 17:09:28
Hola
He seguido tu sugerencia y me ha servido de mucho.
El asunto esta si:
El datetimepicker genera esta fecha 27/12/2007.
Me he fijado que firebird no acepta ese formato, lo que acepta es '27.12.2007' entre comillas simples.
El asunto es que le puedo dar formato asi:
ShortDateFormat := 'dd.mm.yyyy';
Esto me genera la fecha como se necesita, pero sin las comillas.
Como le pongo las comillas que me hacen falta?.
Por que comillas en la fecha?
Este es el resultado de lo que me genera la sentencia sql:
Insert into TransMaterial Values (102351, 27.12.2007, '19301JETGM', 'nada', 'carlos', 'Compra' ,88, 'carlos', '')
Lo que me faltaria es poner las comillas en la fecha.
Este seria el resultado de lo que necesito, no se por que:
Insert into TransMaterial Values (102351, '27.12.2007', '19301JETGM', 'nada', 'carlos', 'Compra' ,88, 'carlos', '')
Otra cosa seria saber si son necesarias o depende de algo mas?.
Gracias por la ayuda.
Saludos

RONPABLO
27-12-2007, 17:29:23
te recomiendo que uses parámetros, así:

primero en un editor de querys (ibXpert o como se llame) comprueba algo como esto

Insert into TransMaterial Values (:id, :fecha, :codigo, :comentario, :vendedor, :accion, :cantidad, :comprador, :comentario1)

luego en delphi puede hacer lo siguiente:


ibQuery.Sql.add(Insert into TransMaterial Values (:id, :fecha, :codigo, :comentario, :vendedor, :accion, :cantidad, :comprador, :comentario1));
ibQuery.ParamByName('id').asInteger := 102351;
ibQuery.ParamByName('fecha').asDate := DataTimePicker.Date;
ibQuery.ParamByName('codigo').asString := '19301JETGM';
ibQuery.ParamByName('comentario').asString := 'nada';
ibQuery.ParamByName('vendedor').asString:= 'carlos';


y así por cada uno de los parámetros... puede ser en un principio muy largo, pero en el futuro es mas cómodo porque solo tendrá un solo código de inserción y solo asignara nuevamente cada parámetro

RONPABLO
27-12-2007, 17:34:01
otra recomendación amigo caral, no uses ado, para eso existen componentes nativos como los mdo o los ibX, tienen mejor rendimiento y explotan mejor el firebird que el ado

jachguate
27-12-2007, 18:31:24
Hola.

Apoyo la recomendación de RONPABLO, con respecto del uso de parámetros. Eso además, te libera de determinar el formato de fecha que "entendrá" la base de datos, pues la fecha regularmente pasa de modo binario y es el propio motor el encargado de negociar el formato.

De cualqueir manera, si no hay de otra que pasar la fecha de manera textual, he notado que casi todos los motores la aceptan en formato 'yyyy-mm-dd'. Comento esto porque en algunos motores, como SQL Server u Oracle, el formato dependerá de la configuración del sistema base o de la configuración del propio motor, por lo que lo que funcione contra el SQL Server de tu máquina, no necesariamente funcionará contra el servidor del cliente. (Se que no es tu caso, caral, pero aclaro para el resto de la comunidad).

Finalmente, podes añadir las comillas simples valiéndote de la función QuotedStr.

Es decir, donde tenés DateToStr(Fecha), cambialo por QuotedStr(DateToStr(Fecha)), y seguro que funcionará.

Hasta luego.

;)