2016-06-17 5 views
0

私はまだPowerBuilderを習得しており、慣れ親しんでいます。PowerBuilderプログラムでCT_FETCHエラーが発生しました

ct_fetch():ユーザAPI層:内部共通ライブラリエラー:結果セット項目4のバインドによってオーバーフローが発生しました。次のエラーが発生しました。 。 ErrCode: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

ポールホーランはあなたに良い助言をしました。これは、DataWindowsまたはDataStoresを使用すると簡単になります。テリー・ヴォスはあなたの問題の正しい道にあります。

コードでは、l_pvds_obj_idの変数はgx_l_doc_obj_idと同じ型である必要があります。なぜなら、結果が得られれば、常にそれに等しいからです。見た目の命名計画から、それは長くなることを意図していました。これはピアレビューで探している種類のものです。

その他のもの:
ほとんどの場合、SQLCodeではなくSQLCodeを使用することをお奨めしますが、使用しているデータベースについては言いませんでした。
crt_scriptを更新した後、結果を確認する必要があります。
COMMITまたはROLLBACKが表示されません。自動コミットは、複数の表を更新する必要がある場合には適していません。
最初のSELECTの値のほとんどを使用していません。おそらく、投稿やトラブルシューティングのためにコードを簡略化してしまったでしょう。

関連する問題