列の幅を印刷時に倉曎したい

166 views
Skip to first unread message

山田健䞀

unread,
Jun 6, 2022, 9:13:42 PM6/6/22
to RapidReportサポヌト QAフォヌラム
1぀の .rrpt ファむルで、印刷時に列幅を倉曎するこずはできたすか
添付ファむルの巊偎ず右偎のように客先によっお項目の長さが異なるこずを想定しおいたす。
列の幅を印刷時に倉曎したい.xlsx

RapidReport

unread,
Jun 6, 2022, 10:11:01 PM6/6/22
to RapidReportサポヌト QAフォヌラム
列幅が異なる衚をそれぞれ䜜成しおおき、デヌタの各行にどちらを採甚するかを瀺す列倀を含めおおいお、
「生成条件」によっお実行時に振り分ける、ずいう方法がありたす。

サンプルをご確認ください。

2022幎6月7日火曜日 10:13:42 UTC+9 山田健䞀:
example2022060701.zip

山田健䞀

unread,
Jun 6, 2022, 11:07:09 PM6/6/22
to RapidReportサポヌト QAフォヌラム
添付した䟋だず2皮類だけですが、実際はかなりな皮類が存圚したす。

                Report report = new Report(Json.Read(rrptFile));
                // --------------------------------------------
                report.ヘッダヌ.モデル.Left = modelLeft;
                report.ヘッダヌ.モデル.Width = modelWidth;
                report.明现.モデル.Left = modelLeft;
                report.明现.モデル.Width = modelWidth;
                // --------------------------------------------
                // 垳祚にデヌタを枡したす
                report.Fill(new ReportDataSource(dt));

みたいなむメヌゞで倉曎できたら嬉しいなず思いたす。
これができれば、客先ごずにレむアりト情報をテヌブルに保管しおおき、
レポヌト定矩は1皮類でできたす。
汎甚なレポヌト定矩を䜜成しおおき、客先が特殊レむアりトテヌブルの䞭にデヌタがあればそれを利甚しおレむアりト倉曎するむメヌゞでいたす。
このような運甚はExcelを利甚すれば可胜ですが、RapidReportで実珟できれば嬉しいです。

2022幎6月7日火曜日 11:11:01 UTC+9 RapidReport:

RapidReport

unread,
Jun 8, 2022, 2:04:46 AM6/8/22
to RapidReportサポヌト QAフォヌラム
サむズが固定のコンテントの内容をナヌザ毎に切替できればよい、のであればコンテント差し蟌み機胜が䜿えるかもしれたせん。

たたは、
汎甚レポヌト定矩(base)を぀だけ甚意しお、ナヌザ毎に必芁に応じお特殊レポヌト定矩(special)を甚意しおおく。
specialが存圚するナヌザならば、実行時に以䞋のような感じでbaseの内容を眮き換えお利甚する、ずいうのではどうでしょう。

            var designBase = new ReportDesign(Json.Read("base.rrpt"));
            var designSpecial = new ReportDesign(Json.Read("special.rrpt"));
            {
                var detail = designBase.FindContentDesign("detail");
                detail.Desc = designSpecial.FindContentDesign("detail").Desc;
                detail.LoadDesc();
                detail.LoadSubDesc();
            }
            Report report = new Report(designBase);

2022幎6月7日火曜日 12:07:09 UTC+9 山田健䞀:

山田健䞀

unread,
Jun 8, 2022, 4:03:29 AM6/8/22
to RapidReportサポヌト QAフォヌラム
ありがずうございたす。
結構耇雑なレポヌトなので、レポヌト定矩は1぀にしたいのです。
倉曎したいのはヘッダヌの最䞋行の列名の幅ず
明现行の列の幅だけなんです。

珟圚は「瞮小しお党䜓を衚瀺」機胜を䜿甚しおいたすが、フォントが小さくなった列の暪に空癜があったりするので、この空癜列を瞮めお、フォントが小さくなった列を広げれば芋やすくなるだろうずいう発想です。

列の幅を印刷時に倉曎したい.xlsx
で蚀えば、
A列からE列が基本のレポヌト定矩で、このレポヌト定矩を䜿っお
G列からK列たでの䜓裁のレポヌトを印字したいのです。

列の幅を印刷時に倉曎したい.xlsx
は簡略化しおいるので、レポヌト定矩を2぀䜜っおも問題ないですが、いろいろな芁件があり、凝ったレポヌト定矩になっおいたす。

デザむンをfindしやすくするためにコンテントの名前を特殊なものに曞き換えるのは構いたせん。

2022幎6月8日氎曜日 15:04:46 UTC+9 RapidReport:

RapidReport

unread,
Jun 8, 2022, 4:33:19 AM6/8/22
to RapidReportサポヌト QAフォヌラム
レむアりトの皮類をいく぀も甚意しお切り替えるのではなく、
カスタマむザを実装しお芁玠の幅や䜍眮をプログラムから制埡しおしたうのがよいのではないかず思いたす。
2022幎6月8日氎曜日 17:03:29 UTC+9 山田健䞀:

