【ローコードのSKE】さまざまな自動採番

今回の記事は、SKEの自動採番機能のサンプルです。

## １、連番型の自動採番

連番型項目は、データ挿入時に値が設定されなかった場合自動的に増加する数字項目です。PKとしてよく利用されます。以下のテーブルを利用して、サンプルを作ります。

```sql
CREATE TABLE "テストテーブル"
(
  "主キー" serial NOT NULL,
  "名称" character varying(10),
  CONSTRAINT "テストテーブル_pkey" PRIMARY KEY ("主キー")
)
```
### 共通設定
テーブル名と項目名を登録します。PK項目は役割に「主キー」と設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/43491896-19d2-4e02-b241-27b02c6e6f2d.png)
### 一覧画面
今回は入力ダイアログで試したいので、以下のように、一覧画面に入力ダイアログ利用することを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/4b57726d-f1bb-42ce-b357-03d1072ded33.png)
一覧画面の表示項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/b59f204f-c804-4e16-9c90-e541bf1d6933.png)
### 入力ダイアログ
入力ダイアログには、主キー項目を設定しないようにします。主キー項目が設定された場合、保存時画面の値をDBに代入するので、自動的に増加する効果がなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/152930ca-9caa-467d-bc17-040680979679.png)
### その他設定
メニュー定義とロール定義を設定して、テストできるようにします。このあたりは[プロトタイプ作成](https://qiita.com/changkejun/items/2f25030223b7d3f0091f)をご参考ください。
### 効果
名称を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/8aaf2275-47fa-4040-8d86-d7f475b4b6b3.png)
保存したら主キーが自動採番されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/aafc81bc-1ff3-4119-9f48-848600210b00.png)
但し、新規保存後編集モードで継続することはできません。保存時採番した主キーを入力ダイアログ側が知らないからです。

## ２、初期表示時シーケンスの自動採番
連番型をやめて、シーケンスと数字項目で代替ります。
```sql
CREATE SEQUENCE "主キー用シーケンス"
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
  
CREATE TABLE "テストテーブル"
(
  "主キー" integer NOT NULL,
  "名称" character varying(10),
  CONSTRAINT "テストテーブル_pkey" PRIMARY KEY ("主キー")
```
### 共通設定、一覧画面
「連番型で自動採番」と同じ
### 入力ダイアログ
主キー項目を追加します。編集不可にします。フォーマットに「０」を設定して画面から受け取るテキストを数字に変更して、データ型の整合性を保つためです。値のアドオンを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/789d7274-9788-43c1-91ff-fef094380a2a.png)
新規モードとコピー新規モードの場合、画面初期表示時、シーケンス採番の値を表示します。
```js
{
	"add": function(initFormData,dbData,result){
			return db.select("select nextval('主キー用シーケンス')").getValue("nextval");
		},
	"copyAdd": function(initFormData,dbData,result){
			return db.select("select nextval('主キー用シーケンス')").getValue("nextval");
		}
}
```
### 効果
新規モードで入力ダイアログを開く際、主キー項目に初期値が設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/5e5b981e-ed5a-439c-b8b9-947f0d23cceb.png)
名称を入力して保存して、そのまま継続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/efceada9-2e5b-4090-a3ab-87e9451bfbc2.png)
但し、新規モードで入力ダイアログを開いて保存しないまま閉じて、もう一回開く場合、シーケンスを再採番されて飛び番現象が出ます。

## ３、保存時シーケンスの自動採番
「初期表示時シーケンスの自動採番」のシーケンスとテーブルはそのまま利用します。

### 共通設定
基本的に「連番型で自動採番」の設定内容と同じですが、以下のように主キー項目の新規とコピー新規モードの設定値アドオンを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/a38cb459-0577-4263-8bdc-e1fabff08854.png)
```js
{
	"add": function(saveFormData){
			var id=db.select("select nextval('主キー用シーケンス')").getValue("nextval");
			saveFormData.fd主キー=id;
			return id;
		},
	"copyAdd": function(saveFormData){
			var id=db.select("select nextval('主キー用シーケンス')").getValue("nextval");
			saveFormData.fd主キー=id;
			return id;
		}
}
```
### 一覧画面
「連番型で自動採番」と同じ

### 入力ダイアログ
アドオンプログラムの可読性のため、主キー項目のIDを設定します。主キー項目の値は新規モードとコピー新規モードの場合空白を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/a1cf225e-0b45-4b93-8108-13e9378d1a42.png)

### 効果
新規モードで入力ダイアログを開くと、主キー項目は空白です。名称を入力して保存ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/65481800-62db-4752-baa8-7d0184fb0341.png)
保存後、主キー項目に値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/17f84c06-3db1-4d71-87c4-acb363e46c40.png)

## まとめ
今回の記事のサンプルには、以下のアドオンを利用しました。
- 値のアドオン
- モード別項目設定値のアドオン