最初の記事Javaでの高速CRUD開発:「1C:Enterprise」によるダウンシフトで約束したように、 1C:Enterpriseと同じ機能を実装するOpenSourceプロジェクトの説明を続けます。
今回は、データ構成システムであるSKDであり、私の開発はFlexReporting( GitHubへのリンク )です。
このメカニズムの本質は何ですか? これは一種のリアルタイム-ROLAPツールで、「フラットな」データをその場で階層レポートに変換します。
実際、ACSは「OLAP」ではないと主張する多くのファンがいますが、逆累積レジスタの測定のすべての(または特定の)組み合わせの多次元データを事前に計算および保存する集計などのことを思い出してください。この略語を使用するための重要な引数。 ただし、用語をめぐる論争を避けたいと思います。
これは、1C ERP 2.0での外観です。
![](https://habrastorage.org/files/d8b/5a5/e52/d8b5a5e52a7048cb9da33e41599e279d.jpg)
SKD(および私の開発)の機能は、ユーザーにデータソースを提供し、レポート設定でユーザーが好きなようにプレイできるようにすることです。
1.データが表示されるシーケンス、垂直方向、水平方向のグループを指定します。
例:倉庫、製品、マネージャーなど
2.インジケーターのセット、およびそれらに適用される集約関数(量、平均、数量、最小、最大など)を定義します。
例:金額(コスト)、平均(商品の数量)、最大(出荷日)。
一般に、これはピボットテーブルの機能を使用してExcelで実現できますが、基本バージョンでは、柔軟性のあるレポートを作成する予定がある場合は、独自のシステムでこれを使用すると便利です。 フリーランスで別の自転車を発明しました。いつものように、このタスクのためのシンプルで機能的なソリューションをその場で見つけることができず、時間がなくなりました。
アルゴリズムについて説明します。
まず、データを決定しましょう。 JDBC、ORM、JSONまたはSOAPからのものであり、主なものはArrayListに変換できることです。 getData()関数のデモでは、いくつかのレコードからの単純なスタブ。
ユーザーは、レポートに表示されるトレーニンググループのセットを設定します。 次に、それらの上に2つのツリーが構築されます(水平および垂直のグループ化)。
groupsFeildsList.add( "a");
groupsFeildsList.add( "b、bb");
groupsFeildsList.add( "url");
columnFeildsList .add( "c");
問題は、ユーザーが1つのグループレベル(たとえば、bとbb)でフィールドの組み合わせを見たい場合があることです。 これにより、アルゴリズムが少し複雑になり、読みやすくなりました。
次に、インジケーターのリストと、それらに作用する集約関数を作成します(デモでは1つのインジケーター)。
computeFeildsList.add(newHashMap( "field、function"、 "d"、 "max"));
再帰関数は、データに従って(vert、t、groupsFeildsList、0)を生成し、最も単純なNodeクラスで記述されたツリーを形成します。
パブリッククラスNodeはCloneable {
public ArrayList / Node / nodes;
パブリックLinkedHashMapフィールド。
パブリックHashMap追加;
パブリックノードの親。
...
};
次に、インディケータはツリーレベルで計算されます。もちろん、再帰的-パブリックHashMap計算関数(ノードx、ノードy、ArrayList t、ArrayList computeFeildsList)が実行され、結果が同時にhtmlに出力されます。
この奇跡はすべてSpringの下で機能し、jspテンプレートに挿入されます。 彼との滑りやすい瞬間がいくつかありました。
レポートはインタラクティブであると想定されていました。 インターネットでjsfiddle.net/NZaw4/10の例を見つけました。
Excelで行を折りたたんだり展開したりするためにスタイルを使用することにしたので、それらを何らかの方法で読み込む必要がありました。 これには問題があり、最終的にjspテンプレートにテキストを直接貼り付けました(スタイルタイプ= "text / css")。
別のポイント:ブラウザーによってチェックボックスの動作が異なることが判明しました。その結果、コード内でそのようなことがわかります。
if(((ua.indexOf( 'MSIE')!= -1)||(ua.indexOf( 'Firefox')!= -1)||(ua.indexOf( 'Mozilla')!= -1)) &&(ua.indexOf( 'Chrome')== -1)){
row.querySelector( 'td input')。checked =!row.querySelector( 'td input')。checked;
newch =!row.querySelector( 'td input')。チェック;
}
実際、これは私が結果として得たものです:
![](https://habrastorage.org/files/032/d34/ae5/032d34ae5759405eb31fb9d3c17de01b.jpg)
追加したいもの。 最初の記事では、実用的なアドバイスと、調査する価値のあるリソースへのリンクを受け取りました。 これをどうもありがとう。
しかし、私は少し否定的になりました。たとえば、彼らが片方の膝でこれらの開発に追いつくことは決してないという事実に重点を置いています(そして、定期的なレポートのニッチから押し出されません)、そして一般的にこれはすべてだらだらと虚栄心です。 当然追いつくことはありません! したがって、他のいくつかの目標が設定されているため、ソースコードは公開されています。
それにもかかわらず、私は1つの興味深い事実を報告します。 その週、サンクトペテルブルクのコロシアムで開催されたINFOSTART EVENT 2015 CONNECTIONカンファレンスで講演する機会がありました。
そして、私はそこで何を見ましたか?
同様の焦点を持つオープンプロジェクトに関する2つのレポート:
1スクリプト
このプロジェクトは、1C:Enterpriseでスクリプトを実行する仮想マシンの代替実装です。
さらに、プロジェクトは1Cライブラリから完全に独立しており、ターゲットマシンに1C:Enterpriseシステムを必要としません。
Metadata.js
これは、多数の接続(ディーラーまたは数百人の匿名または許可された外部ユーザーがいるオンラインストアフロント)を持つ1Cサーバーにあるデータの読み取りと編集を可能にする代替1C軽量JavaScriptクライアントです。
ですから、私には特定の趣味があるだけでなく、私たちの多くがいます。
![](https://habrastorage.org/files/3e0/60f/7fb/3e060f7fbb7b431c859fb6d8c3b43deb.jpg)
良い週をお過ごしください!