none
Seleção de dados com retorno condicional

    Pergunta

  • Bom dia galera...estou com um problema sério em termos de programação...não sei como proceder a lógica...bom..seria o seguinte...
    Tenho um sistema de controle de refeitorio com a seguinte estrutura:
    REFEIT - <nome do banco de dados>
    TAB_REF <nome da tabela>
    Saldo <nome do campo na tabela> Float
    TAB_GRP <nome da tabela>
    Cafe <nome do campo> Float
    Almoco <nome do campo> Float
    Janta <nome do campo> Float

    Bom..tenho que fazer a seguinte conferência de consistência...

    Digamos que o saldo é 1.85 (1 Real e 85 centavos)...
    O Café da Manhã é 0.50 (50 centavos)...o Almoço é 1,20 (1 Real e 20 centavos) e a Janta é 1 (1 Real)
    Eu teria que criar uma verificação que fizesse o seguinte.....na hora do café verificar meu saldo e se o valor for maior do que o descrito ele pode tomar cafe...entao teria que me retornar o valor true, permitindo o acesso....pois tenho mais que 0.50 de saldo...no almoço a mesma verificação...como tem 1.85 e o valor 1.20...o retorno também seria true...e o acesso permitido....e para a janta também seria retornado o valor true permitindo o acesso pois teria 1.85 e o valor é 1....
    agora...digamos que o cara tomou o café....1.85 - 0.50 = 1.35....entao após o café ele ficou com um saldo de 1.35 (1 Real e 35 centavos)....ao ir almoçar...seria verificado o saldo...e ele teria então acesso, retornando o valor true pois o almoço é 1 Real...o saldo dele ficaria então 1.35 - 1.20 = 0.15 (15 centavos)....ao ir jantar....o saldo seria novamente verificado....retornando o valor false e impedindo seu acesso, pois o valor da janta é 1 Real e ele tem valor inferior a isso...

    Como eu montaria essa lógica? Query? Stored Procedure? Transaction? Commit? Rowback?

    Rombesso
    quarta-feira, 30 de setembro de 2009 14:21

Respostas

  • Edgar,

      Tah, agora entendi o que você quer, essa função apenas retorna se existe saldo, não desconta;

      Para fazer o q você quer é necessário utilizar a stored procedure, pois funcções não podem alterar dados:

      Neste caso seria assim:

    create procedure pro_saldoSuficiente(@cod_cliente int, @val_preco money)
    as
    
    begin
    
      declare @saldo money
    
       select @saldo = saldo
       from tabelaSaldo
       where cod_cliente  = @cod_cliente 
    
        if @saldo >= @val_preco 
         begin
           update tabelaSaldo
           set saldo = saldo - @val_preco 
           where cod_cliente  = @cod_cliente 
      
           select 'COMPRA LIBERADA'
           return
         end
        else
         begin
           select 'SALDO INSUFICIENTE: ' + cast(@saldo as varchar(10))
         end
    

    a chamada seria assim:

    exec pro_saldoSuficiente codigoCliente, valorCompra:


    codigoCliente deve ser substituido codigo do cartão ou cliente
    valor compra deve ser substituido pelo valor da compra


    Carlos Eduardo Pieren - MCP
    quarta-feira, 30 de setembro de 2009 20:44
  • Vlw Carlos...funcionou corretamente....
    Rombesso
    • Marcado como Resposta Edgar Rombesso quarta-feira, 7 de outubro de 2009 14:14
    quarta-feira, 7 de outubro de 2009 14:14

Todas as Respostas

  • Edgar,

    Mas você deseja fazer este tipo de verificação no Banco de dados?

    Não seria o caso de realizar estas verificações em sua aplicação?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 30 de setembro de 2009 17:26
  • Então Junior...

    Tenho que fazer diretamente no banco...pq na verdade estou tirando informações de uma aplicação e jogando em outra aplicação...ambas possuem regras de negocio distintas e essa foi a forma que encontrei de interagir os dois sistemas...
    Rombesso
    quarta-feira, 30 de setembro de 2009 17:53
  • Edgar,

    Neste caso, seria melhor utilizar uma stored procedure!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 30 de setembro de 2009 19:33
  • Entendi...mas como criaria essa condição dentro da SP?


    Rombesso
    quarta-feira, 30 de setembro de 2009 19:50
  • select dbo.funGetSaldo(123,0.5)
    Edgar,

    Eu criaria uma função escalar, que seria assim:

    create function funGetSaldo( @cod_cliente int, @val_preco money)
    returns bit
    as
    begin
      declare @saldo money
    
       select @saldo = saldo
       from tabelaSaldo
       where cod_cliente  = @cod_cliente 
    
       if @saldo >= val_preco 
         return 1
    
    
         return 0
    
    end
    
    
    e seria utilizada assim:

    select dbo.funGetSaldo(123,0.5)

    se o retorno for 1 tem saldo, senão não tem





    Carlos Eduardo Pieren - MCP
    quarta-feira, 30 de setembro de 2009 19:59
  • Interessante Carlos....mas essa função pelo que entendi vai descontar apenas 0.50 não é? isso vale para o café apenas....e se ele não passou no cafe e sim no almoço? o valor descontado não seria de 0.50 mas sim de 1.20....nesse desconto ele ficaria com 0.65....o que não permitiria ele passar na janta pois o valor é inferior a 1, mas permitiria ele passar no cafe do dia seguinte pois o valor é = ou superior a 0.50...
    Rombesso
    quarta-feira, 30 de setembro de 2009 20:27
  • Edgar,

      Tah, agora entendi o que você quer, essa função apenas retorna se existe saldo, não desconta;

      Para fazer o q você quer é necessário utilizar a stored procedure, pois funcções não podem alterar dados:

      Neste caso seria assim:

    create procedure pro_saldoSuficiente(@cod_cliente int, @val_preco money)
    as
    
    begin
    
      declare @saldo money
    
       select @saldo = saldo
       from tabelaSaldo
       where cod_cliente  = @cod_cliente 
    
        if @saldo >= @val_preco 
         begin
           update tabelaSaldo
           set saldo = saldo - @val_preco 
           where cod_cliente  = @cod_cliente 
      
           select 'COMPRA LIBERADA'
           return
         end
        else
         begin
           select 'SALDO INSUFICIENTE: ' + cast(@saldo as varchar(10))
         end
    

    a chamada seria assim:

    exec pro_saldoSuficiente codigoCliente, valorCompra:


    codigoCliente deve ser substituido codigo do cartão ou cliente
    valor compra deve ser substituido pelo valor da compra


    Carlos Eduardo Pieren - MCP
    quarta-feira, 30 de setembro de 2009 20:44
  • Vlw Carlos...funcionou corretamente....
    Rombesso
    • Marcado como Resposta Edgar Rombesso quarta-feira, 7 de outubro de 2009 14:14
    quarta-feira, 7 de outubro de 2009 14:14