Ajuda com Código [Iniciante]

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

didzao
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 26 Jul 2019 02:26
Localização: Maringá - PR

Ajuda com Código [Iniciante]

Mensagem por didzao »

Olá! Eu estou estudando Harbour através de um projeto de Trainee (iniciei faz 2 semanas) e passaram um projeto para criar um programa de Ordem de Serviço, porém eu estou meio empacada. Eu já busquei soluções no Google e estou com o pdf do Vlademiro Landim, porém, mesmo assim, eu continuo com dificuldades. Vou listar os objetivos do programa e as dificuldades que estou tendo aqui para ficar mais fácil:

Objetivos:
1) a cada nova ordem de serviço o contador tem que somar +1 (ou não contar caso o usuário cancele)
2) o usuario pode digitar quantos produtos e dados quiser
3)no fim deve aparecer o quanto o usuário deverá pagar, mostrando se teve desconto de garantia, ou não.

Dificuldades
1) Eu uso o Alert para quando o usuário apertar o Esc, porém, não funciona.
2) Quando o usuário digita P ou S é gerado o laço de repetição para ele inserir os dados do produto/serviço, porém eu é necessário que ele introduza novamente o nome do produto/serviço quando der enter (e isso está acontecendo)
3) eu gostaria de fazer com que, quando o usuário terminasse de digitar as descrições do produto (por exemplo) fosse possível que ele tivesse a opção de digitar os dados do Serviço (e vice-versa)
4) tem outras, mas eu considero essas aí as piores.

Gostaria de saber se alguém poderia me ajudar.
Vou anexar o arquivo do que eu já fiz.

Obs: por enquanto só posso usar Do While..enddo e If(elseif)....endif porque foi o que passaram e o que permitem usar.
Obs2: eu sou iniciante na programação, o máximo que já estudei foi um pouco de JavaScript, então estou com algumas dificuldades.
Obs3: Não sei se isso é relevante, mas nós usamos o editor Q no curso e um programa da própria empresa para compilar e rodar o programa.

Desde já agradeço a atenção! :D
Anexos
Cod OS.prg
(5.81 KiB) Baixado 93 vezes
Erros só provam que você está tentando. - Luxana Crownguard
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Ajuda com Código [Iniciante]

Mensagem por Vlademiro »

Olá didzao, bem vindo ao mundo xBase

Vamos por partes

1) Eu uso o Alert para quando o usuário apertar o Esc, porém, não funciona.

Quando o usuário tecla ESC o valor de retorno do ALERT é 0 (zero), por isso que ele não sai do laço, porque o EXIT só é chamado com nAviso = 1

2) Quando o usuário digita P ou S é gerado o laço de repetição para ele inserir os dados do produto/serviço, porém eu é necessário que ele introduza novamente o nome do produto/serviço quando der enter (e isso está acontecendo)

Você está inicializando o valor das variáveis dentro do laço (WHILE), por isso que o valor é perdido.

3) eu gostaria de fazer com que, quando o usuário terminasse de digitar as descrições do produto (por exemplo) fosse possível que ele tivesse a opção de digitar os dados do Serviço (e vice-versa)

A forma mais fácil de se fazer isso, na minha opinião é criar uma condição após o READ. Mais ou menos assim :

Código: Selecionar todos

@ seus comandos SAY GET
READ
IF SERVIÇO // 
      @ seus comandos SAY GET
       READ
ENDIF



4) tem outras, mas eu considero essas aí as piores.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Código [Iniciante]

Mensagem por JoséQuintas »

O objetivo é mesmo aprender, ou apenas fazer esse?

Eu diria pra, se é pra aprender mesmo, acostumar a fazer do melhor jeito, apesar de talvez complicar um pouco, vai ser muito melhor pro futuro.

Relembrar algumas coisas da programação, que foram esquecidas nos dias de hoje:

- A primeira coisa pra se programar é.... desligar o computador

É que precisa pensar um pouco antes de fazer, o "desligar o computador" seria fazer isso sem qualquer dúvida

- Dividir o problema em pedaços, assim um problema grande vai se transformar em pequenos problemas, e resolve-se um problema pequeno de cada vez

Podemos usar funções/rotinas. FUNCTION nome()
Isso é até bom pra poder enxergar melhor cada parte do fonte, desde que seja dividido "por assunto/problema".

Então vamos lá...
Primeiro é configurar o ambiente de trabalho, antes de qualquer coisa, porque tudo vai seguir essa configuração.
E o LOOP de digitar OS.

