SET TABLE TITLESコマンドを使用すれば、アプリケーションモードにおいて、標準の4Dダイアログボックスに現れるデータベーステーブルを一部隠したり、表示名称を変更したり、並び順を変えたりできます (ただしこれらのダイアログが4Dランゲージコマンドから呼び出された場合)。例えばこのコマンドを使用すれば、アプリケーションモードでのクエリエディターのテーブル表示を変更できます。
さらにこのコマンドを使用すると、動作中にフォーム上のテーブル名のラベルを変更することが可能です。これには、ダイナミックな名前を使用します。ダイナミックなテーブル名とフィールド名の挿入についての詳細は、4Dデザインリファレンスマニュアルのスタティックテキスト中で参照を使用するを参照してください。
引数 tableTitles と tableNumbers 配列は同期させる必要があります。配列 tableTitles には、表示させたいテーブルの名前を渡します。
ある特定のテーブルを表示したくない場合には、そのテーブル名または新しく付けたタイトルを、配列含めないようにします。テーブルはこの配列に指定した順序で表示されます。
配列 tableNumbers の各要素には、配列 tableTitles にある同じ要素の数値に渡したテーブル名または新しいタイトルに対応する実際のテーブル番号を渡します。
例えば、テーブルA、B、Cで構成されるデータベースがあり、テーブルはこの順序で作成されたとします。表示の際には、これらのテーブルをX、Y、Zという名前にし、さらにテーブルBは表示したくないとします。最終的に、ZとXを、この順序で表示することにします。この場合、配列 tableTitles の2つの要素としてZとXを渡し、配列 tableNumbers の2つの要素として3と1を渡します。
オプションの * 引数は、カスタマイズした名前を4Dフォーミュラで使用するかを指定します。
- 省略した場合カスタマイズした名前は使用されず、デフォルトで実際のテーブル名が使用されます。ランゲージインタープリターはカスタム名を処理しないため、カスタム名を利用することは、テーブルの命名に多大な自由度を与えます。
- * 引数を渡した場合は、このコマンドで指定した名前を4Dフォーミュラで使用されます。ただし、4D ランゲージインタプリタが禁止している文字(例えば、-?*!)をカスタム名に含めることはできません。例えばフォーミュラで"Rate_in_%"のような名前を使用することはできません (詳細は識別子を参照)。
Note: フォーミュラエディタレベルでは、* 引数を省略してコマンドを呼び出しても、以前に * 引数付きでコマンドを呼び出したときの設定を変更しません。言い換えれば、フォーミュラエディタは常に、最後に * 引数付きで呼び出された設定が有効となります。
SET TABLE TITLES コマンドは、データベースの実際のストラクチャを変更するわけではありません。ランゲージコマンド経由で標準の4Dダイアログボックスやダイナミックな名前を使用しているフォームを呼び出したときのみ影響します (デザインモードにおいて、エディタまたはフォームがメニューコマンドから呼び出された際、データベースの実際のストラクチャが表示されます) 。 SET TABLE TITLESコマンドの有効範囲は、そのワークセッションです。クライアント/サーバにおける利点の1つは、複数の4Dクライアントステーションがそれぞれ異なる見方でデータベースを同時に "見る" ことができる点です。SET TABLE TITLES コマンドは、何度でも呼び出せます。
SET TABLE TITLESコマンドは、以下のような場合に使用します。
- データベースを動的にローカライズする。
- テーブル表示を、実際のデータベース定義に関係なく、独自のものとする。
- テーブル表示を、ユーザー固有のものや権限によるものとする。
注:
- SET TABLE TITLESコマンドはフィールドの非表示属性を上書きしません。データベースの設計レベルでテーブルが非表示として設定されている場合、SET TABLE TITLESコマンドへの呼び出しにそのテーブルを指定しても、アプリケーションモードにおいてテーブルは表示されません。
- プラグインは常にコマンドによって指定された仮想ストラクチャへアクセスします。
各国で販売する予定の4Dアプリケーションを構築しているとします。この場合、ローカライズの問題を慎重に考慮する必要があります。アプリケーションモードで表示される標準の4Dダイアログボックスとダイナミックな名前を用いたフォームに注意すれば、[Translations] テーブルといくつかのプロジェクトメソッドを使用して、必要なだけ各国向けにローカライズされたフィールドを作成し、使用することによって、ローカライズのニーズに対応できます。
データベースに以下のテーブルを追加します。
次に、以下に示した
TRANSLATE TABLES AND FIELDS プロジェクトメソッドを作成します。このメソッドはデータベースの実際のストラクチャをブラウズし、引数として渡される言語に対応するローカライズ版の作成に必要なすべての
[Translations] レコードを作成します。
C_TEXT($1)
C_LONGINT($vlTable;$vlField)
C_TEXT($Language)
$Language:=$1
For($vlTable;1;Get last table number)
If($vlTable#((->[Translations])))
QUERY([Translations];[Translations]LanguageCode=$Language;*)
QUERY([Translations]; & ;[Translations]TableID=$vlTable;*)
QUERY([Translations]; & ;[Translations]FieldID=0)
If(Is table number valid($vlTable))
If(Records in selection([Translations])=0)
CREATE RECORD([Translations])
[Translations]LanguageCode:=$Language
[Translations]TableID:=$vlTable
[Translations]FieldID:=0
[Translations]Translation:=Table name($vlTable)+" in "+$Language
SAVE RECORD([Translations])
End if
For($vlField;1;Get last field number($vlTable))
QUERY([Translations];[Translations]LanguageCode=$Language;*)
QUERY([Translations]; & ;[Translations]TableID=$vlTable;*)
QUERY([Translations]; & ;[Translations]FieldID=$vlField)
If(Is field number valid($vlTable;$vlField))
If(Records in selection([Translations])=0)
CREATE RECORD([Translations])
[Translations]LanguageCode:=$Language
[Translations]TableID:=$vlTable
[Translations]FieldID:=$vlField
[Translations]Translation:=Field name($vlTable;$vlField)+" in "+$Language
SAVE RECORD([Translations])
End if
Else
If(Records in selection([Translations])#0)
DELETE RECORD([Translations])
End if
End if
End for
Else
If(Records in selection([Translations])#0)
DELETE RECORD([Translations])
End if
End if
End if
End for
この時点で以下の行を実行すれば、テーブルタイトルとフィールドタイトルのスペイン語のローカライズ版に必要なすべてのレコードが作成されます。
TRANSLATE TABLES AND FIELDS("Spanish")
この呼び出しの実行後、新しく作成されたレコードのそれぞれに対して
[Translations]Translated Name を入力できます。
最後に、スペイン語のローカライズ版を使用して、データベースの標準な4Dダイアログボックスまたはダイナミックなタイトル付きのフォーム表示します。その際、
LOCALIZED TABLES AND FIELDS プロジェクトメソッドを使用して、以下の行を実行します。
LOCALIZED TABLES AND FIELDS("Spanish")
C_TEXT($1)
C_LONGINT($vlTable;$vlField)
C_TEXT($Language)
C_LONGINT($vlTableNum;$vlFieldNum)
$Language:=$1
ARRAY TEXT($asNames;0)
ARRAY INTEGER($aiNumbers;0)
QUERY([Translations];[Translations]LanguageCode=$Language;*)
QUERY([Translations]; & ;[Translations]FieldID=0)
SELECTION TO ARRAY([Translations]Translation;$asNames;[Translations]TableID;$aiNumbers)
SET TABLE TITLES($asNames;$aiNumbers)
$vlTableNum:=Get last table number
For($vlTable;1;$vlTableNum)
If(Is table number valid($vlTable))
QUERY([Translations];[Translations]LanguageCode=$Language;*)
QUERY([Translations]; & ;[Translations]TableID=$vlTable;*)
QUERY([Translations]; & ;[Translations]FieldID#0)
SELECTION TO ARRAY([Translations]Translation;$asNames;[Translations]FieldID;$aiNumbers)
SET FIELD TITLES(Table($vlTable)->;$asNames;$aiNumbers)
End if
End for
コードを修正または再編集せずに、新しいローカライズ版をデータベースに追加することができます。