Clipper On Line • Ver Tópico - Meu modo de trabalho

Meu modo de trabalho

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

Moderador: Moderadores

 

Meu modo de trabalho

Mensagempor JoséQuintas » 24 Ago 2020 13:24

Esqueci de dizer uma coisa importante sobre a alteração que mencionei:

Tirando o contábil, o resto tá tudo no MySQL.
E os clientes já atualizaram essa parte.
Pra isso... NÃO precisa mais ficar compatível com DBF, porque não tem mais conversão.

Comecei a alterar o que eram 5 campos X 150 caracteres, pra UM campo de 800 caracteres, por exemplo.
Nota fiscal, que tinha 5 campos x 100 caracteres pra observações, agora UM campo de até 500 caracteres (VARCHAR)
Então, agora, já posso fazer coisas que o DBF não deixava.

Como sempre digo: sem pressa, vai funcionar alterando ou não, então alterar tranquilo.

A contabilidade me impede de acabar com DBFs.... tranquilo também.... ainda não pensei no aplicativo "SEM DBF", sem mapeamento de pasta de servidor, CADA estação com seu próprio EXE.... Sei lá como vou fazer isso, mas sem pressa... cada coisa a seu tempo.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Ago 2020 14:45

Continuo alterando sem dó....
Só de um dia:

      IF AppVersaoDBFAnt() < 20200825
         :ExecuteCmd( "UPDATE JPTRANSP SET TPSTATUS = '0' WHERE TPSTATUS IS NULL OR TPSTATUS < '000000'" )
         :ExecuteCmd( "ALTER TABLE JPTRANSP CHANGE COLUMN TPSTATUS TPSTATUS INT(11) NOT NULL DEFAULT '0'"  )
         :ExecuteCmd( "UPDATE JPPREHIS SET PHPRODUTO = '0' WHERE PHPRODUTO < '000000'"  )
         :ExecuteCmd( "UPDATE JPPREHIS SET PHCADASTRO = '0' WHERE PHCADASTRO < '000000'"  )
         :ExecuteCmd( "UPDATE JPPREHIS SET PHFORPAG = '0' WHERE PHFORPAG < '000000'" )
         :ExecuteCmd( "ALTER TABLE JPPREHIS CHANGE COLUMN PHPRODUTO PHPRODUTO INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN PHCADASTRO PHCADASTRO INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN PHFORPAG PHFORPAG INT(11) NOT NULL DEFAULT '0'" )
          SayScroll( "2020-08-25 JPPEDIDO.SQL" )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDPEDREL = '0' WHERE PDPEDREL < '000000'"  )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDFILIAL = '0' WHERE PDFILIAL < '000000'" )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDTRANSA = '0' WHERE PDTRANSA < '000000'" )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDCADASTRO = '0' WHERE PDCADASTRO < '000000'"  )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDNOTFIS = '0' WHERE PDNOTFIS < '000000'"  )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDVENDEDOR = '0' WHERE PDVENDEDOR < '000000'" )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDTRANSP = '0' WHERE PDTRANSP < '000000'" )
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDFORPAG = '0' WHERE PDFORPAG < '000000'"  )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDPEDREL PDPEDREL INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDFILIAL PDFILIAL INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDTRANSA PDTRANSA INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDCADASTRO PDCADASTRO INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDNOTFIS PDNOTFIS INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDVENDEDOR PDVENDEDOR INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDTRANSP PDTRANSP INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE PDFORPAG PDFORPAG INT(11) NOT NULL DEFAULT '0'" )
         SayScroll( "2020-08-25 JPNOTFIS.SQL" )
         :ExecuteCmd( "UPDATE JPNOTFIS SET NFFILIAL = '0' WHERE NFFILIAL < '000000'" )
         :ExecuteCmd( "UPDATE JPNOTFIS SET NFNOTFIS = '0' WHERE NFNOTFIS < '000000'"  )
         :ExecuteCmd( "UPDATE JPNOTFIS SET NFCADASTRO ='0' WHERE NFCADASTRO < '000000'"  )
         :ExecuteCmd( "ALTER TABLE JPNOTFIS CHANGE COLUMN NFFILIAL NFFILIAL INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPNOTFIS CHANGE COLUMN NFNOTFIS NFNOTFIS INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPNOTFIS CHANGE COLUMN NFCADASTRO NFCADASTRO INT(11) NOT NULL DEFAULT '0'" )
         SayScroll( "2020-08-25 JPNFEKEY.SQL" )
         :ExecuteCmd( "ALTER TABLE JPNFEKEY CHANGE COLUMN KKNOTFIS KKNOTFIS INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPNFEKEY CHANGE COLUMN KKMODFIS KKMODFIS INT(11) NOT NULL DEFAULT '0'" )
         SayScroll( "2020-08-25 JPITPED.SQL" )
         :ExecuteCmd( "UPDATE JPITPED SET IPFILIAL = '0' WHERE IPFILIAL IS NULL OR IPFILIAL < '0'" )
         :ExecuteCmd( "ALTER TABLE JPITPED CHANGE COLUMN IPFILIAL IPFILIAL INT(11) NOT NULL DEFAULT '0'" )
         IF ADORecCount( "JPDECRETO" ) == 0
            FOR EACH aDecreto IN aDecretoList
               :QueryCreate()
               :QueryAdd( "IDDECRETO",   aDecreto:__EnumIndex() )
               :QueryAdd( "DEDESCRICAO", aDecreto[ 1 ] )
               :QueryAdd( "DETEXTO",     aDecreto[ 2 ] )
               :QueryExecuteInsert( "JPDECRETO" )
            NEXT
         ENDIF
         :ExecuteCmd( "ALTER TABLE JPLICENCA CHANGE COLUMN LCLICOBJ LCLICOBJ INT(11) NOT NULL DEFAULT '0'" )
      ENDIF


