Clipper On Line • Ver Tópico - Erros comuns - Clipper e Harbour
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Erros comuns - Clipper e Harbour

27 Jul 2019 17:12

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

Código:
#command CLEAR                   => CLEAR SCREEN ; CLEAR GETS

Código:
#command CLEAR SCREEN               => CLS

Código:
#command CLS                        => Scroll() ; SetPos( 0, 0 )

Código:
#command CLEAR GETS     => ReadKill( .T. ) ; GetList := {} ; ( GetList )

Erros comuns - Clipper e Harbour

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

Código:
#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.

Código:
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

Código:
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

Código:
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

Código:
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

Código:
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.

Erros comuns - Clipper e Harbour

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

Erros comuns - Clipper e Harbour

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.

Erros comuns - Clipper e Harbour

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.

Erros comuns - Clipper e Harbour

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

Erros comuns - Clipper e Harbour

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.

Erros comuns - Clipper e Harbour

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.
Postar uma resposta