2015-10-14 2 views
1

Ниже приведен сценарий автоматизации, который является второй частью процесса загрузки активов. Первая часть нагрузки данных атрибутов для актива при создании внешней системы, но он также устанавливает ClassificationID, который создает записи в таблице ASSETSPEC, который выстреливает ниже скрипт:Ошибка автоматизации и ошибки автоматизации Maximo Assetspec

from psdi.mbo import MboConstants 
from psdi.server import MXServer 
from psdi.security import UserInfo 

username = "maxadmin" 

mxServer = MXServer.getMXServer() 
userInfo = mxServer.getUserInfo(username) 

if mbo != None: 
    mxAssetSpec = mbo 

    AssetNum = mxAssetSpec.getString("assetnum") 
    SiteID = mxAssetSpec.getString("siteid") 

    gisAssetSet = mxServer.getMboSet(FEATURECLASS, userInfo) 
    gisAssetSet.setWhere("mxassetnum = '" + AssetNum + "' and mxsiteid = '" + SiteID + "'") 
    gisAssetSet.reset() 

    gis = gisAssetSet.getMbo(0) 

    if FEATURECLASS == "GRAVITYSEWERLINES": 
     if ASSETATTRID == 'MATERIAL': 
      mxAssetSpec.setValue("alnvalue", gis.getString("material")) 
      mxAssetSpec.setValue("startmeasure", '0') 
      mxAssetSpec.setValue("endmeasure", gis.getString("length_")) 
      mxAssetSpec.setValue("startmeasureunitid", 'FT') 
      mxAssetSpec.setValue("endmeasureunitid", 'FT') 
     if ASSETATTRID == 'LENGTH': 
      mxAssetSpec.setValue("numvalue", gis.getString("length_")) 
      mxAssetSpec.setValue("startmeasure", '0') 
      mxAssetSpec.setValue("endmeasure", gis.getString("length_")) 
      mxAssetSpec.setValue("startmeasureunitid", 'FT') 
      mxAssetSpec.setValue("endmeasureunitid", 'FT') 
     if ASSETATTRID == 'INSTALL': 
      mxAssetSpec.setValue("alnvalue", gis.getString("instalyear")) 
      mxAssetSpec.setValue("startmeasure", '0') 
      mxAssetSpec.setValue("endmeasure", gis.getString("length_")) 
      mxAssetSpec.setValue("startmeasureunitid", 'FT') 
      mxAssetSpec.setValue("endmeasureunitid", 'FT') 
     if ASSETATTRID == 'ESTYEAR': 
      mxAssetSpec.setValue("alnvalue", gis.getString("est_year")) 
      mxAssetSpec.setValue("startmeasure", '0') 
      mxAssetSpec.setValue("endmeasure", gis.getString("length_")) 
      mxAssetSpec.setValue("startmeasureunitid", 'FT') 
      mxAssetSpec.setValue("endmeasureunitid", 'FT') 
     if ASSETATTRID == 'PDIAM': 
      mxAssetSpec.setValue("numvalue", gis.getString("diameter")) 
      mxAssetSpec.setValue("startmeasure", '0') 
      mxAssetSpec.setValue("endmeasure", gis.getString("length_")) 
      mxAssetSpec.setValue("startmeasureunitid", 'FT') 
      mxAssetSpec.setValue("endmeasureunitid", 'FT') 

    mxAssetSpec.save() 
    mxAssetSpec.close() 
    mxAssetSpec.resetForRefreshOnSave() 

else: 
    raise UnboundLocalError 

Там будут около 8 классификации атрибутов, циклов через. Сам скрипт работает очень быстро, но между каждым атрибутом классификации происходит пауза около 3 секунд. И я также получаю сообщение об ошибке оракула:

java.sql.SQLException: ORA-00904: «ASSETNUM»: недопустимый идентификатор

Единственное место, где я referrencing ASSETNUM, когда я извлечения строки из ASSETSPEC MBO какой assetnum является атрибутом, поэтому я запутался, почему я получаю эту ошибку.

Мои вопросы: почему я получаю неправильную ошибку идентификатора и почему существует пауза, и они связаны?

Сценарий занимает около 20 секунд для завершения работы и работает нормально, но 20 секунд составляет около 19 секунд. Любая помощь будет оценена по достоинству. Также будут оценены любые комментарии о том, как улучшить код.

Спасибо!

if mbo != None: 
mxAssetSpec = mbo 

mxAssetSet = mxAssetSpec.getMboSet("ASSET") 
mxAsset = mxAssetSet.getMbo(0) 
featureclass = mxAsset.getString("PLUSSFEATURECLASS") 
assetattrid = mxAssetSpec.getString("ASSETATTRID") 

print(featureclass) 
print(assetattrid) 

