Page 1 of 1

TIMER CANCELACION PROGRAMA

Posted: Wed Nov 18, 2020 2:46 pm
by pedroluis
Hola gente !
Estoy usando FWH 17.09.

El programa en cuestión es sobre la facturación electrónica (argentina).
Resulta que cuando ejecuto la siguiente sentencia: waitrun("fe.exe",0),
estoy mandando un formulario XML a un servidor de la AFIP (que es el agente de recaudación fiscal).
para que éste me autorice la factura solicitada y me devuelva el número de factura.

El problema es que a veces, tarda mucho tiempo en responder, ya sea por problemas de internet o por
otras razones, mientras tanto, cuando la espera es muy prolongada, el usuario se queda con esperando
sin saber que hacer.
Cuando pasa eso, y no siga esperando, le he asignado a la tecla F12 un bat 'cancelar.bat',
que cancela el programa 'FE.EXE' con TASKKILL.
La gran pregunta es:
¿ Existe alguna manera de usar un TIMER u otra cosa para poder controlar el tiempo de respuesta ?
Es decir, ¿ poder user un timer para que por ejemplo a los 10 segundos de no tener respuesta del servidor,
ejecute 'cancelar.bat' en forma automática sin hacer la cancelación manual con la tecla F12 ?

Muchas gracias !


[ENGLISH]
The program in question is about electronic invoicing (Argentina).
It turns out that when I run the following statement: waitrun ("fe.exe", 0),
I am sending an XML form to an AFIP server (which is the tax collection agent).
so that he authorizes me the requested invoice and returns the invoice number to me.

The problem is that sometimes, it takes a long time to respond, either due to internet problems or
other reasons, meanwhile, when the wait is very long, the user is left waiting
Without knowing what to do.
When that happens, and don't keep waiting, I have given the F12 key a bat 'cancel.bat',
which cancels the 'FE.EXE' program with TASKKILL.
The big question is:
Is there a way to use a TIMER or something else to be able to control the response time?
That is, can you use a timer so that, for example, after 10 seconds of not having a response from the server,
run 'cancel.bat' automatically without doing manual cancel with the F12 key?

Thanks a lot !

Re: TIMER CANCELACION PROGRAMA

Posted: Wed Nov 18, 2020 3:20 pm
by karinha
Muestra como estas haciendo, o intenta con este MsgRun()

Code: Select all

/*
    MsgWait y MsgRun no se muestran correctamente bajo 32 bits, el
    cálculo de coordenadas no es correcto pues el texto de cuerpo
    se recorta:

    Moises,

    En source\function\msgrun.prg hay que modificar estas líneas asi:

    Código:

    ACTIVATE DIALOG oDlg CENTER ;
             ON PAINT oDlg:Say( 11, 0, xPadC( oDlg:cMsg, nWidth ),,,, .T. )

    Antonio Linares
    www.fivetechsoft.com
*/

#Include "FiveWin.Ch"

//----------------------------------------------------------------------------//

// http://forums.fivetechsupport.com/viewtopic.php?f=3&t=34020

function MsgRun( cCaption, cTitle, bAction, oWndParent )  // MUDEI: 24/07/2017 - Joao

   LOCAL oDlg, nWidth, uReturn, aGrad

   /*
   DEFAULT cCaption := "Please, wait...",;
           bAction  := { || WaitSeconds( 1 ) }
   */
   DEFAULT cCaption := "Por Favor, Espere...", ;
           bAction  := { || WaitSeconds( 1 ) }

   // Modelos de gradient
   // aGrad := { { 0.5, CLR_HRED,CLR_WHITE},{ 0.5,CLR_WHITE,CLR_HRED } }

   // aGrad := { { 0.30, CLR_HRED, CLR_WHITE},{ 0.70, CLR_WHITE, CLR_HRED } }

   // gostei assim, mas gosto e que nem friozo... cada um tem o seu... kkkkkkk
   aGrad := { { 0.30, CLR_BLACK, CLR_YELLOW},{ 0.70, CLR_YELLOW, CLR_BLACK } }

   /* // assim, todos os dialogos assumem o gradiente, nao gostei.
      // Nao testei na window(janela) creio fique show().
   SetDlgGradient( { {0.30,CLR_HRED,CLR_WHITE}, {0.70,CLR_WHITE,CLR_HRED} } )
   */

   DEFINE FONT oFnt    NAME "Ms Sans Serif" SIZE 0, -12 BOLD
   DEFINE FONT oFont   NAME "Ms Sans Serif" SIZE 0, -14 BOLD

   IF cTitle == NIL
      // DEFINE DIALOG oDlg           ;
      DEFINE DIALOG oDlg GRADIENT aGrad           ; // usando gradient
             FROM 0,0 TO 3, Len( cCaption ) + 4   ;
             STYLE nOr( DS_MODALFRAME, WS_POPUP )
             /* ;
             COLORS CLR_BLACK, CLR_YELLOW */
   ELSE
      // DEFINE DIALOG oDlg           ;
      DEFINE DIALOG oDlg GRADIENT aGrad           ; // usando gradient
             FROM 0,0 TO 4, Max( Len( cCaption ), Len( cTitle ) ) + 4 ;
             TITLE cTitle ;
             STYLE DS_MODALFRAME
             /* ;
             COLORS CLR_BLACK, CLR_YELLOW */
   ENDIF

   oDlg:bStart := { || uReturn := Eval( bAction, oDlg ), oDlg:End(), SysRefresh() }
   oDlg:cMsg   := cCaption

   nWidth := oDlg:nRight - oDlg:nLeft

   SET FONT OF oDlg TO oFnt

   ACTIVATE DIALOG oDlg ON PAINT oDlg:SayText( oDlg:cMsg ) ;
            ON INIT oDlg:Center( oWndParent )

return uReturn

/* // antigo
Function MsgRun( cCaption, cTitle, bAction )

    Local oDlg, nWidth, oFnt, oFont, oBrush

    DEFAULT cCaption := "Por Favor, Espere...     ",;
            bAction  := { || WaitSeconds( 1 ) }

    DEFINE FONT oFnt    NAME "Ms Sans Serif" SIZE 0, -12 BOLD
    DEFINE FONT oFont   NAME "Ms Sans Serif" SIZE 0, -14 BOLD

    IF cTitle == Nil

        DEFINE DIALOG oDlg                          ;
               FROM 0,0 TO 3, Len( cCaption ) + 4   ;
               STYLE nOr( DS_MODALFRAME, WS_POPUP ) ;
               COLOR nRGB( 000, 000, 000 ), nRGB( 135, 206, 235 )

        oDlg:lHelpIcon := .F. // ok

     ELSE

        DEFINE DIALOG oDlg                                              ;
               FROM 0,0 TO 4, Max( Len( cCaption ), Len( cTitle ) ) + 4 ;
               TITLE cTitle                                             ;
               STYLE nOR( DS_MODALFRAME )                               ;
               COLOR nRGB( 000, 000, 000 ), nRGB( 135, 206, 235 )

        oDlg:lHelpIcon := .F. // ok

    ENDIF

    oDlg:bKeyDown = { | nKey | IF( nKey == VK_ESCAPE, ( oDlg:End() ), ) }

    oDlg:bStart := { || Eval( bAction, oDlg ), oDlg:End(), SysRefresh() }
    oDlg:cMsg   := cCaption

    nWidth := oDlg:nRight - oDlg:nLeft

    SET FONT OF oDlg TO oFnt

    //-> Modificado By Antonio Linares 26/10/2007 - Correcao de Bug
    ACTIVATE DIALOG oDlg CENTERED ;
             ON PAINT oDlg:Say( 11, 0, xPadC( oDlg:cMsg, nWidth ),,,, .T. )

    oFnt:End()
    oFont:End()

RETURN NIL
*/

//---------------------------------------------------------------------------//

Function WaitSeconds( nSecs )

    Local nStart := GetTickCount()

    DEFAULT nSecs := 1

    While GetTickCount() - nStart < ( 1000 * nSecs )
    Enddo

Return Nil

//---------------------------------------------------------------------------//

Function MsgWait( cCaption, cTitle, nSeconds )

    DEFAULT nSeconds := 4

Return MsgRun( cCaption, cTitle, { || WaitSeconds( nSeconds ) } )

//---------------------------------------------------------------------------//

Function StopUntil( bBlock )

    DO WHILE !Eval( bBlock )
       WaitMessage()
       SysRefresh()
    ENDDO

Return Nil

//---------------------------------------------------------------------------//
 
Regards, saludos.

Re: TIMER CANCELACION PROGRAMA

Posted: Wed Nov 18, 2020 3:43 pm
by karinha

Re: TIMER CANCELACION PROGRAMA

Posted: Thu Nov 19, 2020 12:23 pm
by puenteda
Pedro:

Con un cartel en pantalla, un for y un syswait() provocas la espera

Code: Select all

winexec( (wPathB)+"\"+cTexto,1)
SYSREFRESH()
MSGRUN("Esperando respuesta Servidor AFIP...","Conectando con AFIP",{|| RET:=FEejecuta(cticket,cDir,wLfact,cFormaPago,cEntregado,cVuelto,cAtiende,cNg,cIva,wIva21,wIva10,cNgIF21,cNgIF10,cCodTarjeta,cTarjeta,cNTarjeta,cCupon)})

STATIC Function FEejecuta(cTicket,cDir,wlFact,cFormaPago,cEntregado,cVuelto,cAtiende,cNg,cIva,wIva21,wIva10,cNgIF21,cNgIF10,cCodTarjeta,cTarjeta,cNTarjeta,cCupon)

.......

FOR I:=1 TO oApp:cFESeconds
SYSWAIT(1)
...
IF FILE('any2cae.csv')
FOR J:=1 TO 3
                                                                                       Result:=MEMOREAD('any2cae.csv')
IF LEN(RTRIM(memoline(result,254,1))) >= 85 .OR. MLCOUNT(result) > 1
EXIT
ENDIF

RET:=PROCESACAE(result,cFormaPago,cEntregado,cVuelto,cAtiende,cNg,cIva,wIva21,wIva10,cNgIF21,cNgIF10,cCodTarjeta,cTarjeta,cNTarjeta,cCupon)
...

                                        IF I == oApp:cFESeconds 
                                                    MSGSTOP('NO FUE POSIBLE LEER LA RESPUESTA FISCAL',oemtoansi('Verifique la conexi¢n a internet y los datos ingresados'))
                                                    RET:=.F.
                                        ENDIF
NEXT
...                                                                                 
Saludos,
Daniel Puente
Santa Cruz, Argentina

Re: TIMER CANCELACION PROGRAMA

Posted: Tue Dec 08, 2020 9:43 am
by pedroluis
Gracias Daniel !