CRIAR CONSULTAR HIERAQUICA NO REPORT FORM

ELAN 22/03/2005 09:50:58
#74215
A quem possa ajudar, preciso colocar as somas parciais e totais em um relatório que criei através do report form, li alguns comentários que é necessário usar uma consulta hierárquica usando a cláusula SHAPE, peguei um exemplo em um site indicado por um dos fóruns porém não estou conseguindo entender, gostaria que se alguém já fez algo semelhante e pudesse ajudar, ficaria muito grato. (não estou usando o Data enviroment

Segue a consulta que montei, mas parece que não está correta

strSQL = "SHAPE{SELECT SUM(LN.LN_VALOR_LANCTO_MES) AS TOTAL,IG.RG_NOME, IG.IG_NOME, LN.LN_MESANOREF, LN.LN_DATA_LANCTO, LN.LN_VALOR_LANCTO_4, LN.LN_VALOR_LANCTO_6, LN.LN_VALOR_LANCTO_MES " & _
"FROM TB_IGREJA AS IG INNER JOIN TB_LANCAMENTOS AS LN ON IG.IG_CODIGO_CND = LN.IG_CODIGO_CND " & _
"Where (((LN.LN_MESANOREF) = '" & sPeriodo & "')) " & _
"GROUP BY IG.RG_NOME, IG.IG_NOME, LN.LN_MESANOREF, LN.LN_DATA_LANCTO, LN.LN_VALOR_LANCTO_4, LN.LN_VALOR_LANCTO_6, LN.LN_VALOR_LANCTO_MES;} "
USUARIO.EXCLUIDOS 22/03/2005 10:22:20
#74221
Eis um exemplo para construir uma recordset hierarquica:

CODIGO = txtCodigo.Text

strCaminhodosDados = App.Path & "\Dados.mdb"
Set db = New ADODB.Connection
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
Set cmdGUIA_REMESSAcab = New ADODB.Command
Set cmdGUIA_REMESSAcab.ActiveConnection = db

'Recordset hierárquica para a construção do Report (Guia de Remessa)

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 "

Explicando:
1. Para construir uma recordset hierárquica precisa de usar o command shape, que simula comandos hierárquicos(os usados no Data Environment), para tanto precisa de utilizar o Provider MSDataShape;
2. Depois, se reparar bem, dentro do command Shape, você tem de facto, duas redordsets uma dentro do SHAPE outra do APPEND (o pai e o filho, digamos assim), sem isso não existe recordset hierárquica.

E parece-me que é tudo, agora é tentar adpatar o seu código de acordo com estas exigências, mas de qualquer forma, repare que, nem sempre, as recordsets hierárquicas são necessárias quando elaboramos um report, elas só o serão(normalmente) quando queremos colocar algo no GroupHeader do report.



USUARIO.EXCLUIDOS 22/03/2005 10:34:30
#74226
Eis um exemplo para construir uma recordset hierarquica:

CODIGO = txtCodigo.Text

strCaminhodosDados = App.Path & "\Dados.mdb"
Set db = New ADODB.Connection
db.Open "PROVIDER=MSDataShape;Data Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strCaminhodosDados & ";Jet OLEDB:Database Password=wo;"
Set cmdGUIA_REMESSAcab = New ADODB.Command
Set cmdGUIA_REMESSAcab.ActiveConnection = db

'Recordset hierárquica para a construção do Report (Guia de Remessa)

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 "

Explicando:
1. Para construir uma recordset hierárquica precisa de usar o command shape, que simula comandos hierárquicos(os usados no Data Environment), para tanto precisa de utilizar o Provider MSDataShape;
2. Depois, se reparar bem, dentro do command Shape, você tem de facto, duas redordsets uma dentro do SHAPE outra do APPEND (o pai e o filho, digamos assim), sem isso não existe recordset hierárquica.

E parece-me que é tudo, agora é tentar adpatar o seu código de acordo com estas exigências, mas de qualquer forma, repare que, nem sempre, as recordsets hierárquicas são necessárias quando elaboramos um report, elas só o serão(normalmente) quando queremos colocar algo no GroupHeader do report.



ELAN 22/03/2005 13:31:24
#74284
Prezado Joao Mateus ou outro que possa ajudar. Analisei o código que postou e adaptei para a minha necessidade acontece que quando executo a instrução retorna o seguinte erro "Nenhum valor foi fornecido para um ou mais parametros necessários", segue abaixo a sentença, se puder analisar e ajudar, agradeço novamente.

o objetivo da sentença é a seguinte : Relacionar por loja, agrupado por regiao e no final de cada regiao, mostrar o total de lancamentos do mes (LN.LN_VALOR_LANCTO_MES)

cmdGUIA_REMESSAcab.CommandText = "SHAPE{SELECT LJ.RG_NOME,LJ.LJ_NOME,SUM(LN.LN_VALOR_LANCTO_MES) AS TOTAL, LN.LN_MESANOREF " & _
"FROM TB_LOJA AS LJ INNER JOIN TB_LANCAMENTOS AS LN ON LJ.LJ_CODLJO_CND = LN.LJ_CODLJO_CND " & _
"GROUP BY LJ.RG_NOME,LJ.LJ_NOME,LN.LN_VALOR_LANCTO_MES, LN.LN_MESANOREF " & _
"HAVING LN.LN_MESANOREF = '" & sCODLJO & "'} AS qGUIA_REMESSAcab " & _
"APPEND ({SELECT LJ.RG_NOME,LJ.LJ_NOME as LOJA ,LN.LN_VALOR_LANCTO_MES as Valor,LN.LN_MESANOREF " & _
"FROM TB_LOJA,TB_LANCAMENTOS " & _
"WHERE LJ.LJ_CODLJO_CND = LN.LJ_CODLJO_CND " & _
"GROUP BY LJ.RG_NOME,LJ.LJ_NOME,LN.LN_VALOR_LANCTO_MES,LN.LN_MESANOREF } AS qGUIA_REMESSAdet RELATE 'LJ.LJ_CODLJO_CND' TO 'LN.LJ_CODLJO_CND') AS qGUIA_REMESSAdet "
USUARIO.EXCLUIDOS 22/03/2005 13:54:55
#74293
Aparentemente e não conhecendo nada das suas tabelas(layout, relações, etc), tudo parece estar certo, no entanto quando começo a analisar mais atentamente o código começo a ver que no seu SQL existem alias em nomes de tabelas(exemplo FROM TB_LOJA AS LJ), coisa que, para mim é novidade absoluta, pois aprendi a utilizar alias em nomes de campos mas, de tabelas, nunca.

Mesmo que isso esteja correcto, o que não ponho em causa, tenho as minhas dúvidas que, ao as mesmas serem referidas na condição (WHERE LJ), o deva ser feito pelo alias ou pelo seu nome correcto, o mesmo acontecendo em relação ao group by(GROUP BY LJ).

Por isso, não poderei, de facto, ser eu a ajudar. Vou no entanto ficar atento à s outras respostas para ver se também aprendo alguma coisa.
ELAN 22/03/2005 16:41:30
#74350
Apesar que colocando aliases em nomes de tabelas funciona em todos as consultas que monto, quando tirei os aliases das tabelas e alguns ajustes a expressão funcionou em parte (não confirmei se o problema era as aliases), ainda não consegui somar os valores dos campos, qualquer novidade informo no forum.
ELAN 23/03/2005 11:00:41
#74461
Aos membros do forum que possam ajudar. A expressão abaixo deveria fazer o seguinte : relacionar por regiao, as lojas e seus devidos valores de acordo com um período informado (campo sCodigo), acontece que ele faz em parte : Coloca as lojas por regiao, mas não seleciona o periodo informado (por exemplo quero todas as vendas do periodo de 01/2005 mas é recuperado todos os lancamentos daquela loja em ordem de valores, no final gostaria que ele informasse o total de vendas (somando todas as lojas da regiao) mas é informado o valor do primeiro registro recuperado, peço ajuda pois desde ontem estou quebrando a cabeça com essa expressão, mudei diversas posições, mas infelizmente não consegui sucesso.

Obrigado por qualquer ajuda


cmdGUIA_REMESSAcab.CommandText = "SHAPE{SELECT TB_LOJA.RG_NOME,TB_LOJA.LJ_NOME,TB_LANCAMENTOS.LN_MESANOREF,TB_LOJA.LJ_CODIGO_CND, TB_LANCAMENTOS.LJ_CODIGO_CND " & _
"FROM TB_LOJA INNER JOIN TB_LANCAMENTOS ON TB_LOJA.LJ_CODIGO_CND = TB_LANCAMENTOS.LJ_CODIGO_CND " & _
"GROUP BY TB_LOJA.RG_NOME,TB_LOJA.LJ_NOME,TB_LANCAMENTOS.LN_MESANOREF,TB_LOJA.LJ_CODIGO_CND, TB_LANCAMENTOS.LJ_CODIGO_CND " & _
"HAVING TB_LANCAMENTOS.LN_MESANOREF = '" & sCODIGO & "'} AS qGUIA_REMESSAcab " & _
"APPEND ({SELECT TB_LOJA.RG_NOME,TB_LOJA.LJ_NOME as Loja,TB_LANCAMENTOS.LN_VALOR_LANCTO_MES as Valor,TB_LANCAMENTOS.LN_VALOR_LANCTO_MES as TOTAL,TB_LANCAMENTOS.LN_MESANOREF,TB_LOJA.LJ_CODIGO_CND, TB_LANCAMENTOS.LJ_CODIGO_CND " & _
"FROM TB_LOJA,TB_LANCAMENTOS " & _
"WHERE TB_LOJA.LJ_CODIGO_CND = TB_LANCAMENTOS.LJ_CODIGO_CND " & _
"GROUP BY TB_LOJA.RG_NOME,TB_LOJA.LJ_NOME,TB_LANCAMENTOS.LN_VALOR_LANCTO_MES,TB_LANCAMENTOS.LN_MESANOREF,TB_LOJA.LJ_CODIGO_CND, TB_LANCAMENTOS.LJ_CODIGO_CND } AS qGUIA_REMESSAdet RELATE 'TB_LOJA.LJ_CODIGO_CND' TO 'TB_LANCAMENTOS.LJ_CODIGO_CND') AS qGUIA_REMESSAdet "
USUARIO.EXCLUIDOS 23/03/2005 15:45:26
#74526
Oi Elan,

Vamos lá ver se é possível dar alguma pista. Atente nesta linha:
"WHERE TB_LOJA.LJ_CODIGO_CND = TB_LANCAMENTOS.LJ_CODIGO_CND "

Aqui você estaá a dizer para ele ir buscar todos os registos da Tabela Lojas e da Tabela Lançamentos em que o código da loja da Tabela Lojas e da Tabela Lançamentos sejam iguais. Certo?

Ora isso pode acontecer no período que você quer, mas não só. Isso acontece com todos os movimentos. Continuo a estar certo?

Não é isso que você quer. Você quer apenas os registos em que os dois campos são iguais, mas que ocorreram durante um determinado período. Logo você precisa de algo mais, ou na condição "WHERE" ou um "JOIN" quaqluer que diga á máquina quais são os registos das duas tabelas que ocorreram no período pretendido e o código da loja não será, de certeza.

Será que estou errado?



ELAN 28/03/2005 08:29:28
#75249
Incluindo a condição junto a cláusula where como sugeriu, funcionou, porém ainda não consegui agrupar por região e também dar a soma dos valores, obrigado por essa dica e se puder dar mais uma luz a respeito do restante, fico grato.

USUARIO.EXCLUIDOS 28/03/2005 09:32:34
#75264
Como é que você está a colocar os datas no Data Report . Se você quer agrupado apenas por região, seria algo do género:

GroupHeader
Nome da Loja

Detalhe:
Nome da Loja Campo1 Campo2 Campo3 Campo4 Campo5

GroupFooter
SCampo1 SCampo2 SCampo3 SCampo4 SCampo5

Mas atenção:

Para isso, você tem que alterar toda a lógica de construção do seu command Shape, pois no "SHAPE" apenas devem contar os dados referentes à  região, enquanto de no "APPEND" devem constar todos os dados referentes à  loja.




USUARIO.EXCLUIDOS 28/03/2005 09:35:58
#75266
Desculpe, mas cometi uma "gafe". Evidentemente que aqui:

GroupHeader
Nome da Loja

era

GroupHeader
Nome da Região
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas