Clipper On Line • Ver Tópico - Opção pra trocar vários campos
Página 1 de 1

Opção pra trocar vários campos

MensagemEnviado: 12 Ago 2020 18:45
por JoséQuintas
Acabo de usar aqui, e achei interessante:
Quando é troca direta, mais fácil.

   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.

Opção pra trocar vários campos

MensagemEnviado: 12 Ago 2020 18:56
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.

      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

Opção pra trocar vários campos

MensagemEnviado: 12 Ago 2020 19:00
por JoséQuintas
Mesmo assim, vai do gosto pessoal:

      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....

Opção pra trocar vários campos

MensagemEnviado: 12 Ago 2020 19:22
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...