Clipper On Line • Ver Tópico - Erros comuns - Clipper e Harbour

Erros comuns - Clipper e Harbour

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

Moderador: Moderadores

 

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 27 Jul 2019 17:12

Aliás....
vindo de std.ch

#command CLEAR                   => CLEAR SCREEN ; CLEAR GETS

#command CLEAR SCREEN               => CLS

#command CLS                        => Scroll() ; SetPos( 0, 0 )

#command CLEAR GETS     => ReadKill( .T. ) ; GetList := {} ; ( GetList )
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 27 Jul 2019 20:20

Pronto, agora separado por assunto....
TODAS as variáveis LOCAIS.

Assunto 1: configurar ambiente, repetir digitação de OS, somar 1 a cada OS

#include "inkey.ch"

PROCEDURE Main

   LOCAL nNumero := 1, nOpc

   SetMode( 35, 100 )
   CLS
   SET DATE    BRITISH
   SET CENTURY ON
   SetColor( "W/N,N/W,,,W/N" )

   DO WHILE .T.
      DigitaOS( nNumero )
      nOpc := Alert( "Digita mais OS", { "Sim", "Nao" } )
      IF LastKey() == K_ESC .OR. nOpc = 2
         EXIT
      ENDIF
      nNumero += 1
   ENDDO

   RETURN


Assunto 2: a digitação da OS.

STATIC FUNCTION DigitaOS( nNumero )

   LOCAL GetList := {}
   LOCAL nTotServico := 0, nTotProduto := 0, nTotComissao := 0, nTotDesconto := 0
   LOCAL cCliente := Space(30), cTecnico := Space(30)
   LOCAL cEquipamento := Space(30), dDataCompra := Ctod("")
   LOCAL dDataOrdem := Ctod(""), nOpc, nIdade

   @ 01,01 SAY "ORDEM DE SERVICO:" GET nNumero      PICTURE "999999" WHEN .F.
   @ 03,01 SAY "Cliente:"          GET cCliente     PICTURE "@!" Valid ! Empty( cCliente )
   @ 04,01 SAY "Tecnico:"          GET cTecnico     PICTURE "@!" Valid ! Empty( cTecnico )
   @ 05,01 SAY "Equipamento:"      GET cEquipamento PICTURE "@!" Valid ! Empty( cEquipamento )
   @ 06,01 SAY "Data da Compra:"   GET dDataCompra               Valid ! Empty( dDataCompra )
   @ 06,30 SAY "Data do Servico:"  GET dDataOrdem                valid ! Empty( dDataOrdem )
   READ

   nIdade := dDataOrdem - dDataCompra

   DO WHILE .T.
      nOpc := Alert( "Opção", { "Digita Produto", "Digita Servico", "Encerra" } )
      IF LastKey() == K_ESC .OR. nOpc = 3
         EXIT
      ENDIF
      IF nOpc != 1 .AND. nOpc != 2
         LOOP
      ENDIF
      IF nOpc == 2
         DigitaProduto( @nTotProduto, @nTotServico, @nTotComissao, @nTotDesconto, nIdade )
      ELSE
         DigitaServico( @nTotServico, @nTotServico, @nTotComissao, @nTotDesconto, nIdade )
      ENDIF
   ENDDO

   RETURN NIL


Assunto 3: a digitação de produto

