Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error Insert SQL (https://www.clubdelphi.com/foros/showthread.php?t=90413)

Bant 02-06-2016 01:03:42

Error Insert SQL
 
Saludos colegas del club hoy les vengo con una inquietud que he intentado resolverla casi todo el dia, :mad::mad:, el problema me tiene sacando humos de la cabeza ya. Tenga una tabla creada en sql server 2014 llamada FacturaTotal la cual tiene 5 campos ID, Cantidad, Subtotales, ITBIS, Total. De estos ID y Cantidad son de tipo int mientras que los demas son de tipo numerico, en el programa que estoy desarrollando tengo unos edits que calculan estos valores por lo cual los paso a variables de tipo string para introducirlos en el adoquery del cual tengo el siguiente codigo:

Código Delphi [-]
Ide := '5';
Productos := ECantidad.Text;
Subtotal := EdtSubtotales.Text;
itbis := EdtItbis.Text;
totales := Edtotal.Text;

with dm2.ADOTotal do
begin
Active := False;
Close;
SQL.Text := 'insert into FacturaTotal(ID, Cantidad, Subtotales, ITBIS, Total) values (' + Ide + ', ' + Productos + ', ' + Subtotal + ', ' + itbis + ', ' + totales + ');';
ExecSQL;
Active := True;
end;

Este código se ejecuta al presionar un boton, el error me lo da después del ExecSQL; Me dice:
'There are fewer columns in the INSERT Statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.'

Lo cual no lo pillo si especifico el numero de datos que introduzco y solo pongo esos valores por que me ha salido esto? Además cuando lo intente con QuotedStr me dio error que no se puede convertir de tipo varchar a numeric, claro está pero no me salia este No entiendo :(

roman 02-06-2016 02:59:55

En estos casos, lo mejor es que examines el valor de SQL.Text para ver cómo queda formado. Mi hipótesis es que uno de los valores incluye una coma decimal que el sql lo interpreta como un separador de valores.

LineComent Saludos

Neftali [Germán.Estévez] 02-06-2016 10:09:24

Cita:

Empezado por Bant (Mensaje 505844)
Este código se ejecuta al presionar un boton, el error me lo da después del ExecSQL; Me dice:
'There are fewer columns in the INSERT Statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.'

Lo cual no lo pillo si especifico el numero de datos que introduzco y solo pongo esos valores por que me ha salido esto? Además cuando lo intente con QuotedStr me dio error que no se puede convertir de tipo varchar a numeric, claro está pero no me salia este No entiendo :(

A veces este error pasa cuando uno de los parámetros incluye una coma decimal (no se si es tu caso). Eso hace que la SQL final tenga más parámetros de los esperados.
En estos casos lo mejor es utilizar parámetros:

Código Delphi [-]
dm2.ADOTotal.Active := False;
dm2.ADOTotal.Close;
dm2.ADOTotal.SQL.Text := 'insert into FacturaTotal(ID, Cantidad, Subtotales, ITBIS, Total) values (:IDE, :PRODUCTOS, :SUBTOITAL, :ITBIS, :TOTALES);';
// Asignar parámetros
dm2.ADOTotal.Parametres.ParamByName('IDE').Value := Ide;
dm2.ADOTotal.Parametres.ParamByName('PRODUCTOS').Value := Productos;
...
dm2.ADOTotal.Parametres.ParamByName('TOTALES').Value := totales;
dm2.ADOTotal.ExecSQL;
dm2.ADOTotal.Active := True;

De esta forma te olvidas de los separadores, de las comas,...
Ya se encargará el sistema de colocar cada cosa con su formato para que funcione.

NOTA: Te he puesto el código de memoria.

Bant 02-06-2016 15:56:35

Gracias por las rápidas respuestas chicos!! En efecto al parecer ya me acepta los valores pero ahora hay un problema, me da el siguiente error ADOTotal:CommandText does not return a result set. . Viendo otros hilos del foro intente sustituyendo el ExecSQL; por Open; o poniendo al inicio Active := False; y al final Active := True; pero no me funciona! Además pasa algo raro, al final de darle click se debe mostrar en un fast report este me lo muestra pero vacio y despues me tira el error. Alguna idea ?.? :(

Caminante 02-06-2016 16:34:20

Hola

Cita:

Empezado por Bant (Mensaje 505871)
Gracias por las rápidas respuestas chicos!! En efecto al parecer ya me acepta los valores pero ahora hay un problema, me da el siguiente error ADOTotal:CommandText does not return a result set. . Viendo otros hilos del foro intente sustituyendo el ExecSQL; por Open; o poniendo al inicio Active := False; y al final Active := True; pero no me funciona! Además pasa algo raro, al final de darle click se debe mostrar en un fast report este me lo muestra pero vacio y despues me tira el error. Alguna idea ?.? :(

Si usas execsql no debes usar active:=true, ni Open ya que estos se usan si tu sql es de tipo select.

Saludos

AgustinOrtu 02-06-2016 19:35:44

Tu sentencia SQL es una sentencia de insercion; por lo general, no devuelven un DataSet como resultado.
Suelen devolver la cantidad de registros afectados (esto dejando de lado clausulas o funciones especificas que si permiten devolver DataSets, como la RETURNING de Firebird)

Para ejecutar un INSERT, DELETE o UPDATE se suele usar ExecSQL (o similares, varia el nombre del metodo de acuerdo a la suite de componentes)

Para ejecutar un SELECT se emplea Open

Si queres enviarle datos a un informe deberias estar empleando SELECT y no un INSERT

rocksoft 03-06-2016 01:56:39

Buenas y para no caer en trampas tontas te recomiendo que limpies el SQL, para el caso que quede algun residuo de alguna consulta anterior:
Código Delphi [-]
dm2.ADOTotal.SQL.Clear;
dm2.ADOTotal.SQL.Text := 'insert into FacturaTotal(ID, Cantidad, Subtotales, ITBIS, Total) values (:IDE, :PRODUCTOS, :SUBTOITAL, :ITBIS, :TOTALES);';
..
..
dm2.ADOTotal.ExecSQL;

Bant 03-06-2016 03:25:47

Muchas gracias a todos colegas del club!! Ya solucione el error (claro esta gracias a su ayuda xd), el problema me lo daba al final, que después de esa linea de código lo mostrara en un reporte del FastReport, como solo insertaba los resultados y no los llamaba después por medio de un SELECT no me mostraba los resultados si no que me mostraba en blanco el FastReport :D:D. Mi error al no mostrar esa última linea de código en un principio. De nuevo muchas gracias colegas por sus rápidas respuestas ya que también tendré más cuidado de ahora en adelante!!


La franja horaria es GMT +2. Ahora son las 10:35:38.

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