Opção pra trocar vários campos

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

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

Opção pra trocar vários campos

Mensagem por JoséQuintas »

Acabo de usar aqui, e achei interessante:
Quando é troca direta, mais fácil.

Código: Selecionar todos

   DO WHILE ! Eof()
      RecLock()
      FOR EACH aCampo IN { ;
            { "CPCODIGO", "A_CODIGO" }, ;
            { "CPNOME",   "A_NOME" }, ;
            { "CPGRUPO",  "A_GRUPO" }, ;
            { "CPTIPO",   "A_TIPO" }, ;
            { "CPGRAU",   "A_GRAU" }, ;
            { "CPSDANT",  "A_SDANT" }, ;
            { "CPUPDATE", "ALTERADA" }, ;
            { "CPCTAREF", "PLCTASRF" }, ;
            { "CPINFINC", "A_INFINC" }, ;
            { "CPINFALT", "A_INFALT" } }
         IF Empty( &( "jpctplano->" + aCampo[ 1 ] ) )
            REPLACE &( "jpctplano->" + aCampo[ 1 ] ) WITH &( "jpctplano->" + aCampo[ 2 ] )
         ENDIF
      NEXT
      FOR EACH aCampo IN { ;
            { "CPREDUZ",  "A_REDUZ" }, ;
            { "CPCCUSTO", "A_CCUSTO" }, ;
            { "CPCTAADM", "A_CTAADM" } }
         IF Empty( &( "jpctplano->" + aCampo[ 1 ] ) )
            REPLACE &( "jpctplano->" + aCampo[ 1 ] ) WITH Val( &( "jpctplano->" + aCampo[ 2 ] ) )
         ENDIF
      NEXT
      SKIP
   ENDDO
   CLOSE DATABASES
Só fiquei na dúvida sobre a macro.
Poderia ter usado FieldPut( FieldNum( aCampo[ 1 ] ), FieldGet( FieldNum( aCampo[ 2 ] ) ) ).

Acho que é conhecido de todos.
FieldPut() é pra gravar, precisa do número do campo
FieldGet() é pra ler, precisa do número do campo
FieldNum() é o número do campo, para a string fornecida.

Neste caso, alguns campos continuam do mesmo tipo, mas outros mudaram de caractere para numérico.
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

Opção pra trocar vários campos

Mensagem por JoséQuintas »

Tinha esquecido, tem mais 192 campos:

Aqui fica mais visível a macro encima de um resultado de expressão.
Sendo encima do resultado, a variável não precisa ser PRIVATE ou PUBLIC.

Código: Selecionar todos

      FOR nCont = 1 TO CONTABIL_MESMAX
         IF Empty( &( "jpctplano->clDeb" + StrZero( nCont, 2 ) ) )
            REPLACE &( "jpctplano->clDeb" + StrZero( nCont, 2 ) ) WITH ;
               &( "jpctplano->a_deb" + StrZero( nCont, 2 ) )
         ENDIF
         IF Empty( &( "jpctplano->clCre" + StrZero( nCont, 2 ) ) )
            REPLACE &( "jpctplano->clCre" + StrZero( nCont, 2 ) ) WITH ;
               &( "jpctplano->a_Cre" + StrZero( nCont, 2 ) )
         ENDIF
      NEXT
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

Opção pra trocar vários campos

Mensagem por JoséQuintas »

Mesmo assim, vai do gosto pessoal:

Código: Selecionar todos

      FOR nCont = 1 TO CONTABIL_MESMAX
         xValue := StrZero( nCont, 2 )
         IF Empty( &( "jpctplano->clDeb" + xValue ) )
            REPLACE &( "jpctplano->clDeb" + xValue ) WITH &( "jpctplano->a_deb" + xValue )
         ENDIF
         IF Empty( &( "jpctplano->clCre" + xValue ) )
            REPLACE &( "jpctplano->clCre" + xValue ) WITH &( "jpctplano->a_Cre" + xValue )
         ENDIF
      NEXT
Mais fácil olhar o fonte, entender, e fazer manutenção depois.
Só comparar os dois fontes que fica visível como o segundo está mais "claro" para o programador.

Nota:
Ao invés de fazer 6 contas fez só uma, pra obter StrZero( nCont, 2 )
Nem sei se isso faz diferença, apenas considerei o fonte ficar mais claro.
E de quebra evita 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

Opção pra trocar vários campos

Mensagem por JoséQuintas »

Vixe, já deu pra perceber aí, que devido as mudanças, tô fazendo uma confusão geral.
Nessa rotina adicional, coloquei CLxxx, mas é CPxxx

Também dá pra perceber a padronização.
Antes era A_xxx, numa época pensei em chamar PLxxx, e agora vai ser CPxxx

PL seria a inicial de plano de contas, agora decidi tudo de contabilidade começando com C.
CH - históricos padrão
CL - lotes
CL - lançamentos padrão
CP - plano de contas

Ainda falta alterar o contábil, de DIxxx pra CTxxx, DI era de livro diário....

E só agora percebi que repeti o CL kkkkk
Lá vou eu alterar tudo de novo...
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