2013-12-11 3 views
0

계정 BC에서 사용자 지정 필드 "잠금 플래그"가 S_ORG_EXT_X 테이블에 있습니다. 이 필드는 위의 테이블에 조인을 사용하여 기회 BC에서 사용할 수 있습니다. 조인 스펙은 다음과 같습니다. Opportunity.Account Id = Account.Id. 새 기회를 만들 때 계정 ID는 항상 채워집니다. 요구 사항은 "잠금 플래그"가 'Y'와 같으면 기회 BC의 새로 생성 된 레코드에 대해 레코드를 생성하도록 허용해서는 안되며 사용자 정의 오류 메시지를 표시해야합니다.PreWriteRecord 이벤트 처리기에서 새 레코드를 확인하고 조인 된 필드의 값을 확인하십시오.

초기 제안은 유효성 검사 규칙이 평가되고 오류 메시지가 표시되는 데이터 유효성 검사 관리자 비즈니스 서비스를 호출하는 런타임 이벤트를 사용하는 것이 었습니다. 레코드를 작성할지 여부를 결정해야한다고 가정하면 WriteRecord가 이미 데이터베이스에 커밋 된 행을 가지고있는 한 로직을 PreWriteRecord 이벤트 핸들러에 배치해야합니다.

주요 문제점은 새로운 레코드인지 또는 업데이트 된 레코드인지를 확인하는 것이 었습니다. WriteRecordNew 및 WriteRecordUpdated 런타임 이벤트가 있지만 레코드가 실제로 기록 된 후에 실행되므로 사용자가 레코드를 저장할 수 없습니다. 내 다음 접근 방식은 eScript를 사용하는 것이 었습니다 : BusComp_PreWriteRecord 서버 스크립트에서 사용자 정의 코드를 작성하고 BC의 메소드 IsNewRecordPending을 호출하여 새로운 레코드인지 확인한 다음 필요하면 플래그를 점검하고 오류 메시지를 표시하십시오.

하지만 불행히도 나는 또 다른 문제에 직면하고 있습니다. 새롭게 생성 된 기회 레코드에 대해 조인 된 필드 "잠금 플래그"가 채워지지 않습니다. 우리는 BC Opportunity에 대해 이야기하고 있으며 필드는 S_ORG_EXT_X 테이블에 있습니다. 새로운 기회를 창출 할 때 우리는 그것이 속한 계정을 선택합니다. 재현 가능 : OpportunityBC.GetFieldValue ("잠금 플래그")는 새로 생성 된 레코드에 대해 null을 반환하고 이전에 저장 한 레코드에 대해 올바른 값을 반환합니다. 새로 생성 된 기회에 대해 BC에 다시 쿼리하여 "잠금 플래그"가 채워지는 것을 확인해야합니다. 레코드를 만든 직후에 조인 된 필드 값을 표시하려면 PreDefaultValue 속성을 사용하는 Oracle's recomendation 등 여러 문서를 발견했습니다. 내가 찾은 가장 적합한 표현은 학부모 : BCName.FieldName 이었지만 활성 BO는 기회와 기회 BC가 주된 원인이기 때문에 그렇지 않습니다.

  1. 이 PreWrite 이벤트를 처리하고 eScript와 BC를 사용하지 않고, 그것은 새로운 기록인지 아닌지 판단 할 수있는 방법이 있나요 : 당신이 여기까지 읽고 결국 내 질문에 오면 양해

    감사합니다 .NewRecordPending 메소드?

  2. 특히 PreWriteRecord 이벤트 처리기에서 새로 만든 레코드의 조인 된 필드의 값을 가져 오는 방법은 무엇입니까? 내 질문의 첫 번째 부분에 대한 해답을 발견 :

이 UPDATE가

시벨 8.1입니다. 이제는 처음에 어떻게하지 않았는지 궁금해하고 있습니다. 여기에 해결책이 있습니다.

  1. PreWriteRecord에서 트리거 된 런타임 이벤트 만들기. Data Validation Manager 비즈니스 서비스에 대한 호출을 지정합니다.조건

