English

Nesta Trigger


Nesta Triggerとは ?

Nesta Trigger とはデータが更新された時に Luaスクリプトを実行する仕組みのことです。
あらかじめ作成された Luaスクリプトをデータの更新時に起動することができます。
トリガを利用することで入力データのチェックも可能になります。
また、表計算ソフトのように自動計算を行うことも可能になります。

Nesta Trigger は以下のタイミングで実行することができます。

  • 新しいエンティティが追加された時
  • エンティティが更新された時
  • エンティティが削除される前
  • エンティティが削除された時
  • フィールドの値が更新された時

Neste Trigger はスクリプト言語としてシンプルで高速な Luaを使用して記述します。

※本稿でのスクリーンショットは iPadでの英語版のものになります。

トリガ一覧

作成されたトリガはレイアウトで一覧として表示されます。
新規にトリガを作成する場合は「トリガの追加」をタップします。

新規トリガの作成

トリガ名を60文字以内で入力します。

初期値を設定するトリガ

新しいエンティティが追加された時にすべてのフィールドに"default"を設定する Luaスクリプトです。

db = ndb_current_dbname()
cursor = ndb_cursor_current()
n = ndb_field_count(db)
for i  = 1, n do
    field = ndb_field_name(db, i)
    property = ndb_property_get(cursor, field)
    ndb_property_putstr(property, "default")
end

新しいエンティティが追加された時に先頭のフィールドに本日日付を設定する Luaスクリプトです。

-- Today's date (YYYY/MM/DD)
todays = os.date("%Y%m%d")
db = ndb_current_dbname()
cursor = ndb_cursor_current()
field = ndb_field_name(db, 1)
property = ndb_property_get(cursor, field)
ndb_property_putstr(property, todays)

フィールドを更新するトリガ

"title"フィールドが"XYZ"に更新された時に"member"フィールドと"place"フィールドを更新する Luaスクリプトです。

db = ndb_current_dbname()
cursor = ndb_cursor_current()
-- title --
title_field = ndb_field_name(db, 2)
title_property = ndb_property_get(cursor, title_field)
title = ndb_property_getstr(title_property)

if (title == "XYZ") then
    -- member --
    member_field = ndb_field_name(db, 3)
    member_property = ndb_property_get(cursor, member_field)
    ndb_property_putstr(member_property, "Scott, Jhon, Lian")
    -- place --
    place_field = ndb_field_name(db, 4)
    place_property = ndb_property_get(cursor, place_field)
    ndb_property_putstr(place_property, "Tokyo")
end

エンティティが更新された時に自動計算するトリガ

エンティティが更新された時に科目の平均点を計算して設定する Luaスクリプトです。

データベースのレイアウトは以下の通りです。
Number Name English Mathematics Science Average
db = ndb_current_dbname()
cursor = ndb_cursor_current()
total = 0
count = 0

for i  = 3, 5 do
    field = ndb_field_name(db, i)
    property = ndb_property_get(cursor, field)
    num = ndb_property_getnum(property)
    if (num ~= nil) then
        if (num < 0 or num > 100) then
            alert("invalid number")
            ndb_property_delete(property)
        else
            total = total + num
            count = count + 1
        end
    end
end

-- average
ave_field = ndb_field_name(db, 6)
ave_property = ndb_property_get(cursor, ave_field)
--alert("count=" .. count .. " total=" .. total)
if (count > 0) then
    average = total / count
    average = math.floor(average)
    ndb_property_putnum(ave_property, average)
else
    ndb_property_delete(ave_property)
end

フィールドの値が更新された時に他のデータベースを参照するトリガ

Numberフィールドの値が更新された時に Students データベースを参照して Name フィールドを更新する Luaスクリプトです。
Numberの値をキーに Students データベースの Name 値を取得します。

Studentsデータベースのレイアウトは以下の通りです。
Number Name
--
-- Function:
--  Gets string field value via cursor.
--
function getString(cursor, fieldname)
  local property = ndb_property_get(cursor, fieldname)
  return ndb_property_getstr(property)
end

--
-- Will be executed for script from here.
--
db = ndb_current_dbname()
cursor = ndb_cursor_current()
number = getString(cursor, "Number")

refdb = "students"

-- new query
query = ndb_query_create(refdb)
-- new search filter
filter = ndb_filter_create(query)
-- add the filter condition
ndb_filter_add(filter, "Number", NDB_EQ, number)
-- add the filter condition to the query.
ndb_query_add(query, filter)
-- close filter
ndb_filter_close(filter)
-- gets the cursor that matches the filter conditions.
ref_cursor = ndb_cursor_query(query)
count = ndb_cursor_count(ref_cursor)
if (count == 1) then
    -- gets name data
    ref_name = getString(ref_cursor, "Name")
    -- update name
    name_property = ndb_property_get(cursor, "Name")
    ndb_property_putstr(name_property, ref_name)
else
    alert("Not found student number : " .. number)
end
-- close query
ndb_query_close(query)
-- close reference cursor
ndb_cursor_close(ref_cursor)

Author: YAMAMOTO Naoki
Create date: 2013/04/07
Last modified: 2013/04/20