2012-04-13 46 views
1

我想知道在沒有用戶交互的情況下是否可以使用「^%GOF」。我正在使用Caché2008. ^%GO不是一個選項,因爲它會變慢。我使用來自臨時文件的輸入來自動回答問題,但可能會失敗(很少發生)。在Caché中使用%GOF無聲導出全局變量

我在%SYS中找不到該實用程序的例程。它位於哪裏?

感謝,

答:使用 「%SYS.GlobalQuery:的NamespaceList」 獲得全局的列表(系統全局不含)。

Set Rset = ##class(%ResultSet).%New("%SYS.GlobalQuery:NameSpaceList") 
d Rset.Execute(namespace, "*", 0) 
s globals="" 

while (Rset.Next()){ 
s globalName=Rset.Data("Name")_".gbl" 
if (globals=""){ 
    s globals = globalName 
}else{ 
    s globals = globals_","_globalName 
} 

d ##class(%Library.Global).Export(namespace, globals, "/tmp/export.gof", 7) 

唯一的缺點是,如果你有全局超過允許全局進入,程序崩潰的最大的concatination命名空間。然後你應該拆分全局列表。

回答

3

我建議你看一下%Library.Global()類輸出格式7.

  • 類方法導出(NSP的字符串%= $祖(5),爲ByRef GlobalList作爲字符串% ,FileName As%String,OutputFormat As%Integer = 5,RecordFormat As%String =「V」,qspec As%String =「d」,Translate As%String =「」)as%狀態

    導出列表使用OutputFormat和RecordFormat從名稱空間Nsp到FileName的全局列表GlobalList。 OUTPUTFORMAT可以採取下面的值: 1 - DTM格式 3 - VAXDSM格式 4 - DSM11格式 5 - ISM /緩存格式 6 - MSM格式 7 - 高速緩存塊格式(%GOF)

    RecordFormat可以採取以下值: N - 可變長度記錄 的S - 流數據

    您可以在類文檔在這裏找到它:http://docs.intersystems.com/cache20082/csp/documatic/%25CSP.Documatic.cls

    我從來沒有使用過它,它看起來但是,它喜歡它會做的伎倆。

+0

我知道這個類,但我們不能使用正則表達式(「*」),你必須給所有的全局作爲一個列表。 – user74952 2012-04-16 13:43:06

+0

我將嘗試找出一種方法來獲取全局變量的備份列表。 – user74952 2012-04-16 14:08:45

+0

@ user74952 - 要列出全局變量,請參閱http://stackoverflow.com/questions/9793241/what-is-the-current-preferred-method-for-enumerating-the-globals-in-a-namespace – psr 2012-04-27 17:27:31

2

出口全局,從您的文件文件

d $system.OBJ.Export("myGlobal.GBL","c:\global.xml") 

進口全球

d $system.OBJ.Load("c:\global.xml") 
出口項目爲XML文件

項目的延伸確定什麼 類型,他們是,他們可以是以下之一:

  • CLS - 類
  • CSP - 緩存服務器頁面
  • CSR - 緩存規則文件
  • MAC - 宏程序
  • INT - 無宏程序
  • BAS - 基本套路
  • INC - 包括文件
  • GBL - Globals
  • PRJ - Studio Projects
  • OBJ - 對象代碼
  • PKG - 包定義
如果要導出多個類,然後用逗號分隔,然後或 通過的項目(「項目」)=「」作爲一個數組或使用通配符。
如果文件名爲空,則會導出到當前設備。

連結docbook

編輯:加入「-d」爲QSPEC值將抑制出口的終端輸出。如果你想以編程方式使用它,它可能會阻礙。

+0

This works使用%GOF輸出時速度要慢很多倍。 – user74952 2012-04-16 13:44:47

+0

如何獲得全局變量的特定節點?例如,所有看起來像這樣的全局變量:^ BACKTR(「INDX」,「COMPANY」,1 ,,) – 2016-04-02 09:56:54

2

而只是爲了完整起見:

SAMPLES>s IO="c:\temp\test.gof" 

SAMPLES>s IOT="RMS" 

SAMPLES>s IOPAR="WNS" 

SAMPLES>s globals("Sample.PersonD")="" 

SAMPLES>d entry^%GOF(.globals) 

SAMPLES> 

- >結果在C:\ TEMP \ test.gof具有出口。你可以在你的數組中定義多達65435個全局變量(在這個例子中命名爲全局變量)

但是我建議你跟DAiMor的回答一起去,因爲這是更「現代」的方式。

0

爲了避免最大字符串錯誤,你應該使用下標,而不是逗號分隔的字符串:

Set Rset = ##class(%ResultSet).%New("%SYS.GlobalQuery:NameSpaceList") 
d Rset.Execute(namespace, "*", 0) 

while (Rset.Next()) { 
s globals(Rset.Data("Name"))="" // No need for _".gbl" in recent Cache 
} 

d ##class(%Library.Global).Export(namespace, .globals, "/tmp/export.gof", 7) // Note dot before globals