FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Crear un Dialogo que muestre procesos en linea
Posts: 467
Joined: Fri Dec 09, 2005 12:41 AM
Crear un Dialogo que muestre procesos en linea
Posted: Tue Sep 08, 2015 05:07 PM
Buen Dia con todos.

Seguro que es sencillo...
Cuando tenemos un proceso largo, debemos mostrar al usuario un dialogo donde se vea su avance ademas que asi evitamos el famoso mensaje "programa no responde" del Windows, bueno este dialogo es algo mas que un simple oMeter...

Imaginense procesar una tabla de 200,000 registros de operaciones, donde alguno de ellos van aser Ajustados o recalculados..,

En este dialogo es necesario mostrar en que Nro de Documento va, el Cliente y periodo.. Hasta aqui no hay problema pero tambien debo de ir mostrando un LOG de los registros que fueron reajustados o recalculados en el mismo dialogo:

me dan una mano como ir mostrando este LOG en ese dialogo ?

1. Que tipo de objeto creo en el dialogo (Get When .f. o u Say ), como voy actualizado este Objeto ..
2. LLegado el momento como puedo Cancelar el proceso en cualquier momento, a mitad de camino..?? (antes usaba en nuestro querido clipper el Inkey() )


Aqui les muestro como lo voy haciendo
Code (fw): Select all Collapse
FUNCTION MSG_CLIENTES()
*********************  
LOCAL oDlg 
*Variables Locales para Definicoin de Orgigen de la data
*######################## CAMPOS DEL REGISTRO  && 9xx ID en recursos
LOCAL xTitulo   :="CALULANDO PRECIOS"      ,oTitulo
LOCAL xCLIENTE:="Iniciando..."      ,oIniciando
LOCAL xPERIODO :="Registro...0%"     ,oPERIODO
LOCAL xMensaje:="Mensaje  "         ,oMensaje

*Variables Locales para contrl del avanvce 
LOCAL oCLIENTE    ,XCLIENTE      := SPACE(40)           
LOCAL oPERIODO    ,XPERIODO       := SPACE(40)  
LOCAL oAVANCE     ,XAVANCE      := SPACE(40)     
LOCAL Msg_oVMen:={}

 DEFINE DIALOG oDlg RESOURCE "MSG_CLIENTES" TITLE "CONTROL DE CLIENTES "
 REDEFINE SAY oTitulo   VAR XTitulo  ID 601  OF oDlg WHEN .F.
 REDEFINE GET oCLIENTE      VAR XCLIENTE    ID 901  OF oDlg PICTURE "@!"   WHEN .F. UPDATE
 REDEFINE GET oPERIODO      VAR XPERIODO    ID 902  OF oDlg PICTURE "@!"   WHEN .F. UPDATE
 REDEFINE GET oAVANCE      VAR XAVANCE      ID 903  OF oDlg PICTURE "@!"   WHEN .F. UPDATE
 REDEFINE BUTTON ID 8011 OF oDlg ACTION RECALCULO(oDlg,oCliente,oPeriodo,oavance)    
 REDEFINE BUTTON ID 8012 OF oDlg ACTION (oDlg:End())       
  ACTIVATE DIALOG oDlg CENTERED 
RETURN .T.

FUNCTION RECALCULO(ocliente,oPeriodo) 
******************** FUNCION PARA PROCESAR LA TABLA
LOCAL XT:=0
LOCAL XN:=0
SELECT  OPERACIONES
GOTOP
XT:=OPERACIONES->LASTREC()
DO WHILE .NOT. EOF()
   *ACTUALIZO EL DIALOGO PARA EL CLIENTE 
   ocliente:ctext:=OPERACIONES->CLIENTE
   oPeriodo:ctext:=OPERACIONES->PERIODO
   oavance:ctext:=STR(XN/XT*100,4,0)+" % "
   sysrefresh()
   ....
   ....  CALCULOS
   
   OPERACIONES->skip()
ENDDO 
msginfo("termine...")
oDlg:end()
RETURN .T.


Gracias por adelantado

Lubin
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Crear un Dialogo que muestre procesos en linea
Posted: Tue Sep 08, 2015 05:19 PM

Lubin,

Con el código que has publicado te aparece el error "programa no responde" ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Crear un Dialogo que muestre procesos en linea
Posted: Tue Sep 08, 2015 06:02 PM
// Para Cancelar el proceso en cualquier momento...

Code (fw): Select all Collapse
   WHILE .NOT. EOF()

      INKEY( 0.1 )

      IF LASTKEY() = VK_ESCAPE

         IF MsgNoYes( OemToAnsi( "Atencion...              " )+CRLF+ ;
                                                              +CRLF+ ;
                      OemToAnsi( "Salir realmente?         " )+CRLF+ ;
                                                              +CRLF+ ;
                      OemToAnsi( "<S>i                     " )+CRLF+ ;
                      OemToAnsi( "<N>o                     " ),      ;
                      OemToAnsi( "Problemas?               " ) ) = .F.

            SELECT ...

            RETURN( .F. )

         ENDIF

      ENDIF


      *ACTUALIZO EL DIALOGO PARA EL CLIENTE
      ocliente:ctext:=OPERACIONES->CLIENTE
      oPeriodo:ctext:=OPERACIONES->PERIODO
      oavance:ctext:=STR(XN/XT*100,4,0)+" % "

      sysrefresh()

      ....
      ....  CALCULOS

   
      OPERACIONES->skip()

   ENDDO


