みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
みなさん、こんにちは。
Win版、V18を使っています。
ファイルオプションのスクリプトトリガ→OnFirstWindowOpenの所のスクリプトの中に、
スクリプトの一時停止・続行 10秒を入れています。
実行したところ、そこで、止まってしまい、先に進まないようなときがあります。
こんなことはあるのでしょうか?また、回避策はどうしたらよいのでしょうか。
よろしくお願いします。
Offline
普通考えられませんね、
本当にそこで止まっているのでしょうか?
他に原因は無い?
Offline
チポ さん、
回答ありがとうございました。
やっぱりそうですよね。
他の所を見てみます。
Offline
チポ さん
ログを書き出すようにして実行してみました。
まず、起動時のログは書き出します。
その後で、
webビューアーの設定["weba";再読み込み]
スクリプト一時停止10秒
変数設定[$json:GetLayoutObjectAttribute ( "Weba" ;" content" )]
この後にStep2のログを書き出します。
ログを見るとStep2のログが書き出されません。
従って、ここで止まっている気がします。
どこがおかしいのでしょう?
Offline
ビューワーの読み込みが10秒で足らないとか。
デバッガーでトレースしてみればいかがですか。
Offline
スクリプト全体を書けませんか?スクリプトステップ名を正確に。
Step2 というのは何ですか?
ログを書く処理の部分が省略されているのでどこで動いていないのか特定できません。
デバッガや[スクリプト一時停止/続行]の次に[カスタムダイアログを表示]を入れて
ダイアログが表示されるか否か確認などの確実な方法で検証されましたか?
Offline
Shin さん、Moz さん
回答ありがとうございました。
デバッガーでやったときは問題なく動きます。
実際に動かしたときに発生したりしなかったり。最終的にはランタイムで実行したいのですが、ランタイムでも起きたり起きなかったり。
スクリプトを全部書くのは大変なので、pdfにしたものをアップロードします。
http://pcs.wp.xdomain.jp/fm/script.pdf
(当初質問したときと少し変更しています)
全体の流れは、ある気象サイトからjsonデータを取得して、そこからcsvファイルに書き出すことを想定しています。色々な制限があり、urlから挿入は使えずに、GetLayoutObjectAttribute のcontentを利用して、jsonデータを取得しています。
最後に200 があれば、成功で、csvに書き出します。
スタートアップでまず、データを取りに行き、グローバルフィールドに格納。起動時に自動実行するにチェックがある時は、そのまま指定時間毎に自動的に取りに行くようにします。OnTimerスクリプトが働くようになっています。
ざっとこんな流れです。
よろしくお願いします。
Offline
補足です。通常はuserで運用し、ランタイムを使用します。取得間隔は本番では3600秒(1時間毎です)
最終的にはスタートアップに登録して、PCが起動時に自動実行させ、データを取得したいです。
Last edited by nice-guy (2020-11-14 22:34:33)
Offline
Step02 のログが書き込まれないだけでは[スクリプト一時停止/実行]が原因と特定できません。
なぜそのように考えられたのでしょう?
1ステップずつ余裕を持って進むデバッガでは期待通りに動き
通常実行では期待通りに動いていないとき、まず疑う点は期待通りの If 分岐に進んでいないことでしょう。
If のあとまたは Else If に進まなかった場合に無条件でログを書かせたらどうなるか試してみては如何でしょう。
原因を探るアドバイスをするまでができることです。
質問者さんが納品など顧客から求められている結果を得たいのであればベンダーに依頼しましょう。
Last edited by Moz (2020-11-14 22:44:53)
Offline
webビューワーを設定 の後で一時停止をいれてみては。
ちなみに、2回目のログは、必ずエラー0を返しますよ。
Offline
最後に200 があれば、成功で、csvに書き出します。
このように書かれていますが、「Step2」のログが書かれる If 分岐は 200 でなかったとき です。
つまりログが残ったら期待(望んだ結末)に向けて動いていないということになります。
スクリプトは作ったとおりにしか動きません。見直し必要ではないですか?
一時停止もいいですが GetLayoutAttribute の中身が期待した結果になるのを待機(Loop)されては如何でしょう。
また、Shinさんも指摘していますが Get ( 最終エラー ) は直前のスクリプトステップの結果ですから
[フィールド設定]が失敗しない限り 0 です。
他に Get ( 最終エラー ) を設定している箇所も同様です。直前のステップのエラーを取る目的は何でしょう?
Last edited by Moz (2020-11-15 09:10:56)
Offline
Shin さん、チポ さん、Moz さん
色々とありがとうございました。
現状まだ、悪銭苦闘していますが、
http://pcs.wp.xdomain.jp/fm/script2.pdf
と書き換えました。不要なロジックは削除したのと、エラー0しか返らないものは少し省きました。
とりあえず、どこが問題なのかを把握するために、至る所にログ書き出しを入れたので、無駄が多かったかもしれませんし、まだ残っていると思います。
サブスクリプトの中でもログを書き出しています。
>>Step02 のログが書き込まれないだけでは[スクリプト一時停止/実行]が原因と特定できません。
>>なぜそのように考えられたのでしょう?
昨夜質問したときと、今朝公開したスクリプトが既に異なっています。Stepにも変わってしまいました。
webビューアーの後で、待ちを入れました。
1台のマシンでは、PC起動時のスタートアップに入れて、ランタイムム起動時に順調にスクリプトが動き出し、csvを書き出しています。
他のマシンでも試してみます。
Offline
もう少し検討しました。
http://pcs.wp.xdomain.jp/fm/script3.pdf
今の所、きちんと動いています。
Offline
きちんと動いているようにみえるだけでは。
GetLayoutObjectAttribute ( "Weba" ;" content" ) ] は、GetLayoutObjectAttribute ( "weba" ; "content" ) ] では。
フィールド設定でエラーが出る可能性がほぼありません(リレーションの設定がおかしい、アクセス権がない、そのフィールドが削除されているくらいかも)ので、そのエラー番号を取得する意味は無いです。
それ以外にも、エラー番号を取得する意味がないものが多々あります。
また、読み込みに失敗していても、その内容を評価する処理にはいるので、何かへんでは。
JSON::cod フィールドは、JSON::生データ から生成される計算フィールドなのでしょうが、アクセスされていないので、更新されていない可能性があります。(常に200になっているのかも)
無駄にウェイトもあります。
書き方のお作法の範疇ですので、動作には関係ないかもしれませんが、
エラー処理を先に書いているので、全体の流れが掴み辛く、頭の中でのデバッグが面倒です。
webビューワーで開くのが必須でなければ、URL から挿入 を使った方がいいかもしれません。
loop の中でエラー処理をして、処理を終了させていますが、昔の教科書では御法度とされている流れです、(許容範囲だとは思いますが、フローチャートを書くと、気持ち悪い形になります。)
loop の内外の処理も、流れが悪いです。web 内容を読み取る同じ処理が、内外に2回でてきます。
web読み込み
If ( not PatternCount (JSON::JSON生データ; ":200}" ) )
Loop
エラー処理
web読み込み
ExitLoopIfIf ( PatternCount (JSON::JSON生データ; ":200}" ) )
end Loop
endIf
となっていますが、
Loop
web読み込み
ExitLoopIfIf ( PatternCount (JSON::JSON生データ; ":200}" ) )
エラー処理
end Loop
とすればすっきりします。
また、好みですが、メインの処理の中での分岐は少なくした方が読み易いので、レコード削除の分岐も、サブスクリプト側でさせるのが好きです。
Last edited by Shin (2020-11-18 18:27:37)
Offline
Shin さん、具体的なアドバイス色々とありがとうございました。
まだまだですね。
色んな紆余曲折があったので、昔の無駄なフィールドや、スクリプトステップがあるようですね。
もう一度頭を冷やして考えてみます。
また、ご指導いただけたら幸いです。
Offline
皆様、こんにちは。
その後あれこれ考えて、必要十分なものを考えました。
ログもエラーがある時だけ書き出すように改めました。
問題点を指摘していただけたら幸いです。
http://pcs.wp.xdomain.jp/fm/script4.pdf
Offline
Get ( 最終エラー ) というのは、直近のスクリプトステップのエラー番号を返す関数です。
スクリプトを拝見しますと、スクリプト一時停止スクリプトステップの後にエラー番号を取得しており、一時停止スクリプトステップのエラーを拾うのが目的のように推察されます。
しかしながら、スクリプト一時停止のスクリプトステップで得られるエラー番号は0または1であり、スクリプトの冒頭で「ユーザによる強制終了を許可」がオフになっているため、ほぼ全てが0を取得することになります。
Get ( 最終エラー ) はエラーが出ると思われるスクリプトステップの「直後」に配置する関数なので、設置場所には注意してください。
また、全スクリプト終了スクリプトステップは、文字通り全てのスクリプトを終わらせるスクリプトステップです。
このスクリプトステップの後に何を書いても、実行されることはありません。
全スクリプト終了の後に Exit Loop If [ 1 ] とある箇所があり、必要のないスッテプかと思います。
1番修正したほうがいいと思われるのは、エラー処理オンスクリプトステップです。
スクリプトの冒頭で宣言しており、開発者がエラーについて無関心であることを露呈する悪手になります。
エラー処理オンは開発者がエラーを認識している箇所に配置して、そのステップが過ぎたらオフにしてあげると、エラーに無関心な開発者から脱却できると思います。
また、PatternCount 関数で JSON 内の Result を取得してると思うのですが、同じスクリプトの中であるにも関わらず、表記揺れが見られます。
:200 であったり、{¥”cod¥”401 だったり。
これは私が JSON の中身を把握していないので、実際にはこの表記で正しいのかもしれませんが、表記の揺れは無い方が良いかと思います。
Step 4とStep 10 とがあります。
スクリプトの履歴の中で 他の Step が取り除かれていったのが想像できます。
番号ではなく、そのステップの意味を文書化してあげると、後でどういう箇所でエラーが起こったのかわかると思います。
エラーログを見て Step 10 とだけ記載されていても「不親切なログ」という印象を持たれてしまいます。
冒頭で $cnt に値を入れておりますが、スクリプト中で使用されているのは、最後の方に一回のみです。本当に必要なのか、もう一度考えてみてください。
ウインドウ内容の再表示を利用しておりますが、本当に必要なのか、よく考えてみてください。
フィールドへ移動[]した後に確定していますが、フィールドへ移動が本当に必要か、よく考えてみてください。
さんさん さん
具体的なアドバイス色々ありがとうございました。
もうちょっと考えてみます。
Offline
さんさん さん、
改修してみました。
表記揺れは直しました。
$cnt は、フィールド設定で前の数に1を足せば済むことでした。
Stepは内容を書くようにしました。
http://pcs.wp.xdomain.jp/fm/script5.pdf
にあります。
また、おかしな点をご指摘いただけたら幸いです。
よろしくお願いします。
Offline
もっとスッキリ書くには、僕流には、
変数を設定[$count ; 15]
Loop
web読み込み
ExitLoopIfIf ( Let ( $count = $count - 1 ; PatternCount (JSON::JSON生データ; ":200}" ) or $count = 0 ) )
end Loop
If ( $count )
後処理
else
エラー処理
end If
Last edited by Shin (2020-11-18 18:28:54)
Offline
どういう時にエラーが出るのか確認するために、スクリプトデバッガの [ エラー時に一時停止 ] にチェックをすると良いと思います。
変数を設定スクリプトステップでエラーが出ることはありませんので、エラー処理をする必要はございません。
次のようにすると、いかがでしょうか?
ユーザによる強制終了を許可 [ オフ ]
#
# レコードを開いてエラーであれば終了させる。
エラー処理 [ オン ]
レコード/検索条件を開く
変数を設定 [ $error ; 値: Get ( 最終エラー ) ]
エラー処理 [ オフ ]
If [ $error ]
カスタムダイアログを表示 [ "確認" ; "レコードを開くことができませんでした。" ]
現在のスクリプト終了 [ テキスト結果: False ]
End If
#
#
オブジェクトへ移動 [ オブジェクト名: "t_ob" ]
スクリプト実行 [ 指定: 一覧から ; 「ファイル削除」 ; 引数: ]
#
# 初期化
フィールド設定 [ JSON::JSON ; "" ]
フィールド設定 [ JSON::JSON生データ ; "" ]
#
Web ビューアの設定 [ オブジェクト名: "weba" ; 処理: 再読み込み ]
#
# codを取得するか、または 150 秒以上経過すれば、Loop を抜ける。
変数を設定 [ $timestamp ; 値: Get ( タイムスタンプ ) ]
Loop
Exit Loop If [ PatternCount ( $json ; "\"cod\":" ) <> 0 or Get ( タイムスタンプ ) - $timestamp > 150 ]
変数を設定 [ $json ; 値: GetLayoutObjectAttribute ( "Weba" ; "content" ) ]
スクリプト一時停止/続行 [ 間隔(秒): .5 ]
End Loop
#
# cod を含んでいない ( = 150 秒以上経過した ) 場合、ログを記録してダイアログを出して、スクリプトを終了させる
If [ PatternCount ( $json ; "\"cod\":" ) = 0 ]
スクリプト実行 [ 指定: 一覧から ; 「ログに書き込む」 ; 引数: List ( "取得にかかった時間 : " & Get ( タイムスタンプ ) - $timestamp & " 秒" ; $json ) ]
カスタムダイアログを表示 [ "エラー" ; "JSON データを取得できませんでした。" ]
現在のスクリプト終了 [ テキスト結果: False ]
End If
#
#
フィールド設定 [ JSON::JSON生データ ; $json ]
#
# cod が 200 の ( 成功した )時、JSON データを書き込み、CSV で書き出す。
If [ PatternCount ( $json ; "\"cod\":200" ) <> 0 ]
#
スクリプト実行 [ 指定: 一覧から ; 「JSONデータを書き込む」 ; 引数: $json ]
スクリプト実行 [ 指定: 一覧から ; 「CSV書き出し」 ; 引数: ]
#
フィールド設定 [ JSON::最終実行時 ; Get ( タイムスタンプ ) ]
フィールド設定 [ JSON::実行回数 ; JSON::実行回数 + 1 ]
Else
#
スクリプト実行 [ 指定: 一覧から ; 「ログに書き込む」 ; 引数: List ( "取得した JSON にエラーコードが確認できました。" ; $json ) ]
End If
#
# 後処理
If [ JSON::実行回数 >= JSON::終了回数 ]
アプリケーションを終了
Else If [ JSON::起動時最小化 = 1 ]
ウインドウの調整 [ 最小化 ]
End If
#
さん さん さん、
回答ありがとうございました。大変参考になりました。これを元に改編します。
1点お聞きしたいのですが、
Loop
Exit Loop If [ PatternCount ( $json ; "\"cod\":" ) <> 0 or Get ( タイムスタンプ ) - $timestamp > 150 ]
変数を設定 [ $json ; 値: GetLayoutObjectAttribute ( "Weba" ; "content" ) ]
スクリプト一時停止/続行 [ 間隔(秒): .5 ]
End Loop
この部分、変数設定の方が先ではないでしょうか?
Offline
横から失礼。
Exit Loop If は Loop の最初に書くという流派の方もいます。
(Loop を抜ける条件を先に考え、先に書くとか理由はいろいろ)
あとでも先でも結果は一緒ですからどちらが正しいということはありません。
Offline
Moz さん、回答ありがとうございました。
なるほど。わかりました。
どうもありがとうございました。
Offline
Moz さんのおっしゃる通り、正解はなく、目的を達成していることが重要と考えています。
私は癖付けとして必ず Loop の次に配置するようにしています。( ひいばあちゃんからの言いつけです )
なぜかというと、頭に抜ける条件がないと、本来実行されるべきではないステップが実行されてしまう事があるからです。
まぁスクリプトの書き方で個人が特定されることもあるので、深追いはしないでください。
[ Generated in 0.011 seconds, 9 queries executed - Memory usage: 591.57 KiB (Peak: 628.48 KiB) ]