Página 1 de 1

DESVANTAGENS DE USAR MACRO

Enviado: 19 Set 2019 14:05
por Abel
Olá pessoal,
estava vendo alguns posts sobre macro, e reparei que eu uso muitas macros para abrir arquivos dbf, para ler arquivos .ini
vi alguns comentários que deve-se evitar ao máximo usar macros, Afinal qual a desvantagem de usa-las ?
segue algumas rotinas com uso de macros que utilizo.

função usada para abrir arquivos em modo shared ou exclusivo com varias macros &

Código: Selecionar todos

FUNCTION NET_USE
PARAMETERS rA_CAM,rA_ARQ,rA_ALIAS,rL_MODO,rN_TIMEWAIT
PRIVATE rL_RETORNO
SAVE SCREEN TO rT_TELM2
//
DO WHILE .T.
   IF rL_MODO = .T.
      USE &rA_CAM\&rA_ARQ VIA "DBFCDX" ALIAS &rA_ALIAS EXCLUSIVE // Modo exclusivo
   ELSE
      TRY  
        USE &rA_CAM\&rA_ARQ VIA "DBFCDX" ALIAS &rA_ALIAS SHARED NEW // Modo nao exclusivo
      CATCH
        INKEY(3)
        TRY
           USE &rA_CAM\&rA_ARQ VIA "DBFCDX" ALIAS &rA_ALIAS SHARED NEW // Modo nao exclusivo
        CATCH
           ALERT2('VERMELHO','PROBLEMAS PARA ACESSAR{'+rA_ARQ+'}, O SISTEMA SERA ENCERRADO.')       
           CLOSE DATA   
           QUIT 
        END
      END          
   ENDIF
   //   
   IF NETERR()
      MENNEW('CORADV','','Arquivo &rA_ALIAS em uso, aguardando liberaçâo, ESC cancela ')
   ELSE
      rL_RETORNO=.T.
      EXIT
   ENDIF
   INKEY(rN_TIMEWAIT)
   RESTORE SCREEN FROM rT_TELM2
   IF LASTKEY() = 27
      rL_RETORNO=.F.
      MENNEW('CORADV','','Arquivo &rA_ALIAS em uso, aguardando liberaçâo, ESC cancela ')
      CLOSE DATA  // EVITA QUE QUANDO DER EM USO DEIXE ALGUM ARQUIVO ABERTO
      EXIT
   ENDIF
ENDDO
RETURN rL_RETORNO

para abrir o dbf e o indice uso assim: (tambem utilizo macro &)

Código: Selecionar todos

   SELECT 0
   IF !NET_USE(pA_CAM,'PACOTE','PACOTE',.T.,pN_TIMEWAIT)
      RETURN
   ENDIF
   SET INDEX TO &pA_CAM\PACOTCDX 
   SET  ORDER TO 2
outro exemplo é para ler arquivos .ini que não estão na pasta local
pA_CSYSTEMB="arquivos\cores.ini"

Código: Selecionar todos

rA_CORLETRA=LEINI([cor impressao],[cor],[&pA_CSYSTEMB])

DESVANTAGENS DE USAR MACRO

Enviado: 19 Set 2019 19:01
por JoséQuintas
É criado todo um ambiente pra executar as macros.
Uma variável pode nem existir nesse ambiente e gerar erro em execução.
De um modo geral, macros acabam não podendo ser validadas pelo compilador.
E macro geralmente é mais lenta do que o equivalente sem macro.

E o principal: Nem sempre a macro pode retornar o resultado esperado, mas aí já vai ser difícil encontrar um exemplo prático disso.

DESVANTAGENS DE USAR MACRO

Enviado: 19 Set 2019 19:10
por JoséQuintas
Adicione mais um aí:

Macro não existe em nenhuma outra linguagem de programação.
Se ficar acostumado com macro, vai se perder com qualquer coisa.

E mais outro:
Se quiser que o compilador te ajude a encontrar problemas.... vai complicar.
test.prg:4: warning W0001 Ambiguous reference 'RT_TELM2'
test.prg:7: warning W0001 Ambiguous reference 'RL_MODO'
test.prg:8: warning W0001 Ambiguous reference 'RA_ALIAS'
test.prg:10: error E0020 Incomplete statement or unbalanced delimiters
test.prg:11: warning W0001 Ambiguous reference 'RA_ALIAS'
test.prg:12: error E0020 Incomplete statement or unbalanced delimiters
test.prg:14: error E0020 Incomplete statement or unbalanced delimiters
test.prg:15: warning W0001 Ambiguous reference 'RA_ALIAS'
test.prg:16: error E0020 Incomplete statement or unbalanced delimiters
test.prg:17: warning W0001 Ambiguous reference 'RA_ARQ'
test.prg:22: error E0010 ENDIF does not match IF
test.prg:27: warning W0001 Ambiguous reference 'RL_RETORNO'
test.prg:28: error E0018 EXIT statement with no loop in sight
test.prg:30: warning W0001 Ambiguous reference 'RN_TIMEWAIT'
test.prg:31: warning W0001 Ambiguous reference 'RT_TELM2'
test.prg:33: warning W0001 Ambiguous reference 'RL_RETORNO'
test.prg:36: error E0018 EXIT statement with no loop in sight
test.prg:38: error E0011 ENDDO does not match WHILE
test.prg:39: warning W0001 Ambiguous reference 'RL_RETORNO'
8 erros