Código: Selecionar todos

nOrdemServico := 1
cContinua   := "S"

SET DATE BRITISH
SET CENTURY ON
DO WHILE .T.
   CLEAR
   DigitaOS()
   @ 24, 0 SAY "Digita mais Ordem de serviço?" GET cContinua PICTURE "!A" VALID cContinua $ "SN"
   READ
   @ 24, 0
   IF cContinua == "N"
      EXIT
   ENDIF
   nOrdemServico += 1
ENDDO
Pronto.
Um problema resolvido.
A cada digitação de OS pergunta se continua, e soma 1 a cada OS se tiver continuação.
Agora o próximo problema a resolver é digitar uma OS, que vai ser a DigitaOs().
Essa nova rotina nem precisa se preocupar com número, porque já vém pronto da rotina principal.

Só que chamou a atenção esta parte:

Quando o usuário digita P ou S é gerado o laço de repetição para ele inserir os dados do produto/serviço, porém eu é necessário que ele introduza novamente o nome do produto/serviço quando der enter (e isso está acontecendo)

A que exatamente se refere isso?
A idéia seria manter a mesma descrição que já foi digitada, ou pesquisar alguma descrição existente?
Se for isso, precisaria existir um cadastro de descrições.
E se for salvar a OS, também teria que existir o cadastro de OS.

Só pra adiantar, a continuação do fonte seria:

FUNCTION DigitaOS()

// e aqui o que se refere a digitação de OS.

Acho que deu pra perceber que dividindo "por assunto" pode deixar o fonte mais organizado e fácil de entender/mexer.
Vai poder também dividir a parte de digitação de produto e serviço em rotinas assim.

Se criar um único fonte "linguição", vai ficar cada vez mais difícil de enxergar na tela, o que pode facilitar a cometer erros por não ver direito o que acontece.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Código [Iniciante]

Mensagem por JoséQuintas »

Sobre o Alert() já foi dito, só precisa decidir se ESC vai valer SIM ou NÃO.

Código: Selecionar todos

      nAviso := Alert("Deseja mesmo cancelar?", {"Sim","Nao"})
      If nAviso = 1
         Exit
      Endif
pode comparar o contrário: ao invés de nAviso = 1, colocar nAviso != 2 // isso equivale a nAviso <> 2, que equivale a nAviso == 0 .OR. nAviso == 1

Acostume também a usar os arquivos CH, são constantes - "traduções" - pra colocar no fonte e facilitar leitura.
Para as teclas existe o inkey.ch.
No começo do fonte: #include "inkey.ch"

E na comparação de tecla, ao invés de IF LastKey() == 27, pode usar IF LastKey() == K_ESC
K=Keyboard (teclado) e ESC... é a tecla ESC. Mais fácil "ler" o fonte sem ter dúvida, principalmente porque vai acabar comparando muitas outras teclas depois, não apenas a ESC.
Importante destacar que precisa ser escrito exatamente igual no CH, inclusive letras maiúsculas.
Depois vai acabar usando teclas 5, 24, 3, 18, etc... e lembrar o que é cada número complica, mais fácil usar o nome K_UP, K_DOWN, K_PGUP, K_PGDN
Melhor para o HUMANO, e o fonte é para o HUMANO. Para o computador... tanto faz... ele não se importa, o problema é só seu.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
didzao
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 26 Jul 2019 02:26
Localização: Maringá - PR

Ajuda com Código [Iniciante]

Mensagem por didzao »

Olá Sr. José! Obrigada por ter me respondido.
Então, eu estou fazendo um curso de Trainee, que vale uma vaga de emprego no final, o objetivo do curso é identificar quem tem facilidade com programação, para eles "lapidarem" essa facilidade conforme os moldes da empresa, porém, durante as aulas são passados exercícios tranquilos para serem feitos, mas durante a prova (que foi esse exercício no caso) é passado uma tarefa longa e meio complicada (complicada para quem está estudando essa linguagem faz 10 dias), e temos apenas 3 horas para pensar, digitar, compilar e testar. No meu caso eu quero realmente aprender, porém tem algumas coisas que são um pouco complicadinhas para mim ainda.
Eu concordo que usar uma função seria mais fácil, porém não nos foi passado essa parte ainda (e creio que nem vão entrar nessa parte, visto que o curso logo acaba), então, se eu usar isso para resolver, eles vão descontar pontos da minha avaliação.
E quanto ao nAviso, eu creio que o programa que eles passam para compilar que está com erro (ao menos aqui no meu pc) porque não acontece nada, mesmo eu seguindo o que foi me sugerido aqui. E no curso eles nos "obrigam" a usar LastKey() == 27, usar K_ESC para eles é "errado" porque foge dos moldes da empresa :(

E sobre isso "A que exatamente se refere isso?
A ideia seria manter a mesma descrição que já foi digitada, ou pesquisar alguma descrição existente?
Se for isso, precisaria existir um cadastro de descrições.
E se for salvar a OS, também teria que existir o cadastro de OS
."

Eu queria fazer o seguinte, o usuário vai digitar os dados (como nome do cliente, técnico, data da compra etc) e depois escolher se vai abrir uma ordem de chamado para um produto ou um serviço, aí se ele escolhe produto, ele digita o que quer e depois que finalizar, ele tem que ter a opção de poder abrir uma ordem para o serviço (sem precisar digitar novamente os dados do cliente, uma vez que tudo isso vai estar dentro de apenas uma OS), para poder digitar os dados e no fim somar todos os valores (tanto o do produto quanto o do serviço) e mostrar na tela. (não sei se ficou claro)
Erros só provam que você está tentando. - Luxana Crownguard
didzao
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 26 Jul 2019 02:26
Localização: Maringá - PR

Ajuda com Código [Iniciante]

Mensagem por didzao »

Olá Vlademiro! Obrigada por responder!

Acho que o programa que me foi passado para compilar e rodar o código está com algum tipo de conflito no meu computador, porque mesmo seguindo passo a passo o que você me falou ele não funciona.
Eu mudei para If as condições do P e S (que antes estavam em Do while), porém, quando eu dou enter, ele volta para eu digitar o nome do cliente novamente, o que pode estar causando isso? (eu mantive as variáveis de cada uma dentro dos If)
E eu teria que criar um alerta para que quando o usuário terminasse de digitar os dados do produto (por exemplo) ele pudesse chamar o if do serviço? Algo do tipo

Código: Selecionar todos

nAvisoP := Alert("O que deja fazer?" {"Finalizar", "ir para serviço", "cancelar"})
if nAvisoP = 2
  [ir para a parte do serviço]
endif
(e vice-versa)

E você é o autor do INTRODUÇÃO A PROGRAMAÇÃO USANDO A LINGUAGEM HARBOUR né? Se for meus parabéns! O seu trabalho está me ajudando bastante a desbravar esse novo mundo do Harbour! :D
Erros só provam que você está tentando. - Luxana Crownguard
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Ajuda com Código [Iniciante]

Mensagem por Vlademiro »

Posta de novo o seu código para a gente ver.

Com certeza já deve ter alterado alguma coisa desde a última postagem.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Código [Iniciante]

Mensagem por JoséQuintas »

Um esqueleto pra servir de base.

Código: Selecionar todos

CLS

SET DATE BRITISH
SET CENTURY ON
nOrdemServico := 1
DO WHILE .T.

   nTotais := 0
   mProduto := Space(30)
   mServico := Space(30)

   @ 01,01 SAY "ORDEM DE SERVICO N:"
   @ 01,22 GET nOrdemServico
   @ 03,01 SAY "Cliente:"
   @ 04,01 SAY "Tecnico:" 
   READ
   DO WHILE .T.
      nResp := Alert( "O que fazer", { "Digita Produto", "Digita Servico", "Encerrar" } )
      IF nResp = 3
         EXIT
      ENDIF  
      IF nResp = 1
         @ 2, 2 GET mProduto
         READ
         nTotais += nQtde * nValor
      ENDIF
      IF nResp = 2
         @ 2, 2 GET mServico
         READ
         nTotais += nValor
      ENDIF
   ENDDO
   @ 23, 2 SAY nTotais
   nResp := Alert( "Mais OS?", { "Sim", "Nao" } )
   IF nResp == 1
      EXIT
   ENDIF
   nOrdemServico += 1
ENDDO
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Código [Iniciante]

Mensagem por JoséQuintas »

E na digitação de produto/serviço, pode colocar outro DO WHILE pra ficar pedindo vários em seguida.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Código [Iniciante]

Mensagem por JoséQuintas »

Faltou dizer:

pra principiante, o fonte tá muito bom.
melhor do que de alguns programadores com mais experiência.
se começando já está assim.... vai ficar muito melhor.

Só esse curso que pode atrapalhar kkkk
Na prática depende do que vém depois, talvez não queiram complicar ainda.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
didzao
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 26 Jul 2019 02:26
Localização: Maringá - PR

Ajuda com Código [Iniciante]

Mensagem por didzao »

Pessoal, eu dei uma melhorada (conforme me foi dado o feedback no curso e o que vocês sugeriram aqui) Não está 100%, mas acho que está bem melhor que antes (no meu ponto de vista, claro)

E sr. José muito obrigada pelo elogio! Com certeza vou continuar estudando para melhorar ainda mais! :D

Mais uma vez, muito obrigada pela atenção de vocês! :))
Anexos
OS.prg
(10.29 KiB) Baixado 92 vezes
Erros só provam que você está tentando. - Luxana Crownguard
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Ajuda com Código [Iniciante]

Mensagem por MSDN »

Uma dúvida, a vaga é para a SG Sistemas ?
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Ajuda com Código [Iniciante]

Mensagem por Kapiaba »

Eu faria assim Ingrid:

Código: Selecionar todos

//INGRID LOHMANN

FUNCTION OS()

   CLEAR
   SET DATE TO British
   SET CENTURY ON
   SET MESSAGE TO 17 Center
   // Set Delimiters On
   // Set Delimiters to "[]"

   //VARIAVEIS SENHA
   cLogin := space( 5 )
   cSenha := space( 8 )

   @ 10, 30 TO 15, 49 Double

   @ 12, 32 SAY "Login:"
   @ 13, 32 SAY "Senha:"

   @ 12, 40 GET cLogin PICTURE "@!" VALID !Empty( cLogin )
   @ 13, 40 GET cSenha              VALID !Empty( cSenha )
   READ

   nOrdemServico := 1 //contador autom tico

   nOpcao := 0

   DO WHILE ( cLogin = "SUPER" ) .AND. ( cSenha = "123mudar" )

      CLEAR

      @ 10, 25 TO 16, 53 Double

      @ 12, 30 SAY "O que deseja fazer?"
      @ 13, 30 PROMPT "1 Efetuar Vendas." MESSAGE "Essa opcao ira abrir o programa"
      @ 14, 30 PROMPT "2 Sair."           MESSAGE "Essa opcao ira sair do programa"

      MENU TO nOpcao

      // @ 14,46 Get nOpcao Picture "9" Valid !Empty(nOpcao)
      // Read


      //Do While nOpcao = 1
      IF nOpcao == 1

         //VARIAVEIS GERAIS
         cNomeCliente          := space( 50 )
         cNomeTecnico          := space( 40 )
         cDescricaoEquipamento := space( 50 )
         dDataOrdemServico     := Date()
         dDataCompra           := Ctod( "" )
         nLinhaFixa            := 10
         nLinhaPergunta        := 09
         nLinha                := 12
         cTipoOrdem            := space( 1 )
         nProdutoFinalG        := 0
         nServicoFinalG        := 0
         nLimite               := 0

         //VARIAVEIS ENDEREÇO
         cEndereco      := space( 30 )
         cBairro        := space( 15 )
         cReferencia    := space( 15 )
         cTelefone      := space( 12 )
         cDomicilio     := space( 1 )

         CLEAR

         cChamado := "Digite P para produto ou S para servico:"

         //VARIAVEIS VALOR TOTAL
         nProdutoFinal  := 0
         nServicoFinal  := 0
         nComissaoTotal := 0

         @ 01, 01 SAY "ORDEM DE SERVICO N:"
         @ 01, 22 SAY nOrdemServico
         @ 03, 01 SAY "Cliente:"
         @ 04, 01 SAY "Tecnico:"
         @ 05, 01 SAY "Descricao do Equipamento:"
         @ 06, 01 SAY "Data da Compra:"
         @ 06, 30 SAY "Data do Serviço:"
         @ 07, 01 SAY "Deseja entrega a domicilio?"

         @ 03, 10 GET cNomeCliente          PICTURE "@!"                     ;
            VALID !Empty( cNomeCliente )
         @ 04, 10 GET cNomeTecnico          PICTURE "@!"                     ;
            VALID !Empty( cNomeTecnico )
         @ 05, 27 GET cDescricaoEquipamento PICTURE "@!"                     ;
            VALID !Empty( cDescricaoEquipamento )
         @ 06, 17 GET dDataCompra           PICTURE "@D 99/99/9999"          ;
            VALID !Empty( dDataCompra ) .AND. ( dDataCompra <= dDataOrdemServico )
         @ 06, 47 SAY dDataOrdemServico
         @ 07, 31 GET cDomicilio            PICTURE "@!"                     ;
            VALID !Empty( cDomicilio ) .AND. ( cDomicilio = "S" .OR. cDomicilio = "N" )
         READ

         IF cDomicilio = "S"

            @ 08, 01 SAY "Endereco:"
            @ 09, 01 SAY "Bairro:"
            @ 10, 01 SAY "Referencia:"
            @ 11, 01 SAY "Telefone:"

            @ 08, 11 GET cEndereco   PICTURE "@!" VALID !Empty( cEndereco )
            @ 09, 09 GET cBairro     PICTURE "@!" VALID !Empty( cBairro )
            @ 10, 13 GET cReferencia PICTURE "@!" VALID !Empty( cReferencia )
            @ 11, 11 GET cTelefone   PICTURE "@!" VALID !Empty( cTelefone )
            READ

            nLinhaPergunta := 14
            nLinhaFixa     := 17
            nLinha         := 19

         ENDIF

         IF LastKey() == 27

            nAlerta := Alert( "Deseja Continuar", { "Sim", "Nao" } )

            IF nAlerta = 2
               nOrdemServico--
               EXIT
            ELSE
               LOOP
            ENDIF

         ENDIF

         nOrdemServico += 1

         DO WHILE .T.

            @ nLinhaPergunta - 1, 01 SAY "Limite:"
            @ nLinhaPergunta, 01 SAY "Digite P para produto ou S para servico:"

            @ nLinhaPergunta - 1, 10 GET nLimite  PICTURE "@E 9,999.99" ;
               VALID !Empty( nLimite )
            @ nLinhaPergunta, 41   GET cTipoOrdem PICTURE "@!"          ;
               Valid ( ( cTipoOrdem = "P" ) .OR. ( cTipoOrdem = "S" ) )
            READ

            IF LastKey() == 27

               nAviso := Alert( "Deseja mesmo cancelar?", { "Sim", "Nao" } )

               IF nAviso = 1
                  EXIT
               ENDIF

            ENDIF

            cTotal := "Total a pagar:"

            DO WHILE cTipoOrdem = "P"

               //VARIAVEL NOME PRODUTO
               cDescricaoProduto := space( 30 )

               nTotalServico     := 0

               //VARIAVEIS PRODUTO
               nQuantidade       := 0
               nPrecoUnitario    := 0
               nDescontoProduto  := 0

               // Total com  Desconto :Total - (Total*Desconto/100)

               @ nLinhaFixa, 01 SAY "Descricao do Produto:"
               @ nLinhaFixa, 23 GET cDescricaoProduto    PICTURE "@!"        ;
                  VALID !Empty( cDescricaoProduto )

               @ nLinhaFixa + 1, 01 SAY "Quantidade"
               @ nLinhaFixa + 1, 14 SAY "Preco Unit."
               @ nLinhaFixa + 1, 35 SAY "Desconto"
               @ nLinhaFixa + 1, 50 SAY "Total"
               @ nLinhaFixa + 6, 01 SAY "Total Final:"

               @ nLinha, 01 GET nQuantidade      PICTURE "99999"             ;
                  VALID nQuantidade      >= 1
               @ nLinha, 14 GET nPrecoUnitario   PICTURE "@E 9,999,999,999.99" ;
                  VALID nPrecoUnitario   >= 1
               @ nLinha, 35 GET nDescontoProduto PICTURE "99999.99"          ;
                  VALID nDescontoProduto >= 0
               READ

               //COMISSAO PRODUTO
               nComissaoProduto  := ( ( nPrecoUnitario * nQuantidade ) * ( 0.02 ) )

               //TOTAL UNITARIO
               nTotalProduto := ( nPrecoUnitario * nQuantidade ) - ( ( nPrecoUnitario * nQuantidade ) * ( nDescontoProduto/100 ) ) + ( nComissaoProduto )
               @ nLinha, 50 say + AllTrim( Transform( nTotalProduto, "@E 999,999,999,999.99" ) )

               //TOTAL FINAL
               nProdutoFinal := nProdutoFinal + nTotalProduto

               IF nLinha > 23 .AND. cEndereco != "S"
                  @ nLinha, 01 CLEAR TO 15, 70
                  nLinha := 11
               ELSEIF nLinha > 23 .AND. cEndereco = "S"
                  @ nLinha, 01 CLEAR TO 15, 70
                  nLinha := 18
               ENDIF

               nGarantiaProduto := dDataOrdemServico - dDataCompra // 2 anos (730 ou 731 dias)

               IF nGarantiaProduto <= 731

                  @ nLinhaFixa + 7, 01 SAY cTotal
                  @ nLinhaFixa + 7, 16 SAY nProdutoFinalG PICTURE "@E 9,999.99"

               ELSE

                  @ nLinhaFixa + 7, 01 SAY cTotal
                  @ nLinhaFixa + 7, 16 SAY nProdutoFinal  PICTURE "@E 999,999,999.99"

               ENDIF

               IF LastKey() == 27

                  nAviso1 := Alert( "O que deseja fazer?", { "Finalizar e inicar outro chamado", "Apenas Finalizar", "Cancelar" } )

                  IF nAviso1 = 1
                     @ nLinhaFixa + 8, 13 SAY nProdutoFinal PICTURE "@E 999,999,999.99"
                     @ nLinhaPergunta, 01 SAY cChamado
                     @ nLinhaPergunta, 41 GET cTipoOrdem    PICTURE "@!" ;
                        Valid ( ( cTipoOrdem = "P" ) .OR. ( cTipoOrdem = "S" ) )
                     READ
                     CLEAR
                  ELSEIF nAviso1 = 2
                     @ nLinha + 4, 13 SAY nProdutoFinal PICTURE "@E 999,999,999.99"
                     EXIT
                  ELSE
                     EXIT
                  ENDIF

               ENDIF

               nLinha++

            ENDDO

            DO WHILE cTipoOrdem = "S"

               nTotalProduto := 0

               //VARIAVEL NOME SERVICO
               cDescricaoServico := space( 30 )

               //VARIAVEIS SERVIÇO
               nDescontoServico  := 0
               nComissaoTecnico  := 0
               nValorServico     := 0

               @ nLinhaFixa, 01 SAY "Descricao do Servico:"
               @ nLinhaFixa, 23 GET cDescricaoServico PICTURE "@!"           ;
                  VALID !Empty( cDescricaoServico )
               READ

               @ nLinhaFixa + 1, 01 SAY "Valor"
               @ nLinhaFixa + 1, 25 SAY "Desconto"
               @ nLinhaFixa + 1, 35 SAY "Comissao"
               @ nLinhaFixa + 1, 55 SAY "Total"
               @ nLinhaFixa + 4, 01 SAY "Total Final:"

               @ nLinha, 01 GET nValorServico     PICTURE "@E 999,999,999.99" ;
                  VALID nValorServico    >= 1
               @ nLinha, 25 GET nDescontoServico  PICTURE "99999.99"          ;
                  VALID nDescontoServico >= 1
               @ nLinha, 35 GET nComissaoTecnico  PICTURE "99999.99"          ;
                  VALID nComissaoTecnico >= 0
               READ

               nTotalServico := nValorServico + ( nValorServico * ( nComissaoTecnico/100 ) ) - ( nValorServico * ( nDescontoServico/100 ) )

               @ nLinha, 55 say + AllTrim( Transform( nTotalServico, "@E 999,999,999,999.99" ) )

               nComissaoTotal := nComissaoTotal + ( nValorServico * ( nComissaoTecnico/100 ) )
               nServicoFinal  := nServicoFinal + nTotalServico

               @ nLinha + 8, 01 SAY "Total Comissao:"
               @ nLinha + 8, 18 SAY Transform ( nComissaoTotal, "@E 999,999.99" )

               IF nLinha > 23 .AND. cEndereco != "S"
                  @ nLinha, 01 CLEAR TO 15, 70
                  nLinha := 11
               ELSEIF nLinha > 23 .AND. cEndereco = "S"
                  @ nLinha, 01 CLEAR TO 15, 70
                  nLinha := 18
               ENDIF

               IF LastKey() == 27
                  nAviso2 := Alert( "O que deseja fazer?", { "Finalizar e inicar outro chamado", "Apenas Finalizar", "Cancelar" } )
                  IF nAviso2 = 1
                     @ nLinha + 6, 13 SAY nServicoFinal PICTURE "@E 999,999,999.99"
                     @ nLinhaPergunta, 01 SAY "Digite P para produto ou S para servico:"
                     @ nLinhaPergunta, 41 GET cTipoOrdem  PICTURE "@!" Valid ( ( cTipoOrdem = "P" ) .OR. ( cTipoOrdem = "S" ) )
                     READ
                     CLEAR
                  ELSEIF nAviso2 = 2
                     @ nLinha + 6, 13 SAY nServicoFinal PICTURE "@E 999,999,999.99"
                  ELSE
                     EXIT
                  ENDIF
               ENDIF

               nGarantiaServico := dDataOrdemServico - dDataCompra // 1 ano  (365 ou 366 dias)

               IF nGarantiaServico <= 366
                  @ nLinhaFixa + 7, 01 SAY cTotal
                  nProdutoFinalG := 0
                  @ nLinhaFixa + 7, 16 SAY nServicoFinalG PICTURE "@E 9,999.99"
               ELSE
                  @ nLinhaFixa + 7, 01 SAY cTotal
                  @ nLinhaFixa + 7, 16 SAY nServicoFinal  PICTURE "@E 999,999,999.99"
               ENDIF
               nLinha++
            ENDDO

            nTaxaDomicilio := ( ( nProdutoFinal + nServicoFinal ) * ( 0.03 ) )

            //VARIAVEIS SUPERVISOR
            cSupervisor      := space( 10 )
            cSenhaSupervisor := space( 10 )

            DO WHILE ( nProdutoFinal + nServicoFinal ) > nLimite

               CLEAR

               SET COLOR TO "R/N,R/N"
               @ 10, 30 TO 15, 55 Double

               @ 12, 32 SAY "Login:"
               @ 13, 32 SAY "Senha:"

               @ 12, 40 GET cSupervisor      PICTURE "@!" ;
                  VALID !Empty( cSupervisor )
               @ 13, 40 GET cSenhaSupervisor PICTURE "@!" ;
                  VALID !Empty( cSenhaSupervisor )
               READ

               SET COLOR TO "BG/N"

               IF cSupervisor = "SUPERVISOR" .AND. cSenhaSupervisor = "LIBERAR123"
                  @ 24, 01 SAY "Total da OS:"
                  @ 24, 14 SAY Transform ( ( nProdutoFinal + nServicoFinal + nTaxaDomicilio ), "@E 999,999.99" )
               ELSE
                  EXIT
               ENDIF
               //nTotalOrdem := nTotalServico + nTotalProduto

            ENDDO

         ENDDO

      ELSE

         EXIT

      ENDIF

   ENDDO

