レコードの内容を修正するには、まず 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);