Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E aí, galera!
Gostaria de pedir a ajuda de vocês com uma questão que eu já havia escutado falar, mas nunca trabalhei. Até agora.
Vamos imaginar o extrato de um cartão corporativo, onde necessita-se prestar contas de todas transações. Com compras é tranquilo, ele especifica o gasto e pronto.
O ponto está nas transações de saque, pois o portador pode não ter gastado todo o valor sacado, ficando com um saldo residual.
Saldo este que ele poderá lançar como gasto em uma outra data, porém, ele pode ter um acumulado de saldo residual, de 1 ou mais saques.
Estou registrando cada resíduo por saque, para cada portador, vamos supor, ele fez 4 saques que restaram os seguintes valores:
>
R$ 5,00
R$ 10,00
R$ 7,00
R$ 3,00
Ou seja, ele tem um saldo residual total de R$ 25,00.
Então numa determinada data ele fez uma compra com esse saldo de R$ 20,00, aqui está minha dúvida.
Quero buscar no banco de dados os registros que são necessários para compor esse valor de R$ 20,00.
id | portador_id | residuo
1 | 32 | 5.00
2 | 32 | 10.00
3 | 32 | 7.00
4 | 32 | 3.00
Preciso dos 3 primeiros registros, que ao todo somam R$ 22,00, suficientes para abater os R$ 20,00 do gasto do portador.
Como diz o título do tópico, a questão é buscar registros por soma.
Agradeço desde já!
:D
Veja se ajuda
Desculpe, mas neste caso o usuário não fez, teoricamente, uma transferência do banco para a carteira? Não facilitaria? Pois seria um pagamento á vista, acho eu.
Não entendi sua colocação.
Veja se ajuda
Valeu Motta, vou dar uma lida aqui.
não me pergunte sobre implementação , nunca fiz isto apenas me lembrei do algoritmo.
A diferença do meu problema é que eu preciso chegar a um limite, até completá-lo ou ultrapassá-lo, o da mochila consiste em não ultrapassar.
A baixa pode ser parcial ,
poderia
ordenar por valor (asc)
4 | 32 | 3.00
1 | 32 | 5.00
3 | 32 | 7.00
2 | 32 | 10.00
ir baixando enquanto houve saldo
(20,00)
4 | 32 | 3.00 0,00 (17,00)
1 | 32 | 5.00 0,00 (12,00)
3 | 32 | 7.00 0,00 ( 5,00)
2 | 32 | 10.00 5,00 (0,00)
No fim ou sobraria saldo a baixar ou saldos sem baixa.
Acontece que a ideia é dar baixa pelo histório, vindo do saldo mais antigo para o mais novo.
O que eu consegui foi buscar o último a ser debitado, com um bocado de IFs.
Prevendo os seguintes cenários:
- O valor da compra pode ser menor que a soma de N saldos anteriores ao atual do SELECT E maior que a soma de N saldos anteriores incluindo o atual.
SET @price = 2;
SELECT
*
FROM
statement_residue SR
WHERE
IF (
(SELECT SUM(`SR1`.`amount`) FROM `statement_residue` `SR1` WHERE `SR1`.`id` < `SR`.`id`) IS NULL,
IF(
(SELECT SUM(`SR2`.`amount`) FROM `statement_residue` `SR2` WHERE `SR2`.`id` = `SR`.`id`) = @price, 1,
IF((SELECT SUM(`SR3`.`amount`) FROM `statement_residue` `SR3` WHERE `SR3`.`id` = `SR`.`id`) > @price, 1, 0)
),
IF (
(SELECT SUM(`SR4`.`amount`) FROM `statement_residue` `SR4` WHERE `SR4`.`id` <= `SR`.`id`) = @price, 1,
IF ((SELECT SUM(`SR5`.`amount`) FROM `statement_residue` `SR5` WHERE `SR5`.`id` < `SR`.`id`) < @price,
IF ((SELECT SUM(`SR6`.`amount`) FROM `statement_residue` `SR6` WHERE `SR6`.`id` <= `SR`.`id`) > @price, 1, 0),
0)
)
)
Desculpe, mas neste caso o usuário não fez, teoricamente, uma transferência do banco para a carteira? Não facilitaria? Pois seria um pagamento á vista, acho eu.