Você está na página 1de 21

TReport

1
Índice

Seção 1 Estrutura do TReport 3

Seção 2 Considerações 4

Seção 3 Componentes 7

Seção 4 Embedded Sql 17

2
Estrutura do TReport

3
Considerações

• Antes de desenvolver
– Imprima o relatório do R3 e analise o resultado para definir as seções que serão
utilizadas no novo relatório.

• Não utilizar as propriedades


– Utilizar os métodos documentados para acessar as propriedades, já que
algumas precisam ser processadas antes de retornar seu conteúdo (como o
método GetValue() do TRFunction, que precisa calcular o conteúdo da
propriedade uValue para retornar valor médio).

• Relatórios para o Top


– Tentar utilizar uma única query para a seção pai e todas suas filhas (utilizando
o método SetParentQuery() do TRSection).
– Evitar as querys dinâmicas (%report_param: % no Embedded Sql).
– Utilizar GetNextAlias() para retornar o alias temporário da query.
– Querys criadas utilizando o comando Begin Report Query ou o método
BeginQuery() do TRSection serão fechadas pelo TReport no final da impressão.

4
Considerações

• Report.ch
– Disponível no projeto mp8\include do Protheus Versions.
– Facilita a criação dos objetos.
– Exemplo:
DEFINE REPORT oReport NAME "MYREPORT" TITLE "Pedidos de Venda" PARAMETER
"REPORT" ACTION {|oReport| PrintReport(oReport)} DESCRIPTION “Teste”
TOTAL TEXT “Total”

• Begin Report Query e End Report Query


– Pode ser utilizado mesmo em querys que não utilizam
%report_param: %, no lugar dos método BeginQuery() e
EndQuery() do TRSection.
– Não precisa de include no fonte, já esta no sigawin.ch.
– Qualquer otimização do comando não será refletida se estiver
utilizando os métodos mencionados acima.

5
Considerações

• Exemplos:
– Os exemplos foram criados com a seguinte
estrutura:

1) SA1 - Cadastro de Clientes


1.2) SC5 - Pedidos de Venda
1.2.1) SC6 - Itens do Pedido

6
Componentes

• TReport
– PageBreak(): indica se houve quebra de página.
– PageHeight(): altura da página configurada pelo usuário.
– PageWidth(): largura da página configurada pelo usuário.
– SetTitle(<titulo>): troca o título do relatório.
– SetTotalText(<texto>): troca o texto impresso antes dos totalizadores gerais do relatório.
– SetTotalInLine(.F.): troca impressão dos totalizadores gerais em linha para coluna.
– SkipLine(<linhas>): pula linha na impressão.
– ThinLine(): imprime linha fina.
– FatLine(): imprime linha grossa.
– PrintText(<texto>,<linha>,<coluna>): imprime texto nas coordenadas informadas.
• Caso a linha não seja informada, será utilizada a linha atual, incrementando uma linha após a
impressão do texto.
• Caso a coluna não seja informada, será utilizada a coluna atual, incrementado a coluna de
impressão utilizando o tamanho do texto informado.

7
Componentes

• TRSection
– SetTitle(<titulo>): troca o título da seção.
– Hide(): inibe a impressão do cabeçalho (PrintHeader()) e das linhas (PrintLine()) da seção,
porém imprime os totalizadores.
– Show(): retorna a impressão do cabeçalho e das linhas da seção.
– Disable(): desabilita o processamento e impressão da seção, inclusive dos totalizadores.
– Enable(): habilita a impressão da seção.
– SetTotalText(): troca o texto impresso antes dos totalizadores da seção.
– SetTotalInLine(.F.): troca impressão dos totalizadores da seção em linha para coluna.
– SetHeaderPage(): indica que o cabeçalho da seção será impresso no topo da página.
– SetHeaderSection(): indica se cabeçalho da seção será impresso (padrão).
– SetHeaderBreak(): indica se cabeçalho da seção será impresso em cada quebra (padrão).
– SetPageBreak(): indica quebra de página no final da seção.
– GetOrder(): retorna ordem selecionada pelo usuário.

8
Componentes

• TRSection
– PrintLine(): imprime uma linha no relatório baseado na configuração das células da seção.
• Antes de imprimir, o método PrintLine() executa as células de posicionamento (TRPosition), calcula
os conteúdos das células, avalia as quebras (TRBreak) e incrementa os totalizadores (TRFunction).
– PrintHeader(): imprime o cabeçalho da seção baseado na configuração das células.
– Cell(<nome>): retorna o objeto TRCell referente ao nome informado.
– SetReadOnly(): desabilita a edição da seção pelo usuário.
– SetLineCondition(<condicao>): utilizado para informar bloco de código com condição
para impressão da linha pelo método Print(), tanto para query como para tabela.
– SetFilter(<filtro>,<chave de índice>): cria filtro ou IndRegua para a tabela quando não
utilizar query.
– SetParentQuery(): indica utilização da query da seção pai para impressão pelo método
Print().
• Exemplo: Embedded Sql - Utilizando SetParentQuery() e Print() do TRSection.

9
Componentes