Campos que NÃO precisam mais ser caractere, DESCRI no nome do campo, alterado pra DESCRICAO porque agora não tem limite, essas coisas.

Pendente ainda JPTABEL em DBF e JPAUXILIAR em MySQL, porque são arquivos multi-tabela, talvez aproveite pra dividir em tabelas separadas.
Aquilo de CST IPI, CST ICMS, origem de mercadoria, CST PIS, CST Cofins, CST IPI, etc. etc. etc.

Pensando em chamar as tabelas de JP_AUX_PIS_CST ou JP_TAB_PIS_CST (sem os separadores), o AUX ou TAB é pra ficar tudo junto ao olhar a lista dessas "tabelinhas".
E campos iniciando com o nome da tabela Exemplo PisCstDescricao, IcmCstDescricao, PisCstDescricao, CofCstDescricao, IpiCstDescricao, etc.

As tabelas como AUX vão ficar no início, e como TAB vão ficar mais pelo meio.
Isso também envolve fazer fontes separados pra cada uma.

Começaria pela parte que JÁ ESTÁ em MySQL, depois as que JÁ PODEM ficar no MySQL, e depois avaliar o que sobrar em DBF.

Ainda pensando... porque são muitas tabelas, e mudar de idéia no meio do caminho vai ser problema.

Nota: deu alguns erros hoje, por causa dessas mudanças de ontem.... mas tudo bem, resolvido rápido.
É muita mudança de uma vez.... sempre escapa alguma coisa...
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Ago 2020 15:05

Também pensei em separar o que tem a ver com legislação.

JP_LEI_ICM_CST ou JP_GOV_ICM_CST - CST de ICMS
JP_AUX_EST_DEP - departamento de estoque

Tem que ser alguma coisa que eu lembre fácil na hora de fazer manutenção.
Separar o que tem a ver com lei/governo pode ser interessante, e vai ser fácil lembrar sem confundir.
Aliás... relacionado com lei tem muitas...

Acho que LEI vai ser o mais apropriado, porque, por exempo, tabelas da ANP, tem a ver com a lei deles, e não com o governo.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Ago 2020 15:40

Eu não disse... só da ANP já são 6.
Isso tem que vir em primeiro lugar, porque outras rotinas de atualização precisam continuar funcionando.
De forma simples:
Sendo esta a primeira rotina, em todas as demais rotinas basta usar o nome atual, sem complicações adicionais.

STATIC FUNCTION Update00SQL()

   LOCAL cnSQL := ADOClass():New( AppConexao() )

   IF AppConexao() == NIL
      RETURN NIL
   ENDIF
   WITH OBJECT cnSQL
      IF AppVersaoDBFAnt() < 20200826
         IF :TableExists( "JPANPAGE" )
            :ExecuteCmd( "RENAME TABLE JPANPAGE TO JPLEIANPAGE" )
         ENDIF
         IF :TableExists( "JPANPATI" )
            :ExecuteCmd( "RENAME TABLE JPANPATI TO JPLEIANPATI" )
         ENDIF
         IF :TableExists( "JPANPINS" )
            :ExecuteCmd( "RENAME TABLE JPANPINS TO JPLEIANPINS" )
         ENDIF
         IF :TableExists( "JPANPLOC" )
            :ExecuteCmd( "RENAME TABLE JPANPLOC TO JPLEIANPLOC" )
         ENDIF
         IF :TableExists( "JPANPOPE" )
            :ExecuteCmd( "RENAME TABLE JPANPOPE TO JPLEIANPOPE" )
         ENDIF
         IF :TableExists( "JPANPPRO" )
            :ExecuteCmd( "RENAME TABLE JPANPPRO TO JPLEIANPPRO" )
         ENDIF
      ENDIF
   ENDWITH

   RETURN NIL


Pois é, lei é um negócio complicado, nem comecei a alterar, a já encontrei 6 tabelas que tem a ver com lei, que tinha até esquecido.
E é só o começo.

Essas foi fácil, só procurar nos fontes "JPANP", e ir alterando, até não encontrar mais nada.

E mais fácil ainda porque é usado uma vez por mês, e agora só no mês que vém.
Por enquanto estou em estado de alerta, porque pode aparecer algum erro no aplicativo e ter que alterar urgente.
Se deixar essa rotina nos fontes, sem problema, vai renomear somente se as tabelas existirem, então nenhum problema se for executada centenas de vezes hoje.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Ago 2020 15:53

Tudo certo com primeiro conjunto alterado.

lei.png


Como já mostrei em outro post, o SQL vai permitir mais e mais recursos.
Então a melhor hora é agora, pra fazer uma revisão do que já existe, antes de aumentar recursos.
Com certeza daqui pra frente cada vez vai ter mais tabelas.
Melhor fazer isso agora, enquanto dá pra fazer relativamente mais tranquilo.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Ago 2020 16:02

Aproveitando....

Como deu pra ver, já passei a fase de ter medo de mexer com MySQL.
Estou abusado até demais kkkkk

Não, não é exatamente isso.
É que fiz muitos testes, já fiz isso antes, então sei que funciona.
Se sei que funciona.... então posso fazer tranquilo.

Com vocês vai ser igual.
Começa igual mexendo com ovos, tomando todo cuidado possível....
E com o tempo vai pegando confiança.

Mas o principal:
Conforme acontecem erros, imagino se existe uma forma de evitar que aconteça de novo.
:TableExists() é pra testar se a tabela existe no MySQL, isso já evita um problema que tive antes.
Se a tabela existe renomeia, senão segue em frente.
Mais pra frente, ou ela é criada do zero, ou segue com as atualizações, ou apenas é usada porque já está no jeito certo.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Ago 2020 16:17

Então, naquele ponto o aplicativo renomeia, caso exista com o nome velho.

Neste aqui, cria caso não exista.
Significa que se existia com nome velho, neste ponto já existe e não cria mais.
Ou... se não existia, já cria do jeito certo.

      "CREATE TABLE IF NOT EXISTS JPLEIANPAGE ( " + ;


E se existir alguma atualização que foi feita no passar dos tempos.... a atualização vai encontrar o nome atual.
Tive que alterar atualização intermediária, aonde existia, pra considerar o nome novo.
Melhor isso, do que encher de fonte pra ficar testando que nome usar em cada etapa de atualização.

Aqui está o motivo de obrigar que clientes atualizem versão:
Quanto mais atualizado nos clientes, posso apagar tudo intermediário, e não mexer mais nisso.
Imaginem se fosse manter até importação de DBF pra tudo.... sem chance...

Limitar versão mínima nos clientes é até mais importante do que ficar prevenindo erros pra versões velhas.
É só ligar pro cliente e falar: atualiza aí
Mais rápido falar pro cliente fazer isso, do que ficar mantendo fonte que pode dar problema.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 27 Ago 2020 12:29

