以下是我的自动化脚本,它是资产加载过程的第二部分。第一部分在从外部系统创建时将属性数据加载到资产,但它也设置了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秒的暂停。我也得到了一个oracle错误:
java.sql.SQLException:ORA-00904:" ASSETNUM":无效标识符
我推荐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 :(得分:1)
我尝试重写您的代码,删除 ifs 并使用 elifs 来减少冗余。如果我在你的位置,我会使用 ASSET 作为主要的 mbo,并使用自定义 getMboSets 来访问每个 ASSETSPEC mbo,以便不会针对每个 SPEC 记录对 ASSET 表运行 5 次 sql 命令。如果这两种方法都不起作用,最好在晚上使用升级和操作启动点运行您的代码。 顺便说一句,如果您使用 getMboSets,您也不需要运行 .save()。
mxAssetSpec = mbo
mxAsset = mxAssetSpec.getMboSet("ASSET").moveFirst()
featureclass = mxAsset.getString("PLUSSFEATURECLASS")
assetattrid = mxAssetSpec.getString("ASSETATTRID")
if featureclass == "GRAVITYSEWERLINES" and assetattrid in ["MATERIAL","LENGTH","INSTALL","ESTYEAR","PDIAM"]:
gis = mxAssetSpec.getMboSet("SPATIAL_GRAVITYSEWERLINES").moveFirst()
if gis is not None:
length = gis.getString("length_")
if assetattrid == "MATERIAL":
mxAssetSpec.setValue("alnvalue", gis.getString("material"))
elif assetattrid == "LENGTH":
mxAssetSpec.setValue("numvalue", length)
elif assetattrid == "INSTALL":
mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
elif assetattrid == "ESTYEAR":
mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
elif assetattrid == "PDIAM":
mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
mxAssetSpec.setValue("startmeasure", "0")
mxAssetSpec.setValue("endmeasure", length)
mxAssetSpec.setValue("startmeasureunitid", "FT")
mxAssetSpec.setValue("endmeasureunitid", "FT")
答案 1 :(得分:0)
以下是一些改善脚本性能的建议。我会将它们作为一般规则给出,然后举例说明如何应用它们。
规则:不要在你的脚本中做你可以做Java的事情,因为编译的Java比你的脚本更快。
应用程序:我没有从mxserver获取gisAssetSet,而是在AssetSpec上建立关系,并通过mbo.getMboSet(“relationship”)使用它。这使得Java执行字符串操作和拥有事务来进行保存。
规则:设置和拆卸是昂贵的,所以尽可能减少和避免它们。
应用程序1:我假设您正在使用对象启动点。在可能的范围内,使用对象事件条件来防止脚本在不应该运行时运行。这样可以避免设置和拆除。
应用程序2:使用mbo.get方法,而不是在启动点上使用绑定变量。每个绑定的Launch Point变量会产生大约5个额外的相关变量,这会增加设置和拆卸时间。您可以在Scripting with Maximo的隐式变量部分中阅读有关此内容的更多信息。
规则:不要为同一属性调用mbo.getWhatever()两次。
应用程序:在某些情况下,您可以连续调用getString(“length_”)。如果你调用它一次,将返回的值缓存在变量中,然后多次使用该变量,我认为你的代码会表现得更好。
就你得到的Oracle错误而言,我觉得我没有足够的信息。是否还有其他剧本或交叉等等?重新说明,你怎么知道这个错误是由这个脚本引起的?
我希望有所帮助。