[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp/index.php?FrontPage]]

-[[戻る>SaaS設計のポイント]]

*覚書(TODO) [#m65b689e]
**SQL [#qf280280]
-集計
--http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1114025801

**画面 [#c18c4cc6]
-集計
-編集
-サイン・アップ
**フラグ初期化タイミング [#l4762b6a]
-ログイン
--EnterprisesID
--StoresID
-画面生成
--DevicesID
--InitializeScreenInfoID


*目次 [#x5f52d38]
#contents

*概要 [#wc20edfc]
[[OpenSaaS1ExecEngine>https://github.com/NetDevInfraWGinOSSConsortium/OpenSaaS1ExecEngine]]の開発で検討したこと。

*Tablet系 [#s809aec4]
**画面サイズ [#y2fda7fa]
-4:3(16:10)が主流

--よく使うメディアサイズとデバイスの縦横比〜なぜiPadは4:3なのか | 楽しく生きたいです~
http://fun.hypoes.com/2014/06/ipad43.html

-本SaaSはTablet横置きになる。
--16(横):10(縦)に合わせて
--16(横):9(縦)の場合、横を%指定のレスポンシブで広げて対応。

**専用端末化 [#g0a68287]
-Android/iOS両方で実現可能。
-ただし,OSバージョン縛りがあるので(特にAndroidは)要注意。

***Android [#q714d2ae]

-画面の固定~
Android 5.0から追加された「画面の固定」機能を使えばアクティブなアプリを限定できる。

--画面の固定化 - Qiita~
http://qiita.com/calciolife/items/db9edd5f873f81ce64aa
--Android 5.0 Lollipop の新機能である、~
「画面の固定」を使ってみた | Lonely Mobiler~
http://loumo.jp/wp/archive/20141122172013/
--Android 5.0(Lollipop)の機能紹介 :~
「画面の固定」を有効にすれば使えるアプリを一つに限定できる | juggly.cn~
http://juggly.cn/archives/131329.html

-フルスクリーン
--JavaScriptプログラミング講座【フルスクリーンについて】~
http://hakuhin.jp/js/fullscreen.html#FULLSCREEN_01

-問題

--HTMLコンテンツの場合、~
Androidのブラウザのフルスクリーンモードは解除できるので、~
フルスクリーンモードの解除後に、URL変更などができてしまい、~
端末を色々と弄られてしまう可能性がある。

--コレに対応するには、[[WebView]]で~
スマホネイティブアプリを作成するという方法がある。

***iOS [#fadf2606]
iOS6から追加された「Single App Mode」が使える。

-iOS6の最大の追加機能!? シングルアプリモードがすごい!~
http://matome.naver.jp/odai/2134814499673911401

なお、iOSのシングルアプリモードは、~
アクセスガイドで、上下エリアの操作を無効化できるようで、~
HTMLコンテンツでもブラウザのフルスクリーンモードの解除を抑止できる。

-シングルアプリモード x Compulocks がiPad を専用端末に!~
http://www.japan21.co.jp/2015-07-28-%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%89-x-compulocks-%E3%81%8C%E5%B1%95%E7%A4%BA%E4%BC%9A%E3%81%A7%E3%81%AEipad%E5%88%A9%E7%94%A8%E3%82%92/

-iOS6 アクセスガイドについて調べてみた | Developers.IO~
http://dev.classmethod.jp/smartphone/iphone/accessguide-summary/

*HTML系 [#q77397db]

**オフライン [#bd0eb6c2]
-オンライン環境でない場合に、オフラインで動作する方法を検討する。
-実装はHTML(HTML5)のWeb技術を使用する(スマホ・ネイティブ解らんので)。
-オフライン時にlocal-Storageに溜め込んでバッチ送信みたいなことを考えている。
-色々考え、処理系を切り替える必要があるので結構難しそうだと感じた。
-切り替えが面倒なので、一律、
--ローカルストレージに蓄積
--定期的な情報送信を行う。

>という方式が良いと考えた。

***チェック [#m45f7906]
window.navigator.onLineでチェック可能。

-window.navigator.onLine - Web API インターフェイス | MDN~
https://developer.mozilla.org/ja/docs/Web/API/NavigatorOnLine/onLine

***[[ストレージ>HTML#l92a65cd]] [#s491e762]
ポピュラーな、Key-Valueの[[WebStorage>HTML#wb728540]]が良さそう。

**定期的な情報送信 [#fc3b5931]
***[[バック・グラウンド処理>JavaScript#d6ac8bf9]] [#g51866db]
setTimeoutやsetIntervalなどを用いることで実現できる。~
最新の「Web Workers」については、別に使用しなくていもイイかな。という感想。

***JSON処理 [#q817f036]
-[[クライアント側(JavaScript)>JavaScript#ff279ce5]]

-サーバー側(WCF)~
web.configの書き方は、下記のosscons.jpのマイクロソフト系技術情報 Wikiが参考になる。
--[[JSONを送受信するRESTサービスを作成する方法 - マイクロソフト系技術情報 Wiki>https://techinfoofmicrosofttech.osscons.jp/index.php?JSON%E3%82%92%E9%80%81%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8BREST%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95]]~
>web.configの書き方が間違っていると動かないので注意

***成功と失敗 [#r5610d42]
-WebAPIの戻り値での判断は、二重登録の可能性があり、少々危険だと考える。
--トランザクションが成功した後にHTTPでエラーになると二重登録になる。
--HTTPで成功した後に、local-Storageのクリアに失敗した場合も、二重登録になる。

-上記の二重登録の問題を解決するために、レコードにIDを付与する。

--GUID
---長過ぎる。
---ライブラリが無い。

--店舗ID + 端末ID + 時間 ( yyyy/MM/dd HH:mm:ss SSS )
---店舗ID : ユーザアカウントから取得可能。
---端末ID : HTMLから取得する方法が無い。
---時間 : dateformat.jsを使用して取得可能。

**[[エフェクト>JavaScript#k0f136b5]] [#r0314f09]

***[[効果音>JavaScript#cf0fca98]] [#a95c8a2e]

***[[アニメーション>JavaScript#se421493]] [#i324a0a8]

***二重クリックの防止 [#hdca78a1]
-マスク掛け
-マスク解除(setTimeout)

*業務系 [#ee6ef3c2]
**[[サイン・アップ]] [#pe3897d0]

*DBスキーマ系 [#if087f61]
-マルチテナントを考慮したDBスキーマ設計を行う。

-分割キー(企業ID)
--分割キー(企業ID)は、
---クラスタ化キーか、
---パーティション分割列か、
---シャーディング・キーか、

>>に使用する。

--分割キー(企業ID) = 0 は共通みたいな。

**マスタ・データ [#a72da99f]

***企業テーブル [#qbbcc6a4]
-&color(red){ID};

-企業情報
--企業名
--企業説明
--電話番号

--支払情報
---クレジットカード(他シス連携)~
https://webpay.jp/
---請求書送付先(審査後)

***店舗テーブル [#i936ad5b]
-&color(red){ID};
-&color(blue){分割キー(企業ID)};

-店舗情報
--店舗名
--店舗説明
--電話番号
--・・・

***端末テーブル [#t31fc000]
-&color(red){ID};
-&color(blue){分割キー(企業ID)};
-店舗ID

-端末情報
--端末名
--端末説明
--・・・

***ユーザ・テーブル [#m025e56d]
-&color(red){ID};
-&color(blue){分割キー(企業ID)};
-IsRoot(IsAdmin)
-ログイン・アカウント
--UID~
メールアドレス(企業のドメインと一致するものを使用)
--PWD~
PWDをDBに登録する場合は、[[SaltedPasswd>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Tools/Encryption/EncAndDecUtil/Form1.cs]]を保存する。

-ユーザ情報
--店舗ID
--・・・

***画面初期化情報テーブル [#ob4bd4d1]
-画面の初期化に必要になる情報
--画面テンプレートを画面初期化情報で初期化して画面を表示する。
--画面表示の前に、ユーザは店舗ID・端末ID(不足の情報)を指定する。

-非構造化データ(JSON)~
--画面によって構造が異なるので、
---コントロールに関する情報を非構造化データに格納する。
---非構造化データのフォーマットにはJSONを採用する。
---入力・編集画面から編集可能にする。~
[[JSONの情報から入力・編集フィールドを自動生成する。>#t0c96f81]]

--JSONのテンプレートは画面テーブルに設定しておく。

以下、画面初期化情報の項目情報。

-共通
--&color(red){ID};
--&color(blue){分割キー(企業ID)};
--画面ID
--有効期限(履歴)
--画面タイトル
--追加の検索条件情報~
追加の検索条件情報として登録する、~
下記の非構造化データ(JSON)の~
値のキー情報を登録しておく。

-非構造化データ(JSON)~
例えば、

--メッセージ 1 ~ n

--画像 1 ~ n
---Uri
---キャプション

--ボタン 1 ~ n
---画像Uri
---キャプション

***画面テーブル [#gc869ed6]
-&color(red){ID};
-&color(blue){分割キー(企業ID)};
-説明
-JSONテンプレート

***画像テーブル [#hc1d1e4a]
-&color(red){ID};
-&color(blue){分割キー(企業ID)};
-店舗ID(オプション)
-端末ID(オプション)
-画像データ(バイナリ)

**トランザクション・データ [#pf903470]

***結果テーブル [#j1f69faa]
-&color(red){ID};
-&color(blue){分割キー(企業ID)};

-画面初期化情報ID

-検索条件
--既定の検索条件
---店舗ID
---端末ID
---日付

--追加の検索条件~
DBMSスキーマ上にあれば、集計処理で検索条件として使用できる。~
例えば、非構造化データ(JSON)中の以下の項目を検索条件として追加する。
---画像IDとか
---画像キャプションとか。

-集計列~
ボタンID

*画面系 [#o154947f]
**コンテンツ画面 [#f78c9ddf]
[[HTML/CSS/JavaScript]]技術を中心に使用して開発する。

**カスタマイズ画面 [#l7027353]
エンプラ寄りのWeb Forms技術を中心に使用して開発する。

***非構造化データ(JSONデータ)の入力・編集処理 [#i565476c]
-非構造化データ(JSONデータ)の入力・編集処理の簡略化がキーポイント
--画面の自動生成も面倒なので、JSONの生データを編集する方式にする。
--・・・と考えていたが、リテラシのバラつきにより、~
エンドユーザにはハードルが高いケースがあるらしいので、~
JSON情報から、入力項目を自動生成する方向性に変更。

***JSONの情報から入力・編集フィールドを自動生成 [#t0c96f81]

-必要な情報
--項目種類(列挙型)
---グループ
---テキスト
---画像

--入力・編集時
---可・不可(bool)
---キャプション(文字列)

--データ(文字列)
---文字列:文字列
---画像:画像ID
---グループ:子要素(編集不可能)

--項目種類毎のデータ入力方法
---文字列:手打ち
---画像ID:アップローダから選択

-[[画面初期化情報のJSONフォーマット]]

**条件検索と集計・グラフ表示機能 [#jfc78c33]
エンプラ寄りのWeb Forms技術を中心に使用して開発する。

-通常の条件検索と集計・グラフ表示機能を実装する。
-グラフ表示は、[[ChartControl>https://techinfoofmicrosofttech.osscons.jp/index.php?Chart%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB]]を使用する。

-参考
--【初級編⑪】SQLのGROUP BYでレコードのグループ化と集計を行う | SQLServer2008虎の巻~
http://kaya-soft.com/sqlserver2008-toranomaki/beginner/groupby/

***ボタンIDの集計 [#h546f412]
-集計処理
--集計対象 : ボタンID(GROUP BY ボタンID)
--集計関数 : COUNT(*)

-参考
--円グラフ/ドーナツ・グラフで結果を表示する。
---[ASP.NET]チャート・コントロールで円グラフ/ドーナツ・グラフを作成するには?[3.5、C#、VB] - @IT~
http://www.atmarkit.co.jp/fdotnet/dotnettips/1001aspchartpie/aspchartpie.html
---[ASP.NET]チャート・コントロールに凡例を追加するには?[3.5、C#、VB] - @IT~
http://www.atmarkit.co.jp/fdotnet/dotnettips/1002aspchartlegend/aspchartlegend.html

***期間の中での変化 [#q890750d]
-集計処理
 select 
   date_part('month', 日付) as 月,
   count (CASE WHEN ボタンID = 1 THEN TRUE ELSE NULL END) AS AAAAA,
   count (CASE WHEN ボタンID = 2 THEN TRUE ELSE NULL END) AS BBBBB,
   count (CASE WHEN ボタンID = 3 THEN TRUE ELSE NULL END) AS CCCCC,
   count (CASE WHEN ボタンID = 4 THEN TRUE ELSE NULL END) AS DDDDD
 from
   結果テーブルの条件検索の結果セット
 group by
   日付
 order by
   日付;

-参考
--積み上げ棒グラフで期間毎の結果を表示する。
---[ASP.NET]チャート・コントロールで積み上げ棒グラフを作成するには?[3.5、C#、VB] - @IT~
http://www.atmarkit.co.jp/fdotnet/dotnettips/1004aspchartstack/aspchartstack.html
--月ごとの集計、条件付き集計(PostgreSQL)
---PostgreSQL: 条件付き集計 : 都筑総研~
http://blog.livedoor.jp/g0031067/archives/51879514.html
---月ごとの集計をするSQL | SEとDIY~
http://choice-site.com/2013/04/26/%E6%9C%88%E3%81%94%E3%81%A8%E3%81%AE%E9%9B%86%E8%A8%88%E3%82%92%E3%81%99%E3%82%8Bsql/

*上記を踏まえた技術選定 [#j79a5fbb]
Open棟梁はコミュニティ連携のため前提で(笑)。

**OS [#ab710ff7]
***Windows [#jfb16743]
-特に、Linuxである必要を感じなかった。

**DBMS [#s82210c9]
***PostgreSQL [#g0402763]
-スタートアップで人気。
-MosPで運用実績がある。

-データプロバイダ
--[[ADO.NETデータプロバイダ - マイクロソフト系技術情報 Wiki>https://techinfoofmicrosofttech.osscons.jp/index.php?ADO.NET%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80]]
---[[PostgreSQL>https://techinfoofmicrosofttech.osscons.jp/index.php?ADO.NET%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80#dad19e08]]

**WAS [#o19b65dc]
***IIS+ASP.NET [#h4bbb279]
.NET開発基盤部会だけに。

**フレームワーク [#p51713fe]
***画面毎 [#p4d0e02c]
-コンテンツ画面

--基本
---ASP.NET Web Forms ( [[HTML サーバー コントロール>https://msdn.microsoft.com/ja-jp/library/s37470tf.aspx]] )
---WCF ( DataContractJsonSerializer )
---Ajax( jQuery )
---ADO.NET.

--若しくは
---ASP.NET MVC
---ASP.NET Web API
---Ajax( jQuery )
---ADO.NET.

-その他の画面
--特徴
---エンプラチックな画面
---グラフ表示画面で[[ChartControl>https://techinfoofmicrosofttech.osscons.jp/index.php?Chart%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB]]を使用したい。
--フレームワーク
---ASP.NET Web Forms ( ASP.NET Web サーバー コントロール )
---ADO.NET.

-全体的に
--[[Entity Framework>https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework]]は個人的に、パス。

***ASP.NET Web Forms [#jc256e53]
ASP.NET Web Formsを選択した。

-HTMLに準拠した実装がし易いように、[[HTML サーバー コントロール>https://msdn.microsoft.com/ja-jp/library/s37470tf.aspx]]を使用する。

-ASP.NET MVCであっても・なくても良かった。
--[[赤波線の件>GCEのSSDインスタンスで開発環境を作ってみた。#p8796459]]と、
--コントロールのキャプション置換がWeb Formsの方が楽だと思ったから。
--グラフ表示画面もあるので、[[ChartControl>https://techinfoofmicrosofttech.osscons.jp/index.php?Chart%20%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB]]を使いたいと思ったから。
--B・D層を別DLL化して、必要ならUIサブシステムだけMVCに切替えるのはアリだと思う。

***Ajax - REST ( JSON ) - WebAPI [#rf00022b]
Web Formsだが、オフライン実装を考慮しPostBack無しのWebAPIで実装。

-フレームワーク
--Ajax ( jQuery )
--REST ( REST JSON )
--WebAPI ( WCF ( DataContractJsonSerializer ) )

***ADO.NET [#j73f1b6e]
ADO.NETでイイと考えた。

-簡単なクエリのみ。
-一々、[[Entity Framework>https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework]]使う程でもない。
-複雑なエンプラの方がハマらないのだっけ?
-あまりピンとこない、Beanを永続化するなら[[NoSQL]]でイイのでは。

**,etc. [#bc832b0c]

*本開発 [#xc04182d]

**画面 [#q3a3a145]

***メンテナンス画面 [#he7173fa]
-ユーザ・テーブルのCRUD画面(ユーザ)
--R:サイン・イン、サイン・アウト
--C:サイン・アップ画面
--U:編集画面

--企業テーブルのCRUD画面(ユーザ)
---R:企業検索
---C:企業登録
---U:企業編集
---D:企業削除

--店舗テーブルのCRUD画面(ユーザ)
---R:店舗検索
---C:店舗登録
---U:店舗編集
---D:店舗削除

--端末テーブルのCRUD画面(ユーザ)
---R:端末検索
---C:端末登録
---U:端末編集
---D:端末削除

-画面
--画面テーブルのCRUD画面
---R:画面検索(共通)
---C:画面登録(共通)
---U:画面編集(共通)
---D:画面削除(共通)

--画像テーブルのCRUD画面(画像アップローダ)
---R:画面検索(共通)
---C:画面登録(システム)
---U:画面編集(システム)
---D:画面削除(システム)

--画面初期化情報テーブルのCRUD画面
---R:画面初期化情報検索
---C:画面初期化情報登録
---U:画面初期化情報編集
---D:画面初期化情報削除

***コンテンツ画面 [#d90a53af]
-各種コンテンツ画面

***集計画面 [#v2dc420d]
-集計画面1~
円グラフ/ドーナツ・グラフで結果を表示する。
-集計画面2~
積み上げ棒グラフで期間毎の結果(の変化)を表示する。

**テーブル [#k0903e28]

***マスタ [#xa283e71]
-ユーザー
--企業テーブル
--店舗テーブル
--端末テーブル
--ユーザ・テーブル

-画面
--画面テーブル
--画像テーブル
--画面初期化情報テーブル

***トランザクション [#d9d7880e]
-結果テーブル

***SQL [#v318f734]
-型
--データ型 - PostgreSQL 9.1.5文書~
https://www.postgresql.jp/document/9.1/html/datatype.html
--[ThinkIT] 第1回:データベース移行 (2/2)~
https://thinkit.co.jp/cert/marugoto/2/1/19/2.htm
---PostgreSQLのデータ型~
https://thinkit.co.jp/cert/marugoto/2/1/19/2table.htm

--他
---Date and Time~
http://www.npgsql.org/doc/datetime.html
---PostgreSQL and C# Datatypes - Stack Overflow~
http://stackoverflow.com/questions/845458/postgresql-and-c-sharp-datatypes

-PostgreSQL
--Master
 --------------------
 -- TABLE:
 --------------------
 CREATE TABLE Enterprises(
     ID              integer        NOT NULL,
     Name            VARCHAR(40)    NOT NULL,
     Description     VARCHAR(40),
     Phone           VARCHAR(24),
     CONSTRAINT PK_Enterprises PRIMARY KEY (ID)
 );
 
 CREATE TABLE Stores(
     ID               integer        NOT NULL,
     EnterprisesID    integer        NOT NULL,
     Name             VARCHAR(40)    NOT NULL,
     Description      VARCHAR(40),
     Phone            VARCHAR(24),
     CONSTRAINT PK_Stores PRIMARY KEY (ID)
 );
 
 CREATE TABLE Devices(
     ID               integer        NOT NULL,
     EnterprisesID    integer        NOT NULL,
     StoresID         integer        NOT NULL,
     Name             VARCHAR(40)    NOT NULL,
     Description      VARCHAR(40),
     CONSTRAINT PK_Devices PRIMARY KEY (ID)
 );
~
 --------------------
 -- Index:
 --------------------
 CREATE INDEX Split_key_Stores ON Stores (EnterprisesID);
 CREATE INDEX Split_key_Devices ON Devices (EnterprisesID);
 
 CLUSTER Stores USING Split_key_Stores;
 CLUSTER Devices USING Split_key_Devices;
~
 --------------------
 -- Sequence:
 --------------------
 CREATE SEQUENCE TS_EnterpriseID START 1001;
 CREATE SEQUENCE TS_StoreID START 1001;
 CREATE SEQUENCE TS_DeviceID START 1001;
~
 --------------------
 -- INSERT
 --------------------
 INSERT INTO Enterprises (ID, Name, Description, Phone) VALUES(0, '0', '0', '0');
 INSERT INTO Stores (ID, EnterprisesID, Name, Description, Phone) VALUES(0, 0, '0', '0', '0');
 INSERT INTO Devices (ID, EnterprisesID, StoresID, Name, Description) VALUES(0, 0, 0, '0', '0');
 
 INSERT INTO Enterprises (ID, Name, Description, Phone) VALUES(nextval('TS_EnterpriseID'), 'AAAA', '・・・・・', '1111');
 INSERT INTO Stores (ID, EnterprisesID, Name, Description, Phone) VALUES(nextval('TS_StoreID'), currval('TS_EnterpriseID'), 'aaaa', '・・・・・', '1112');
 INSERT INTO Devices (ID, EnterprisesID, StoresID, Name, Description) VALUES(nextval('TS_DeviceID'), currval('TS_EnterpriseID'), currval('TS_StoreID'), '001', '・・・・・');
~
 --------------------
 -- SELECT
 --------------------
 SELECT * FROM Enterprises;
 SELECT * FROM Stores;
 SELECT * FROM Devices;
~

--Transaction 
 --------------------
 -- TABLE:
 --------------------
 CREATE TABLE InitializeScreenInfo(
     ID                        integer        NOT NULL,
     EnterprisesID             integer        NOT NULL,
     ExpirationDate            date,
     ScreenTitle               VARCHAR(40),
     AdditionalSearchCriteria  VARCHAR(24),
     UnstructuredData          jsonb,
     CONSTRAINT PK_InitializeScreenInfo PRIMARY KEY (ID)
 );
 
 CREATE TABLE Answers(
     ID                       integer        NOT NULL,
     EnterprisesID            integer        NOT NULL,
     InitializeScreenInfoID   integer        NOT NULL,
     StoresID                 integer        NOT NULL,
     DevicesID                integer        NOT NULL,
     Datetime                 timestamp	     NOT NULL,
     AnswerID                 integer        NOT NULL,
     AdditionalSearchCriteria VARCHAR(40),
     CONSTRAINT PK_Answers PRIMARY KEY (ID)
 );
~
 --------------------
 -- Index:
 --------------------
 CREATE INDEX Split_key_InitializeScreenInfo ON Stores (EnterprisesID);
 CREATE INDEX Split_key_Answers ON Devices (EnterprisesID);
 
 CLUSTER Stores USING Split_key_InitializeScreenInfo;
 CLUSTER Devices USING Split_key_Answers;
~
 --------------------
 -- Sequence:
 --------------------
 CREATE SEQUENCE TS_InitializeScreenInfo;
 CREATE SEQUENCE TS_AnswersID;
~
 --------------------
 -- INSERT
 --------------------
~
 --------------------
 -- SELECT
 --------------------
 SELECT * FROM InitializeScreenInfo;
 SELECT * FROM Answers;


*プロト開発 [#l54c2574]
**Ph1 [#u5163e56]
3 画面

***コンテンツ画面 [#f46eb4eb]
種々の情報は固定

***集計画面 [#v2dc420d]
-集計画面1~
円グラフ/ドーナツ・グラフで結果を表示する。
-集計画面2~
積み上げ棒グラフで期間毎の結果(の変化)を表示する。

**Ph2 [#ocb8a502]
6 画面追加

3 テーブル * CRUD画面は 2 画面(検索・詳細) = 6 画面

***メンテナンス画面の追加 [#a4f503eb]
-画面テーブルのCRUD画面
-画像テーブルのCRUD画面
-画面初期化情報テーブルのCRUD画面(ユーザ)

***コンテンツ画面 [#wca79166]
種々の情報を可変に。

**Ph3 [#a7118a74]
8 画面追加

4 テーブル * CRUD画面は 2 画面(検索・詳細) = 8 画面

***メンテナンス画面の追加 [#mb208f71]
-ユーザ・テーブルのCRUD画面
-企業テーブルのCRUD画面
-店舗テーブルのCRUD画面
-端末テーブルのCRUD画面

***コンテンツ画面 [#wca79166]
サイン・イン、サイン・アウト(認証)に対応


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS