2012-04-04 81 views
1

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

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 
+0

TerryはItemStatus(get/set)を使用しています。しかし、私はあなたのコードについて奇妙なことに気付きます。 dw_datesに行がないが、その後に行1の後に行を挿入しようとすると、異常終了します。 PBが行数よりも高い数値を使用する方法を忘れていますが、行がない場合はInsertRow(0)に変更します。 Terryが言及しているように、itemstatusが間違っている理由がある場合は、SetItemStatusでそれを操作できますが、ステータスを変更できるテーブルを確認してください。 –

答えて

1

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

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

幸運、

テリー。

0

まずビジネス質問に回答する必要があります。あなたは他人の更新を失いたいですか?

DW msgを取得している場合:有効なmsgであるRetrieveとUpdateの間で行が変更されました。データウィンドウを見ると、デフォルトでUpdateによって使用されるカラムがすべて編集可能なカラムになっています。これを主キーだけに変更することができます。これにより、あなたの更新を "仕事"することができますが、他の人の変更も上書きされます。

PKがあまりにも一般的すぎるようです。ユニークでシーケンス駆動型のアプローチを検討することもできます。

ジェイソン

0

ダミー行を使用する場合はrow = dw_dates.InsertRow(0);を使用してください。最後に行が挿入されます。「row = dw_dates.InsertRow(1);」を使用するかどうかは不明です。また、SetRowまたはScrolltoRowを使用して現在の行にすることもできます。

0

だから、他のユーザーが行を挿入したということです。 次に、データウィンドウでupdate()を呼び出す直前に別のチェックを行う必要があります。 ベスト・ソリューションは、ストアード・プロシージャーの更新を使用して行が存在するかどうかをチェックし、INSERTまたはUPDATEを実行するかどうかを判断することです。しかし、もう一度、あなたが更新を行うと、他の人のデータを上書きします。

関連する問題