Saludos

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 467
Joined: Fri Dec 09, 2005 12:41 AM
Re: Crear un Dialogo que muestre procesos en linea
Posted: Tue Sep 08, 2015 06:35 PM

Buen dia Antonio...

El codigo publicado me funciona bien,,, mas bien.. si NO LO HAGO ASI en un proceso largo me apararece ese famoso mensaje "EL PROGRAMA NO RESPONDE", aclarando la consulta es que a ello quiero agregar un mensaje tipo Log.. que permita ver un listado que muestre los errores u ocurrencias del proceso, ello en el mismo dialogo

Gracias por tu atencion Antonio
Lubin

Posts: 467
Joined: Fri Dec 09, 2005 12:41 AM
Re: Crear un Dialogo que muestre procesos en linea
Posted: Tue Sep 08, 2015 06:38 PM

Gracias Karina,
no sabia que la funcion lastkey() funcionaba en Fivewin,,,
voy a probarla..

Saludos
Lubin

Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Crear un Dialogo que muestre procesos en linea
Posted: Tue Sep 08, 2015 06:39 PM
Para actualizar...


Code (fw): Select all Collapse
   REDEFINE BUTTON oRepassa  ID 701 OF oDlg                         ;
            ACTION ( OMETERDTCPA ( DbEstoque, cCodiIni, cCodiFin ), ;
                                   oDlg:End() )  CANCEL


FUNCTION OMETERDTCPA( DbEstoque, cCodiIni, cCodiFin )

    LOCAL bAction

    bAction = { | oMeter, oText, oDlg, lEnd |                              ;
                  GRABAR( oMeter, oText, oDlg, @lEnd, DbEstoque, cCodiIni, ;
                          cCodiFin ) }

    MsgMeter( bAction, "Atualizando, Aguarde! ", " Aguarde Por Favor!" )

RETURN NIL

//-------------------------------------------------------------------------//
// Repassar os Pre‡os dos Produtos Para o Banco de Dados
//-------------------------------------------------------------------------//

FUNCTION GRABAR( oMeter, oText, oDlg, lEnd, DbEstoque )

    FIELD CODIGO, VALOR, PRCUSTO, PRECO_2, PRECO_3, PRECO_4, VALOR_ATAC

    LOCAL nPorc, nValor, nValor2, nValor3, cCod
    LOCAL nPreco_2, nPreco_3, nPreco_4
    LOCAL VlPrec_2, VlPrec_3, VlPrec_4
    LOCAL SomaPr_2, SomaPr_3, SomaPr_4
    LOCAL nAtaca_1, VlPrAt_1, SomaAt_1

    MEMVAR cCodiIni  // CàDIGO INICIAL
    MEMVAR cCodiFin  // CàDIGO FINAL
    MEMVAR nPorcent  // PORCENTAGEM A APLICAR

    IF NetUse( "TABPROD", .F. )  // Exclusive - Para Poder Repassar
        OrdListAdd( "TABPROD", "CODIGO", "DESCRICAO" )
        DATABASE DbEstoque
        DbEstoque:Load()
        DbEstoque:SetBuffer( .T. )    // Assim, .T. a Op‡Æo (Cancelar) Funciona.
     ELSE
        MsgStop( "Banco de Dados Bloqueado", "Cuidado!" )
        RETURN NIL
    ENDIF

    SELECT ( DbEstoque:cAlias )
    GO TOP
    SET ORDER TO 1

    nPorc := nPorcent / 100

    WHILE Codigo >= cCodiIni .AND. ;
          Codigo <= cCodiFin .AND. .NOT. EOF()

        SYSREFRESH()

        IF EOF()
           EXIT
        ENDIF

        nVALOR  := VALOR
        nVALOR2 := nVALOR * nPORC
        nVALOR3 := nVALOR + nVALOR2

        NPRECO_2 := PRECO_2
        VLPREC_2 := NPRECO_2 * nPORC
        SOMAPR_2 := NPRECO_2 + VLPREC_2

        NPRECO_3 := PRECO_3
        VLPREC_3 := NPRECO_3 * nPORC
        SOMAPR_3 := NPRECO_3 + VLPREC_3

        NPRECO_4 := PRECO_4
        VLPREC_4 := NPRECO_4 * nPORC
        SOMAPR_4 := NPRECO_4 + VLPREC_4

        NATACA_1 := VALOR_ATAC
        VLPRAT_1 := NATACA_1 * NPORC
        SOMAAT_1 := NATACA_1 + VLPRAT_1

        IF !EOF()
           REPLACE VALOR      WITH NVALOR3
           REPLACE PRECO_2    WITH SOMAPR_2
           REPLACE PRECO_3    WITH SOMAPR_3
           REPLACE PRECO_4    WITH SOMAPR_4
           REPLACE VALOR_ATAC WITH SOMAAT_1
        ENDIF

        DBSKIP()

        //--- Esta linha e opcional, se ficar lento pode remove-la.
        oText:SetText( "Atualizando Registro:  "        +             ;
                        Alltrim( STR( Recno(), 6, 0 ) ) + "  de:  " + ;
                        Alltrim( STR( Recc(), 6, 0 ) )  + ", Aguarde..." )

        oMeter:Set( Recno() )

        SysRefresh()

        CursorWait()

    ENDDO

RETURN NIL



João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341

Continue the discussion