いくつかの重要な煙と鏡のトリックがなければ: レポートを 2 回実行し、一度非表示にして、レポート内の関数呼び出しを介してブレークがどこにあるかを追跡します。
私が提案できる唯一のことは、すべてのページに印刷されるページ フッターの上部に行を配置することです。VFP を使用してどのくらいになりますか。場合によっては、ご案内できるかもしれません。
わかりました、ここに私がとるステップがあります。これは、レポートの結果を事前にクエリし、何らかの方法でそれらを一時的なレポート カーソルに並べ替えるという前提の下にあります。プレースホルダーとしてクエリに 2 つの列を追加する必要があります。また、カーソルを「 INTO CURSOR READWRITE 」として実行する必要があります。これは、レポート内からこれに書き込むためです。これがトリックです。
次に、レポートを修正します。詳細バンドに移動し、その下部に 1 行を追加します。最後の詳細要素の下に数ピクセルが必要な場合は、必要に応じて調整します。行をダブルクリックして、行の「いつ印刷するか」条件を設定できるタブに移動します。「ShowLine」という新しい列名の 1 つを入力します (ただし、引用符は使用しません)。
さて、煙と鏡の「フック」。レポートの詳細に別のテキスト ボックス フィールド出力を作成します。幅は 2 ピクセル程度で、実際には何も印刷されません。詳細バンドにある限り、レポート詳細の最初または最後に配置できます。それをダブルクリックして、印刷する内容を表示します。式に次のように入力します... WhatPageAmIOn( _PageNo ) これは実際にプログラムに追加する関数を呼び出し、レポート カーソルに書き戻します... 次にそれを押します。
さて、コードです。以下は、レポートのデータを照会し、追加の列を持ち、READWRITE カーソルに挿入するために作成したコードのサンプル スニペットです。それから、レポートを実行しますが、NOCONSOLE に対して実行するので、実際には視覚的に何もせず、バックグラウンドで実行するだけです。次に、循環して各ページ間の区切りを探し、区切りから 1 レコードさかのぼり、"ShowLine" = .T として記録されるスタンプを押します。その後、通常どおりレポートを再度実行すると、1 行が表示されます。詳細バンドはデータ グループに関係なく表示されますが、常に各ページの最後のデータ行になります。
これがコードです
*/ データを照会し、任意の順序で並べ替えます */ ただし、2 つの余分なフィールドを追加して 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」に基づいて詳細バンドにフィールドを含め、現在のレポート ページを追跡する内部 VFP 変数である _PageNo のパラメーターを渡します。レポートのヘッダー/フッター。したがって、各詳細が処理されるにつれて、ページが何であれ詳細データを「スタンプ」します。空の文字列 "" を返すため、実際には何も出力されませんが、必要なものはフックされています。これから、ループは各ページの最初 (2 ページ目から開始) で最初のレコードを見つけ、前のページの最後のエントリまで逆方向にスキップして完了です。
幸運を。