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 alxsts » 24 Set 2021 14:35

Olá!

Ok, obrigado. Pensei que tinha algo a ver com "Integer", qu também é aceito no Harbour.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2598
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 191 vezes

Meu modo de trabalho

Mensagempor Itamar M. Lins Jr. » 24 Set 2021 14:51

Olá!
É isso mesmo, pois o + é para dizer que auto incremento.

Detalhe que se for usar o DBF em 32Bit é 4 e 64Bit é 8 no campo numéric. (pelo que andei lendo)

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 5556
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 205 vezes
Mens.Curtidas: 323 vezes

Meu modo de trabalho

Mensagempor Itamar M. Lins Jr. » 24 Set 2021 15:05

Olá!
Aqui um exemplo, que fiz no Linux, tudo WEB via CGI.
*****************************
Function CriaStruCentroCustos
*****************************
*
*
LOCAL lShared := .F.
LOCAL aStru := {{"idcc"      ,"+",04,0},;
                {"centrocust","c",30,0},;
                {"descricao" ,"c",50,0},;
                {"diainclu"  ,"@",08,0},;
                {"diamodif"  ,"=",08,0},;
                {"incluido"  ,"c",20,0},;
                {"alterado"  ,"c",20,0}}
               
IF !hb_FileExists("../dados/centrocustos.dbf")               
   If !dbcreate("../dados/centrocustos.dbf",aStru,"DBFCDX")
      Return ErrorHTML( "Erro criando arquivo: centrocustos.dbf" )
   EndIf
ELSE
   ChkEstrDBF("../dados/centrocustos.dbf",aStru)
ENDIF

Return ""


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 5556
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 205 vezes
Mens.Curtidas: 323 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 24 Set 2021 19:56

Teve uma época que o incremental não podia ser editado.
Não sei se tem a ver.
E apesar de indicar que pode ser qualquer tipo de numérico, só deu certo com o I:+
É tipo integer mesmo, porque o tamanho é de 4 bytes e no changelog menciona 8 bytes pra 64 bits.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 24 Set 2021 20:27

Poka escreveu:Quintas, não sei como os outros fazem, mas se eu fizer do seu jeito não ia conseguir nunca.
Ás vezes que mudei de versões faço assim:
Faço o sistema novo, faço as rotinas para passar todas as tabelas do antigo para o novo. e vou testando, depois de tuuuudo pronto, atualizo a base de dados do antigo do cliente, confiro os relatorios, ct receber, pagar, tudo. se tudo ok, vou no cliente atualizo a base atual do antigo para o novo.
Então fica assim, o cliente termina hoje com o sistema antigo e amanha começa no novo. Deixo em um cliente só, se der erro vou acertando. depois atualizo os outros.
Gostaria até da opinião dos colegas como fazem, porque realmente é complicado.


O lado ruim é não poder tirar proveito enquanto não estiver tudo em SQL.
Tem muita tabela que dá pra transferir instantâneo, de pouco uso, ou só pra validação, então essas dá pra transferir de imediato.
Tem tabela aonde dá pra alterar a gravação, pra salvar nos dois, então é primeiro alterar com o DBF como principal, e depois com o SQL como principal.
Feito isso com as gravações, dá pra alterar os relatórios e consultas pra usar SQL em plena carga, um de cada vez.

Fica sempre em uso, sempre em teste, melhor do que trocar de uma vez e ter muitas surpresas.
É continua recebendo atualizações, o que não é possível se tiver fontes diferentes.

É que ninguém pediu, ninguém está precisando, ninguém está pagando por isso, e o melhor: ninguém está pressionando.
Então é ir fazendo conforme facilitar mais.
Dá tempo de voltar atrás, eu encontrar uma solução melhor.

E tá tudo sempre atualizado.
Considero sempre que o fonte que estou mexendo pode entrar em uso nos próximos minutos.
Melhor do que ficar mexendo em fontes diferentes pra cada situação, o que só aumentaria o trabalho e estaria sujeito a erros e complicações.