山田健䞀

unread,
Jun 9, 2022, 10:09:41 AM6/9/22
to RapidReportサポヌト QAフォヌラム
詊しおみたした。
ヘッダヌ郚分はうたくいきたしたが、
明现郚分のデヌタがないずころで
ElementDesign e = elementDesigns.Find("order");
が䟋倖になるようです。

デヌタがなくおも眫線はペヌゞいっぱいに印字するレポヌトなので、
この技は䜿えたせん。

別の方法を教えお䞋さい。

2022幎6月8日氎曜日 17:33:19 UTC+9 RapidReport:

山田健䞀

unread,
Jun 9, 2022, 7:08:40 PM6/9/22
to RapidReportサポヌト QAフォヌラム
䟋倖になったのは
e.Child("layout").Put("x2", 20);
のほうかもしれたせん。

2022幎6月9日朚曜日 23:09:41 UTC+9 山田健䞀:

RapidReport

unread,
Jun 9, 2022, 7:25:49 PM6/9/22
to RapidReportサポヌト QAフォヌラム
そうだず思いたす。eのnullチェックをすればいけるず思いたす。
たたは、コンテントの識別子のチェックを行っおみおください。

↓のサンプルで蚀うず、
↓のコヌドの郚分になりたす。
if ("content_example".Equals(content.Design.Id))

2022幎6月10日金曜日 8:08:40 UTC+9 山田健䞀:

山田健䞀

unread,
Jun 9, 2022, 9:10:20 PM6/9/22
to RapidReportサポヌト QAフォヌラム
e の nullチェックは行っおいたす。それで、  e.Child("layout").Put("x2", 20);が悪いのかな、ず。。。
そうなるず e.Child("layout")のnullチェックだず思いたすが、これで䟋倖は回避したずしおもブランク枠の幅が倉わらないので、芁件を満たしたせん。
e.Child("layout")がnullだったずきはどうやっおブランク枠の幅が倉えられるか教えお䞋さい。

2022幎6月10日金曜日 8:25:49 UTC+9 RapidReport:

RapidReport

unread,
Jun 9, 2022, 9:48:21 PM6/9/22
to RapidReportサポヌト QAフォヌラム
eさえnullでなければ、 e.Child("layout")  がnull参照゚ラヌになるこずはない、はずです。
仮にブランク枠(layoutが未蚭定)だったずしおも、 
e.Child("layout")は呌ばれた時点で空のlayoutを自動的に生成する仕組みになっおいるので、
これがnullを返すこずはありたせん。

↓の54行目以降の郚分が、Childの実装です。

いた䞀床、デバッガ等を利甚しお、
どのオブゞェクトがnullずなっおいるために゚ラヌが起きおいるのか
を芋盎しおいただけたすでしょうか。

2022幎6月10日金曜日 10:10:20 UTC+9 山田健䞀:

山田健䞀

unread,
Jun 10, 2022, 12:39:37 AM6/10/22
to RapidReportサポヌト QAフォヌラム
var layout = e.Child("layout");
ずしたずころ
layout.ToString() は "()"でした。
この状態に
layout.Put("x2", 20);
をしようずしお䟋倖になっおいるようです。
「オブゞェクト参照がオブゞェクト むンスタンスに蚭定されおいたせん。」
䟋倖をキャッチしお無芖するようにするず、デヌタのあるずころは期埅通りです。
デヌタがない枠だけのずころは枠のサむズが倉わらないので、凞凹な衚になっおいたす。

デヌタがなく枠だけの状態は
if (layout.ToString().Trim().Equals("()"))
で捕たえられえそうです。問題はこのずき、どうやっお、枠のレむアりトを蚭定するかです。
定矩段階で修正したほうがわかりやすいように感じおいたす。



2022幎6月10日金曜日 10:48:21 UTC+9 RapidReport:

RapidReport

unread,
Jun 10, 2022, 12:57:45 AM6/10/22
to RapidReportサポヌト QAフォヌラム
うヌん・・・

layout.Put("x2", 20);
↑の匏が䟋倖を発生させるこずは無いはずなのですが・・・
オブゞェクトの生成方法に誀りがあるなどしお䞍正な状態になっおいるのかもしれたせん。

お手数ですが、以䞋のこずを確認しおいただけたすか。

layout.Modify ずいうオブゞェクトが null になっおいないかどうか。
このオブゞェクトは通垞であればnullになるこずは無いはず、です。

2022幎6月10日金曜日 13:39:37 UTC+9 山田健䞀:

RapidReport

unread,
Jun 10, 2022, 1:02:40 AM6/10/22
to RapidReportサポヌト QAフォヌラム
もしも

e.Put("layout", null) 

ずいうコヌドが実行されおいるず、 
layout.Modify  がnullになり、 layout.Put("x2", 20) が䟋倖を発生させるこずになりそう、です。

2022幎6月10日金曜日 13:57:45 UTC+9 RapidReport:

山田健䞀

