TCL 脚本错误问题:[dim]GetAttrib:缺少当前元素
TCL Script Error Issue: [dim]GetAttrib: Missing current element
此脚本的问题是我无法在 Internet 上获取任何信息。
有人可以帮助确定问题出在哪里吗?
这是一个有效的脚本,但自上周以来,添加了一个新帐户,此后该脚本不再 运行 正确。
我手动将新添加的帐户添加到我的 OLAP 多维数据集中,并尝试 运行 脚本 agian,但无济于事。
什么是 GetAttrib:缺少当前元素?
#backup the OLAP and test&check FORECAST cleaning act. month and copy from FORECAST
###run transfer to Jan script !!!!
###manually backup MIS/R&D!!!! before because of changed IMD
#New Accounts & Update the Account name!
#OPEN ISSUES: ORDERPOS
# new parents 612x and 615x for exceptional accounts, if parents not already available (manually added/configured)
set sFilePath "d:\PM10\import Log files\ACCOUNT_History.txt"
if {[file exists $sFilePath]==1} {
set iFileID [open $sFilePath "a"]
OLAP2 SelectDimension "ACCOUNT" dim
RDB1 NewCursor "VIIPER.ACCOUNT" curs
curs Open
set iElement 0
set iParent 0
set iUpdateACCOUNT 0
while {[curs Next]==1} {
set sOrderpos "99999"
if {[dim SelectElement $curs(ACCOUNT_ID)] == 0} {
#1:ASSIGN
set PL1 "6"
set PL2 "7"
if { [string compare [string range $curs(ACCOUNT_ID) 0 0] $PL1] == 0 || [string compare [string range $curs(ACCOUNT_ID) 0 0] $PL2] == 0} {
set sAssign "1"
} else {
set sAssign "2"
}
#Parent
set sParent [string range $curs(ACCOUNT_ID) 0 2]
#1:ORDERPOS
set sElementOrderpos3 [string range $sParent 0 2]
append sElementOrderpos3 "00000"
set sElementOrderpos2 [string range $sParent 0 1]
append sElementOrderpos2 "000000"
set sElementBefore [expr $curs(ACCOUNT_ID) - 1]
#backwards check to get the latest available account element to use the orderpos+1 - does not work for Orderpos! but needed for account check!!!!
while {$sElementBefore >= $sElementOrderpos3} {
if {[dim SelectElement $sElementBefore] == 1} {
set sOrderpos [expr [dim GetAttrib "1:ORDERPOS"] + 1]
break
}
set sElementBefore [expr $sElementBefore - 1]
}
#parent "###" is needed/to be created, if not available
if {([string compare $sElementOrderpos3 "612"] != 0 && [string compare $sElementOrderpos3 "615"] != 0)} {
if {[string compare $sOrderpos "99999"] == 0} {
puts "--> ISSUE in ACCOUNT: $curs(ACCOUNT_ID) - check if parents (XX/XXX) are available!"
###########################################################################################
###########################################################################################
#delete next lines "###" after check
### if {$sElementBefore < $sElementOrderpos2} {
### set sElementOrderpos2 [expr [string range $sParent 0 1] -1]
### append sElementOrderpos2 "000000"
### while {$sElementBefore > $sElementOrderpos2} {
### if {[dim SelectElement $sElementBefore] == 1} {
### set sOrderpos [expr [dim GetAttrib "1:ORDERPOS"] + 1]
###
### dim NewNElement $sParent
### dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
### dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
### dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
### dim PutAttrib "1:ASSIGN" $sAssign
### set sNewCParent [string range $sParent 0 1]
### dim PutAttrib "1:ORDERPOS" $sOrderpos
### dim MemberOf $sNewCParent
###
### puts "Created New Parent: $sNewCParent, Account: $sElementOrderpos3 -->please check Element and Attributes"
### fputs $iFileID "$act_date NewParent $sNewCParent $sAssign $curs(ACCOUNT_NAME)"
###
### set sOrderpos [expr $sOrderpos + 1]
### set iParent [expr $iParent + 1]
### break
### }
### set sElementBefore [expr $sElementBefore - 1]
### }
###########################################################################################
###########################################################################################
}
} else {
while {$sElementBefore > $sElementOrderpos2} {
if {[dim SelectElement $sElementBefore] == 1 && [dim SelectElement $sParent] == 0} {
set sOrderpos [expr [dim GetAttrib "1:ORDERPOS"] + 1]
dim NewNElement $sParent
dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
dim PutAttrib "1:ASSIGN" $sAssign
set sNewCParent [string range $sParent 0 1]
dim PutAttrib "1:ORDERPOS" $sOrderpos
dim MemberOf $sNewCParent
puts "Created New Parent Account and Account: $sElementOrderpos3 -->please check Element and Attributes"
fputs $iFileID "$act_date NewParent $sNewCParent $sParent $sAssign $curs(ACCOUNT_NAME)"
set iParent [expr $iParent + 1]
set sOrderpos [expr $sOrderpos + 1]
break
}
set sElementBefore [expr $sElementBefore - 1]
}
}
CloseDimension dim
OLAP2 SelectDimension "ACCOUNT" dim
}
dim NewNElement $curs(ACCOUNT_ID)
dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
dim PutAttrib "1:ORDERPOS" $sOrderpos
dim PutAttrib "1:ASSIGN" $sAssign
#exception in level logic XXXX instead of XXX AND Exception for 612x which is not 6120 then fix to 6122
if {([string compare $sElementOrderpos3 "612"] == 0 || [string compare $sElementOrderpos3 "615"] == 0)} {
"--> PARENT Exception for 612x or 615x"
if {[string compare [string range $curs(ACCOUNT_ID) 0 3] "6120"] == 0 || [string compare $sElementOrderpos3 "615"] == 0} {
set sParent [string range $curs(ACCOUNT_ID) 0 3]
} else {
puts "--> PARENT exception fix to '6122'"
set sParent "6122"
}
}
dim MemberOf $sParent
puts "New ACCOUNT: $curs(ACCOUNT_ID), Parent $sParent, $curs(ACCOUNT_NAME), Orderpos: $sOrderpos, Assign: $sAssign"
fputs $iFileID "$act_date NewAccount $sParent $curs(ACCOUNT_ID) $sAssign $curs(ACCOUNT_NAME)"
set iElement [expr $iElement + 1]
CloseDimension dim
OLAP2 SelectDimension "ACCOUNT" dim
} else {
#update name
dim SelectElement $curs(ACCOUNT_ID)
set oldACCOUNTname [dim GetAttrib "1:NAME"]
set sOrderpos [dim GetAttrib "1:ORDERPOS"]
if {[string compare $curs(ACCOUNT_NAME) $oldACCOUNTname] != 0} {
dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
#dim PutAttrib "1:ORDERPOS" $sOrderpos
puts "Updated ACCOUNT: $curs(ACCOUNT_ID); new Name: $curs(ACCOUNT_NAME); old Name: $oldACCOUNTname"
fputs $iFileID "$act_date Update $curs(ACCOUNT_ID) $curs(ACCOUNT_NAME) old: $oldACCOUNTname"
set iUpdateACCOUNT [expr $iUpdateACCOUNT + 1]
}
}
}
dim Sort -type CN -name ASC NOCASE -recursive
#-attrib "1:ORDERPOS" ASC NOCASE -recursive
DeleteCursor curs
CloseDimension dim
close $iFileID
} else {
puts "File do not exit"
}
puts "New ACCOUNT Parents #: $iParent"
puts "New ACCOUNT Elements #: $iElement"
puts "Updated ACCOUNT Elements #: $iUpdateACCOUNT"
这是生成的输出。
Import started at 18 Feb 2021 02:21:32.
---------------------------------------------------
Loading Script DLL
C:\Program Files (x86)\Common Files\Cubeware\cwscript85.dll
MMM-2020
---------------------------------------------------
ACCOUNT structure: Starting jobs at 18 Feb 2021 02:21:32
Execute script: ACCOUNT structure - Started at 18 Feb 2021 02:21:32
Driver 'C:\Program Files (x86)\Common Files\Cubeware\cwiopmolap.dll' loaded. Version: 8.8.4.5
OLAP2: Infor PM OLAP on mis/MIS connected.
Driver 'C:\Program Files (x86)\Common Files\Cubeware\cwiroledb.dll' loaded. Version: 8.8.4.3
RDB1: OLE DB (OraOLEDB.Oracle): misdb user: melexis_pm connected.
Error in script 'ACCOUNT structure', Line: 10
[dim]GetAttrib: Missing current element.
---------------------------------------------------
Freeing resources
Error in import
Import finished at 18 Feb 2021 02:21:37
我就是喜欢怎么那个脚本不打印哪里遇到问题了! (标准 tclsh
关于打印错误跟踪是 谨慎的 因为它对跟踪问题有很大帮助。)幸运的是,我们可以向脚本添加代码以使其更容易跟踪.请注意,这并不是真正的答案,而是可以帮助您调试问题所在的信息(但它太长且结构化,无法发表评论)。
将此放在顶部:
package require Tcl 8.5
proc PrintTraceOnError {script} {
set code [catch {uplevel 1 $script} msg opt]
if {$code == 1} {
puts "ERROR: $msg"
puts "EXCEPTION CODE: [dict get $opt -errorcode]"
puts "TRACEBACK: [dict get $opt -errorinfo]"
}
# Re-raise the error or send on the normal result
return -options $opt $msg
}
然后将 脚本的其余部分 包装在 PrintTraceOnError {
和 }
中,以获得有关实际出错的更好信息。希望这足以让您弄清楚缺少哪些信息或您必须适应哪些架构更改。
此脚本的问题是我无法在 Internet 上获取任何信息。
有人可以帮助确定问题出在哪里吗?
这是一个有效的脚本,但自上周以来,添加了一个新帐户,此后该脚本不再 运行 正确。
我手动将新添加的帐户添加到我的 OLAP 多维数据集中,并尝试 运行 脚本 agian,但无济于事。
什么是 GetAttrib:缺少当前元素?
#backup the OLAP and test&check FORECAST cleaning act. month and copy from FORECAST
###run transfer to Jan script !!!!
###manually backup MIS/R&D!!!! before because of changed IMD
#New Accounts & Update the Account name!
#OPEN ISSUES: ORDERPOS
# new parents 612x and 615x for exceptional accounts, if parents not already available (manually added/configured)
set sFilePath "d:\PM10\import Log files\ACCOUNT_History.txt"
if {[file exists $sFilePath]==1} {
set iFileID [open $sFilePath "a"]
OLAP2 SelectDimension "ACCOUNT" dim
RDB1 NewCursor "VIIPER.ACCOUNT" curs
curs Open
set iElement 0
set iParent 0
set iUpdateACCOUNT 0
while {[curs Next]==1} {
set sOrderpos "99999"
if {[dim SelectElement $curs(ACCOUNT_ID)] == 0} {
#1:ASSIGN
set PL1 "6"
set PL2 "7"
if { [string compare [string range $curs(ACCOUNT_ID) 0 0] $PL1] == 0 || [string compare [string range $curs(ACCOUNT_ID) 0 0] $PL2] == 0} {
set sAssign "1"
} else {
set sAssign "2"
}
#Parent
set sParent [string range $curs(ACCOUNT_ID) 0 2]
#1:ORDERPOS
set sElementOrderpos3 [string range $sParent 0 2]
append sElementOrderpos3 "00000"
set sElementOrderpos2 [string range $sParent 0 1]
append sElementOrderpos2 "000000"
set sElementBefore [expr $curs(ACCOUNT_ID) - 1]
#backwards check to get the latest available account element to use the orderpos+1 - does not work for Orderpos! but needed for account check!!!!
while {$sElementBefore >= $sElementOrderpos3} {
if {[dim SelectElement $sElementBefore] == 1} {
set sOrderpos [expr [dim GetAttrib "1:ORDERPOS"] + 1]
break
}
set sElementBefore [expr $sElementBefore - 1]
}
#parent "###" is needed/to be created, if not available
if {([string compare $sElementOrderpos3 "612"] != 0 && [string compare $sElementOrderpos3 "615"] != 0)} {
if {[string compare $sOrderpos "99999"] == 0} {
puts "--> ISSUE in ACCOUNT: $curs(ACCOUNT_ID) - check if parents (XX/XXX) are available!"
###########################################################################################
###########################################################################################
#delete next lines "###" after check
### if {$sElementBefore < $sElementOrderpos2} {
### set sElementOrderpos2 [expr [string range $sParent 0 1] -1]
### append sElementOrderpos2 "000000"
### while {$sElementBefore > $sElementOrderpos2} {
### if {[dim SelectElement $sElementBefore] == 1} {
### set sOrderpos [expr [dim GetAttrib "1:ORDERPOS"] + 1]
###
### dim NewNElement $sParent
### dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
### dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
### dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
### dim PutAttrib "1:ASSIGN" $sAssign
### set sNewCParent [string range $sParent 0 1]
### dim PutAttrib "1:ORDERPOS" $sOrderpos
### dim MemberOf $sNewCParent
###
### puts "Created New Parent: $sNewCParent, Account: $sElementOrderpos3 -->please check Element and Attributes"
### fputs $iFileID "$act_date NewParent $sNewCParent $sAssign $curs(ACCOUNT_NAME)"
###
### set sOrderpos [expr $sOrderpos + 1]
### set iParent [expr $iParent + 1]
### break
### }
### set sElementBefore [expr $sElementBefore - 1]
### }
###########################################################################################
###########################################################################################
}
} else {
while {$sElementBefore > $sElementOrderpos2} {
if {[dim SelectElement $sElementBefore] == 1 && [dim SelectElement $sParent] == 0} {
set sOrderpos [expr [dim GetAttrib "1:ORDERPOS"] + 1]
dim NewNElement $sParent
dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
dim PutAttrib "1:ASSIGN" $sAssign
set sNewCParent [string range $sParent 0 1]
dim PutAttrib "1:ORDERPOS" $sOrderpos
dim MemberOf $sNewCParent
puts "Created New Parent Account and Account: $sElementOrderpos3 -->please check Element and Attributes"
fputs $iFileID "$act_date NewParent $sNewCParent $sParent $sAssign $curs(ACCOUNT_NAME)"
set iParent [expr $iParent + 1]
set sOrderpos [expr $sOrderpos + 1]
break
}
set sElementBefore [expr $sElementBefore - 1]
}
}
CloseDimension dim
OLAP2 SelectDimension "ACCOUNT" dim
}
dim NewNElement $curs(ACCOUNT_ID)
dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
dim PutAttrib "1:ORDERPOS" $sOrderpos
dim PutAttrib "1:ASSIGN" $sAssign
#exception in level logic XXXX instead of XXX AND Exception for 612x which is not 6120 then fix to 6122
if {([string compare $sElementOrderpos3 "612"] == 0 || [string compare $sElementOrderpos3 "615"] == 0)} {
"--> PARENT Exception for 612x or 615x"
if {[string compare [string range $curs(ACCOUNT_ID) 0 3] "6120"] == 0 || [string compare $sElementOrderpos3 "615"] == 0} {
set sParent [string range $curs(ACCOUNT_ID) 0 3]
} else {
puts "--> PARENT exception fix to '6122'"
set sParent "6122"
}
}
dim MemberOf $sParent
puts "New ACCOUNT: $curs(ACCOUNT_ID), Parent $sParent, $curs(ACCOUNT_NAME), Orderpos: $sOrderpos, Assign: $sAssign"
fputs $iFileID "$act_date NewAccount $sParent $curs(ACCOUNT_ID) $sAssign $curs(ACCOUNT_NAME)"
set iElement [expr $iElement + 1]
CloseDimension dim
OLAP2 SelectDimension "ACCOUNT" dim
} else {
#update name
dim SelectElement $curs(ACCOUNT_ID)
set oldACCOUNTname [dim GetAttrib "1:NAME"]
set sOrderpos [dim GetAttrib "1:ORDERPOS"]
if {[string compare $curs(ACCOUNT_NAME) $oldACCOUNTname] != 0} {
dim PutAttrib "1:NAME" $curs(ACCOUNT_NAME)
dim PutAttrib "2:ENGLISH" $curs(ACCOUNT_NAME)
dim PutAttrib "2:GERMAN" $curs(ACCOUNT_NAME)
#dim PutAttrib "1:ORDERPOS" $sOrderpos
puts "Updated ACCOUNT: $curs(ACCOUNT_ID); new Name: $curs(ACCOUNT_NAME); old Name: $oldACCOUNTname"
fputs $iFileID "$act_date Update $curs(ACCOUNT_ID) $curs(ACCOUNT_NAME) old: $oldACCOUNTname"
set iUpdateACCOUNT [expr $iUpdateACCOUNT + 1]
}
}
}
dim Sort -type CN -name ASC NOCASE -recursive
#-attrib "1:ORDERPOS" ASC NOCASE -recursive
DeleteCursor curs
CloseDimension dim
close $iFileID
} else {
puts "File do not exit"
}
puts "New ACCOUNT Parents #: $iParent"
puts "New ACCOUNT Elements #: $iElement"
puts "Updated ACCOUNT Elements #: $iUpdateACCOUNT"
这是生成的输出。
Import started at 18 Feb 2021 02:21:32.
---------------------------------------------------
Loading Script DLL
C:\Program Files (x86)\Common Files\Cubeware\cwscript85.dll
MMM-2020
---------------------------------------------------
ACCOUNT structure: Starting jobs at 18 Feb 2021 02:21:32
Execute script: ACCOUNT structure - Started at 18 Feb 2021 02:21:32
Driver 'C:\Program Files (x86)\Common Files\Cubeware\cwiopmolap.dll' loaded. Version: 8.8.4.5
OLAP2: Infor PM OLAP on mis/MIS connected.
Driver 'C:\Program Files (x86)\Common Files\Cubeware\cwiroledb.dll' loaded. Version: 8.8.4.3
RDB1: OLE DB (OraOLEDB.Oracle): misdb user: melexis_pm connected.
Error in script 'ACCOUNT structure', Line: 10
[dim]GetAttrib: Missing current element.
---------------------------------------------------
Freeing resources
Error in import
Import finished at 18 Feb 2021 02:21:37
我就是喜欢怎么那个脚本不打印哪里遇到问题了! (标准 tclsh
关于打印错误跟踪是 谨慎的 因为它对跟踪问题有很大帮助。)幸运的是,我们可以向脚本添加代码以使其更容易跟踪.请注意,这并不是真正的答案,而是可以帮助您调试问题所在的信息(但它太长且结构化,无法发表评论)。
将此放在顶部:
package require Tcl 8.5
proc PrintTraceOnError {script} {
set code [catch {uplevel 1 $script} msg opt]
if {$code == 1} {
puts "ERROR: $msg"
puts "EXCEPTION CODE: [dict get $opt -errorcode]"
puts "TRACEBACK: [dict get $opt -errorinfo]"
}
# Re-raise the error or send on the normal result
return -options $opt $msg
}
然后将 脚本的其余部分 包装在 PrintTraceOnError {
和 }
中,以获得有关实际出错的更好信息。希望这足以让您弄清楚缺少哪些信息或您必须适应哪些架构更改。