É instalar versão nova pra resolver um pipino que pode ter acontecido, e já instalar recursos novos.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 24 Set 2021 21:07

Esqueci de dizer, e também esqueci disto:

ACABOU meu uso de HBNETIO.
Vou apagar as poucas linhas que existiam nos fontes pra isso.

Vou apagar, por exemplo, isto:
FUNCTION PathAndFile( cFileName )

   IF AppDatabase() == DATABASE_HBNETIO
      cFileName := "net:" + AppEmpresaApelido() + "/" + cFileName
   ENDIF
   cFileName := Lower( cFileName )

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

Meu modo de trabalho

Mensagempor JoséQuintas » 24 Set 2021 21:22

jpa.png


Não que faça diferença mas..... encolheu um pouquinho.

Menu aplicativo tem até....
            MenuOption( "Remoto Sony",               "PTESREMSONY" )


Isso é pra pesquisar os códigos de configuração do meu controle remoto kkkk
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 25 Set 2021 08:03

A contabilidade é até um bom exemplo de que vale a pena fazer do jeito que estou fazendo.

Tenho lá as contas, os lançamentos, e outros.
Estou terminando esse "outros", só vai sobrar contas e lançamentos.

Aonde altera esses arquivos? o cadastro, a inclusão de lançamentos e a alteração de lançamentos. 3 ou 4 fontes.
Aonde tira relatório? trocentos fontes.

Altero esses 4 fontes pra gravação dupla (DBF+SQL), toda gravação de SQL fica pronta.
Talvez leve um único dia pra fazer isso.
E posso instalar em cliente, sem problema algum, relatórios usando DBF vão continuar funcionando.

Percebeu o que aconteceu com isso?
Bastou 1 único dia e tá tudo duplicado em DBF e SQL
Significa que a partir do segundo dia, posso alterar o que eu quiser, na hora que eu quiser, de DBF pra SQL, e já colocar em prática.

Em momento algum precisei de versões diferentes.

Eu mesmo nem tinha notado isto com relação à contabilidade, vai ser muito mais fácil do que todo resto.

Se vale a pena? Com certeza.
Continua sendo alterar e já instalar.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 25 Set 2021 18:40

Não é exatamente um passo a passo.
Criei a tabela no SQL.
Agora criei a conversão:
STATIC FUNCTION Update0925E()

   IF ! File( "jpcontabil.dbf" )
      RETURN Nil
   ENDIF
   IF ! AbreArquivos( "jpcontabil" )
      QUIT
   ENDIF
   GOTO TOP
   DO WHILE ! Eof()
      IF ADORecCount( "JPCONTABIL", "IDCONTABIL=" + NumberSQL( jpcontabil->idContabil ) ) == 0
         :QueryAdd( "IDCONTABIL", jpcontabil->IDCONTABIL )
         :QueryAdd( "CTLOTE",     jpcontabil->CTLOTE )
         :QueryAdd( "CTLANC",     jpcontabil->CTLANC )
         :QueryAdd( "CTMOV",      jpcontabil->CTMOV )
         :QueryAdd( "CTPARTIDA",  jpcontabil->CTPARTIDA )
         :QueryAdd( "CTDATA",     jpcontabil->CTDATA )
         :QueryAdd( "CTCTADEB",   jpcontabil->ctCtaDeb )
         :QueryAdd( "CTCTACRE",   jpcontabil->ctCtaCre )
         :QueryAdd( "CTDEBCRE",   jpcontabil->CTDEBCRE )
         :QueryAdd( "CTCONTA1",   jpcontabil->CTCONTA1 )
         :QueryAdd( "CTCCONTA",   jpcontabil->CTCCONTA )
         :QueryAdd( "CTTEXTO",    jpcontabil->CTTEXTO )
         :QueryAdd( "CTVALOR",    jpcontabil->CTVALOR )
         :QueryAdd( "CTCCUSTO",   jpcontabil->CTCCUSTO )
         :QueryAdd( "CTCONTRA",   jpcontabil->CTCONTRA )
         :QueryAdd( "CTCONTA2",   jpcontabil->CTCONTA2 )
         :QueryAdd( "CTBAIXA",    jpcontabil->CTBAIXA )
         :QueryAdd( "CTINFINC",   jpcontabil->CTINFINC )
         :QueryAdd( "CTINFALT",   jpcontabil->CTINFALT )
         :QueryExecuteInsert( "JPCONTABIL" )
      ENDIF
      SKIP
   ENDDO
   GOTO TOP
   lDelete := Eof()
   IF lDelete
      fErase( "jpcontabil.dbf" )
   ENDIF

   RETURN Nil


