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 02-06-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
Error Insert SQL

Saludos colegas del club hoy les vengo con una inquietud que he intentado resolverla casi todo el dia, , 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
Responder Con Cita
  #2  
Antiguo 02-06-2016
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
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
Responder Con Cita
  #3  
Antiguo 02-06-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Bant Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 02-06-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
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 ?.?
Responder Con Cita
  #5  
Antiguo 02-06-2016
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola

Cita:
Empezado por Bant Ver Mensaje
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
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #6  
Antiguo 02-06-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 03-06-2016
rocksoft rocksoft is offline
Miembro
NULL
 
Registrado: may 2016
Posts: 71
Poder: 8
rocksoft Va por buen camino
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;
Responder Con Cita
  #8  
Antiguo 03-06-2016
Bant Bant is offline
Miembro
NULL
 
Registrado: mar 2016
Posts: 19
Poder: 0
Bant Va por buen camino
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 . 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!!
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
Error Insert SQL!! XcamX SQL 15 13-02-2013 10:19:38
Error con insert Paulao Varios 1 27-04-2010 19:50:55
error en insert into arespremium MySQL 0 30-08-2007 23:06:59
Error en insert into rhasshid SQL 4 23-04-2007 07:31:23
Sql Error: error cannot insert a duplicate......................... inexperto SQL 2 04-06-2004 12:54:59


La franja horaria es GMT +2. Ahora son las 22:34:05.


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