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)
-   -   Entender lo que pasa con mis datos (https://www.clubdelphi.com/foros/showthread.php?t=29814)

IVAND 02-02-2006 01:21:04

Entender lo que pasa con mis datos
 
:mad: Hola a todos

Estoy trabajando con deplhi 6,firebird 1.5.3 , componentes Fib , estoy trabajando en cache pero hoy he tenido un problema inmenso los datos se me han grabado en 2 tablas y no en las otras se supone que la transaccion debe grabar todo o no grabar nada que pudo haber pasado


De antemano

Gracias

Si alguien esta interesado en revisar el codigo puedo enviarselo estoy dispuesto a pagar si es posible pero eso errores no pueden darse en un aplicativo de Punto de venta

Casimiro Notevi 02-02-2006 08:53:48

Si insertas datos en una tabla... no pueden acabar insertados en otra :confused:

Y además es que das pocas pistas para poder ayudarte.

lucasarts_18 02-02-2006 15:31:00

Cita:

Empezado por Casimiro Notevi
Si insertas datos en una tabla... no pueden acabar insertados en otra :confused:

Lo que quiere decir ivan es que no se está respetando la transacción, es decir en la transacción tenía una grabación de tres tablas, por algún motivo falló y alcanzó a grabar en dos de tres tablas, por lo tanto, fallo el rollback o quizás no lo tiene definido en la transacción, creo que esto último podría ser. y como bien dice casimiro no estás dando muchas pistas.

Hasta Luego -

IVAND 02-02-2006 15:55:50

Gracias amigos por su interes

Les comento y envio el codigo

Código Delphi [-]
procedure TFpos.BitBtn1Click(Sender: TObject);
var
  Flag, Tipo_credito: Integer;
begin
  Flag := 0; Tipo_Credito := 0;
  if Neto_pagar.Value = 0 then
  begin
    JfMessageEx(CeoScreen, 'Verifique', 'System', 1, 'No hay valores para procesar verifique documento esta en blanco ', [bkiOK], BkiOk);
    Abort;
  end;
  if cliente.RecordCount = 0 then
  begin
    JfMessageEx(CeoScreen, 'Verifique', 'System', 2, 'Digite un cliente valido por favor', [bkiOK], BkiOk);
    Abort;
  end;
  if DataModule2.Redondear(Neto_pagar.Value, 2) - DataModule2.Redondear((Efectivo.Value + monto_credito.value + cheque.Value + Tcredito.Value + descuento.Value), 2) <> 0 then
  begin
    JfMessageEx(CeoScreen, 'Verifique', 'System', 2, 'Revise .. el valor pagado supera el valor a cancelar', [bkiOK], BkiOk);
    Abort;
  end;

  if (Neto_pagar.Value > 200) and (cliente.FieldByName('Ruc_cliente').AsString = '') then
  begin
    ShowMessage('Por autorización del S.R.I toda transacción que supero los 200 dolares debe registrar un RUC ... Agradecemos su comprensión');
    Abort;
  end;
// Localizamos los pagos y lo actualizamos
  if DataModule2.Pt_commitR.Active then
  else
    DataModule2.Pt_commitR.Active := True;
  try
    begin
      if monto_credito.Value > 0 then
      begin
        credito.Insert;
        credito.FieldByName('key_cliente').AsInteger := cliente.fieldbyname('key_cliente').AsInteger;
        credito.FieldByName('Emision').AsDateTime := DataModule2.FechaHOY.Value;
        credito.FieldByName('vence').AsDateTime := DataModule2.FechaHOY.Value + cliente.fieldbyname('plazo_credito').Value;
        credito.FieldByName('monto').AsCurrency := monto_credito.Value;
        credito.FieldByName('abono').AsCurrency := 0;
        credito.FieldByName('tp_cxc').AsString := 'F';
        credito.FieldByName('letra').AsInteger := 1;
        credito.FieldByName('key_relacion').AsInteger := cabeza.fieldByname('Key_cab_fac').AsInteger;
        credito.Post;
      end;
  // Barremos e insertamos en formpago
      Pagar.First;
      while not Pagar.EOF do
      begin
        if Pagar.FieldByName('monto').Value > 0 then
        begin
          forma_pago.Insert;
          forma_pago.FieldByName('Key_cab_fac').AsInteger := cabeza.fieldByname('key_cab_fac').Value;
          forma_pago.FieldByName('cod_pago').AsInteger := Pagar.fieldbyname('key_hijo').Value;
          forma_pago.FieldByName('key_plan_ctas').AsInteger := Pagar.fieldbyname('valor1').value;
          forma_pago.FieldByName('total').AsCurrency := Pagar.fieldByname('Monto').Value;
        end;
        Pagar.Next;
      end;
      forma_pago.Edit;
      forma_pago.Post;
      cabeza.Edit;
      if Tp_cab_fac.Value = 'N/V' then
      begin
        Contador_factura.Edit;
        Contador_facturaSECU_ND.Value := Contador_facturaSECU_ND.Value + 1;
        cabeza.FieldByName('Tp_cab_fac').Value := 'N/V';
        cabeza.FieldByName('Corr_factura').Value := Contador_facturaSECU_ND.Value;
        Contador_factura.Post;
      end
      else
      begin
        Contador_factura.Edit;
        cabeza.FieldByName('Tp_cab_fac').Value := 'FAC';
        Contador_facturaSECU_FAC.Value := Contador_facturaSECU_FAC.Value + 1;
        cabeza.FieldByName('Corr_factura').Value := Contador_facturaSECU_FAC.Value;
        Contador_factura.Post;
      end;
      cabeza.FieldByName('key_cliente').AsInteger := cliente.FieldByname('Key_cliente').Value;
      cabeza.FieldByName('Estado_fac').AsString := 'T';
      cabeza.FieldByName('Iva').AsInteger := DataModule2.Empresa.fieldByname('Iva').Value;
      cabeza.FieldByName('Subtotal').AsCurrency := (SUBNOIVA.Value + SUBIVA.Value);
      cabeza.FieldByName('Monto_iva').AsCurrency := IVA.Value;
      cabeza.FieldByName('Vneto').AsCurrency := (SUBNOIVA.Value + SUBIVA.Value) + iva.Value;
      N_documento := cabeza.fieldByname('Key_cab_fac').AsInteger;
      cabeza.FieldByName('Base_I').AsCurrency := SUBNOIVA.Value;
      cabeza.FieldByName('Base_I0').AsCurrency := SUBIVA.Value;
      cabeza.Post;
      DataModule2.puedocerrarTrans([cabeza, Detalle, forma_pago, Contador_factura, Credito], 'S');
      DataModule2.Pt_commitR.Commit;

      if DataModule2.Pt_commitR.Active then
      else
        DataModule2.Pt_commitR.Active := True;
      with BBajar_inventarios do
      begin
        ParamByName('key_cab_fac').AsInteger := N_documento;
        ParamByName('key_caja').AsInteger := DataModule2.Id_cajero;
        ExecProc;
      end;
      DataModule2.Pt_commitR.Commit;

      Tp_cab_fac.Value := 'N/V';
      Cform.BeginAssign;
      nvendido.Value := 0;
      Cod_cliente.Value := '';
      SUBIVA.Value := 0;
      SUBNOIVA.Value := 0;
      if monto_credito.Value > 0 then
        Tipo_credito := 1 else Tipo_credito := 0;
      IVA.Value := 0;
      Neto_pagar.Value := 0;
      Cform.EndAssign;
      Cod_cliente.Value := '0001'; // Consumidor final ;
      Iniciar; // Iniciamos todos los datos
      Cod_producto.SetFocus;
      Tp_cab_fac.Value := 'N/V';
      Contador.DataField := 'SECU_ND';
      Flag := 1;
  //ShowMessage('Factura grabada con exito');
    end
  except
    begin
      Flag := 0;
      JfMessageEx(CeoScreen, 'Error', 'System', 3, 'Error al momento de grabar verifique datos o contacte con su administrador', [bkiOK], BkiOk);
      DataModule2.Pt_commitR.Rollback;
    end;
//End
  end;
  if Flag = 1 then
   // si es credito el primer parametro es 'S'
    if Tipo_credito = 1 then
      imprimir_puerto('N/V', 'S', 'N')
    else
      imprimir_puerto('N/V', 'N', 'N');
  Cform.BeginAssign;
  Efectivo.Value := 0;
  cheque.Value := 0;
  monto_credito.Value := 0;
  Tcredito.Value := 0;
  descuento.Value := 0;
  Recibido.Value := 0;
  CAMBIO.Value := 0;
  Cform.EndAssign;
end;


Este es el codigo como uds ven esta con commit y rollback


La funcion PuedoCerrarTRansaccion la tome de un ejemplo de Ain Marteens si se pueden dar cuenta existen 2 commit el primero envuelve a las tablas que indicaba pero ademas al detalle de la factura que fue la que no grabo y forma_pago que grabo solo una parte , cada objeto esta en cacheUpdate=True

Casimiro Notevi 02-02-2006 21:43:24

No he tenido timpo todavía de examinar a fondo el código, aunque a simple vista he detectado un pequeñin "error":
Código:

// Localizamos los pagos y lo actualizamos
  if DataModule2.Pt_commitR.Active then    <------ falta código o sobra?
  else
    DataModule2.Pt_commitR.Active := True;  <------ siempre se ejecuta
  try
    begin                                  <------ a quién pertenece realmente?
      if monto_credito.Value > 0 then
      begin
        credito.Insert;
        credito.FieldByName('key_cliente').AsInteger := cliente.fieldbyname('key_cliente').AsInteger;
        credito.FieldByName('Emision').AsDateTime := DataModule2.FechaHOY.Value;
        credito.FieldByName('vence').AsDateTime := DataModule2.FechaHOY.Value + cliente.fieldbyname('plazo_credito').Value;
        credito.FieldByName('monto').AsCurrency := monto_credito.Value;
        credito.FieldByName('abono').AsCurrency := 0;
        credito.FieldByName('tp_cxc').AsString := 'F';
        credito.FieldByName('letra').AsInteger := 1;
        credito.FieldByName('key_relacion').AsInteger := cabeza.fieldByname('Key_cab_fac').AsInteger;
        credito.Post;
      end;
  // Barremos e insertamos en formpago

Quizás me he precipitado sin observarlo en detalle y esté bien :rolleyes:

IVAND 03-02-2006 01:05:32

Veras si no coloco esa instruccion la transaccion esta desactivada por eso pregunto so esta activa caso contrario la activo y eso de aquien pertenece no lo entiendo , te agradeceria me ayudaras a entender


Gracias

lucasarts_18 03-02-2006 14:23:53

Hola:

Creo que deberías modularizar mas tu código, el típico divide y vencerás y la verdad creo que te ayudará mucho para no tener estos problemas, mientras mas pequeñas sean tus piezas de software mas fácil es encontrar un error, viendo tú código pienso y creo que puedes optimizarlo mas en este sentido.

¿Has intentado debugear tu aplicación para ver si realmente hace el rollback..?:rolleyes:

Hasta Luego -


La franja horaria es GMT +2. Ahora son las 00:13:56.

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