【问题标题】:Intersystems caché - sqlStorage系统间缓存 - sqlStorage
【发布时间】:2015-03-04 15:11:36
【问题描述】:

我需要将我的全局映射到 sql。我有这样的全局结构:

^myGlob("mltab","main","Dta",idRow,idCol,"Index")

具体来说:

^myGlob("mltab","main","Dta",3,1)   =   20
^myGlob("mltab","main","Dta",3,2)   =   30
^myGlob("mltab","main","Dta",3,2,"Index")   =   "t|1320|30|62913"
^myGlob("mltab","main","Dta",3,3)   =   "01.04.2013"
^myGlob("mltab","main","Dta",3,4)   =   36
^myGlob("mltab","main","Dta",3,5)   =   166.8
^myGlob("mltab","main","Dta",4,1)   =   20
^myGlob("mltab","main","Dta",4,2)   =   30
^myGlob("mltab","main","Dta",4,3)   =   "01.04.2013"
^myGlob("mltab","main","Dta",4,4)   =   36
^myGlob("mltab","main","Dta",4,4,"Index")   =   "nextIndexVal"
^myGlob("mltab","main","Dta",4,5)   =   166.8
                             .
                             .
                             .

"mltab","main","Dta" 和 "Index" 是常数。 idRow 是我的主键,idCol 对我来说并不重要,但会给我带来问题,因为它可以改变。

我需要为某些表列(地图类属性)获取类似 colId=2^index="t|1320|30|62913" 的值。我映射的其他值。


我当前的代码如下所示:

Class Kza.NewClass1 Extends %Persistent [ Not ProcedureBlock, StorageStrategy = MySqlStorageStrategy ]
{

Property hyperlink As %String;

Property colId As %String;

Property id As %Integer;

Property prop1 As %String;

Property prop2 As %String;

Property prop3 As %String;

Property prop4 As %String;

Property prop5 As %String;

Index MyIndex1 On id [ IdKey, PrimaryKey, Unique ];

<Storage name="MySqlStorageStrategy">
<ExtentSize>100000</ExtentSize>
<SQLMap name="Map1">
<Global>^myGlob</Global>
<RowIdSpec name="1">
<Expression>{L2}</Expression>
<Field>id</Field>
</RowIdSpec>
<Subscript name="1">
<Expression>{id}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{colId}</Expression>
</Subscript>
<Type>index</Type>
</SQLMap>
<SQLMap name="MyMasterMap">
<ConditionalWithHostVars></ConditionalWithHostVars>
<Data name="colId">
<Node>6</Node>
</Data>
<Data name="hyperlink">
<Node>"Index"</Node>
</Data>
<Data name="prop1">
<Node>1</Node>
</Data>
<Data name="prop2">
<Node>2</Node>
</Data>
<Data name="prop3">
<Node>3</Node>
</Data>
<Data name="prop4">
<Node>4</Node>
</Data>
<Data name="prop5">
<Node>5</Node>
</Data>
<Global>^myGlob</Global>
<RowIdSpec name="1">
<Expression>{L1}</Expression>
<Field>id</Field>
</RowIdSpec>
<Subscript name="1">
<Expression>"mltab"</Expression>
</Subscript>
<Subscript name="2">
<Expression>"main"</Expression>
</Subscript>
<Subscript name="3">
<Expression>"Dta"</Expression>
</Subscript>
<Subscript name="4">
<Expression>{id}</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^Kza.testToTable1S</StreamLocation>
<Type>%CacheSQLStorage</Type>
</Storage>
}

我想我的问题可能出在数据节点定义上:

<Data name="colId">
    <Node>6</Node>
</Data>
<Data name="hyperlink">
    <Node>"Index"</Node>
</Data>

但可悲的是,我对这个问题还不够熟悉......所以有人可以帮我在我的 sql 表中获取列 hyperlink,在 id 为 3 的行上获得值 colId=2^index=t|1320|30|62913,在行 id 4 上获得 colId=4^index=nextIndexVal ?

【问题讨论】:

  • 您对 idCol 的意思是什么,我看到您将它用于不同的属性,但其中一个具有“索引”。而你将 colId 定义为节点 6,为什么?
  • @DAiMor 因为我不知道该怎么做。我需要你有“t|1320|30|62913”到属性超链接
  • @DAiMor 并获得 colId 的值将是奖励:)
  • 对于超链接每次都知道colId并且它是否等于2?
  • @DAiMor colId 可以是 1,2,3,3.6,3.8,4,5....等等。为了清楚起见,我将编辑我的问题

标签: intersystems-cache objectscript


【解决方案1】:

如果超链接属性的colId固定了,你可以在可能的地方使用标签RetrievalCode写一些COS代码,如果不固定,你可以写一些东西来检索colId然后like here

<Data name="hyperlink">
  <RetrievalCode> s {hyperlink}=$g(^myGlob("mltab","main","Dta",{L4},2,"Index"))
  </RetrievalCode>
</Data>

而你的 RowIdSpec 可能是错误的,因为,4 级下标的属性 id,所以你使用 L4 来表达。

<RowIdSpec name="1">
  <Expression>{L4}</Expression>
  <Field>id</Field>
</RowIdSpec>

和最新的变种

<Data name="colId">
  <RetrievalCode>s {*}="" f { s {*}=$o(^myGlob({L1},{L2},{L3},{L4},{*})) quit:{*}=""  quit:$d(^myGlob({L1},{L2},{L3},{L4},{*},"Index"))}
  </RetrievalCode>
</Data>
<Data name="hyperlink">
  <RetrievalCode>s colId="" f { s colId=$o(^myGlob({L1},{L2},{L3},{L4},colId)) quit:colId=""  quit:$d(^myGlob({L1},{L2},{L3},{L4},colId,"Index"))}
s {*}=$g(^myGlob({L1},{L2},{L3},{L4},colId,"Index"))
  </RetrievalCode>
</Data>
<Data name="hyperlink2">
  <RetrievalCode>s colId="" f { s colId=$o(^myGlob({L1},{L2},{L3},{L4},colId)) quit:colId=""  quit:$d(^myGlob({L1},{L2},{L3},{L4},colId,"Index"))}
s {*}="colId="_colId_"^index="""_$g(^myGlob({L1},{L2},{L3},{L4},colId,"Index"))_""""
  </RetrievalCode>
</Data>

【讨论】:

  • 这看起来像是我尝试过的解决方案之一。谢谢,我会实施它并告诉我它是否适合我:)
  • 我编辑了我的问题.....您现在可以为我的目的编辑代码吗?非常感谢
  • colId for Index 看起来是随机的,你应该猜猜哪个 colId 有超链接的索引下标?
  • 其实我有colId描述。我可以获得 colId 的所有可能值。它的存储方式像............我将编辑问题:)
  • 我再次检查了我的问题,并推断我的问题可能会被混淆。所以我编辑了它,希望现在它清楚了
【解决方案2】:

SQLMap 存储中的这段代码是这样做的:

<Data name="hyperlink">
<RetrievalCode>
<![CDATA[set res=""
    set colId=""
    for
    {
        set colId = $order( ^myGlob("mltab","main","Dta",{L4},colId) )
        quit:(colId = "")

        set indexTab = $g(^myGlob("mltab","main","Dta",{L4},colId,"Index"))
        if indexTab'="" {
            set res = res_"colId="_colId_"index="_indexTab
        }
    }
    s {hyperlink}=res]]></RetrievalCode>
</Data>

{L4}为row id,SQLmap不超过一个

【讨论】:

  • 当我准备好编辑我的答案时,刚刚看到你的。我也做到了。但在我的示例中,您可以看到可以使用 {L*} 来定义 sibscripts,使用 {*} 来定义当前字段。
  • @DAiMor 你能告诉我,如何通过 %Dictionary 做到这一点吗? stackoverflow.com/questions/28880384/…
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多