0

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

(第 1 页)

A组

姓名等

x1等

x2等

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

(第2页)

A组

姓名等

x3等

x4等


B组

姓名等

y1等

y2等


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

4

1 回答 1

1

没有一些重要的烟雾和镜子技巧:运行报告两次,一次隐藏并通过报告中的函数调用跟踪中断的位置,然后再次用于生产,这并不容易完成。

我唯一能建议的就是在每页打印的页脚顶部放置一行。您使用 VFP 有多久了。视情况而定,我可能能够指导您完成它。

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

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

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

现在,代码。以下是我编写的代码示例片段,用于查询报告的数据、拥有额外的列并放入 READWRITE 游标。从那以后,我运行报告,但运行到 NOCONSOLE,所以它实际上并没有在视觉上做任何事情,只是在后台运行。然后它循环遍历并查找每页之间的中断并从中断处向后退 1 条记录并标记记录为“ShowLine”= .T... 然后正常再次运行报告,您的一行出现在detail band 与数据组无关,但始终是每页末尾的最后一个数据行。

这是代码

*/ 查询您的数据,按任何顺序排序,*/ 但添加两个额外字段并将其设为 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 页开始)找到第一条记录,然后向后跳到前一页的最后一个条目,我们就完成了。

祝你好运。

于 2012-04-20T12:54:29.957 回答