2017年3月30日木曜日

テーブルで1行おきに背景色を設定する方法 [MicrosoftReport]

流し込むデータにレコード番号の項目を設定しておく。

デザイナーでテーブルの行を選択し、プロパティの式を選択。


式に↓

 =IIf((Fields!RecordNo.Value Mod 2) = 0, "Transparent","WhiteSmoke")

のようにレコード番号が2で割り切れる場合と割り切れない場合で背景色を変える。

Transparent:背景色なし


で出来るけど・・・

印刷するのにすごく時間がかかるようになってしまう。
なんで・・・式ってそんなに遅くなるの・・・

ページ数が多くなる帳票では2行毎に出力するしかないかなぁ・・・

2017年3月29日水曜日

縦結合したテーブルをグループ化する方法 [SQLServer]

SQLServerでテーブルを縦結合し、その結果をグループ化する方法。

-------------------------------------------------------------------------
SELECT TOKCD, YMD, SUM(KINGAKU) AS KINGAKU_T FROM
(
  SELECT TOKCD, YMD, KINGAKU FROM TOK_M
  UNION ALL
  SELECT TOKCD, YMD, KINGAKU FROM TOK_U
  UNION ALL
  SELECT TOKCD, YMD, KINGAKU FROM TOK_Z
) AS UNIONTABLE
GROUP BY TOKCD, YMD
-------------------------------------------------------------------------

最初、

')' 付近に不適切な構文があります。

とエラーが出たけど、AS [テーブル名] を付け忘れてた。

2017年3月23日木曜日

レポート機能でサーバー上にPDFを作成して開く [MicrosoftReport]

ReportViewerの印刷ボタンがIE以外だと出ない問題の解決策!

サーバー上にPDFを作って、それを別タブで開く。

-------------------------------------------------------------------------------------
using Microsoft.Reporting.WebForms;
~~~~~~~~~~~~~~~~~~~

//印刷データ
List<test> Datas = new List<test>();
~~印刷データの生成~~

LocalReport localReport = new LocalReport();

//デザインファイルの指定
localReport.ReportPath = @".\Report.rdlc";

//サブレポートがある場合は設定
localReport.SubreportProcessing += new SubreportProcessingEventHandler(SubreportProcessingEventHandler);

//データをセット
ReportDataSource reportDataSource = new ReportDataSource("DataSet_Design", Datas);

localReport.DataSources.Add(reportDataSource);

localReport.Refresh();

//PDFデータをバイト配列に格納
byte[] bytes = localReport.Render("PDF");

//tempフォルダにpdfを作成
string fileName = "Report" + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".pdf";

FileStream fs = new FileStream(@".\temp\" + fileName, FileMode.Create);

fs.Write(bytes, 0, bytes.Length);

fs.Close();

//pdfを別タブで開く
string url = @"\\temp\\" + fileName;

ClientScript.RegisterStartupScript(this.Page.GetType(), "OpenNewWindow",
    @"<script language=""javascript"">window.open('" + url + @"', 'TARGET');</script>");
-------------------------------------------------------------------------------------

ローカル環境にAcrobat ReaderなどのPDFを開く機能が必要になるけど、とても良い感じに。

これでASP.netもMicrosoftReportで十分。

2017年3月17日金曜日

'Tablix' に内部メンバーを含む詳細メンバーが含まれています。詳細メンバーには、静的な内部メンバーのみを含めることができます。 [MicrosoftReport]

MicrosoftReportで一覧の中に表を作成し、データを登録しビルドをしたら、

"tablix 'Tablix' に内部メンバーを含む詳細メンバーが含まれています。詳細メンバーには、静的な内部メンバーのみを含めることができます。"
とエラーが。

表はデフォルトでは行数がデータ数だけ表示されるようになっているので、一覧の中ではダメらしい。

データの行を右クリック→行グループ→グループの削除
でグループのみの削除


でグループを削除すれば1行しか表示しない静的なテーブルになってエラーは消えた。

2017年3月16日木曜日

ASP.netでデータソースにオブジェクトを設定できない [MicrosoftReport]

ASP.netでレポートの作成時に、オブジェクトをデータソースにしたいのに設定画面がデータベースへの接続しか出ない!

ASPだとオブジェクトをデータソースに出来ないの・・・

しょうがないので、クラスライブラリのプロジェクトを作って、ASPのプロジェクトから参照したら出来た。

 
なんで直接出来ないんだろ・・・。

2017年3月12日日曜日

Visual Studio 2017にレポート機能がない [MicrosoftReport]

Visual Studio 2017 Communityを入れてみたけどレポート機能がない!!

Visual Studio 2015で作った.rdlcファイル開いてもxml形式で開かれるだけ・・・
 コンパイルは出来るけど。

Visual Studio 2015でインストール時に
SQL Server Data Tools
を入れなきゃだったから2017でも入れてみたけどダメ・・・

SQL Server Data Toolsの最新バージョンを検索したら
まだVisual Studio 2015になってるから
https://msdn.microsoft.com/ja-jp/mt186501

2017はまだなのかなぁ・・・

早めに対応してくれると良いけど。


2017-08-03 追記
↓インストール方法発見!
https://yukamemo-ver3.blogspot.jp/2017/08/visualstudio2017-microsoftreport.html

2017年3月10日金曜日

ASP.netのレポートに独自クラスでデータをセット [MicrosoftReport]

レポートにデータを流し込むには、DataSetが一般的みたいだけど、
DeataSetだと文字列で指定しなきゃだから使い勝手が悪い・・・。
 
なのでクラスのListをデータに流し込む方法!

まずはオリジナルのクラスを作成。
----------------------------------------------------------
public class SampleDesign
{
    //Selectメソッドで流し込むデータを生成し返り値にする
    //引数は必要なものを必要なだけ定義する
    [DataObjectMethod(DataObjectMethodType.Select, true)]
    public List<SampleDesign> Select(int test)
    {
        List<SampleDesign> datas = new List<SampleDesign>();

        SampleDesign data;

        data = new SampleDesign();
        data.TestCD = 1;
        data.TestName = "表示名称";
        datas.Add(data);
       
        data = new SampleDesign();
        data.TestCD = 2;
        data.TestName = "表示名称2つ目";
        datas.Add(data);
        return datas;
    }

    //帳票の項目
    public int TestCD { get; set; }
    public string TestName { get; set; }
}
------------------------------------------------------

デザイン画面にReportViewerとScriptManagerとObjectDataSourceを配置する。
ビルドを行い、DataSourceのデータソースの定義で作ったクラスを選択する。



データメソッドの定義画面で、
SELECTタブのメソッドの選択で、クラス内に定義したSelectを選択する。



パラメーターの定義画面で、
Selectに必要なパラメーターの設定を行う。


パラメーターはObjectDataSource1.SelectParametersにセットすればSelectで受けられる。
--------------------------------------------------------------------
protected void Page_Load(object sender, EventArgs e)
{
    this.ObjectDataSource1.SelectParameters[0] =
           new Parameter("test", TypeCode.Int32, "4321");
}
--------------------------------------------------------------------

これでビルドして実行!!

2017年3月3日金曜日

DBテーブルのキーをUPDATE [GeneXus]

GenexusでDBテーブルのキーをUPDATEしたい場合、

------------------------------------------
For each TABLE

  Where KeyColumn = &test

  New

    KeyColumn = 値

  Endnew
 
  Delete

Endfor
------------------------------------------

これでキーチェンジ完了!!

Foreach内でNewを書くと、SELECTした内容をそのまま書いてくれるので、
全ての項目を入れ直す必要なし。

同じようにコピーしてINSERTしたい場合も、Foreach内のNewで変更したい
項目だけを入れなおせばできる。