メインコンテンツへスキップ

レコードに変更があったことを確認するには

コメント

33件のコメント

  • Tanda

    yamamotoさん、

    ViewMod() 関数が使えますよ。使い方はヘルプに分かりやすく書いてあります。

  • yamamoto

    tandaさん

    ありがとうございます!早速試してみます。

  • yamamoto

    恐れ入ります。

    先日教えていただいた、ViewMod()関数でロジック処理はうまくいったのですが

    フォームでテキスト表示を終了から取消に変更する式はどのように記述すればよいですか?

    ロジックで下記のように記述したので

    ーーーーーーーーーーーーーーーー

    ブロック IF ViewMod(0)

    イベント実行 Ctrl+F2

    ブロック Else NOT(ViewMod(0))

    イベント実行 終了

    ーーーーーーーーーーーーーーーー

    取消ボタンの書式の式に下記のように記述したのですが書式が変わりません。

    IF(ViewMod(0),'取消(&C)',IF(NOT(ViewMod(0)),'終了(&E)',''))

    教えていただきたいです。

  • nkmt

    一つのボタンをキャンセルと終了を使い分ける事はした事ありませんが
    以下はどうでしょうか?

    ブロック IF ViewMod(0)
     イベント実行 Ctrl+F2 又は キャンセル(C)
    ブロック Else
     イベント実行 終了
    ブロック END


    IF(ViewMod(0),'取消(&C)','終了(&E)')

     

  • yamamoto

    nkmtさん、コメントありがとうございます。

    早速試してみましたが、ボタン書式に変化はありませんでした。

    相変わらず、処理自体はきちんと取消→終了が出来ています。

    簡単にできそうだと思って手を出しましたが意外と難しいですね。

    他にも、

    ViewMod(0)はTRUEかFALSEが帰るとヘルプにあったので

    書式の式をIF('TRUE'LOG,'取消(&C)','終了(&E)')試してみましたがダメでした。

  • nkmt

    ボタンに表示する名称変数 代入式=IF(ViewMod(0),'取消(&C)','終了(&E)')
    ボタンの名称にその変数を指定はどうでしょうか?
    ※実験していないので、実現出来なかったらごめんなさい。

  • yamamoto

    nkmtさん、コメントありがとうございます。

    早速試してみました!

    、、、がやはり変化はありませんでした。

    フォームでViewMod(0)関数はあまり使用されないのでしょうか。

     

  • KURITA

    対象のフォームがテーブルコントロールでの表形式とかではないですよね?

    メインテーブルが指定された上での1レコード1画面の単一で上手く反応しないということでしょうか?

    ViewModはレコード単位の修正有無との記載があるため、書かせていただきました。

  • yamamoto

    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)')

  • nkmt

    ▼試してみました。
    変数を定義
    その変数は データビューの一部です。

    変数の値を変更入力してみました。

    以下の○×は個人の感想です。

    ×論理型変数 に代入式で、ViewMod(0)を設定しても変化しませでした。

    ○エラーの条件では ViewMod(0) は使えました。。

    ×テキストの式や
     ボタン表示に
     IF(ViewMod(0),'変更されました','変更されていません')
     を設定しましたが、
     変更されませんでした。

    以上スクリーンモードです。

    なんかViewMod関数の印象が変わりました。
    追記:実験はxpa 4.7.1です。

  • yamamoto

    nkmtさん、実験までして頂いてありがとうございます。

    エラーの条件でボタン表示を変更するというのは、

    項目更新 変数でエラー条件にIF(ViewMod(0),'取消(&C)','終了(&E)')を入れるということでしょうか。

    何度も伺ってしまい、申し訳ないですが教えていただけるとありがたいです。

  • nkmt

    ごめんなさい。そうではなくてエラーの条件で、ViewMod(0)は効きました。


    そして以下も良いかもしれません。先程思いついて実験しました。
    効きましたよ。

     

  • nkmt

    以下の3行目は(値を変更しても)常にFalseでした。

  • nkmt

    イベント ViewMod(0)で 更新した変数により
    ボタン表記を切り替えるのは実験成功しました!

  • vg

    V10の頃はできたような気がするなーと思ってXPA4plusでやってみましたけどうまくいかないですね、
    不具合なような気もしますが・・・
    どちらにせよ、viewmodはテーブルで使ったときとかデータビューの一部設定しなきゃとかめんどくさい子なので、
    親タスクとかに更新フラグの変数作って、それで表示切り替える方がわかりやすいと思います

  • nkmt

    yamamoto様、vg様
    Magic uniPaaS V1 Plus での実験ですが、
    ボタンのデータに式=IF(ViewMod(0),'変更されました','変更されていません')
    を設定し、データビューの一部にした変数に値を入力して、次項目に進んだら
    ボタンの表示が
    変更されていません から
    変更されました に変わりました。
    xpa4.7.1での実験はそうなりませんでしたが、そういうものなのか制限事項なのかバグなのかは不明です。

  • yamamoto

    nkmtさん、

    イベント ViewMod(0) のやり方でついに表示を切り替えることができました!

    お付き合いいただきありがとうございました。

     

  • Tanda

    ひょっとしてこの関数は、遅延トランザクションのトランザクションキャッシュを見に行ってるのではなくて、物理トランザクションの「ダーティリード」を見に行ってるのかもしれませんね。

    そのあたりをチェックしてみられると、原因が判明しそうな気がします。

  • nkmt

    tanda様
    xpa4.7.1の実験PGですが、遅延トランザクションになっておりました。
    物理に変えて実験してみました。
    ボタンに設定したIF(ViewMod(0),'変更されました','変更されていません')が即座に変わりました。
    ありがとうございました。


  • nkmt

    普段作成するプログラムは、トランザクションモードも確認していますが、今朝実験した実験PGではトランザクションモードは見落としておりました。

  • Tanda

    やはり、予想した通りの動きでしたね。原因が究明できてよかったです。

    関数のオプションに、物理の「ダーティリード」を見に行くか、あるいは遅延の「トランザクションキャッシュ」を見に行くかの選択肢をつけてもらえると便利ですね。

  • nkmt

    ちょっと完全に実験前に戻しておりませんでした。
    嘘コメントを私がした可能性があるので、一つだけ投稿を削除しました。
    でも待てよと思い2つは残しました。

    ※文章が誤解を与えそうなので少し変更しました。

  • nkmt

    tanda様、yamamoto様
    実験をやり直しました。
    物理トラン、遅延トラン どちらの場合もボタンに
    IF(ViewMod(0),'変更されました','変更されていません') を設定した場合は
    xpa4.7.1では、切り替わってくれませんでした。

  • yamamoto

    vgさん、tandaさん、特にnkmtさん

    とても勉強になりました。皆さんありがとうございます。

    トランザクションは私の場合は物理にしていました。

    ひとまず、当面はイベント ViewMod(0)のやり方で使用してみようと思います。

  • vg

    いちおう念の為ですが、もしイベントの式  内容がViewMod(0)  のイベントを作られたのでしたら
    条件を入れてないと、式がtrueの間 1秒間隔とかでずっと動くことになるのでご注意くださいね

  • nkmt

    vgさんのアドバイス聞いてないとそのままになっていたかもしれないです。
    確かにおっしゃる通り、何度もこのイベントが動いていました。
    ひとまず私の実験では、条件を付けました。

  • yamamoto

    vgさん、ありがとうございます。

    私もnkmtさんと同様の条件を付けさせていただきました。

    ありがとうございます。

  • Tanda

    「物理」であるか「遅延」であるかの違いではなく、SQLの分離レベルの「ダーティリード」を見に行ってるかどうかで検証されたほうがいいですよ。

  • Tanda

    ちなみに、「分離レベル」の設定箇所はここです。↓

  • yamamoto

    tandaさん、コメントありがとうございます。

    不勉強で申し訳ないですが、まだDBMSの分離レベルを触ったことがなく

    ヘルプで分離レベルが0の場合、READ UNCOMMITTED=ダーティデータを読み取ることができるということまでは理解できたのですが、

    それを見に行っているかどうかというのはどこで確認できるのでしょうか。

    何度も申し訳ないですが教えていただけると幸いです。

サインインしてコメントを残してください。