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 » 19 Ago 2020 13:38

Bom... acho que consegui voltar à posição antes da perda de fontes.

Talvez interessante relatar aqui, porque como eu já disse, contabilidade vou primeiro tratar os DBFs antes de começar com MySQL pra ela.

Alterei TUDO, nome de arquivo, nome de campos, e tipo de alguns campos.

No plano de contas tem lá:

código normal: o código tradicional 1.01.01.001.0001-1
código reduzido: o código que vou usar no MySQL como incremental 9999999

E na gravação de lançamentos, só uso o código normal, mesmo permitindo ao usuário usar o código reduzido.
Vou inverter isso: fazer pelo reduzido.

Como sempre, vou fazer passo a passo.

1) Minha primeira alteração vai ser: gravar os dois, o normal e o reduzido.
Neste momento, vão existir registros com e sem código reduzido, mas todos com o código normal.
Tudo bem, tudo continua funcionando, gravar um campo a mais não dá problema com nada.
E vou conferindo se tudo ok.

2) A partir do momento que isso estiver ok, gravação ok, crio a conversão para informações antigas, que estão sem código reduzido.
Neste momento, a base fica correta, tudo preenchido.

3) Com tudo preenchido, começo a alterar os fontes pra se basearem no código reduzido, ao invés do código normal.
Neste momento, tudo ok também, se tá tudo gravado, tanto faz de um ou de outro

4) Uma vez não precisando mais do código normal, posso eliminar isso de vez dos lançamentos.
Lembrando que, se eu precisar do código normal é só pesquisar no plano de contas.
Neste momento, deixa de existir o campo

Então... estou fazendo estas coisas EM DBF.
TALVEZ tenha rotina que em DBF seja melhor manter os dois códigos, pra velocidade.
Sem problemas.... só vou eliminar o campo no final, então vai dar pra tirar essa dúvida durante as alterações.

As coisas estão indo em frente, e contabilidade vai ficar em MySQL também, é isso que importa.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Ago 2020 13:58

Não recuperei tudo ainda.
Os fontes não estão usando a estrutura nova do plano de contas.

Não se enganem, tenho que alterar um campo de cada vez em todos os fontes.
Nesse ponto é importante eu ter usado nomes únicos.

Faço primeiro com replace all, para os campos que continuam caractere ou numérico.
Depois, tenho que ver um a um, para os campos que mudaram de caractere pra numérico.

E não é só isso: o campo pode ser atribuído a uma variável, então, em fonte onde isso acontece, tenho que revisar essa variável também.

Esse sim, vai dar erro pra quem atualizar agora, e praticamente em tudo da contabilidade.

Fazer o que.... mágica não existe... já tinha feito isso, fazer tudo de novo, por ter perdido fontes.

Ainda bem que o pessoal da contabilidade não costuma atualizar.....
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Ago 2020 14:31

Antes que perguntem:

Mas... e salvar no git/github não resolveu? teria resolvido se eu tivesse salvo kkkkk
O plano de contas é aquele arquivo... que ficou com quase 400 campos....
Pois é... a gente só sente falta do backup quando perde....

Só correção: não perdi fontes, perdi alterações em fontes.

O que perdi?
Não sei. acho que só alterações na contabilidade.
Com certeza, se perdi algo mais, alguém vai reclamar e faço de novo.
Ainda bem que salvei tudo antes de começar a mexer na contabilidade... senão... vixe...

Aproveitando.....
A vantagem de deixar fontes padronizados, ou pensar em como localizar mais fácil

Buscando a_tipo

busca1.png


buscando ->a_tipo, afinal, é um campo de arquivo

busca2.png


Primeiro pesquisar o que é certeza, já corrigir, e depois ver o que sobra.
Ganha-se muito tempo com isso, porque o primeiro já é certo, e a parte duvidosa deixa pra depois, já servindo pra conferir o resto.
Parece uma coisa meio idiota, de tão simples, mas a ajuda por estar padronizado é poderosa.
Pode transformar horas de conferência/alteração, em apenas alguns minutos.

Fazer tudo de uma vez, um fonte de cada vez, é perder mais tempo, e ter mais chances de errar.
Nesse caso é melhor fazer um campo de cada vez, em todos os fontes.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Ago 2020 14:58

