DESVANTAGENS DE USAR MACRO

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

DESVANTAGENS DE USAR MACRO

Mensagem 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])
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DESVANTAGENS DE USAR MACRO

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DESVANTAGENS DE USAR MACRO

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DESVANTAGENS DE USAR MACRO

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DESVANTAGENS DE USAR MACRO

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DESVANTAGENS DE USAR MACRO

Mensagem por JoséQuintas »

Só uma dúvida:
Não precisaria o NEW também no modo exclusivo?

Editado: viajei em falar sobre índices kkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder