Lasso lang 在套索9中,是否存在field方法的-recordindex参数?选择?

Lasso lang 在套索9中,是否存在field方法的-recordindex参数?选择?,lasso-lang,Lasso Lang,在旧的Lasso 8代码中,我经常在条件中使用字段'foo',-recordindex=loop_count-1,以在记录之间更改值时显示表中的标题行 在套索9中,-recordindex参数似乎被忽略。它也没有文档记录 我的第一个解决方法是在每次记录迭代时设置一个变量,并将当前记录的字段与该值进行比较 <?= var('lastSortFieldValue') = null ?> [records] [if(field('sortField') != $lastSortFi

在旧的Lasso 8代码中,我经常在条件中使用字段'foo',-recordindex=loop_count-1,以在记录之间更改值时显示表中的标题行

在套索9中,-recordindex参数似乎被忽略。它也没有文档记录

我的第一个解决方法是在每次记录迭代时设置一个变量,并将当前记录的字段与该值进行比较

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

这里有关于最佳实践的建议吗

设置变量的变通方法可能是最好的选择。虽然我会将其设置为局部变量而不是线程变量,因为它可能不需要线程作用域

如果您真的需要一个方法来实现字段…-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)
}

此方法获取当前的内联信息。然后,它将当前行隐藏起来,并设置一个处理程序,以便在完成所有操作后恢复当前行。然后将当前行设置为方法调用中指定的行,并返回指定字段的值。有点像黑客,但它在我的基本测试中起作用。

无论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
使用第1612行字段的结果非常有帮助!感谢您提供的自定义方法。我把它放在LassoStartup中作为例子,并迅速地将所有旧方法转换为临时新方法。如何找到所有这些秘密类型和方法,如inline\u scopeGet和inline\u RESULTROWS\u POS-我同意Jolle的观点,但是这个解决方案不必要地增加了开销。Justin,你的第一种方法可能是最有效的。我也同意Jolle和Ke的观点-使用这种方法来让事情运转起来,但是如上所述,你使用变量的解决方案是最好的方法。顺便说一句,如果不使用列来获取数据,我的解决方案可能会更快,但这可能会在边缘情况下导致意外的结果。感谢提供更多信息。在Brad自定义方法的实现中,我添加了一个记录使用情况的步骤,以便稍后返回并清理它。现在,它只是一个简单的正则表达式查找和替换,让很多东西开始工作。再次感谢您对此的详细介绍。