NOT (BCHasRows ("기회", "기회", "[ID = '"+ [ID] + "'"이다 DVM에서

  • 은 룰 및 규칙을 만들 "AllView"))

  • 그게 전부입니다. 우리는 동일한 행 ID와 함께 기록을 찾고 있습니다. 새로운 레코드 인 경우 아직 데이터베이스에 아무 것도 없어야합니다 (우리는 PreWriteRecord 핸들러에 있음을 기억하십시오). 함수는 FALSE를 반환합니다. 우리가 어떤 행을 업데이트한다면 TRUE가됩니다. NOT으로 결과를 반전 시키면 DVM이 새 레코드에 오류를 발생시킵니다.

    제 질문의 두 번째 부분은 PickMap을 사용하여 가입 필드를 채우기 위해 제안한 @RanjithR입니다 (아래 참조). 내가 그 방법을 확인하고 적어도 당신이 적절한 PickMap을 가지고 있다면 잘 작동합니다.

    답변

    1

    우리 Siebel 개발자는 레코드가 새로운 것인지를 올바르게 판별하기 위해 스크립팅을 사용했습니다. 비 스크립팅 방법 중 하나는 RuntimeEvents를 사용하여 BusComp NewRecord 이벤트 중에 프로필 속성을 설정 한 다음 PreWrite 이벤트에서 레코드가 새로운 것인지 확인하는 것입니다. 그러나 사용자가 레코드를 실행 취소 할 수있는 기회가 항상 있으며 이러한 시나리오는 까다 롭습니다.

    또 다른 옵션은 RunTime 이벤트에서 BC 메소드 : IsNewRecordPending을 호출 해보십시오. 나는 이것을 시도하지 않았다.

    쿼리의 두 번째 부분에서는 PickMap을 사용하여 문제를 쉽게 해결할 수 있다고 생각합니다.

    Opportunity BC에서 계정을 선택하면 계정에서 잠긴 플래그를 선택하기위한 픽맵 하나를 추가하고 기회 BC에서 해당 필드로 설정하십시오. 사용자가 계정을 선택하면 잠금 플래그를 선택하고 스크립트가 PreWriteRecord에서 작동합니다.

    또 다른 해결책을 제안해도 되겠습니까? 나는 그것을 시도하지 않았습니다.

    새 레코드를 만들 때, 필드 ModificationNumber 0으로 당신이 그것을 수정 때마다 설정됩니다

    의 ModificationNumber가 설정 1.

    DataValidationManager 규칙 집합의 증가에 계정 필드의 PreSetFieldValue 이벤트에서 트리거됩니다 기회 BC. LockFlag = Y AND (ModificationNumber IS NULL 또는 ModificationNumber = 0)을 확인하고 오류를 던집니다. 새 레코드를 만들 때 DVM에서 오류가 발생해야합니다.

    모범 사례는 ModNumbers를 사용하지 않는다고 말합니다. NewRecord에 신호를 보내도록 ProfileAttribute를 설정 한 다음 DVM에서 해당 속성을 사용할 수 있습니다. 그러나 WriteRecord 및 UndoRecord에서 ProfileAttribute의 값을 지우는 것을 잊지 마십시오.

    어떻게 진행했는지 알려주세요.

    +0

    실제로 계산 된 필드에 대해서는 이미 제안한 방식대로 처리했습니다. 다양한 PreDefaultValue 표현식을 사용해 본 후에 생각하기 시작한 또 다른 방법이 있습니다. 잠시 PickMap이 내 마음 속에 들어 왔으며 테스트를 마친 후에도 효과가 있다고 말할 수 있습니다. 스크립팅하지 않고 새 레코드를 확인하는 방법을 찾았으며 곧 내 질문을 업데이트 할 것입니다. 어쨌든 당신의 모든 제안에 감사드립니다! –

    +0

    안녕 Yaroslav, 그것은 BCHasRows를 사용하여 깔끔한 트릭입니다. 결코 생각하지 못했습니다. 그러나 BC의 모든보기에서 쿼리하는 경우 장기적으로 성능 문제가 나타날 수 있습니다. 하지만, 깔끔한 트릭은 전혀 없습니다 :-D –

    +0

    Well ROW_ID 컬럼은 고유 한 인덱스를 가지고 있습니다. 확실히 쿼리는 리소스를 소모하지만 너무 많이 믿지는 않습니다. :) –