みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
日付でソートした状態で、日付が変わるごとに文字色を変更したくて次のようなスクリプトを作りましたが、いちいちスクリプトを走らせるのは面倒なので、フィールドの計算式か条件付き書式で実現出来ないでしょうか? 再帰計算で出来そうだけど、どうやってレコードを移動するのかなどよく分かりません。
よろしくお願いします。
[テーブル内容]
日付 データ 実行結果
2017/04/21 *** 青
2017/04/21 *** 青
2017/04/22 *** 黒
2017/04/22 *** 黒
2017/04/23 *** 青
2017/04/23 *** 青
[スクリプト]
変数を設定 [$ChangeDate; 値:0]
レコード/検索条件/ページへ移動 [最初の]
Loop
If [日付カラー::日付 ≠ GetNthRecord ( 日付カラー::日付 ; Get ( レコード番号 ) - 1 )]
変数を設定 [$ChangeDate; 値:not $ChangeDate]
End If
計算結果を挿入 [選択; 日付カラー::日付; If ( $ChangeDate = 1 ; TextColor ( 日付カラー::日付 ; RGB ( 0 ; 51 ; 255 ) ) ; 日付カラー::日付 )]
レコード/検索条件/ページへ移動 [次の; 最後まできたら終了]
End Loop
Offline
条件付き書式が良いのでは。
Day() で日を取り出して、Mod() で適当なグループに分ければ良いでしょう。
または、変数を使って、日付が変われば変数をインクリメントして色を指定していけば良いかも。
Offline
冗長なループスクリプトと等価な繰り返し処理を、
変数計算値による「フィールド内容の全置換」で、一発一括変換処理する簡便法。
その計算式は、
Let(
$grp=$grp + (GetNthRecord(日付カラー::日付; Get(レコード番号)-1)<>日付カラー::日付)
;
Choose( Mod($grp;2); TextColorRemove(日付カラー::日付); TextColor(日付カラー::日付; RGB(0;51;255)) )
)
Last edited by Hiro (2017-04-23 23:47:13)
Offline
必ず日付の昇順でソートなら、、
自身以下の日付とリレーションし(対象レコードの状態ならその検索条件もリレーションの照合に加えます)、
その動的値一覧を作ります。
その値一覧の項目数を数えると、日付順に1からの連続した値が得られます。
条件付き書式で、この値で交互に色を変える設定が出来ますね。
Offline
皆さんありがとうございます。自分には新しい考え方を習得できました。
なるほど、値一覧にこんな使い方があるとは。
また、Evaluateを使う再帰式だとどうなりますか? なんとか再帰式も使えるようになりたいと思っています。
前から疑問だったのですが、全置換や条件付き書式はレコードの上から順番に処理してるのでしょうか?
速度は条件付き書式の方が圧倒的に速いですね。
Hiroさんのをベースに条件付き書式と値一覧で以下のように実現出来ました。
[条件付き書式]
Let(
$grp=$grp + (GetNthRecord(日付カラー::日付; Get(レコード番号)-1)<>日付カラー::日付) ;
Mod($grp;2)
)
[動的値一覧]
自己リレーション日付カラー::日付 ≧ 日付を設定
リレーションした日付テーブルから値一覧changedateを設定
条件付き書式を定義
Mod ( ValueCount ( ValueListItems ("日付カラー" ; "changedate" ) ) ; 2 )
Offline
> Evaluateを使う再帰式だとどうなりますか?
今回事案ではEvaluate再帰式は不適と判断しました。
再帰計算は、高負荷で、キャッシュメモリを大食いしスタックオバーを引き起こすため、
かなり低い処で定められた再帰回数制限があるためです。
> リレーションし(対象レコードの状態ならその検索条件もリレーションの照合に加えます)
#4チポさんを勝手に補足、^^;
v13以降なら集計フィールドの「一覧」新機能を利用して「シリアル値の一覧」を取得させ、
これを照合キーフィールドにすれば、対象レコード照合の自動計算化に持ち込めますネ。
Last edited by Hiro (2017-04-24 13:23:49)
Offline
> Evaluateを使う再帰式だとどうなりますか
ロジックを考えれば再起にはならないでしょう。
「Evaluate」「Hiro」
でここを検索するとHiroさんの再起式が出てきますよ。
Hiroさん
集計フィールドの一覧
ですか。。
日常的にはもっと古いバージョンを使っているので考えが及びませんでした ;;;;
その事情は前にも何回か・・
Offline
Loopは再帰で置き換えられると以前の投稿で書かれていたのでどんなものかと。
今回は上記の方法でやることにします。
Offline
Hiroさんのをベースに条件付き書式で以下のように実現出来ました。
[条件付き書式]
Let(
$grp=$grp + (GetNthRecord(日付カラー::日付; Get(レコード番号)-1)<>日付カラー::日付) ;
Mod($grp;2)
)
この条件式による「条件付き書式」では、私の提案した「全置換」のような安定確実な
ループ処理(変数による繰越計算処理)は仕様的に実現できないでしょう。
少し動作テストをされると直ぐに判ると思います。
条件付き書式で実装したい場合は、
チポさん案+集計[一覧]の手法が良いでしょう。
Last edited by Hiro (2017-04-24 22:24:39)
Offline
確かに。
40000レコードから検索結果が2000になるような状態で色が変わらないレコードがあります。
変数を初期化してないからかなあ。
これくらいのレコードでも値一覧方式は重くて実用になりません。10秒以上CPUが100%になってしまいます。
V11では集計フィールドの新機能は使えないので、最初に提案頂いたフィールドの全置換方式が最適と思われます。
2000レコードくらいなら1秒くらいで終わるので問題ありません。
Offline
Pages: 1
[ Generated in 0.010 seconds, 9 queries executed - Memory usage: 570.48 KiB (Peak: 587.02 KiB) ]