リストフォーム(Outputフォーム)のデータ書き出しについて
2 posters
リストフォーム(Outputフォーム)のデータ書き出しについて
お世話になります。リストフォーム(Outputフォーム)に表示されているデータを書き出したいのですが、数多く存在するリストフォームに対応できる汎用的なメソッドが作れないか?お知恵を貸して頂ければ幸いです。
もちろんテーブルデータの書き出しだけで良ければエクスポートメニューが使えますし、変数を多用したフォームも1つだけであれば、素直に書き出し処理を作成します。
しかし、リスト表示にはOn Display Detailで結構面倒な計算をして表示している既存多数のフォームで、任意のフォームに書き出し機能を実装したいとき、簡単に組み込むことのできる方法があれば幸せになれるかなぁと思った次第。
1レコードだけを対象にして、FROM Loadを使用すれば、On Display Detailイベントの結果を変数にセットしてくれるのでは?と思いましたが、フォームイベントは稼働しないのか?どうも無理そうでした。別プロセスにセレクション情報を渡してFORM Loadしてもフォームで設定しているプロセス変数は生成されません。
もう一つの方法は、On Display Detailイベントで1行分の書き出しデータを構築するようにしてみましたが、この場合、スクロールが必要な時は最後の行まで表示させる必要が出てきますし、スクロールが不要な場合でも何らかのイベントが発生するよう行選択などのアクションを一手間追加しないと旨く動作してくれません。
後者ば、書き出しボタンを設置してフォームメソッドのOn Display Detailイベントに1行追加するだけで、制約があるものの取り敢えず動作する様になりました。しかし上記のとおりイケテいません。リストボックスではセレクション型も配列型も汎用的に書き出しができて便利なのですが、既存のレイアウトを全てリストボックスに対応させるのも難しいので・・・
以上、よろしくお願いします。
もちろんテーブルデータの書き出しだけで良ければエクスポートメニューが使えますし、変数を多用したフォームも1つだけであれば、素直に書き出し処理を作成します。
しかし、リスト表示にはOn Display Detailで結構面倒な計算をして表示している既存多数のフォームで、任意のフォームに書き出し機能を実装したいとき、簡単に組み込むことのできる方法があれば幸せになれるかなぁと思った次第。
1レコードだけを対象にして、FROM Loadを使用すれば、On Display Detailイベントの結果を変数にセットしてくれるのでは?と思いましたが、フォームイベントは稼働しないのか?どうも無理そうでした。別プロセスにセレクション情報を渡してFORM Loadしてもフォームで設定しているプロセス変数は生成されません。
もう一つの方法は、On Display Detailイベントで1行分の書き出しデータを構築するようにしてみましたが、この場合、スクロールが必要な時は最後の行まで表示させる必要が出てきますし、スクロールが不要な場合でも何らかのイベントが発生するよう行選択などのアクションを一手間追加しないと旨く動作してくれません。
後者ば、書き出しボタンを設置してフォームメソッドのOn Display Detailイベントに1行追加するだけで、制約があるものの取り敢えず動作する様になりました。しかし上記のとおりイケテいません。リストボックスではセレクション型も配列型も汎用的に書き出しができて便利なのですが、既存のレイアウトを全てリストボックスに対応させるのも難しいので・・・
以上、よろしくお願いします。
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: リストフォーム(Outputフォーム)のデータ書き出しについて
XMLプロジェクトをコードで構築してEXPORT DATAするのはどうでしょうか。
https://doc.4d.com/4Dv17/4D/17.2/EXPORT-DATA.301-4387421.ja.html
一回,書き出しダイアログでフォームを使用した書き出しの設定を書き出して,
テキストエディターで開いてみてください。(4siファイル)
<?xml version="1.0" encoding="UTF-8"?>
<settings-import-export char_display_format="decimal" encoding="UTF-8" form_name="Input" format="text" platform="automatic" table_no="1" table_name="Table_1">
<text_settings delimiter_field="9" delimiter_record="13"/>
<xml_settings export_xsl_mode="none"/>
<field field_no="2" kind="alpha" table_no="1"/>
<field field_no="1" kind="int32" table_no="1"/>
</settings-import-export>
など,ヒントがみつかるはずです。
https://doc.4d.com/4Dv17/4D/17.2/EXPORT-DATA.301-4387421.ja.html
一回,書き出しダイアログでフォームを使用した書き出しの設定を書き出して,
テキストエディターで開いてみてください。(4siファイル)
<?xml version="1.0" encoding="UTF-8"?>
<settings-import-export char_display_format="decimal" encoding="UTF-8" form_name="Input" format="text" platform="automatic" table_no="1" table_name="Table_1">
<text_settings delimiter_field="9" delimiter_record="13"/>
<xml_settings export_xsl_mode="none"/>
<field field_no="2" kind="alpha" table_no="1"/>
<field field_no="1" kind="int32" table_no="1"/>
</settings-import-export>
など,ヒントがみつかるはずです。
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: リストフォーム(Outputフォーム)のデータ書き出しについて
いつもお世話になります。
この方法で書き出すことができるのは、レコードに保存されているデータですよね?
それともEXPORT DATAはフォームを指定してたらフォームメソッドを評価してくれるのでしょうか?
例えばレコードには顧客コードが保存されているが、リストフォームには顧客名称が表示されている場合・・・On Display Detailでプロセス変数に評価された結果の名称を入れて、その変数をレイアウトに表示していますが、そちらを動的に取り出しできるようにしたいなぁと考えています。リストボックスの様にフォーミュラ取り出しできてevalできれば良いのですが・・・
miyako wrote:XMLプロジェクトをコードで構築してEXPORT DATAするのはどうでしょうか。
この方法で書き出すことができるのは、レコードに保存されているデータですよね?
それともEXPORT DATAはフォームを指定してたらフォームメソッドを評価してくれるのでしょうか?
例えばレコードには顧客コードが保存されているが、リストフォームには顧客名称が表示されている場合・・・On Display Detailでプロセス変数に評価された結果の名称を入れて、その変数をレイアウトに表示していますが、そちらを動的に取り出しできるようにしたいなぁと考えています。リストボックスの様にフォーミュラ取り出しできてevalできれば良いのですが・・・
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: リストフォーム(Outputフォーム)のデータ書き出しについて
インタープリターならではの方法で解決出来たっぽいのでお知らせ致します。
リストフォーム(Outputフォーム)のメソッドを取り出して後から実行できるように保存しておき、レコード移動する度に実行してプロセス変数を更新させます。ポイントとしてはOn Display Detailで実行されていると思われる部分をそのまま実行できるように書き換えておく事でしょうか。レイアウト上のオブジェクトは、予め全てオブジェクトとして取り出しておいて、ボタン以外の変数やフィールドの内容をGOTO RECORDして取り出します。
既存のリスト表示画面には、メソッド呼び出しボタンを追加設置するだけで、フォーム上のリスト表示されている内容を汎用的に取り出す事ができるようになりました。一寸嬉しい
- Code:
C_TEXT($path;$code)
$path:=METHOD Get path(Path table form;$p->;Current form name) //フォームメソッドをソース取り出し
METHOD GET CODE($path;$code)
$code:=Replace string($code;":=Form event";":=On Display Detail") //変数に代入したフォームイベントをDisplay Detailに
$code:=Replace string($code;"Form event=On Display Detail";"True") //直接参照していたら、常時Trueに変更
$path:=METHOD Get path(Path project method;"後で実行する")
METHOD SET CODE($path;$code) //後で呼び出すプロジェクトメソッドに書き込み。この関係でセマフォ必須となる。
リストフォーム(Outputフォーム)のメソッドを取り出して後から実行できるように保存しておき、レコード移動する度に実行してプロセス変数を更新させます。ポイントとしてはOn Display Detailで実行されていると思われる部分をそのまま実行できるように書き換えておく事でしょうか。レイアウト上のオブジェクトは、予め全てオブジェクトとして取り出しておいて、ボタン以外の変数やフィールドの内容をGOTO RECORDして取り出します。
既存のリスト表示画面には、メソッド呼び出しボタンを追加設置するだけで、フォーム上のリスト表示されている内容を汎用的に取り出す事ができるようになりました。一寸嬉しい
osaru- 投稿数 : 67
登録日 : 2017/08/14
Re: リストフォーム(Outputフォーム)のデータ書き出しについて
その部分だけを抜き出してv17単独稼働できるようにしてみました。
当方ではMacOS9時代から引き継いできた組み込みレイアウト(Outputフォーム)が多用されており、要望が出る都度書き出しプログラム処理を書いていましたが、こちらを使用することで概ねどのレイアウトでもボタン追加だけで機能を実装できるようになりました。
問題としてはフォームメソッドでテーブル指定を省略している場合に取り出したメソッド実行でエラーになります。(ただその程度の修正なら大した手間ではない)あとプロセス変数(配列)が定義されている前提で実行される処理・・・これは何処で設定されたのかを探す必要があるので若干厄介ですが・・・若干です
https://www.dropbox.com/sh/k0q1aczkcbby0qc/AAD3-ChUbWuE0f5s1PtCwJxaa?dl=0
オブジェクト処理はv16ベースですので、メソッドコピペでv16でも稼働します。
レイアウト上の見出し取得は位置関係が難しそうなので、見出し行がフィールド名か変数名になってしまうのは仕様です。インタープリターで動作している事が前提になるので使えるシーンが限られるかもしれませんが、動作的に問題ないか良かったらご確認頂ければ幸いです。
ところで、メソッドの書き換えコマンド処理ってデザインアクセス権限がないユーザーでも実行できているっぽいのですが問題ないんでしょうかね?
当方ではMacOS9時代から引き継いできた組み込みレイアウト(Outputフォーム)が多用されており、要望が出る都度書き出しプログラム処理を書いていましたが、こちらを使用することで概ねどのレイアウトでもボタン追加だけで機能を実装できるようになりました。
問題としてはフォームメソッドでテーブル指定を省略している場合に取り出したメソッド実行でエラーになります。(ただその程度の修正なら大した手間ではない)あとプロセス変数(配列)が定義されている前提で実行される処理・・・これは何処で設定されたのかを探す必要があるので若干厄介ですが・・・若干です

https://www.dropbox.com/sh/k0q1aczkcbby0qc/AAD3-ChUbWuE0f5s1PtCwJxaa?dl=0
オブジェクト処理はv16ベースですので、メソッドコピペでv16でも稼働します。
レイアウト上の見出し取得は位置関係が難しそうなので、見出し行がフィールド名か変数名になってしまうのは仕様です。インタープリターで動作している事が前提になるので使えるシーンが限られるかもしれませんが、動作的に問題ないか良かったらご確認頂ければ幸いです。
ところで、メソッドの書き換えコマンド処理ってデザインアクセス権限がないユーザーでも実行できているっぽいのですが問題ないんでしょうかね?
osaru- 投稿数 : 67
登録日 : 2017/08/14
Permissions in this forum:
返信投稿: 不可
|
|