Clipper On Line • Ver Tópico - Meu modo de trabalho
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Meu modo de trabalho

27 Ago 2020 12:30

Até uma simples tabela de mensagens de legislação...

Código:
   WITH OBJECT cnSQL
      // jpdecreto

      IF AppVersaoDBFAnt() < 20200822
         IF :TableExists( "JPDECRET" )
            :ExecuteCmd( "RENAME TABLE JPDECRET TO JPDECRETO" )
         ENDIF
      ENDIF
      IF AppVersaoDBFAnt() < AppVersaoDBF()
         SayScroll( "JPDECRETO.SQL" )
         :ExecuteCmd( JPDECRETOcreateSQL() )
      ENDIF
      IF AppVersaoDBFAnt() < 20200302
         IF :FieldExists( "DENUMLAN", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO DROP COLUMN DEID, DROP PRIMARY KEY, " + ;
               "CHANGE COLUMN DENUMLAN IDDECRETO INT(11) NOT NULL AUTO_INCREMENT, " + ;
               "ADD PRIMARY KEY ( IDDECRETO )" )
         ENDIF
         :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN IDDECRETO IDDECRETO INT(11) NOT NULL AUTO_INCREMENT" )
         IF :IndexExists( "IDXEDICFG", "JPEDICFG" )
            :ExecuteCmd( "ALTER TABLE JPEDICFG DROP INDEX IDXEDICFG" )
         ENDIF
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN IDDECRETO IDDECRETO INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200822
         IF ! :FieldExists( "DETEXTO", "JPDECRETO" )
            IF :FieldExists( "DEDESCRICAO", "JPDECRETO" )
               :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCRICAO DETEXTO VARCHAR(800) NOT NULL DEFAULT ''" )
            ELSE
               :ExecuteCmd( "ALTER TABLE JPDECRETO ADD COLUMN DETEXTO VARCHAR(800) NOT NULL DEFAULT ''" )
            ENDIF
         ENDIF
         IF :FieldExists( "DEDESCR1", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR1 DEDESCR1 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR2 DEDESCR2 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR3 DEDESCR3 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR4 DEDESCR4 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR5 DEDESCR5 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "UPDATE JPDECRETO SET DETEXTO = TRIM( CONCAT_WS( ' ', DEDESCR1, DEDESCR2, DEDESCR3, DEDESCR4, DEDESCR5 ) )" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO DROP COLUMN DEDESCR1, DROP COLUMN DEDESCR2," + ;
               " DROP COLUMN DEDESCR3, DROP COLUMN DEDESCR4, DROP COLUMN DEDESCR5" )
         ENDIF
         IF :IndexExists( "NOME", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO DROP INDEX NOME" )
         ENDIF
         IF :FieldExists( "DENOME", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DENOME DEDESCRICAO VARCHAR(50) NOT NULL DEFAULT ''" )
         ENDIF
      ENDIF
   ENDWITH


E na postagem vi que JPEDICFG tá aí no meio, mas não deveria estar.

Meu modo de trabalho

31 Ago 2020 12:38

Tô mudando tudo de novo.
Tinha alterado DESCRI pra DESCRICAO.

Mas pensando direito.... porque descrição?

código do produto, descrição do produto
código do histórico (contábil), descrição do histórico (contábil)
código do vendedor, descrição do vendedor.
código do decreto, descrição do decreto.

Acho que isso NÃO é descrição.

código do produto, NOME
código do histórico, TEXTO
código do vendedor, NOME
código do decreto, TEXTO

E lá comecei a alterar tudo de novo.

Alterar é fácil, difícil é depois acostumar aos novos nomes....

Meu modo de trabalho

31 Ago 2020 13:18

Também faço isso as vezes.

Meu modo de trabalho

31 Ago 2020 19:59

Por conta disso, este ficou meio complicado.....

Código:
   WITH OBJECT cnSQL
      // jpdecreto

      IF AppVersaoDBFAnt() < 20200822
         IF :TableExists( "JPDECRET" )
            :ExecuteCmd( "RENAME TABLE JPDECRET TO JPDECRETO" )
         ENDIF
      ENDIF
      IF AppVersaoDBFAnt() < AppVersaoDBF()
         SayScroll( "JPDECRETO.SQL" )
         :ExecuteCmd( ;
            "CREATE TABLE IF NOT EXISTS JPDECRETO ( " + ;
            "IDDECRETO INT(11) NOT NULL AUTO_INCREMENT, " + ;
            "DENOME VARCHAR(50) NULL DEFAULT '', " + ;
            "DETEXTO VARCHAR(800) NOT NULL DEFAULT '', " + ;
            "DEINFINC VARCHAR(80) NULL DEFAULT '', " + ;
            "DEINFALT VARCHAR(80) NULL DEFAULT '', " + ;
            "PRIMARY KEY ( IDDECRETO ) " + ;
            ") COLLATE=latin1_swedish_ci ENGINE=InnoDB" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200302
         IF :FieldExists( "DENUMLAN", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO DROP COLUMN DEID, DROP PRIMARY KEY, " + ;
               "CHANGE COLUMN DENUMLAN IDDECRETO INT(11) NOT NULL AUTO_INCREMENT, " + ;
               "ADD PRIMARY KEY ( IDDECRETO )" )
         ENDIF
         :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN IDDECRETO IDDECRETO INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN IDDECRETO IDDECRETO INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200822
         IF ! :FieldExists( "DETEXTO", "JPDECRETO" )
            IF :FieldExists( "DEDESCRICAO", "JPDECRETO" )
               :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCRICAO DETEXTO VARCHAR(800) NOT NULL DEFAULT ''" )
            ELSE
               :ExecuteCmd( "ALTER TABLE JPDECRETO ADD COLUMN DETEXTO VARCHAR(800) NOT NULL DEFAULT ''" )
            ENDIF
         ENDIF
         IF :FieldExists( "DEDESCR1", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR1 DEDESCR1 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR2 DEDESCR2 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR3 DEDESCR3 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR4 DEDESCR4 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCR5 DEDESCR5 VARCHAR(250) NOT NULL DEFAULT ''" )
            :ExecuteCmd( "UPDATE JPDECRETO SET DETEXTO = TRIM( CONCAT_WS( ' ', DEDESCR1, DEDESCR2, DEDESCR3, DEDESCR4, DEDESCR5 ) )" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO DROP COLUMN DEDESCR1, DROP COLUMN DEDESCR2," + ;
               " DROP COLUMN DEDESCR3, DROP COLUMN DEDESCR4, DROP COLUMN DEDESCR5" )
         ENDIF
         IF :IndexExists( "NOME", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO DROP INDEX NOME" )
         ENDIF
         IF :FieldExists( "DEDESCRICAO", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCRICAO DENOME VARCHAR(50) NOT NULL DEFAULT ''" )
         ENDIF
      ENDIF
   ENDWITH


As mudanças de idéia mal definidas.....

Era DENOME, DEDESCRI1, DEDESCR2, DEDESCR3, DEDESCR4, DEDESCR5
Depois DENOME, DEDESCRICAO
Depois DENOME, DETEXTO
Depois DEDESCRICAO, DETEXTO
Agora DENOME, DETEXTO

Fiz o seguinte:

Primeira parte: DETEXTO

a)se NÃO existe DETEXTO, não existe DEDESCRICAO, sinal de que não fez a conversão de DEDESCR1,2,3,4,5, então cria e transfere e apaga DEDESCR1,2,3,4,5
b) não existe DETEXTO, mas existe DEDESCRICAO, sinal de que converteu, então só renomeia
c) Se existe DETEXTO, então não mexe
resolvido primeira parte sobre DETEXTO, sem destruir o outro campo

Segunda parte:
a) Existe DENOME, deixa como está
b) Existe DEDESCRICAO, renomeia pra DENOME

Parece complicado e perigoso, mas acho que dá.
A partir do momento que existe DETEXTO, DEDESCRICAO antigo deixa de existir, então a checagem principal é essa.
Esse se divide, porque a existência de DEDESCRICAO define se os campos DEDESCR1,2,3,4,5 foram convertidos, se não foram, converte agora.
Resolvida essa parte, só sobra que o outro campo pode ser DEDESCRICAO ou DENOME.

É por isso que quero eliminar conversões antigas.... fica cada vez mais perigoso ficar mantendo coisas assim....
E se for usado em índice... vixe... complicou um pouco mais...

Meu modo de trabalho

31 Ago 2020 20:06

Não testei, mas no post vi que vai falhar....

A mudança de hoje está no lugar errado.

Código:
      IF AppVersaoDBFAnt() < 20200831
         IF :FieldExists( "DEDESCRICAO", "JPDECRETO" )
            :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN DEDESCRICAO DENOME VARCHAR(50) NOT NULL DEFAULT ''" )
         ENDIF
      ENDIF   


Agora sim, do jeito anterior NÃO iria fazer essa mudança de hoje, dependendo da versão anterior instalada.
Tirei do outro IF de versão anterior, e criei um IF pra ela.
Vale tudo que comentei antes, apenas em quem está com versão nova, agora vai fazer essa parte, que antes não iria fazer.

Meu modo de trabalho

31 Ago 2020 20:20

Acho que vou aproveitar e mudar esses nomes: AppVersaoDBF() e AppVersaoDBFAnt()

Não é perigoso.
Como é nome de função, é alterar o nome das funções.
A compilação vai avisar aonde estiver errado, porque vai faltar a função.
Fazer o que... AppVersaoSQL()... se inventar de alterar pra AppVersaoBanco(), aí fica parecendo coisa do controle bancário....
E com certeza não vou ficar controlando versão de SQL no aplicativo....

Meu modo de trabalho

07 Set 2020 10:16

Acabei recorrendo a este truque:

Código:
#define AppVersaoSQL() 20200905


É que se não mudar versão não roda rotinas de atualização durante os testes.
Desse jeito consigo ficar testando, e só alterar versão depois, antes de instalar nos clientes.

Ainda ajustando multitabelas pra tabelas separadas.

Só sobrou o contábil e o visual, sendo que também tem tabelas do contábil no multitabelas, então.... dá pra dizer que o contábil ir pra SQL começou.

Meu modo de trabalho

12 Set 2020 09:09

Como comentei em outro post, comecei a eliminar meu arquivo multi-tabelas.
Mas havia outro tipo de multitabela, e separar facilitou muito.

Querendo ou não, é vício de DBF: economizar arquivos

Então eu tinha lá num determinado arquivo, um campo com uma lista de códigos.
Isso precisa rotina específica

Código:
   Encontra( AUX_LICOBJ + StrZero( nIdLicObj, 6 ), "jptabel", "numlan" )
   FOR nCont = 1 TO Len( Trim( jptabel->axParam03 ) ) STEP 6
      cTemp := Val( Substr( jptabel->axParam03, nCont, 6 ) )
      IF cTemp != 0
         AAdd( mlcLicList, { cTemp, Ctod(""), 0, 0 } )
      ENDIF
   NEXT
   FOR nCont = 1 TO Len( mlcLicNum ) STEP 8 // igual data
      cTemp := Val( Substr( mlcLicNum, nCont, 6 ) )
      IF ! Empty( cTemp )
         nNumLic := hb_ASCan( mlcLicList, { | e | e[ LIC_CODIGO ] == cTemp } )
         IF nNumLic != 0
            Encontra( AUX_LICTIP + StrZero( mlcLicList[ nNumLic, LIC_CODIGO ], 6 ), "jptabel", "numlan" )
            mlcLicList[ nNumLic, LIC_DATA ]     := hb_Stod( Substr( mlcLicDat, nCont , 8 ) )
            mlcLicList[ nNumLic, LIC_VALIDADE ] := Val( jptabel->axParam01 )
            mlcLicList[ nNumLic, LIC_PRAZO ]    := Val( jptabel->axParam02 )
         ENDIF
      ENDIF
   NEXT


Então tinha rotina parecida pra mostrar, pra GET, pra salvar, etc.
Sempre todos os códigos de uma vez, afinal, é um campo "linguição" com vários códigos.

Ao dividir essa tabela em duas, troquei a rotina por um simples BROWSE.
E a rotina de edição passou a ser apenas a edição do código atual.
Muito mais simples do que antes.
Até poderia ficar parecido em DBF... mas em DBF a gente tá acostumado a pensar em economizar arquivo, por causa dos tempos do Clipper.
Para SQL, tanto faz, vai ser sempre uma única conexão, um comando e um retorno, tanto faz como isso é dividido pelas tabelas.

Aliás... pra SQL é bem melhor sem esse "linguição", assim a consulta é feita de tudo de uma vez.

Meu modo de trabalho

05 Out 2020 12:32

Só aviso:
Não comentei mais sobre MySQL, porque parou naquilo.
Tá tudo rodando tranquilo.
Tá chegando o momento de retirar toda a conversão antiga de DBF pra MySQL, porque não vai ter nada pra converter.

A contabilidade continua em DBF, mas está exigindo MySQL pra funcionar.
Parece que nenhum cliente da contabilidade atualizou aplicativo neste ano.
É o mesmo EXE em todo lugar, não é aplicativo separado.
De qualquer jeito, vou acabar migrando a contabilidade também, porque senão isso deixa o aplicativo preso a DBF.

Como eu digo sempre: sem pressa, tá tudo tranquilo.

Talvez intercalar a migração da contabilidade com as outras mudanças preparatórias pra GUI.
Será ruim se os módulos em DBF atrapalharem isso de GUI, ou precisarem de tratamento diferenciado.

Sem pressa, mas sempre em frente....

Meu modo de trabalho

05 Out 2020 12:40

Aproveitando....

Até chamar a atenção nisso:

O aplicativo usa MySQL pra quase tudo: notas, estoque, pedido, financeiro, bancário, etc., só a contabilidade está em DBF.

Não precisei mudar tudo de uma vez, vou alterando conforme dá na telha.

Quem está interessado no MySQL pode fazer igual, vai fazendo alguma coisa, vai acompanhando o resultado, não precisa sair igual um doido e passar todo aplicativo pra MySQL de uma vez.
Vai se acostumando com ele, brincando de vez em quando, vai se sentindo confortável, vai usando pras partes mais simples, e vai em frente devagar e tranquilo.
Deixei a contabilidade pra depois por opção minha, porque quero dar uma geral ANTES de salvar no MySQL.
Mas acabo até esquecendo que ela ainda está em DBF.
Talvez seja melhor fazer logo de uma vez só por causa disso, pra não esquecer.... kkkkk

Meu modo de trabalho

15 Dez 2020 18:18

Só atualizando:

Nenhuma novidade, tudo continua funcionando tranquilo com ADO e MySQL.
Só mesmo a leve mudança de visual, de radical só as cores mesmo.

natal.png

Meu modo de trabalho

07 Fev 2021 14:20

Finalmente decidi organizar meu git.

Até agora era a pasta CDROM, e TUDO dentro era controlado.

Agora dividindo em pastas FONTES e DADOS

Mas isso vai longe.... acho que o computador vai ficar trabalhando o dia inteiro nisso, ou até mais de uma semana.
É que não quero perder o histórico do git, e isso é que fica demorado, estou reescrevendo quase 20 anos de história.
E.... fazendo isso pra cada tipo de alteração....
São 3.500 commits no histórico.

Vamos ver se dá certo, tem essa também, só dá pra descobrir no final (de cada etapa).

De tanto mexer na HMG, HMGE, etc. pra reescrever histórico, agora já consigo fazer isso com um pouco mais de tranquilidade.

Meu modo de trabalho

07 Fev 2021 16:41

JoséQuintas escreveu:agora já consigo fazer isso com um pouco mais de tranquilidade.
um dia quem sabe eu consiga tbm kkk

Meu modo de trabalho

14 Fev 2021 12:19

Aproveitando....

Não falei mais da minha migração pra MySQL porque não mexi mais.

Continua tudo funcionando perfeito, e só a contabilidade de fora do MySQL.

Nem sei se já esqueci alguma coisa, só vou saber quando voltar a mexer kkkkkk

Meu modo de trabalho

08 Mar 2021 13:53

Minha conclusão sobre LIB GUI (ou sobre mim) é a seguinte:
Só vou usar LIB GUI se estiver do meu jeito, e vou ficar tentando mexer.

Como HMG não existe mais oficial, e não adianta mandar nada.... tá fora
Como HMG Extended é fechada, e não dá pra contribuir, tá fora
OOHG continuo enviando alterações.
HWGUI continuo enviando alterações.

Enquanto isso...
Tem o detalhe de aplicativo remoto, que tem um comportamento um pouco diferente.
É voltar a testar HWGUI nesse ambiente, agora que ficou definido que determinados antivírus não aceitam compactar o EXE.
E continuar com GTWVG, talvez acrescentando recursos entre GTWVG e HWGUI.

Agora voltei no MySQL, pra encerrar de vez tudo.

Código:
07/09/2020  22:56         1.254.539 jpcidade.dbf
01/02/2021  17:42            10.279 jpconfi.dbf
07/09/2020  22:56             1.027 jpcontabil.dbf
07/09/2020  22:56             6.723 jpctconta.dbf
07/09/2020  22:56               579 jpctctaref.dbf
07/09/2020  22:56               355 jpcthisto.dbf
07/09/2020  22:56               835 jpctlanca.dbf
07/09/2020  22:56               611 jpctlotes.dbf
07/09/2020  22:56           291.822 jpdolar.dbf
07/09/2020  22:56             5.335 jpempresa.dbf
01/02/2021  17:42             5.923 jpnumero.dbf
30/12/2019  21:52               291 jprefcta.dbf
29/12/2020  09:58           526.406 jpsenha.dbf
10/11/2020  15:02            53.885 jptabel.dbf
30/12/2019  21:52             7.416 jpuf.dbf
              15 arquivo(s)      2.166.026 bytes


Isso é o meu maior cliente (que não usa contabilidade).
Eliminei de vez o jpcidade neste final de semana.
Sobrou menos de 1 MB agora em DBF.
Já não estava usando, estava meio opcional só por causa da contabilidade.
Postar uma resposta