--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