1

私が抱えている問題は次のとおりです。ウィンドウを開いたときに行が存在するかどうかをチェックし、存在しない場合は手動で行を挿入するデータウィンドウがあります。ある時点で、データウィンドウで update を呼び出す前に、行がテーブルに挿入されています。更新を呼び出すと、行が既に存在し、更新の代わりに挿入を使用しているため、更新を保存できません。これを軽減する方法はありますか?

dw_dates.SetTransObject(SQLCA);
dw_dates.Retrieve(gs_facility_pfi, is_pcn);    

if(dw_dates.rowcount() = 0) then
    int row;
    row = dw_dates.InsertRow(1);    
    dw_dates.setitem(row, 'patient_ctrl_num', is_pcn);
    dw_dates.setitem(row, 'pfi_num', gs_facility_pfi);  
end if
4

4 に答える 4

1

PowerBuilder は、そこに同じキーを持つ行があるかどうかを自動的に認識しません。データウィンドウは、行のステータスに基づいて INSERT または UPDATE ステートメントを生成します (詳細については、ヘルプの GetItemStatus() を参照してください)。

あなたの要件が何であるかは本当に明確ではありません。新しいレコードを挿入するか、既存のレコードを上書きする場合は、INSERT または UPDATE が必要かどうかを判断し、それに応じて動作するデータウィンドウからストアド プロシージャを更新することをお勧めします。このクライアントに常に新しいレコードを挿入させ、主キーの値を適切に調整して、既存のデータを上書きしたり競合したりしないようにする場合は、DBMS がキー列の ID またはシーケンス値をサポートしているかどうかを確認することをお勧めします。をクリックし、データウィンドウの [プロパティの更新] ダイアログの ID 列機能を確認します。

幸運を、

テリー。

于 2012-04-05T16:31:11.000 に答える
0

""を使用するかどうかわからない場合row = dw_dates.InsertRow(1); 、ダミー行が必要な場合は、使用してみてください row = dw_dates.InsertRow(0); 。これにより、行が最後に挿入されます。また、SetRowまたはScrolltoRowを順番に使用して、現在の行にすることもできます。

于 2012-04-11T06:29:02.987 に答える
0

つまり、他のユーザーが行を挿入したということです。次に、datawindow で update() を呼び出す直前に、別のチェックを行う必要があります。最良の解決策は、ストアド プロシージャの更新を使用して行が存在するかどうかを確認し、INSERT または UPDATE を実行するかどうかを決定することです。ただし、UPDATE を実行すると、他のユーザーのデータが上書きされます。

于 2013-02-06T10:55:38.493 に答える
0

まず、ビジネス上の質問に答える必要があります。他の人の更新を失いますか?

DW msg: Rows changed between Retrieve and Update... を取得している場合、これは有効なメッセージです。データウィンドウを見ると、デフォルトで Update で使用される列がすべて編集可能な列であることがわかります。これを主キーのみに変更できます。これにより、更新が「機能」するようになりますが、他の人の変更も上書きされます。

PK が一般的すぎるようです。独自のシーケンス駆動型アプローチを検討することをお勧めします。

ジェイソン

于 2012-04-04T22:02:06.523 に答える