• TRSection
– SetRelation(<bloco com expressão para relacionamento inicial>,
<alias>, <ordem>, <posiciona ): indica condição de relacionamento
inicial da seção filha em relação a seção pai quando não utilizado
query.
• Utilizado junto ao método SetParentFilter().
• <bloco com expressão para relacionamento inicial>: bloco de código que
retorna o valor da chave estrangeira utilizado pelos outros parâmetros
para posicionar a tabela da seção filha em relação a sua seção pai.
• Exemplo (exemplo7.prw):
oReport:Section(1):Section(1):SetRelation({|| xFilial("SC5") +
SA1->A1_COD},"SC5",3,.T.)
oReport:Section(1):Section(1):SetParentFilter({|cParam| SC5->C5_CLIENTE ==
cParam},{|| SA1->A1_COD})

10
Componentes

• TRSection
– SetParentFilter(<bloco com expressão do relacionamento>,
<bloco com valor para o relacionamento do primeiro
parâmetro>): indica condição de relacionamento da seção filha
em relação a sua seção pai.
• Pode ser utilizada com query ou com uma tabela (filtrada ou com
IndRegua).
• <bloco com expressão de relacionamento>: condição de
relacionamento da seção filha em relação sua seção pai, utilizado
na impressão pelo método Print().
• <bloco com expressão para o relacionamento do 1º parâmetro>:
bloco de código que retorna o valor da chave estrangeira para
validar o relacionamento entre a seção filha e sua seção pai.
• Exemplo: Embedded Sql - Utilizando SetParentQuery() e Print() do
TRSection.

11
Componentes

• TRSection
– Print(): imprime a query ou a tabela principal da seção.
• Antes de imprimir a query/tabela, o método Print() executa o 2º
parâmetro informado no método SetParentFilter(), guardando o
conteúdo para utilizar no 1º parâmetro do mesmo método, para
controle do relacionamento entre a seção pai e suas filhas.
• Se não utilizar query e for utilizado o método SetRelation(), avalia
condição de relacionamento inicial.
• Se a seção utiliza query dinâminica, o método Print()avalia a query
e cria o alias temporário a ser utilizado.
• Para cada linha:
– Executa o 1º parâmetro do método SetParentFilter(), validando o
relacionamento das seções.
– Se foi utilizado o método SetLineCondition(), executa as células de
posicionamento (TRPosition) e na seqüência avalia a condição
informada.
– Imprime a linha (PrintLine()) e imprime as seções se filhas (se houver).

12
Componentes

• TRCell
– GetFieldInfo(<campo>): carrega informações do campo do SX3
na célula, quando o nome não for de um campo padrão.
– Disable(): desabilita a impressão da célula.
• O conteúdo da célula continua sendo avaliado, inclusive
atualizando os totalizadores.
• O posicionamento da coluna não é considerado.
– Enable(): habilita a impressão da célula.
– Hide(): inibe a impressão da célula.
• O conteúdo da célula continua sendo avaliado, inclusive
atualizando os totalizadores.
• O posicionamento da coluna é considerado.
– Show(): retorna a impressão da célula.

13
Componentes

• TRPosition
– Posiciona tabelas secundárias da seção.
– Nos casos de query, tentar fazer o posicionamento no WHERE.
– Pode ser utilizando sem alias, somente com o bloco de código
no qual é possível fazer qualquer processamento para
posicionar a tabela.
– Utilizando o método Print(), o TRPosition pode ser usado para
posicionar uma tabela para a avaliação do LineCondition.
– Exemplo (exemplo7.prw):
TRPosition():New(oReport:Section(1):Section(1):Section(1):,"SB1",1,{||
xFilial("SB1")+SC6->C6_PRODUTO})
oReport:Section(1):Section(1):Section(1):SetLineCondition({|| SB1->B1_GRUPO >=
MV_PAR02 .and. SB1->B1_GRUPO <= MV_PAR03})

14
Componentes

• TRBreak
– A quebra é avaliada pelo método PrintLine() do TRSection.
– A regra pode ser uma célula de qualquer seção ou um bloco de
código, no qual pode ser efetuado qualquer processamento
para validar a quebra.
– Imprime os totalizadores vinculados a quebra.
– Os totalizadores são impressos em coluna na posição da célula
que a que se referem.
– SetTotalInLine(): troca impressão dos totalizadores da quebra
em linha.
– Exemplo (exemplo6.prw):
DEFINE BREAK oBreak OF oSA1 WHEN oSA1:Cell("A1_VEND")
DEFINE FUNCTION FROM oSA1:Cell("A1_COD") FUNCTION COUNT BREAK oBreak
DEFINE FUNCTION FROM oSA1:Cell("A1_MCOMPRA") FUNCTION SUM BREAK oBreak

15
Componentes

• TRFunction
– É executado pelo método PrintLine() do TRSection.
– Uma célula pode ter mais de um totalizador.
– Acumula valores para a quebra, seção, página e relatório, baseado no
tipo de totalizador (COUNT, SUM, MAX, MIN, AVERAGE).
– Totaliza a célula informada como referência, que também é utilizada
para posicionamento no caso de impressão colunada.
– É possivel utilizar um bloco de código para totalizar, porém ainda é
necessário informar uma célula como referência.
– É possivel fazer refêrencia a célula de uma seção e imprimir seu
totalizador em outra seção.
– Pode ser utilizado como conteúdo de uma célula de uma seção,
inibindo sua impressão no final da seção a que pertence e no final do
relatório, utilizando os métodos GetValue(), SectionValue() ou
ReportValue().
– Exemplo (exemplo1.prw):
DEFINE FUNCTION FROM oSC5:Cell("C5_NUM") OF oSA1 FUNCTION COUNT TITLE "Pedidos"

16
Embedded Sql

• Utilizando SetParentQuery() e Print() do TRSection


– A seção filha utiliza a query do pai.
– Para cada seção filha, utilizar o método SetParentFilter() para
efetuar o relacionamento com a seção pai:
SetParentFilter(<bloco com expressão do relacionamento>,
<bloco com expressão para o relacionamento do 1º parametro>)
– Exemplo (exemplo1.prw):
oReport:Section(1):Section(1):SetParentQuery()
oReport:Section(1):SetParentFilter({|cParam| (cAlias)->C5_CLIENTE == cParam},
{|| (cAlias)-> A1_COD})

oReport:Section(1):Section(1):Section(1):SetParentQuery()
oReport:Section(1):Section(1):Section(1):SetParentFilter({|cParam| (cAlias)->
C6_NUM == cParam}, {|| (cAlias)->C5_NUM})

17
Embedded Sql

• Utilizando query dinâmica (%report_param:%)


– Não é necessário utilizar o método SetParentFilter.
– Para cada linha da query da seção pai, é executada a
query dinâmica da seção filha.
– Exemplo (exemplo2.prw):
BEGIN REPORT QUERY oReport:Section(1):Section(1)
BeginSql alias cAlias2
SELECT C5_NUM NUM,C5_NUM,C5_TIPO,C5_VEND1
FROM %table:SC5% SC5
WHERE C5_FILIAL = %xfilial:SC5% AND SC5.%notDel% AND
C5_CLIENTE = %report_param: (cAlias1)->A1_COD%
ORDER BY C5_FILIAL,C5_NUM
EndSql
END REPORT QUERY oReport:Section(1):Section(1)

18
Embedded Sql

• Utilizando conteúdos variáveis na query


– Sempre utilizar % no começo e no fim do conteúdo.
– Exemplo (exemplo3.prw):
If !Empty(mv_par03)
cSql += "AND B1_GRUPO <= '"+mv_par03+"'“
EndIf

cSql := "%"+cSql+"%“

BEGIN REPORT QUERY oReport:Section(1)


BeginSql alias cAlias
SELECT ...
FROM %table:SA1% SA1, %table:SC5% SC5, %table:SC6% SC6, %table:SB1% SB1
WHERE A1_FILIAL = %xfilial:SA1% AND SA1.%notDel% AND
C5_FILIAL = %xfilial:SC5% AND SC5.%notDel% AND C5_CLIENTE = A1_COD AND
C6_FILIAL = %xfilial:SC6% AND SC6.%notDel% AND C6_NUM = C5_NUM AND
B1_FILIAL = %xfilial:SB1% AND SB1.%notDel% AND B1_COD = C6_PRODUTO
%exp:cSql%
ORDER BY A1_FILIAL,A1_COD,C5_FILIAL,C5_NUM,C6_FILIAL,C6_ITEM
EndSql
END REPORT QUERY oReport:Section(1) PARAM mv_par01

19
Embedded Sql

• Utilizando parâmetros (SX1) tipo Range


– Informar no campo “X1_CNT01” o nome do campo que será utilizado no range.
– Sempre utilizar as funções MakeSqlExpr(<parâmetro>) e MakeAdvplExpr(<parâmetro>).
– A expressão convertida é adicionada à query pelo comando End Report Query ou pelo
método EndQuery() do TRSection.
– Exemplo (exemplo1.prw):
MakeSqlExpr(“REPORT”)

BEGIN REPORT QUERY oReport:Section(1)


BeginSql alias cAlias
SELECT ...
FROM %table:SA1% SA1, %table:SC5% SC5, %table:SC6% SC6, %table:SB1% SB1
WHERE A1_FILIAL = %xfilial:SA1% AND SA1.%notDel% AND
C5_FILIAL = %xfilial:SC5% AND SC5.%notDel% AND C5_CLIENTE = A1_COD AND
C6_FILIAL = %xfilial:SC6% AND SC6.%notDel% AND C6_NUM = C5_NUM AND
B1_FILIAL = %xfilial:SB1% AND SB1.%notDel% AND B1_COD = C6_PRODUTO
ORDER BY A1_FILIAL,A1_COD,C5_FILIAL,C5_NUM,C6_FILIAL,C6_ITEM
EndSql
END REPORT QUERY oReport:Section(1) PARAM mv_par01

oReport:Section(1):EndQuery(mv_par01)

20
21

Você também pode gostar