STATIC FUNCTION DigitaProduto( nTotProduto, nTotServico, nTotComissao, nTotDesconto, nIdade )

   LOCAL GetList := {}
   LOCAL nLinha  := 11
   LOCAL cDescricao := Space(30)
   LOCAL nQtde, nValor, nDesconto, nTotal, nComissao := 0

   DO WHILE .T.
      nQtde := nValor := nDesconto := nTotal := 0
      @ nLinha, 01 SAY "Descricao do Produto:" GET cDescricao PICTURE "@!" Valid ! Empty( cDescricao )
      @ nLinha + 1, 01 SAY "Quantidade" GET nQtde   PICTURE "99999" Valid nQtde >= 1 .AND. Calcula( nQtde, nValor, nDesconto, nComissao, @nTotal )
      @ nLinha + 1, 14 SAY "Preco Unit." GET nValor PICTURE "999,999.99" Valid nValor >= 1 .AND. Calcula( nQtde, nValor, nDesconto, nComissao, @nTotal )
      @ nLinha + 1, 35 SAY "Desconto" GET nDesconto PICTURE "999.99" Valid nDesconto >= 0 .AND. Calcula( nQtde, nValor, nDesconto, nComissao, @nTotal )
      @ nLinha + 1, 50 SAY "Total" GET nTotal       PICTURE "999,999.99" WHEN .F.
      READ
      IF LastKey() == K_ESC
         EXIT
      ENDIF
      nTotProduto += nTotal
      nTotDesconto += ( nQtde * nValor * nDesconto / 100 )
      MostraTotais( nTotProduto, nTotServico, nTotComissao, nTotDesconto, nIdade )
      nLinha += 2
      IF nLinha > 16
         @ 11, 1 CLEAR TO 15,70
         nLinha := 11
      ENDIF
   ENDDO

   RETURN NIL


Assunto 5: digitar serviços

STATIC FUNCTION DigitaServico( nTotProduto, nTotServico, nTotComissao, nTotDesconto, nIdade )

   LOCAL GetList := {}, nLinha := 11, cDescricao := Space(30)
   LOCAL nDesconto, nComissao, nValor, nTotal

   DO WHILE .T.

      nDesconto := nComissao := nValor := nTotal := 0

      @ nLinha,     01 SAY "Descricao do Servico:" GET cDescricao PICTURE "@!"      Valid ! Empty( cDescricao )
      @ nLinha + 1, 01 SAY "Valor"    GET nValor    PICTURE "999,999.99" Valid nValor >=1 .AND. Calcula( 1, nValor, nDesconto, nComissao, @nTotal )
      @ nLinha + 1, 25 SAY "Desconto" GET nDesconto PICTURE "999.99"          Valid nDesconto >= 1 .AND. Calcula( 1, nValor, nDesconto, nComissao, @nTotal )
      @ nLinha + 1, 35 SAY "Comissao" GET nComissao PICTURE "999.99"          Valid nComissao >= 0 .AND. Calcula( 1, nValor, nDesconto, nComissao, @nTotal )
      @ nLinha + 1, 55 SAY "Total"    GET nTotal    WHEN .F.
      READ
      IF LastKey() == K_ESC
         EXIT
      ENDIF
      nTotServico  += nTotal
      nTotComissao += ( nValor * nComissao / 100 )
      nTotDesconto += ( nValor * nDesconto / 100 )
      MostraTotais( nTotProduto, nTotServico, nTotComissao, nTotDesconto, nIdade )
      nLinha += 1
      IF nLinha > 16
         @ 11, 1 CLEAR TO 15,70
         nLinha := 11
      ENDIF
   ENDDO

   RETURN NIL


Assunto 6: pra seguir um padrão, uma rotina pra mostrar totais

STATIC FUNCTION MostraTotais( nTotProduto, nTotServico, nTotComissao, nTotDesconto, nIdade )

   IF nIdade <= 365
      nTotServico := 0
   ENDIF
   IF nIdade <= 731
      nTotProduto := 0
   ENDIF

   @ 16, 0 SAY "Totais:"
   @ Row(), Col() + 2 SAY "Prod:"
   @ Row(), Col() + 2 SAY nTotProduto  PICTURE "999,999.99"
   @ Row(), Col() + 2 SAY "Serv:"
   @ Row(), Col() + 2 SAY nTotServico  PICTURE "999,999.99"
   @ Row(), Col() + 2 SAY "Com:"
   @ Row(), Col() + 2 SAY nTotComissao PICTURE "999,999.99"
   @ Row(), Col() + 2 SAY "Des:"
   @ Row(), Col() + 2 SAY nTotDesconto PICTURE "999.999.99"
   @ Row(), Col() + 2 SAY "Tot:"
   @ Row(), Col() + 2 SAY nTotProduto + nTotServico + nTotComissao PICTURE "999,999.99"

   RETURN NIL


Rotina a mais: o cálculo de cada produto

STATIC FUNCTION Calcula( nQtde, nValor, nComissao, nDesconto, nTotal )

   nTotal := ( nValor * nQtde * ( nComissao / 100 ) ) - ( nValor * nQtde * ( nDesconto / 100 ) )

   RETURN .T.


Não sei ao certo como ficariam os valores na garantia, ou a comissão do técnico, então não alterei cada valor.
Um detalhe a mais sobre separar em rotinas é: NOMES de variáveis. Acabamos podendo usar mesmo nome em rotinas diferentes.

Pra não ter que passar tanta variável entre as rotinas, talvez mais interessante transformar tudo em ARRAY, e usar #define pra não cometer erros de digitação.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 27 Jul 2019 21:09

Até que ficou interessante.
Já teve programador por aqui perguntando como fazer algo assim...
Todo mundo sempre tem algo a ensinar, não importa se é programador experiente ou principiante.

Lembrando: o fonte inicial com o funcionamento veio pronto, eu apenas fiz ajustes.
Nota: aqui usando array

codos.prg
(5.43 KiB) Baixado 85 vezes


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

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 27 Jul 2019 21:22

Por causa da garantia não saíram os valores dos produtos.
Por erro na Picture, o desconto também não saiu.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 29 Jul 2019 12:22

Lembrei de outro erro comum: versão separada

É...
O cara quer passar de Clipper pra Harbour, ou Xharbour pra Harbour, ou console pra GUI, ou RDD, ou outra coisa...
Aí cria um programa em separado.... e vai atualizando... ou não atualiza... e para tudo...
Depois começa de novo... para tudo...
E fica assim por anos, sem sair do lugar.

Faça um teste sem separado, pra ver se funciona, depois coloque no aplicativo e coloque pra rodar nos clientes.
Deu certo? Ok. Veja se dá pra melhorar, e vá em frente, sempre colocando pra rodar nos clientes.
Com isso, tudo vai estar sempre vivo e atualizado.

Quantas vezes começou e parou?
Há quanto vém começando e parando?
Se estivesse instalado nos clientes... estaria apenas continuando, e não tendo que começar do zero.
Já ENXERGUE tudo que pode dar certo ou errado nisso que fez, pra ver se pode continuar indo em frente.

Isso é o incentivo que falta: ir em frente, sair do lugar, nem que seja um passo de cada vez.

Resolveu uma coisa em um dia: ótimo... isso já poderia fazer parte de todos os aplicativos. vai ver TODOS indo em frente.

Tem um montão de fonte pra resolver isso... anos e anos e continuam...
Se resolver apenas uma coisa, em todos os fontes, as pendências vão se reduzindo a cada ano.
E está com aquilo na cabeça, pronto pra ser aplicado, "craque" pra fazer aquilo, é a melhor hora pra mexer em tudo.

Se for alterar uma coisa de cada vez, em cada fonte, em cada aplicativo, vai ter esquecido o que fez no primeiro, seria como começar tudo de novo.
É aproveitar que uma alteração está na cabeça, que está "na ponta da língua", e aplicar em tudo.
Vai ficar mais "craque" nessa alteração, vai virar um "expert" nisso, e depois vê a próxima alteração.
Na próxima, aproveita pra corrigir alguma da anterior que deixou passar.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 29 Jul 2019 12:32

Não atualizar o sistema automático.

Acho que nos dias de hoje isso pode ser considerado um erro, um grande erro.

