--Retornando notas do caixa eletrônico
--Notas de 1, 2, 5, 10, 20, 50 e 100
IF EXISTS (
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[usf_caixa_eletro]')
AND type IN (N'FN')
)
DROP FUNCTION usf_caixa_eletro;
CREATE FUNCTION usf_caixa_eletro (@pvalor int) RETURNS varchar(max) AS
--
-- Nome Artefato/Programa..: usf_caixa_eletro_sql_server.sql
-- Autor(es)...............: O Peregrino (emersonhermann at gmail.com)
-- Data Inicio ............: 02/08/2012
-- Data Atual..............: 03/08/2012
-- Versao..................: 0.01
-- Linguagem...............: TRANSACT
-- Compilador/Interpretador: T-SQL
-- Sistemas Operacionais...: Windows
-- SGBD....................: SQL SERVER 2005/2008/2012
-- Kernel..................: Nao informado!
-- Finalidade..............: Caixa Eletronico
-- OBS1....................: Caixa Eletronico
--
/*
Algoritmo Caixa Eletronico
notasSaída = [] #guardar as notas que saírão do caixa eletrônico
notas = [100, 50, 20, 10, 5, 1] #notas que podem ser sacadas
valor = 375 #valor a ser sacado
restante = valor #faz uma cópia do valor em "restante"
inota = 0 #índice da nota: 0 é 100, 1 é 50, 2 é 20, 3 é 10, ...
enquanto restante>0: #enquanto restante for maior que 0
resultado = restante-notas[inota] #calcula o resultado da subtração entre o valor e a nota
se resultado<0: #se for negativo:
inota++ #incrementa o índice para a próxima nota
senão: #se for positivo ou zero:
restante = resultado #deixa restante com o novo resultado
notasSaída.adicionar(notas[inota]) #adiciona a nota utilizada nas que devem sair do caixa
para nota em notasSaída: # escreve as notas que devem sair
escreva nota
*/
BEGIN
DECLARE
@sretorno varchar(max)
,@qnota1 integer
,@qnota2 integer
,@qnota5 integer
,@qnota10 integer
,@qnota20 integer
,@qnota50 integer
,@qnota100 integer
,@pvalorx integer
,@residual integer
,@restante integer
,@vet_notas1 integer
,@vet_notas2 integer
,@vet_notas3 integer
,@vet_notas4 integer
,@vet_notas5 integer
,@vet_notas6 integer
,@vet_notas7 integer
,@i integer
,@resultado integer
SET @vet_notas1=100
SET @vet_notas2=50
SET @vet_notas3=20
SET @vet_notas4=10
SET @vet_notas5=5
SET @vet_notas6=2
SET @vet_notas7=1
SET @i = 1
SET @qnota1 = 0
SET @qnota2 = 0
SET @qnota5 = 0
SET @qnota10 = 0
SET @qnota20 = 0
SET @qnota50 = 0
SET @qnota100 = 0
SET @pvalorx = 0
SET @resultado = 0
SET @sretorno = ''
SET @restante = @pvalor
WHILE (@i <= 7) BEGIN
IF @i = 1 BEGIN
SET @resultado = @restante - @vet_notas1
END ELSE IF @i = 2 BEGIN
SET @resultado = @restante - @vet_notas2
END ELSE IF @i = 3 BEGIN
SET @resultado = @restante - @vet_notas3
END ELSE IF @i = 4 BEGIN
SET @resultado = @restante - @vet_notas4
END ELSE IF @i = 5 BEGIN
SET @resultado = @restante - @vet_notas5
END ELSE IF @i = 6 BEGIN
SET @resultado = @restante - @vet_notas6
END ELSE IF @i = 7 BEGIN
SET @resultado = @restante - @vet_notas7
END
IF (@resultado < 0) BEGIN
SET @i = @i + 1
END ELSE BEGIN -- senao
SET @restante = @resultado
IF @i = 1 BEGIN
SET @qnota100 = @qnota100 + 1
END ELSE IF @i = 2 BEGIN
SET @qnota50 = @qnota50 + 1
END ELSE IF @i = 3 BEGIN
SET @qnota20 = @qnota20 + 1
END ELSE IF @i = 4 BEGIN
SET @qnota10 = @qnota10 + 1
END ELSE IF @i = 5 BEGIN
SET @qnota5 = @qnota5 + 1
END ELSE IF @i = 6 BEGIN
SET @qnota2 = @qnota2 + 1
END ELSE IF @i = 7 BEGIN
SET @qnota1 = @qnota1 + 1
END --fim_se
END -- fim_se
END -- fim_enquanto
SET @sretorno = 'Total: '
+ cast (@pvalor as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 100:'
+ cast (@qnota100 as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 50:'
+ cast (@qnota50 as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 20:'
+ cast (@qnota20 as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 10:'
+ cast (@qnota10 as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 5:'
+ cast (@qnota5 as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 2:'
+ cast (@qnota2 as varchar(max))
+ ' ' --chr(10)
+ 'Notas de 1:'
+ cast (@qnota1 as varchar(max))
RETURN (@sretorno) -- Retorna as linhas
END;
GO
--alguns testes, chamada da function
--SELECT dbo.usf_caixa_eletro(2678);
--SELECT dbo.usf_caixa_eletro(1078);
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
sexta-feira, 3 de agosto de 2012
Algoritmos, Caixa Eletrônico em SQL SERVER
Anteriormente em setembro/2010, havia escrito um script para caixa eletrônico em linguagem PL/PgSQL do Postgres, agora foi desenvolvido o mesmo algoritmo de caixa eletrônico para a linguagem Transact do SQL SERVER.
O parâmetro é o valor em inteiro no qual retorna as cédulas das notas em Real.
Com poucas adaptações, pode se remover a nota de 1 Real, para ficar com o novo padrão de cédulas da moeda Real do Brasil.
Mais uma vez, espero ter ajudado.
Assinar:
Postar comentários (Atom)

Nenhum comentário:
Postar um comentário