Voltei a deixar a parte de SQL junta, uma tabela por vez, mesmo enchendo de controle de data.
Tá complicado manter tudo isso.
Abaixo, só as mudanças de uma única tabela.

   WITH OBJECT cnSQL
      // jpfinan

      IF AppVersaoDBFAnt() < AppVersaoDBF()
         SayScroll( "JPFINAN.SQL" )
         :ExecuteCmd( JPFINANcreateSQL() )
      ENDIF
      IF AppVersaoDBFAnt() < 20191201
         :ExecuteCmd( "UPDATE JPFINAN SET FIPEDIDO = '0' WHERE FIPEDIDO < '0'" )
         :ExecuteCmd( "ALTER TABLE JPFINAN CHANGE COLUMN FIPEDIDO FIPEDIDO INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200221
         :ExecuteCmd( "UPDATE JPFINAN SET FIPEDIDO = 0 WHERE FIPEDIDO < '0' OR FIPEDIDO > '999999'" )
         :ExecuteCmd( "ALTER TABLE JPFINAN CHANGE COLUMN FIPEDIDO FIPEDIDO INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200302
         IF :FieldExists( "FICLIFOR", "JPFINAN" )
            :ExecuteCmd( "ALTER TABLE JPFINAN CHANGE COLUMN FICLIFOR FICADASTRO VARCHAR(6) NOT NULL DEFAULT '000000'" )
         ENDIF
         IF :IndexExists( "IDXNUMLAN", "JPFINAN" )
            :ExecuteCmd( "ALTER TABLE JPFINAN DROP INDEX IDXNUMLAN" )
         ENDIF
         IF ! :IndexExists( "IDXPEDIDO", "JPFINAN" )
            :ExecuteCmd( "ALTER TABLE JPFINAN ADD INDEX IDXPEDIDO ( FIPEDIDO, IDFINAN )" )
         ENDIF
      ENDIF
      IF AppVersaoDBFAnt() < 20200326
         IF :FieldExists( "FIDATPRE", "JPFINAN" )
            :ExecuteCmd( "ALTER TABLE JPFINAN DROP COLUMN FIDATPRE" )
         ENDIF
      ENDIF
      IF AppVersaoDBFAnt() < 20200408
         :ExecuteCmd( "UPDATE JPFINAN SET FIFILIAL='1' WHERE FIFILIAL IS NULL OR FIFILIAL < '0' OR FIFILIAL > '999999'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FICADASTRO = '0' WHERE FICADASTRO IS NULL OR FICADASTRO < '0' OR FICADASTRO > '999999'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FISACADO = '0' WHERE FISACADO IS NULL OR FISACADO < '0' OR FISACADO > '999999'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FICCUSTO = '0' WHERE FICCUSTO IS NULL OR FICCUSTO < '0' OR FICCUSTO > '999999'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FIOPERACAO = '0' WHERE FIOPERACAO IS NULL OR FIOPERACAO < '0' OR FIOPERACAO > '999999'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FIPORTADOR = '0' WHERE FIPORTADOR IS NULL OR FIPORTADOR < '0' OR FIPORTADOR > '999999'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FIVENDEDOR = '0' WHERE FIVENDEDOR IS NULL OR FIVENDEDOR < '0' OR FIVENDEDOR > '999999'" )
         :ExecuteCmd( "ALTER TABLE JPFINAN " + ;
            "CHANGE COLUMN FIFILIAL FIFILIAL INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN FICADASTRO FICADASTRO INT(11) NOT NULL DEFAULT '0', " + ;
            "CHANGE COLUMN FISACADO FISACADO INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN FICCUSTO FICCUSTO INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN FIOPERACAO FIOPERACAO INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN FIPORTADOR FIPORTADOR INT(11) NOT NULL DEFAULT '0'," + ;
            "CHANGE COLUMN FIVENDEDOR FIVENDEDOR INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200425
         :ExecuteCmd( "UPDATE JPFINAN SET FINUMBAN = '000000' WHERE Year( FIDATVEN  ) < 2020" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200728
         :ExecuteCmd( "UPDATE JPFINAN SET FIPARCELA = '001' WHERE FIPARCELA < '001'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FINUMDOC = '000000001' WHERE FINUMDOC < '000000001'" )
         :ExecuteCmd( "UPDATE JPFINAN SET FINUMBAN = '0' WHERE FINUMBAN = ''" )
         :ExecuteCmd( "ALTER TABLE JPFINAN" + ;
            " CHANGE COLUMN FIPARCELA FIPARCELA INT(11) NOT NULL DEFAULT '0'," + ;
            " CHANGE COLUMN FINUMDOC FINUMDOC INT(11) NOT NULL DEFAULT '0'," + ;
            " CHANGE COLUMN FINUMBAN FINUMBAN INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPFINAN CHANGE COLUMN FIPEDIDO FIPEDIDO INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPFINAN" + ;
            " CHANGE COLUMN IDFINAN IDFINAN INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN FIPEDIDO FIPEDIDO INT(11) NOT NULL DEFAULT '0' " )
      ENDIF
   ENDWITH


Pois é... campo numérico em tudo que não estava numérico, dentre outras coisas.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 27 Ago 2020 12:30

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

   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.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 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....
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor Vlademiro » 31 Ago 2020 13:18

Também faço isso as vezes.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 31 Ago 2020 19:59

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

   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...
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 31 Ago 2020 20:06

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

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

      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.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 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....
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 07 Set 2020 10:16

Acabei recorrendo a este truque:

#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.
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: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 20 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