--
-- Nome Artefato/Programa..: sp_caixa_eletro.sql
-- Instituicao.............:
-- Autor(es)...............: O Peregrino (emersonhermann at gmail.com) ou (emerson at info.ufrn.br)
-- Data Inicio ............: 29/06/2010
-- Data Atual..............: 29/06/2010
-- Versao..................: 0.01
-- Linguagem...............: PL/pgSQL
-- Compilador/Interpretador: PostgreSql
-- Sistemas Operacionais...: Linux/Windows
-- SGBD....................: PostgreSql 8.x
-- 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
*/
--opcao 1
--Retornando notas do caixa eletrônico
--Notas de 1, 2, 5, 10, 20, 50 e 100
DROP FUNCTION IF EXISTS sp_caixa_eletro(pvalor INTEGER);
CREATE OR REPLACE FUNCTION sp_caixa_eletro (pvalor INTEGER) RETURNS text AS $$
DECLARE
sretorno TEXT;
qnota1 INTEGER;
qnota2 INTEGER;
qnota5 INTEGER;
qnota10 INTEGER;
qnota20 INTEGER;
qnota50 INTEGER;
qnota100 INTEGER;
pvalorx INTEGER;
residual INTEGER;
restante INTEGER;
vet_notas INTEGER ARRAY[7];
i INTEGER;
resultado INTEGER;
BEGIN
vet_notas[1]=100;
vet_notas[2]=50;
vet_notas[3]=20;
vet_notas[4]=10;
vet_notas[5]=5;
vet_notas[6]=2;
vet_notas[7]=1;
i := 1;
qnota1 := 0;
qnota2 := 0;
qnota5 := 0;
qnota10 := 0;
qnota20 := 0;
qnota50 := 0;
qnota100 := 0;
pvalorx := 0;
resultado := 0;
sretorno := '';
restante := pvalor;
WHILE (i <= 7) LOOP
resultado = restante - vet_notas[i];
IF (resultado < 0) THEN
i := i + 1;
ELSE
restante := resultado;
RAISE NOTICE 'Restante % -> Nota: R$% Qt: %', restante, vet_notas[i], resultado;
IF vet_notas[i] = 100 THEN
qnota100 := qnota100 + 1;
ELSIF vet_notas[i] = 50 THEN
qnota50 := qnota50 + 1;
ELSIF vet_notas[i] = 20 THEN
qnota20 := qnota20 + 1;
ELSIF vet_notas[i] = 10 THEN
qnota10 := qnota10 + 1;
ELSIF vet_notas[i] = 5 THEN
qnota5 := qnota5 + 1;
ELSIF vet_notas[i] = 2 THEN
qnota2 := qnota2 + 1;
ELSIF vet_notas[i] = 1 THEN
qnota1 := qnota1 + 1;
END IF;
END IF;
END LOOP;
sretorno := 'Total: '
|| pvalor
|| ' ' --chr(10)
|| 'Notas de 100:'
|| qnota100
|| ' ' --chr(10)
|| 'Notas de 50:'
|| qnota50
|| ' ' --chr(10)
|| 'Notas de 20:'
|| qnota20
|| ' ' --chr(10)
|| 'Notas de 10:'
|| qnota10
|| ' ' --chr(10)
|| 'Notas de 5:'
|| qnota5
|| ' ' --chr(10)
|| 'Notas de 2:'
|| qnota2
|| ' ' --chr(10)
|| 'Notas de 1:'
|| qnota1;
RETURN sretorno; -- Retorna as linhas
END;
$$ LANGUAGE plpgsql;
--alguns testes
--SELECT sp_caixa_eletro(2678);
--SELECT sp_caixa_eletro(1078);
DBA, MySql, Oracle, Postgres, SQL Server, DB2, BI, TI, Business Intelligence, Data Science, Machine Learning, IoT, Arduino
quinta-feira, 16 de setembro de 2010
Algoritmos, Caixa Eletrônico
Algoritmos, Caixa Eletrônico
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário