4D v16

4Dテーブルとメソッドの呼び出し

ホーム

 
4D v16
4Dテーブルとメソッドの呼び出し

4Dテーブルとメソッドの呼び出し    


 

Wakandaから参照されている4Dテーブルへのアクセスモードは、外部カタログがどのように統合されているかによって決まります。これはWakandaがリモートアプリケーションへと接続する際にWakanda内にて定義されます(アクティブなモデルとの併合か、専属のモデルの使用か を参照して下さい):

  • アクティブなモデルと統合(デフォルトのオプション): この場合、リモートテーブルは、ds オブジェクトを通してlocal classと全く同じ様に使用されます。
  • 専属のモデルを使用: この場合には、リモートテーブルは専属のモデルオブジェクトのプロパティとなります。

アクティブなモデルと統合した場合、Wakandaアプリケーションから参照されている 4D テーブルは、ローカルのdatastore classes と同様に、サーバー側のJavaScriptのコードの中でds オブジェクトのプロパティとして直接使用することができます。注: ds オブジェクトはWakandaのカレントのdatastoreを内包しています。

例えば、[Employees]テーブルのレコード内でクエリを実行しようとした場合、以下の様に記述します:

var emp = ds.Employees.query("age > :1",30);
        // Employeesテーブルから、年齢が30 歳を超える
        // レコードのコレクションをemp変数に返します。

また、クライアント側では、ウィジェット付随の、データストアクラスに基づいた datasources 自動メカニズムを使用することもできます。例えば、`employees`データソースを`Grid`型のウィジェットと関連付けするとemployeesのリストが自動的に表示されます:



テーブルがdatasourceと関連付けられているとき、データソースを使用してテーブルのデータにアクセスることもできます。例えば、`employees` データソースのレコードのコレクションをソートしたい場合、以下の様に記述します:

sources.employees.orderBy("age");
        //employees のコレクションを年齢順にソートします。

datastore クラスの仕様については、Wakanda documentationを参照して下さい。

参照されている4Dテーブルは、リンクが作成された時点でのカタログのプロパティとして、サーバー側のJavaScriptコード内にて使用されます。このカタログの名前はWakanda Studio 接続ダイアログボックスでの接続引数としてRemote datastore name に渡したもの、またはJavaScriptメソッドでの localName に渡したものになります。

例えば、"my4Dstore" という名前のリンクを作成して、[Employees] テーブルのレコード内にてクエリを実行したい場合、以下の様に記述します:

var emp2 = my4Dstore.Employees.query("age > :1", 30);
    // "my4Dstore"という名前のリンク内で
    // Employees テーブルのレコード内を検索

実装に関する注意: 現在の4D Mobileでは、専属のモデルを使用した場合、クライアント側ではリモートクラスへとアクセスすることはできません。

Wakanda 内で参照されている4Dメソッドは、datastore class, entity collection または entity オブジェクトのプロパティとしてJavaScriptのコードの中で直接使用することができます。どれのプロパティとして呼び出されるかは4D側で定義されたスコープによって決まります( プロジェクトメソッドのペアレントテーブルとスコープについて を参照して下さい)。Wakandaオブジェクトとプロジェクトメソッドの対応表は以下の様になります:

4D スコープWakanda オブジェクト
テーブルdatastore class
カレントセレクションentity collection
カレントレコードentity

Note: 4Dメソッドはデータソースを使用することによってクライアント側で呼び出すことも可能です(以下を参照して下さい)。この場合は全てのメソッドが使用可能で、データソースが状況に応じてカレントコレクションかカレントエンティティに適用するかを自動的に判別します。

例えば、前章で使用したクエリメソッドを使用してクエリを実行した場合、Wakandaはエンティティコレクションを返します。このコレクションに対しては、スコープが「カレントセレクション」と宣言されている4Dプロジェクトメソッドであればどれでも使用可能です。

4DメソッドがJavaScriptから呼び出される方法は3通りあります:

  • SSJS Datastore APIを使用して(SSJS)サーバー上でJavaScriptを実行して呼び出し:この場合、4Dメソッドは先に説明のあったように datastore class, entity collection または entity オブジェクト のプロパティとして呼び出されます。以下の様に記述します:
    var vTot = ds.Emp.raiseSalary(param))
        // raiseSalary はdatastore class のプロパティ
        //カタログはアクティブなモデルと統合
    var vTot2 = my4DStore.Company.first().capital(param)) 
        // first() はentityを返すので、capital はentity propertyとなる
        // my4DStore という専属のモデルを使用
  • Wakanda Ajax Framework (WAF)を使用して、クライアント上(ブラウザなど)で実行されたJavaScriptコードでJavaScriptから呼び出し:この場合、使用するAPIによって二通りの方法があります:
    実装に関する注意:
    In theカレントのバージョンの
    Wakanda Enterprise では、クライアントからの4Dデータベースメソッドへのアクセスは、リモートデータベースがアクティブなモデルと接続・統合されている場合にのみ可能です。
    • WAF Datasource API を使用する方法:このハイレベルなAPIはデータを管理するための様々な自動機能を提供します。このAPIを使用した場合、 datastore classes に関連付けられたデータソースのプロパティと して呼び出され、内容に応じて自動的にデータストアークラス、カレントエンティティコレクション、もしくはカレントエンティティに適用されます。メソッドの戻り値やエラーを処理するのであれば、全て非同期シンタックスを使用して管理しなければなりません(クライアントでコードを実行するためには必須です)。記述例としては以下の様になります:
    • sources.employee.raiseSalary(param,
          {onSuccess: function(event)
          { ... //メソッド終了時に実行されるべきコード}
      }))

      ここではコールバック関数の使用は必須ではありません。何故ならデータソースオブジェクトはクエリ後のカレントコレクションに合わせて表示を更新するなどの動作をサポートする自動機能があるからです。
    • WAF Dataprovider API を使用する方法:このローレベルなクライアントAPIを使用するとオブジェクトを直接扱うことができます。 SSJS Datastore API 同様、4Dメソッドは datastore class, entity collectionまたは entity オブジェクトのプロパティとして呼び出されます。しかしながらメソッドの戻り値やどのエラーも、非同期シンタックスを使用して管理しなければなりません(クライアントで実行されるコードのためには必須です)。記述例としては以下の様になります:
      ds.Employee.raiseSalary(param, // シンタックスはSSJSの呼び出しに
          {onSuccess: function(event)    // ていますが、これはクライアント側の
          // コードなので非同期呼び出しのコールバック関数を管理する必要があります。
          { ... //メソッド終了時に実行されるべきコード}
      }))

      呼び出す場所(サーバーかクライアント)と、使用すべきAPIはアプリケーションによって異なり、その詳細はWakanda ドキュメントに説明があります。

