ブログ

ご注意:
この情報は過去に書かれたブログ記事のキャッシュになります。最新の情報ではありませんのでご注意ください。
また、公開当時のキャッシュされたテキストのみを読めるようにした内容になっております。 公開当時の画像やデザイン情報がありませんので、デザイン上読みにくい部分がありますことをご了承ください。 なお、最新のブログはGitHubにて公開しています。

Tech Tips

日付2014/04/18

この記事では、4Dの使用に役立つTips(小技)を紹介してきます。

インデックスがない重複不可のフィールドに対してインデックスを作成するコード
「あなたのパスワードではこのフォームを使用できません。」
4D v14のクエリエディターは".4df"をJSONで生成する
4D Serverで、互換性のないプラグインがエントリーポイントのエラー
プライマリーキーマネージャーによるキーの割当は、一度しか行われない
外部ファイルに基づくInformation Component startup
ストラクチャーエディターに行かずにフィールドの定義を知る方法

インデックスがない重複不可のフィールドに対してインデックスを作成するコード

以下のコードは、重複不可のフィールドでインデックスがないものを探し、それらに対してインデックスを作成します。

C_LONGINT($maxTableNumber_l;$currentTable_l)
C_LONGINT($maxFieldCount_l;$currentField_l)
C_LONGINT($dontCare_l) // GET FIELD PROPERTIESの使用されてない値を受け取る
C_BOOLEAN($dontCare_f;$isIndexed_f;$isUnique_f)
C_TEXT($logHeader_t;$logRecord_t;$logfile_t)
C_TEXT($delim_t;$lf_t)
C_TIME($logfile_h)
C_TEXT($tableName_t;$fieldName_t;$note_t)

$maxTableNumber_l:=Get last table number

For ($currentTable_l;1;$maxTableNumber_l)
If (Is table number valid($currentTable_l))
$maxFieldCount_l:=Get last field number(Table($currentTable_l))
For ($currentField_l;1;$maxFieldCount_l)
If (Is field number valid($currentTable_l;$currentField_l))

// 以下の2行を分割するラインブレークに注意して下さい。
// メソッド内では一つのステートメントとして扱われます。
GET FIELD PROPERTIES($currentTable_l;$currentField_l;$dontCare_l;\
$dontCare_l;$isIndexed_f;$isUnique_f;$dontCare_f)

If (($isUnique_f) & (Not($isIndexed_f)))

$tablePtr:=Table($currentTable_l)
$fieldPtr:=Field($currentTable_l;$currentField_l)
$tableName_t:=Table name($tablePtr)
$fieldName_t:=Field name($fieldPtr)
$indexName_t:="["+$tableName_t+"]"+$fieldName_t+" indexed for uniqueness (kb#77023)"
ARRAY POINTER($fieldsArray_p;1)
$fieldsArray_p{1}:=$fieldPtr
CREATE INDEX($tablePtr->;$fieldsArray_p;Standard BTree Index;$indexName_t;*)

End if
End if
End for
End if
End for

このTipsは4D v14に引き上げられたデータベースに関しては必要ありません。なぜなら4D v14では重複不可のフィールドに対しては自動的にインデックスが作成されるからです。このプロセスはデータベースの開始時に完了されます(言い換えると、データベースの再起動は重複不可のプロパティを設定したあとに実行されるべきです)。

「あなたのパスワードではこのフォームを使用できません。」

以下のメッセージは、あるフォームが、そのフォームへのアクセス権のないユーザーのセッションにおいて開かれようとしたときに表示されます。

以下のコマンドなどは、フォームを開くトリガーとなります:

DIALOG
MODIFY RECORD
MODIFY SELECTION

カレントユーザーにアクセス権を持っていないフォームのプロセス中にform get/setコマンドが呼ばれた場合なども、このメッセージが生成されます。例えば、FORM SET INPUT と FORM SET OUTPUT コマンドなどはこのエラーメッセージを表示させることがあります。

フォームのアクセス権を編集するには、エクスプローラーでフォームを右クリックし、フォームプロパティを選択して下さい。そこから、アクセス権を適切なグループへと設定します。

4D v14のクエリエディターは".4df"をJSONで生成する

v13以前のクエリエディターでクエリを保存しようとした場合、特殊なクエリフォーマットに保存していました。そのため、この".4df"ファイルの設定は簡単には編集できませんでした。v14では、保存されたクエリはJSONフォーマットで保存されます。以下の画像はその例を表しています。

新しいクエリエディターファイルの利点:

JSONのクエリをインポートすることができます。

