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 » 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.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: 14712
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 869 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.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: 14712
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 869 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: 674
Data de registro: 11 Jul 2005 02:46
Curtiu: 14 vezes
Mens.Curtidas: 50 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.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: 14712
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 869 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.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: 14712
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 869 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.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: 14712
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 869 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.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: 14712
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 869 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 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

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

Meu modo de trabalho

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

Meu modo de trabalho

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

Anterior



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

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