ブログ

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

Tech Tips

日付2014/05/21

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

4DでのURLのエンコードとデコード
4Dログインシステムを使用せずに4Dパスワードシステムを有効化する
クリック可能なフィールドと変数
ODBCを使用している際のMS Error9900"システム リソースの超過"
SQLにてUPDATEとOFFSETを使用する
4Dエクスプローラーを使用してプラグインのバージョン番号をチェックする

4DでのURLのエンコードとデコード

4Dには、URLのエンコードとデコードをするためのコマンドがありません。しかしPHP Executeコマンドでは、以下のメソッドにおいて"rawurencode" と "rawurldecode"のコマンドを使用する事ができます。

"rawurlencode" PHP メソッドを使用したURLエンコードのコードスナップショットです:

//名前: rawurlencode
//説明: URLの文字列を受け取り、URLエンコードした文字列を返します。

C_TEXT($odata;$0;$1)

$result:= PHP Execute("";"rawurlencode";$odata;$1) // URL エンコーディング

//Put back characters for URL
$odata:= Replace string($odata;"%3b";";") // ; セミコロン
$odata:= Replace string($odata;"%2f";"/") // / バックスラッシュ
$odata:= Replace string($odata;"%3f";"?") // ? クエスチョンマーク
$odata:= Replace string($odata;"%3a";":") // : コロン
$odata:= Replace string($odata;"%40";"@") // @ アットマーク
$odata:= Replace string($odata;"%26";"&") // & アンパサンド
$odata:= Replace string($odata;"%3d";"=") // = イコール
$odata:= Replace string($odata;"%2b";"+") // + プラス
$odata:= Replace string($odata;"%2c";",") // , カンマ
$odata:= Replace string($odata;"%24";"$") // $ ドル
$0:= $odata

使用例 $url_encoded:= rawurlencode ("http://www.4d.com.product line")

"rawurldecode" PHP メソッドを使用したURLデコードのコードスナップショットです:

//名前: rawurldecode
//説明: エンコードされたURL文字列を受け取り、デコードされたURL文字列を返します。

C_TEXT($0;$1)

$result2:= PHP Execute("";"rawurldecode";$0;$1) // URL デコード

使用例 $url_decoded:= rawurldecode ("http://www.4d.com.product%20line")

4Dログインシステムを使用せずに4Dパスワードシステムを有効化する

マルチユーザーシステムにおいて4Dパスワードシステムを有効化することは重要です。何故なら、有効化されていない場合、システムに接続するユーザーは4Dエンジンにおいては全てDesignerとして認識されてしまうからです。Designerには、アプリケーションの開発者がエンドユーザーにはアクセスしてほしくないところまでアクセスできる権限があります。4Dパスワードシステムを有効化することにより、プラグインへのアクセスを禁止したり、バックアップダイアログのキャンセルボタンを禁止したりといった、他にはない機能へアクセスできるようになります。

デベロッパの中には、4Dパスワードシステムを有効化するのをためらう人もいるかもしれません。例えば、カスタムのログインシステムが既に実装されている場合などです。ところがあまり知られてないかもしれませんが、実は4Dログインシステムを使用せずに4Dパスワードシステムを有効化する方法があります。

ここで重要なのは、パスワードシステムを有効化するためにまず最初にDesignerのパスワードを設定する事です。この際Administratorのパスワードも同時に設定してしまうのが賢明ですが、これは必須ではありません。次のステップは、ログインする通常のユーザー(クライアント)が使用する新しいユーザーを作成する事です。新しいユーザーにはパスワードは設定せず、4Dデータベース設定のセキュリティタブにおいて「デフォルトユーザー」として定義します。

以下のスクリーンショットでは、'Plain User'という名前のユーザーがデフォルトのユーザーとして選択されています:

この方法なら、システムにログインするデフォルトのユーザーは、デフォルトユーザーとして定義された'Plain User'としてログインします。

デベロッパがカスタムのログインフォームを作成していたとしても、この手法は有効です。大きな違いは、4Dエンジンは接続したクライアントをDesignerではなく、データベース設定で定義されたユーザーとして認識するようになるということです。

