Edição de Formulários RFP
Configuração de página
É possível escolher as configurações de tamanho e margens da página a partir do menu Formatar > Formato da página Será aberta a janela demonstrada abaixo, onde é possível selecionar as dimensões e margens da página, nas principais unidades de medida. Ainda é possível selecionar um tamanho de página predefinido.
As vezes na impressão de um documento a impressora define uma margem para o papel, nessa janela é possível marcar que deve "Forçar margens na impressão" isso indica que o RFP irá ignorar as margens vindas da impressora a utilizar as definidas no documento.
Quando o parâmetro "Forçar margens na impressão" estiver marcado a geração de PDF não adicionará margens ao documento, as margens serão definidas unicamente pelo próprio documento que está sendo gerado.
Configuração de geração de PDF
O RFP pode gerar PDF de duas formas no SIGER conforme a finalidade do documento. A primeira é para visualização e armazenamento do PDF como arquivo e a segunda forma é quando o PDF é gerado para impressão (Exclusivo para Thin Client quando imprimir na estação).
O SIGER vai indicar para o RFP qual modelo de PDF deve ser gerado sendo que o default é o PDF para visualização.
Cada PDF, conforme a sua finalidade, pode ter configurações de formatação próprias configuradas no formulário ou via arquivo RIPRINT.INI.
As configurações definidas no formulário tem prioridade sobre as configurações do RIPRINT, e se nenhuma configuração for definida utiliza-se os valores default de 12.6px para margem esquerda e 12.8px para margem superior.
Para configurar a formatação do PDF no formulário acesse o menu "Formatar" > "Formato do PDF gerado"

Nesse menu é possível configurar a formatação de margens dos PDFs gerados em ambas as finalidades. Se não deve utilizar a formatação padrão e nem o valor configurado via RIPRINT, marque a check correspondente e configure o valor de cada propriedade da formatação.
Formulário
Descrição
A propriedade "Descrição" no grupo de "Propriedades" serve apenas para melhor identificação do formulário, na prática não afeta a impressão do documento.
Largura
A propriedade "Largura" no grupo de "Propriedades" define a largura do formulário.
Altura
A propriedade "Altura" no grupo de "Propriedades" define a altura do formulário.
Margens
As propriedades "Margem Direita", "Margem Esquerda", "Margem Superior", "Margem Inferior" no grupo de "Propriedades" representam as margens da página do formulário. Elas só podem ser alteradas pelo menu Formatar -> Formato da página....
Não quebra página
A propriedade "Não quebra página" no grupo de "Propriedades" indica que o formulário não fará a quebra automática de página. É um recurso bastante avançado e de uso bem específico.
Na prática fará com que o documento gerado seja uma única página corrida contendo tudo o que deve ser impresso, sem quebra de páginas.
Orientação das bandas
A propriedade "Orientação das bandas" no grupo de "Propriedades" define a forma como as bandas devem ser impressas no formulário.
As opções possíveis são:
-
Vertical - Fazendo com que cada banda seja impressa à baixo da banda anterior
-
Horizontal - Fazendo com que cada banda seja impressa à direita da banda anterior
Cabeçalho sem registros
A propriedade "Cabeçalho sem registros" no grupo de "Propriedades" define se deve imprimir as bandas de Cabeçalho e Rodapé caso as bandas de detalhamento não possuam nenhum registro.
Formulários por página
A propriedade "Formulários por página" no grupo de "Propriedades" indica quantos formulários devem ser impressos em uma página. Na prática essa propriedade faz com que o RFP acredite que na verdade o tamanho da página é uma fração do todo, de acordo com a quantidade de formulários por página. Assim a quebra de página só ocorrerá de fato quando todas as partes forem preenchidas.
Ou seja:
Caso um formulário com 9cm de altura seja configurado como 3 formulários por página o RFP virtualmente irá dividir a página em 3 pedaços de 3cm cada. As rotinas de impressão acreditarão que a altura da página na verdade é 3cm e forçarão uma quebra de página a cada 3cm. Porém essa quebra é armazenada em memória e só irá ocorrer de fato quando atingir um número de quebras igual a quantidade de formulário por página. Portanto, seriam necessárias 3 quebras de página virtuais para que de fato seja criada uma nova página no documento, fazendo com que caibam 3 formulários por página.
Atenção: Esse recurso não funciona bem em formulários com cabeçalho e rodapé. Pois a cada quebra de página todo o cabeçalho e o rodapé são reimpressos. Como o RFP acredito que o formulário tem na verdade uma fração do tamanho real, que no exemplo anterior seriam 3 cm, a cada formulário por página seriam reimpressos os cabeçalhos e rodapés. No caso do exemplo anterior, o cabeçalho e rodapé seria impresso 3x por página.
O recurso também pode apresentar comportamentos um pouco confusos junto com listas de repetição.
A sugestão é que ele seja utilizado exclusivamente em formulários sem lista de repetição e com bandas apenas de detalhamento quando é necessário imprimir mais de um formulário na mesma página, para fazer uma impressão meia página, por exemplo.
Inverter impressão
A propriedade "Inverter impressão" no grupo de "Propriedades" fará com que as bandas sejam impressas na ordem inversa a normal.
Se a orientação das bandas for vertical a impressão ocorrerá de baixo para cima.
Se a orientação das bandas for horizontal a impressão ocorrerá da direita para a esquerda.
Essa configuração altera também a ordem de impressão das colunas fazendo com que sejam impressas da direita para a esquerda ou de cima para baixo conforme a orientação das colunas.
Exemplo prático de uso dessa propriedade:
Em alguns cenários a ordem de produção emitida pode ter uma etiqueta destacável por centro de custo. Caso as etiquetas destacáveis ficassem no topo do formulário ou da esquerda para a direita seria difícil destaca-las. Então inverte-se a ordem de impressão das bandas para que as etiquetas destacáveis sejam impressas no final do Formulário e da direita para a esquerda.
Subformulários
No Rech Form Print, ao invés de tabela é utilizado um subformulário, o qual exerce a mesma função da tabela em Docx porém sua montagem ocorre de forma diferente. Primeiro é necessário incluir um subformulário a um documento. Em seguida, deve ser criado um outro documento, o qual irá representar o subformulário, sendo que, o nome desse outro documento deve ser adicionado ao campo "Formulário" do Subformulário.

Além disso, no documento do subformulário, na área de "Detail", campo "Lista para repetição", deve ser adicionado a tabela que será exibida.

Usado como subformulário
A propriedade "Usado como subformulário" no grupo de "Informações" identifica que o formulário é utilizado como subformulário em outro formulário. Quando marcada o SIGER® não irá sugerir este formulário como um formulário raiz nas rotinas de manutenção uma vez que ele é acessado por outro formulário considerado raiz.
Quando um formulário deveria aparecer nas listas de formulários disponíveis dentro do SIGER® é válido verificar se ele não está com a flag marcada indevidamente.
Estratégias de uso de subformulários
ORGANIZAÇÃO
Um formulário bem organizado facilita muito a manutenção. Uma boa prática é dividir os formulários em responsabilidades.
Para exemplificar considere o seguinte formulário:
Note que é possível dividir o formulário em responsabilidades:
-
A primeira parte é a apresentação da empresa
-
A segunda parte é apresentação do produto
-
A terceira parte uma tabela de imagens
Dividindo em subformulários:
A primeira vista pode parecer que não é um ganho tão significativo dividir desta maneira, porém assim você pode:
-
Deslocar um bloco inteiro de informações sem perder a formatação e espaçamento entre eles;
-
Trocar a área onde cada informação é exibida de maneira muito mais fácil. Se for necessário exibir primeiro a área do produto e depois a área da empresa bastaria mudar o nome dos subformulários, o restante poderia ficar na mesma posição.
-
É possível visualizar e ajustar o conteúdo a ser exibido individualmente simulando a impressão por partes, caso tenha algum problema com o formulário (um código de barras mal configurado, por exemplo)
CENTRALIZAÇÃO
Uma grande vantagem do uso de subformulários é possibilitar a centralização de áreas em comum. Por exemplo, listar a grade de um produto, as vezes pode ser necessário listar a grade em mais de um ponto no mesmo formulário. Assim se essa listagem for construída em um subformulário ele pode ser reaproveitado.
Existe um parâmetro na configuração de subformulários: “Prefixo para detalhamentos”, Nela é indicado um prefixo que será concatenado às bandas de detalhamento dentro do subformulário. Esse prefixo é definido pelo programa que carrega os dados para o formulário então é necessário verificar com a programação quanto ao seu uso. Porém é uma estratégia muito boa para a centralização do layout.
Deve ser considerado que, se uma lista de repetição se chamar “PED” e o prefixo do subformulário for “ORD”, para o RFP a lista de repetição vai se chamar “ORDPED”. Isso deve ser levado em conta quando for construídas as expressões do formulário.
USO DE TABELAS DENTRO DE TABELAS
Para o uso de tabelas dentro de tabelas é obrigatório que seja construída uma estrutura com subformulários.
Cada formulário pode ter N detalhamentos, mas para poder inserir um detalhamento dentro de outro detalhamento, utiliza-se um subformulário intermediário.
Exemplificando:

No formulário temos uma banda de detalhamento com a lista de repetição PRO, dentro dela tem um subformulário com outra lista de repetição.
Para o primeiro subformulário devemos considerar que:
1. O programa de aplicação deve ter aberto a lista de repetição PRO, e todas as Tags dentro do subformulário serão relativas a lista PRO. (Será necessário consultar com a programação se foi aberta a lista)
2. O subformulário será impresso repetidas vezes, conforme a quantidade de ocorrências da lista PRO.
3. Se o subformulário estiver com o modo de overflow em Cortar(Truncar), o conteúdo será literalmente cortado no tamanho definido para o subformulário.
4. Se o modo de overflow estiver como Expandir o subformulário irá expandir até que todo seu conteúdo seja impresso. (Isso se torna bastante comum com o uso de tabelas dentro de tabelas)
Dentro do primeiro subformulário podemos ou não ter outra lista de repetição.
No exemplo, o subformulário possui a lista INS.
Com esse cenário vale lembrar que as Tags dentro dele são relativas à tabela PRO que foi aberto no primeiro formulário, porém temos mais um lista, então se quiser carregar uma informação dentro deste detalhamento será necessário ter PRO aberta e INS aberta. Uma tag de produto como PRO_CODIGO, por exemplo, será tratada como PRO.INS.PRO_CODIGO.
Um terceiro subformulário foi adicionado ao exemplo.

Dentro dele existe a lista GRA. Caso uma tag seja carregada aqui as listas anteriores devem estar abertas e mais a lista GRA. A Tag PRO_QUANTIDADE, por exemplo, dentro deste detalhamento será considerada como PRO.INS.GRA.PRO_QUANTIDADE.
Acessando dados
Acessando dados da lista de repetição
O RFP permite que seja acessados dados das listas de repetição por meio de expressões. Para ele uma lista é um objeto semelhante ao Array do javascript.
Podemos utilizar o atributo length da lista para saber seu tamanho $LISTA.length
E acessar o conteúdo de uma tag em determinada ocorrência utilizamos a sintaxe:
$LISTA[ocorrência].TAG
Exemplo:
// Concatena todos os registros da lista INS
var string = $INS.length + " itens: ";
for(var i = 0; i < $INS.length; i ++) {
// Se não for a primeira ocorrência
if (i > 0) {
string += ", ";
}
string += $INS[i].VAL + " (" + $INS[i].UNI + ")";
}
string;
Se a fonte de dados for:
INS[0]
| |
VAL
|
100
|
UNI
|
KG
|
INS[1]
| |
VAL
|
200
|
UNI
|
PC
|
INS[3]
| |
VAL
|
300
|
VAL
|
UNI
|
Teremos o seguinte resultado:
3 itens: 100 (KG), 200 (PC), 300(UNI)
Acessando dados da lista de repetição dentro de outra lista de repetição
Quando for necessário adicionar uma nova lista de repetição à expressão a sintaxe a ser utilizada é a seguinte:
$LISTA1[ocorrência1].LISTA2[ocorrencia2].LISTAN[ocorrenciaN].TAG
O mesmo vale para ter o tamanho da lista, utilizar:
$LISTA1[ocorrência1].LISTA2[ocorrencia2].LISTAN[ocorrenciaN].length
// Concatena todos os registros da lista PRO e INS
var string = "Itens: ";
for(var i = 0; i < $PRO.length; i ++) {
// Se não for a primeira ocorrência de PRO
if (i > 0) {
string += "; ";
}
for(var j = 0; j < $PRO[i].INS.length; j ++) {
// Se não for a primeira ocorrência de INS
if (j > 0) {
string += ", ";
}
string += $PRO[i].INS[j].VAL;
}
}
string;
Se a fonte de dados for:
PRO[0]
|
INS[0]
|
VAL = 100
|
PRO[0]
|
INS[1]
|
VAL = 200
|
PRO[0]
|
INS[2]
|
VAL = ABC
|
PRO[1]
|
INS[0]
|
VAL = 123
|
PRO[1]
|
INS[1]
|
VAL = 321
|
PRO[1]
|
INS[2]
|
VAL = 300
|
PRO[2]
|
INS[0]
|
VAL = 400
|
PRO[2]
|
INS[1]
|
VAL = 500
|
PRO[2]
|
INS[2]
|
VAL = 666
|
PRO[3]
|
INS[0]
|
VAL = 700
|
PRO[3]
|
INS[1]
|
VAL = 800
|
Teremos o seguinte resultado:
Itens: 100, 200, ABC; 123, 321, 300; 400, 500, 666; 700, 800
IMPORTANTE: Essa expressão só consegue acessar dados da lista corrente para frente. Ou seja, é necessário estar no detalhamento PRO acessando a lista INS. De dentro da lista INS não é possível acessar o dados de PRO com essa expressão.
Acessando dados da lista de repetição pai
Algo comum de acontecer é, dentro da lista de repetição de uma tabela filha ser necessário um item da tabela pai. Para ter acesso a esse conteúdo existem duas formas.
-
Maneira antiga (Errado):
Cria-se um detalhamento invisível (tamanho 0 ou com uma expressão indicando que nunca será impresso). Nele devem ser declaradas todas as Tags que serão utilizadas nas listas de repetição filhas. Uma vez que a tag é carregada não será mais descarregada e pode ser acessada da filha.
Esse modo não deve ser mais utilizado porém ainda existem formulários com essa configuração então é comum de encontrar algo desse tipo.
-
Nova maneira (Certa):
Utilizar a seguinte sintaxe para a Tag: $LISTA$TAG, Onde LISTA é o endereço completo e Tag é o conteúdo a ser acessado.
Exemplo:
Em uma estrutura com o seguinte formato:
Lista PRO
|
|
|
→
|
Lista INS
|
|
|
→
|
Lista GRA
|
$TAG_PRO = produto
|
$TAG_INS = insumo
|
$TAG_GRA = grade
|
Tag: $PRO$TAG_PRO
Saída: produto
Tag: $PRO.INS$TAG_INS
Saída: insumo
Observe que é necessário indicar no prefixo o caminho completo até a lista onde a Tag foi carregada.
Uso do length de uma lista de repetição
O termo .length em uma lista de repetição tem um comportamento especial. Ele não é considerado uma Tag pois está acessando o atributo length dentro do Array que é a lista de repetição.
Existem dois cenários para o uso de length:
-
Quando a expressão acessa o tamanho da lista para chegar a algum outro conteúdo.
Exemplo:
// Concatena todos os registros da lista INS
var string = $INS.length + " itens: ";
for(var i = 0; i < $INS.length; i ++) {
// Se não for a primeira ocorrência
if (i > 0) {
string += ", ";
}
string += $INS[i].VAL + " (" + $INS[i].UNI + ")";
}
string;
Note que no exemplo a lista INS é iterada para capturar a Tag VAL.
Isso funciona corretamente.
-
Quando a expressão acessa o tamanho da lista para computar outro dado.
Nesse caso é necessário criar um comentário especial para trazer o escopo do Array para a lista anterior, caso contrário ela pode ainda não ter sido criada no momento que tentar acessar o atributo length.
Para criar o comentário basta colocar a estrutura da lista como se fosse acessar uma Tag da mesma. Essa sintaxe forçará a declaração dela antes.
Exemplo em que ocorre erro:
$INS.length
Isso gera um erro se não estiver dentro da tabela INS dizendo que $INS não é um termo conhecido. Então para corrigir é necessário o seguinte:
//$INS[0].VAL
$INS.length
Sabendo que dentro da lista INS existe uma TAG com nome VAL, vai declarar a existência da lista e da TAG dentro do escopo atual e com isso será possível acessar o atributo .length.
O mesmo vale quando tiver que acessar mais de um nível de profundidade nas listas. É necessário trazer elas para o escopo corrente com esses comentários.