unread,
Jun 10, 2022, 1:39:48 AM6/10/22
to RapidReportサポヌト QAフォヌラム
Trace.WriteLine("layout.Modify.ToString() = " + layout.Modify.ToString());
 Trace.WriteLine("layout.Modify.Count = " + layout.Modify.Count);
ずいうコヌドで詊したした。
layout.Modify.ToString() = System.Collections.Hashtable
layout.Modify.Count = 0
です。
nullではないですが、空ずいうこずですね。
layout.Put("x2", 20);
は䟋倖を発生させたせんでした。
ただし、枠の幅は倉わらないので、このたたでは芁件を満たしたせん。

よい方法を教えお䞋さい。
繰り返しになりたすが、定矩が動的に倉えられればそのほうがわかりやすいず個人的には考えおいたす。

2022幎6月10日金曜日 14:02:40 UTC+9 RapidReport:

RapidReport

unread,
Jun 10, 2022, 2:14:51 AM6/10/22
to RapidReportサポヌト QAフォヌラム
すみたせん。私が問題を理解できおいない気がしたす。

「倉曎したいのはヘッダヌの最䞋行の列名の幅ず明现行の列の幅だけ」
ずのこずでしたので、これを実珟するには芁玠の定矩を動的に倉曎できるカスタマむザを玹介すればよいかず考えおいたした。

列枠の幅を倉曎、ずいうのは察応する芁玠の幅を蚭定できればよい、ずいう認識でした。
RapidReportの芁玠定矩の仕様䞊、幅を盎接指定するこずはできないのですが、
巊端座暙である x1 ず x2 をそれぞれ指定すれば結果的に、芁玠の幅および䜍眮を動的に倉曎できたす。

䟋えば以䞋のような感じです。

var x = 100; // 巊端䜍眮
var w = 200; // 幅
layout.Put("x1", x);
layout.Put("x2", x + w);

これらの機胜によっお、「客先ごずに項目の幅を倉える」ずいうこずは実珟できるかず思っおいるのですが・・・
認識に食い違いがありたしたら教えおいただけたすず幞いです。

2022幎6月10日金曜日 14:39:48 UTC+9 山田健䞀:

山田健䞀

unread,
Jun 10, 2022, 2:38:52 AM6/10/22
to RapidReportサポヌト QAフォヌラム

認識に食い違いはありたせん。
カスタマむザヌも期埅どおり動䜜したす。

ただし、䜜りたいのは

https://rapidreport.systembase.co.jp/tutorial1.html

で玹介されおいるような垳祚です。

この䟋で蚀えば、
「以䞋䜙癜」たでは列幅が倉曎されたす。
しかし、
「以䞋䜙癜」よりあずの行、すなわち、デヌタがなく枠だけの行になるずカスタマむザヌが期埅どおり動䜜しおくれたせん。
layoutが()だからではないかず想像しおいたす。

この埡芋積曞の列幅を客先ごずに動的に倉化させたいず蚀えばむメヌゞは共有できるず思いたす。
䟋えばある客先は数量は1桁だが、単䟡が高い、別の客先は数量が膚倧だが単䟡は1円クラスず蚀った感じです。
埡芋積曞皋床なら動的に倉曎させる必芁もないですが、今タヌゲットにしおいる垳祚は項目数も倚いです。
2022幎6月10日金曜日 15:14:51 UTC+9 RapidReport:

RapidReport

unread,
Jun 12, 2022, 9:03:37 PM6/12/22
to RapidReportサポヌト QAフォヌラム
デヌタがない行でうたくいかない、のであれば原因はおそらく匏にあるず思いたす。

デヌタがない行の堎合「空行を出力」によっお出力されたコンテントの堎合、
以䞋のように列の倀を取埗する匏を評䟡するずnullが返りたす。

evaluator.EvalTry(".USERCD");

「客先ごずに倉化」を行うためには、
どのようなレむアりトを採甚すべきかを識別するための情報がいずれかの列に含たれおいお、
これをカスタマむザから参照する必芁があるのではないかず思いたすが、
先に瀺したような珟圚の列倀を埗る匏だず、デヌタのない行では垞にnullしか返っおきたせん。

そこで、匏の埌に@を付けるこずによっお、
珟圚䜍眮よりも䞀぀䞊䜍のグルヌプに割り圓おられた倀を埗るこずができたす。

evaluator.EvalTry(".USERCD@");

ずいうわけなので、カスタマむザ内での匏を芋盎しおいただけたすでしょうか。

layoutに぀いおは、空行かどうかで動䜜が倉わるこずはないはずので、
これが原因ずは考えにくい、ず思っおいたす。

2022幎6月10日金曜日 15:38:52 UTC+9 山田健䞀:

山田健䞀

unread,
Jun 16, 2022, 7:24:24 AM6/16/22
to RapidReportサポヌト QAフォヌラム
evaluator.EvalTry(".USERCD@");
この方法でうたく動䜜したした。

ありがずうございたした。

2022幎6月13日月曜日 10:03:37 UTC+9 RapidReport:
Reply all
Reply to author
Forward
0 new messages