2014-09-26 32 views
0

我在Windows 7下使用JMP 9.0.3 64位,並通過Python自動執行(編輯:我已經確認該錯誤可以同樣用VBScript自動化進行復制,並且仍然存在於JMP 11.0.0中) 。我的自動化代碼基於JMP 9自動指南。所有的JMP9 PDFs seem now to have disappeared from the websiteJMP 9自動化錯誤 - 解決方法?

這個bug對我來說已經變得相當不錯了。我經常需要操作自動化代碼中的表格,然後用JSL代碼交換表名,並且這個錯誤使得不可能可靠地做到這一點。 有沒有人遇到過它?任何已知的修復或解決方法?

(我還沒有看到StackOverflow上許多JMP/JSL的問題,但我在這裏張貼在關閉的機會,也有一些JMP-使用觀望者原本張貼在SAS的JMP論壇:https://community.jmp.com/message/213132#213132

問題

Document自動化對象具有屬性NameFullName,和Path這是爲了反映相關聯的JMP表的表名或文件名。然而,在很多情況下,這些屬性都是空白的,儘管該表有一個非空白名稱,可以從JSL代碼進行訪問,儘管實際上可以使用該名稱檢索表自動化對象。

演示代碼

下面是一些演示錯誤的Python代碼。它使用JSL創建一個表,保存該表的名稱,並按名稱查找表的自動化對象。然後它會檢查table.Document.Name是否與表格的已知名稱相匹配(僅用於查詢它),並報告不支持的情況。它這樣做是100倍,一般的名稱開始回來空白第2-4次迭代後:

from win32com.client import gencache 
mod = gencache.GetModuleForProgID("JMP.Application") 
app = mod.Application() 

okay_table = [None]*100 

for ii in range(len(okay_table)): 
    # Create a table in JMP 
    app.RunCommand("show(%d); ::dt=New Table(); ::retval=dt<<Get Name()" % ii) 

    # Retrieve the name of that just-created table from the JSL variable 
    retval = app.GetJSLValue("retval") 

    # Retrieve the automation object for that table, by name 
    table = app.GetTableHandleFromName(retval) 

    # Now, table.Document.Name **SHOULD** match retval, but 
    # it may be blank due to the bug. 

    if not any((table.Document.Name, table.Document.Path, table.Document.FullName)): 
     print "table %d: got blank table.Document.Name=%s, Path=%s, FullName=%s" % (ii, 
      table.Document.Name, table.Document.Path, table.Document.FullName) 
     app.RunCommand("close(DataTable(::retval), nosave)") 
     okay_table[ii]=False 
    else: 
     print "table %d: looks okay; Name=%s, FullName=%s, Path=%s" % (ii, 
      table.Document.Name, table.Document.FullName, table.Document.Path) 
     app.RunCommand('close(DataTable("%s"), nosave)' % table.Document.Name) 
     okay_table[ii]=True 

print "Number of bad tables: %d" % okay_table.count(False) 

典型輸出:

table 0: looks okay; Name=Untitled 304, FullName=Untitled 304.jmp, Path=Untitled 304.jmp 
table 1: looks okay; Name=Untitled 305, FullName=Untitled 305.jmp, Path=Untitled 305.jmp 
table 2: got blank table.Document.Name=, Path=, FullName= 
table 3: got blank table.Document.Name=, Path=, FullName= 
table 4: got blank table.Document.Name=, Path=, FullName= 
... 
table 98: got blank table.Document.Name=, Path=, FullName= 
table 99: got blank table.Document.Name=, Path=, FullName= 
Number of bad tables: 98 

回答

0

,我想出了一個解決辦法,但它是一個非常尷尬的一個。爲了獲得自動化表的名稱,我現在這樣做:

  1. 通過運行JSL代碼獲取列表中所有JMP表的名稱。
  2. 使用app.GetJSLValue將此列表置入自動化應用程序。
  3. 遍歷名字一個接一個,按名稱查找自動化表對象的列表使用app.GetTableHandleFromName
  4. 我再 use an ugly kludge to compare the OLE object identity of each table我的目標表中的OLE對象的身份。如果它們匹配,我會返回我用來查看它的名稱。

代碼爲我的可怕醜陋的解決方法:

def GetTableName(app, table): 
    if table.Document.Name: 
     return table.Document.Name 
    else: 
     # Get names of all JMP tables 
     app.RunCommand(""" 
      NamesDefaultToHere(1); 
      ::_retval={}; 
      for(ii=1, ii<=NTable(), ii++, 
       InsertInto(::_retval, DataTable(ii)<<GetName()) 
      )""") 
     tns = app.GetJSLValue("_retval") 

     # See this thread for why == works here (http://thread.gmane.org/gmane.comp.python.windows/12977/focus=12978) 
     for tn in tns: 
      if table == self.app.GetTableHandleFromName(tn) 
       return tn 
     else: 
      raise Exception