DATAREPORT POR GRUPO SEM DATAENVIRONMENT
Olá novamente,
Tem como fazer um relatório por grupos sem o uso do dataenvironment? POis estava aqui tentando e num faço a mÃnima idéia de qual seria a instrção SQL a ser passada.
Para os que à ± utilizavam grupo eu estava fazendo assim:
dimx as new adodb.recordset
x.open "select * from tabela",conn
set datareport.datasource = x
datareport.show 1
Mas agora eu encalhei em como fazer com grupo.
Eu tentei fazer com dataenvironment mas eu tenho que modificar os valores dos campos, eu consegui modificar os que são do grupo, mas os detalhes eu à ± consigo pois todos os campos retornam como um só.
Tem como fazer um relatório por grupos sem o uso do dataenvironment? POis estava aqui tentando e num faço a mÃnima idéia de qual seria a instrção SQL a ser passada.
Para os que à ± utilizavam grupo eu estava fazendo assim:
dimx as new adodb.recordset
x.open "select * from tabela",conn
set datareport.datasource = x
datareport.show 1
Mas agora eu encalhei em como fazer com grupo.
Eu tentei fazer com dataenvironment mas eu tenho que modificar os valores dos campos, eu consegui modificar os que são do grupo, mas os detalhes eu à ± consigo pois todos os campos retornam como um só.
BOM ,
PARA CRIAR GRUPO VC DAR UM CLICK COM O BOTÃO DIREITO DO MOUSE NO DATA REPORT E VAI NA OPÇÃO INSERT GROUP HEADER/FOOTER
QUANTO AO SELECT
x.open "select * from tabela ORDER BY NOME_DO_CAMPO_AGRUPADO_NORELATORIO",conn
ESPERO TER AJUDADO
Cara,
Já tentei isso milhares de vezes e não consegui.
O máximo que eu conseguia fazer, e acreditar estar certo, dava erro: "Report Sections do not match data source" e nada...
Estou migrando todos o meus reports DSR para Crystal Reports...
Já tentei isso milhares de vezes e não consegui.
O máximo que eu conseguia fazer, e acreditar estar certo, dava erro: "Report Sections do not match data source" e nada...
Estou migrando todos o meus reports DSR para Crystal Reports...
Oi,
Para que se possa trabalhar com um Grupo no Data Report é necessário construir uma recordset hierarquica, o que só pode ser construido usando o Command Shape.
Isso faz-se fácilmente utilizando o DataEnvironment e construindo um Command pai e um Command filho.
Quando não sabemos construir isso por código, podemos começar por tentar fazer as coisas com o DataEnvironment e depois ver o SQL produzido(pelo menos foi assim que aprendi).
Mas tentemos explicar a coisa, com uma rotina que emite um report agrupado por um determinado campo:
Private Sub Command1_Click()
CODIGO = txtCodigo.Text
strCaminhodosDados = App.Path & "\Dados.mdb"
Set db = New ADODB.Connection
[b]'Para que possamos usar o Command Shape, temos que utilizar o Provedor MSDataSHAPE, '
'por isso ele aqui está na string de conexão:[/b]
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
'Aqui vamos indicar que vamos construir um Comando hierarquico como farÃamos com o Data Environment:
Set cmdGUIA_REMESSAcab = New ADODB.Command
Set cmdGUIA_REMESSAcab.ActiveConnection = db
'Aqui vamos indicar como vamos preencher a recordset hierarquica através do Comando indicado acima, de reparar que este Comando tem um "cab"(para o cabeçalho) e um "det"(para o detalhe)
cmdGUIA_REMESSAcab.CommandText = "SHAPE{SELECT TABDR.DRCOD,TABLANC.LANBANCODES as Banco,TABLANC.LANDR " & _
"FROM TABLANC INNER JOIN TABDR ON TABLANC.LANDR = TABDR.DRCOD " & _
"GROUP BY TABDR.DRCOD,TABLANC.LANBANCODES,TABLANC.LANDR " & _
"HAVING TABDR.DRCOD = '" & CODIGO & "'} AS qGUIA_REMESSAcab " & _
"APPEND ({SELECT TABLANC.LANDR as Codigo ,TABLANC.LANBANCO,TABLANC.LANBANCODES as Banco, TABLANC.LANHIST as Descricao,TABDR.DRCOD " & _
"FROM TABLANC,TABDR " & _
"WHERE TABLANC.LANDR = TABDR.DRCOD " & _
"GROUP BY TABLANC.LANDR,TABLANC.LANBANCO,TABLANC.LANBANCODES,TABLANC.LANHIST,TABDR.DRCOD } AS qGUIA_REMESSAdet RELATE 'LANDR' TO 'DRCOD') AS qGUIA_REMESSAdet "
'Aqui vamos executar o Comando defonido acima
Set adoGUIA_REMESSAcab = cmdGUIA_REMESSAcab.Execute
Dim intCtrl As Integer
'Aqui vamos começar a preencher o DataReport com os dados da recordset hierarquica anteriormente construÃda
With rptGUIA_REMESSA
'Aqui dizemos qual a fonte para o cabeçalho
Set .DataSource = adoGUIA_REMESSAcab
With .Sections("Section1").Controls
For intCtrl = 1 To .Count
If TypeOf .Item(intCtrl) Is RptTextBox Then
'Aqui dizemos qual a fonte para p detalhe
.Item(intCtrl).DataMember = "qguia_remessadet"
End If
Next intCtrl
End With
.Orientation = rptOrientLandscape
.Show
End With
End Sub
NOTA: Importante fixar que os Reports com Grupos têm DataSource e DataMember enquanto que os que os não tem apenas têm DataSource.
Espero ter sido suficientemente explÃcito mas se ainda estiver com dúvidas(sem qualquer propaganda) siga a sugestão de visitar a minha página pessoal.
Para que se possa trabalhar com um Grupo no Data Report é necessário construir uma recordset hierarquica, o que só pode ser construido usando o Command Shape.
Isso faz-se fácilmente utilizando o DataEnvironment e construindo um Command pai e um Command filho.
Quando não sabemos construir isso por código, podemos começar por tentar fazer as coisas com o DataEnvironment e depois ver o SQL produzido(pelo menos foi assim que aprendi).
Mas tentemos explicar a coisa, com uma rotina que emite um report agrupado por um determinado campo:
Private Sub Command1_Click()
CODIGO = txtCodigo.Text
strCaminhodosDados = App.Path & "\Dados.mdb"
Set db = New ADODB.Connection
[b]'Para que possamos usar o Command Shape, temos que utilizar o Provedor MSDataSHAPE, '
'por isso ele aqui está na string de conexão:[/b]
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
'Aqui vamos indicar que vamos construir um Comando hierarquico como farÃamos com o Data Environment:
Set cmdGUIA_REMESSAcab = New ADODB.Command
Set cmdGUIA_REMESSAcab.ActiveConnection = db
'Aqui vamos indicar como vamos preencher a recordset hierarquica através do Comando indicado acima, de reparar que este Comando tem um "cab"(para o cabeçalho) e um "det"(para o detalhe)
cmdGUIA_REMESSAcab.CommandText = "SHAPE{SELECT TABDR.DRCOD,TABLANC.LANBANCODES as Banco,TABLANC.LANDR " & _
"FROM TABLANC INNER JOIN TABDR ON TABLANC.LANDR = TABDR.DRCOD " & _
"GROUP BY TABDR.DRCOD,TABLANC.LANBANCODES,TABLANC.LANDR " & _
"HAVING TABDR.DRCOD = '" & CODIGO & "'} AS qGUIA_REMESSAcab " & _
"APPEND ({SELECT TABLANC.LANDR as Codigo ,TABLANC.LANBANCO,TABLANC.LANBANCODES as Banco, TABLANC.LANHIST as Descricao,TABDR.DRCOD " & _
"FROM TABLANC,TABDR " & _
"WHERE TABLANC.LANDR = TABDR.DRCOD " & _
"GROUP BY TABLANC.LANDR,TABLANC.LANBANCO,TABLANC.LANBANCODES,TABLANC.LANHIST,TABDR.DRCOD } AS qGUIA_REMESSAdet RELATE 'LANDR' TO 'DRCOD') AS qGUIA_REMESSAdet "
'Aqui vamos executar o Comando defonido acima
Set adoGUIA_REMESSAcab = cmdGUIA_REMESSAcab.Execute
Dim intCtrl As Integer
'Aqui vamos começar a preencher o DataReport com os dados da recordset hierarquica anteriormente construÃda
With rptGUIA_REMESSA
'Aqui dizemos qual a fonte para o cabeçalho
Set .DataSource = adoGUIA_REMESSAcab
With .Sections("Section1").Controls
For intCtrl = 1 To .Count
If TypeOf .Item(intCtrl) Is RptTextBox Then
'Aqui dizemos qual a fonte para p detalhe
.Item(intCtrl).DataMember = "qguia_remessadet"
End If
Next intCtrl
End With
.Orientation = rptOrientLandscape
.Show
End With
End Sub
NOTA: Importante fixar que os Reports com Grupos têm DataSource e DataMember enquanto que os que os não tem apenas têm DataSource.
Espero ter sido suficientemente explÃcito mas se ainda estiver com dúvidas(sem qualquer propaganda) siga a sugestão de visitar a minha página pessoal.
Só para que a resposta anterior fique devidamente explÃcita(agora espero que saia bem), aqui
b]'Para que possamos usar o Command Shape, temos que utilizar o Provedor MSDataSHAPE, '
'por isso ele aqui está na string de conexão:[/b]
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
era para ficar assim
'Para que possamos usar o Command Shape, temos que utilizar o Provedor MSDataSHAPE,
'por isso ele aqui está na string de conexão:
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
b]'Para que possamos usar o Command Shape, temos que utilizar o Provedor MSDataSHAPE, '
'por isso ele aqui está na string de conexão:[/b]
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
era para ficar assim
'Para que possamos usar o Command Shape, temos que utilizar o Provedor MSDataSHAPE,
'por isso ele aqui está na string de conexão:
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
Aew
Deu certo \o/ :)
Muito obrigado.
Mas agora surgiu outro problema quando eu executo a instrução sql e talz, eu tenho que modificar os dados que vem nelas (por causa da criptografia) os campos que vão na seção grupo eu consigo modifica-los (pois voltam como campos normalmente) mas os que vão na seção detalhes (appen(...)) retornam um campo só impossivel de ler.
Alguém sabe como ler esse campo?
Deu certo \o/ :)
Muito obrigado.
Mas agora surgiu outro problema quando eu executo a instrução sql e talz, eu tenho que modificar os dados que vem nelas (por causa da criptografia) os campos que vão na seção grupo eu consigo modifica-los (pois voltam como campos normalmente) mas os que vão na seção detalhes (appen(...)) retornam um campo só impossivel de ler.
Alguém sabe como ler esse campo?
Tópico encerrado , respostas não são mais permitidas