Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   insertar en tablas paradox (https://www.clubdelphi.com/foros/showthread.php?t=78069)

jomah 16-03-2012 23:45:16

insertar en tablas paradox
 
hola tengo un problema cuando intenmnto insertar varios registros nuevos a la ves con un ciclo while en la tabla el primero me lo acepta pero en el segundo me da key violation este es el codigo que estoy utilizando


Código Delphi [-]
if edt2.Text=edt1.Text then
begin
qry1.Active:=False;
qry1.SQL.Text:='SELECT MAX(NUM_REG) AS NUM_REG FROM '+Tab+'';
qry1.Active:=True;
A:= qry1.fieldbyname('NUM_REG').AsInteger+1;
qry2.Active:=False;
qry2.SQL.Text:='select * from Modelos where NUM_REG='+frmPrincipal1.dbedtNUM_REG.Text+'';
qry2.Active:=True;


  try
    qry2.First;
    While not qry2.Eof do
    begin
      qry1.Active:=False;
qry1.SQL.Text:='SELECT MAX(NUM_REG) AS NUM_REG FROM '+Tab+'';
qry1.Active:=True;
A:= qry1.fieldbyname('NUM_REG').AsInteger+1;
    tbl1.Insert;
    tbl1.FieldByName('NUM_REG').AsInteger := A+1;
    //A:=A+1;
    tbl1.FieldByName('TIPO_POLI').AsString := cbb1.Text;
    tbl1.FieldByName('NUM_CTA').AsString := qry2.FieldByName('NumCta').AsString;
    tbl1.FieldByName('CONCEP_PO').AsString := qry2.FieldByName('ConcepPoliz').AsString;
    tbl1.FieldByName('DEBE_HABER').AsString := qry2.FieldByName('DebeHaber').AsString;
    tbl1.FieldByName('MONTOMOV').AsFloat := qry2.FieldByName('Monto').AsFloat;
    tbl1.FieldByName('NUMDEPTO').AsInteger := qry2.FieldByName('Depto').AsInteger;
    tbl1.FieldByName('TIPCAMBIO').AsFloat := qry2.FieldByName('NUM_REG').AsFloat;
    tbl1.FieldByName('REFERENCIA').AsString := qry2.FieldByName('TipoCambio').AsString;
    tbl1.FieldByName('NUM_PART').AsInteger := qry2.FieldByName('Partidas').AsInteger;
    tbl1.FieldByName('CONTRAPAR').AsString := '0';
    tbl1.FieldByName('NUM_POLIZ').AsString := '    '+dbedtNUM_REG.Text;
    tbl1.FieldByName('FECHA_POL').AsDateTime := qry2.FieldByName('Fecha').AsDateTime ;
    tbl1.Post;
    qry2.Next;
    end;
    ShowMessage('La Partida ha sido contavilizada');
    frmPrincipal1.Query1.Active:=False;
    frmPrincipal1.Query1.SQL.Text:='UPDATE INTCOI01 SET STATUSCLI='+QuotedStr('C')+' WHERE NUM_REG='+frmPrincipal1.dbedtNUM_REG.Text+'';
    frmPrincipal1.Query1.ExecSQL;

  except
    ShowMessage('La partida ya ha sido contavilizada con anterioridad');
  end;

gracias por la ayuda

kapcomx 17-03-2012 00:04:58

A=
 
creo que tu problema esta cuando asignas el valor de A

Código Delphi [-]
 
A:= qry1.fieldbyname('NUM_REG').AsInteger+1;

 
    tbl1.Insert;

 
    tbl1.FieldByName('NUM_REG').AsInteger := A+1;

aun cuando le sumas uno el valor siempre sera el mismo, por que toma como valor el numero de registros que te arroja la consulta que esta fuera del ciclo.

lo correcto seria dejar
Código Delphi [-]
 
 
A:= qry1.fieldbyname('NUM_REG').AsInteger+1;

antes de comenzar el ciclo y colocar

Código Delphi [-]
 
A:=A+1;


dentro del ciclo, justo antes de
Código Delphi [-]
qry2.Next;
Saludos...:cool:

jomah 17-03-2012 15:48:32

muchas gracias por responder mira eso ya lo intente y aun asi me tira el error pero lo raro es que tengo 7 documento en los cuales la diferencia solo es el nombre y uno de los documento si me lo guarda pero los otros 6 no y son iguales en todo porque incluso los traigo de la misma tabla no se si me doy a entender bien.

ecfisa 17-03-2012 22:51:44

Hola jomah.

Al igual que kapcomx, pienso que el error anda por ahí...

De este modo tendría que funcionar:
Código Delphi [-]
function ProxNumReg(AQuery: TQuery; tbName: string): Integer;
begin
  with AQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Text:= 'SELECT MAX(NUM_REG) AS NUM_REG FROM '+tbName;
    Open;
    Result:= FieldByName('NUM_REG').AsInteger + 1;
    Close;
  end;
end;

...
begin
var
  Num: Integer;
begin
  Num:= ProxNumReg(qry1, Tab);
  qry2.First;
  try
    while not qry2.Eof do
    begin
      tbl1.Insert;
      tbl1.FieldByName('NUM_REG').AsInteger:= Num;
      tbl1.FieldByName('TIPO_POLI').AsString := cbb1.Text;
      tbl1.FieldByName('NUM_CTA').AsString := qry2.FieldByName('NumCta').AsString;
      tbl1.FieldByName('CONCEP_PO').AsString := qry2.FieldByName('ConcepPoliz').AsString;
      tbl1.FieldByName('DEBE_HABER').AsString := qry2.FieldByName('DebeHaber').AsString;
      tbl1.FieldByName('MONTOMOV').AsFloat := qry2.FieldByName('Monto').AsFloat;
      ...      
      tbl1.Post;
      Inc(Num);
      qry2.Next;
    end;
  except
    ...
  end;
  ...
Claro que luego tendrías que actualizar el valor de NUM_REG en la tabla correspondiente.

Saludos.

kapcomx 17-03-2012 23:16:15

key violation
 
el key violation te lo arroja por que estas intentando agregar un valor repetido en un campo del tipo primary key, y estoy casi seguro que el problema radica en el valor de A (lo cual tambien confirma el compañero ecfisa).

por eso razon el primero lo agrega bien y como no se actualiza al intentar agregar el segundo ahi es donde te avienta el error.

Checa la solucion del compañero Ecfisa, me parece que esa seria la solucion.

Saludos:cool:

jomah 19-03-2012 15:41:43

si me pone el siguiente numero pero por alguna razon la tabla me sigue tirando error puse un memo para q pusiera toda la informacion hay y en efecto pone 16 y a la siguiente vuelta el 17 pero aun asi tira error y noce que otra parte puede estar mal.

ecfisa 19-03-2012 16:47:22

Hola jomah.

Una consulta, ¿ Revisaste si el campo NUM_REG de tbl1 está declarado como autoincremental ?

Saludos.

jomah 20-03-2012 16:21:28

gracias ya lo he solucionado era que al ingresar los registros no estaban ordenados y tenian que insertarse en orden y por eso daba el error


La franja horaria es GMT +2. Ahora son las 07:34:54.

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