O que há de novo no Visual FoxPro 9.0 Report Writer

Cathy Pountney

www.frontier2000.com

Agosto 2004

Aplica-se a:

  • Visual FoxPro 9.0

Leia o artigo associado, Visual FoxPro 9.0 Report Writer In Action.

Resumo: Conheça os novos recursos do Microsoft Visual FoxPro 9.0 Report Writer, incluindo os novos ambientes de dados reutilizáveis, proteção de relatórios e várias outras melhorias de interface de usuário. Você também conhecerá as melhorias nos objetos de layout, melhorias para os usuários internacionais, diversas melhorias de impressão e em grupos de dados. Além disso, verá dois dos melhores aprimoramentos do Visual FoxPro (VFP) 9.0 Report Writer: extensibilidade e bandas de detalhes múltiplas (multiple-detail bands). Por fim, você conhecerá detalhes sobre a estrutura do FRX (Visual FoxPro report). (63 páginas impressas)

Índice

Introdução

Extensibilidade

Ambientes de dados

Proteção

Melhorias de UI

Melhorias de objetos de layout

Recursos internacionais

Melhorias de impressão

Melhorias de grupos de dados

Bandas de detalhes múltiplas

O FRX

Conclusão

Bibliografia

Extensibilidade

Antes do VFP 9.0, o Report Engine era responsável por tudo, inclusive pelo processamento dos dados, pelo posicionamento de objetos e pela renderização, impressão e visualização prévia. Não havia maneira de "capturar" o Report Engine e personalizá-lo, como você faz com outras áreas do VFP. Uma das mudanças mais significativas no VFP 9.0 Report Writer consiste nos novos recursos de extensibilidade. O Report Designer, o Report Engine e o Preview Container foram expostos ao desenvolvedor.

Report Builder

O VFP 9.0 Report Writer inclui um novo recurso em tempo de design denominado Builder Hooks. Vários eventos do Report Designer são expostos e um componente Xbase independente, denominado Report Builder, pode ser chamado para tratá-los. Esse aplicativo pode ser usado para chamar suas próprias caixas de diálogo, fortalecer o comportamento do Report Designer nativo ou substituir esse comportamento.

O VFP inclui um aplicativo Report Builder abrangente que contém novos recursos e fornece uma melhor interface de usuário para a criação de relatórios. O Report Builder é controlado por uma nova variável do sistema, _REPORTBUILDER. Se essa variável estiver vazia, será exibia a caixa de diálogo nativa. Para ativar os capturadores do construtor (builder hooks), defina essa variável para um aplicativo apropriado. Por exemplo, para usar o Report Builder fornecido com o VFP 9.0, inclua o seguinte comando:

_REPORTBUILDER = HOME() + "REPORTBUILDER.APP" 

Algumas partes deste artigo presumem que as caixas de diálogo nativas estejam posicionadas e que a variável de sistema _REPORTBUILDER esteja vazia. Outras seções presumem que as caixas de diálogo estejam posicionadas e que a variável de sistema _REPORTBUILDER esteja definida como "REPORTBUILDER.APP". Se você não conseguir o comportamento descrito ou não vir as caixas de diálogo citadas, alterar o valor de _REPORTBUILDER poderá solucionar o problema.

Report Engine

No sistema de saída (Object-Assisted Output), o Report Engine trata as tarefas centrada nos dados (data-centric), tais como percorrer o escopo e avaliação da expressão. No entanto, quando chega a hora de criar a saída, ele submete o trabalho para uma nova classe base, denominada ReportListener. A nova classe converte de maneira mais sofisticada o conteúdo do relatório, usando GDI+, e também dá aos usuários do Xbase uma chance de interagir com o processo de saída. A Figura 1 mostra como esses elementos se encaixam.

ms965279.extensibilidade01(pt-br,MSDN.10).gif
Figura 1. Use a nova classe ReportListener para manipular relatórios. (Clique na imagem para ampliá-la.)

Para usar uma classe ReportListener, aplique a nova cláusula no comando REPORT FORM, da seguinte forma:

oListener = CREATEOBJECT("ReportListener") oListener.ListenerType = 1 && 
Preview, or 0 for Print REPORT FORM <name> <clauses> OBJECT oListener

O VFP 9.0 também fornece uma segunda técnica para utilizar uma classe ReportListener. Você pode definir o valor de uma nova variável de sistema, _REPORTOUTPUT, como o nome de um aplicativo que pode determinar qual classe ReportListener deve ser usada com base no tipo de saída que você escolheu.

Ao usar o Object-Assisted Output, o relatório é processado por meio de um dos dois modos principais, dependendo do valor de sua propriedade ListenerType. Você pode pensar nesses modos como print-appropriate (apropriados para impressão) e preview-appropriate (apropriados para visualização) ou page-at-a-time (uma página por vez) e all-pages-at-once (todas as páginas de uma vez). No primeiro modo, o Listener dispara um evento OutputPage à medida que prepara cada página, no momento em que envia cada página para a impressora ou fila de impressão.

No segundo modo, o Listener prepara todas as páginas para renderização e as armazena em cache. Uma vez concluído esse processo, você pode chamar o método OutputPage para solicitar a saída de página de qualquer das páginas incluídas, por número de página.

Preview Container

No VFP 9.0, outro elemento da extensibilidade é o Preview Container. Com ele, você pode usar o novo container de visualização fornecido no VFP 9.0 ou escrever seu próprio container de visualização. O antigo container de visualização nativo ainda estará disponível quando você não estiver usando a nova saída assistida por objeto (object-assisted output).

Uma nova variável de sistema, _REPORTPREVIEW, contém o nome do aplicativo que determina qual container de visualização usar. Por padrão, essa variável aponta para ReportPreview.app. Esse novo aplicativo contém muitas melhorias em relação ao antigo, incluindo: mais níveis de zoom, controle de barra de ferramentas (toolbar), controle de legenda (caption), visualização de várias páginas e melhor qualidade por meio de GDI+. As figuras 2 e 3 mostram as diferenças entre a antiga superfície de visualização e a nova superfície.

ms965279.extensibilidade02(pt-br,MSDN.10).gif
Figura 2. A saída no antigo container de visualização não é muito clara. (Clique na imagem para ampliá-la.)

ms965279.extensibilidade03(pt-br,MSDN.10).gif
Figura 3. O novo container de visualização tem muito mais qualidade e opções mais sofisticadas. (Clique na imagem para ampliá-la.)

Observe a diferença de qualidade entre o container de visualização antigo e o novo. As fontes do novo container são mais nítidas do que as do antigo. Isso se deve ao uso do GDI+ nas informações de saída. Além disso, repare nas diferenças na barra de ferramentas ancorada. A barra de ferramentas na visualização de estilo mais nova possui mais opções, incluindo layouts de várias páginas.

Saída tradicional

Um novo comando, SET REPORTBEHAVIOR, pode ser usado para ativar ou desativar a saída assistida por objeto (Object-Assisted Output). O novo mecanismo de renderização de saída e a nova superfície Preview possuem ambos diferenças significativas se comparados ao antigo estilo de saída. Alinhamento, kerning e espaçamento são diferentes no GDI e no GDI+, o que poderia mudar significativamente a aparência dos relatórios existentes. Desse modo, por padrão REPORTBEHAVIOR é definido como 80, o que desativa o Object-Assisted Output e os relatórios são processados da mesma maneira que antes do VFP 9.0.

Caso deseje ativar globalmente o Object-Assisted Output, você pode alterar o valor dessa configuração na caixa de diálogo Options (mostrada na Figura 4) ou pode emitir o seguinte comando:

SET REPORTBEHAVIOR 90 

ms965279.extensibilidade04(pt-br,MSDN.10).gif
Figura 4. Use a opção Run-time behavior da caixa de diálogo Options para alterar a configuração de SET REPORTBEHAVIOR.

Quando REPORTBEHAVIOR estiver definido como 90, os comandos REPORT FORM se comportam automaticamente como se você tivesse usado a cláusula OBJECT, sem nenhumas alterações adicionais em seu código. O VFP usa a variável de sistema _REPORTOUTPUT para determinar qual aplicativo usar para nomear a classe ReportListener apropriada para cada comando REPORT FORM.

Com os novos recursos de extensibilidade do VFP 9.0 Report Writer, você pode chegar ao Report Builder, ao Report Engine e à superfície Preview. Você pode ativar globalmente os novos recursos ou pode ativá-los individualmente para vários relatórios. Você também pode deixar os novos recursos desativados e executar os relatórios como se estivesse nas versões anteriores do VFP.

Para obter mais informações sobre como usar o Object-Assisted Output, consulte: The VFP 9.0 Report Writer In Action.

Data Environments

O VFP 9.0 Report Writer pode agora compartilhar o recurso Data Environments com outros relatórios. Os Data Environments também podem ser salvos como classes e, em seguida, carregados nos relatórios conforme necessário. Isso oferece um excelente cenário de reutilização para definir necessidades de geração de relatórios comuns.

Save As Class

Para salvar um Data Environment como uma classe, comece por definir o Data Environment em um relatório, de maneira habitual. Com a janela Data Environment ainda ativa, selecione a nova opção Save As Class... no menu File (veja a Figura 5).

ms965279.ambientes01(pt-br,MSDN.10).gif
Figura 5. Uma nova opção "Save As Class..." aparece no menu File quando Data Environment é a janela ativa.

Uma vez selecionada a opção Save As Class..., a caixa de diálogo Save As Class será exibida conforme mostrada na Figura 1. O botão DataEnvironment do option group Save é o único botão ativado durante o salvamento do Data Environment de um relatório.

ms965279.ambientes02(pt-br,MSDN.10).gif
Figura 6. Use a caixa de diálogo Save As Class para declarar o nome da nova classe e a biblioteca de classes para salvar o Data Environment de um relatório.

Digite um nome para a classe na caixa de texto Name. Em seguida, digite o nome da biblioteca de classes na qual deseja salvar a nova classe. Se você inserir o nome de uma biblioteca de classes que não existe, ela será criada para você. Você também pode usar o botão Ellipse (...) para localizar uma biblioteca de classes existente. Por fim, você pode opcionalmente inserir uma descrição da nova classe.

Carregando um DE

Além de definir manualmente o Data Environment para um novo relatório, o VFP 9.0 também lhe dá a opção de carregar o Data Environment a partir de um relatório existente ou de uma classe DataEnvironment previamente salva. A opção Load Data Environment... no menu Report (veja a Figura 7) permite que você selecione qual Data Environment carregar.

ms965279.ambientes03(pt-br,MSDN.10).gif
Figura 7. Use a opção Load Data Environment... para carregar um Data Environment a partir de um relatório existente ou de uma classe DataEnvironment.

Nota: O recurso Load Data Environment só estará disponível por meio das novas caixas de diálogo do ReportBuilder. É necessário incluir _REPORTBUILDER = HOME() + "ReportBuilder.app" para aproveitar as vantagens desse recurso.

A partir de um Report

Ao carregar o Data Environment a partir de outro relatório, todo o código e os membros do Data Environment original são copiados no novo relatório. Isso significa que todas as alterações feitas, após o carregamento, no Data Environment do relatório original não serão propagandas para os relatórios criados a partir do relatório original.

A caixa de diálogo Report Properties, conforme mostrada na Figura 8, aparece após a seleção de Load Data Environment... no menu Report. Use esse menu para selecionar o relatório cujo Data Environment você deseja copiar neste relatório.

ms965279.ambientes04(pt-br,MSDN.10).gif
Figura 8. Use a guia Data Environment da caixa de diálogo Report Properties para escolher de qual relatório você deseja copiar o Data Environment.

Selecione o botão de opção Copy from another report file e, em seguida, clique no botão Select... Isso chamará a caixa de diálogo Open, para que você o relatório a partir do qual irá copiar. Uma vez escolhido um relatório, será exibida uma caixa de diálogo de confirmação (veja a Figura 9).

ms965279.ambientes05(pt-br,MSDN.10).jpg
Figura 9. Use esta caixa de diálogo para confirmar sua intenção de copiar um Data Environment.

O VFP 9.0 está prestes a copiar o Data Environment de outro relatório para o relatório atual. Desse modo, ele informa você de que está prestes a sobreescrever o Data Environment atual, e você precisa clicar em Yes para continuar. Isso ajudará a lembrá-lo de que tudo o que você definiu no Data Environment do relatório atual está prestes a ser sobrescrito. Se você clicar em No, as alterações não serão feitas e o processo será abortado. Quando você clica em Yes, o Data Environment é copiado e você é notificado disso por meio da caixa de diálogo mostrada na Figura 10.

ms965279.ambientes06(pt-br,MSDN.10).gif
Figura 10. Essa caixa de diálogo confirma que o Data Environment foi copiado com êxito no relatório atual.

Você agora terminou de copiar o Data Environment e poderá manipulá-lo conforme necessitar. No entanto, lembre-se de que, a partir desse ponto, quaisquer alterações feitas no Data Environment do relatório original não serão propagandas para esse relatório.

A partir de uma Class DE

Quando você carrega o Data Environment a partir de uma classe, o código é adicionado ao Data Environment do novo relatório para vincular à classe DataEnvironment original e instanciá-la em tempo de execução. Isso significa que as futuras alterações feitas na classe DataEnvironment serão propagadas para todos os relatórios que utilizam a classe DataEnvironment.

Usando a caixa de diálogo Report Properties mostrada na Figura 8, clique no botão Link to a visual DE class. Em seguida, clique no botão Select... para chamar a caixa de diálogo Open que você poderá usar para escolher qual biblioteca de classes e qual classe utilizar. Uma vez selecionada a classe, será exibida a mesma caixa de diálogo de confirmação mostrada na Figura 9. Depois que você confirmar suas intenções, o Data Environment será atualizado e você será notificado da conclusão do processo na caixa de diálogo mostrada na Figura 10.

Neste ponto, foi adicionado um código a alguns métodos do Data Environment. Alguns desses métodos têm um código simplista, que não contêm nada além de um comando DODEFAULT(). A razão para isso é que BindEvents() só funcionará se o método contiver pelo menos uma linha de código.

Código do Data Environment

Carregar um Data Environment a partir de uma classe adiciona automaticamente um código a vários métodos, conforme mostrado e descrito abaixo.

Método Init

O código apresentado a seguir no método Init é necessário para assegurar que BindEvents() funcione como esperado.

*-----------------------------------------------------* 
* THIS METHOD CODE WAS INSERTED BY THE REPORT BUILDER * 
*-----------------------------------------------------* 
   DODEFAULT() 

Método BeforeOpenTables

O código a seguir cria uma nova propriedade no Data Environment que armazena uma referência do objeto para a classe DataEnvironment que está sendo carregada. Em seguida, os eventos neste Data Environment são vinculados aos eventos correspondentes na classe DataEnvironment. No entanto, os métodos Init e Destroy não são vinculados. Por fim, é acionado o evento BeforeOpenTables da classe DataEnvironment.

*-----------------------------------------------------*
* THIS METHOD CODE WAS INSERTED BY THE REPORT BUILDER *
*-----------------------------------------------------*
    LOCAL loMember, laDEEvents[1], liMember, liMembers, loBoundMember
    THIS.AddProperty( "BoundDE", NEWOBJECT( "de_insurance", "c:\vfp9\rwde.vcx" ))
    IF VARTYPE( THIS.BoundDE ) = "O" AND UPPER( THIS.BoundDE.BaseClass ) = "DATAENVIRONMENT"
        * Bind events here, skipping the Init and Destroy.
        * The FRX DE and its members can only have base events,
        * so not that much PEMSTATUS checking is necessary:
        liMembers = AMEMBERS( laDEEvents, THIS, 3 )       
        FOR liMember = 1 TO liMembers
            IF INLIST( UPPER( laDEEvents[ liMember, 1] ), "INIT", "DESTROY" )
                LOOP
            ENDIF
            IF INLIST( UPPER( laDEEvents[ liMember, 2] ), "EVENT", "METHOD" )
                BINDEVENT( THIS, ;
                           laDEEvents[ liMember, 1], ;
                           THIS.BoundDE, ;
                           laDEEvents[ liMember, 1] )
            ENDIF
        ENDFOR
        * Now do the members with appropriate checking,
        * again skipping the Init and Destroy:
        FOR EACH loMember IN THIS.Objects
            IF PEMSTATUS( THIS.BoundDE, loMember.Name, 5 ) AND ;
                UPPER( PEMSTATUS( THIS.BoundDE, loMember.Name, 3 ) = "OBJECT"
                loBoundMember = EVAL( "THIS.BoundDE." + loMember.Name )
                IF ( loBoundMember.BaseClass == loMember.BaseClass )
                    liMembers = AMEMBERS( laDEEvents, loMember, 3 )
                    FOR liMember = 1 to liMembers
                        IF INLIST( UPPER( laDEEvents[ liMember, 1] ), "INIT", "DESTROY" )
                            LOOP
                        ENDIF
                        IF INLIST( UPPER( laDEEvents[ liMember, 2] ), "EVENT", "METHOD" )
                            BINDEVENT( THIS, ;
                                       laDEEvents[ liMember, 1], ;
                                       loBoundMember, ;
                                       laDEEvents[ liMember, 1] )
                        ENDIF
                    ENDFOR
                ENDIF
            ENDIF            
        ENDFOR
        THIS.BoundDE.BeforeOpenTables()
    ENDIF

Método AfterCloseTables

O código apresentado a seguir no método AfterCloseTables é necessário para assegurar que BindEvents() funcione como esperado.

*-----------------------------------------------------*
* THIS METHOD CODE WAS INSERTED BY THE REPORT BUILDER *
*-----------------------------------------------------*
    DODEFAULT()

Método Destroy

O código a seguir, adicionado ao método Destroy, desvincula os métodos do Data Environment deste relatório da classe DataEnvironment. O código também remove a referência ao objeto da classe DataEnvironment.

*-----------------------------------------------------*
* THIS METHOD CODE WAS INSERTED BY THE REPORT BUILDER *
*-----------------------------------------------------*
    LOCAL loMember
    UNBIND( THIS )
    FOR EACH loMember in THIS.Objects
        UNBIND( loMember )
    ENDFOR
    IF PEMSTATUS( THIS, "BoundDE", 5 ) AND UPPER( PEMSTATUS( THIS, "BoundDE", 3 )) = "PROPERTY"
        THIS.BoundDE = NULL
    ENDIF 

Método Error

O código apresentado a seguir no método Error é necessário para assegurar que BindEvents() funcione como esperado.

*-----------------------------------------------------*
* THIS METHOD CODE WAS INSERTED BY THE REPORT BUILDER *
*-----------------------------------------------------*
    LPARAMETERS nError, cMethod, nLine
    DODEFAULT( nError, cMethod, nLine ) 

Proteção

No VFP 9.0, você pode criar proteção para um ou mais objetos de layout por meio do Report Designer ou Label Designer. Isso faz com você permita que seu usuário modifique um relatório, ao mesmo tempo em que impede que ele faça determinadas alterações.

Definindo sinalizadores (Flags) de proteção

Os objetos de layout possuem cinco modos diferentes de proteção que você pode definir, com os objetos Field tendo uma opção de proteção adicional. As bandas têm dois modos diferentes de proteção que você pode definir. O relatório propriamente possui diferentes modos de proteção que você pode definir.

Nota Os novos recursos de proteção só poderão ser definidos por meio das caixas de diálogo ReportBuilder. É necessário incluir _REPORTBUILDER = HOME() + "ReportBuilder.app" para aproveitar as vantagens desses recursos.

Protegendo um objeto

Para proteger um objeto de layout no Report Designer, selecione a caixa de diálogo Properties do objeto. A caixa de diálogo Properties poderá ser invocada no menu Report após a seleção do objeto, a partir do menu de contexto do objeto ou por meio de um duplo clique no objeto. A Figura 11 mostra a guia Protection da caixa de diálogo Properties de um objeto de campo (Field).

ms965279.protecao01(pt-br,MSDN.10).gif
Figura 11. Use a guia Protection da caixa de diálogo Properties para definir os modos de proteção de um objeto de layout.

Você pode definir um destes cinco modos de proteção para os objetos de layout:

  • Marque a caixa de seleção Object cannot be moved or resized para impedir que um usuário mova esse objeto de layout para uma posição diferente na superfície de design e que ele redimensione esse objeto.

  • Marque a caixa de seleção Object cannot be edited para impedir que o usuário faça alterações nas propriedades desse objeto de layout.

  • Marque a caixa de seleção Object cannot be deleted para impedir que o usuário exclua esse objeto.

  • Marque a caixa de seleção Object cannot be deleted para impedir que o usuário selecione esse objeto. Quando essa opção é selecionada, os comportamentos de proteção de Object cannot be moved or sized, Object cannot be edited e Object cannot be deleted também são impostos.

  • Marque a caixa de seleção Object is not visible in Designer para impedir que esse objeto seja exibido no Report Designer no modo protegido. Quando essa opção é selecionada, o comportamento de proteção das outras quatro opções também é imposto.

A parte Design-time caption dessa caixa de diálogo se aplica somente ao objetos Field. A string literal inserida nessa caixa de texto é exibida no Report Designer, no lugar de Expression. Isso lhe dará a oportunidade de exibir alguma coisa que seja amigável ao usuário, em vez de uma expressão complicada.

Protegendo uma Banda

Para proteger uma banda (Band) no Report Designer, selecione a caixa de diálogo Properties da banda. A caixa de diálogo Properties pode ser chamada a partir da opção Edit Bands... no menu Report, a partir do menu de contexto da banda ou por meio de um clique duplo na barra cinza da banda. A Figura 12 mostra a guia Protection da caixa de diálogo Properties de uma banda (Band).

ms965279.protecao02(pt-br,MSDN.10).gif
Figura 12. Use a guia Protection da caixa de diálogo Band Properties para definir os modos de proteção da banda.

É possível definir dois modos de proteção para as bandas:

  • Marque a caixa de seleção Band cannot be edited para impedir que a caixa de diálogo Band Properties esteja acessível ao usuário.

  • Marque a caixa de seleção Band cannot be resized para impedir que o usuário redimensione a banda.

Protegendo um Relatório

Para definir a proteção de relatório geral, selecione a caixa de diálogo Report Properties. Você pode chamar esse caixa de diálogo selecionando Properties no menu Report ou no menu de contexto do relatório. A Figura 13 mostra a guia Protection da caixa de diálogo Report Properties.

ms965279.protecao03(pt-br,MSDN.10).gif
Figura 13. Use a guia Protection da caixa de diálogo Report Properties para definir os modos de proteção geral de um relatório.

A parte superior dessa caixa de diálogo permite que você defina quais guias da caixa de diálogo Report Properties estão indisponíveis para o usuário. Para cada uma das seleções feitas nessa área, a guia aplicável da caixa de diálogo Report Properties será desativada. A opção Protection está sempre marcada e desativada. A opção Ruler/Grid estará desativada porque a guia não pode ser protegida; no entanto, ela será exibida na caixa de diálogo de modo que as seleções estejam consistentes com as guias na caixa de diálogo Report.

A parte inferior dessa caixa de diálogo permite que você defina quais opções de menu estão indisponíveis para o usuário. Para cada seleção nessa área, será desativada a opção de menu aplicável.

Enaltecendo os flags de proteção

Para acionar a proteção durante uma sessão do Report Designer ou do Label Designer, use a palavra-chave PROTECTED conforme mostrado dos exemplos a seguir:

CREATE REPORT MyReport PROTECTED MODIFY REPORT MyReport PROTECTED 
CREATE LABEL MyLabel PROTECTED MODIFY LABEL MyLabel PROTECTED

Se a palavra-chave PROTECTED não for usada, o Report Designer funcionará como se não tivesse sido aplicada nenhuma proteção aos objetos de layout.

Melhorias de UI

Muitas alterações foram feitas na interface do usuário de modo a facilitar o design de relatórios e torná-los mais intuitivo. Os menus foram revistos, os menus de contexto foram modificados e novas opções foram adicionadas à barra de ferramentas do Report Designer. As caixas de diálogo Expression Builder e Expression Builder Options têm agora novos comportamentos, e outras melhorias gerais de interface de usuário foram adicionadas ao VFP 9.0 Report Writer.

O sistema de menus de relatório foi revisto no VFP 9.0 para acomodar novas opções. Além disso, algumas opções foram renomeadas para mais clareza e várias delas foram repetidas nos diferentes menus para facilitar o acesso do usuário. As Figuras 14-16 mostram as novas alterações de menu.

ms965279.melhoriasUI01(pt-br,MSDN.10).gif
Figura 14. A nova opção "Save As Class..." aparece no menu File.

ms965279.melhoriasUI02(pt-br,MSDN.10).gif
Figura 15. Uma nova opção foi adicionada à barra de ferramentas Report Designer, e foram incluídas linhas horizontais para separar as opções Grid Lines e Show Position das outras opções.

ms965279.melhoriasUI03(pt-br,MSDN.10).gif
Figura 16. Houve muitas mudanças no menu Report, incluindo a renomeação de opções, inclusão de novas opções e acréscimo da opção Print Preview.

Os menus de contexto existentes foram aprimorados com itens adicionais e estão mais consistentes com as caixas de diálogo às quais se referem. Outros itens do Report Designer que anteriormente não continham menus de contexto agora o fazem. As Figuras 17-19 mostram as novas alterações.

ms965279.melhoriasUI04(pt-br,MSDN.10).gif
Figura 17. O menu de contexto global tem novas opções, e uma opção renomeada.

ms965279.melhoriasUI05(pt-br,MSDN.10).gif
Figura 18. Para chamar o novo menu de contexto da banda, clique com o botão direito na barra cinza de qualquer das bandas.

ms965279.melhoriasUI06(pt-br,MSDN.10).gif
Figura 19. Para chamar o menu de contexto do objeto de layout, clique com o botão direito em qualquer objeto de layout.

Barra de Ferramentas

A barra de ferramentas Report Designer tem alguns novos botões, conforme mostrado na Figura 20.

ms965279.melhoriasUI07(pt-br,MSDN.10).gif
Figura 20. Novas opções para Page Setup e Font Properties foram adicionadas à barra de ferramentas Report Designer.

Caixa de diálogo Expression Builder

Houve algumas alterações na caixa de diálogo Report Expression. A Figura 21 mostra a caixa de diálogo Report Expression expandida, que fornece mais espaço para inserir uma expressão de relatório.

ms965279.melhoriasUI08(pt-br,MSDN.10).gif
Figura 21. Aproveite a caixa de edição da caixa de diálogo "Expression for Field on Report:" mais alta ao inserir expressões com muitas palavras.

Quando a variável de sistema _REPORTBUILDER estiver vazia, o comportamento nativo da caixa de diálogo Expression Builder será o seguinte. Somente as tabelas definidas no Data Environment estão listadas na list box Fields. As tabelas abertas fora do Data Environment não estão disponíveis na list box.

Quando a variável do sistema _REPORTBUILDER estiver definida como ReportBuilder.app, o comportamento da caixa de diálogo Expression Builder será bem diferente. Primeiramente, a Expression Builder definida em _GETEXPR é chamada no lugar da Expression Builder nativa. A Figura 22 mostra a caixa de diálogo Expression Builder padrão.

ms965279.melhoriasUI09(pt-br,MSDN.10).gif
Figura 22. Use a combo box "From table" para selecionar os campos a partir de qualquer tabela aberta.

Essa caixa de diálogo Expression Builder possui uma combo box para escolher qual tabela deverá ser usada durante a listagem dos campos da list box Fields. No entanto, somente as tabelas que estiverem em uso no momento atual estarão listadas na combo box. Este é um ponto importante a ser lembrado porque as tabelas definidas no Data Environment não são abertas automaticamente pelo Report Designer; desse modo, elas não aparecem automaticamente na combo box.

Isso lhe dará a capacidade de controlar quais tabelas estarão disponíveis para os usuários finais quando você permitir que eles modifiquem os relatórios em seus aplicativos. É possível que você tenha definido algumas tabelas no Data Environment das quais precise, mas não quer que o usuário tenha acesso a elas. Assim, você poderá abrir especificamente as tabelas que os usuários irão acessar e omitir as que deseja bloquear.

Caixa de Diálogo Expression Builder Options

O grupo de opções (option group) Field aliases está agora ativado na caixa de diálogo Expression Builder Options, conforme mostrado na Figura 23. Esse grupo de opções permite que você indique se deseja ou não adicionar o alias da tabela à expressão do relatório ao selecionar campos na caixa de diálogo Expression Builder.

ms965279.melhoriasUI10(pt-br,MSDN.10).gif
Figura 23. Use o grupo de opções Field aliases para indicar se deseja ou não que os aliases de campo sejam adicionados aos campos selecionados na caixa de diálogo Expression Builder.

Os botões de opção (option buttons) Always add alias e Never add alias fazem com que o VFP 9.0 automaticamente adicione ou não, respectivamente, o alias da tabela a todos os campos. O comportamento da opção Add non-selected alias only depende do valor da variável de sistema _REPORTBUILDER. Se a variável de sistema _REPORTBUILDER estiver vazia, qualquer campo escolhido em uma tabela que não seja o InitialSelectedAlias receberá como prefixo um alias de tabela. Os campos da tabela InitialSelectedAlias não serão pré-fixados com um alias de tabela.

Se a variável de sistema _REPORTBUILDER estiver definida como ReportBuilder.app, a opção Add non-selected alias only usará uma lógica um pouco diferente. O alias atualmente selecionado será usado no lugar de InitialSelectedAlias para determinar se é necessário ou não incluir o alias da tabela como prefixo do campo.

Além de selecionar um campo na caixa de diálogo Expression Builder, arrastar um campo do Data Environment para a superfície Report Designer honrará a configuração do grupo de opções Field aliases. Além disso, existe uma nova opção na guia Report da caixa de diálogo Options, conforme mostrado na Figura 24. Essa opção determina a configuração padrão de Field aliases para todos os relatórios recém-criados.

ms965279.melhoriasUI11(pt-br,MSDN.10).gif
Figura 24. Use a opção Expression Builder da guia Reports da caixa de diálogo Options para definir o comportamento padrão para a Expression Builder.

Melhorias gerais de UI

Várias outras melhorias na interface do usuário aprimoraram a experiência de design do relatório.

Cursor do mouse

Agora, o cursor do mouse é alterado para fornecer uma dica visual quando o objeto puder ser redimensionado (veja a Figura 25).

ms965279.melhoriasUI12(pt-br,MSDN.10).gif
Figura 25. Use o novo cursor do mouse para saber quando um objeto pode ser redimensionado.

Caixa de diálogo Multiple Selection

O VFP 9.0 tem agora uma caixa de diálogo Multiple Selection, que permite que você defina as propriedades Protection e Print when para mais de um objeto de layout ao mesmo tempo. Ele também permite alterar qualquer propriedade de qualquer objeto de layout individual. Para usar esse novo recurso, selecione mais de um objeto de layout e, em seguida, clique duas vezes em um dos objetos para chamar a caixa de diálogo Multiple Selection, mostrada na Figura 26.

ms965279.melhoriasUI13(pt-br,MSDN.10).gif
Figura 26. Use a guia Selection da caixa de diálogo Multiple Selection para escolher os objetos de layout nos quais deseje trabalhar.

Os objetos de layout que foram selecionados quando essa caixa de diálogo foi chamada estão listados na primeira guia da caixa de diálogo. Para trabalhar com todos os objetos de layout definidos em um relatório, use CTRL+A para selecionar os objetos antes de chamar essa caixa de diálogo.

A opção Sort by permite classificar a lista de objetos de layout por Type ou Location dentro do relatório. O botão Remove from list remove os objetos de layout selecionados na lista. Clique duas vezes em qualquer item da lista para abrir a caixa de diálogo Properties do objeto individual. A guia Properties da caixa de diálogo Multiple Selection, mostrada na Figura 27, é usada para alterar as propriedades de todos os itens listados na guia Selection.

ms965279.melhoriasUI14(pt-br,MSDN.10).gif
Figura 27. Use a guia Properties da caixa de diálogo Multiple Selection para alterar ao mesmo tempo as propriedades Protection e Print when dos objetos de layout selecionados.

Marque a caixa de seleção Apply these protection settings to the selected objects para ativar as opções Protection. Marque a caixa de seleção Apply this condition to the selected objects upon saving para ativar a opção Print when. Altere as configurações Protection e Print when conforme necessário e, em seguida, selecione OK para fechar a caixa de diálogo e aplicar as alterações a todos os objetos de layout listados na primeira guia.

Mais níveis de Zoom

A janela Preview possui mais níveis de Zoom (veja a Figura 28).

ms965279.melhoriasUI15(pt-br,MSDN.10).gif
Figura 28. Use qualquer dos novos níveis de zoom na visualização VFP 9.0 para melhor visibilidade.

O VFP 9.0 fez várias melhorias na interface do usuário, incluindo menus, menus de contexto e barras de ferramentas. As alterações nas caixas de diálogo Expression Builder e Expression Builder Options também aumentaram o número de opções disponíveis ao usuário. Outros aprimoramentos incluem o cursor do mouse, a caixa de seleção Multiple Selection e mais níveis de Zoom.

Melhorias de objetos de layout

Foram adicionadas algumas melhorias aos objetos de layout, tais como uma opção para controlar os caracteres do template, um modo de ajuste para expressões de caractere (trim) e o posicionamento relativo e absoluto.

Nota Para aproveitar as vantagens do Trim Mode, você precisará estar usando o novo Object Assisted Output, seja diretamente, criando o objeto ReportListener, ou indiretamente, usando o comando SET REPORTBEHAVIOR 90.

Template Characters

A caixa de diálogo Field Properties possui uma nova seção Template characters, conforme mostrada na Figura 29. As duas opções disponíveis são Overlay e Interleave. Elas determinam como os caracteres especiais são usados neste formato.

ms965279.melhoriasobjetos01(pt-br,MSDN.10).gif
Figura 29. A opção Template characters determina como os caracteres de formatos especiais são aplicados aos dados.

Quando a opção Overlay é usada, os caracteres especiais são tratados como parte dos dados e sobrepõem todos os outros caracteres específicos naquela posição. Por exemplo, quando Format expression for "999-999" e os dados contiverem "123456", o relatório mostrará "123-56". Observe como o "4" é substituído pelo travessão na expressão de formato.

Quando a opção Interleave é usada, o caractere especial é inserido entre os caracteres existentes nos dados. Por exemplo, quando Format expression for "999-999" e os dados contiverem "123456", o relatório mostrará "123-456". Repare que o travessão foi inserido entre o "3" e "4".

Modo de ajuste (Trim Mode) para expressões de caracteres

Antes do VFP 9.0, os objetos de campo eram sempre ajustados (aparados) em relação à palavra mais próxima quando o texto era muito longo. No VFP 9.0, uma nova opção da caixa de diálogo Field Properties permite que você determine como texto será ajustado (veja a Figura 30).

ms965279.melhoriasobjetos02(pt-br,MSDN.10).gif
Figura 30. Use o modo Trim para expressões de caractere para indicar o método a ser usado para ajustar textos longos.

As seis opções de ajuste são:

  • Selecione Default trimming para usar o comportamento padrão, que é o mesmo do da opção Trim to nearest word, append ellipsis. Esse comportamento é semelhante ao das versões anteriores do VFP, com exceção do acréscimo das reticências.

  • Selecione Trim to nearest character para fazer com que o texto seja ajustado com relação ao último caractere inteiro que caiba na área definida.

  • Selecione Trim to nearest word para fazer com que o texto seja ajustado com relação à última palavra inteira que caiba na área definida.

  • Selecione Trim to nearest character, append ellipsis para que o texto seja ajustado em relação ao ultimo caractere inteiro que se encontra na área definida, após a inclusão de reticências no texto a ser impresso.

  • Selecione Trim to nearest character, append ellipsis para que o texto seja ajustado em relação à última palavra na área definida, após a inclusão de reticências no texto a ser impresso.

  • Selecione Filespec: Show inner path as ellipsis para fazer com que os diretórios internos de um nome de arquivo e caminho longo sejam substituídos por reticências quando o texto completo não couber na área definida.

Tamanho e Posição

Outro novo recurso disponível nos objetos Layout é o melhor controle do tamanho e da posição do objeto, conforme mostrado na Figura 31.

ms965279.melhoriasobjetos03(pt-br,MSDN.10).gif
Figura 31. Use as opções da área Size and position in layout da caixa de diálogo Properties para controlar o posicionamento relativo e absoluto.

Quando um objeto é adicionado ao relatório, os valores de From page top, From left, Height e Width são automaticamente definidos. É importante observar que a propriedade From page top é relativa à parte superior da página do Report Designer, o que significa que ela leva em conta a altura das barras cinzas acima do objeto. A alteração da propriedade From page top pode mover por descuido o objeto para outra banda.

Posicionamento relativo

A propriedade From page top e a propriedade Height funcionam juntas para determinar se é utilizado o posicionamento absoluto ou o relativo. Quando a propriedade From page top for definida como um valor que esteja dentro da superfície do Report Designer, e o valor da propriedade Height for menor ou igual à altura da banda na qual o objeto estiver localizado, será usado o posicionamento relativo. O posicionamento relativo é necessário para os objetos localizados em bandas diferentes de Page Header e Page Footer.

Posicionamento absoluto

Quando a propriedade From page top for definida como um valor que esteja fora da superfície do Report Designer, e o valor da propriedade Height for maior do que a altura da banda na qual o objeto estiver localizado, será usado o posicionamento absoluto. Posicionamento absoluto significa que o objeto é impresso exatamente no mesmo local em todas as páginas.

O Posicionamento Absoluto pode ser usado para criar uma marca d'água em um relatório. Coloque uma imagem gráfica na banda Page Header e defina-a como Scale contents, retain shape. Altere as propriedades From page top e From left para indicar a borda superior esquerda do local onde deseja que a marca d'água comece. Altere as propriedades Height e Width para indicar o tamanho total da marca d'água, certificando-se de não ultrapassar as margens de impressão.

Recursos internacionais

Algumas alterações foram feitas no VFP 9.0 para criar relatórios mais funcionais em situações internacionais. Especificamente, é possível definir conjuntos de caracteres ou scripts de linguagem para as fontes. As unidades e o comando STRCONV() têm mais opções.

FontCharSet

O conjunto de caracteres ou o script de linguagem de uma fonte podem ser definidos na caixa de diálogo Font, conforme mostrado na Figura 32. Eles podem ser atribuídos a um objeto específico no relatório e definidos como a fonte padrão do relatório completo.

ms965279.recursos01(pt-br,MSDN.10).gif
Figura 32. Use a combo box Script para selecionar um conjunto de caracteres ou uma linguagem de scripts.

Unidades (Units)

A caixa de diálogo Set Grid Scale possui três opções Ruler Scale adicionais para permitir que você defina especificamente a escala como polegadas (inches) ou metros/centímetros ou para desativar a régua. Isso lhe dará mais controle quando você tiver clientes com diferentes padrões de sistema. A Figura 33 mostra as novas opções na caixa de diálogo Set Grid Scale.

ms965279.recursos02(pt-br,MSDN.10).gif
Figura 33. Use a nova caixa de combinação drop-down na caixa de diálogo Set Grid Scale para melhor controle sobre a escala da régua.

As mesmas alterações feitas na caixa de diálogo Set Grid Scale também aparecem na guia Report da caixa de diálogo Options.

STRCONV()

Outra alteração no VFP 9.0 que auxilia os relatórios internacionais é uma mudança na função STRCONV(). Você pode usá-la agora para manipular transformações, usando valores de codepages e fontcharset, juntamente com IDs de localidades (locale IDs). A documentação do Help mostrada a seguir explica a nova funcionalidade do comando STRCONV().

STRCONV(cExpression, nConversionSetting [,nRegionalIdentifier [,nRegionalIDType]])
nRegionalIDType: 
0 - (default) nRegionalIdentifier is LocaleID.
1 - nRegionalIdentifier is code page.
2 - nRegionalIdentifier is FontCharSet.
For nConversion settings 1, 2, 3, 4, 7, and 8, only nRegionalIdentifier=0 is supported

Para criar relatórios em idiomas diferentes do inglês, as novas melhorias no FontCharSet, as unidades Units) e o comando STRCONV() permitem mais flexibilidade no design.

Melhorias de impressão

Alguns comandos e caixas de diálogo existentes foram aprimorados para melhor funcionalidade. O comando SYS(1037) possui um novo parâmetro e valor de retorno, o comando GetFont() possui um novo estilo, e o comando APrinters() tem três novas colunas.

SYS(1037)

O comando SYS(1037) é usado para chamar a caixa de diálogo Print Setup, bem como para alterar a impressora padrão do VFP. Antes do VFP 9.0, o comando SYS(1037) não tinha nenhum valor de retorno significativo. Ele retornava sempre uma string vazia, independentemente do que o usuário fizesse. Isso tornava impossível saber se o usuário clicou no botão Cancel.

No VFP 9.0, foi adicionado um novo parâmetro à função SYS(1037), além de um valor de retorno sugestivo (veja a Tabela 1.)

Tabela 1. Novo parâmetro e valor de retorno do SYS(1037)

Parâmetro

Descrição

Valor de Retorno

SYS(1037)

Mesmo comportamento da versão anterior, exceto que ele agora retorna um valor sugestivo.

0 = Cancelado pelo usuário

1 = Usuário selecionou

OK

SYS(1037,1)

Se a área de trabalho atual contiver uma estrutura correspondente à estrutura de um FRX e não houver nenhuma informação de impressora armazenada na área de trabalho atual, será chamada a caixa de diálogo Page Setup. Se o usuário selecionar OK na caixa de diálogo, o VFP gravará os campos EXPR, TAG e TAG2 no primeiro registro do cursor e, em seguida, retornará o cursor ao RECNO() anterior.

Se a área de trabalho atual não tiver a estrutura apropriada, nenhuma caixa de diálogo será chamada e será retornado o valor zero.

0 = Usuário cancelou ou estrutura não era válida

1 = Usuário selecionou OK, FRX atualizado de acordo

SYS(1037,2)

Se a área de trabalho atual contiver uma estrutura correspondente à estrutura de um FRX, as informações da impressora padrão do VFP serão gravadas nos campos EXPR, TAG e TAG2 do primeiro registro e, em seguida, retornará o cursor ao RECNO() anterior.

Se a área de trabalho atual não tiver a estrutura apropriada, nenhuma informação será gravada no cursor e será retornado o valor zero.

0 = Nenhuma ação efetuada, estrutura é inválida

1 = As informações da impressora padrão do VFP foram salvas com êxito no FRX

SYS(1037,3)

Se a área de trabalho atual contiver uma estrutura correspondente à estrutura de um FRX, o Printer Environment do FRX será salvo como a nova impressora padrão do VFP. Além disso, ele gravará novamente o ambiente da impressora no FRX, para o caso de ter havido alguma informação inválida.

Se a área de trabalho atual não tiver a estrutura apropriada, nenhuma ação será executada e será retornado o valor zero.

0 = Nenhuma ação foi executada

1 = As informações da impressora padrão do VFP Default Printer foram definidas a partir do FRX

GetFont()

Houve pequenas mudanças no comando GetFont().

Printable Fonts Only (Somente fontes imprimíveis)

O terceiro parâmetro de GetFont() tem um novo valor. O envio de P informa o VFP para exibir apenas as fontes imprimíveis para a impressora padrão, conforme mostrado abaixo.

=GetFont(' ', 0, 'P')

FontCharSet

Assim como nas versões anteriores do VFP, o quarto parâmetro do GetFont() é usado para identificar o FontCharSet. No entanto, houve uma pequena mudança no significado de se passar 0 ou 1 como quarto parâmetro.

  • Passar 0 ativa a combo box Script, define explicitamente "Western script" e retorna a FontCharSet junto com os outros dados.

  • Passar 1 ativa a combo box Script, define o valor como as configurações regionais do usuário e retorna o FontCharSet junto com os outros dados.

Assim como nas versões anteriores, a omissão do quarto parâmetro desativa a combo box Script e não retorna FontCharSet como parte do valor de retorno.

APrinters()

Um novo parâmetro foi adicionado ao comando APrinters() para reunir informações sobre as impressoras. O uso do segundo parâmetro opcional, conforme mostrado abaixo, faz com que o array seja preenchido com três colunas adicionais.

lnPrinters = APrinters(laPrinters, 1) 

As primeiras duas colunas são as mesmas das versões anteriores; Name of Printer e Printer Port. As três novas colunas são Driver, Comment e Location.

Chamar APrinters() sem o segundo parâmetro opcional permite o mesmo comportamento das versões anteriores; ou seja, duas colunas são retornadas.

Caixas de diálogo modernas

A caixa de diálogo Print Setup foi renomeada para Page Setup e foi modernizada. A caixa de diálogo Printer também foi modernizada quando executada em sistemas Windows 2000 ou posteriores.

Caixa de diálogo Page Setup

A caixa de diálogo Page Setup, mostrada na Figura 34, poderá ser chamada por um dos seguintes métodos:

  • Quando o Report Designer não for WONTOP(), selecione Page Setup no menu File.

  • Quando o Report Designer for WONTOP(), selecione o botão Page Setup na caixa de diálogo Report Page Setup.

  • Use SYS(1037).

ms965279.melhoriasimpressao01(pt-br,MSDN.10).gif
Figura 34. A nova caixa de diálogo Page Setup substitui a antiga caixa de diálogo Print Setup.

Caixa de diálogo Print

  • Selecione Print no menu File.

  • Use as cláusulas TO PRINTER PROMPT em um comando, tal como REPORT FORM.

ms965279.melhoriasimpressao01(pt-br,MSDN.10).gif
Figura 35. A nova caixa de diálogo Print tem uma aparência mais moderna quando executada no Windows 2000 ou posterior.

Melhorias de grupos de dados

Algumas melhorias foram feitas nos grupos de dados (Data Groups) do VFP 9.0 Report Writer.

Máximo de grupos de dados

O número máximo de grupos de dados aumentou de 20 para 74.

Colunas horizontais

Anteriormente, os relatórios com mais de uma coluna definida como horizontal em um grupo de dados ocupava muito espaço. A primeira posição (linha 1, coluna 1) era deixada em branco e os dados começavam na coluna 2 da linha 1. Além disso, uma banda em branco era desperdiçada entre cada conjunto de grupos de dados, conforme mostrado na Figura 36. Mesmo que a altura da banda Data Group Header fosse zero, o VFP ainda reservava o espaço, conforme mostrado na Figura 37.

ms965279.melhoriasgrupos01(pt-br,MSDN.10).gif
Figura 36. As versões anteriores do VFP desperdiçavam muito espaço quando utilizassem colunas horizontais com grupos de dados. (Clique na imagem para ampliá-la.)

ms965279.melhoriasgrupos02(pt-br,MSDN.10).gif
Figura 37. As versões anteriores do VFP reservaram espaço para Data Group Headers, mesmo que não houvesse nenhum definido. (Clique na imagem para ampliá-la.)

No VFP 9.0, o comportamento dos grupos de dados e das colunas horizontais mudou. Quando um novo grupo de dados é encontrado, ele é impresso na coluna 1 da próxima linha completa. O restante dessa linha é deixado em branco e não é usado para detalhes de impressão (printing details). Os detalhes pertencentes ao grupo de dados começam na coluna 1 da linha imediatamente após a linha na qual o grupo de dados está impresso, conforme mostrado na Figura 38. Além disso, nenhum espaço extra será reservado se a altura da banda Data Group Header for zero, conforme mostrado na Figura 39.

ms965279.melhoriasgrupos03(pt-br,MSDN.10).gif
Figura 38. O VFP 9.0 não desperdiça tanto espaço como as versões anteriores quando as colunas horizontais e os grupos de dados forem usados. (Clique na imagem para ampliá-la.)

ms965279.melhoriasgrupos04(pt-br,MSDN.10).gif
Figura 39. O VFP 9.0 não reserva espaço extra quando a banda Data Group Header tem 0" de altura. (Clique na imagem para ampliá-la.)

O novo comportamento, embora evite a situação descrita anteriormente, pode quebrar alguns relatórios existentes. No entanto, um benefício adicional do novo comportamento é que a banda Data Group pode ser ampliada por todas as colunas, conforme mostrado na Figura 40.

ms965279.melhoriasgrupos05(pt-br,MSDN.10).gif s
Figura 40. No VFP 9.0, é possível estender a banda Data Group Header por várias colunas. (Clique na imagem para ampliá-la.)

Bandas de detalhes múltiplas

Além das melhorias de extensibilidade no VFP 9.0 Report Writer, o novo recurso de bandas de vários detalhes é um dos aprimoramentos mais solicitados pelo usuário. Ele permite que você processe várias tabelas filhas para cada registro de uma tabela-pai. Um exemplo desse tipo de relatório é mostrado na Figura 41.

ms965279.bandas01(pt-br,MSDN.10).gif
Figura 41. Esse relatório de exemplo de banda de vários detalhes tem três bandas de detalhes separadas para cada cliente. (Clique na imagem para ampliá-la.)

Tabelas e relações

Compreender como as tabelas filhas e as tabelas pai funcionam juntas são fundamentais para compreender como utilizar esse novo recurso. Para fins de exemplo de um cenário de vários detalhes, imagine que você esteja escrevendo o relatório mostrado na Figura 41. O banco de dados desse cenário é mostrado na Figura 42.

ms965279.bandas02(pt-br,MSDN.10).gif
Figura 42. Exemplo de um banco de dados de Customers, Members, Vehicles e Homes para uma companhia de seguros.

A tabela Customer é a tabela-pai e contém um registro para cada cliente da companhia de seguros. As tabelas Members, Vehicles e Homes são tabelas filhas da tabela Customer. A tabela Members armazena um registro para cada membro da família do cliente. A tabela Vehicles armazena um registro para cada veículo assegurado pelo cliente. A tabela Homes armazena um registro para cada casa assegurada pelo cliente.

Manejando o relatório

É necessário haver uma tabela para guiar o relatório. Nesse exemplo, a tabela Customer é a tabela-guia. Se você usar o Data Environment do relatório para definir as tabelas, defina a propriedade InitialSelectedAlias para essa tabela. Se estiver usando código para definir as tabelas, certifique-se de que a tabela Customer seja a área de trabalho atual no momento em que o relatório é executado.

O "Alias de destino"

Alias de destino é o termo usado para descrever qual tabela é a tabela-guia de uma determinada banda de detalhes. Nesse exemplo, a tabela Members é o alias de destino da banda de detalhes 1, a tabela Vehicles é o alias de destino da banda de detalhes 2, e a tabela Homes é o alias de destino da banda de detalhes 3.

Caso não seja definido nenhum alias de destino para uma banda de detalhes, o comportamento adotado será o mesmo do das versões anteriores do VFP. Em outras palavras, será processada uma banda de detalhes por registro-pai. No entanto, se inserir o nome da tabela-pai como o alias de destino, você obterá resultados muito diferentes. Para cada registro na tabela-pai, o VFP processa todos os registros em toda a tabela-pai, imprimindo cada registro-pai na banda de detalhes. Desse modo, se você tiver uma tabela com 10 registros-pai e definir o alias de destino de uma banda de detalhes para a tabela-pai, o relatório final imprimirá 10 conjuntos de 10 registros, ou um total de 100 registros.

Relações

É importante compreender que as relações têm papel importante na maneira como operam as bandas de vários detalhes. O VFP usa as relações entre a tabela-pai e as tabelas filhas para navegar nos registros. Você pode usar SET RELATION ou SET SKIP para definir tais relações. Se você estiver abrindo as tabelas no Data Environment e as relações já estiverem definidas no banco de dados, elas serão honradas.

Se você estiver abrindo as tabelas em código, o exemplo a seguir mostra como configurar as tabelas para a Insurance Customer Listing mostrada na Figura 41.

*-- Open the child tables
USE Members IN 0 ORDER CustomerFK
USE Vehicles IN 0 ORDER CustomerFK
USE Homes IN 0 ORDER CustomerFK
*-- Open the parent table
SELECT 0
USE customer ORDER CustomerPK
*-- Set the relations between the parent and children
SET RELATION TO CustomerPK INTO Members
SET RELATION TO CustomerPK INTO Vehicles ADDITIVE
SET RELATION TO CustomerPK INTO Homes ADDITIVE
*-- Run the report
REPORT FORM Insurance PREVIEW

Definindo bandas de vários detalhes

Por padrão, são criados novos relatórios com uma banda de detalhes.

Incluindo bandas de detalhes adicionais

As bandas de detalhes adicionais são incluídas por meio da caixa de diálogo Optional Bands mostrada na Figura 43. Para chamar essa caixa de diálogo, selecione Optional Bands... no menu Report. Essa caixa de diálogo é a mesma caixa anteriomente chamada Title/Summary. Ela foi renomeada para se ajustar melhor à nova opção adicionada a ela.

ms965279.bandas03(pt-br,MSDN.10).gif
Figura 43. Use o a opção de rolar em Details da caixa de diálogo Optional Bands para ajustar o número total de bandas de detalhes.

Aumente o valor de Details até o número total de bandas de detalhes que você deseja incluir no relatório. Você pode definir até 20 bandas de detalhes para cada relatório. A Figura 44 mostra como o Report Designer ficará após a escolha de três bandas de detalhes.

ms965279.bandas04(pt-br,MSDN.10).gif
Figura 44. Esse relatório de exemplo tem três bandas de detalhes definidas. (Clique na imagem para ampliá-la.)

Definindo o alias de destino

O alias de destino (Target Alias) é atribuído a uma banda de detalhes por meio da caixa de diálogo Detail (veja a Figura 45). Essa caixa de diálogo pode ser chamada selecionando-se Edit Bands... no menu Report e, em seguida, selecionando a banda de detalhes aplicável. Você também pode chamar essa caixa de diálogo com um clique duplo na barra cinza da banda de detalhes aplicável.

ms965279.bandas05(pt-br,MSDN.10).gif
Figura 45. Defina o "alias de destino" (Target Alias) de cada banda de detalhes na caixa de diálogo Detail aplicável.

O Target alias é uma expressão; desse modo, é necessário incluir o nome entre aspas. Uma vez definido cada alias de destino, as barras cinzas que representam as bandas de destino mostrarão o alias de destino (veja a Figura 46).

ms965279.bandas06(pt-br,MSDN.10).gif
Figura 46. O Report Designer identifica cada banda de detalhes com um número e com o alias de destino associado a ele, para que você possa identificar facilmente as diferentes bandas de detalhes. (Clique na imagem para ampliá-la.)

Ao criar relatórios de várias bandas de detalhes, é importante prefixar os nomes de campo com o nome do alias aplicável. Isso impede confusões com relação à tabela que dá origem a um determinado campo.

Cabeçalhos e rodapés

Outro recurso da melhoria da banda de vários detalhes é a capacidade de adicionar cabeçalhos e rodapés a cada banda de detalhes. Esse recurso, em alguns aspectos, é semelhante a agrupar cabeçalhos e rodapés, porém tem algumas diferenças. Para cada registro-pai processado, ocorre o seguinte:

  • A banda do cabeçalho de detalhes 1 é processada.

  • A banda de detalhes 1 é processada uma vez para cada registro-filho no alias de destino associado

  • A banda do rodapé de detalhes 1 é processada.

  • A banda do cabeçalho de detalhes 2 é processada.

  • A banda de detalhes 2 é processada uma vez para cada registro-filho no alias de destino associado.

  • A banda do rodapé de detalhes 2 é processada.

  • A banda do cabeçalho de detalhes 3 é processada.

  • A banda de detalhes 3 é processada uma vez para cada registro-filho no alias de destino associado.

  • A banda do rodapé de detalhes 3 é processada.

Para ativar os detalhes dos cabeçalhos e rodapés, coloque uma marca na caixa de seleção Detail Header/Footer da caixa de diálogo Detail para cada uma das bandas de detalhes (veja a Figura 45). Para ajudar a diferenciar as bandas de detalhes em relação às outras bandas, o triângulo que precede o nome da banda aparecerá preenchido (sólido), ao passo que os outros triângulos aparecerão mais claros (veja a Figura 47).

ms965279.bandas07(pt-br,MSDN.10).gif
Figura 47. As bandas de detalhes são identificadas por triângulos sólidos, e todas as outras bandas são identificadas com triângulos mais claros. (Clique na imagem para ampliá-la.)

Além de o Report Designer identificar cada banda de detalhes, a caixa de diálogo Edit Bands também indica cada banda de cabeçalho de detalhes (detail header), rodapé de detalhes (detail footer) e banda de detalhes usando o número de seqüência da banda. A caixa de diálogo Edit Bands pode ser chamada selecionando-se Edit Bands... no menu Report (veja a Figura 48).

ms965279.bandas08(pt-br,MSDN.10).gif
Figura 48. A caixa de diálogo Edit Bands usa cada número de seqüência da banda de detalhes para ajudar a identificar cada banda de detalhes, banda de cabeçalho de detalhes e banda de rodapé de detalhes.

É importante observar que, mesmo que não exista nenhum registro de detalhe para uma banda de detalhes específica, as bandas de cabeçalho e de rodapé de detalhes associadas ainda serão impressas. Se não quiser as bandas de cabeçalho e de rodapé de detalhes sob esta condição, você poderá usar a lógica Print when em cada objeto de layout definido nas bandas para suspender a impressão delas. Certifique-se de colocar também uma marca na caixa de seleção Remove line if blank desses objetos de layout.

NOT EOF(<target alias>) 

Assim como o recurso de agrupamento de cabeçalhos e rodapés (group headers e footers), o recurso de detalhes de cabeçalhos e rodapés de detalhes (detail headers e footers) tem algumas opções semelhantes. Conforme mostrado na Figura 45, a caixa de diálogo Detail tem muitas novas opções:

  • Start on a new column: Use esta opção para fazer com que o conjunto de detalhes tenha início em uma nova coluna do relatório. Observe que essa opção não permite que você atribua especificamente um conjunto de detalhes a uma coluna específica. Se a quantidade de informações contidas no conjunto de detalhes fizer com que este transborde na coluna, ele continuará na próxima coluna.

  • Start on a new page: Use esta opção para fazer com que o conjunto de detalhes tenha início em uma nova página.

  • Reset page number to 1 for each detail set: Use esta opção, juntamente com a opção Start on a new page, para redefinir o número de página como 1 para cada novo conjunto de detalhes.

  • Start detail set on new page when less than: Use esta opção para ajudar a prevenir linhas órfãs. O conjunto de detalhes será iniciado em uma nova página se a quantidade de espaço indicada não estiver disponível.

  • Detail Header/Footer: Use esta opção para adicionar uma banda de cabeçalho de detalhes e de rodapé de detalhes em torno dessa banda de detalhes.

  • Reprint detail header on each page: Use esta opção, juntamente com a opção Detail Header/Footer, para fazer com que a banda de cabeçalho de detalhes seja reimpressa sempre que o conjunto de detalhes transbordar para uma nova página.

Cálculos e variáveis de relatório

Com a introdução das bandas de vários detalhes, os cálculos e variáveis de relatório tiveram alguns desvios. Você precisa compreender totalmente como eles são processados para usá-los de forma eficaz. Caso contrário, é possível que não obtenha os resultados esperados.

O Reset at na caixa de diálogo Report Variables foi renomeado como Reset based on. Isso define com mais clareza que a variável seja redefinida com base na alteração do valor da opção selecionada. Além da renomeação do controle, se houver mais de uma banda de detalhes definida no relatório, todas elas serão adicionadas à lista drop-down. Veja na Figura 49 um exemplo da nova caixa de diálogo Report Variables.

ms965279.bandas09(pt-br,MSDN.10).gif
Figura 49. As variáveis de relatório calculadas têm novas opções "Reset based on".

Selecionar Detail on como o valor de Reset based on informa o VFP para processar esse cálculo somente durante o processamento dos registros de detalhe no alias de destino dessa banda de detalhes. A variável de relatório não será alterada quando os registros nos outros aliases de destino estiverem sendo processados. Isso permite que você associe uma variável de relatório a uma banda de detalhes específica. O valor da variável de relatório não será liberado até que a banda do cabeçalho de detalhes desse mesmo conjunto de detalhes seja processada para o próximo registro-pai.

Se você escolher um valor Reset based on diferente daquele nas bandas de detalhes, o cálculo será processado em vários locais. Primeiramente, o cálculo será aplicado a cada registro-pai. Em seguida, o cálculo será aplicado a cada registro no alias de destino da primeira banda de detalhes. Em seguida, ele será aplicado a cada registro no alias de destino da segunda banda de detalhes e assim por diante.

No relatório de duas páginas mostrado na Figura 50, você pode ver um exemplo das variáveis de relatório calculadas associadas às bandas de detalhe individuais. Você também pode ver que Total records processed no final do relatório mostra um valor 20. Esse número representa o total de membros processados (7), acrescido do total de veículos processados (7), mais o total de casas processadas (3), mais o total de clientes processados (3).

ms965279.bandas10(pt-br,MSDN.10).gif ms965279.bandas11(pt-br,MSDN.10).gif
Figura 50. As variáveis de relatório calculadas podem ser associadas a uma banda de detalhes ou serem aplicadas a todos os registros processados. (Clique nas imagens para ampliá-las.)

Diversos

Existem alguns outros itens a serem explicados nas bandas de vários detalhes.

Armazenamento FRX

As bandas são armazenadas no FRX com um valor OBJTYPE de 9, e um valor OBJCODE que determina o tipo da banda do registro. As bandas do cabeçalho de detalhes (detail header) são armazenadas com um valor OBJCODE de 9, e as bandas do rodapé de detalhes (footer bands) são armazenadas com um valor OBJCODE de 10.

A expressão do novo alias de destino é armazenada no campo EXPR do registro da banda de detalhes aplicável.

Emissões de SUMMARY

O uso da cláusula SUMMARY do comando REPORT FORM impede que a banda de detalhes seja impressa, porém todos os rodapés e cabeçalhos da página, rodapés e cabeçalhos de coluna e rodapés e cabeçalhos de grupo serão impressos. As expressões On Entry ou On Exit em uma banda de detalhes não serão processadas quando a cláusula SUMMARY for usada. Ao emitir SUMMARY em um relatório de banda de vários detalhes, os rodapés e cabeçalhos de detalhes e as bandas de detalhes não serão processadas.

Muito a aprender

Dominar as bandas de vários detalhes pode levar muito tempo. Você precisa compreender como todas as tabelas funcionam juntas, saber como é um alias de destino (target alias), e entender as relações entre as tabelas. Você também precisa ter uma idéia de como os cálculos e variáveis são afetados pelas bandas de vários detalhes. É possível que você precise ler essa seção mais de uma vez antes de todas essas informações sejam compreendidas.

O FRX

Para manter a compatibilidade retroativa, o VFP 9.0 Report Writer usa a mesma estrutura de FRX das versões anteriores. Para cada registro no FRX, os campos OBJTYPE e OBJCODE são usados juntos para definir qual tipo de dado estará contido no registro. Nem todos os campos do FRX se aplicam a todos os tipos de registro. Desse modo, para acomodar todos os novos recursos do VFP 9.0 Report Writer, os campos existentes serão sobrecarregados quando necessário.

Outra mudança importante no VFP 9.0 Report é a maneira como o campo USER é tratado. Antes do VFP 9.0, os dados armazenados no campo USER eram apagados. Esse comportamento destruiu o objetivo do campo USER e tornou-o inutilizável. No VFP 9.0, todos os dados armazenados no campo USER serão retidos e ambandonados. Você também pode criar campos adicionais no FRX, desde que eles sejam adicionados ao final do FRX. Os campos adicionais serão mantidos pelo VFP e não serão excluídos.

Além de reter o campo USER, o VFP 9.0 Report Writer retém todos os registros de tipos desconhecidos. Em vez de excluí-los do FRX, o Report Writer mantém esses registros no final da tabela FRX e os ignora durante o processamento. Isso lhe permitirá adicionar seus próprios tipos de registro para processamento especial.

Teoricamente, você também pode criar relatórios no VFP 9.0 e, desde que não use nenhum novo recurso, poderá executar os relatórios nas versões anteriores do Visual FoxPro. É claro, se você adicionar novos campos ou registros ao FRX, eles serão destruídos se você editar e salvar o relatório em uma versão mais antiga do VFP.

Os registros

Existem diferentes tipos de registros armazenados nos metadados do relatório. O campo OBJTYPE identifica o tipo de cada registro, e o resto das informações no registro variará enormemente dependendo do OBJTYPE. Em outras palavras, os campos na tabela têm várias finalidades e você precisa conhecer o OBJTYPE para decifrar o significado do restante do registro. Os tipos válidos são:

  • Report definition (OBJTYPE = 1): O primeiro registro da tabela é um registro de definição de relatório. Ele contém informações gerais sobre o relatório, tais como informações da impressora e de configuração de página. Existe um registro de definição de relatório por tabela.

  • Objetos Report (Report objects): Vários tipos de objetos são usados para retratar texto, dados e figuras em um relatório. Conjuntamente, tais objetos são chamados objetos Report e consistem nos cinco tipos a seguir.

    • Label (OBJTYPE = 5): O objeto label é usado para descrever um texto estático colocado em um relatório. Ele é geralmente usado em títulos de relatório, títulos de coluna, nome de empresa e outras informações que não são alteradas a cada vez que o relatório é impresso. Cada objeto label em um relatório é representado por um registro.

    • Line (OBJTYPE = 6): Um objeto line é usado para representar linhas horizontais e verticais em um relatório. Cada objeto line em um relatório é representado por um registro.

    • Shape (OBJTYPE = 7): O objeto shape é usado para representar retângulos e retângulos arredondados em um relatório. Cada objeto shape em um relatório é representado por um registro.

    • Field (OBJTYPE = 8): O objeto field é um dos mais usados em um relatório. Ele é usado para imprimir dados em um relatório. Tais dados podem ser um campo em uma tabela ou os resultados de uma expressão. Ele pode inclusive usar os cálculos internos fornecidos pelo VFP Report Writer para obter os resultados. Cada objeto field em um relatório é representado por um registro.

    • Picture (OBJTYPE = 17): O objeto picture é usado para representar um controle Picture/ActiveX Bound em um relatório. Cada objeto Picture/ActiveX em um relatório é representado por um registro.

  • Band (OBJTYPE = 9): O objeto band é usado para representar uma banda individual em um relatório. No mínimo, todos os relatórios possuem três objetos de banda: page header, detail e page footer. Um relatório também pode conter várias bandas opcionais: title, column header, data group header, column footer, data group footer, summary, detail header e detail footer.

  • Group (OBJTYPE = 10): O objeto group é usado para representar um grupo de objetos de relatório que foram reunidos por meio da opção Group do menu Format a partir do Report Designer (não confunda esse objeto com grupos de dados - data groups).

  • Variable (OBJTYPE = 18): O objeto variable é usado para representar uma variável de relatório individual. Cada variável de relatório em um relatório é representada por um registro.

  • Font (OBJTYPE = 23): O objeto font é usado para representar uma fonte exclusiva, usada em algum lugar do relatório. Cada fonte diferente usada no relatório é representada por um registro de objeto font. No mínimo, existirá um objeto font (para a fonte padrão).

  • Data Environment (OBJTYPE = 25): O objeto data environment é usado para representar o ambiente de dados de um relatório. Todos os códigos de método e propriedades do ambiente de dados são armazenados neste registro. Existe um registro de ambiente de dados (data environment) por tabela.

  • Data (OBJTYPE = 26): O objeto data é usado para representar um objeto cursor ou um objeto relation. Cada cursor or relação definido no ambiente de dados (data environment) de um relatório é representado por um registro.

Os registros são colocados na tabela em uma ordem física específica, e é importante respeitar essa ordem quando se programa a inclusão de novos registros. Você pode usar o comando SORT para copiar os registros em uma tabela temporária e, em seguida retorná-los à tabela na ordem correta, que é a seguinte:

  • O registro de definição do relatório (OBJTYPE = 1)

  • Os registros de banda (OBJTYPE = 9). As bandas são adicionadas à tabela pela ordem crescente do campo OBJCODE, com as seguintes exceções:

    • Quando houver vários grupos de dados definidos no relatório...

    ...as bandas de cabeçalho do grupo (group header bands) (objcode = 3) são adicionadas na mesma ordem em que aparecem na caixa de diálogo Data Grouping.

    ...as bandas de rodapé do grupo (group footer bands) (objcode = 5) são adicionadas na ordem oposta em que aparecem na caixa de diálogo Data Grouping.

    • Quando houver bandas de vários detalhes (multiple-detail bands) definidas no relatório, as bandas detail header, detail e detail footer da primeira banda de detalhes serão adicionadas como um conjunto. Em seguida, é adicionado o conjunto de registros da segunda banda de detalhes, e assim por diante.
  • Os objetos report (OBJTYPE = 5, 6, 7, 8 e 17) são adicionados na ordem Z (Z-Order), na qual o objeto localizado mais abaixo é adicionado em primeiro lugar.

  • Registros de grupo (OBJTYPE = 10)

  • Registros de variável de relatório (OBJTYPE = 18). Os registros de variável de relatório são adicionados à tabela na mesma ordem em que aparecem na caixa de diálogo Report Variable.

  • Registros de fonte (OBJTYPE = 23)

  • O registro de ambiente de dados (data environment) (OBJTYPE = 25)

  • Os registros de dados (OBJTYPE = 26) são adicionados na ordem em que são incluídos no ambiente de dados.

A unidade de medida

O Visual FoxPro usa sua própria unidade de medida, a FRU (FoxPro Report Units), ao se referir ao tamanho e à posição dos objetos no relatório. Se o seu sistema estiver configurado para polegadas (inches), a unidade de medida será 1/10.000 de uma polegada. Se o seu sistema estiver configurado para centímetros, a unidade de medida será 1/1.000 de um centímetro.

A posição

Não existe nenhum campo na tabela que represente a banda à qual pertence um objeto. Em vez disso, o Visual FoxPro determina a banda calculando a altura definida de cada banda, os VPOS do objeto e, em seguida, determina à qual banda pertence determinado VPOS.

Ao observar a altura de cada banda, no entanto, o VFP também leva em conta a altura da barra cinza horizontal que representa cada banda quando ela é exibida na tela pelo Report Designer. O valor da altura da barra horizontal é 2083,33333333 (polegadas), e 529,16666667 (centímetos).

Os campos

Descrever o que cada campo representa é difícil porque os campos podem ser usados para diferentes finalidades, dependendo da função do OBJTYPE em um registro específico. A Tabela 2 lista cada campo da tabela e o seu significado para os diferentes tipos de objetos.

Além da Tabela 2, a Microsoft forneceu um DBF que contém informações sobre as tabelas FRX. Esse DBF foi atualizado para o VFP 9.0 e está localizado no diretório HOME() + 'tools\filespec'.

Tabela 2. Estrutura de tabela de um relatório VFP 9.0 (FRX)

Campo

OBJTYPE

Descrição

PLATFORM

Todos

Sempre "WINDOWS"

UNIQUEID

Todos exceto:

0-Comment

23-Font

25-Data Environment

26-Data

Identificador exclusivo da maioria dos registros. Você pode usar o SYS(2015) para criar seu próprio valor exclusivo ao adicionar registros.

TIMESTAMP

Todos exceto:

21-Printer driver (2.x)

23-Font

25-Data Environment

26-Data

Indicador de data e hora da última alteração do registro.

OBJTYPE

 

0-49 reservado apenas para uso nativo.

50-99 disponível para uso personalizado.

0 = Comentário

1 = Definição de relatório

2 = Área de trabalho (relatórios 2.x)

3 = Índice (relatórios 2.x)

4 = Relações (relatórios 2.x)

5 = Rótulo (Label)

6 = Linha (Line)

7 = Forma (Shape)

8 = Campo (Field)

9 = Banda (Band)

10 = Objetos agrupados (não confundir com Grupos de dados - Data Groups)

17 = Picture / OLE Bound

18 = Variável

21 = Configuração de driver de impressora (relatórios 2.x)

23 = Fonte

25 = Ambiente de dados (Data Environment)

26 = Dados (cursor, relação ou adaptador de cursor)

OBJCODE

 

Quando o campo OBJTYPE sozinho não é suficiente para identificar um tipo de registro, o campo OBJCODE é usado para auxiliar na identificação.

 

1-Report Definition

Sempre 53.

 

2-Work area (2.x)

Área de trabalho da tabela.

 

3-Index (2.x)

Área de trabalho do IDX.

 

4-Relation (2.x)

Área de trabalho da tabela-filha.

 

5-Label

6-Line

8-Field

10-Group

17-Picture

Sempre 0.

 

7-Shape

Sempre 4.

 

9-Band

Descreve o tipo de banda:

0 = Título

1 = Cabeçalho de página (Page Header)

2 = Cabeçalho de coluna (Column Header)

3 = Cabeçalho de grupo (Group Header)

4 = Detalhe (Detail)

5 = Rodapé de grupo (Group Footer)

6 = Rodapé da coluna (Column Footer)

7 = Rodapé de página (Page Footer)

8 = Resumo (Summary)

9 = Cabeçalho de detalhes (Detail Header)

10 = Rodapé de detalhes (Detail Footer)

NAME

2-Work area (2.x)

Nome do arquivo de tabela.

 

3-Index (2.x)

Nome de arquivo do arquivo IDX.

 

8-Field

A legenda em tempo de design (Design-time caption).

 

17-Picture

Se definido como Picture from File e um arquivo de figura for escolhido, esse campo estará vazio.

Se definido como Picture from File e for incluída uma expressão, esse campo conterá a expressão.

Se definido como Picture from Field, esse campo conterá o nome do campo geral.

 

18-Variables

Nome de variável.

 

21-Printer driver (2.x)

Nome da configuração.

 

25-Data Environment

"dataenvironment"

 

26-Data

"cursor" para cursores

"relation" para relações

"cursoradapter" para adaptadores de cursor (cursor adapters)

EXPR

1-Report Definition

Informações de configuração de impressora e de driver de impressora.

 

3-Index (2.x)

A expressão de ordem.

 

4-Relation (2.x)

A expressão de relação.

 

5-Label

O texto de um objeto Label.

 

8-Field

A expressão do objeto Field.

 

9-Band/Group Header

A expressão Data Group.

 

9-Band/Detail

A expressão Target alias.

 

18-Variables

A expressão Value to store.

 

25-Data Environment

26-Data

As propriedades do objeto Data Environment ou Data.

VPOS

1-Report Definition

Número de conjuntos de colunas (column sets).

 

10-Group

Esse número representa o primeiro objeto incluído neste grupo. Baseado na ordem Z (Z-Order) dos objetos de relatório. No entanto, os objetos agrupados podem pertencer a outros objetos agrupados. Quando isso ocorre, o grupo todo de objetos é contado apenas uma vez durante a determinação desse número.

 

23-Font

Altura do caractere em pixels, FONTMETRIC(1).

 

Objetos Report

A posição vertical do objeto, em FRUs.

 

1-Report Definition

Margem esquerda, em FRUs.

Relativa à margem que pode ser impressa se Printable page for escolhida.

Relativa à borda física do papel se Whole page for escolhida.

 

10-Group

Esse número representa o número total de objetos de relatório no grupo. No entanto, se os objetos agrupados forem incluídos em outro grupo, o grupo todo só será contado como um objeto.

 

23-Font

A largura média dos caracteres em pixels, FONTMETRIC(6).

 

Objetos Report

A posição horizontal do objeto, em FRUs.

HEIGHT

1-Report Definition

O espaçamento entre as colunas, em FRUs.

 

9-Band

A altura da banda, em FRUs.

 

23-Font

Caracteres crescentes em pixels, FONTMETRIC(2).

 

Objetos Report

Altura do objeto, em FRUs.

WIDTH

1-Report Definition

Largura de cada coluna, em FRUs.

 

9-Band/Detail

9-Band/Group Header

Corresponde ao valor Start group on new page when less than na caixa de diálogo Data Grouping ou Detail, em FRUs.

 

23-Font

Largura máxima de caracteres em pixels, FONTMETRIC(7).

 

Objetos Report

Largura do objeto, em FRUs.

STYLE

1-Report Definition

Se o relatório usar uma classe DataEnvironment ou tiver copiado um Data Environment de outro relatório, esse campo conterá os dados de XML do Data Environment.

 

2.x report objects

B = Bold (Negrito)

I = Italic (Itálico)

R = Raised (Elevado)

L = Lowered (Rebaixado)

J = Right-align (Alinhar à direita)

C = Center-align (Centralizar)

PICTURE

5-Label

Contém caracteres de formatação de alinhamento.

 

8-Field

Corresponde à expressão inserida na caixa de texto Format da caixa de diálogo Report Expression.

Se Interleave for selecionado, a expressão do formato receberá o prefixo @R.

 

17-Picture

Se definido como Picture from File e houver um arquivo escolhido, esse campo conterá o nome de caminho relativo do arquivo.

Se definido como Picture from File e for incluída uma expressão, esse campo estará vazio.

Se definido como Picture from Field, esse campo estará vazio.

ORDER

Todos - pré VFP 9.0

Não usado.

 

Todos - VFP 9.0

Contém um valor de caractere que representa um valor numérico (flags binários somados) para identificar recursos de proteção.

Objects (bit, value, meaning)

0, 1, Lock - Bloqueio (movido ou redimensionado)

1, 2, Hide - Ocultar (visible - visível)

2, 4, No Delete - Sem exclusão

3, 8, No Edit - Sem edição

6, 64, No Select - Sem seleção

Bands (bit, value, meaning)

4, 16, No Edit - Sem edição

14, 16384, No Resize - Sem redimensionamento

Report (bit, value, meaning)

7, 128, No Preview - Sem visualização

8, 256, No Optional Bands - Sem bandas opcionais

9, 512, No Data Grouping - Sem agrupamento de dados

10, 1024, No Variables - Sem variáveis

11, 2048, No Page Layout - Sem layout de página

12, 4096, No Multiple Select - Sem seleção múltipla

13, 8192, No Data Environment - Sem ambiente de dados

15, 32768, No Print - Sem impressão

16, 65536, No Quick Report - Sem relatório rápido

UNIQUE

1-Report Definition

.T. = Relatório temporário gerado pelo assistente

.F. = Relatório permanente

 

2-Work area (2.x)

.T. = Índice em uso nessa área de trabalho

.F. = Índice NÃO em uso nessa área de trabalho

 

18-Variable

Corresponde à caixa de seleção (check box) Release after report da caixa de diálogo Report Variables.

COMMENT

Todos

Corresponde à caixa de edição Comments.

ENVIRON

25-Data Environment

.T. = Sessão de dados privada

.F. = Sessão de dados padrão

BOXCHAR

Todos

Não usado.

FILLCHAR

8-Field

C para campos de caractere.

N para campos numéricos.

D para dados de dados.

TAG

1-Report Definition

Informações sobre o driver de impressora binário.

 

2-Work area (2.x)

Alias da área de trabalho.

 

9-Band

A expressão On Entry.

 

18-Variable

O valor inicial (Initial value).

 

25-Data Environment

26-Data

Contém código de método e evento.

TAG2

1-Report Definition

Informações sobre o driver de impressora binário.

 

9-Band

A expressão On Exit.

 

25-Data Environment

26-Data

Contém o código de método e evento compilado.

PENRED

23-Font

Caracteres decrescentes em pixels, FONTMETRIC(3).

 

Objetos Report

O valor Red do primeiro plano, como em RGB().

PENGREEN

23-Font

Caractere extra à esquerda em pixels, FONTMETRIC(5).

 

Objetos Report

O valor Green do primeiro plano, como em RGB().

PENBLUE

Objetos Report

O valor Blue do primeiro plano, como em RGB().

FILLRED

Objetos Report

O valor Red do plano de fundo, como em RGB().

FILLGREEN

Objetos Report

O valor Green do plano de fundo, como em RGB().

FILLBLUE

Objetos Report

O valor Blue do plano de fundo, como em RGB().

PENSIZE

6-Line

7-Shape

Tamanho da caneta (definido quando você seleciona Pen no menu Format e escolhe uma das canetas de linha sólida).

0 = Hairline (fio)

1 = 1 Point (1 ponto)

2 = 2 Point (2 pontos)

4 = 4 Point (4 pontos)

6 = 6 Point (6 pontos)

A espessura completa da linha não estará visível a não ser que HEIGHT ou WIDTH esteja definido como (PENSIZE x 104.167).

PENPAT

6-Line

7-Shape

Padrão da caneta (definido quando você seleciona Pen no menu Format e escolhe uma das canetas de linha não-sólida).

0 = None (Nenhum)

1 = Dotted (Pontilhado)

2 = Dashed (Tracejado)

3 = DashDot (Tracejado e ponto)

4 = DashDotDot (Tracejado, ponto, ponto)

8 = Normal/Solid (Normal/Sólido)

FILLPAT

7-Shape

Padrão de preenchimento (selecione Fill no menu Format).

0 = None (Nenhum)

1 = Solid (Sólido)