RETURN NIL
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Ajuda com Código [Iniciante]

Mensagem por Vlademiro »

Olá,

No meu primeiro estágio foi desse mesmo jeito: a empresa passava as tarefas e informava uma série de restrições, do tipo: “não pode sair de uma função no meio dela”, “as variáveis lógicas devem começar com a letra ‘L’” e outras que eu achava absurdas (algumas eram mesmo). Como já foi dito, procure traçar a rotina principal no papel (ou em algum software que gere diagramas, como o Dia ou Visio). As vezes a gente pensa que “pegou” a ideia principal mas quando vamos desenhar notamos que não dominamos a ideia geral tão bem assim.

Procure traçar as linhas gerais e só depois vá para o particular. O problema que você tem que resolver é básico mas se torna chato porque a empresa (por conta do treinamento) não permite o uso de funções. Dessa forma, você tem que criar muitos níveis de indentação e criar condições de saída de laços internos para sair do laço mais externo (o comando BEGIN SEQUENCE faz isso, mas não sei se é permitido o seu uso). Evite os detalhes, concentre-se na estrutura geral.

Fiz pequenos programas com a ideia geral, dê uma olhada e vá criando os detalhes. Veja que eu usei comandos básicos e não analisei casos específicos. Primeiro a estrutura geral, depois os detalhes. Vá criando cópias, tipo os01.prg, os02.prg, etc. Para ir acompanhando a evolução do seu código. Faça pequenas mudanças entre uma versão e outra de modo que você não sinta que está perdendo o controle sobre a rotina (esse conselho é vago eu sei, mas a gente sabe quando está desconfortável com a rotina).

Não posso entrar em detalhes para não comprometer a sua avaliação (o mundo xbase é pequeno). Mas eu, particularmente, considero um ponto positivo você ter procurado um fórum para expor as suas dúvidas. Sabemos que você quer uma direção e não respostas prontas.

Boa sorte, estamos torcendo pelo seu sucesso.

A ideia geral (os01.prg)

Código: Selecionar todos



PROCEDURE Main

    cDigitaOS := "S"
    DO WHILE cDigitaOS $ "Ss"

        ? "Dados gerais"
        ACCEPT "Deseja entrega em domicilio ? (S/N)" TO cEntrega
        IF cEntrega $ "Ss"
            ? "FORMULÁRIO com dados para entrega"
        ENDIF
        
        ACCEPT "Os custos de material foram altos demais ? (S/N)" TO cCustosAltos
        IF cCustosAltos $ "sS"
            ? "APROVAÇÃO DA GERENCIA"
        ENDIF    

        ACCEPT "Outra OS ?" TO cDigitaOS

    ENDDO


RETURN
Aquele While me pareceu desnecessário. Veja a seguir (são dois)

os02.prg

Código: Selecionar todos


PROCEDURE Main

    cDigitaOS := "S"
    DO WHILE cDigitaOS $ "Ss"

        ? "Dados gerais"
        ACCEPT "Deseja entrega em domicilio ? (S/N)" TO cEntrega
        IF cEntrega $ "Ss"
            ? "FORMULÁRIO com dados para entrega"
        ENDIF
        
        /* Entrada de materiais */
        cDigitaMaterial := "S"
        DO WHILE cDigitaMaterial $ "Ss"

            ACCEPT "Digite (P) para Produto, (S) para serviço ou (9) encerra" TO cDigitaItem
            IF cDigitaItem $ "pP"
                /* Você colocou um laço aqui, mas eu acho desnecessário. */
                ? "Estou digitando produto"
            ELSEIF cDigitaItem $ "sS"
                /* Você colocou um laço aqui mas eu acho desnecessário */
                ? "Digitando serviços"
            ELSEIF cDigitaItem = "9"    
                cDigitaMaterial := "N"
                // Sai 
            ENDIF    

        ENDDO

        ACCEPT "Os custos de material foram altos demais ? (S/N)" TO cCustosAltos
        IF cCustosAltos $ "sS"
            ? "APROVAÇÃO DA GERENCIA"
        ENDIF    

        ACCEPT "Outra OS ?" TO cDigitaOS

    ENDDO


RETURN




A ideia geral começa no papel, tem que fazer alguns esboços antes mesmo, não tem jeito :D
didzao
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 26 Jul 2019 02:26
Localização: Maringá - PR

Ajuda com Código [Iniciante]

Mensagem por didzao »

MSDN escreveu:Uma dúvida, a vaga é para a SG Sistemas ?
Sim, é sim! Conhece a empresa?
***********************************************************************************
Kapiaba escreveu:Eu faria assim Ingrid:
Vlw Kapiaba! Vou dar uma olha e ver no que eu posso melhorar!
***********************************************************************************
E Vlademiro, é meio chatinho essas "regras" do curso, mas eu entendo o ponto de vista deles, afinal não é todo mundo ali que tem tempo para estudar por fora e permitir que se use qualquer tipo de recurso fica meio difícil avaliar as pessoas utilizando apenas um padrão. E eu estou começando a traçar no papel antes, para assimilar melhor e assim poder desenvolver um raciocínio melhor para essa área, e obrigada por ter feito esses códigos, vou estudar e tentar aplicá-los!
E sim, acho melhor "garimpar conhecimento" do que sair apenas pegando tudo pronto (minha graduação e pós-graduação me ensinaram isso), assim que é possível realmente aprender, tentando, errando e assimilando o conhecimento, ao menos é o que eu acho.
***********************************************************************************
E mais uma dúvida (quem quiser responder fique a vontade), quando eu uso uma estrutura de If eu não posso utilizar o "<=" em uma variável? Ex:

Código: Selecionar todos

If nCodigo = 3500
    cProduto                := "Banana Prata"
    nPrecoUnitario        := 3.50
    nEstoqueProduto     := nEstoqueBanana
    nQuantidadeBanana := nQuantidade
    nDesconto               <=  nDescontoBanana
Endif
Aqui aparece o seguinte quando tento compilar "arquivo.prg (linha) Error E003 Syntax error "syntax error at '<'" (no caso é esse nDesconto <= nDescontoBanana) que está dando erro e a variável nDescontoBanana já está declara e o nDesconto seria um Get. Eu já joguei a linha do get pra tudo que é canto mas continua dando isso. '--'

Desde já agradeço a atenção!
Erros só provam que você está tentando. - Luxana Crownguard
Responder