v19では,Num
で数字を数値に変換した場合,5
で終わる実数の丸め処理が以前のバージョンとは違います。
$str1:="1210.9338094735" //→1210.933809474
$str2:="12109.338094735" //→12109.33809474
$str1:="1210.9338094735" //→1210.933809474
$str2:="12109.338094735" //→12109.33809473
これは仕様です。4Dは内部的にシステムAPIをコールしており,Microsoftの仕様に準拠しています。
Windows 10 バージョン 2004 (ビルド 19041) 以降の
printf
ファミリの関数では,丸め処理の IEEE 754 の規則に従って,正確に表現可能な浮動小数点数が出力されます。 以前のバージョンの Windows では,”5” で終わる正確に表現可能な浮動小数点数は常に切り上げられていました。 IEEE 754 では,最も近い偶数に丸める (“銀行型丸め” とも呼ばれます) 必要があることが示されています。
4D View Proコンポーネントは,アプリケーション内部にインストールされています。4D ViewPro.4dbase をプロジェクトのComponents フォルダーにインストールすることはサポートの対象外となります。理論的には動作するはずですが,JavaScriptで開発されたSpreadJSアプリケーションとC++で開発された4Dは内部的に協働するようになっており,両者のバージョンは厳密に合致していなければなりません。
ORDAデータクラスのメンバー関数はサーバー側で実行されます(ローカルスコープを設定しなかった場合)。クライアント側でデバッグするのであれば,リモートデバッガの使用を検討してください。v19以降,サーバー側のメソッドをクライアント側でデバッグできるようになりました。
ON EVENT CALL
でインストールしたイベントハンドラーメソッドは,入力されたキーの文字コードをシステム変数KeyCode で取得することができます。モディファイヤーはシステム変数Modifiers で取得することができます。
たとえば,JISキー配列でshift キーを押しながら]
キーを入力した場合,KeyCode には]
のコードである0x5D
つまり93
ではなく,}
のコードである0x7D
つまり125
が返されます。control キーを押しながら]
キーを入力した場合,制御文字のGroup Separator に相当する0x1D
つまり29
が返されます。これは仕様です。
コマンドから返される文字コードはASCIIの基づいていますが,制御コードはASCIIに基づいておらず,4Dの独自コードが設定されています。たとえば,前述した0x1D
つまり29
は右矢印キーのコードと同等です。
https://doc.4d.com/4Dv19/4D/19.6/Function-Key-Codes.300-6269211.ja.html
データベースパラメーター54
つまりIdle connections timeout は,DB4DおよびSQLに対する接続(デフォルトでTCPポート番号19812
および19814
)のアイドル時間タイムアウトを設定するものです。設定は,ネットワーク機器が無活動のソケットを閉じてしまう前にアプリケーション側でソケットを閉じてセッションを再開できるようにする上で有効です。v11以降,4Dのクライアント/サーバー通信はアイドル時間に完全に無活動となるため,こうした措置をとることが必要になりました。
ドキュメントに記述されているように,このパラメーターはクライアント側で設定する必要があります。サーバー側で設定しても意味はないことに留意してください。過去のバージョンでは,クライアントとサーバーの両方で設定することが提案されていました。
4DのSQLでは,スカラー列(フィールドまたは変数)とAVG
などのアグリゲート関数をSELECT
文に混ぜることができません。下記のSQLステートメントは,MySQLでは問題なく処理できますが,4Dでは1704
エラーになります。これは仕様です。
SELECT [numField], Count([numField]) FROM [Table_1]
Begin SQL
~End SQL
ブロックに変数名などのトークンを記述する場合,余計な空白を挿入しないように注意してください。INTO :$var
は問題ありませんが,INTO : $var
はコンパイルエラーになります。これは仕様です。
4Dのテキスト型は,値と文字列長の属性を持っているため,通常はC言語で文字列の終わりを示す\0
が値に含まれていてもトランケートされません。しかし,クライアント/サーバー版のORDAは,内部的にREST APIを使用しており,JSON形式でエンティティを表現しているため,\0
以降のテキストが取得できません。これは仕様です。そのようなデータはテキスト型ではなく,BLOB型で管理し,必要に応じてBASE64 ENCODE
でエンコードすることを検討してください。
トランザクション中に「サーバー上で実行メソッド」を呼び出してレコードを更新した場合,トランザクションをキャンセルしてもサーバー上で実行した処理はキャンセルされません。これは仕様です。トランサクションのスコープはプロセスであり,サーバー側のプロセスに効果は及びません。サーバー側の処理をキャンセルしたいのであれば,サーバー側のプロセスでもトランザクションを管理する必要があります。