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)
-   -   Record/Key deleted (https://www.clubdelphi.com/foros/showthread.php?t=70830)

edgwin 12-11-2010 20:07:22

Record/Key deleted
 
Buen dia amigos del club!

Tengo un problema con una aplicacion en delphi. Al intentan "Postear" un nuevo registro en una tabla me genera el siguiente error:

Record/Key deleted.

Utilizo Delphi 2010 con informix. Cabe mensionar que la tabla donde quiero hacer el post no contienen llaves primarias y contiene un campo autoincrementable (creo que va por ahi el problema).

Código Delphi [-]
with DM.tblMKard do
begin
  if not Active then
    Active := true;
    DM.dsMKard.DataSet := nil;
    Close;
    Open;
    Insert;
    FieldByName('PEDI').AsInteger := StrToInt(cbxIsot.Items[cbxIsot.ItemIndex].Text[2]);
    FieldByName('ISOT').asInteger  := StrToInt(cbxIsot.Items.Items[cbxIsot.ItemIndex].Text[4]);
    vActi := StrToFloat(dbeActi.Text);
    if cbxUM.Text = 'mCi' then
      FieldByName('ACTI').AsFloat := DM.fncmCi2uCi(vActi)
    else
      FieldByName('ACTI').AsFloat := vActi;
    FieldByName('VOLU').AsFloat    := StrToFloat(dbeVolu.Text);
    FieldByName('TECN').AsInteger  := DM.gTenc;
    FieldByName('FECH').AsDateTime := now;
    if _actual then
      FieldByName('TIPOMOVI').AsString := 'D'
    else
      FieldByName('TIPOMOVI').AsString := 'E';
    FieldByName('DESCMOVI').AsString := '1';
    FieldByName('DOCU').AsString := vDocu;
    FieldByName('LOTE').AsString := cbxIsot.Items.Items[cbxIsot.ItemIndex].Text[1];
    FieldByName('UNIDMEDI').AsString := cbxUM.Text;
    if _actual then
      FieldByName('TipoReng').AsString := 'S'
    else
      FieldByName('TipoReng').AsString := 'P';
  Post; {******* AQUI MARCA EL ERROR **********}
   ...
end;

Lo gracioso (bueno no tanto para mi) es que sucede solo en ocaciones. Alguien sabe a que se pueda deber este error.Saludos!

marcoszorrilla 12-11-2010 20:32:55

Yo creo que toda tabla debe de tener una clave primaria, que es la que suelen utilizar los motores para resposicionarse cuando hay cambios; inserciones, borrados, etc...

Un Saludo.

edgwin 12-11-2010 20:44:18

Gracias por responder.

Si en efecto, desafortunadamente yo no tengo permisos en la base de datos de modificar la estructura de la BD. Pero bueno, me tendre que echar un round con la persona encargada para que me le agregue llaves a las BDD.

Saludos!

duilioisola 12-11-2010 20:54:46

En las primeras líneas creo que abres y cierras la tabla varias veces

Código Delphi [-]
with DM.tblMKard do
begin
  if not Active then
    Active := true; {Aqui la abres}
    DM.dsMKard.DataSet := nil;
    Close; {Aqui la cierras}
    Open; {Aqui la abres}
[...]

Quizás eso moleste un poco a la tabla y no se entere bien de cual es el contador que le toca.

Tambien parece que quitas la propiedad DataSet a un DataSource.
Si lo que quieres es que los componentes visuales no se enteren, deberías hacerlo con un Disable/EnableControls

Código Delphi [-]
with DM.tblMKard do
begin
  DisableContros
  if not Active then
    Active := true;
  Insert;
  [...]
  Post;
  EnableControls;
end;
[...]

Y finalmente puede ser que la tabla no esté en estado dsBrowse al momento de insertar, aunque creo que daría algún otro error


Código Delphi [-]
with DM.tblMKard do
begin
  DisableContros
  if not Active then
    Active := true;
  if (state = dsBrowse) then
  begin
     Insert;
     [...]
     Post;
  end else
     {La tabla estaba en un modo que no debía. Qizás dsInsert, dsEdit, etc.}
  EnableControls;
end;
[...]

duilioisola 12-11-2010 21:08:46

En esta página hablan sobre el tema:

Cita:

Simple Inserts/Updates
-----------------------------------------------------------------
{...}
Informix Tables

Although Informix Serial fields are updateable, if their
autoincrement feature is to be used, then the Required property
of field components based on them should be set to False. Do
this in the same manner described for Paradox Tables.
Aparentemente debes poner la propiedad Required del campo autoincremental a False.

edgwin 18-11-2010 00:06:19

Gracias a todos por responder.

* marcoszorrilla: Ya le agregue la llave primaria a la tabla, y sigue marcando el error.
* duilioisola: Ya quite las lineas .. if not active then Active := true;
Agregue en el codigo: Enabled/DisabledControls
No se establecer la propiedad "Required" a falso (utilizo ServerStudio)

Sigo sin exito. Lo peor de todo es el codigo lo tengo en un bloque try..except..end. Si existe error, que deshaga la operacion, pero se la pasa por el arco del triunfo ya que si postea la informacion.

Alguna idea .... ??


La franja horaria es GMT +2. Ahora son las 04:52:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi