在vfp报告中更改页面之前的打印行

时间:2012-04-20 09:04:08

标签: visual-foxpro

我正在vfp中创建报告。该报告包含分组。在每组的最后,我画一条线。细节带中的每一行不包含任何行,仅在每个组的末尾。问题是当组扩展到下一页时,在上一页中我想在底部绘制一条线。像这样:

(第1页)

A组

  

名称等

X1,等

X2等

???我如何在这里添加行?

(第2页)

A组

  

名称等

X3,等

X4,等


B组

  

名称等

Y1,等

Y2等


我试图将这一行放在页脚页带中,但报告的最后一行没有确切的位置,所以它看起来不太好。 希望我描述的情况足够清楚。感谢您抽出宝贵时间帮助我。

1 个答案:

答案 0 :(得分:1)

没有一些重要的烟雾诡计:运行报告两次,一旦隐藏并通过报告中的函数调用跟踪中断的位置,然后再次进行生产,它就不容易完成。

我唯一可以建议的是在每个页面打印的PAGE FOOTER顶部放置一行。你和VFP合作多久了?依赖,我可以指导你完成它。

好的,这是我要采取的步骤。这是假设您预先查询报告的结果并通过某种方式将它们排序到临时报告游标中。您需要在查询中添加2列作为占位符,并确保将光标设置为“INTO CURSOR READWRITE”,因为我们将从报告中写入此内容...这就是诀窍。

接下来,修改您的报告。转到细节带并在其底部放置一条线。如果您需要最后一个细节元素下的几个像素,请根据需要进行调整。双击该行并转到选项卡,在该选项卡中,您可以为该行添加“打印时间”条件。输入一个名为“ShowLine”的新列名称(但不带引号)。

现在,烟雾和镜子的“钩子”。在报表详细信息中创建另一个文本框字段输出。它可以小至2像素宽,从不实际打印任何东西。它可以放在报告细节的开头或结尾,无论如何,只要它在细节带中。双击它以显示它将打印的内容。在表达式中,输入以下内容... WhatPageAmIOn(_PageNo) 这实际上会调用我们将添加到您的程序中的函数,该函数会回写到您的报告游标......我接下来会打到它。

现在,代码。以下是我编写的代码片段,用于查询报告的数据,具有额外的列,并放入READWRITE游标。从那以后,我运行报告但是运行NOCONSOLE,因此它实际上并没有在视觉上做任何事情,只是在后台运行。然后它循环并查找每个页面之间的中断,并从中断后退1个记录和记录为“ShowLine”= .T的邮票...然后再次正常运行报告,并且您的一行显示在细节带,与数据组无关,但始终是每页末尾的最后一个数据行。

这是代码

* /查询您的数据,按任何顺序排序, * /但是要加上两个额外的字段并使其成为READWRITE

select;
      YourData,;
      AnotherField,;
      MoreData,;
      .f. as ShowLine,;
      00000 as WhatPage;
   FROM ;
      YourData;
   ORDER BY ;
      WhateverForYourReport
   INTO ;
      CURSOR C_RptData READWRITE

*/ Pre-run the report NOCONSOLE so your windows don't get messed up / scrolled      
REPORT FORM YourReport NOCONSOLE 

*/ now, go back to the cursor that your report ran with 
SELECT C_RptData
*/ set a variable for the first page you are looking to find a break for.
*/ in this case, the first detail that APPEARED on page 2.
lnLastPage = 2

*/ Start at top of the report cursor file and keep going until we reach
*/ the end of file where the LOCATE can no longer find "Pages".
GO TOP
DO WHILE NOT EOF()
   */ find the first record on ex: Page 2
   LOCATE FOR WhatPage = lnLastPage
   */ Did we find one?
   IF FOUND()
      */ Yes, go backwards 1 record
      SKIP -1
      */ This is the last detail that appeared on the page before it (ie: pg 1)
      */ Mark this line as ok to "ShowLine" the next time the report is run.
      replace ShowLine WITH .T.
      */ Now, advance the page counter to look for the NEXT page break...
      */ ex: between page 2&3,  3&4,  4&5,   etc...
      lnLastPage = lnLastPage +1
   ENDIF 
ENDDO

*/ Run your final version of the report
REPORT FORM YourReport Preview  (or print)

RETURN

以下是跟踪/更新与详细信息关联的页面的唯一钩子。我不知道你的项目中是否有一个主要的“SET PROCEDURE TO”文件,或者只有一堆免费的.PRG文件,或者即使你的报告是在PRG文件本身内完成的。但是,您只需要将此功能包含在任何这些位置中。对于最简单的测试,我只是将其创建为独立的.prg文件(如果您不使用SET PROCEDURE,或者在PRG文件中执行报告而不是在类方法/事件中执行)。

FUNCTION WhatPageAmIOn
LPARAMETERS lnPage
    replace whatPage WITH lnPage
RETURN ""

与原始描述一样,报告将基于函数“WhatPageamIOn”在详细信息区域中包含一个字段,并传递_PageNo的参数,该参数是跟踪当前报告页面的内部VFP变量。通常用于报表页眉/页脚。因此,随着每个细节的处理,我们无论页面是什么都“打印”细节数据。我们返回一个空字符串“”,因此实际上没有打印出任何内容,但我们已经连接了我们需要的内容。从这开始,循环在每个页面的开头找到第一条记录(从第2页开始),然后向后跳到前一页的最后一个条目,我们就完成了。

祝你好运。