0

在旧的 Lasso 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

然而,我建议不要使用优雅的 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

-> 结果使用本地 637
结果使用 fieldFromRow 1612

于 2013-10-28T07:16:30.480 回答
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 回答