レコード全体の変更
データの変更 への移動
フォーム上の、グリッドとナビゲータを除くすべてのデータベース対応コントロールは、レコード内の 1 つのフィールドにアクセスします。
ただし、データセットの背後にあるデータベース テーブルの構造が安定していて変化しないなら、レコード構造全体を操作する以下のメソッドをコードで使用することができます。次の表に、レコード内の個々のフィールドではなくレコード全体を操作できるメソッドをまとめます。
レコード全体を操作するメソッド:
メソッド | 説明 |
---|---|
AppendRecord([値の配列]) |
指定された列値を持つレコードをテーブルの末尾に追加します。Append に似ています。暗黙的に Post を実行します。 |
InsertRecord([値の配列]) |
テーブルの現在のカーソル位置の前に、指定された値をレコードとして挿入します。Insert に似ています。暗黙的に Post を実行します。 |
SetFields([値の配列]) |
対応するフィールドの値を設定します。それぞれの TField への値の代入に似ています。アプリケーションで明示的に Post を実行しなければなりません。 |
これらのメソッドは、値の配列を引数として受け取ります。配列のそれぞれの値は、背後にあるデータセットの 1 つの列に対応します。値に指定できるのは、リテラルか変数か NULL です。引数の値の数がデータセットの列数よりも少ない場合、残りの値は NULL と見なされます。
インデックスのないデータセットでは、AppendRecord はデータセットの末尾にレコードを追加し、InsertRecord は現在のカーソル位置の後にレコードを挿入します。インデックス付きのデータセットでは、どちらのメソッドも、インデックスに基づいてテーブル内の正しい位置にレコードを配置します。どちらの場合でも、カーソルはレコードの位置に移動します。
SetFields は、パラメータ配列に指定された値をデータセットのフィールドに代入します。SetFields を使用する前に、アプリケーションでまず Edit を呼び出して、データセットを dsEdit モードにしなければなりません。また、変更を現在のレコードに適用するには、Post を実行しなければなりません。
SetFields を使って、既存レコード内のすべてではなく一部のフィールドを変更したい場合は、変更しないフィールドの値として NULL を渡すことができます。指定した値の数がレコードのフィールド数よりも少ない場合、SetFields は足りない分に NULL 値を代入します。この NULL 値によって、フィールドの既存の値が上書きされます。
たとえば、データベースに COUNTRY というテーブルがあり、Name、Capital、Continent、Area、Population という列が含まれているとします。CountryTable という名前の Bde.DBTables.TTable コンポーネントが COUNTRY テーブルにリンクされていると、次の文によって COUNTRY テーブルにレコードが挿入されます。
CountryTable.InsertRecord(['Japan', 'Tokyo', 'Asia']);
CountryTable->InsertRecord(ARRAYOFCONST(("Japan", "Tokyo", "Asia")));
この文では Area と Population の値が指定されていないため、そこには NULL 値が挿入されます。テーブルは Name にインデックスが付いているため、文を実行するとアルファベット順の "Japan" の位置にレコードが挿入されます。
レコードを更新するには、たとえば次のようなコードを使用できます。
with CountryTable do begin if Locate('Name', 'Japan', loCaseInsensitive) then; begin Edit; SetFields(nil, nil, nil, 344567, 164700000); Post; end; end;
TLocateOptions SearchOptions; SearchOptions->Clear(); SearchOptions << loCaseInsensitive; if (CountryTable->Locate("Name", "Japan", SearchOptions)) { CountryTable->Edit(); CountryTable->SetFields(ARRAYOFCONST(((void *)NULL, (void *)NULL, (void *)NULL, 344567, 164700000))); CountryTable->Post(); }
このコードでは、Area と Population のフィールドに値を割り当て、それをデータベースに登録しています。3 つの NULL ポインタは、最初の 3 つの列の現在の内容をそのまま維持するためのプレースホルダとして機能します。