引数  

標準的なメソッド同様、呼び出し中にメソッドに引数を渡す事ができます。これらの引数は$1、$2、、、という順番で引き受けられていきます。同じように、$0がメソッドからの返り値になります。

例題:給料が1500未満の従業員に対して5%の昇給を行いたい、という場合を考えます。

  • 4D側では、 IncreaseSalary メソッドを4D Mobile経由で公開し、スコープを「カレントセレクション」に設定して、コードを以下の様に記述します:
     C_REAL($1)
     READ WRITE([Employees])
     FIRST RECORD([Employees])
     While(Not(End selection([Employees])))
        [Employees]salary:=[Employees]salary*$1
        SAVE RECORD([Employees])
        NEXT RECORD([Employees])
     End while
     UNLOAD RECORD([Employees])
  • Wakanda 側では、以下のコードをサーバー上で実行します:
    var emp = ds.Employees.query("salary < :1",1500); 
            // emp にはsalaryが1500未満の従業員のコレクションが入ります。
        emp.IncreaseSalary(1.05);
            //コレクションに対してIncreaseSalary を実行します。
            //以下の様に記述することもできます: 
            //"ds.Employees.query("salary < :1",1500).IncreaseSalary(1.05);

MOBILE Return selection コマンドを使って、4D セレクションを直接 Wakanda のコレクションとして返すことも可能です。例えば:

  //FindCountries プロジェクトメソッド
  //FindCountries( string ) -> object
 
 C_TEXT($1)
 C_OBJECT($0)
 QUERY([Countries];[Countries]ShortName=$1+"@")
 $0:=MOBILE Return selection([Countries])

Wakanda リンクを通して4Dメソッドを呼び出す場合:

  • メソッドがセレクション(entity collection)に対して適用されるとき、メソッドはカレントセレクションとなり、4Dはリンクをロードしたり有効化したりすることなくこのセレクションの最初のレコードに位置します。セレクションが空の場合、Selected record number コマンドは1ではなく0を返します。
  • メソッドはレコード(entity)に対して適用されるとき、メソッドはカレントレコードとなります。カレントセレクションはこのレコードのみに縮小され、 Selected record number コマンドは1を返します。
    注: 最適化のため、また不要なロックを避けるため、レコードは読み込みのみモードでロードされます。しかしながら、テーブルは読み書き可能なモードなので、LOAD RECORD コマンドを呼び出せば、レコードを強制的に読み書きモードでロードすることができます。
  • メソッドがテーブル(datastore class)に対して適用されるとき、カレントセレクションもカレントレコードも、どちら何も変更されません。

メソッドを4D Mobileを通して実行した後、4Dのコンテキストは以下の様にリセットされることに注意して下さい:

  • セレクションは0に減らされます。
  • レコードはスタックが解除され、アンロードされます。
  • プロセスにおけるローカルなセレクションとセットは破壊されます。
  • メソッド実行中に開かれたトランザクションは全てキャンセルされます。
  • フィールド、クエリデスティネーションまたはサーバー上のクエリの自動リレーションは全てリセットされます。
  • 印刷ジョブはキャンセルされます。
  • ウィンドウは閉じられます。
  • SQL、PHP、またはHTTP 接続も閉じられます。

4Dメソッドのスコープは、それを呼び出すWakandaオブジェクトの方と対応し、合致している必要があります。そうでない場合には "TypeError: 'undefined' is not a function" というエラーがWakandaによって返されます。

例えば、以下のコードによって記述された"getcursel"という4Dメソッドについて考えてみましょう:

 $0:=Records in selection([Table_1])

Wakanda側に以下のメソッドが実行されていると仮定します。:

var tt = ds.Table_1.query("Field_2 = 'a*'").getcursel();

query() メソッドはコレクションを返します。もし getcursel メソッドのスコープが「カレントレコード」に設定されていた場合、Wakandaは以下のエラーを返します:
TypeError: 'undefined' is not a function (evaluating 'ds.Table_1.query("Field_2 = 'a*'").getcursel()')".

 
 

 
プロパティ 

プロダクト: 4D
テーマ: 4Dテーブルとメソッドの呼び出し

 
履歴 

 
ARTICLE USAGE

4D Mobile ( 4D v16)