if featureclass == "GRAVITYSEWERLINES": 
    gisAssetSet = mxAssetSpec.getMboSet("SPATIAL_GRAVITYSEWERLINES") 
    gis = gisAssetSet.getMbo(0) 
    length = gis.getString("length_") 
    if assetattrid == 'MATERIAL': 
     mxAssetSpec.setValue("alnvalue", gis.getString("material")) 
     mxAssetSpec.setValue("startmeasure", '0') 
     mxAssetSpec.setValue("endmeasure", length) 
     mxAssetSpec.setValue("startmeasureunitid", 'FT') 
     mxAssetSpec.setValue("endmeasureunitid", 'FT') 
    if assetattrid == 'LENGTH': 
     mxAssetSpec.setValue("numvalue", gis.getString("length_")) 
     mxAssetSpec.setValue("startmeasure", '0') 
     mxAssetSpec.setValue("endmeasure", length) 
     mxAssetSpec.setValue("startmeasureunitid", 'FT') 
     mxAssetSpec.setValue("endmeasureunitid", 'FT') 
    if assetattrid == 'INSTALL': 
     mxAssetSpec.setValue("alnvalue", gis.getString("instalyear")) 
     mxAssetSpec.setValue("startmeasure", '0') 
     mxAssetSpec.setValue("endmeasure", length) 
     mxAssetSpec.setValue("startmeasureunitid", 'FT') 
     mxAssetSpec.setValue("endmeasureunitid", 'FT') 
    if assetattrid == 'ESTYEAR': 
     mxAssetSpec.setValue("alnvalue", gis.getString("est_year")) 
     mxAssetSpec.setValue("startmeasure", '0') 
     mxAssetSpec.setValue("endmeasure", length) 
     mxAssetSpec.setValue("startmeasureunitid", 'FT') 
     mxAssetSpec.setValue("endmeasureunitid", 'FT') 
    if assetattrid == 'PDIAM': 
     mxAssetSpec.setValue("numvalue", gis.getString("diameter")) 
     mxAssetSpec.setValue("startmeasure", '0') 
     mxAssetSpec.setValue("endmeasure", length) 
     mxAssetSpec.setValue("startmeasureunitid", 'FT') 
     mxAssetSpec.setValue("endmeasureunitid", 'FT') 

    mxAssetSpec.save() 

еще: повышение UnboundLocalError

ответ

0

Вот несколько идей, чтобы улучшить производительность вашего сценария. Я дам им общие правила, а затем дам примеры того, как их применять.

Правило: не делайте в своем скрипте то, что вы можете сделать Java, потому что скомпилированная Java быстрее, чем ваш скрипт.

Приложение: вместо того, чтобы получать gisAssetSet с mxserver, я бы установил отношения с AssetSpec и использовал это через mbo.getMboSet ("relationship"). Это приводит к тому, что Java выполняет манипуляции с строкой и транзакцию владельца для сохранения.

Правило: наладка и снос дороги, поэтому уменьшите и избегайте их, насколько это возможно.

Приложение 1: Я предполагаю, что вы используете точку запуска объекта. По возможности используйте условие события события, чтобы предотвратить запуск скрипта, если это не так. Это позволяет избежать установки и срыва.

Приложение 2: вместо использования переменных связывания в вашей точке запуска используйте метод mbo.get. Каждая связанная переменная точки запуска приводит к примерно 5 дополнительным, связанным с ними, которые увеличивают время установки и разрыва. Подробнее об этом можно узнать в Scripting with Maximo, в разделе о неявных переменных.

Правило: не вызывайте mbo.getWhatever() дважды для того же атрибута.

Приложение: Есть несколько случаев, когда вы делаете последовательные вызовы getString ("length_"). Я думаю, что ваш код будет работать лучше, если вы его однажды назовете, кешируйте возвращаемое значение в переменной, а затем используйте эту переменную несколько раз.

Что касается ошибки Oracle, которую вы получаете, я чувствую, что у меня недостаточно информации. Существуют ли другие скрипты или кроссоверы и т. Д.?Перефразируя, как вы знаете, эта ошибка вызвана этим скриптом?

Я надеюсь, что это поможет.

+0

Я добавил новый код выше, но все равно около 3 секунд паузы между каждым атрибутом спецификации актива. Сам скрипт, если стрелять в 16 мс, но время между стрельбой для каждого атрибута спецификации ресурса составляет около 3 секунд. Этот сценарий является второй частью процесса загрузки. Первый скрипт копирует информацию об атрибутах, а также устанавливает CLASSIFICATIONID, который, в свою очередь, запускает этот скрипт. – TrojanMan78

+0

Не вызывайте mxAssetSpec.save(). Как правило, вы должны вызывать только save() на MboSet, если вы получаете MboSet с MXServer. – Preacher

+0

Кроме того, как раз в стиле кодирования, я бы склонен не псевдоним mbo, как mxAssetSpec. Для меня, называя это просто «mbo», мне напоминает, что он был предоставлен Maximo и может ссылаться на разные объекты, в зависимости от точки запуска. – Preacher

Смежные вопросы