Ir para conteúdo

Arquivado

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

Douglas Fernandess

problema select 4 tabelas mostrando status se esta devendo ou não

Recommended Posts

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.

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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:

PmIV7yl.png

 

 

SEM GROUP BY:

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tentou fazer com o modelo de sql que te passei?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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.