Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

thi_paulo

problema com if/else

Recommended Posts

use AdventureWorksLT2008

go

create procedure prc_desconto

@p_nome_country as nvarchar(50)

as


begin


create table ##tabela_locacaotemp (

SalesOrderID int,

desconto VARCHAR(5),

calculo int,

SubTotal float,

TaxAmt float,

Freight float,

TotalDue float

);


begin

declare @v_SalesOrderId as int

declare @v_SubTotal as float

declare @v_TaxAmt as float

declare @v_Freight as float

declare @v_TotalDue as float

declare @v_CountryRegion as nvarchar(50)

declare @v_calculo int


declare c_descontos insensitive cursor for

select soh.SalesOrderID, soh.SubTotal, soh.TaxAmt, soh.Freight, soh.TotalDue, a.CountryRegion

from SalesLT.SalesOrderHeader soh, SalesLT.Address a

where a.AddressID = soh.ShipToAddressID



open c_descontos


fetch from c_descontos

into @v_salesOrderId, @v_subTotal, @v_TaxAmt, @v_freight, @v_TotalDue, @v_countryRegion


while @@FETCH_STATUS = 0

begin


set @v_calculo = 0


if @v_CountryRegion = 'Canada'

begin

if @v_SubTotal < 700

begin

set v_SubTotal = v_SubTotal * 0.95;

set v_TaxAmt = v_SubTotal * 0.08;

set @v_calculo = 5

end

else

begin

if @v_subTotal < 1000

begin

set v_SubTotal = v_SubTotal * 0.9;

set v_TaxAmt = v_SubTotal * 0.08;

set @v_calculo = 10

end

else

begin

set v_SubTotal = v_SubTotal * 0.85;

set v_TaxAmt = v_SubTotal * 0.08;

set @v_calculo = 15

end

end


insert into ##tabela_locacaotemp (SalesOrderID, desconto, calculo, SubTotal, TaxAmt, Freight, TotalDue) VALUES (@v_SalesOrderID, 'Sim', @v_calculo, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue)

end

else

insert into ##tabela_locacaotemp(SalesOrderID, Desconto, calculo, SubTotal, TaxAmt, Freight, TotalDue) VALUES (@v_SalesOrderId, 'Não', @v_calculo, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue)

fetch next from c_descontos INTO @v_SalesOrderID, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue, @v_CountryRegion;

end



close c_descontos

deallocate c_descontos

select * from ##tabela_locacaotemp

end

end



Compartilhar este post


Link para o post
Compartilhar em outros sites

1 Explique o problema

 

2 Indente o código e use o "code" , botão <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

use AdventureWorksLT2008
go
create procedure prc_desconto
	@p_nome_country as nvarchar(50)
as

begin

create table ##tabela_locacaotemp (
	SalesOrderID int,
	desconto VARCHAR(5),
	calculo int,
	SubTotal float,
	TaxAmt float,
	Freight float,
	TotalDue float
);

  begin
  declare @v_SalesOrderId as int
  declare @v_SubTotal as float
  declare @v_TaxAmt as float
  declare @v_Freight as float
  declare @v_TotalDue as float
  declare @v_CountryRegion as nvarchar(50)
  declare @v_calculo int

declare c_descontos insensitive cursor for
select soh.SalesOrderID, soh.SubTotal, soh.TaxAmt, soh.Freight, soh.TotalDue,  a.CountryRegion
from SalesLT.SalesOrderHeader soh, SalesLT.Address a 
where a.AddressID = soh.ShipToAddressID


open c_descontos

fetch from c_descontos 
    into @v_salesOrderId, @v_subTotal, @v_TaxAmt, @v_freight, @v_TotalDue, @v_countryRegion

while @@FETCH_STATUS = 0
begin

set @v_calculo = 0

	if @v_CountryRegion = 'Canada' 
	begin
		if @v_SubTotal < 700
		begin
			set v_SubTotal = v_SubTotal * 0.95;
                        set v_TaxAmt = v_SubTotal * 0.08;
                        set @v_calculo = 5
		end
                else
                 begin
		if @v_subTotal < 1000
		   begin
			set v_SubTotal = v_SubTotal * 0.9;
			set v_TaxAmt = v_SubTotal * 0.08;
			set @v_calculo = 10
		   end
                   else
                   begin
		        set v_SubTotal = v_SubTotal * 0.85;
			set v_TaxAmt = v_SubTotal * 0.08;
			set @v_calculo = 15
                   end
	end