デベロッパがストラクチャにDesignerとしてアクセスする必要が出てきた場合、4DLinkファイルにDesignerとして自動的にログインするように定義されたDesignerユーザーの情報を渡して使用するか、データベース開始時にSHIFTキーを押して4Dログインダイアログボックスを表示させ、Designerユーザーを選択してログインして下さい。

クリック可能なフィールドと変数

v14以前のヴァージョンの4Dでは、テキスト、時間、日付、そして数値型のフィールドと変数はクリック可能なオブジェクトではありませんでした。v14では、これらの型のフィールドはクリック可能となり、On Clicked イベントとOn Double Clicked イベントに反応します。

フォーム内にてクリック可能なフィールドまたは変数を作成するためには、まず最初にそのフィールドまたは変数のOn Clickedイベントがチェックされていることを確認しましょう。これらのプロパティがチェックされたら、フィールドまたは変数に対してメソッドを作成します。以下のコードを使用して下さい。

Case of
: (Form event=On Clicked)
// ここにコードを書く
: (Form event=On Double Clicked)
// ここにコードを書く
End case

ODBCを使用している際のMS Error9900"システム リソースの超過"

MySQL、PostgreSQL、MS SQL等の外部データベースへと正常にODBC接続をしていた4Dデータベースが、ODBCクエリを実行したときに、以下の様なエラーが起きることがあります。

最近のMicrosoftのシステムアップデートまたはパッチにより、アプリケーションがリクエストできるシステムリソースのサイズのデフォルトの上限が制限されてしまいました。このエラーの原因は、多くの場合4Dデータベースのメモリー設定にあります。

このエラーダイアログと、他の類似したOSからのダイアログが意味するところは、4Dによってリクエストされたメモリ量がOSが供給できる量をオーバーしている、ということです。この場合、ODBCドライバーは4Dにとってのプロキシとしての役割を果たしていますが、メモリリクエスト元は4Dです。

4Dがアクセスできるメモリの量は、4Dによってではなく、OSによって制限されています。メモリ管理を扱うのはOSだからです。この時点での解決策としては、4Dがキャッシュやスタックのために要求しているメモリの量を調べ、それを適宜調整するという事です。

4Dのキャッシュとスタックサイズを設定するためのヘルプは、4DKnowledgebaseにたくさんあります。

関連項目:

Tech Tip: Maximum Available Cache for 4D
Tech Note: Understanding the 4D v12 Cache
Tech Tip: How much memory can 4D use?
Tech Tip: Process Stack Size: One size does not fit all
Tech Tip: Changing 4D Server stack sizes in 4D v11 SQL

SQLにてUPDATEとOFFSETを使用する

SQLにおけるUPDATE節は、データの特定のエリアを指定するために、通常SETとWHERE節を使用します。しかしUPDATE内にてOFFSET節を使用することもできます。これは、WHERE節においてSELECTコマンドを使用することによって可能になります。

以下がSQL宣言の例です:

Begin SQL
UPDATE Table_1 SET Field_1 = 'D'
WHERE
(row_ID in
(SELECT row_ID FROM Table_1 WHERE Field_1 <> 'D' OFFSET 1)
)
End SQL

4Dエクスプローラーを使用してプラグインのバージョン番号をチェックする

4Dエクスプローラーを使用して、プラグインのバージョンをチェックすることは有用です。データベースはアップグレードされたものの、プラグインは取り残されてしまっていたり、最悪の場合プラグインが全て使用できなくなっていることも有り得ます。

以下のスクリーンショットには、v13.4のデータベースにおいて'4D for OCI'プラグインのバージョンがv12.6であることが見て取れます:

無効化されたプラグインがあると、その無効化されたプラグインからコマンドを実行しようとした場合に-9949エラー「ライセンスまたは権限エラー」が出ることがあります:

この場合には、デベロッパはプラグインを互換性のあるバージョンまでアップグレードしなければなりません。