レコードに変更があったことを確認するには
いつもお世話になっております。
現在、変更があった場合は取消ボタン・変更がなければ終了ボタンに切り替えるPGを作成しております。
今まではコードなどの必須項目があったのでIsDefault関数を使用していたのですが
今回は必須項目がなく、どの項目であっても変更があれば取消ボタンを表示したいです。
皆さんはどのように処理されているのでしょうか。
-
yamamotoさん、
ViewMod() 関数が使えますよ。使い方はヘルプに分かりやすく書いてあります。
-
tandaさん
ありがとうございます!早速試してみます。
-
恐れ入ります。
先日教えていただいた、ViewMod()関数でロジック処理はうまくいったのですが
フォームでテキスト表示を終了から取消に変更する式はどのように記述すればよいですか?
ロジックで下記のように記述したので
ーーーーーーーーーーーーーーーー
ブロック IF ViewMod(0)
イベント実行 Ctrl+F2
ブロック Else NOT(ViewMod(0))
イベント実行 終了
ーーーーーーーーーーーーーーーー
取消ボタンの書式の式に下記のように記述したのですが書式が変わりません。
IF(ViewMod(0),'取消(&C)',IF(NOT(ViewMod(0)),'終了(&E)',''))
教えていただきたいです。
-
一つのボタンをキャンセルと終了を使い分ける事はした事ありませんが
以下はどうでしょうか?ブロック IF ViewMod(0)
イベント実行 Ctrl+F2 又は キャンセル(C)
ブロック Else
イベント実行 終了
ブロック END
IF(ViewMod(0),'取消(&C)','終了(&E)') -
nkmtさん、コメントありがとうございます。
早速試してみましたが、ボタン書式に変化はありませんでした。
相変わらず、処理自体はきちんと取消→終了が出来ています。
簡単にできそうだと思って手を出しましたが意外と難しいですね。
他にも、
ViewMod(0)はTRUEかFALSEが帰るとヘルプにあったので
書式の式をIF('TRUE'LOG,'取消(&C)','終了(&E)')試してみましたがダメでした。
-
ボタンに表示する名称変数 代入式=IF(ViewMod(0),'取消(&C)','終了(&E)')
ボタンの名称にその変数を指定はどうでしょうか?
※実験していないので、実現出来なかったらごめんなさい。 -
nkmtさん、コメントありがとうございます。
早速試してみました!
、、、がやはり変化はありませんでした。
フォームでViewMod(0)関数はあまり使用されないのでしょうか。
-
対象のフォームがテーブルコントロールでの表形式とかではないですよね?
メインテーブルが指定された上での1レコード1画面の単一で上手く反応しないということでしょうか?
ViewModはレコード単位の修正有無との記載があるため、書かせていただきました。
-
KURITAさん、コメントありがとうございます。
お返事が遅くなり申し訳ありません。
対象のフォームでテーブルは使用しておらず、スクリーンモード?で作成しています。
メインテーブル指定の1レコード1画面の単一で上手く反応しません。
反応しないのはあくまでボタンの書式切替で動作はきちんと取消→終了の順に動いてくれています。
現状試したのは下記4つです。
ボタンの書式の式→IF(ViewMod(0),'取消(&C)',IF(NOT(ViewMod(0)),'終了(&E)',''))
ボタンの書式の式→IF(’TRUE'LOG,'取消(&C)',IF(’FALSE'LOG,'終了(&E)',''))
ボタンの書式の式→IF(ViewMod(0),'取消(&C)','終了(&E)')
名称変数 代入式=IF(ViewMod(0),'取消(&C)','終了(&E)')
-
▼試してみました。
変数を定義
その変数は データビューの一部です。変数の値を変更入力してみました。
以下の○×は個人の感想です。
×論理型変数 に代入式で、ViewMod(0)を設定しても変化しませでした。
○エラーの条件では ViewMod(0) は使えました。。
×テキストの式や
ボタン表示に
IF(ViewMod(0),'変更されました','変更されていません')
を設定しましたが、
変更されませんでした。以上スクリーンモードです。
なんかViewMod関数の印象が変わりました。
追記:実験はxpa 4.7.1です。 -
nkmtさん、実験までして頂いてありがとうございます。
エラーの条件でボタン表示を変更するというのは、
項目更新 変数でエラー条件にIF(ViewMod(0),'取消(&C)','終了(&E)')を入れるということでしょうか。
何度も伺ってしまい、申し訳ないですが教えていただけるとありがたいです。
-
ごめんなさい。そうではなくてエラーの条件で、ViewMod(0)は効きました。
そして以下も良いかもしれません。先程思いついて実験しました。
効きましたよ。 -
以下の3行目は(値を変更しても)常にFalseでした。
-
イベント ViewMod(0)で 更新した変数により
ボタン表記を切り替えるのは実験成功しました! -
V10の頃はできたような気がするなーと思ってXPA4plusでやってみましたけどうまくいかないですね、
不具合なような気もしますが・・・
どちらにせよ、viewmodはテーブルで使ったときとかデータビューの一部設定しなきゃとかめんどくさい子なので、
親タスクとかに更新フラグの変数作って、それで表示切り替える方がわかりやすいと思います -
yamamoto様、vg様
Magic uniPaaS V1 Plus での実験ですが、
ボタンのデータに式=IF(ViewMod(0),'変更されました','変更されていません')
を設定し、データビューの一部にした変数に値を入力して、次項目に進んだら
ボタンの表示が
変更されていません から
変更されました に変わりました。
xpa4.7.1での実験はそうなりませんでしたが、そういうものなのか制限事項なのかバグなのかは不明です。 -
nkmtさん、
イベント ViewMod(0) のやり方でついに表示を切り替えることができました!
お付き合いいただきありがとうございました。
-
ひょっとしてこの関数は、遅延トランザクションのトランザクションキャッシュを見に行ってるのではなくて、物理トランザクションの「ダーティリード」を見に行ってるのかもしれませんね。
そのあたりをチェックしてみられると、原因が判明しそうな気がします。
-
tanda様
xpa4.7.1の実験PGですが、遅延トランザクションになっておりました。
物理に変えて実験してみました。
ボタンに設定したIF(ViewMod(0),'変更されました','変更されていません')が即座に変わりました。
ありがとうございました。 -
普段作成するプログラムは、トランザクションモードも確認していますが、今朝実験した実験PGではトランザクションモードは見落としておりました。
-
やはり、予想した通りの動きでしたね。原因が究明できてよかったです。
関数のオプションに、物理の「ダーティリード」を見に行くか、あるいは遅延の「トランザクションキャッシュ」を見に行くかの選択肢をつけてもらえると便利ですね。
-
ちょっと完全に実験前に戻しておりませんでした。
嘘コメントを私がした可能性があるので、一つだけ投稿を削除しました。
でも待てよと思い2つは残しました。※文章が誤解を与えそうなので少し変更しました。
-
tanda様、yamamoto様
実験をやり直しました。
物理トラン、遅延トラン どちらの場合もボタンに
IF(ViewMod(0),'変更されました','変更されていません') を設定した場合は
xpa4.7.1では、切り替わってくれませんでした。 -
いちおう念の為ですが、もしイベントの式 内容がViewMod(0) のイベントを作られたのでしたら
条件を入れてないと、式がtrueの間 1秒間隔とかでずっと動くことになるのでご注意くださいね -
vgさんのアドバイス聞いてないとそのままになっていたかもしれないです。
確かにおっしゃる通り、何度もこのイベントが動いていました。
ひとまず私の実験では、条件を付けました。 -
vgさん、ありがとうございます。
私もnkmtさんと同様の条件を付けさせていただきました。
ありがとうございます。
-
「物理」であるか「遅延」であるかの違いではなく、SQLの分離レベルの「ダーティリード」を見に行ってるかどうかで検証されたほうがいいですよ。
-
ちなみに、「分離レベル」の設定箇所はここです。↓
-
tandaさん、コメントありがとうございます。
不勉強で申し訳ないですが、まだDBMSの分離レベルを触ったことがなく
ヘルプで分離レベルが0の場合、READ UNCOMMITTED=ダーティデータを読み取ることができるということまでは理解できたのですが、
それを見に行っているかどうかというのはどこで確認できるのでしょうか。
何度も申し訳ないですが教えていただけると幸いです。
サインインしてコメントを残してください。
コメント
33件のコメント