特定の検索のためのクエリエディターファイルをビルド・編集することができます。

テキストエディタでファイルをビルドすることができます。

アプリケーションを通してクエリシステムを作成することができます。

他のプログラミング環境でも使用することができます。

4D Serverで、互換性のないプラグインがエントリーポイントのエラー

v14以前で使用されているプラグインは、4D Serverにおいて、互換性の問題を起こし得ることがあります。クライアントがサーバーに接続したとき、以下のエラーメッセージが表示されることがあります。

"The ordinal # could not be located in the dynamic link library ASINTPPC.dll"

注:# はウィンドウに表示されるエラー番号のことです。

エラーを直すためには以下の点を見直しましょう:

プラグインがv14と互換性があるかどうかをチェックしましょう。

プラグインが登録されているかチェックしましょう。

プラグインがアップデートされているかチェックしましょう。

v14にアップグレードする過程で、全てのプラグインを一旦外して、一つずつ互換性があるかどうかを試しましょう。

プライマリーキーマネージャーによるキーの割当は、一度しか行われない

プライマリーキーマネージャーとは、「特にジャーナルをとっているデータベースにおいて、プライマリーキーがないテーブルの存在に起因するエラーの解消を手助けするためのアシスタント」です。プライマリーキーマネージャーを通して一度プライマリーキーが設定してしまうと、それを再度やりなおすことはできません。プライマリーキーマネージャーの意図するところは、テーブルがプライマリーキーを持っていない旧バージョンのデータベースからの変換を手助けするということです。テーブルのプライマリーキーを変更するためには、ユーザーは自分でストラクチャーエディターに行く必要があります。
プライマリーキーは、フォーカスをテーブルにあてて右クリック(Macの場合はコンテキストクリック)することで削除することができます。

また、プライマリーキーは、フィールドを選択して右クリック(Macの場合はコンテキストクリック)することで生成することもできます。

外部ファイルに基づくInformation Component startup

Information Componentによって生成されたレポートは、問題を特定するためにはとても便利です。レポートはだいたい5分毎に生成され、稼働時間中のfolder_reportsを分析することによって使用傾向を簡単に取得することもできます。
以下のサンプルコードをOn Server Startupメソッドにて使用することで、アプリケーションが開始されたときにログが有効化され、ログを確実に手元に残しておくことができます。

// information conponentを有効化して5分ごとにレポートのログをとる
ARRAY TEXT($at_Components;0)
COMPONENT LIST($at_Components)
If (Find in array($at_Components;"4D_Info_Report@")>0)
// 5分ごとにレポートを作成するストアドプロシージャーを開始
EXECUTE METHOD("aa4D_NP_Schedule_Reports_Server";*;5;0)
End if
このサンプルコードは、最初にコンポーネントリストをチェックし、存在するコンポーネントのコンポーネントメソッドのみ実行するので便利です。これにより、デベロッパーは必要のないコンポーネントを削除し、必要になったコンポーネントを追加する、といったことができるようになります。

もう一つのオプションは、ログのプロセスを開始する前にファイルの存在をデータベーススタートアップメソッドにチェックさせるということです。これにより、ファイルの有無に基づいてログを有効化できるということです。

以下のサンプルコードは'enable_logging'という名前のファイルをストラクチャーファイルのとなりにあるかどうかを探し、ファイルが存在する場合にのみログを有効化するようにします。

// ストラクチャの隣に'enable_logging'ファイルがあるかどうかをチェック
If (Test path name(Get 4D folder(Database folder)+"enable_logging")=Is a document)
// ストラクチャの隣に'enable_logging'というファイルを発見
// information componentを有効化し、5分ごとにレポートのログをとる
ARRAY TEXT($at_Components;0)
COMPONENT LIST($at_Components)
If (Find in array($at_Components;"4D_Info_Report@")>0)
// 5分ごとにレポートを作成するストアドプロシージャーを開始
EXECUTE METHOD("aa4D_NP_Schedule_Reports_Server";*;5;0)
End if
End if

ストラクチャーエディターに行かずにフィールドの定義を知る方法

メソッドエディターにて、フィールド上にマウスポインタをホバリングさせると、フィールドの定義済がヘルプTipとして表示されます(以下の画像のようにフィールドを最初に選択する必要はありません)。

マウスを止めて数秒後、以下の画像のようにそのテーブルがどのように定義されたかのヒントが表示されます。

以下の画像は、倍調整数(4バイト)と64ビット整数(8バイト)として定義されたフィールドのヒントの違いを表しています。