レコードの内容を修正するには、まず GetEntity メソッドを呼び出して 対象のレコードを取り出してから、Session オブジェクトの EditEntity メソッドを 呼び出します。
EditEntity メソッドは、指定されたアクションをレコードに対して実行し、 レコードを編集可能にします。エンティティ パラメータに指定する Entity オブジェクトは、GetEntityByDbId または GetEntity を呼び出すかまたはクエリーを実行して、事前に取得されている必要があります。
$session->EditEntity(entity, edit_action_name);
edit_action_name パラメータのリーガル値のリストを取得するには、該当する EntityDef オブジェクトの GetActionDefNames メソッドを呼び出します。
# Build Session object... # Edit the record whose ID is "BUGDB00000010" using the "modify" action $objtoedit = $sessionobj->GetEntity("defect", "BUGDB00000010"); $sessionobj->EditEntity($objtoedit,"modify");
EditEntity メソッドを呼び出すと、Entity オブジェクトのメソッドを呼び出して、対応するレコードのフィールドを変更できます。また、フィールド内の データのタイプや全体としてのレコードについての追加情報の取得や、 現行アクションの期間中のフィールド動作の変更も可能です。
SetFieldValue メソッドは、指定されたフィールドに指定値を 設定します。フィールドが変更可能な場合、新規の値が有効であるかどうかに関係なく、このメソッドによって新規の値が設定され、空の文字列が戻されます。
フィールドに有効な値が入っているかどうかを判別するには、そのフィールドの FieldInfo オブジェクトを取り出し、FieldInfo オブジェクトの ValidityChangedThisSetValue メソッドを呼び出して、フィールドを検証します。フィールドを変更できない場合、戻された文字列に、フィールドを変更できない理由が示されています。通常の値は、「no such field」、「record is not being edited」、「field is read-only」です。フィールドが 1 つでなく複数の値を持つことができる場合は、AddFieldValue メソッドを使用してそれぞれの新規の値を追加します。SetFieldValue を使用することも正しい方法です。しかし、すでに値のリストが含まれているフィールドに SetFieldValue を使用すると、リスト全体が新規の単一値で置換されます。このメソッドは、Entity オブジェクトが編集可能な場合にのみ呼び出すことができます。
$entity->SetFieldValue(field_name, new_value);
既存のレコードを編集するには、次の手順に従います。
use CQPerlExt; #Getting the session my $session = CQSession::Build(); CQSession::UserLogon ($session, "admin", "", "SAMPL", "Lab3"); my $querydef = $session->BuildQuery ("defect"); $querydef->BuildField ("id"); $querydef->BuildField ("headline"); my $resultset = $session->BuildResultSet ($querydef); $resultset->Execute(); while (($resultset->MoveNext()) == 1) { $id = $resultset->GetColumnValue(1); $rec = $session->GetEntity("Defect", $id); $head = $rec->GetFieldValue("Headline")->GetValue(); $state= $rec->GetFieldValue("State")->GetValue(); print "$id, $head, $state. ¥n"; if ($id eq "SAMPL00000012") { $session->EditEntity($rec, "Modify"); $rec->SetFieldValue("description", "This defect has been modified."); $status = $rec->Validate(); if ( $status ){ $rec->Revert; die "Validation Error: $status \n" } else { # Only commit the changes if the validation is first successful. $rec->Commit(); } } } CQSession::Unbuild($session);