Clipper On Line • Ver Tópico - DESVANTAGENS DE USAR MACRO

DESVANTAGENS DE USAR MACRO

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

Moderador: Moderadores

 

DESVANTAGENS DE USAR MACRO

Mensagempor Abel » 19 Set 2019 14:05

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 &

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 &)

   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"

rA_CORLETRA=LEINI([cor impressao],[cor],[&pA_CSYSTEMB])
Abel
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 310
Data de registro: 14 Mar 2012 13:16
Cidade/Estado: sao paulo / sp
Curtiu: 1 vez
Mens.Curtidas: 2 vezes

DESVANTAGENS DE USAR MACRO

Mensagempor JoséQuintas » 19 Set 2019 19:01

É 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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DESVANTAGENS DE USAR MACRO

Mensagempor JoséQuintas » 19 Set 2019 19:10

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DESVANTAGENS DE USAR MACRO

Mensagempor JoséQuintas » 19 Set 2019 19:15

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)

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DESVANTAGENS DE USAR MACRO

Mensagempor JoséQuintas » 19 Set 2019 19:54

Com tudo local, está livre pra mexer nas variáveis, e no próprio fonte.

#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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

DESVANTAGENS DE USAR MACRO

Mensagempor JoséQuintas » 19 Set 2019 19:58

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 10 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro