2014-02-07 2 views
0

데이터 윈도우 보고서의 세부 섹션에는 계산 된 필드가 있으며 계산 된 필드에는 값 인수와 반환 유형으로 전달 된 2 개의 문자열을 보유하는 PB 함수가 있습니다. 검색이 완료되고 데이터가 채워지면 SQL 프로파일 러에서 본 것처럼 데이터 윈도우가 계속 검색되지만 오류 메시지 창이 표시되지 않습니다.Datastore는 데이터가 채워진 후 계속 검색합니다.

이 기능의 문제점은 무엇입니까?

/* 
    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

계산 된 필드에서 데이터베이스를 사용하는 함수를 호출하면 안됩니다. 많은 경우 PowerBuilder에서 계산 된 필드를 다시 계산하기 때문입니다. 대신 DataWindow의 SELECT 문에 더미 컬럼을 추가하십시오. 검색 한 후에 행을 반복하고 함수와 유사한 코드를 사용하여 더미 열에 일련 번호 범위를 채울 수 있습니다. 필자가 "귀하의 기능과 유사"하다고 말한 이유는 DataStore를 한 번만 생성하고 연결 한 다음 각 행의 매개 변수로 검색해야하기 때문입니다.

관련 문제