Ir para conteúdo

Arquivado

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

Salles PATAMO

Procedure para calcular pontos de MMN binário

Recommended Posts

Olá, depois de apanhar muito dentro do scriptcase e também em php com estouro de memória, decidi que o melhor lugar para calcular todas aquelas regras de MMN Binário, é dentro do próprio banco de dados. Assim, a aplicação fica mais leve, e limpa.

 

Então , como marinheiro de primeira viagem em PL Sql, estou tendo algumas dificuldades, como trabalhar com cursores, extruturas de repetição, e chamar uma procedure dentro da outra...

 

neste primeiro exemplo, quero apenas somar os pontos de todos os downlines a partir de uma determinada franquia, porém, está com um erro que não consigo achar.

 

Alguém pode me ajudar?

 

Segue a procedure:

 

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `lkp_diretos_de` (IN upline int,IN market int, IN ciclo int, IN secao varchar(45),OUT total_pontos float)
BEGIN

DECLARE done_arr_rede1,done_arr_rede2,diretos1,diretos2,fra_id,fra_derramado_em_id,fra_upline_id ,fra_id2,fra_derramado_em_id2,fra_upline_id2 INTEGER DEFAULT 0;
DECLARE fra_dat_cadasto,fra_dat_cadasto2 DATETIME;
DECLARE fra_lado_equipe_upline,fra_lado_equipe_upline2 char(1);
DECLARE fra_saldo_pontos,fra_saldo_pontos2 float DEFAULT 0;


DEClARE arr_rede1 CURSOR FOR

SELECT
mmn_franquias.fra_id,
mmn_franquias.fra_dat_cadasto,
mmn_franquias.fra_derramado_em_id,
mmn_franquias.fra_upline_id,
mmn_franquias.fra_lado_equipe_upline,
mmn_franquias.fra_saldo_pontos

FROM
mmn_franquias


ORDER BY
mmn_franquias.fra_dat_cadasto;


DEClARE arr_rede2 CURSOR FOR

SELECT
mmn_franquias.fra_id,
mmn_franquias.fra_dat_cadasto,
mmn_franquias.fra_derramado_em_id,
mmn_franquias.fra_upline_id,
mmn_franquias.fra_lado_equipe_upline,
mmn_franquias.fra_saldo_pontos

FROM
mmn_franquias


ORDER BY
mmn_franquias.fra_dat_cadasto;


-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET done_arr_rede1 = 1;

-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET done_arr_rede2 = 1;

OPEN arr_rede1;



REPEAT
FETCH arr_rede1 INTO fra_id, fra_dat_cadasto, fra_derramado_em_id, fra_upline_id, fra_lado_equipe_upline, fra_saldo_pontos;
IF NOT done_arr_rede1 THEN
if locate(fra_upline,upline)>0 then
OPEN arr_rede2;
while done_arr_rede2 = 1 do
FETCH arr_rede2 INTO fra_id2, fra_dat_cadasto2, fra_derramado_em_id2, fra_upline_id2, fra_lado_equipe_upline2, fra_saldo_pontos2;
if fra_upline_id2 = fra_upline_id1 then
set done_arr_rede2 = 1;
set upline = concat (upline,',',fra_upline_id2);
set total_pontos = total_pontos + fra_saldo_pontos2;
end if;
end while;
CLOSE arr_rede2;
end if;
END IF;
UNTIL done END REPEAT;

CLOSE arr_rede1;



END

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim se eu quiser somar apenas os pontos dos downlines diretos, mas o problema é que preciso somar também os pontos dos downlines dos downliones recursivamente até o fim da rede.

 

Então fiz assim no php e funcionou para poucas franquias:

 

$arr_rede = unserialize(lkp_rede());
//print("<pre>".print_r($arr_rede,true)."</pre>");
$qtd_franquias = count($arr_rede);
for ($i = 0; $i < $qtd_franquias; $i++){
// definir fra_ref
$fra_ref = $arr_rede[$i][0];
$j = 0;
foreach($arr_rede as $x){
if ($x['fra_upline_id'] == $fra_ref){// se o upline for o fra_ref add aos diretos dele
$diretos[$fra_ref][$j]=$x;
$j++;
}
}
}
[diretos_geral_serialized] = serialize($diretos);
//}
return [diretos_geral_serialized];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo , query hierarquica , pelo que vi complicado no MySql.

 

O nível downlines-downlines tem limite de nívelis de descida ou é ilimitado ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo , query hierarquica , pelo que vi complicado no MySql.

 

O nível downlines-downlines tem limite de nívelis de descida ou é ilimitado ?

 

Oi Motta, obrigado por responder.

 

É seguinte: para consultas de bonificações por consumo, é passado o nível de profundidade da unilevel. Mas para consultas de pontuação de binários não tem limite.

 

Então, para sair do loop, tem que fazer um IF para saber se ainda há downlines .

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.