Nintex で申請書の自動採番を考えてみる

皆様こんにちは、インフォシェアの小高です。

Nintexの連載記事Season2です。

今回は申請書における自動採番について考えてみたいと思います。
これって、どのお客様とお話しても十中八九この話題になります。それほどメジャーな要件にも関わらず、実装は結構大変なんですよね。

連載記事(Season2)の目次はこちらから。
連載記事(Season1)の目次はこちらからになります。

———————

初めに書いてしまうと、Nintexだろうが、ShaerPointだろうが、自動採番の機能はありません。(Notesもですね。)ですから必要な場合は実装しなければなりません。

自動採番におけるごくごく基本的な要件2つとしては
1)申請ごとにユニークな番号を採番したい
2)申請ごとになんらかの連番を採番したい
となるでしょう。もちろんこれ以外にも色々な機能要件があります。

1)だけだったら、それこそGUIDでもいいのですが、2)の要件を達成するためには、次に採番される番号をなんらか決める必要があります。例えば、SharePointで実現するならば、番号管理リスト的な物を用意して、次に採番する番号が確定できるようにする感じですね。あるいは申請書が1つなら、申請書リストに申請番号列を用意して、そこを確認しながら、次の番号を付与するとしてもいいと思います。

ここで問題となるのは、1)の要件の方です。
と言うのも、上記の番号管理リストへの処理はもう少しちゃんと書くと

1.次に採番される番号を取得
2.採番された番号を申請書側に更新
3.次に採番される番号を更新

と言った処理に分けることが出来ます。もちろんこの通りでなく、1と3、あるいは2と3の処理は順番を逆にしてもよいでしょうし、3がないパターンもあるでしょう。ただ内容はあまり重要でなくて、問題は取得してから更新をおこなうと言った処理が分離する点です。

このような場合、Aさんの自動採番処理の最中に、Bさんの自動採番処理が割り込んでくる可能性が否定できないのです。

図2_thumb.png
(番号管理リストが5番を採番する場合の例)

この原因はSharePointのリストでは、いわゆるデータベースのトランザクション処理(ロックが必要ですね)の実現が出来ないためです。

さらに言うと、自動採番をいつどこで行うかでも考え方が変わってきます。例えば、申請書の承認後に採番するのであれば、ワークフローの中で実装する必要があります。その場合、仮に上記のロック的な動きが実現できたとしても、ワークフローはロック系のエラーになるでしょう。

こうした事情から、なにも対策しなければ、重複した番号が採番される可能性がありますし、ロックの仕組みの実現があっても(例えば、番号管理をSQL Serverで行う等)、実行するとワークフローエラーになるかもしれません。

ワークフローは、さまざまな要因でエラーになることがあります。
SharePointが正しく動いていない場合もそうですし、ネットワーク障害もそうでしょう。そんな時、ワークフローの中で採番していると、採番自体が正しく行われない状態が起こりえます。

その場合は、ワークフローを再度実行してもらえばいいんです。しかし考えてみてください。SharePointのワークフローはエンドユーザーには容易に実行することができないユーザーインターフェイスだと思いませんか?

image     image

そうなんです。そこがワークフローでの実装の問題点となりますね。
じゃあどうしましょうか?という事で、このあたりから、設計の話になってくるので、微妙トークとなってしまい、これ以上書くことが出来ません。。。

長々と書いてしまいましたが、こうした問題点が要件定義の段階で握れれば、WFでも実装してしまってよいかと思います。

ワークフロー以外の採番タイミングとして、申請フォームで採番するという方法(要件)もあると思います。
この場合は、フォームの中に、下記の様なUIを作成し、JavaScriptで、番号管理リストにアクセスを行うといった考え方になるかと思います。

image

フォームの場合においても、上記の重複の問題は同じように起こります。ただ、エラーになったらもう一度ボタンを押してもらえばいいですね。このあたりがWFとは事情が異なる点と思います。

フォーム実装で問題となるのは、採番された後で、申請を行わずそのままフォームを閉じてしまう場合がある点です。しかしこれは防ぎようがありません。せめてもの策として、上図のようにボタンクリックで採番するような、申請者が明示的に番号を採番するようにUIを工夫する等はありますね。

如何でしょうか、自動採番と言っても、それほど簡単ではないということがご理解いただけるかなと思います。

って、もはや全然Ninexと関係ない話になってしまいました。

前回の承認ルートも同様ですが、こちらもよくある例としてテンプレート化しています。もしご興味があれば、Nintexと合わせてご紹介することもできますので、下記からお問い合わせいただければ!
http://www.infoshare.co.jp/contact.php

ではまた。