注
コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。
データベースに格納されているテーブルの 1 つまたは複数の行を更新するため、SQL ステートメントを対話的またはソース コード内で使用できます。
- update メソッド – バッファーの内容で現在のレコードを更新します。 また、適切なシステム フィールドも更新します。
- doUpdate メソッド – 一度に 1 行を更新します。
- update_recordset ステートメント – 複数のレコードを 1 回のデータベース トリップで更新します。 update_recordset ステートメントを使用することにより、アプリケーションとデータベース間の通信が減少します。 したがって、パフォーマンスの向上に役立ちます。 場合によっては、レコードのセットに基づく操作をレコードごとの操作に戻すことができます。 詳細については、セット ベースからレコード単位への操作の変換を参照してください。
メソッドの更新
update メソッドは、バッファーの内容で現在のレコードを更新します。 また、適切なシステム フィールドも更新されます。 オプションの where 句は、テーブルの各行を処理するときに update メソッドでテストされる条件を指定します。 その条件に対する true をテストする行のみ新しい値で更新されます。
次の例では、更新する CustTable テーブルを選択します。 AccountNum フィールドの値が 4000 に等しいレコードのみが更新されます。 next への呼び出しは存在せず、この例では select while ステートメントを使用しないため、更新されるのは 1 つのレコードだけです。 CreditMax フィールドの値が 5000 に変更されます。
CustTable custTable;
ttsBegin;
select forUpdate custTable
where custTable.AccountNum == '4000';
custTable.CreditMax = 5000;
custTable.update();
ttsCommit;
doUpdate メソッド
update メソッドの動作をオーバーライドするには、doUpdate メソッドを使用します。 doUpdate メソッドは、バッファーの内容で現在のレコードを更新します。 また、適切なシステム フィールドも更新されます。 テーブルでの 更新 メソッドをバイパスする必要があるときは、doUpdate メソッドを使用する必要があります。 doUpdate テーブル メソッドの構文は、void doUpdate() です。
警告
doUpdate の呼び出しは、データベース イベント ハンドラー (たとえば onUpdating および onUpdated)、コマンド チェーン onUpdate()、および update() の呼び出し自体を含むすべてのロジックをスキップします。 doUpdate を使用するのは不適切な方法と見なされるため、使用しないことをお勧めします。
CustTable custTable;
ttsBegin;
select forUpdate custTable
where custTable.CreditMax == 3000;
if (custTable)
{
custTable.CreditMax += 1000;
custTable.doUpdate();
}
ttsCommit;
「update_recordset」ステートメント
update_recordset 演算子は、サーバーへの 1 回のアクセスで複数のレコードを更新するレコード セット ベースの演算子です。 したがって、Microsoft SQL Server の機能は、一部のタスクのパフォーマンスを向上させるのに役立ちます。 update_recordset ステートメントは、X++ の delete_from と SQL の update set に似ています。 レコードを取得、変更、更新する際に、各レコードを個別に処理するのではありません。 代わりに、データベース サーバー側の SQL スタイルのレコード セットで動作します。 更新メソッドがオーバーライドされた場合、実装は、一度に 1 つのレコードが更新される古典的なループ構造に戻されます。 (この動作は、削除対象の delete_from の動作に似ています。) したがって、構築は、一時テーブルとテーブル全体 - キャッシュされたテーブルで、ループ構造を使用して動作します。
次の例では、CustTable テーブルを更新し、CreditMax の値が 0 (ゼロ) よりも大きいレコードに対して CreditMax 列の値を 1000 増分します。
CustTable custTable;
ttsBegin;
update_recordset custTable
setting CreditMax = custTable.CreditMax + 1000
where custTable.CreditMax > 0;
ttsCommit;
次の例では、複数の列を更新します。
CustTable custTable;
ttsBegin;
update_recordset custTable
setting
CreditMax = custTable.CreditMax + 1000,
AccountStatement = CustAccountStatement::Always
where custTable.CreditMax > 0;
ttsCommit;
次の例は、update_recordset ステートメントが複数のテーブルの結合をサポートしていることを示しています。 結合されたテーブルのデータを使用して、更新されるテーブル内のフィールドに値を割り当てることができます。
TableEmployee tabEmpl;
TableDepartment tabDept;
TableProject tabProj;
update_recordset tabEmpl
setting
currentStatusDescription = tabDept.DeptName + ", " + tabProj .ProjName
join tabDept
where tabDept.DeptId == tabEmpl.DeptId
join tabProj
where tabProj.ProjId == tabEmpl .ProjId;