Excel からの製品データのインポート時におけるカスタム検証の追加
インポート可能スプレッドシートを使用してデータをインポートする際に、カスタマイズされた新しい検証を追加できます。カスタマイズ機能により、既成の検証を妨げたりデータを変更したりすることなく、検証を拡張できます。Excel からのデータのインポートについては、「Excel からの製品データのインポート方法」を参照してください。
以下を対象とした 3 つの検証ユースケースがサポートされています。
ワークブック内のワークシートの単一行内の異なるセル。
ワークブック内のワークシートの異なる行。
ワークブック内の異なるワークシート。
ワークブック内のワークシートの単一行内の異なるセル間での検証を可能にするカスタマイズ
単一行内の異なるセルがキーと値のペアとして提供される、行レベルの検証を追加できます。
インタフェース SpreadsheetSingleSheetValidatorDelegate は、行レベルのデータを検証するために必要な API を提供します。このインタフェースのデフォルト実装である DefaultSpreadsheetSingleSheetValidatorDelegate は、すぐに使用できるクラスを提供するほか、カスタム検証からスローされたカスタム警告や例外を処理するメカニズムも提供します。
* 
カスタマイズロジックが確実に Windchill のエクスポートおよびインポートフレームワークと統合されるようにするために、DefaultSpreadsheetSingleSheetValidatorDelegate を拡張することが推奨されます。
特定の行に対する検証を追加するには、次の手順を実行します。
1. validateFieldsForSingleRow(String sheetName, String rowNumber, Map rowData, Locale locale) API をオーバーライドして、次のパラメータが含まれるようにします。
当該行が属するワークシートの名前。
当該行の番号。
key-value ペアとして指定した、当該行内のすべてのフィールドのマップ。たとえば、Number=00001 などです。
ローカライズされた警告や例外メッセージを表示するためのロケール情報。
2. 検証が完了した後、カスタマイズロジックに対して例外や警告をスローする場合は、addException() を呼び出します。
これにより、例外や警告が、既成の例外や警告と一貫性のある様式でユーザーインタフェースにレンダリングされます。
3. 次に示すように、作成した委任を service.xconf ファイル内で目的の ImportSheetType (BOM など) に対して登録します。
<Service context="default" name="com.ptc.windchill.ixb.importer.custom.validator.SpreadsheetSingleSheetValidatorDelegate">
<Option requestor="null" selector="BOM"
serviceClass=" com.ptc.windchill.ixb.importer.custom.validator.delegate. DefaultSpreadsheetSingleSheetValidatorDelegate"/>
4. 委任を登録した後、xconfmanager ユーティリティを実行します。
ワークブック内のワークシートの異なる行間での検証を可能にするカスタマイズ
ワークシート内の複数行にまたがるワークシートレベルの検証を追加できます。
インタフェース SpreadsheetSingleSheetValidatorDelegate は、シートレベルのデータを検証するために必要な API を提供します。このインタフェースのデフォルト実装である DefaultSpreadsheetSingleSheetValidatorDelegate は、すぐに使用できるクラスを提供するほか、カスタム検証からスローされたカスタム警告や例外を処理するメカニズムも提供します。
* 
カスタマイズロジックが確実に Windchill のエクスポートおよびインポートフレームワークと統合されるようにするために、DefaultSpreadsheetSingleSheetValidatorDelegate を拡張することが推奨されます。
特定のワークシートに対する検証を追加するには、次の手順を実行します。
1. validateFieldsForSheetWithAllRowElements (String sheetName, Map<String, Map> allRowsMap, Locale locale) API をオーバーライドして、次のパラメータが含まれるようにします。
検証を追加する対象のワークシートの名前。
key-value ペアとして指定した、行の詳細のマップ (たとえば、Number=00001)。key は行番号を表し、value は当該行内のすべてのフィールドのマップを表します。
ローカライズされた警告や例外メッセージを表示するためのロケール情報。
2. 検証が完了した後、カスタマイズロジックに対して例外や警告をスローする場合は、addException() を呼び出します。
これにより、例外や警告が、既成の例外や警告と一貫性のある様式でユーザーインタフェースにレンダリングされます。
3. 次に示すように、作成した委任を service.xconf ファイル内で目的の ImportSheetType (BOM など) に対して登録します。
<Service context="default" name="com.ptc.windchill.ixb.importer.custom.validator.SpreadsheetSingleSheetValidatorDelegate">
<Option requestor="null" selector="BOM"
serviceClass=" com.ptc.windchill.ixb.importer.custom.validator.delegate. DefaultSpreadsheetSingleSheetValidatorDelegate"/>
4. 委任を登録した後、xconfmanager ユーティリティを実行します。
アセンブリ内の重複する子を検証する例を以下に示します。
public class SampleExampleSpreadsheetImportSingleSheetValdiatorDelegate extends DefaultSpreadsheetSingleSheetValidatorDelegate {
@Override
public void validateFieldsForSheetWithAllRowElements(String sheetName, Map<String, Map> allRowsMap,Locale locale)
throws WTException {
Set children = new HashSet();
if (allRowsMap != null) {
for (Entry<String, Map> entry : allRowsMap.entrySet()) {
String rowNumber = entry.getKey();
Map rowdata = entry.getValue();
String childNumber = (String) rowdata.get("Number");
if(childNumber != null) {
if (children.contains(childNumber)) {
String warningMsg = "Duplicate Child found in Assembly at row number :" + rowNumber;
addException(sheetName, rowNumber, warningMsg, false);
}
else {
children.add(childNumber);
}
}
}
}
}

}
ワークブック内の異なるワークシート間での検証を可能にするカスタマイズ
ワークブック内の異なるワークシート間での検証を追加できます。これにより、ワークブックの複数のワークシートのデータが検証に必要となる特定のシナリオを検証できるようになります。
インタフェース SpreadsheetWorkbookDataValidatorDelegate は、ワークブックレベルのデータを検証するために必要な API を提供します。このインタフェースのデフォルト実装である DefaultSpreadsheetWorkbookDataValidatorDelegate は、すぐに使用できるクラスを提供するほか、カスタム検証からスローされたカスタム警告や例外を処理するメカニズムも提供します。
* 
カスタマイズロジックが確実に Windchill のエクスポートおよびインポートフレームワークと統合されるようにするために、DefaultSpreadsheetWorkbookDataValidatorDelegate を拡張することが推奨されます。
特定のワークブックに対する検証を追加するには、次の手順を実行します。
1. validateFieldsForAllSheetsInWorkbook (Map<String, Map<String, Map<String, Map>>> trackableToElementsMap, Locale locale) API をオーバーライドして、次のパラメータが含まれるようにします。
次の情報を含むマップ。
key: ImportSheetType (BOM など) を表します。
value: 次の情報を含むマップを表します。
key: ワークシートの名前を表します。
value: ワークシートレベルの行の詳細のマップを表します。このマップで、key は行番号を表し、valuekey-value ペアとして指定された行の詳細のマップを表します (たとえば、Number=00001)。
ローカライズされた警告や例外メッセージを表示するためのロケール情報。
2. 検証が完了した後、カスタマイズロジックに対して例外や警告をスローする場合は、addException() を呼び出します。
これにより、例外や警告が、既成の例外や警告と一貫性のある様式でユーザーインタフェースにレンダリングされます。
3. 次に示すように、作成した委任を service.xconf ファイル内で目的の ImportSheetType (BOM など) に対して登録します。
<Service context="default" name="com.ptc.windchill.ixb.importer.custom.validator. SpreadsheetWorkbookDataValidatorDelegate">
<Option requestor="null" selector="All"
serviceClass=" com.ptc.windchill.ixb.importer.custom.validator.delegate. DefaultSpreadsheetWorkbookDataValidatorDelegate"/>
4. 委任を登録した後、xconfmanager ユーティリティを実行します。
以下の例は、代用リンクに対応する親子リンクがワークシート内に存在するかどうかを確認しています。
public class SampleExampleAllWorkbookValidatorDelegate extends DefaultSpreadsheetWorkbookDataValidatorDelegate {

private static String BOM_TYPE = "bom";
private static String REPLACMENT_TYPE = "replacements";
private static String REPLACMENT_SHEET_NAME = "WTPartSubstituteLink-Sheet";
private static String BOM_SHEET_NAME = "BOMSheet1";
@Override
public void validateFieldsForAllSheetsInWorkbook(
Map<String, Map<String, Map<String, Map>>> allSheetData, Locale locale) throws WTException {

Map<String, Map> allBOMElements = new HashMap<String, Map>();
if (allSheetData != null) {

Map<String, Map<String, Map>> allBomSheetValues = allSheetData.get(BOM_TYPE);
// Read first sheet
if (allBomSheetValues != null) {
Map<String, Map> bomEntries = allBomSheetValues.get(BOM_SHEET_NAME);
for (Entry<String, Map> entry : bomEntries.entrySet()) {
Map rowData = entry.getValue();

String partNumber = (String) rowData.get("Number");
allBOMElements.put(partNumber, rowData);
}

Map<String, Map<String, Map>> replacementSheetValues = allSheetData.get(REPLACMENT_TYPE);
if (replacementSheetValues != null) {
Map<String, Map> replacementEntries = replacementSheetValues.get(REPLACMENT_SHEET_NAME);

for (Entry<String, Map> entry : replacementEntries.entrySet()) {
String rowNumber = entry.getKey();
Map rowData = entry.getValue();

String parentPartNumber = (String) rowData.get("Parent Part Number");
String childPartNumber = (String) rowData.get("Child Part Number");

if (!isUsageLinkExistsForThisSubstituteLinkEntry(allBOMElements, parentPartNumber,
childPartNumber)) {
String warningMsg = "No Usage Link Exists for this substitute Entry at row number :"
+ rowNumber;
addException(REPLACMENT_SHEET_NAME, rowNumber, warningMsg, false);
}
}
}

}
}

}
これは役に立ちましたか?