- PR -

CrystalReport クリスタルレポート ページごとの小計を追加したい。

投稿者投稿内容
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2006-02-07 10:56
こんにちは。

伝票明細一覧表のような物を作成しようと思っています。
伝票ごとに合計金額を出力することはできるのですが、1枚の伝票の行数は
固定しておらず、1枚の伝票が何枚にもまたがることがあります。

伝票番号:1
------------------
いちご 100円
りんご 200円
みかん 300円
------------------
合計  600円



伝票番号:1-1
------------------
いちご 100円
りんご 200円
------------------
小計  300円

改ページ(行が一杯になったら、もしくは明示的にN行印刷したら)

伝票番号:1-2
------------------
みかん 300円
------------------
小計  300円
==================
総合計 600円

こんな感じです。
伝票番号でグループ化すると伝票の合計しか求めることができません。
何か良い方法はないでしょうか?よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-07 12:41
引用:

jsさんの書き込み (2006-02-07 10:56) より:

伝票明細一覧表のような物を作成しようと思っています。
伝票ごとに合計金額を出力することはできるのですが、1枚の伝票の行数は
固定しておらず、1枚の伝票が何枚にもまたがることがあります。
(snip)
伝票番号でグループ化すると伝票の合計しか求めることができません。


ページ単位での小計、明示的にグループが終了した時のそのページ内での小計ですね?
ならば、以下のようになります。
  1. ページ ヘッダに式フィールドを置いて Shared な変数を宣言し、ここで 0 に初期化
  2. この変数を出力する式フィールドをページ フッタとグループ フッタに追加
  3. グループ フッタでこの変数を 0 に初期化する式フィールドを配置
  4. グループ フッタで出力されてしまった場合は改ページがあるので、フラグを設ける
  5. このフラグが建っている場合は、ページ フッタでは出力しないように式を加える
こんな感じでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2006-02-07 14:20
>ページ単位での小計、明示的にグループが終了した時のそのページ内での小計ですね?

はい、その通りです。

お返事ありがとうございます。
ただ、クリスタルレポートの変数の宣言、スコープの方法がイマイチよくわかりません。
その関数内で行うならできますが、どうやって参照したり、どうやって加算していくのか
サンプルも見つからないし。。

*BASIC構文です。
>ページ ヘッダに式フィールドを置いて Shared な変数を宣言し、ここで 0 に初期化

これは例えばfunctionSharedとしてこんな感じなんでしょうか?

Shared NumPageSum As Number
Formula = NumPageSum

>この変数を出力する式フィールドをページ フッタとグループ フッタに追加
これはfunctionSharedを貼り付けるだけでよいでしょうか?

>グループ フッタでこの変数を 0 に初期化する式フィールドを配置
これは例えばfunction初期化として内容は
Formula = {@functionNumPageSum} = 0

こんな感じになるんでしょうか?
ですが加算は一体どうやって行うんでしょうか?

{@functionNumPageSum} = {tblden.kingaku};
てやってもその行の金額しか取る事ができません。

>グループ フッタで出力されてしまった場合は改ページがあるので、フラグを設ける
>このフラグが建っている場合は、ページ フッタでは出力しないように式を加えるこんな感じでしょう。

すみません、これに関しては皆目見当もつきません。

結論として全く基礎を理解していないということだろうと思います。
何でも聞いてばかりでは駄目だと思いますので
何かクリスタルレポートの関数を駆使したようなサンプルでもご存知ないでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-07 15:00
引用:

jsさんの書き込み (2006-02-07 14:20) より:

Shared NumPageSum As Number
Formula = NumPageSum


0 に初期化だけでいいです。

引用:

これはfunctionSharedを貼り付けるだけでよいでしょうか?


今回の例だと NumPageSum ですね。

引用:

これは例えばfunction初期化として内容は
Formula = {@functionNumPageSum} = 0


Formula はどこから現れたんですか?
NumPageSum = 0 でいいじゃないですか。

引用:

ですが加算は一体どうやって行うんでしょうか?


敢えて書きませんでしたが、加算されていないことには気付かれたのですね。
詳細セクションが繰り返される分、任意のフィールドを加算していく場所を設けるだけですよね。

引用:

{@functionNumPageSum} = {tblden.kingaku};
てやってもその行の金額しか取る事ができません。


それは、加算していないからですよね?
A = B は明らかに加算ではないですよね?

NumPageSum = NumPageSum + {tblden.kingaku};

だろうと思います。

引用:

すみません、これに関しては皆目見当もつきません。


これは後回しにしましょうか。
実装次第で不要かもしれませんからね。

引用:

何でも聞いてばかりでは駄目だと思いますので
何かクリスタルレポートの関数を駆使したようなサンプルでもご存知ないでしょうか?


この会議室で Shared CrystalReports などで AND 検索してみると少しは...
でもコードのサンプルはないような気がしますね。(私が答えた範囲では)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2006-02-07 15:50
じゃんぬ様、度々申し訳ありません。Global宣言した変数の参照がイマイチわかりません。

ます、変数の作成方法ですが

「フィールドエクスプローラ」→「式フィールド」→「新規..」で 例えば [式A] を作り

その中に

Global NumPageSum As Number
NumPageSum = 0
Formula = NumPageSum

Global宣言のNumPageSumを用意しました。
Formula付けないとエラーになってしまいます。

えと、Crystal構文なら
Global numberVar NumPageSum :=0

でエラーにはならないのですが・・・。

で分からないのは、この「NumPageSum」が他の式フィールドからどうやって参照すればよいか?という点です。

先ほど、助言頂きました通り、詳細セクションに

NumPageSum = NumPageSum + {tblden.kingaku}

という内容の[式B]を書き確認ボタン(Alt+C)を押すと

Basic構文では「ここにはステートメントが入ります」
Crystal構文では「残りのテキストは式の一部にはなりません」

と出てしまいます。
また{@functionShared.NumPageSum}と参照すれば「フィールド名が見つかりません」
と出てしまいます。

何か根本的に勘違いしてると思うんです・・・(>_<)。

変数の宣言は式フィールドを作成しその中に記述する、という方法でよいのでしょうか?

その式内で使う変数を宣言、というのは以前やってみた事があるのですが別の式から参照というのがよく分からない状態です。そもそも別の式から参照するという考え方がおかしいのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-07 16:02
引用:

jsさんの書き込み (2006-02-07 15:50) より:

Global宣言のNumPageSumを用意しました。
Formula付けないとエラーになってしまいます。


あ、BASIC 構文なんですね。

引用:

で分からないのは、この「NumPageSum」が他の式フィールドからどうやって参照すればよいか?という点です。


Global, Shared な変数は普通に NumPageSum で参照できるはずですよ。
最初に書かれたのは宣言込みですが、その他の式フィールド内では宣言なしでそのまま使えます。

引用:

NumPageSum = NumPageSum + {tblden.kingaku}
Basic構文では「ここにはステートメントが入ります」
Crystal構文では「残りのテキストは式の一部にはなりません」


長さ 0 の文字列 ("") でも出力させておいてください。
Crystal 構文だと ""; だったかな?

すいません、私は BASIC 構文ではなく Crystal 構文派なんです。(^-^;)

引用:

また{@functionShared.NumPageSum}と参照すれば「フィールド名が見つかりません」
と出てしまいます。


これは、ただの誤りですよね。

引用:

変数の宣言は式フィールドを作成しその中に記述する、という方法でよいのでしょうか?


宣言は最初のヘッダだけで、後は自由に使えるハズです。
聞くのを忘れていましたが、CrystalReports のバージョンはいくつですか?

引用:

その式内で使う変数を宣言、というのは以前やってみた事があるのですが別の式から参照というのがよく分からない状態です。
そもそも別の式から参照するという考え方がおかしいのでしょうか?


別の式からではなく、Report 内で文字通り「Global」なんです。
でなければ、Global 修飾子の意味がおかしくなりませんか? (^-^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-07 16:13
CrystalReports のバージョンによっては、やっぱり宣言は要りますね。
ただし初期化はしない、という感じだったと思います。

それと、1 番大事なことを言い忘れていました。
詳細セクションでカウントアップするところの直前に、
WhilePrintingRecords; を入れておいてください。

構成としては、(Crystal 構文ですが)

ページ ヘッダ :
 Shared NumberVar NumPageSum := 0;
 "";

詳細セクション :
 Shared NumberVar NumPageSum;
 WhilePrintingRecords;
 NumPageSum := NumPageSum + {足し込みたいフィールド};
 "";

ページ フッタ (出力) :
 Shared NumberVar NumPageSum;
 CStr(NumPageSum);

こんな感じだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
js
常連さん
会議室デビュー日: 2004/09/14
投稿数: 47
投稿日時: 2006-02-07 16:34
じゃんぬ様、できました!(>_<)ゝ

って最後には答え書いて頂いたんで当然ですね。

クリスタルレポートは VS2003に付属している物で CrystalReport for VisualStidio.NET
という製品で、クリスタルレポートのバージョンで言うと
CrystalReports8.5 Developer Editionというのに相当するそうです。

じゃんぬ様は、お気づきでないでしょうが、もうかれこれ数回助けて頂いてます。
Global変数とい技が増えたので、今後幅が広がると思います。どうも有難うございました。

スキルアップ/キャリアアップ(JOB@IT)