Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema Consulta Insert into... (https://www.clubdelphi.com/foros/showthread.php?t=47334)

enecumene 24-08-2007 18:59:26

Problema Consulta Insert into...
 
Hola Compañeros del foro, codigo:

Código Delphi [-]
QHistorico.Close;
   QHistorico.SQL.Add('insert into historico values');
   QHistorico.SQL.Add('("", "'+DBEdit13.Text+'")');
   QHistorico.Open;
   QHistorico.ExecSQL;

error:

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Sigesped.exe raised exception class EOleException with message 'Number of query values and destination fields are not the same'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
eso quiere decir que los values tiene que ir en el mismo orden que esta en la base de datos?.

Saludos...

maeyanes 24-08-2007 19:05:50

Cuando haces un insert sin especificar los campos, los valores que pasas deben ir en el orden en que están los campos de la tabla y debes incluir todos y cada uno de los valores:

Código SQL [-]
create table historico (
  id Integer,
  descripcion varchar(30)
);

insert into historico values(1, 'Primer histórico');

/* La sentencia anterior equivale a: */
insert into historico (id, descripcion) values(1, 'Primer histórico');


Saludos...

jhonny 24-08-2007 19:07:27

Seguramente la tabla historico tiene mas campos de los que estas tratando de insertar, de manera pues que creo que lo mejor es que le indiques el nombre de los campos que deseas insertar, asi:

Código Delphi [-]
   QHistorico.Close;
   QHistorico.SQL.Add('insert into historico (NombreDelCampoVacio, NombreDelOtroCampo) values');
   QHistorico.SQL.Add('("", "'+DBEdit13.Text+'")');
   QHistorico.ExecSQL;

Otra cosa, quitale el QHistorico.Open; ya que con el ExecSql; ya sera suficiente, ademas puede causarte problemas mas adelante.

Espero te sirva ;).

//Nota: Caramba¡¡¡ casi que iguales maeyanes :)

BlueSteel 24-08-2007 19:10:41

tambien te falta hacer un limpiado del SQL.. por si queda algo, esto lo haces despues de

Código Delphi [-]
QHistorico.Close;
QHistorico.Sql.Clear;
QHistorico.Sql.Add( // y asi 
QHistorico.ExecSql;

maeyanes 24-08-2007 19:14:32

Aparte que si ese componente solo sirve para insertar historicos, no necesita llamar al evento Close, ya que ExecSQL no devuelve ningún tipo de record set...

Código Delphi [-]
QHistorico.SQL.Clear;
QHistorico.SQL.Add('insert into Historico values');
//...
QHistorico.ExecSQL;

Saludos..

enecumene 24-08-2007 19:43:37

Gracias a todos, el codigo quedo asi de acuerdo a sus sugerencias:

Código Delphi [-]
 QHistorico.SQL.Clear;
   QHistorico.SQL.Add('insert into historico (id, no, no_ped, dpto, responsable, fecha_rec_ped, status, user, date) values');
   QHistorico.SQL.Add('("", "'+DBEdit18.Text+'", "'+DBEdit7.Text+'", "'+DBLookupComboBox6.Text+'", "'+DBLookupComboBox8.Text+'", "'+DBEdit15.Text+'", "'+DBLookupComboBox1.Text+'", "'+DBEdit16.Text+'", "'+DBEdit17.Text+'")');
   QHistorico.ExecSQL;

nuevo error:

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Sigesped.exe raised exception class EOleException with message 'Syntax error in INSERT INTO statement'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Caro 24-08-2007 19:54:32

La primera coma del principio esta de mas

Cita:

Empezado por enecumene (Mensaje 225861)

Código Delphi [-]
    QHistorico.SQL.Add('("", "'+DBEdit18.Text+'", "'+DBEdit7.Text+'", "'+DBLookupComboBox6.Text+'", "'+DBLookupComboBox8.Text+'", "'+DBEdit15.Text+'", "'+DBLookupComboBox1.Text+'", "'+DBEdit16.Text+'", "'+DBEdit17.Text+'")');

Saluditos

enecumene 24-08-2007 20:00:28

Gracias Caro por tu respuesta, segun tu sugerencia quedaria asi:

Código SQL [-]
QHistorico.SQL.Add('("" "'+DBEdit18.Text+'", "'+DBEdit7.Text+'", "'+DBLookupComboBox6.Text+'", "'+DBLookupComboBox8.Text+'", "'+DBEdit15.Text+'", "'+DBLookupComboBox1.Text+'", "'+DBEdit16.Text+'", "'+DBEdit17.Text+'")');

si es asi aun me tira el mismo error.

Saludos...

Caral 24-08-2007 20:14:47

Hola
Que vamos a hacer con tigo enecumene, no nos das datos suficientes.:rolleyes:
Recuerda que hay diferentes tipos de campos, texto, numericos etc.
La inserción tiene que ser en base al tipo de campo por que estas concatenando.
Pregunto:
Que tipo de campo va a incluir cada uno de estos:
DBEdit18.Text
DBEdit7.Text
DBLookupComboBox6.Text
DBLookupComboBox8.Text
DBEdit15.Text
DBLookupComboBox1.Text
DBEdit16.Text
DBEdit17.Text
Puedo asegurar sin temor a equivocarme que mas de uno de estos debe de ser numerico.
Me explicas esto?
Saludos

enecumene 24-08-2007 20:23:27

disculpa Caral todos los campos son tipos Textos. el unico que es numerico y es autoincrement es "id"...
mira mi codigo completo por si acaso:

Código Delphi [-]
procedure TFPedidoMod.BitBtn2Click(Sender: TObject);
begin
FConsPed.TbPedido.Edit;
if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
       [mbYes, mbNo], 0) = mrYes then
   begin
   FConsPed.TbPedido.Post;
   QHistorico.SQL.Clear;
   QHistorico.SQL.Add('insert into historico (id, no, no_ped, dpto, responsable, fecha_rec_ped, status, user, date) values');
   QHistorico.SQL.Add(' ("", "'+DBEdit18.Text+'", "'+DBEdit7.Text+'", "'+DBLookupComboBox6.Text+'", "'+DBLookupComboBox8.Text+'", "'+DBEdit15.Text+'", "'+DBLookupComboBox1.Text+'", "'+DBEdit16.Text+'", "'+DBEdit17.Text+'")');
   QHistorico.ExecSQL;
   MessageDlg('Los Datos se grabaron exitosamente!',mtError,[mbOK],0);
   Free;
   end;
end;

Saludos...

Caral 24-08-2007 20:37:31

Hola
Se que me engañas, lo veo en mi pantallita mágica.:D
Me vas a decir que estos son tipo texto?
Código Delphi [-]
fecha_rec_ped
date
Crees que se necesite insertar el campo autoincrement?
Saludos

maeyanes 24-08-2007 20:57:11

Si el campo Id es autoincremental, no veo la necesidad de usarlo en el insert into...

Código Delphi [-]
QHistorico.SQL.Add('insert into historico (no, no_ped, dpto, responsable, fecha_rec_ped, status, user, date) values');
QHistorico.SQL.Add(' ("'+DBEdit18.Text+'", "'+DBEdit7.Text+'", "'+DBLookupComboBox6.Text+'", "'+DBLookupComboBox8.Text+
  '", "'+DBEdit15.Text+'", "'+DBLookupComboBox1.Text+'", "'+DBEdit16.Text+'", "'+DBEdit17.Text+'")');

Caral, el que el nombre de campo indique que es tipo fecha (date), no significa que así haya sido declarado en la base de datos. Si enecumene dice que fue declarado como un tipo string habremos de creerle... ;)


Saludos...

enecumene 24-08-2007 22:02:03

Disculpen la tardanza:

Caral

Cita:

Hola
Se que me engañas, lo veo en mi pantallita mágica.:D
Me vas a decir que estos son tipo texto?
en la base de datos esta declarado como string.

maeyanes

Cita:

Si el campo Id es autoincremental, no veo la necesidad de usarlo en el insert into...
aun quitando el campo id del insert into el error aun persiste.

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Sigesped.exe raised exception class EOleException with message 'Syntax error in INSERT INTO statement'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
:confused::confused::confused:

maeyanes 24-08-2007 22:09:12

A simple vista no se ve el error...

Por que no intentas esto:

Agrega un componente TMemo en la forma donde usas esta instrucción y haces lo siguiente:

