Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
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 )
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.
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
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.
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.
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
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.
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.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.