SQL - AGRUPAR NUMA MESMA LINHA DO GRID
estou usando a seguinte sql:
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.
"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.
Vc ta usando DataGrid ou MsFlexGrid?
Como que VC faz a montagem do seu GRID?
VC faz a montagem "manualmente", ou ele está conectado diretamente a um recordset??
VC faz a montagem "manualmente", ou ele está conectado diretamente a um recordset??
to usando um datacontrol...
...uso dbgrid
...uso dbgrid
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
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...
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...
como faria pra montar o grid manualmente ?
SE VC usar o MSHFLEXGRID, VC poderia trabalhar com a propriedade TEXTMATRIZ.
Ficaria algo mais ou menos assim:
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.
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.
Fiz assim:
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)
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)
Monte esse If q ta dando erro, na maneira clássica, para que possa identificar diretamente onde é o erro
nao entendi...
o codigo atualmente tá assim:
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
Tópico encerrado , respostas não são mais permitidas