Pular para o conteúdo
  • Este tópico contém 8 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por David Siqueira.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #88562
    facc
    Participante

      Bom dia,

      Tenho uma tabela onde possui alguns registros aleatórios que são vendidos a clientes, que dá direito a um sorteio no próximo mês.
      Acontece que alguns números não são vendidos, então preciso pegar o próximo número vendido.

      Ex.

      o número sorteado foi 123456, porém ele não foi vendido então tenho que somar 1 número (123456 + 1 = 123457) e verificar se foi vendido ou não, caso também não for vendido, fazer a mesma coisa até encontrar algum ganhador.

      Alguém pode me dar uma idéia de como fazer isso?

      #88563
      Avatar photoRegis Araujo
      Participante

        Ola amigo.. bom dia…

        Vc tem como postar a estrutura da sua tabela.. e com alguns exemplos de conteudo..

        Mas já adiantando.. o que vc pode fazer.. é utilizar um while loop.. ou um for..

        Ex:

        while valor "sorteado" loop

        valor := campo+1;
        

        end loop;

        Abraços…

        #88566
        facc
        Participante

          Estrutura da Tabela


          NrSorte nVarchar2(5) - Número a ser sorteado
          Loja nVarchar2(3) - Loja que vendeu
          Mes_ano Date - Validade do curso
          CodCliente Number - Código do Cliente
          CPF nVarchar2(14) - CPF do comprador
          NomCli nVarchar2(41) - Nome do comprador
          TelCli nVarchar2(10) - Telefone
          DataNrSorte Date - Data da venda
          PDV_Caixa nVarchar2(10) - Caixa que vendeu
          CodProdSort nVarchar2(30) - Reservado
          SerieSorteio nVarchar2(3) - Serie do Sorteio
          NumOperador Number - Matricula do operador Caixa
          VlrTransacao Number(15,2) - Valor
          FlgUso Number - 0 - Não vendido / 1 - Vendido

          #88567
          Marcio68Almeida
          Participante

            Você pode utilizar o seguinte artifício…
            Select MIN (numero)
            From tabela
            Where numero <= sorteado

            Traduzindo…
            Vai pegar o menor número maior ou igual ao número sorteado, se existir o sorteado é ele, caso contrário o próximo da lista…

            #88570
            Avatar photoRegis Araujo
            Participante

              Ola amigo…

              Bom.. fiz um teste aqui e funcionou.. crie uma function mais ou menos assim… ai vc ajusta para a sua necessidade…..

              CREATE OR REPLACE FUNCTION TESTE2 ( NRSORTE NUMBER) RETURN NUMBER IS

              pFlgUso NUMBER :=0;
              pNrSorte NUMBER :=0;

              BEGIN

              WHILE (pFlgUso 1) LOOP

              SELECT FlgUso , NrSorte
              INTO pFlgUso, pNrSorte
              FROM TESTE
              WHERE NrSorte = pNrSorte+1;

              END LOOP;

              RETURN(pNrSorte);
              

              END TESTE2;

              Abraços…!!!

              #88573
              David Siqueira
              Participante

                Não sou developer mais acredito que a opção passada pelo Regis seja extremamente relevante.

                Atente apenas para a performance do processo como um todo ao adicionar o uso da function.

                P.S.: Parabéns Régis, sempre agregando muito com o pessoal.

                Abraço.

                #88576
                Avatar photoRegis Araujo
                Participante

                  Opa.. Valeu David…

                  É como conversamos outro dia.. Não custa nada compartilhar o que aprendemos…
                  Da mesma maneira que o pessoal e você tem me ajudado quando preciso.. Procuro ajudar a quem eu puder com o que aprendi.. Alem de que eu tbm aprendo mais assim.. hehehe..!!

                  Então FACC.. é como o David falou.. esta function retorna a informação que vc precisa.. mas verifica a performance, pois imagina se vc precisar ficar executando esta function a cada 1 segundo.. o que vc pode tbm fazer é jogar a ideia do WHILE dentro da sua procedure/function.. pois vc não irá precisar acionar uma fuction externa…

                  Abraços..!!

                  #88679
                  facc
                  Participante

                    Fiz dessa forma, nos meus testes funcionou legal.


                    SELECT NROSORTE, SERIESORTEIO, LOJA, CODCLIENTE,
                    TO_CHAR(DATANRSORTE, 'DD/MM/YYYY') ,
                    CPF,
                    NOMCLI,
                    TELCLI
                    FROM CYBELAR_NROSORTE"
                    WHERE NROSORTE IN (SELECT MIN(NROSORTE)
                    FROM CYBELAR_NROSORTE
                    WHERE NROSORTE >= :Numero
                    AND FLGUSO = 1
                    AND EXTRACT(MONTH FROM MES_ANO) = :Mes
                    AND EXTRACT(YEAR FROM MES_ANO) = :Ano
                    GROUP BY MES_ANO)
                    AND EXTRACT(MONTH FROM MES_ANO) = :Mes
                    AND EXTRACT(YEAR FROM MES_ANO) = :Ano
                    AND FLGUSO = 1

                    #88681
                    David Siqueira
                    Participante

                      Boa Facc, mais só fique esperto com relação a esses tratamentos com campos do tipo data, sempre dão dor de cabeça quando recebem muito tratamento por parte de formatações, e de repente vc pode até notar uma queda na performance, fique atento, é apenas uma dica.

                      Abração…e Parabéns!!!

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.