2012-04-20 58 views
0

我在vfp中创建报告。该报告包含分组。在每组结束时,我画一条线。详细波段中的每一行都不包含任何行,仅限于每个组的结尾处。问题在于该组展开到下一页时,在上一页中我想在底部画一条线。就像这样:在vfp报告中更改页面之前的打印行

(第1页)

A组

姓名等

X1等

X2等

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

(第2页)

基团A

名称等

X3等

X4等


B组

姓名等

Y1等

Y2等


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

回答

1

没有一些显著烟雾和镜子挂羊头卖狗肉:运行报告两次,一次是隐藏的,跟踪这些休息是通过功能的报告呼吁,然后再进行生产,其不容易做到。

我可以建议的唯一的事情是把线在页面页脚它打印在每一页上的顶部。您与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页开始),然后向后跳到前一页的最后一个条目,我们就完成了。

祝你好运。

+0

非常感谢您的回复。我已经尝试了第二个建议,但问题有时是在它认为空间缩小之前到达页脚之前的组更改页面。所以有时候最后一个记录和页脚行之间有空格。我尽量避免第一个建议,因为在运行他的报告时会花费额外的时间。但是,如果没有其他办法,你可以提供一些线索如何做到这一点?我已经使用VFP超过几年了,但我不介意接受新的技巧:D – 2012-04-23 01:45:33

+0

非常感谢。您的帮助非常感谢,上帝保佑。 – 2012-04-23 04:51:21