Quantas vezes no cliente trocar versão? centenas?
quanto tempo pra ir no cliente, trocar, e voltar? 1 hora no mínimo?
São centenas de horas fazendo isso.
Não pode gastar menos horas e preparar isso automático?

1) Atualização do EXE

Coloque pra fazer, em um cliente, teste, confirme, depois mais de um.

2) Backup

Comece colocando um backup, isso é um ponto importante.
Deixe rodando, confira, tudo ok, backup funcionando....
Coloque em mais clientes... tudo ok... então próxima etapa.

3) Comece a atualização automática.

Pode ser o controle, sem atualizar nada, só pra confirmar se o backup vai funcionar.
Ok... funcionou, comece com atualizações bem básicas pra ver se funciona.
Ok... vai testando mais complicado
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 29 Jul 2019 12:46

Ainda no caso anterior:

Pode começar só você podendo fazer isso.
Primeiro você faz presencial, assim pode consertar se precisar.

Veja o que acontece, e vai melhorando.
Até que isso possa acontecer sem você por perto.
Qualquer problema.... aquelas trocentas horas em vários clientes... vão ser reduzidas a um único cliente eventual.
E já acerta o automático sobre esse caso eventual.

E por aí vai...

Como faz tudo isso?
Ué... Você é quem sabe o que o seu aplicativo precisa, apenas coloque isso dentro do programa.

Cada cliente é de um jeito....
Precisa ser cada um de um jeito ? Não dá pra deixar todos iguais?
Se der pra fazer isso, menos trabalho, mais fácil saber o que precisa fazer.

Mesma coisa que já falei antes: uma coisa de cada vez.
Precisa padronizar pastas/atalhos/etc? então comece padronizando, um de cada vez.

NUNCA tenha pressa.
Vai preparando os ambientes, vai organizando tudo, nos clientes mas PRINCIPALMENTE NA SUA MÁQUINA, porque dela sai tudo.
Um pouco por dia, o importante é ir em frente, vai preparando.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Erros comuns - Clipper e Harbour

Mensagempor JoséQuintas » 29 Jul 2019 13:00

PATH RELATIVO

Isso muitos esquecem, e bagunçam tudo.
Pra que isso?

USE H:\SISTEMA\ARQUIVOS\cliente.dbf

Não é melhor

USE ARQUIVOS\cliente.dbf

Agora pode instalar local, em rede, no cliente numa pasta, em sua máquina em outra, pode até ter duas pastas no cliente uma com a versão velha e outra com a versão nova.

o PATH RELATIVO é o PATH partindo da pasta atual como referência.
A pasta atual... tanto faz, não importa mais.

Este é um erro cometido até por algumas LIBs... que enchem de parâmetros só por causa de usar nome fixo, e complicam a vida dos usuários.

Fugir um pouco pra falar sobre HBC.

HMGEXTENDED.HBC
incpaths=include
libpaths=lib

se o HBC estiver assim.... tanto faz a pasta da HMG Extended, ele sempre vai indicar as pastas dela
No caso do HBC, ele indica a pasta RELATIVA
A partir daí, só indicar no projeto (ou no Harbour) aonde pesquisar o HBC.
Muuuito melhor do que ficar configurando variáveis para pasta include, pasta lib, etc., que podem ser diferentes para cada usuário. Aonde o usuário instalar é aonde vai funcionar - fim.

Faça no aplicativo igual: o PATH atual sendo o PATH base de tudo, sem nem mesmo importar aonde está o EXE.
Se tem subpastas, só indicar arquivo\cliente.dbf, nota\arquivo.xml, etc. etc.

E veja se usa versão atualizada de Harbour.
Isso já teve problema em versões antigas, talvez a 3.0 ou a 3.1, quando usada lib gráfica.

Também tem função pra retornar o nome do EXE com path e tudo... também pode ser usado como referência: a pasta do EXE.
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: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

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