Uma coisa interessante que uso:

Lembram? plano de contas tem 96 meses

Saldo anterior
a_Deb01, a_Cre01
a_Deb02, a_Cre02
etc.

Como calcular o saldo anterior ou atual de um determinado mes?

Que tal isto?
METHOD SaldoAnterior( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor

   nValor := ::SaldoAtual( nNumMes - 1 )

   RETURN nValor


Aqui já cheguei a usar diferente, parecido com o anterior, mas agora é for/next mesmo.

METHOD SaldoAtual( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor, nCont

   nNumMes := Min( Max( nNumMes, 0 ), CONTABIL_MESMAX )
   nValor := jpctconta->plSdAnt
   FOR nCont = 1 TO nNumMes
      nValor += ::SaldoDebito( nCont ) - ::SaldoCredito( nCont )
   NEXT

   RETURN nValor


e o movimento do mes

METHOD SaldoDebito( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor := 0

   DO CASE
   CASE nNumMes < 1 .OR. nNumMes > CONTABIL_MESMAX
      nValor := 0
   OTHERWISE
      nValor := jpctconta->( FieldGet( FieldPos( "A_DEB" + StrZero( nNumMes, 2 ) ) ) )
   ENDCASE

   RETURN nValor


Retirei a parte de conversão em dolar pra postar aqui, pra não complicar.

Em Clipper cheguei a usar com recursividade mesmo, e com os nomes dos campos pra ganhar agilidade, sem macro.

Algo do tipo:
FUNCTION DebitoMes( nMes )
   DO CASE
   CASE nMes < 1; RETURN 0
   CASE nMes == 1; RETURN conta->A_DEB01
   CASE nMes == 2; RETURN conta->A_DEB02
   ....
ENDCASE
RETURN 0


FUNCTION SaldoMes( nMes )
   IF nMes == 0
      RETURN conta->a_SdAnt
   ENDIF
   RETURN SaldoMes( nMes - 1 ) + DebitoMes( nMes ) - CreditoMes( nMes )


Notem que acaba sendo SEM o uso de macro, o que deixou muito mais rápido.
Não lembro se comparei usando for/next.

Já comentei por aqui: por ter testado JOINER, um compilador brasileiro parecido com Clipper, que NÃO tinha macro, acabou que comecei a evitar macros.
A gente sempre encontra uma saída, e fica mais rápido.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 19 Ago 2020 15:24

Uma coisa interessante....

Contabilidade poderia ser fechamento cada 1 mes, 2 meses, 3, 4, 6 ou 12

Como fica o cálculo de uma despesa de julho, sendo que cada fechamento zera isso?

Que tal assim:

nMes         := 7 // mes atual, exemplo
nFecha     := 6  // mes fechamento, exemplo
nMesFecha := Round( ( nMes - 1  ) / nFecha ) * nFecha // resultado desta conta = 6, semestral fechou mes 6
nSaldo := Saldo( nMes ) - Saldo( nFecha )


Isso vale pra qualquer um dos 96 meses.
Simples e prático, encerramento de exercício automático, sem precisar interferência do usuário.
E tanto faz qual é o tipo de encerramento.
Qualquer saldo, de qualquer mês, em qualquer situação.
Pra geração de SPED Contábil... maravilha... fácil obter saldo acumulado, encerrado, não encerrado, etc.

Mas é interessante o que uma fórmula ou uma função podem fazer....

É bom pra chamar a atenção em outra coisa:
As linguagens de programação não vém com rotinas prontas pra facilitar tudo que existe.
Cabe a nós criar funções pra facilitar nossa vida.

Isso é mais importante ainda pra LIB gráfica/GUI.
Criar funções direcionadas ao nosso uso ajuda muuuuuito.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Ago 2020 23:50

Acabei me contradizendo quanto ao uso do MySQL.

mysql.png


O primeiro uso foi nesse cliente que hoje ocupa 1.2GB, com tabelas acima de 1 milhão de registros.
Aplicativo particular desse cliente, era só pra tomar conta do aplicativo Clipper SUMMER, mas pelo volume de informações, e por ser isolado de todo resto, acabei usando Harbour e foi onde comecei a usar MySQL.
NÃO está totalmente em MySQL, o problema maior é alterar toda a lógica primeiro.

TODO restante é meu aplicativo. Aquele cliente que menciono, que sobrou 2MB em DBF, é esse de tamanho maior de 4.1GB

Tem usuário aqui com arquivos menores, mas tem usuário com arquivos maiores.
Deixei de achar que meus arquivos são grandes, quando mexi em aplicativo Clipper de terceiros, usando ADS Server, com arquivos de mais de 4 milhões de registros, referente a 28 filiais integradas. O backup precisou de alguns DVDs.
Se estão achando esses tamanhos grandes demais, saibam que não são, existem muito maiores por aí.

Durante o Clipper era Clipper 5.2, SIXCDX 3, OSLIB liberando tempo ao máximo para o Windows em pausas ou durante o mouse, e BLINKER 7 modo extendido.
No Harbour passei pelo SIXCDX primeiro pra ficar compatível, mas depois DBFCDX.
Há alguns anos, e ainda hoje, HBNETIO, justamente no cliente que agora só tem 2MB em DBF.

Em todos os casos, tudo rodando tranquilamente, não troquei por causa de problemas, mas pra ficar melhor.

Problemas com DBF.... uma vez ou outra, mas difícil acontecer, uma vez em cada sei lá quantos meses.
Reindexação... o aplicativo sempre teve.... mas nunca foi usado, NÃO precisava reindexar.
Talvez a exceção seja o programa específico que mencionei, pra ELIMINAR DELETADOS e ficar mais rápido, e não por defeito em DBF.

O programa de imobiliária foi parcial pra MySQL, porque são 30 anos de histórico, e no MySQL é muito mais prático mexer com isso.

Os demais... falta só a parte da contabilidade.
NENHUM cliente que usa contabilidade está nessa imagem, porque eles SÓ USAM contabilidade.
Continua sendo somente DBF.

Dá pra dividir meus clientes em 4 grupos:

- Meu aplicativo, onde NÃO usa contabilidade, tá tudo em MySQL menos contabilidade que nem sequer usam
- Meu aplicativo, aonde SÓ USA contabilidade, tá tudo em DBF
- O da imobiliária, fontes da imobiliária, onde uso DBF + MySQL
- O Linux/Flagship, onde só dá pra usar DBF, os fontes estão prontos pra Harbour mas não pode ser usado.

Sem problemas aonde usa DBF, sem problemas aonde usa MySQL, sem problemas no Windows, sem problemas no Linux.

Convém chamar a atenção:
o "sem problemas" com dbf, pode estar relacionado por usar SIXCDX/DBFCDX, TEMPO PRA WINDOWS até o bloqueio de registros, forma de obter o próximo número disponível, etc.

Tem "neguinho" que comete assassinato no aplicativo, põe lá no programa:

DO WHILE ! RLock()
ENDDO


Tem "neguinho" que só assassina um pouquinho, põe lá no programa:

DO WHILE ! Rlock()
   Inkey()
ENDDO


E tem neguinho que ainda fica bloqueando registros por tempo indeterminado, sem necessidade.

RLock()
GET ...
GET ...
READ
UNLOCK


Não ter problemas com DBF, não significa que qualquer coisa funciona, precisa tomar os devidos cuidados.
Faço isso desde os tempos do Clipper, no caso do RLock(), uso intensivo da função OL_Yield() da OSLIB.
No Harbour o Inkey() já acaba sendo equivalente a isso, mas mesmo assim melhor um Inkey(0.3) do que Inkey().
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 24 Ago 2020 07:46

Mexer nas tabelas ainda não terminou, nem mesmo em MySQL.

STATIC FUNCTION Update08SQL()

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

   IF AppConexao() == NIL
      RETURN NIL
   ENDIF
   SayScroll( "Atualizações SQL 08/2020" )
   WITH OBJECT cnSQL
      IF AppVersaoDBFAnt() < 20200822
         :ExecuteCmd( JPAGENDACreateSQL() )
         :ExecuteCmd( JPDECRETOcreateSQL() )
         :ExecuteCmd( JPFISCALCreateSQL() )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         SayScroll( "2020-08-01 SQL" )
         :ExecuteCmd( "ALTER TABLE JPAGENDA CHANGE COLUMN IDAGENDA IDAGENDA INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPANPAGE CHANGE COLUMN IDANPAGE IDANPAGE INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPANPATI CHANGE COLUMN IDANPATI IDANPATI INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPANPINS CHANGE COLUMN IDANPINS IDANPINS INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPANPLOC CHANGE COLUMN IDANPLOC IDANPLOC INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPANPOPE CHANGE COLUMN IDANPOPE IDANPOPE INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPANPPRO CHANGE COLUMN IDANPPRO IDANPPRO INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPCLISTA CHANGE COLUMN IDCLISTA IDCLISTA INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPCOMBUSTIVEL CHANGE COLUMN IDCOMBUSTIVEL IDCOMBUSTIVEL INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPCOMISSAO CHANGE COLUMN IDCOMISSAO IDCOMISSAO INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPDECRETO CHANGE COLUMN IDDECRETO IDDECRETO INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPEDICFG CHANGE COLUMN IDEDICFG IDEDICFG INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPEMANFE CHANGE COLUMN IDEMANFE IDEMANFE INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "UPDATE JPESTOQUE SET ESPEDIDO = 0 WHERE ESPEDIDO=''" )
         :ExecuteCmd( "ALTER TABLE JPESTOQUE CHANGE COLUMN IDESTOQUE IDESTOQUE INT(11) NOT NULL AUTO_INCREMENT," + ;
            "CHANGE COLUMN ESPEDIDO ESPEDIDO INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPFISICA CHANGE COLUMN IDFISICA IDFISICA INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPIBPT CHANGE COLUMN IDIBPT IDIBPT INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPMOTORI CHANGE COLUMN IDMOTORI IDMOTORI INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPFORPAG" + ;
            " CHANGE COLUMN IDFORPAG IDFORPAG INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN FPDE1 FPDE1 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPATE1 FPATE1 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTMES1 FPQTMES1 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTDIA1 FPQTDIA1  INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDIAFIM1 FPDIAFIM1 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDE2 FPDE2 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPATE2 FPATE2 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTMES2 FPQTMES2 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTDIA2 FPQTDIA2 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDIAFIM2 FPDIAFIM2 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDE3 FPDE3 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPATE3 FPATE3 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTMES3 FPQTMES3 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTDIA3 FPQTDIA3 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDIAFIM3 FPDIAFIM3 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDE4 FPDE4 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPATE4 FPATE4 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTMES4 FPQTMES4 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTDIA4 FPQTDIA4 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDIAFIM4 FPDIAFIM4 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDE5 FPDE5 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPATE5 FPATE5 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTMES5 FPQTMES5 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPQTDIA5 FPQTDIA5 INT(3) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN FPDIAFIM5 FPDIAFIM5 INT(3) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         IF :FieldExists( "NFCADTRA", "JPNOTFIS" )
            :ExecuteCmd( "UPDATE JPNOTFIS SET NFCADTRA = '0' WHERE NFCADTRA = ''" )
            :ExecuteCmd( "ALTER TABLE JPNOTFIS CHANGE COLUMN NFCADTRA NFTRANSP INT(11) NOT NULL DEFAULT '0'" )
         ENDIF
         IF ! :FieldExists( "KKMANIF", "JPNFEKEY" )
            :ExecuteCmd( "ALTER TABLE JPNFEKEY ADD COLUMN KKMANIF CHAR(1) NOT NULL DEFAULT 'N'" )
            :ExecuteCmd( "UPDATE JPNFEKEY SET KKMANIF = 'S' WHERE KKDATEMI < '2020-03-01'" )
         ENDIF
         :ExecuteCmd( "ALTER TABLE JPIMPOSTO CHANGE COLUMN IDIMPOSTO IDIMPOSTO INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPNFBASE CHANGE COLUMN IDNFBASE IDNFBASE INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPNOTFIS" + ;
            " CHANGE COLUMN IDNOTFIS IDNOTFIS INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN NFPEDIDO NFPEDIDO INT(11) NOT NULL DEFAULT '0'," + ;
            " CHANGE COLUMN NFQTDVOL NFQTDVOL INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN NFTRANSP NFTRANSP INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPREHIS CHANGE COLUMN IDPREHIS IDPREHIS INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPFINAN CHANGE COLUMN FIPEDIDO FIPEDIDO INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPTRANSA CHANGE COLUMN IDTRANSA IDTRANSA INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPVEICULO" + ;
            " CHANGE COLUMN IDVEICULO IDVEICULO INT(11) NOT NULL AUTO_INCREMENT, " + ;
            " CHANGE COLUMN VEPESO VEPESO INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPACTOT VECAPACTOT INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC1 VECAPAC1 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC2 VECAPAC2 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC3 VECAPAC3 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC4 VECAPAC4 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC5 VECAPAC5 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC6 VECAPAC6 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC7 VECAPAC7 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC8 VECAPAC8 INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN VECAPAC9 VECAPAC9 INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPVENDEDOR CHANGE COLUMN IDVENDEDOR IDVENDEDOR INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPFINAN" + ;
            " CHANGE COLUMN IDFINAN IDFINAN INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN FIPEDIDO FIPEDIDO INT(11) NOT NULL DEFAULT '0' " )
         :ExecuteCmd( "ALTER TABLE JPITPED" + ;
            " CHANGE COLUMN IDITPED IDITPED    INT(11) NOT NULL AUTO_INCREMENT, " + ;
            " CHANGE COLUMN IPPEDIDO IPPEDIDO INT(11) NOT NULL DEFAULT '0'," + ;
            " CHANGE COLUMN IPGARANTIA IPGARANTIA INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPCADASTRO CHANGE COLUMN IDCADASTRO IDCADASTRO INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPTRANSP CHANGE COLUMN IDTRANSP IDTRANSP   INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         IF :FieldExists( "JPVALTAB", "JPPEDIDO" )
            :ExecuteCmd( "ALTER TABLE JPPEDIDO DROP COLUMN PDVALTAB" )
         ENDIF
         :ExecuteCmd( "UPDATE JPPEDIDO SET PDPEDREL = 0 WHERE PDPEDREL=''" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE COLUMN PDPEDREL PDPEDREL INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPITEM CHANGE COLUMN IDPRODUTO IDPRODUTO INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPITEM" + ;
            " CHANGE COLUMN IDPRODUTO IDPRODUTO  INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN IEGTINQTD IEGTINQTD  INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN IEGARCOM IEGARCOM   INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN IEGARVEN IEGARVEN   INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN IEALTURA IEALTURA   INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN IELARGURA IELARGURA  INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN IEPROFUND IEPROFUND  INT(11) NOT NULL DEFAULT '0', " + ;
            " CHANGE COLUMN IEQTDCOM IEQTDCOM   INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPEDIDO CHANGE COLUMN IDPEDIDO IDPEDIDO   INT(11) NOT NULL AUTO_INCREMENT" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200801
         :ExecuteCmd( "ALTER TABLE JPCIDADE CHANGE COLUMN IDCIDADE IDCIDADE INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPFISCAL" + ;
            " CHANGE COLUMN IDFISCAL IDFISCAL INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN LFPEDIDO LFPEDIDO INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "ALTER TABLE JPPRECO CHANGE COLUMN IDPRECO IDPRECO    INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPMDFCAB CHANGE COLUMN IDMDFCAB IDMDFCAB INT(11) NOT NULL AUTO_INCREMENT" )
         :ExecuteCmd( "ALTER TABLE JPMDFDET" + ;
            " CHANGE COLUMN IDMDFDET IDMDFDET INT(11) NOT NULL AUTO_INCREMENT," + ;
            " CHANGE COLUMN MDPESO MDPESO INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200804
         :ExecuteCmd( "ALTER TABLE JPBANCARIO CHANGE COLUMN BAHIST BAHIST VARCHAR(50) NOT NULL DEFAULT ''" )
      ENDIF
      IF AppVersaoDBFAnt() < 20200822
         IF :TableExists( "JPPROMIX" )
            :ExecuteCmd( "DROP TABLE JPPROMIX" )
         ENDIF
         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
         IF ! :FieldExists( "NFOBS", "JPNOTFIS" )
            :ExecuteCmd( "ALTER TABLE JPNOTFIS ADD COLUMN NFOBS VARCHAR(1000) NOT NULL DEFAULT ''" )
         ENDIF
         IF :FieldExists( "NFOBS1", "JPNOTFIS" )
            :ExecuteCmd( "UPDATE JPNOTFIS SET NFOBS = TRIM( CONCAT_WS( ' ', NFOBS1, NFOBS2, NFOBS3, NFOBS4 ) )" )
            :ExecuteCmd( "ALTER TABLE JPNOTFIS DROP COLUMN NFOBS1, DROP COLUMN NFOBS2, DROP COLUMN NFOBS3, DROP COLUMN NFOBS4" )
         ENDIF
      ENDIF
      IF AppVersaoDBFAnt() < 20200824
         IF :FieldExists( "VDDESCRI", "JPVENDEDOR" )
            :ExecuteCmd( "ALTER TABLE JPVENDEDOR CHANGE COLUMN VDDESCRI VDDESCRICAO VARCHAR(60) NOT NULL DEFAULT ''" )
         ENDIF
         IF :FieldExists( "IPSEQ", "JPITPED" )
            IF :IndexExists( "IDXPEDIDO", "JPITPED" )
               :ExecuteCmd( "ALTER TABLE JPITPED DROP INDEX IDXPEDIDO"  )
            ENDIF
            :ExecuteCmd( "ALTER TABLE JPITPED ADD INDEX IDXPEDIDO ( IPPEDIDO, IPPRODUTO )" )
            :ExecuteCmd( "ALTER TABLE JPITPED DROP COLUMN IPSEQ" )
         ENDIF
         IF :FieldExists( "IEFORNEC", "JPITEM" )
            :ExecuteCmd( "ALTER TABLE JPITEM DROP COLUMN IEFORNEC" )
         ENDIF
         :ExecuteCmd( "UPDATE JPITPED SET IPPRODUTO = '0' WHERE IPPRODUTO IS NULL OR IPPRODUTO < '0'" )
         :ExecuteCmd( "ALTER TABLE JPITPED CHANGE COLUMN IPPRODUTO IPPRODUTO INT(11) NOT NULL DEFAULT 0" )
         :ExecuteCmd( "UPDATE JPITPED SET IPFILIAL = '0' WHERE IPFILIAL IS NULL OR IPFILIAL < '0'" )
         :ExecuteCmd( "UPDATE JPITPED SET IPTRIBUT = '0' WHERE IPTRIBUT IS NULL OR IPTRIBUT < '0'"  )
         :ExecuteCmd( "ALTER TABLE JPITPED CHANGE COLUMN IPTRIBUT IPTRIBUT INT(11) NOT NULL DEFAULT '0'" )
         :ExecuteCmd( "UPDATE JPCADASTRO SET CDGRUPO = '0' WHERE CDGRUPO IS NULL OR CDGRUPO < '0'" )
         :ExecuteCmd( "UPDATE JPCADASTRO SET CDFORPAG = '0' WHERE CDFORPAG IS NULL OR CDFORPAG < '0'"  )
         :ExecuteCmd( "ALTER TABLE JPCADASTRO CHANGE COLUMN CDGRUPO CDGRUPO INT(11) NOT NULL DEFAULT '0'," + ;
            " CHANGE COLUMN CDFORPAG CDFORPAG INT(11) NOT NULL DEFAULT '0'" )
      ENDIF
   ENDWITH

   RETURN NIL


É mudar índice, nome de tabela, nome de campo, tipo de campo, juntar campos.....

É que algumas limitações de DBF se foram.

Alterar tudo isso não é dificil.... o difícil é lembrar qual é o nome atual depois.... kkkk

Mas é interessante isso de alterar tabelas: precisa precaução para o caso de já ter sido alterada antes....
Por exemplo, testar se o campo existe, antes de adicionar ou remover um campo.

Dividi as atualizações SQL por mês, a fim de apagar meses anteriores assim que possível.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14663
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Fernando queiroz, mauricioportela e 5 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