Em seguida vou alterar aonde grava, pra atualizar simultâneo DBF e SQL.
Isso significa que segunda feira vai estar rodando nos clientes.

Sua pergunta, se vale a pena, acabou me chamando a atenção sobre isso.

Segunda feira toda contabilidade estará em DBF e em SQL.
Os relatórios NÃO alterados, vão buscar informação de DBF.
Cada relatório que eu alterar, vai buscar informação do SQL.
Trata-se apenas de alterar e colocar em funcionamento.

Eu acho que vale a pena, porque está pronto, ao mesmo tempo que não está pronto.
Está pronto no sentido de que tudo continua funcionando.
Posso esquecer que DBF existe, mesmo ele existindo.
Posso usar todos os relatórios em DBF, mesmo estando tudo em SQL.
A partir daí, é questão de tempo, é ir alterando e colocando em prática.

Este é o ponto:
Temos mais consultas do que gravações, então, alterar as gravações é rápido.
Gravando em DBF e em SQL... tá tudo liberado pra fazer o que quiser, quando quiser.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Set 2021 12:30

O único problema é que mudei de idéia, e estou reformando toda contabilidade.
Agora vou ter que mudar 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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Set 2021 16:23

Só pra dar uma idéia:

Acabei com o uso de lotes, acabei com os saldos mensais que ficavam no plano de contas, acabei com gravação de débito e crédito em separado.
Com isso, obrigatoriamente mexer em tudo.

O mais engraçado, é que isso torna tudo ilimitado, e vai facilitar demais as coisas.

Resumindo:
Acabei com os DBFs, mas por enquanto acabei com o módulo contábil.
Quem atualizar vai ficar sem contabilidade.
Estou confiando que vou fazer tudo rápido, antes de alguém atualizar.
Uma nova contabilidade diferente da anterior o mais rápido possível, sem opção de voltar atrás.
Vai ficar tudo convertido pra SQL, pronto pra uso, mas sem aplicativo.

STATIC FUNCTION Update0925G()

   LOCAL cnSQL := ADOLocal()

   WITH OBJECT cnSQL
      IF ! :TableExists( "JPCTCONTA" )
         RETURN Nil
      ENDIF
      FOR nCont = 1 TO 96
         IF :FieldExists( "CPDEB" + StrZero( nCont, 2 ), "JPCTCONTA" )
            :ExecuteCmd( "ALTER TABLE JPCTCONTA DROP COLUMN CPDEB" + StrZero( nCont, 2 ) )
         ENDIF
         IF :FieldExists( "CPCRE" + StrZero( nCont, 2 ), "JPCTCONTA" )
            :ExecuteCmd( "ALTER TABLE JPCTCONTA DROP COLUMN CPCRE" + StrZero( nCont, 2 ) )
         ENDIF
      NEXT
      FOR EACH cName IN { "CPTMPANT", "CPTMPDEB", "CPTMPCRE", "CPALTERADA" }
         IF :FieldExists( cName, "JPCTCONTA" )
            :ExecuteCmd( "ALTER TABLE JPCTCONTA DROP COLUMN " + cName )
         ENDIF
      NEXT
   ENDWITH

   RETURN Nil


Só pra dar uma idéia, estou APAGANDO 196 campos do plano de contas, que mantinham os saldos mensais.
Com certeza, todo aplicativo é baseado nisso, por enquanto.
Ainda não faço nenhuma idéia de como vou fazer pra atualizar as contas sintéticas, ou como vou apurar o lucro com a mudança.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 26 Set 2021 18:29

saldocontabil.png


Isso é apenas parte da necessidade.
Mas substituir 192 campos por um comando de menos de um milésimo de segundo... vale a pena.
Falta muito ainda, por enquanto só fazendo testes.

Uma necessidade extra pra procedure, e outras situações, e esse COALESCE(), pra não retornar NULO.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 27 Set 2021 18:20

contabil.png


Que tal um balancete de qualquer período, usando somente SQL?
Ainda é protótipo, sem encerramento de exercício automático.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 27 Set 2021 18:55

contabil.png


Agora com apuração automática de lucro.
Ainda não sei como vou fazer pra gerar esses lançamentos automáticos no diário.
também não sei como vou atualizar sintéticas.
devagar tá indo.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 27 Set 2021 19:20

METHOD SaldoCredito( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor

   IF Type( "nOpcOficial" ) != "N"
      nOpcOficial= 1
   ENDIF
   IF nNumMes < 1 .OR. nNumMes > CONTABIL_MESMAX
      nValor := 0
   ELSE
      nValor := jpctconta->( FieldGet( FieldPos( "CPCRE" + StrZero( nNumMes, 2 ) ) ) )
   ENDIF

   RETURN nValor

METHOD SaldoDebito( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor

   IF Type( "nOpcOficial" ) != "N"
      nOpcOficial := 1
   ENDIF
   IF nNumMes < 1 .OR. nNumMes > CONTABIL_MESMAX
      nValor := 0
   ELSE
      nValor := jpctconta->( FieldGet( FieldPos( "CPDEB" + StrZero( nNumMes, 2 ) ) ) )
   ENDIF

   RETURN nValor

METHOD SaldoAnterior( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor

   nValor := ::SaldoAtual( nNumMes - 1 )

   RETURN nValor

METHOD SaldoAtual( nNumMes ) CLASS CTCONTAClass

   LOCAL nValor, nCont

   IF Type( "nOpcOficial" ) != "N"
      nOpcOficial := 1
   ENDIF
   nNumMes := Min( Max( nNumMes, 0 ), CONTABIL_MESMAX )
   nValor := jpctconta->cpSdAnt
   FOR nCont = 1 TO nNumMes
      nValor += ::SaldoDebito( nCont ) - ::SaldoCredito( nCont )
   NEXT

   RETURN nValor


Antes, tinha os 96 meses no plano de contas, isso foi eliminado.
Estou criando rotinas "equivalentes" às anteriores.
Ao invés de 96 meses em aberto, passou a ser ilimitado.
De quebra, as rotinas equivalentes ficam no SQL.

Dá pra destacar um uso interessante nessas rotinas:
Tinha lá DEB01, DEB02.... DEB96, e CRE01, CRE02... CRE96.
Criei duas rotinas pra retornar UM campo desses usando FieldGet. SaldoDebito( nCont ), SaldoCredito( nCont ).
A partir daí, para o mes 12:
nSaldo := 0
FOR nCont = 1 TO 12
   nSaldo += SaldoDebito( nCont ) - SaldoCredito( nCont )
NEXT


Se fosse muito antigamente, eu acharia complicação, porque parece dar muitas voltas pra chegar num resultado.
Mas pense bem:
      nValor := jpctconta->( FieldGet( FieldPos( "CPDEB" + StrZero( nNumMes, 2 ) ) ) )

Imagine isso em tudo que é rotina.
Do jeito que eu fiz, só essas rotinas básicas tem isso, as demais usam a função.
Dá pra dizer que deixei a complicação num fonte simples, e os fontes "mais complicados" ficaram simples com o uso dessas funções.

Vai tudo pro lixo agora.
No SQL faço tudo diretamente por DATA, não mais um número de 1 a 96.
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: 17601
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 956 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 7 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