Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error Raro, No encuentro Causa (https://www.clubdelphi.com/foros/showthread.php?t=89121)

adripugliesso 29-09-2015 14:11:23

Error Raro, No encuentro Causa
 
Tengo una aplicacion que tiene el sig. procedure:

Código Delphi [-]
procedure TfmFacturar.btnBuscaNroClick(Sender: TObject);
var
  s: FERecuperaLastCbteResponse;
  FEAuth : FEAuthRequest;
  x : Integer;
  WS: ServiceSoap;
  i : integer;
begin

  screen.Cursor := crHourGlass;

  
    WS := GetServiceSoap(false,'', httprio2);

    //WS := GetServiceSoap;


  FEAuth  := FEAuthRequest.Create;
  s:= FERecuperaLastCbteResponse.Create;
  try
    FEAuth.Token := token;
    FEAuth.Sign  := sign;
    FEAuth.Cuit  := cuit;

    s := WS.FECompUltimoAutorizado(FEAuth, strtoint(edtPuntoVta.Text), dbTipoCbte.KeyValue);


    //carga numero de factura
    edtNroFact.Text := INTTOSTR(s.CbteNro+1);
    CreaNumeroFactura;

      if (Length(s.Errors) > 0) then
      showmessage(s.Errors[0].Msg);

  finally

    //habilita Agregar Items
    GItems.Enabled          := true;
    btnAgregaItem.Enabled   := true;
    edtSubtotal.Enabled     := true;
    edtIva105.Enabled       := true;
    edtIva21.Enabled        := true;
    edtPercIIBB.Enabled     := true;
    edtPercIVA.Enabled      := true;
    edtTotal.Enabled        := true;
    btnSolicitaCae.Enabled  := true;


    i:= dbTipoCbte.KeyValue;
    if (i IN [2,3,7,8]) then
    begin
      btnLiquidoProd.Enabled  := false;
      btnImpRemito.Enabled    := false;
      edtRemitos.Enabled      := false;
      edtRemitos.Text         := '9999';
    end
    else
    begin
      btnLiquidoProd.Enabled  := true;
      btnImpRemito.Enabled    := true;
      edtRemitos.Enabled      := true;
    end;



    ActualizaListaItems;

    LCod.Caption := '0'+INTTOSTR(dbTipoCbte.KeyValue);

    FEAuth.Free;
    s.Free;
  end;

  screen.Cursor := crDefault;


end;

El problema que tengo es que cuando compilo y genero el ejecutable al usar este procedure tira error de "Access Violation at address 00406780", entonces si yo entro al codigo y cambio la linea

Código Delphi [-]
WS := GetServiceSoap(false,'', httprio2);

por

Código Delphi [-]
WS := GetServiceSoap;

Complio y ejecuto funiona perfecto sin error. Luego al realizar un cambio en la aplicacion y volvar a compilar y ejecutar vuelve a tirar el error de Access Violation entonces tengo que volver a entrar al codigo y cambiar nuevamente la linea esa de codigo y ponerla como estaba, de esa manera no tira el error.

En Conclucion para que este proceso no tire error cada vez que compilo tengo que entrar y cambiar una linea por otra, alguien sabe a que se debe ese error??

Gracias.-

AgustinOrtu 29-09-2015 14:46:35

Creo que es porque la AFIP te deniega la conexion si ya pediste acceso (token y sign). Parece ser que el servidor no esta preparado para que constantemente se lo cascotee pidiendo token :)

En realidad lo que esta pasando entre que cambias la linea y recompilas es darle "respiro"

Hace un tiempo me paso algo similar (uso PyAFipWS) y la unica solucion que encontre fue reutilizar el ticket de aceso, guardando en un archivo el token y sign

adripugliesso 29-09-2015 14:48:27

No, no es eso porque uso siempre el mismo token y sing, salvo que se me venza y recién ahi solicito el nuevo. Por 24hs uso siempre el mismo Token y Sing.

orodriguezca 29-09-2015 19:59:50

Solo por probar, en lugar de

Código Delphi [-]
   s := WS.FECompUltimoAutorizado(FEAuth, strtoint(edtPuntoVta.Text), dbTipoCbte.KeyValue);

utiliza

Código Delphi [-]
  s := GetServiceSoap(false,'', httprio2).FECompUltimoAutorizado(FEAuth, strtoint(edtPuntoVta.Text), dbTipoCbte.KeyValue);

por otra parte observa que el objeto que se está creando en
Código Delphi [-]
  s:= FERecuperaLastCbteResponse.Create;

se pierde (queda sin apuntador) cuando se invoca el getServiceSoap.

adripugliesso 29-09-2015 20:54:56

Como es eso de que queda sin apuntador??

orodriguezca 29-09-2015 21:32:14

"FERecuperaLastCbteResponse.Create" crea un objeto de la clase FERecuperaLastCbteResponse y "s" está mirando (apuntando) hacia la posición de memoria en la que esta ese objeto recien creado. Posteriormente estas haciendo s := WS.FECompUltimoAutorizado(FEAuth, strtoint(edtPuntoVta.Text), dbTipoCbte.KeyValue), esto último hace que "s" quede mirando hacia el objeto retornado por WS.FECompUltimoAutorizado, pero el objeto creado por "FERecuperaLastCbteResponse.Create" seguirá estando en memoria pero sin que nadie lo pueda accesar, por lo que no podrá ser liberado.

Lo anterior creo que no tiene nada que ver con el error que está ocurriendo en la aplicación, es una simple apreciación sobre el código mostrado. Espero haberme explicado.


La franja horaria es GMT +2. Ahora son las 12:48:17.

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