数据存储在数据填充后继续检索

时间:2014-02-07 07:26:28

标签: powerbuilder

在数据窗口报告的详细信息部分中,有一个计算字段,计算字段内部是PB函数,它包含由值参数传递的2个字符串和字符串的返回类型。检索完成并填充数据后,数据窗口将继续检索,因为我已经从SQL事件探查器中查看但没有错误消息窗口。

这个功能似乎有什么问题?

/*
    Function name : f_generate_serialrange
    Return Type : String
    Argument Type   :       Argument Name   :
    String                  loc
    String                  id
*/

Long ll_row
Double ld_serialno1, ld_serialno2, ld_start, ld_end, ld_result, ld_next, ld_prev = 0
Double ld_row, ld_count = 0, ld_countaccept = 0, ld_serialcount
String ls_sum, ls_start, ls_prev, ls_next, ls_serialno2

DataStore lds_getserial

lds_getserial = Create DataStore
lds_getserial.DataObject = 'dw_delivery_receipt_serialno1'
lds_getserial.SetTransObject(SQLCA)

lds_getserial.Retrieve(loc,palletid) 

ll_row =lds_getserial.RowCount() 

IF lds_getserial.RowCount() > 0 THEN
  FOR ld_row = 1 TO lds_getserial.RowCount() 
    ld_serialno1 = Double(lds_getserial.GetItemString(ld_row,'serialno'))
    ls_serialno2 = lds_getserial.GetItemString(ld_row,'serialno2')

        IF ld_count = 0 THEN
            ld_start = ld_serialno1
            ls_start = ls_serialno2
            ld_count++
        ELSE
            ld_next = ld_serialno1
            ls_next = ls_serialno2
            IF ld_prev = 0 THEN 
                ld_result = ld_next - ld_start
            ELSE
                ld_result = ld_next - ld_prev
            END IF

            IF ld_result > 1 THEN 
                IF ls_prev = '' THEN
                    ls_sum += String(ls_start) +'~n'
                ELSE
                    ls_sum += String(ls_start) +' - '+String(ls_prev)+'~n'
                END IF

                ld_start = ld_next
                ls_start = String(ls_next)
                ld_prev = 0
                ls_prev = ''
            ELSE 
                ld_prev = ld_next   
                ls_prev = String(ls_next)
            END IF
        END IF
    NEXT

    IF ls_prev = '' THEN
        ls_sum +=String(ls_start)+'~n'
    ELSE
        ls_sum +=String(ls_start)+' - '+String(ls_prev)+'~n'
    END IF
END IF
//MessageBox('System Message','Serial Range has been successfully retrieved.',INformation!)

Destroy (lds_getserial)
RETURN ls_sum 

1 个答案:

答案 0 :(得分:0)

您不应该在计算字段中调用使用数据库的函数,因为很多事情会导致PowerBuider再次计算计算字段。而是将一个虚拟列添加到DataWindow的SELECT语句中。检索后,您可以遍历行并使用与您的函数类似的代码来填充序列号范围的虚拟列。我说“与你的功能相似”的原因是你应该只创建和连接一次DataStore,然后用每行的参数检索它。