0

vfp でレポートを作成しています。レポートにはグループ化が含まれています。各グループの最後に線を引きます。詳細バンドの各行には行が含まれず、各グループの最後にのみ含まれます。問題は、グループが次のページに展開するときです。前のページで、一番下に線を引きたいのです。このような :

(ページ1)

グループA

名前など

x1など

x2など

???ここに行を追加するにはどうすればよいですか?

(ページ2)

グループA

名前など

x3など

x4など


グループB

名前など

y1など

y2など


ページ フッター バンドに行を配置しようとしましたが、レポートの最後の行に正確な位置がないため、見栄えがよくありません。状況を十分に明確に説明したことを願っています。私を助けてくれてありがとう。

4

1 に答える 1

1

いくつかの重要な煙と鏡のトリックがなければ: レポートを 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 ページ目から開始) で最初のレコードを見つけ、前のページの最後のエントリまで逆方向にスキップして完了です。

幸運を。

于 2012-04-20T12:54:29.957 に答える