DESVANTAGENS DE USAR MACRO

Enviado: 19 Set 2019 19:15
por JoséQuintas
Se quiser alterar as variáveis pra LOCAL, com macro já atrapalha.
É o compilador avisando de possíveis problemas com macro.
(Desprezando por enquanto os erros de TRY/CATCH)

Código: Selecionar todos

FUNCTION NET_USE( ra_Cam, ra_Arq, ra_Alias, rl_Modo, rn_TimeWait )

   LOCAL cTelaSalva, rl_Retorno

   SAVE SCREEN TO cTelaSalva
   DO WHILE .T.
      IF rL_MODO = .T.
         USE &rA_CAM\&rA_ARQ VIA "DBFCDX" ALIAS &rA_ALIAS EXCLUSIVE // Modo exclusivo
      ELSE
         TRY
            USE &rA_CAM\&rA_ARQ VIA "DBFCDX" ALIAS &rA_ALIAS SHARED NEW // Modo nao exclusivo
         CATCH
            Inkey(3)
            TRY
               USE &rA_CAM\&rA_ARQ VIA "DBFCDX" ALIAS &rA_ALIAS SHARED NEW // Modo nao exclusivo
            CATCH
               ALERT2('VERMELHO','PROBLEMAS PARA ACESSAR{'+rA_ARQ+'}, O SISTEMA SERA ENCERRADO.')
               CLOSE DATABASES
               QUIT
            END
         END
      ENDIF
      IF NetErr()
         MENNEW('CORADV','','Arquivo &rA_ALIAS em uso, aguardando liberaçâo, ESC cancela ')
      ELSE
         rL_RETORNO=.T.
         EXIT
      ENDIF
      Inkey(rN_TIMEWAIT)
      RESTORE SCREEN FROM cTelaSalva
      IF LastKey() = 27
         rL_RETORNO=.F.
         MENNEW('CORADV','','Arquivo &rA_ALIAS em uso, aguardando liberaçâo, ESC cancela ')
         CLOSE DATA  // EVITA QUE QUANDO DER EM USO DEIXE ALGUM ARQUIVO ABERTO
         EXIT
      ENDIF
   ENDDO

   RETURN rL_RETORNO
test.prg:9: error E0042 Macro of declared symbol '&rA_CAM\&rA_ARQ'

test.prg:11: error E0020 Incomplete statement or unbalanced delimiters

test.prg:12: error E0042 Macro of declared symbol '&rA_CAM\&rA_ARQ'

test.prg:15: error E0020 Incomplete statement or unbalanced delimiters

test.prg:16: error E0042 Macro of declared symbol '&rA_CAM\&rA_ARQ'

test.prg:23: error E0010 ENDIF does not match IF

test.prg:25: error E0042 Macro of declared symbol 'Arquivo &rA_ALIAS em uso, aguardando liberaþÔo, ESC cancela '

test.prg:28: error E0018 EXIT statement with no loop in sight

test.prg:34: error E0042 Macro of declared symbol 'Arquivo &rA_ALIAS em uso, aguardando liberaþÔo, ESC cancela '

test.prg:36: error E0018 EXIT statement with no loop in sight

test.prg:38: error E0011 ENDDO does not match WHILE
11 erros

DESVANTAGENS DE USAR MACRO

Enviado: 19 Set 2019 19:54
por JoséQuintas
Com tudo local, está livre pra mexer nas variáveis, e no próprio fonte.

Código: Selecionar todos

#include "inkey.ch"

FUNCTION NET_USE( cPath, cFileName, cAlias, lExclusivo, nTimeWait )

   LOCAL cTela, lRetorno := .F., cFile, nKey := 0, nTry := 0

   cFile := cPath + '\' + cFileName

   SAVE SCREEN TO cTela
   DO WHILE nKey != K_ESC
      BEGIN SEQUENCE WITH __BreakBlock()
         IF lExclusivo
            USE ( cFile ) VIA "DBFCDX" ALIAS ( cAlias ) EXCLUSIVE // Modo exclusivo
         ELSE
            USE ( cFile ) VIA "DBFCDX" ALIAS ( cAlias ) SHARED NEW // Modo compartilhado
         ENDIF
         lRetorno := ! NetErr()
      ENDSEQUENCE
      IF lRetorno
          EXIT
      ENDIF
      nTry += 1
      IF nTry > 5
         EXIT
      ENDIF
      MENNEW( 'CORADV', '', 'Tentando abrir ' + cAlias + ', ESC cancela ' )
      Inkey( nTimeWait )
      RESTORE SCREEN FROM cTela
   ENDDO
   IF ! lRetorno
      MENNEW( 'CORADV', '', 'Problemas com arquivo ' + cAlias )
      CLOSE DATABASES
      QUIT
   ENDIF

   RETURN lRetorno

DESVANTAGENS DE USAR MACRO

Enviado: 19 Set 2019 19:58
por JoséQuintas
Só uma dúvida:
Não precisaria o NEW também no modo exclusivo?

Editado: viajei em falar sobre índices kkkk