CRIAR CONSULTAR HIERAQUICA NO REPORT FORM
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;} "
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;} "
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.
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.
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.
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.
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 "
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 "
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.
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.
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.
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 "
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 "
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?
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?
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.
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.
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.
Desculpe, mas cometi uma "gafe". Evidentemente que aqui:
GroupHeader
Nome da Loja
era
GroupHeader
Nome da Região
GroupHeader
Nome da Loja
era
GroupHeader
Nome da Região
Tópico encerrado , respostas não são mais permitidas