Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite!
Tenho a seguinte situação.
Tenho os planos dos meus clientes e as parcelas para pagar(se ele fez 1,2,3 vezes....) .
Eu fiz o select do modo mais básico para tentar conseguir ter sucesso na operação, mais não obtive.
Pois por exemplo
- cliente joão tem um plano gold e fez em 4 vezes o pagamento(as parcelas no caso).
"SELECT c., term., pl., parc.
FROM clientes c, terminal term, plano pl, parcelas parc
WHERE pl.id_cliente_plano = c.Codigo AND pl.id_terminal_plano = term.id_terminal AND parc.id_plano_parcela = pl.id_plano
GROUP BY c.Codigo";
ID | DATA_PAGAMENTO
-1 06-05-2014
-2 06-06-2014
-3
-4 06-08-2014
Fiz assim a condição:
if(!isset($res['dataPagamento_parcela'])){
$restricao = 'DEVENDO';
}else{
$restricao = 'OK';
}
Porem a 3º parcela ele não pago mais na listagem fica como ok, como se ele tivesse pagado.
Como eu poderia resolver isso.
>
cara, o que voce poderia fazer
na minha logica eu faria assim
a tabela clientes teria o nome do cliente, e em quantas vezes ele fez
teria tb uma tabela de pagamentos
tipo
se o cliente fizesse em 4x , uma function cadastraria na tabela de pagamento 4 registros com o status 'devendo'
com um campo 'date' e a cada mes , ele atualizaria o registro
+ - assim
a logica nao é tao dificil
e cara, uma dica nas consulta sql
voce esta usando assim
SELECT c., term., pl., parc.
FROM clientes c, terminal term, plano pl, parcelas parc
WHERE
faça assim
SELECT c.id, c.nome, term.id
imagina se voce tem 200 campos em uma tabela, ele vai puxar tudo na consulta
vai demorar mais uns segundos pra puxar os registros
Valeu pela resposta eduardoherden.
Ficaria tudo na mesma.
O campo status devendo ou pago, é a mesma coisa que o campo dataPagamento_parcela.
Se ser NULL ta devendo e se tiver data ele pagou.
Como você mostraria isso?
Sobre a 2º dica realmente não pensei nessa otimização.
A parte do PHP está incompleta.
Poste mais do codigo que você fez.
Aquela varivel restrição, não tem como sabermos se você está usando somente para uma linha ou para um conjunto de linhas do cliente.
>
A parte do PHP está incompleta.
Poste mais do codigo que você fez.
Aquela varivel restrição, não tem como sabermos se você está usando somente para uma linha ou para um conjunto de linhas do cliente.
Segue abaixo o code, teria que fazer um array ou algo do tipo?
$read = "SELECT c., pl., parc.*
FROM clientes c, plano pl, parcelas parc
WHERE pl.id_cliente_plano = c.Codigo AND parc.id_plano_parcela = pl.id_plano
GROUP BY c.Codigo LIMIT 5";
$ex = mysql_query($read) or die (mysql_error());
if(mysql_num_rows($ex) >= 1){
while($res = mysql_fetch_assoc($ex)):
echo '<tr>';
echo '<td>'.$res['Razao_Social'].'</td>';
if(!isset($res['dataPagamento_parcela'])){
$restricao = 'DEVENDO';
}else{$restricao = 'OK';}
echo '<td align="center">'.$restricao.'</td>';
echo '</tr>';
endwhile;
}Certeza que a coluna está chegando como nula?
A coluna "dataPagamento_parcela" é do tipo "date" ou "varchar"?
Se for "varchar", recomendo que troque para "date".
isset verifica se a variavel existe e não é nula.
Por isso, se o tipo da coluna for varchar, e vier uma string vazia, não entra na condição desejada.
faça um var_dump para ver o resultado e tipos de dados.
>
Certeza que a coluna está chegando como nula?
A coluna "dataPagamento_parcela" é do tipo "date" ou "varchar"?
Se for "varchar", recomendo que troque para "date".
isset verifica se a variavel existe e não é nula.
Por isso, se o tipo da coluna for varchar, e vier uma string vazia, não entra na condição desejada.
faça um var_dump para ver o resultado e tipos de dados.
ta como date já.
SELECT:
SELECT
c.Codigo, c.Razao_Social, //dados cliente
pl.id_plano, pl.id_cliente_plano, //dados plano
parc.id_parcela, parc.id_plano_parcela, parc.dataPagamento_parcela // dados parcela
FROM clientes c, plano pl, parcelas parc
WHERE pl.id_cliente_plano = c.Codigo AND parc.id_plano_parcela = pl.id_plano
GROUP BY c.Codigo // agrupei para mostrar por cliente
fiz o var_dump apareceu isso:
array (size=7)
'Codigo' => string '1' (length=1)
'Razao_Social' => string 'ACADEMIA FULLGÁS' (length=17)
'id_plano' => string '200' (length=3)
'id_cliente_plano' => string '1' (length=1)
'id_parcela' => string '439' (length=3)
'id_plano_parcela' => string '200' (length=3)
'dataPagamento_parcela' => string '2014-08-06' (length=10)
array (size=7)
'Codigo' => string '6' (length=1)
'Razao_Social' => string 'CONCEITO FMA' (length=12)
'id_plano' => string '201' (length=3)
'id_cliente_plano' => string '6' (length=1)
'id_parcela' => string '440' (length=3)
'id_plano_parcela' => string '201' (length=3)
'dataPagamento_parcela' => string '2014-07-23' (length=10)
Ele só checou no primeiro índice na tabela parcelas.
Como eu teria que fazer para ele armazenar então para que daí na listagem ele mostrasse devendo.
Usando array_key, session?
Primeira vez que me deparei com essa situação.
ID | ID_PLANO_PARCELA | DATA_PAGAMENTO
-1 200 2014-08-06 -> ACADEMIA FULLGÁS
-2 201 2014-07-23 -> CONCEITO FMA
-3 201 2014-07-28 -> CONCEITO FMA
-4 201 -> CONCEITO FMA
-5 201 2014-08-07 -> CONCEITO FMA
tirei o group by e mostrou certo mais queria mostra só tipo
--------------------------------------------------------------
CLIENTE | PAGAMENTO
academia full gas ok
conceito fma devendo
em vez disso:
--------------------------------------------------------------
CLIENTE | PAGAMENTO
academia full gas ok
conceito fma ok
conceito fma ok
conceito fma devendo
conceito fma ok
meu erro seria no group by?
E cade o vardump da parcela vazia?
Se quer fazer com group by, para mostrar a quantidade de parcelas pagas e a quantidade de parcelas total, seria mais ou menos isso
SELECT c.codcliente,
c.nome,
SUM(IF(p.data_pgto IS NULL, 1, 0)) AS parcelas_em_aberto,
SUM(IF(p.codpgto IS NULL, 0, 1)) AS total_parcelas
FROM cliente c
LEFT JOIN pagamento p ON p.codcliente = c.codcliente
GROUP BY c.codcliente, c.nome>
E cade o vardump da parcela vazia?
Se quer fazer com group by, para mostrar a quantidade de parcelas pagas e a quantidade de parcelas total, seria mais ou menos isso
SELECT c.codcliente,
c.nome,
SUM(IF(p.data_pgto IS NULL, 1, 0)) AS parcelas_em_aberto,
SUM(IF(p.codpgto IS NULL, 0, 1)) AS total_parcelas
FROM cliente c
LEFT JOIN pagamento p ON p.codcliente = c.codcliente
GROUP BY c.codcliente, c.nome
Entendi.
Segue abaixo com GROUP BY e sem ele.
COM GROUP BY:
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/PmIV7yl.png&key=4f5788b602e0479e08dfa6c6e263278d287e49511c56021289753585a7f504d8" alt="PmIV7yl.png" />
SEM GROUP BY:
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/hJZh6M8.png&key=86a7f0c4cb6655e4641df3debb8e9c7abe9094a79f335fc026e4d8d2ce67622d" alt="hJZh6M8.png" />
Eu queria mostra em geral, se o cliente tem pagamento em atraso aparecesse devendo, como na primeira imagem.
Nome cliente e situação: ok ou devendo.
tentou fazer com o modelo de sql que te passei?
entendi mais o menos o que você quis fazer.
mostra total de parcelas e total de parcelas em aberto.
tentei fazer aqui a relação entre elas, mais mostrou todas até de clientes q não tinha plano cadastrado.
Fiz assim abaixo, como eu faria pra fazer aquele where?
SELECT
c.Codigo, c.Razao_Social,
SUM(IF(parc.dataPagamento_parcela IS NULL, 1, 0)) AS parcelas_em_aberto,
SUM(IF(parc.id_parcela IS NULL, 0, 1)) AS total_parcelas
FROM clientes c
LEFT JOIN parcelas parc ON parc.id_cliente_parcela = c.Codigo WHERE parcelas_em_aberto != '0'
GROUP BY c.Codigo, c.Razao_Social
HAVING
SELECT c.Codigo,
c.Razao_Social,
SUM(IF(parc.dataPagamento_parcela IS NULL, 1, 0)) AS parcelas_em_aberto,
SUM(IF(parc.id_parcela IS NULL, 0, 1)) AS total_parcelas
FROM clientes c
LEFT JOIN parcelas parc ON parc.id_cliente_parcela = c.Codigo
GROUP BY c.Codigo, c.Razao_Social
HAVING SUM(IF(parc.id_parcela IS NULL, 0, 1)) > 0
cara, o que voce poderia fazer
na minha logica eu faria assim
a tabela clientes teria o nome do cliente, e em quantas vezes ele fez
teria tb uma tabela de pagamentos
tipo
se o cliente fizesse em 4x , uma function cadastraria na tabela de pagamento 4 registros com o status 'devendo'
com um campo 'date' e a cada mes , ele atualizaria o registro
+ - assim
a logica nao é tao dificil
e cara, uma dica nas consulta sql
voce esta usando assim
SELECT c., term., pl., parc.
FROM clientes c, terminal term, plano pl, parcelas parc
WHERE
faça assim
SELECT c.id, c.nome, term.id
imagina se voce tem 200 campos em uma tabela, ele vai puxar tudo na consulta
vai demorar mais uns segundos pra puxar os registros