가져오기 서비스 사용자 정의의 예
다음 단원에서는 특정 재정의 가능 서비스에 대한 사용자 정의 예를 제공합니다.
Import
GetImportSupportedBaseTypes
GetImportSupportedBaseTypes 서비스를 사용하면 가져오기가 지원되는 속성 기본 유형을 제어할 수 있습니다. 이 사용자 정의 예는 속성 기본 유형을 가져오기에서 제외합니다.
1. ThingWorx Composer에서 편집할 PTC.SCA.SCO.Common.ImportExportEquipmentUtils 사물을 엽니다.
2. 서비스에서 GetImportSupportedBaseTypes를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 지원되는 기본 유형 목록을 확인합니다.
var result = ['Boolean', 'DateTime', 'Integer', 'Long', 'JSON', 'Number', 'String'];
4. 기본 유형을 가져오기에서 제외하려면 목록에서 제외할 기본 유형을 삭제하거나 주석으로 처리합니다. 예를 들어, JSON 기본 유형을 제외하려면 다음과 같이 서비스를 업데이트합니다.
var result = ['Boolean', 'DateTime', 'Integer', 'Long', 'Number', 'String'];
5. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
6. 저장을 클릭하여 사물을 저장합니다.
변경한 후에는 JSON 기본 유형이 포함된 속성이 가져오기 스프레드시트에 있어도 가져오지 않습니다. 스프레드시트가 업로드되고 유효성 검사가 수행될 때 JSON 기본 유형이 포함된 속성은 유효하지 않은 것으로 계산되어 가져오는 동안 건너뜁니다.
* 
가져오기에 부적합한 데이터의 세부 정보를 보려면 스크립트 로그에 액세스하십시오.
1. ThingWorx Composer의 왼쪽 창에 있는 모니터링 을 클릭합니다.
2. 로그에서 ScriptLog를 클릭합니다.
3. ScriptLog 테이블에서 행을 선택하여 해당 엔티티에 대한 로그 메시지를 확인합니다.
ParseImportFile
이 예에서는 구문 분석 메시지가 Warn 수준으로 ScriptLog에 표시되도록 가져오기 구문 분석 프로세스를 사용자 정의합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ParseExcelProcessor 사물을 엽니다.
2. 서비스에서 ParseImportFile을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음과 같이 로거 수준을 WARN으로 변경합니다.
var result = (function () {
var constants = Things["PTC.SCA.SCO.Common.ImportExportEquipmentUtils"].GetImportExportConstants();
logger.warn("Parsing process started");
var user = Resources["CurrentSessionInfo"].GetCurrentUser();
var lastFileEntry = Things["PTC.SCA.SCO.Common.ImportProcessHistoryDataTable"].GetDataTableEntryByKey({ key: user });
// Invoke service which parses equipment data
var parsedInfoTable = Resources["PTC.Factory.CommonUtilities"].ParseImportFile({
fileName: lastFileEntry.FileName /* STRING */ ,
dataShape: constants.importExportDataShape /* DATASHAPENAME */
});
logger.warn("Parsing process completed");
return parsedInfoTable;
})();
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ValidateEquipment
이 예에서는 가져오기 스프레드시트에 지정된 프로젝트가 없는 경우에도 장비가 작성되도록 장비 유효성 검사를 사용자 정의합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateEquipment를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾아 주석 처리합니다.
if (project.length > 0 && !validateProject(project)) {
logger.warn("Import Validation Process: [General Information Tab] [Name: " + name + "] Invalid reason: Project does not exist");
isInformationIncorrect = true;
}
이렇게 하면 코드에서 장비에 대해 지정된 프로젝트가 있는지 확인하는 작업을 건너뜁니다.
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ValidateEquipmentHierarchyTab
이 사용자 정의 예를 실행하면 ScriptLogValidateEquipmentHierarchyTab 서비스의 시작을 추적 엔트리로 기록합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateEquipmentHierarchyTab을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 스크립트 끝에 다음 코드를 추가합니다.
logger.trace("Validation complete for EquipmentHierarchyTab custom service");
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
6. 모니터링 > ScriptLog로 이동하고 로그 수준 설정을 추적으로 변경합니다. 이제 ValidateEquipmentHierarchyTab 사용자 정의 서비스를 시작하기 위한 추적 엔트리가 로그에 포함됩니다.
ValidateImportFile
이 사용자 정의 예는 유효성 검사 결과 테이블에서 워크시트(탭) 이름을 장비 구조 대신 계층 구조로 표시합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateImportFile을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾아 주석 처리합니다.
var equipmentHierarchyToken = Resources["RuntimeLocalizationFunctions"].GetEffectiveTokenForLanguage({
language: currentUserLanguage,
token: constants.equipmentHierarchyToken
});
4. 다음과 같이 새 주석 바로 다음 줄에 있는 방정식을 편집하여 값을 equipmentHierarchyToken에서 Hierarchy로 변경합니다.
hierarchyReport[workSheetColumn] = Hierarchy;
5. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
6. 저장을 클릭하여 사물을 저장합니다.
ValidateLocallyBoundProperty
이 예에서는 지정된 PTC.SCA.SCO.Demo.KepServer 사물만 로컬로 바인딩된 속성에 사용할 수 있도록 로컬로 바인딩된 속성에 대한 유효성 검사를 사용자 정의합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateLocallyBoundProperty를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 검색하여 찾습니다.
// Check if server thing or property for bounding exists
if (!boundThingExists || property.length === 0) {
validationResult = me.GenerateReportForEquipment({
operation: constants.invalid
});
if (!boundThingExists) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Thing does not exist");
}
if (property.length === 0) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Property not specified");
}
} else {
이러한 줄을 다음 코드로 바꿉니다.
// Check if server thing or property for bounding exists and if thing is same as required
if (!boundThingExists || thing !== "PTC.SCA.SCO.Demo.KepServer" || property.length === 0) {
validationResult = me.GenerateReportForEquipment({
operation: constants.invalid
});
if (!boundThingExists) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Thing does not exist");
}
if (thing !== "PTC.SCA.SCO.Demo.KepServer") {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Property can be locally bounded only to specified thing");
}
if (property.length === 0) {
logger.warn("Import Validation Process: [Properties Tab] [Equipment Name: " + thingName + " Name: " + name + "] Invalid reason: Property not specified");
}
}
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ValidatePropertiesTab
이 예에서는 장비를 가져올 때 가져오기 스프레드시트의 속성 탭에 대한 유효성 검사를 사용자 정의하므로, 속성 이름이 InternalPrefix로 시작하지 않으면 유효한 속성 이름으로 간주됩니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidatePropertiesTab을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾습니다.
var isNameValid = isValidPropertyName(propertyName);
다음 코드를 다음 줄로 삽입합니다.
isNameValid = !propertyName.startsWith("InternalPrefix");
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ValidateProperty
이 예에서는 바인딩 열에 원격으로 바인딩됨 값이 있는 것으로 가져오기 스프레드시트에 지정된 모든 속성이 유효하지 않은 것으로 간주되어 가져오기 프로세스에 의해 생성되거나 업데이트되지 않도록 유효성 검사를 사용자 정의합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateProperty를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾아 주석 처리합니다.
} else if (equalsIgnoreCase(binding, constants.remotelyBound)) {
validationResult = me.ValidateRemotelyBoundProperty({
parsedInfoTable: parsedInfoTable
});
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ValidateRemotelyBoundProperty
이 예에서는 가져오기 스프레드시트에서 기존의 원격으로 바인딩된 속성에 대한 원격 속성 이름 값이 변경된 경우 유효성 검사 프로세스가 이 변경 사항을 인식하지 못하고 가져오는 동안 속성 값이 업데이트되지 않도록 유효성 검사를 사용자 정의합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateRemotelyBoundProperty를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾습니다.
if (isRemotePropertyNameDifferent(remotePropertyName, remotePropertyBindingInfo)) {
updated = true;
} else if (isCacheIntervalDifferent(cacheInterval, thingName, name)) {
다음과 같이 else 문을 통해 코드를 주석 처리합니다.
/* if (isRemotePropertyNameDifferent(remotePropertyName, remotePropertyBindingInfo)) {
updated = true;
} else */
if (isCacheIntervalDifferent(cacheInterval, thingName, name)) {
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ValidateGeneralInformationTab
이 예에서는 스프레드시트에서 정의된 이름에 필수 Equipment_ 접두어가 없는 장비를 유효하지 않은 것으로 간주하고 가져오는 동안 만들지 않도록 유효성 검사를 사용자 정의합니다.
장비를 가져올 때 일반 정보 탭의 유효성 검사를 사용자 정의하려면 다음을 수행하십시오.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportValidator 사물을 엽니다.
2. 서비스에서 ValidateGeneralInformationTab을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 코드 줄을 찾습니다.
// validate context and network
해당 코드 줄 바로 앞에 다음 코드를 삽입합니다.
if (name.substring(0, 10) !== "Equipment_") {
reportInfoTable = markEquipment(reportInfoTable, reportDataShapeFields, constants.invalid);
logger.warn("Import Validation Process: [General Information Tab] [Row number: " + rowNum + "] Invalid reason: Name does not have required prefix");
continue;
}
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
Import
이 사용자 정의 예는 가져오기 후 프로세스가 실행되지 않도록 합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 Import를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾아 주석 처리합니다.
// Run post-import process
me.PostImport({
parsedInfoTable: parsedInfoTable
});
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ImportEquipmentHierarchy
이 사용자 정의 예를 실행하면 ScriptLogImportEquipmentHierarchy 서비스의 시작을 추적 엔트리로 기록합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 ImportEquipmentHierarchy를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 스크립트 끝에 다음 코드를 추가합니다.
logger.trace("Entering ImportEquipmentHierarchy custom service");
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
6. 모니터링 > ScriptLog로 이동하고 로그 수준 설정을 추적으로 변경합니다. 이제 ImportEquipmentHierarchy 사용자 정의 서비스를 시작하기 위한 추적 엔트리가 로그에 포함됩니다.
ImportEquipmentInformation
이 사용자 지정 예에서는 가져오기 스프레드시트에 지정된 표시 이름 값이 없는 장비 부분의 기본 표시 이름에 접두사 "E_"가 추가됩니다. 기본 디스플레이 이름은 ThingWorx Composer의 사물 이름입니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 ImportEquipmentInformation을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 코드를 찾습니다.
if (thing != null) {
if (displayName.length > 0) {
thing.displayName = displayName;
}
끝에 있는 중괄호 뒤에 다음 코드를 삽입합니다.
else {
thing.displayName = "E_" + name;
}
이제 코드가 다음과 같이 표시됩니다.
if (thing != null) {
if (displayName.length > 0) {
thing.displayName = displayName;
} else {
thing.displayName = "E_" + name;
}
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ImportGeneralInformation
이 사용자 정의 예에서는 ScriptLog에서 가져오는 동안 처리된 행 수에 대한 정보를 표시하고 표시된 로그 수준을 추적으로 변경합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 ImportEquipmentInformation을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 서비스 창에서 27행 뒤에 다음 코드 라인을 추가하여 처리된 행에 대한 로그 정보를 전송합니다.
logger.trace("Import Process: [General Information Tab] Already processed rows: " + (i + 1));
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ScriptLog에 표시된 로그 수준을 변경하려면 다음을 수행하십시오.
1. ScriptLog에서 구성을 클릭합니다.
2. 로그 구성 창의 로그 수준 드롭다운 목록에서 원하는 수준을 선택합니다.
3. 적용을 클릭합니다.
ImportNoneBoundProperty
이 사용자 정의 예를 실행하면 가져오기 스프레드시트에 지정된 로깅됨 값과 관계없이, 바인딩 값이 없음인 가져오기 스프레드시트에 지정된 모든 속성이 ThingWorx Composer에 생성되며 로깅됨 값이 True로 지정됩니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 ImportNoneBoundProperty를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾습니다.
var logged = getBooleanValue(equipmentProperty[loggedHeader]);
이 줄을 다음과 같이 편집합니다.
var logged = true;
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ImportProperties
이 사용자 정의 예를 실행하면 로컬로 바인딩된 속성이 가져오기 스프레드시트에 지정되어 있어도 가져오기 프로세스에서 해당 속성을 만들지 않습니다. 또한 유효성 검사 프로세스에 의해 유효하지 않은 행으로 보고되지 않습니다.
장비를 가져올 때 속성 가져오기를 사용자 정의하려면 다음을 수행하십시오.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 ImportProperties을 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 줄을 찾아 주석 처리합니다.
} else if (equalsIgnoreCase(binding, constants.locallyBound)) {
me.ImportLocallyBoundProperty({
equipmentProperty: propertyRowInfoTable
});
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
ImportRemotelyBoundProperty
이 사용자 정의 예를 실행하면 가져오기 스프레드시트에 지정된 바인딩 값이 원격으로 바인딩됨인 가져오기 프로세스에 의해 생성된 모든 속성이 ThingWorx Composer의 장비에 대해 속성 및 경고 페이지의 연결해제할 경우모든 변경 사항을 마지막으로 변경된 단일 값으로 결합 값으로 설정됩니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 ImportRemotelyBoundProperty를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 다음 코드 섹션을 찾은 다음 각 섹션에서 값을 NONE에서 FOLD로 변경합니다.
if (params.whenDisconnected.length === 0) {
params.whenDisconnected = 'NONE';
}
if (whenDisconnected.length === 0 || whenDisconnected.length > 0 && !isWhenDisconnectedAllowed(whenDisconnected)) {
whenDisconnected = 'NONE';
}
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
PreImport
이 사용자 정의 예를 실행하면 ScriptLogPreImport 서비스의 시작을 추적 엔트리로 기록합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 PreImport를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 스크립트 끝에 다음 코드를 추가하여 PreImport 사용자 정의 서비스를 활성화합니다.
logger.trace("Entering PreImport custom service");
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
6. 모니터링 > ScriptLog로 이동하고 로그 수준 설정을 추적으로 변경합니다. 이제 PreImport 사용자 정의 서비스를 시작하기 위한 추적 엔트리가 로그에 포함됩니다.
PostImport
이 사용자 정의 예를 실행하면 ScriptLogPostImport 서비스의 시작을 추적 엔트리로 기록합니다.
1. ThingWorx Composer에서 PTC.SCA.SCO.Common.ImportProcessor 사물을 엽니다.
2. 서비스에서 PostImport를 찾은 다음 을 클릭하여 서비스를 재정의합니다.
3. 스크립트 편집기에서 스크립트 끝에 다음 코드를 추가하여 PostImport 사용자 정의 서비스를 활성화합니다.
logger.trace("Entering PostImport custom service");
4. 완료를 클릭하여 변경 사항을 서비스에 저장합니다.
5. 저장을 클릭하여 사물을 저장합니다.
6. 모니터링 > ScriptLog로 이동하고 로그 수준 설정을 추적으로 변경합니다. 이제 PostImport 사용자 정의 서비스를 시작하기 위한 추적 엔트리가 로그에 포함됩니다.