0

古いなげなわ 8 コードではfield('foo', -recordindex=(loop_count - 1))、レコード間で値が変更されたときにテーブルのヘッダー行を表示する条件で頻繁に使用していました。

Lasso 9 では、-recordindexパラメータが無視されるようです。また、文書化されていません。

私の最初の回避策は、レコードの反復ごとに変数を設定し、現在のレコードのフィールドをその値と比較することです。

<?= var('lastSortFieldValue') = null ?>
[records]
    [if(field('sortField') != $lastSortFieldValue)]
        <!-- display header -->
    [/if]
    <!-- display row -->
    <?= $lastSortFieldValue = field('sortField') =>
[/records]

ここでのベストプラクティスに関する推奨事項はありますか?

4

2 に答える 2

1

変数を設定する回避策は、おそらく最善の方法です。(ただし、おそらくスレッドスコープを持つ必要がないため、スレッド変数ではなくローカル変数にします。)

field(..., -recordIndex) が行っていたことを行うメソッドが本当に必要な場合は、それを行うメソッドを次に示します。

define fieldFromRow(field::string, row::integer) => {
    local(curMap = inline_scopeGet)
    !#curMap || #curMap->size == 0? return null;

    local(stashRow) = #curMap->find(::currentrow)
    handle => {
        #curMap->insert(::currentrow = #stashRow)
    }

    #curMap->insert(::currentrow = #curMap->find(::currentset)->get(INLINE_RESULTROWS_POS)->get(#row))

    return column(#field)
}

このメソッドは、現在のインライン情報を取得します。次に、現在の行をスタッシュし、すべてが完了したら現在の行を復元するようにハンドラーを設定します。次に、現在の行をメソッド呼び出しで指定された行に設定し、指定されたフィールドの値を返します。少しハックですが、私の基本的なテストでは機能します。

于 2013-10-28T02:18:50.757 に答える
1

ただし、エレガントな Brads カスタム メソッドは使用しないことをお勧めします。ローカル変数の設定と比較よりも遅くなります。

local(
    timer,
    loops = 1000,
    present_value,
    prev_value,
    out = string,
    result = string
)

inline(-database = 'mysql', -sql = "SELECT * FROM help_category") => {

    #timer = micros

    loop(#loops) => {
        rows => {
            #present_value = field('name')
            #prev_value != #present_value ? #out -> append('<hr />Here be a new field<br />')
            #out -> append(#present_value + '<br />')
            #prev_value = #present_value
        }
    }
    #result -> append('Result using local ' + ((micros - #timer) / # loops) + '<br />')

    #timer = micros

    loop(#loops) => {
        rows => {
            #present_value = field('name')
            loop_count > 1 and #prev_value != fieldFromRow(#present_value, loop_count -1) ? #out -> append('<hr />Here be a new field<br />')
            #out -> append(#present_value + '<br />')
        }
    }
    #result -> append('Result using fieldFromRow ' + ((micros - #timer) / # loops) + '<br />')

}
#result

-> local 637
を使用した結果 fieldFromRow 1612 を使用した結果

于 2013-10-28T07:16:30.480 に答える