最近はハードウェア開発の仕事ばかりしていましたが、ソフトウェアもそろそろイジリたくなってきました。

そこで従来から「どうにかならないかなあ~?」と考えておりました、
「非該当判定書の自動作成」に挑戦してみることにしました。

結論から言いますと、うまく完成しました!

会社名と商品名を入力すれば、自動的で
非該当判定書をPDFで作成します!!


非該当判定書入力フォーム画面

株式会社アコン 非該当判定書入力フォーム

※とりあえずスイッチング電源とACアダプタのみ対象

非該当判定書とは簡単に言えば、お客様が弊社の製品を購入してそれを「海外に」輸出する時に、「この製品は軍事に転用など、危ない、超機密なものに該当していませんよ~」と宣言するものです。

結構依頼されることが多く、今まではスタッフが手作業で作っていましたので依頼数が増えると効率が下がってしまうな~と感じていました。

ちょっと時間ができたのでTRYしてみることにしました。

開発のポイントとしては
1)社内のデータベースにアクセスし、商品型式一覧を取得する
2)WEBサーバーは自前で置かず、マイクロソフトやアマゾンのWEBサービスを利用する
3)商品名は一部だけ入力すれば検索できるようにした
4)PDFで自動作成


といったところです。
結果、予想通りそこそこドツボにはまってしまいました。。

15年前?ぐらいにASPを仕事(半分趣味)でやってましたが、今も独特の進化?で生き残っていたらしくサーバーサイドで最近は『ASP.NET Core』となってまだまだ発展していっているようです。

ASP ⇒ ASP.NET ⇒ ASP.NET Core(今ここ)

昔はサーバーサイド、クライアントサイドなどが明確に意識しないといけなく、Javaサーブレットとかもありましたねえ・・懐かしい。

それでは苦労して4日も悪戦苦闘した、開発のポイントをご紹介したいと思います。
言語は大好きなC#とし、ASP.NET CoreのMVC(ビュー、モデル、コントローラー)で進めました。

1)社内のデータベースにアクセスし、商品型式一覧を取得する

社内システムでOracleデータベースを採用して運用しているので、まずはこのデータベースにASP.NET Coreでアクセスしないといけません。

まずはASP.NET Coreのお勉強からでした。

ASP.NET Coreの開発形態としてMVCとRazer(ラザー)の2択があるようですが、ラムダ式をよく理解できていない私にとってはMVCがとっつき安かったです。

appsettings.jsonファイルに、社内サーバーとアクセスするためのオラクル接続文字列を追加しました。

  "AllowedHosts": "*",
  "ConnectionStrings": {
    "OracleConnecttext": "server=XXX.XXX.XXX.XXX;port=<PORT番号>;database=<データベース名>;userid=<UserID>;password=<Password>"
  }
}


次にOracle接続のためのミドルウェアはデフォルトで入っていなかったので、NeGet経由で

Oracle.ManagedDataAccess.Core
Oracle.EntityFrameworkCore

をインストールしました。

Startup.csのConfigureServices関数内でUseOracleメソッドでサービスに追加

var ora_conn = services.AddDbContext<OracleConnecttext>(options =>
                   options.UseOracle(Configuration.GetConnectionString("OracleConnecttext")));

あとはADO.NET感覚で、SQL発行、レコードセットの取得でうまく社内サーバーから商品マスタのデータを引っ張ってこれました(ここまで2日かかる・・)。


2)WEBサーバーは自前で置かず、マイクロソフトやアマゾンのWEBサービスを利用する

これは最近のトレンドですね。以前は自前でサーバーを用意してたりしていましたが、やはり保守が面倒だったり、セキュリティの懸念や、ネットワーク系のSEが必要だったりで今は自前はやめて、大手のWEBサービスを利用することが増えていると思います。

そこでVisualStudioで開発していることもあり、マイクロソフトのAzureサービスに登録してみました。
最初は無料で、そのあとはデータに合わせて従量課金のようですが、それほど高くはなさそうだったのでとりあえず運用してみることにします。

クレジットカードが必須?のようでした。


3)商品名は一部だけ入力すれば検索できるようにした

これが正直一番はまりました。。

型式を1文字入力するたびに処理を行う必要があるので、テキストボックスの入力イベントを拾う必要があります。

結局はHTMLのoninputイベントを利用したのですが

<input asp-for="@modelDT" oninput="aaa(this);" class="form-control" />

この後に、JavaSprictでこの入力値を受けて元ページにReDirectしないといけず、Sessionなどが使えないので、結局URLに埋め込む形でデータの受け渡しを実装しました。

https://...../Higaito/(会社名)/(型式)

こんな感じです。

最初は1文字ごとにSQLを発行して、データベースサーバーとアクセスする処理にしていて意外と処理も速いので問題なかったのですが、やはりそこは妥協せず?より処理が速くなるように、最初のみデータアクセスしてListに格納して、その後はContainsメソッドで比較、取得として高速化しました。


4)PDFで自動作成

PDFファイルのソフトからの作成はWindowsFormでは経験ありますが、WEBベースでは初めてだったので色々調べてみたのですが、CreatePDF?(Rotativa)が使いやすそうだったのでこれを利用しました。

これもNeGet経由でRotativaミドルウェアをインストール

Rotativa.AspNetCore

を選択。

WWWROOT上に「Rotativa」フォルダを作成してネットから以下2個のファイルを保存。

・wkhtmltoimage.exe
・wkhtmltopdf.exe


StartUp.csのConfigure内で

RotativaConfiguration.Setup(env.ContentRootPath, "wwwroot/Rotativa");

を追加。

これで後はActionイベント内で

 return new Rotativa.AspNetCore.ViewAsPdf("ページ名", ViewData);

と返せば、HTMLページをADF化できます。
ViewDataも引数に入れないと、ページ上の変数が更新してくれませんので注意(少しはまった・・)。



以上です。

恐らくコアなソフトエンジニア以外まったくチンプンカンプンと思いますが、今後社内で誰かこのシステムを拡張していく人が現れた時のために記しておきます。。

いつか来るのか?そんな日が・・(遠い目)