互換性設定と、アプリケーションのパフォーマンスと動作を劇的に改善するのに役立つ秘密のオプションに関する一連のブログ記事を開始しました。最初の投稿は、QUERY BY FORMULA についてでした。
互換性シリーズの第二弾は、ビジネスアプリケーションの国際的な使用についてです。これは、他の国に販売すること、あるいは、他の国から同僚が来てしばらく仕事をするが、その国のシステムを使用することを意味します。
もしあなたが「数値が>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><
数字がどのように表示されるかわからない?データベースの設定を確認してください。
上記のオプションがすでに有効になっているか、まったく表示されていない場合(4D v11以降で作成されたアプリケーション)、すべてうまくいっているので、これ以上読む必要はありません。
どのように動作させるか
4D開発者は、国際的な使用を想定して設計しますが、エンドユーザーは、どのような地域設定でも、クライアント/サーバーモードでの混合設定でも、使用することができます。
例ドイツでは、”###,##0.00″ が “1.234,56” として、アメリカでは “1,234.56” として、スイスでは “1’234.56” として表示されます。
かつての仕組み(互換モード)
4D開発者は、ある地域(通常はローカル)の設定に合わせて設計し、エンドユーザーは全く同じ設定にする必要がありました。
例「ドイツでは「##,##0.00」、アメリカでは「1,234.56」、スイスでは「>>>>>>」と表示されます。
現在の仕組み(Developing internationalLY)
最近の4Dバージョンでは、4Dメソッドのすべてが国際的なフォーマットになっている。
- 定数の数値は、国際的な小数点の区切り記号であるドットを使用して定義されます(例えば、5.3など)。
- 日付は、国際的な “yyyy-mm-dd”(2018-07-31)形式で定義されています。デリミターとして使用される”-“と、年/月/日の順序に注意してください。
- 時刻は24時間表示で定義されています。
値が表示(またはフォーマット)されると同時に、現在の地域設定が使用されます。
例えば、私はこのブログ記事をドイツのシステムで書いているので、String(!2018-07-31!)の結果は「2018.07.31」、String(5.3)の結果は「5,3」となります。地域設定が異なると結果が異なる – 同じアプリケーションの場合。
これは長年の開発者にとって発想の転換が必要ですが、結果として余分な努力をすることなく国際的に動作するアプリケーションを手に入れることができます。
移行のヒント
地域設定の動作を変更するには、地域設定がハードコーディングされているすべての場所を変更する必要があります。これはほとんど不可能なミッションかもしれません。このため、互換性オプションが存在し、デフォルトで「互換性」に設定されているのです。
しかし、獲得するものがたくさんあるので、実際にどれくらい難しいのか見てみましょう。
メソッド内のハードコードされた定数
良いニュースです。あなたがすることは何もありません。v2004で4Dメソッドを作り、$i:=5,3(ドイツ方式)と書いて、4D v16以降でそのメソッドを開くと、$i:=5.3が表示されるのです。
日付や時間でも同じです。問題は解決しました。
数値フォーマットの使用 – フィルター
4Dでは、メソッドやフォームにハードコーディングされたフォーマット(例えば、”###.##0,00“)が認められていますが、私たちは20年以上にわたって、それを避けるようにアドバイスしてきました。
もし、あなたがどこでもフィルターを使っているなら、それを変更するのは非常に簡単です。5個や10個のフィルターがあるかもしれませんが、おそらく20個以上にはならないでしょう。そこで、フィルターをローカルフォーマットからインターナショナルフォーマットに変更する必要があります(例えば、小数点にドット(”.”)を使用し、千の区切りにカンマ(”,”)を使用)。
それが終わったら、互換性チェックボックスを有効にして完了です。
メソッドの中にあるハードコードされたフィルタを見つける方法
このステップは、上で説明したものほど簡単ではありません。アプリケーションでフィルタを使っていても、場合によってはフィルタをスキップして「クイック&ダーティ」なコードを作っていないかどうかわからないことがあります。
例を挙げます。
$text:= (5300; "### ##0")String // to be used in Sweden with a space for thousands
どうやって探すの?
それほど多くの異なるフォーマットがあるわけではないので、シンプルに!?
##0 ^^^0 0,00 ***0が典型的なフォーマットです。必要なのはフォーマットの一部分(できるだけユニークなもの)だけです。もし、あなたのメソッドにこれらのテキスト断片があったら、ハードコーディングされている可能性がかなり高いです。デザインモードの検索ツールを使って、これらのコードの断片を検索し、その結果をブラウズしてください。
もし、いくつかしか見つからなかったら、手作業でそれらを調べ、次のようなフィルターで置き換えます。
$text:= (5300;"|mynumberformat")String // vertical line before filter name
たくさん見つかった場合は、手動で検索し、検索条件が正しいかどうかを確認します。必要なら微調整をする。
多少手間がかかるかもしれませんが、ほとんどのケースに対応できるパターンを定義できるようになります。このパターンを使えば、自動的に「検索と置換」ができるようになるはずです。
必要な労力にもよりますが、あなたのコードを実行して検索するメソッドを書くこともできます。 METHOD GET CODEと METHOD SET CODEコマンドを使って、あなたのコードを検索するメソッドを書くこともできます。
フォームにハードコードされたフィルタをすべて見つける方法
4Dはフォームの検索オプションを提供していないので、フォームの中にハードコードされたフォーマットがないか自動的にチェックすることはできません。しかし、私たちは開発者なので、自分でそれを行うことができます.
まず、すべてのテーブルのすべてのフォームのリストを取得し、それらをループする必要があります。次に、各フォームについて、すべてのオブジェクトのリストを取得し、それらについてもループさせます。最後に、各オブジェクトについて、数値形式が使われているかどうかを調べ、使われている場合は、それがハードコーディングされているかどうかを調べます。もしそうであれば、それを報告します。
良い点:このコードは、デザインモードでのメソッドの検索オプションと同様のリストを提供します。悪い点: 各結果を開き、手作業で書式を指定する必要があるので、時間がかかるかもしれません。
$report
:=""
For ($table;0;Get last table number)
ARRAY TEXT ($arr_Names;0)
If ($table=0) // project forms
FORM GET NAMES ($arr_Names)
Else If (Is table number valid($table) )
FORM GET NAMES (Table($table)->;$arr_Names)
End if
End if
For ElseTable
($forms;1;Size of array($arr_Names))
If ($table=0)
FORM LOAD ($arr_Names{$forms})
FORM LOAD ($table)->;$arr_Names{$forms})
End if FORM GET OBJECTS (arrObjNames;arrObjPtrs;arrPages;Form all pages)
For ($i;1;Size of array(arrObjNames) )
$type :=OBJECT Get type(*;arrObjNames{$i})
If (($type=Object type text input) | ($type=Object type listbox column)\
| ($type=Object type listbox footer) | ($type=Object type static text))
$format :=OBJECT Get format(*;arrObjNames{$i})
If (($format#"") & (($format#"|@")))
If (($format="@,@")|($format="@.@"))
$report :=$report+$arr_Names{$forms}+char(9)+"object name:" +arrObjNames{$i}+char(9)+"format:End if
"+$format+char(13)
End if
End if
End for FORM UNLOAD
End for End for
If ($report="")
$report :="All is well!"
End if
ALERT ($report)
SET TEXT TO PASTEBOARD ($report)
操作順序
現在のアプリケーションで
- フィルタを確認し、新しいフィルタを作成します。
- すべてのフィルターで地域設定を使い続ける…まだ変更しない
- すべてのメソッドとフォームでフィルタを使用するように変更する
- デプロイする
同時に、アプリケーションのコピーも用意します。
- 社内で、または選ばれたベータテスターのために。
- 国際的なフォーマットを使用するようにフィルタを変更する
- 互換性チェックボックスを有効にする
- 数週間、テスターのためにコンパイルとデプロイを行う
- すべてのテストと確認が終わったら、全員に配備する (既存のものを置き換える)
関連コマンド
ほぼすべての場合において、地域設定に従った数字の書式設定が必要ですが、いくつかの例外があります。例えば、データをインポートまたはエクスポートする際に異なるルールを使用する場合があります。これは、誰がそのデータを使用するか、または誰がそのデータを提供したかに依存します。また、XMLやJSON形式のデータでは、常にドット(“.”)を小数点の区切り文字として使用します。
あなたの仕事は、このような例外を処理することだけであり、通常の動作ではありません。
世界中どこでも、ユーザーの地域設定に関係なく、小数点の区切り文字としてドットを使用して数値を文字列に変換するには、以下を使用します。
String($mynumber; "&xml")
注:XMLという形式であっても、ドットを小数点以下の区切り文字として使いたい場合には、どのようなユースケースにも対応可能です。
一方、文字列をパースするときに、その文字列が小数点の区切り文字としてドットを使っていることがわかっている場合(XMLやJSON文書から取り込んだため)には、次のように使います。
Num($mystring;".")
まとめ
古い、確立されたアプリケーションでは、多少の作業が必要かもしれませんが、結果として、正しい数値フォーマットを持つアプリケーションをどこにでもデプロイすることができるようになります。これにより、テクニカルサポートの負担が軽減され、顧客も助かるでしょう。これはWin-Winの関係です。