Código Delphi [-]
procedure TFPedidoMod.BitBtn2Click(Sender: TObject);
begin
  FConsPed.TbPedido.Edit;
  if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
    [mbYes, mbNo], 0) = mrYes then
  begin
    FConsPed.TbPedido.Post;
    QHistorico.SQL.Clear;
    QHistorico.SQL.Add('insert into historico (id, no, no_ped, dpto, responsable, fecha_rec_ped, status, user, 
      date) values');
    QHistorico.SQL.Add(' ("", "'+DBEdit18.Text+'", "'+DBEdit7.Text+'", "'+DBLookupComboBox6.Text+
      '", "'+DBLookupComboBox8.Text+'", "'+DBEdit15.Text+'", "'+DBLookupComboBox1.Text+'", "'+DBEdit16.Text+
      '", "'+DBEdit17.Text+'")');
    Memo1.Text := QHistorico.SQL.Text; // Agregas esta línea...
    QHistorico.ExecSQL;
    MessageDlg('Los Datos se grabaron exitosamente!',mtError,[mbOK],0);
    Free;
  end;
end;

Luego copias el texto que resultó en el TMemo y nos lo pones aquí...

Algo me dice que el error está en el insert ya formado...


Saludos...

Caral 24-08-2007 22:14:54

Hola
Y Asi?
Código Delphi [-]
   procedure TFPedidoMod.BitBtn2Click(Sender: TObject);
   begin
   if MessageDlg('¿Está seguro que desea Guardar?', mtConfirmation,
       [mbYes, mbNo], 0) = mrYes then
   begin
   QHistorico.SQL.Text:= 'Insert Into historico (no, no_ped, dpto, responsable, fecha_rec_ped, status, user, date)'+
                         ' values ('+QuotedStr(DBEdit18.Text)+', '+QuotedStr(DBEdit7.Text)+', '+QuotedStr(DBLookupComboBox6.Text)+', '+QuotedStr(DBLookupComboBox8.Text)+', '+QuotedStr(DBEdit15.Text)+', '+QuotedStr(DBLookupComboBox1.Text)+', '+QuotedStr(DBEdit16.Text)+', '+QuotedStr(DBEdit17.Text)+')';
   QHistorico.ExecSQL;
   MessageDlg('Los Datos se grabaron exitosamente!',mtError,[mbOK],0);
   end;
end;
Saludos

enecumene 24-08-2007 22:23:35

maeyanes, esta linea me deberia salir? porque cuando el error me sale todo queda detras y se friza y no me permite ver nada...:(

maeyanes 24-08-2007 22:27:10

Para que no te de el error, comenta la línea de QHistorico.ExecSQL, así al hacer click en el botón, generas la sentencia insert sin ejecutarla.


Saludos...

enecumene 24-08-2007 22:30:23

Me presenta el mismo error, no se si sirve de algo la linea de error que me tira el ADODB:

Código SQL [-]
function TADOCommand.Execute(var RecordsAffected: Integer;
  const Parameters: OleVariant): _Recordset;
var
  VarRecsAffected: OleVariant;
begin
  SetConnectionFlag(cfExecute, True);
  try
    Initialize;
    Result := CommandObject.Execute(VarRecsAffected, Parameters, <---AQUI
      Integer(CommandObject.CommandType) + ExecuteOptionsToOrd(FExecuteOptions));
    RecordsAffected := VarRecsAffected;
  finally
    SetConnectionFlag(cfExecute, False);
  end;
end;

Paoti 24-08-2007 22:31:33

hola enecumene


comenta las lineas

del QHistorico.SQL.Text := 'inser... etc


y bguadra todo en una variable string,


dibujate un memo y ahi
has esto

memo1.text := myCadenadeSQLInsert;


y ve sie sta bien generado tu sentencia y haber en donde esta mal

enecumene 24-08-2007 22:36:57

Cita:

Empezado por Paoti (Mensaje 225951)
hola enecumene


comenta las lineas

del QHistorico.SQL.Text := 'inser... etc


y bguadra todo en una variable string,


dibujate un memo y ahi
has esto

memo1.text := myCadenadeSQLInsert;


y ve sie sta bien generado tu sentencia y haber en donde esta mal

disculpa paoti no entendi, de veras que no y disculpame, me podrias dar un ejemplo?. Gracias...


La franja horaria es GMT +2. Ahora son las 07:40:13.

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