SQL - AGRUPAR NUMA MESMA LINHA DO GRID

WEBIER 05/07/2007 14:53:16
#224846
estou usando a seguinte sql:

"SELECT CLIENTE.NOME, PARCELAS.DESCRICAO AS CAMPO01, PARCELAS.DATA_MARCADA AS CAMPO02  FROM CLIENTE INNER JOIN PARCELAS ON CLIENTE.CODIGO = PARCELAS.CODIGO_ALUNO WHERE STATUS = FALSE ORDER BY CLIENTE.NOME"


com essa sql de cima consigo o seguinte resultado:

ALUNO | CAMPO01 | CAMPO 02 | CAMPO03 | CAMPO04 | CAMPO05 | CAMPO06 |
======================================================================
JOAO | JANEIRO | 15/02/07 | | | | |
JOAO | FEVEREIRO| 15/03/07 | | | | |
JOAO | MARÇO | 15/04/07 | | | | |
MARIA | JANEIRO | | | | | |
MARIA | FEVEREIRO| | | | | |
PEDRO | FEVEREIRO| 15/02/07 | | | | |
PEDRO | MARÇO | | | | | |
======================================================================

e eu queria que ficasse assim:

ALUNO | CAMPO01 | CAMPO 02 | CAMPO03 | CAMPO04 | CAMPO05 | CAMPO06 |
======================================================================
JOAO | JANEIRO | 15/02/07 |FEVEREIRO| 15/03/07| MARÇO |15/04/07 |
MARIA | JANEIRO | |FEVEREIRO| | | |
PEDRO | | |FEVEREIRO| 15/02/07| MARÇO | |
======================================================================

ou seja, inves de aparecer varias linhas, queria q ele agrupasse os dados numa linha somente.

JOAO possui 3 mensalidades com data marcada (campo: PARCELAS.DATA_MARCADA)

MARIA possui 02 mensalidades sem data marcada (campo: PARCELAS.DATA_MARCADA)

PEDRO possui 02 mensalidades (preste atenção que ele nao tem a mensalidade de janeiro)... 01 das mensalidade possui data marcada e a outra nao.

resumindo:

quero mostrar cada mensalidade numa coluna distinta, caso nao haja um registro para aquela coluna, deverá ficar em branco.
USUARIO.EXCLUIDOS 05/07/2007 15:06:13
#224850

Vc ta usando DataGrid ou MsFlexGrid?
LCSD 05/07/2007 15:48:39
#224868
Como que VC faz a montagem do seu GRID?

VC faz a montagem "manualmente", ou ele está conectado diretamente a um recordset??
WEBIER 05/07/2007 15:56:15
#224877
to usando um datacontrol...

...uso dbgrid
USUARIO.EXCLUIDOS 05/07/2007 16:01:56
#224880


Olha no dbgrid..acho meio improvável fazer isso de maneira prática

Creio q usando um flexgrid e um for na sql ficaria possível e mais fácil fazer isso

boa sorte
LCSD 05/07/2007 16:02:09
#224881
Desta maneira, ficará muito complicado mesmo...

SE VC montasse seu grid MANUALMENTE, VC poderia fazer isso via código.

Enquanto fosse o mesmo cliente, VC iria percorrendo o seu registro e montando as colunas conforme os valores.

VC montar isso via cláusula SQL, acredito que seja IMPOSSÍVEL, pois ela teria que ser muito RANDÔMICA os dados da coluna...

Pode até não ser IMPOSSÍVEL, mas será muito COMPLICADO o desenvolvimento dela...
WEBIER 05/07/2007 16:29:57
#224888
como faria pra montar o grid manualmente ?
LCSD 05/07/2007 16:38:39
#224892
SE VC usar o MSHFLEXGRID, VC poderia trabalhar com a propriedade TEXTMATRIZ.

Ficaria algo mais ou menos assim:

 
If tb.recordcount > 0 then
tb.movefirst
msh.col = 10 -> Número de colunas no seu MSHFLEXGRID
msh.textmatriz(1,1) = "DADO1" ->Cabeçalho do seu mshflexgrid
msh.textmatriz(2,1) = "DADO2" ->Cabeçalho do seu mshflexgrid
................ e faria todo o cabeçalho
m_linha = 2
do
msh.textmatriz(1,m_linha) = tabela!dado01
msh.textmatriz(2,m_linha) = tabela!dado02
--------------- e assim iria montando o MSHFLEXGRID
m_linha = m_linha + 1
tb.movenext
if tb.eof then
exit do
endif
loop
endif




PS: montei este código de cabeça, mas a lógica seria mais ou menos essa.
Aí VC teria que adaptar a montagem, o seu DO WHILE, para que enquanto fosse a mesma pessoa, a informação iria pra COLUNAS diferentes.
WEBIER 06/07/2007 13:39:25
#225026
Fiz assim:
ABRIR_BD_com_Data Me.Data1, "PARCELAS"
Data1.RecordSource = "SELECT CLIENTE.NOME, PARCELAS.DESCRICAO AS CAMPO01, PARCELAS.DATA_MARCADA AS CAMPO02 FROM CLIENTE INNER JOIN PARCELAS ON CLIENTE.CODIGO = PARCELAS.CODIGO_ALUNO WHERE STATUS = FALSE ORDER BY CLIENTE.NOME"
Data1.Refresh

If Data1.Recordset.RecordCount > 0 Then
Data1.Recordset.MoveFirst
MSHFlexGrid1.Col = 10
MSHFlexGrid1.TextMatrix(1, 1) = "CAB1"
MSHFlexGrid1.TextMatrix(2, 1) = "CAB2"
m_linha = 2
Do
MSHFlexGrid1.TextMatrix(1, m_linha) = Data1.Recordset.Fields!CAMPO01
MSHFlexGrid1.TextMatrix(2, m_linha) = Data1.Recordset.Fields!CAMPO02
m_linha = m_linha + 1
Data1.Recordset.MoveNext
If Data1.Recordset.EOF Then
Exit Do
End If
Loop
End If


primeiro deu erro no:
MSHFlexGrid1.Col = 10
resolvi aumentando na propriedade do flexgrid o numero de colunas para 10

depois deu erro no:
MSHFlexGrid1.TextMatrix(2, 1) = "CAB2"
resolvi aumentando na propriedade do flexgrid o numero de linhas para 10

depois deu erro no:
MSHFlexGrid1.TextMatrix(2, m_linha) = Data1.Recordset.Fields!CAMPO02
resolvi mudando essa linha para: MSHFlexGrid1.TextMatrix(2, m_linha) = IIf(IsNull(Data1.Recordset.Fields!CAMPO02), 0, Data1.Recordset.Fields!CAMPO02)

agora deu o erro:
erro: 381 Subscript out of range
quando mando debugar ele seleciona a linha:
MSHFlexGrid1.TextMatrix(1, m_linha) = IIf(IsNull(Data1.Recordset.Fields!CAMPO01), 0, Data1.Recordset.Fields!CAMPO01)


USUARIO.EXCLUIDOS 06/07/2007 13:43:19
#225027

Monte esse If q ta dando erro, na maneira clássica, para que possa identificar diretamente onde é o erro
WEBIER 06/07/2007 13:54:14
#225028
nao entendi...

o codigo atualmente tá assim:

ABRIR_BD_com_Data Me.Data1, "PARCELAS"
Data1.RecordSource = "SELECT CLIENTE.NOME, PARCELAS.DESCRICAO AS CAMPO01, PARCELAS.DATA_MARCADA AS CAMPO02 FROM CLIENTE INNER JOIN PARCELAS ON CLIENTE.CODIGO = PARCELAS.CODIGO_ALUNO WHERE STATUS = FALSE ORDER BY CLIENTE.NOME"
Data1.Refresh

If Data1.Recordset.RecordCount > 0 Then
Data1.Recordset.MoveFirst
MSHFlexGrid1.Col = 2
MSHFlexGrid1.TextMatrix(1, 1) = "CAB1"
MSHFlexGrid1.TextMatrix(2, 1) = "CAB2"
m_linha = 2
Do
MSHFlexGrid1.TextMatrix(1, m_linha) = IIf(IsNull(Data1.Recordset.Fields!CAMPO01), 0, Data1.Recordset.Fields!CAMPO01)
MSHFlexGrid1.TextMatrix(2, m_linha) = IIf(IsNull(Data1.Recordset.Fields!CAMPO02), 0, Data1.Recordset.Fields!CAMPO02)
m_linha = m_linha + 1
Data1.Recordset.MoveNext
If Data1.Recordset.EOF Then
Exit Do
End If
Loop
End If

Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas