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 {} 中,以获得有关实际出错的更好信息。希望这足以让您弄清楚缺少哪些信息或您必须适应哪些架构更改。