insert into ##tabela_locacaotemp (SalesOrderID, desconto, calculo, SubTotal, TaxAmt, Freight, TotalDue) VALUES (@v_SalesOrderID, 'Sim', @v_calculo, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue)
			end
			else
				insert into ##tabela_locacaotemp(SalesOrderID, Desconto, calculo, SubTotal, TaxAmt, Freight, TotalDue) VALUES (@v_SalesOrderId, 'Não', @v_calculo, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue)
		fetch next from c_descontos	INTO @v_SalesOrderID, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue, @v_CountryRegion;
		end


close c_descontos
deallocate c_descontos
select * from ##tabela_locacaotemp
  end
end

 

 

tenho que pegar as pessoas que moram no canadá e que fizeram compras de 700, 1000, ou mais

 

como está no if/else

 

meu problema é saber se esse if/else realmente está certo, pois quando coloco para rodar não funciona. Fala em erro de sintaxe no if/else.

 

Obg.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que falta o end do begin do if < 700

 

Costumo colocar um comentário nos "end"

Dizendo a que begin se referem

 

End--else do total < 1000

Compartilhar este post


Link para o post
Compartilhar em outros sites

Observando o código postado pelo colega, observei que dentro dos if's existem chamadas a variáveis sem o "@"... acho que o 1° problema é este...

 

 

use AdventureWorksLT2008
go

create procedure prc_desconto
    @p_nome_country as nvarchar(50)
as
begin
    create table ##tabela_locacaotemp (
        SalesOrderID int,
        desconto VARCHAR(5),
        calculo int,
        SubTotal float,
        TaxAmt float,
        Freight float,
        TotalDue float
    );

    begin
        declare @v_SalesOrderId as int
        declare @v_SubTotal as float
        declare @v_TaxAmt as float
        declare @v_Freight as float
        declare @v_TotalDue as float
        declare @v_CountryRegion as nvarchar(50)
        declare @v_calculo int

        declare c_descontos insensitive cursor for
        select soh.SalesOrderID, soh.SubTotal, soh.TaxAmt, soh.Freight, soh.TotalDue,  a.CountryRegion
        from SalesLT.SalesOrderHeader soh, SalesLT.Address a
        where a.AddressID = soh.ShipToAddressID

        open c_descontos
        fetch from c_descontos
        into @v_salesOrderId, @v_subTotal, @v_TaxAmt, @v_freight, @v_TotalDue, @v_countryRegion

        while @@FETCH_STATUS = 0
        begin

            set @v_calculo = 0

            if @v_CountryRegion = 'Canada'
            begin
                if @v_SubTotal < 700
                begin
                    set v_SubTotal = v_SubTotal * 0.95;        --Está faltando o @ antes das variáveis
                    set v_TaxAmt = v_SubTotal * 0.08;        --Está faltando o @ antes das variáveis
                    set @v_calculo = 5
                end --if @v_SubTotal < 700
                else
                begin
                    if @v_subTotal < 1000
                    begin
                        set v_SubTotal = v_SubTotal * 0.9;     --Está faltando o @ antes das variáveis
                        set v_TaxAmt = v_SubTotal * 0.08;    --Está faltando o @ antes das variáveis
                        set @v_calculo = 10
                    end --if @v_subTotal < 1000
                    else
                    begin
                        set v_SubTotal = v_SubTotal * 0.85;    --Está faltando o @ antes das variáveis
                        set v_TaxAmt = v_SubTotal * 0.08;    --Está faltando o @ antes das variáveis
                        set @v_calculo = 15
                    end --2° Else begin
                end    --1° Else Begin

                insert into ##tabela_locacaotemp (SalesOrderID, desconto, calculo, SubTotal, TaxAmt, Freight, TotalDue)
                VALUES (@v_SalesOrderID, 'Sim', @v_calculo, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue)
            end    --if @v_CountryRegion = 'Canada'
            else
                insert into ##tabela_locacaotemp(SalesOrderID, Desconto, calculo, SubTotal, TaxAmt, Freight, TotalDue)
                VALUES (@v_SalesOrderId, 'Não', @v_calculo, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue)
                
            fetch next
            from c_descontos    
            INTO @v_SalesOrderID, @v_SubTotal, @v_TaxAmt, @v_Freight, @v_TotalDue, @v_CountryRegion;
        end --while
        
        close c_descontos
        deallocate c_descontos
        select * from ##tabela_locacaotemp
    end
end

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.