0

まず、この質問の長さについてお詫び申し上げます。次のようにグローバルに設定しています。

^WHEAIPP(1,116444,1)=3
^WHEAIPP(1,116444,1,1)="58898^^LSWELFER^58898,0"
^WHEAIPP(1,116444,1,2)="58898^59128^MPHILLIPS^59135,0"
^WHEAIPP(1,116444,1,3)="62626^62745^FXALTMAN^62626,58427^^^^^^2^"
^WHEAIPP(1,116444,2)=3
^WHEAIPP(1,116444,2,1)="59129^^MPHILLIPS^59910,0^^^^^^"
^WHEAIPP(1,116444,2,2)="59129^59547^SSNARE^59934,0^^^^^^"
^WHEAIPP(1,116444,2,3)="59129^62954^FXALTMAN^62654,32289^^^^^^3^"
^WHEAIPP(1,116444,3)=4
^WHEAIPP(1,116444,3,1)="60311^^SALFANO^60311,0^^^^^^"
^WHEAIPP(1,116444,3,2)="60311^^SSNARE^60754,0^^^^^^2"
^WHEAIPP(1,116444,3,3)="60311^^NEPAXSON^60757,0^^^^^^2"
^WHEAIPP(1,116444,3,4)="60311^62636^FXALTMAN^62626,58428^=^100^=^25^^5"
^WHEAIPP(1,116444,4)=4
^WHEAIPP(1,116444,4,1)="59548^^SSNARE^59550,0"
^WHEAIPP(1,116444,4,2)="59548^60310^SSNARE^59934,0^^^^^^2"
^WHEAIPP(1,116444,4,3)="62626^^FXALTMAN^62626,61050^^^^^^^1"
^WHEAIPP(1,116444,4,4)="62617^62647^FXALTMAN^62627,27518^^^^^^4"

最初の添え字は内部Hmo、sceondは内部提供、3番目は行番号、最後は行詳細番号です。4番目の添え字レベルのデータは、行の監査証跡履歴を組み合わせたものであり、最大の行詳細番号が現在の行です。

私は次のように親子関係で3つのクラスを設定しています:メインクラス

Class XFXA.Try3.IppProv Extends (%Persistent, %Populate, %XML.Adaptor) [ ClassType =    
  persistent, Inheritance = right, ProcedureBlock, SqlRowIdName = Id, StorageStrategy   
  = SQLMapping ]
{

Property Hmo As %Integer [ Required ];

Property Keen As %Integer [ Required ];

/// Contains the array of data initially loaded into the class
Property OriginalData As %String [ MultiDimensional ];

Property ReadyToFile As %Boolean [ InitialExpression = 0, Transient ];

Relationship IppLines As XFXA.Try3.IppProvLine [ Cardinality = children, Inverse =    
relIppProv ];

Index iMaster On (Hmo, Keen) [ IdKey, PrimaryKey, Unique ];
.
.
.
<Storage name="SQLMapping">
<DataLocation>^[%extRef("UCKE"),%extRef("SYKE")]WHEAIPP</DataLocation>
<ExtentSize>100000</ExtentSize>   
<SequenceNumber>19</SequenceNumber>
<SQLMap name="DBMS">
<Global>^[%extRef("UCKE"), %extRef("SYKE")]WHEAIPP</Global>
<Structure>delimited</Structure>
<Subscript name="1">
<Expression>{Hmo}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{Keen}</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^XFXA.Try3.IppProvS</StreamLocation>
<Type>%Library.CacheSQLStorage</Type>
</Storage>
}

Lineクラス

Class XFXA.Try3.IppProvLine Extends (%Persistent, %Populate, %XML.Adaptor) [ ClassType 
= persistent, Inheritance = right, ProcedureBlock, SqlRowIdName = Id, StorageStrategy 
=SQLMapping ]
{

Relationship relIppProv As XFXA.Try3.IppProv [ Cardinality = parent, Inverse = 
IppLines ];

Relationship IppLineDetail As XFXA.Try3.IppProvLineDetail [ Cardinality = children, 
Inverse = relIppProvLinex ];

Property Line As %String;

Property IppLineDetailCount As %String;

Index iMaster On Line [ IdKey, PrimaryKey, Unique ];
.
.
.
<Storage name="SQLMapping">
<ExtentSize>100000</ExtentSize>
<SequenceNumber>14</SequenceNumber>
<SQLMap name="DBMS">
<Data name="IppLineDetailCount">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>1</Piece>
</Data>
<Global>^[%extRef("UCKE"), %extRef("SYKE")]WHEAIPP</Global>
<Structure>delimited</Structure>
<Subscript name="1">
<Expression>{XFXA_Try3.IppProv.Hmo}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{XFXA_Try3.IppProv.Keen}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{Line}</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^XFXA.Try3.IppProvLineS</StreamLocation>
<Type>%Library.CacheSQLStorage</Type>
</Storage>
}

Line Detail Class Class XFXA.Try3.IppProvLineDetail Extends(%Persistent、%XML.Adaptor)[ClassType = persist、Inheritance = right、ProcedureBlock、SqlRowIdName = Id、StorageStrategy = SQLMapping] {

Relationship relIppProvLinex As XFXA.Try3.IppProvLine [ Cardinality = parent, Inverse = 
IppLineDetail ];

Property LnDetail As %String;

Index iMaster On LnDetail [ IdKey, PrimaryKey, Unique ];
.
.
.
<Storage name="SQLMapping">
<ExtentSize>100000</ExtentSize>
<SQLMap name="DBMS">
<Data name="ClmAmtAllowed">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>6</Piece>
</Data>
<Data name="ClmLineAmtAllowed">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>8</Piece>
</Data>
<Data name="ClmLineOp">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>7</Piece>
</Data>
<Data name="ClmOp">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>5</Piece>
</Data>
<Data name="Deleted">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>11</Piece>
</Data>
<Data name="EffDt">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>1</Piece>
</Data>
<Data name="IppCode">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>10</Piece>
</Data>
<Data name="LastChgDt">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>4</Piece>
</Data>
<Data name="PxDxCdeFlag">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>9</Piece>
</Data>
<Data name="TermDt">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>2</Piece>
</Data>
<Data name="UserIni">
<Delimiter>"^"</Delimiter>
<Node>+0</Node>
<Piece>3</Piece>
</Data>
<Global>^[%extRef("UCKE"), %extRef("SYKE")]WHEAIPP</Global>
<Structure>delimited</Structure>
<Subscript name="1">
<Expression>{XFXA_Try3.IppProv.Hmo}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{XFXA_Try3.IppProv.Keen}</Expression>
</Subscript>
<Subscript name="3">
<Expression>{XFXA_Try3.IppProvLine.Line}</Expression>
</Subscript>
<Subscript name="4">
<Expression>{LnDetail}</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^XFXA.Try3.IppProvLineDetails</StreamLocation>
<Type>%Library.CacheSQLStorage</Type>
</Storage>
}

ユーザーが行に削除のマークを付けると、現在の詳細行の4番目の添え字レベルで削除フラグが1に設定され、この行が最後の行でない場合、ファイリングコードは最後の行に移動します。メインクラスのdeleteメソッドでこれを実行しようとすると、RowIdの更新が許可されていないというエラーメッセージが表示されます。これは、行を移動する行クラスのLineプロパティを操作して、削除された行を最後までプッシュしようとしたためです。ドキュメントを確認したところ、AllowRowIDUpdateにいくつかの警告がありましたが、使用方法の明確な例はありませんでした。誰かがこれを達成する方法を知っていますか?

4

2 に答える 2

0

ほとんどの場合、変更する必要のない合成/代理キーを使用することをお勧めします。

于 2012-07-17T15:27:51.327 に答える
0

さて、AllowRowIDUpdate に関するドキュメントには、

「BEFORE トリガーで独自のファイリングを行い、%SkipFiling フラグを使用している場合にのみ 1 に設定します。それ以外の場合は、デフォルトの 0 を使用します」。

BEFORE トリガーで独自のファイリングを行い、%SkipFiling フラグを使用する場合、ほとんどの場合、SQL ストレージを使用してデータを保存することはなく、SQL 経由で使用できるように独自のストレージを公開しているだけです。

最も簡単な方法は、RowID を更新しないことです。update を使用する代わりに、insert と delete を使用して行を移動します。サブスクリプト自体も更新できないため、これは基本的に、直接グローバル アクセスを使用して行う必要があるのと同じことです。

また、ご質問の範囲外ですが、可能であれば別のストレージを検討しますか。とにかく、行番号が何らかのBTreeのような構造に実際に格納されている場合、ギャップがないように行番号を移動してもあまり効果がないように見えるので、単にギャップを残すことができますか?

于 2012-07-16T22:47:44.717 に答える