2 = Horizontal lines (Linhas horizontais)

3 = Vertical lines (Linhas verticais)

4 = Diagonal lines, leaning left (Linhas diagonais, inclinação para a esquerda)

5 = Diagonal lines, leaning right (Linhas diagonais, inclinação para a direita)

6 = Grid (horizontal and vertical lines) - Grade (linhas horizontais e verticais)

7 = Hatch (left and right diagonal lines) - Sombreamento (linhas diagonais esquerda e direita)

FONTFACE

1-Report Definition

O nome de fonte da fonte padrão (Default Font).

 

5-Label

8-Field

23-Font

O nome da fonte.

FONTSTYLE

1-Report Definition

5-Label

8-Field

23-Font

0 = Normal (Normal)

1 = Bold (Negrito)

2 = Italic (Itálico)

4 = Underlined (Sublinhado)

128 = Strikethrough (Tachado)

É possível combinar os números acima para obter vários estilos de fonte.

FONTSIZE

1-Report Definition

5-Label

8-Field

23-Font

O tamanho da fonte.

MODE

Objetos Report

Mode (Modo)

0 = Opaque (Opaco)

1 = Transparent (Transparente)

Reading Order (Ordem de leitura)

0 = Left-to-Right (Esquerda para a direita)

2 = Right-to-Left (Direita para a esquerda)

4 = Context (Contexto)

Os valores de Mode e Reading Order são adicionados juntos.

RULER

1-Report Definition

0 = No ruler (Sem régua)

1 = Ruler measurement is inches (Medida da régua é em polegadas)

2 = Ruler measurement is metric (Medida da régua é em metros)

3 = Ruler measurement is pixels (Medida da régua é em pixels)

4 = Ruler measurement is character (1/12") (Medida da régua é em caracteres (1/12"))

5 = Ruler respects current system default (Régua respeita o padrão de sistema atual)

RULERLINES

1-Report Definition

0 = Do not show the grid lines in the Report Designer (Não mostrar as linhas de grade no Report Designer)

1 = Mostrar as linhas de grade no Report Designer

 

8-Field

Corresponde à opção Trim mode for character expressions na caixa de diálogo Format.

0 = Default trimming (Aparo padrão)

1 = Trim to nearest character (Aparar em relação ao caractere mais próximo)

2 = Trim to nearest word (Aparar em relação à palavra mais próxima)

3 = Trim to nearest character, append ellipsis (Aparar em relação ao caractere mais próximo, acrescentar reticências)

5 = Show inner path as ellipsis (Mostrar caminho interno como reticências)

6 = Trim to nearest word, append ellipsis (Aparar em relação à palavra mais próxima, acrescentar reticências)

GRID

1-Report Definition

.T. = Snap to Grid is on (Recurso Ajustar à Grade ativado)

.F. = Snap to Grid is off (Recurso Ajustar à Grade desativado)

GRIDV

1-Report Definition

Vertical spacing of grid lines, in pixels (espaçamento vertical em linhas de grade, em pixels).

GRIDH

1-Report Definition

Horizontal spacing of grid lines, in pixels (espaçamento horizontal nas linhas de grade, em pixels).

FLOAT

Objetos Report

Corresponde à opção Float da caixa de diálogo Property do objeto.

STRETCH

6-Line

7-Shape

Corresponde à caixa de seleção (check box) Stretch relative to height of band da caixa de diálogo do Property do objeto.

 

8-Field

Corresponde à caixa de seleção the Stretch with overflow da caixa de diálogo Property do objeto.

STRETCHTOP

6-Line

7-Shape

Corresponde à caixa de seleção Stretch relative to tallest object in group da caixa de diálogo Property do objeto.

TOP

1-Report Definition

.T. = Área de impressão é Whole page

.F. = Área de impressão é Printable page

 

Objetos Report

Corresponde à opção Fix relative to top of band da caixa de diálogo Property do objeto.

BOTTOM

1-Report Definition

.T. = Imprime vários conjuntos de coluna na ordem da esquerda para a direita

.F. = Imprime vários conjuntos de coluna na ordem de cima para baixo

 

Objetos Report

Corresponde à opção Fix relative to bottom of band da caixa de diálogo Property do objeto.

SUPTYPE

Todos

Não usado.

SUPREST

Todos

Não usado.

NOREPEAT

Objetos Report

Corresponde à caixa de seleção Remove line if blank na caixa de diálogo Print when.

 

9-Bands/Detail

Corresponde à caixa de seleção Repeat detail header on each page da caixa de diálogo Detail.

RESETRPT

Todos

Não usado.

PAGEBREAK

9-Band/Title

A página de título é impressa em sua própria página.

 

9-Band/Group Header

Corresponde à caixa de seleção Start each group on a new page da caixa de diálogo Data Grouping.

 

9-Band/Group Footer

Corresponde ao registro de cabeçalho do grupo correspondente.

 

9-Band/Summary

A página de resumo é impressa em sua própria página.

 

9-Band/Detail Header

Corresponde à caixa de seleção Start on a new page da caixa de diálogo Detail.

 

9-Band/Detail Footer

Corresponde ao registro de cabeçalho de detalhes correspondente.

COLBREAK

9-Band/Group Header

Corresponde à caixa de seleção Start group on a new column da caixa de diálogo Data Grouping.

 

9-Band/Group Footer

Corresponde ao registro de cabeçalho do grupo correspondente.

 

9-Band/Detail Header

Corresponde à caixa de seleção Start on a new column da caixa de diálogo Detail.

 

9-Band/Detail Footer

Corresponde ao registro de cabeçalho de detalhes correspondente.

RESETPAGE

9-Band/Group Header

Corresponde à caixa de seleção Reset page number to 1 for each group da caixa de diálogo Data Grouping.

 

9-Band/Group Footer

Corresponde ao registro de cabeçalho do grupo correspondente.

 

9-Band/Detail Header

Corresponde à caixa de seleção Reset Page Number to 1 for each Detail Set da caixa de diálogo Detail.

 

9-Band/Detail Footer

Corresponde ao registro de cabeçalho de detalhes correspondente.

GENERAL

17-Pictures

Configuração Clip/Scale (Corte/Escala):

0 = Clip (Cortar)

1 = Scale retain shape (Escala mantém forma)

2 = Scale and fill frame (Escala e preenchimento de quadro)

SPACING

5-Label

0 = Single (Simples)

1 = 1.5

2 = Double (Duplo)

 

8-Field

Definido sempre como 0.

DOUBLE

17-Pictures

Corresponde à caixa de seleção Center picture da caixa de diálogo Property do objeto.

 

1-Report Definition

Objetos Report

.T. indica que FontCharSet se aplica a esse objeto (Veja RESOID)

SWAPHEADER

Todos

Não usado.

SWAPFOOTER

Todos

Não usado.

EJECTBEFOR

9-Band/Summary

Cabeçalho da página de impressão.

EJECTAFTER

9-Band/Summary

Rodapé da página de impressão.

PLAIN

1-Report Definition

Corresponde a opção Add non-selected alias only da caixa de diálogo Expression Builder Options (um valor de .T. terá precedência sobre o valor de ADDALIAS).

 

9-Band

.T. = Altura de banda Constante

SUMMARY

Todos

Não usado.

ADDALIAS

1-Report Definition

Corresponde ao grupo de opções Aliases na caixa de diálogo Expression Builder Options.

.T. Se a opção Always add alias option button estiver selecionada.

.F. Se a opção Never add alias option button estiver selecionada (um valor de.T. no campo PLAIN terá precedência sobre esse valor).

OFFSET

6-Line

Sempre 1.

 

7-Shape

O raio usado em objetos Rounded Rectangle (a caixa de diálogo padrão usa 12, 16, 24, 32 e 99).

 

8-Field

0 = Align left - Alinhar à esquerda

1 = Align right - Alinhar à direita

2 = Align center - Centralizar

 

17-Picture

Indica arquivo (File) ou campo geral (File):

0 = Filename - Nome de arquivo (armazenado no campo PICTURE)

1 = General field - Campo geral (armazenado no campo NAME)

2 = Expression - Expressão (armazenado no campo NAME)

TOPMARGIN

Todos

Não usado.

BOTMARGIN

Todos

Não usado.

TOTALTYPE

8-Field

18-Variable

Tipo de cálculo:

0 = Nothing - Nenhum

1 = Count - Contagem

2 = Sum - Soma

3 = Average - Média

4 = Lowest - Mais baixo

5 = Highest - Mais alto

6 = Standard deviation - Desvio padrão

7 = Variance - Variância

RESETTOTAL

Quando TOTALTYPE<>0

8-Field

18-Variable

Determina quando os cálculos são redefinidos:

1 = No fim do relatório

2 = No fim da página

3 = No fim da coluna

5+ = No fim do grupo de dados no qual se encontra o número do grupo de dados (por exemplo, 6 redefine o cálculo no Data Group 1, 7 redefine o cálculo no Data Group 2, e assim por diante).

79+ = No final dos conjuntos de bandas de detalhes nos quais se encontra o número da banda de detalhes (por exemplo, 80 redefine o cálculo em Detail Set 1, 81 redefine o cálculo em Detail Set 2, e assim por diante).

 

Quando TOTALTYPE=0

8-Field

Se houver uma banda de detalhe:

1 = Redefine na banda/grupo mais interno

Se houver bandas de vários detalhes:

1 = Redefine na banda de detalhes do objeto

 

Quando TOTALTYPE=0

18-Variable

1 = Redefine no final do relatório

RESOID

1-Report Definition

Objetos Report

Indica o FontCharSet que se aplica a esse objeto (ou o relatório geral).

CURPOS

1-Report Definition

.T. = Show position (Mostrar posição) está ativada (ON)

.F. = Show position está desativada (OFF)

SUPALWAYS

7-Shape

Corresponde ao grupo de opções Print repeated values na caixa de diálogo Print when, mas é sempre retroativo (observe que esse campo e o campo SUPVALCHG são definidos para formas).

.T. = Não

.F. = Sim

SUPOVFLOW

Objetos Report

Corresponde à caixa de seleção When detail overflows to new page/column da caixa de diálogo Print when.

SUPRCOL

Objetos Report

Corresponde à caixa de seleção In first whole band of new page/column da caixa de diálogo Print when (0 = desmarcado, 3 = marcado).

SUPGROUP

Objetos Report

Corresponde à caixa de combinação drop-down When this group changes.

O número é o número do grupo 5+ (por exemplo, um 6 é reimpresso em Data Group 1, um 7 é reimpresso em Data Group 2, e assim por diante).

SUPVALCHG

Objetos Report

Corresponde ao grupo de opções Print repeated values da caixa de diálogo Print when, mas é retroativo.

.T. = Não

.F. = Sim

SUPEXPR

Objetos Report

Corresponde à caixa de texto Print only when expression is true da caixa de diálogo Print when.

USER

Todos

Disponível para uso pelo desenvolvedor.

Bibliografia

Cathy Pountney é um Microsoft Visual FoxPro MVP e trabalha com desenvolvimento de software há 22 anos, treze dos quais como consultora independente especializada em FoxPro. Em 2001, teve o privilégio de trabalhar seis meses em Redmond com a equipe do Microsoft Fox. Atualmente, ela trabalha para a Optimal Solutions, desenvolvendo aplicativos VFP para escolas. Cathy já ministrou palestras em muitas conferências do FoxPro e para grupos de usuários de todos os Estados Unidos, escreveu artigos para diversas revistas e publicou um livro, The Visual FoxPro Report Writer: Pushing it to the Limit and Beyond (disponível em Hentzenwerke Publishing). Para entrar em contato com Cathy, escreva para cathy@frontier2000.com; para conhecer o website da autora, visite www.frontier2000.com; para conhecer o website da Optimal, visite www.optimalinternet.com.