2016-06-17 5 views
0

저는 PowerBuilder를 배우면서 익숙해 지려고합니다. 내 데이터베이스의 특정 문서에 대해 프로그램을 실행하려고하면 다음 오류가 발생합니다.PowerBuilder 프로그램에서 CT_FETCH 오류가 발생했습니다.

ct_fetch() : 사용자 API 계층 : 내부 공통 라이브러리 오류 : 결과 집합 항목 4의 바인딩이 오버플로를 초래했습니다. . 오류 코드 : 2.

이 오류는 무엇을 의미합니까? 4 번 항목은 무엇입니까? 이것은 내 데이터베이스의 특정 문서에 대해이 프로그램을 실행하는 경우에만 다른 문서가 정상적으로 작동합니다. 아래의 코드를 참조하십시오 :

string s_doc_nmbr, s_doc_type, s_pvds_doc_status, s_sql 
long  l_rtn, l_current_fl, l_apld_fl, l_obj_id 
integer l_pvds_obj_id, i_count 


IF cbx_1.checked = True THEN 

SELECT dsk_obj.obj_usr_num, 
dsk_obj.obj_type, 
preaward_validation_doc_status.doc_status, 
preaward_validation_doc_status.obj_id 
INTO :s_doc_nmbr, :s_doc_type, :s_pvds_doc_status, :l_pvds_obj_id 

FROM dbo.dsk_obj dsk_obj, 
preaward_validation_doc_status 
WHERE dsk_obj.obj_id = :gx_l_doc_obj_id 
AND preaward_validation_doc_status.obj_id = dsk_obj.obj_id 
using SQLCA; 

l_rtn = sqlca.uf_sqlerrcheck("w_pdutl095_main", "ue_run_script", TRUE) 
IF l_rtn = -1 THEN 
    RETURN -1 
END IF 

//check to see if document (via obj_id) exists in the preaward_validation_doc_status table. 
SELECT count(*) 
into :i_count 
FROM preaward_validation_doc_status 
where obj_id = :l_pvds_obj_id 
USING SQLCA; 


IF i_count = 0 THEN 
    //document doesn't exist 
    // messagebox("Update Preaward Validation Doc Status", + gx_s_doc_nmbr + ' does not exist in the Preaward Validation Document Status table.', Stopsign!) 
    //MC - 070815-0030-MC Updating code to insert row into preaward_validation_doc_status if row doesn't already exist 
// s_sql = "insert into preaward_validation_doc_status(obj_id, doc_status) values (:gx_l_doc_obj_id, 'SUCCESS') " 

    INSERT INTO preaward_validation_doc_status(obj_id, doc_status) 
    VALUES (:gx_l_doc_obj_id, 'SUCCESS') 
    USING SQLCA; 
         IF sqlca.sqldbcode <> 0 then 
         messagebox('SQL ERROR Message',string(sqlca.sqldbcode)+'-'+sqlca.sqlerrtext) 
         return -1 
        end if 

    MessageBox("PreAward Validation ", 'Document number ' + gx_s_doc_nmbr + ' has been inserted and marked as SUCCESS for PreAward Validation.') 
    return 1 
Else 
    //Update document status in the preaward_validation_doc_status table to SUCCESS     
    Update preaward_validation_doc_status 
    Set doc_status = 'SUCCESS' 
    where obj_id = :l_pvds_obj_id 
    USING SQLCA;       
        IF sqlca.sqldbcode <> 0 then 
         messagebox('SQL ERROR Message',string(sqlca.sqldbcode)+'-'+sqlca.sqlerrtext) 
         return -1 
        end if 
    MessageBox("PreAward Validation ", 'Document number '+ gx_s_doc_nmbr + ' has been marked as SUCCESS for PreAward Validation.') 
End IF 

update crt_script 
set alt_1 = 'Acknowledged' where 
ticket_nmbr = :gx_s_ticket_nmbr and 
alt_2 = 'Running' and 
doc_nmbr = :gx_s_doc_nmbr 
USING SQLCA;  

    Return 1 

ElseIF cbx_1.checked = False THEN 
     messagebox("Update Preaward Validation Doc Status", 'The acknowledgment checkbox must be selected for the script to run successfully. The script will now exit. Please relaunch the script and try again . ', Stopsign!) 
     Return -1 
End IF 
+1

해당 메시지는 데이터베이스 엔진 또는 드라이버에서 온 것입니다. 오류를 생성하는 SQL 문을 좁히면 엄청난 도움이됩니다. 이 작업을 완료하면 SQL 문을 대화 형 도구로 실행하여 큰 문자열이나 숫자를 찾습니다. (정수로 제한하는 이유를 잘 모르겠지만 WAG는 넘쳐나는 것입니다.) – Terry

답변

2

두통을 줄이고 데이터웨어 하우스를 사용하면 ... 전체 스크립트를 약 10 줄로 줄일 수 있습니다.

0

폴 호랜 (Paul Horan)이 좋은 조언을 해주었습니다. 이는 DataWindow 또는 DataStores를 사용하면 간단 해집니다. 테리 보스 (Terry Voth)가 문제의 올바른 길을 걷고 있습니다.

코드에서 변수 l_pvds_obj_id은 결과가 0 일 때 gx_l_doc_obj_id과 동일한 유형이어야하므로 항상 동일합니다. 명백한 명명 체계에서 오랫동안 의도되었다. 이것은 우리가 동료 리뷰에서 찾게되는 종류의 물건입니다.

다른 몇 가지 :
대개 SQLCode가 아닌 SQLCode를 원하지만 사용중인 데이터베이스를 말하지 않았습니다.
crt_script를 업데이트 한 후 결과를 확인해야합니다.
COMMIT 또는 ROLLBACK이 표시되지 않습니다. 자동 커밋은 여러 테이블을 업데이트해야하는 경우 적합하지 않습니다.
첫 번째 SELECT의 값 대부분을 사용하고 있지 않습니다. 아마도 게시 또는 문제 해결을 위해 코드를 간소화했을 것입니다.