Ниже приведен мой скрипт автоматизации, который является второй частью процесса загрузки ассетов. Первая часть загружает данные атрибута в актив при создании из внешней системы, но также устанавливает CLASSIFICATIONID, который создает записи в таблице 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": неверный идентификатор
Единственное место, где я ссылаюсь на ASSETNUM, — это когда я извлекаю строку из MBO ASSETSPEC, атрибутом которой является assetsnum, поэтому я не понимаю, почему я получаю эту ошибку.
Мои вопросы: почему я получаю ошибку неверного идентификатора и почему есть пауза, и они связаны?
Сценарий выполняется около 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