2014-02-07 96 views
0

在数据窗口报告的详细信息部分中,有一个计算字段,计算字段内部是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 
+0

您正在讨论数据窗口,但代码处理数据存储。我在想你的问题可能与'retrieve.asneeded'属性有关,但这不适用于数据存储。 – Seki

+0

您的意思是不建议在数据窗口报告中放置一个包含数据存储的函数?是否因为数据存储将继续检索,尽管数据已经填充? – Alex

+0

没有。窗口或用户对象的数据窗口控件中可视化地使用数据窗口的功能(它可能不可见):当激活“retrieve.asneeded”属性时,DW仅检索对应的记录到可见的线条。然后在滚动dw时,检索丢失的行以显示。我虽然可能是你的问题,但这种情况不适用于在一段代码中声明/实例化的数据存储(=不可见的数据窗口)。 – Seki

回答

0

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