2017-11-01 14 views
0

xmlファイルで埋められる2つの一時テーブルを含むデータセットを作成したいとします。OpenEdge TEMP-TABLEでRECIDを主キーとして使用する

DEF TEMP-TABLE ttOrder NO-UNDO 
    FIELD iOrderNo AS INT 
    FIELD iOrderDate AS DATE 
    INDEX ix RECID. // This also won't work, but this is needed to use the `OF` statement when retrieving records. 

DEF TEMP-TABLE ttOrderLine NO-UNDO 
    FIELD iParent AS RECID 
    FIELD iArticleNo AS INT 
    FIELD dPrice AS DECIMAL. 

DEF DATASET dsOrder FOR ttOrder, ttOrderLine 
    DATA-RELATION Order_OrderLine FOR ttOrder, ttOrderLine 
    RELATION-FIELDS ttOrder.RECID, ttOrderLine.iParent. // This is what won't work, but what I would like to do. 

通常、私はちょうどttOrderLineiOrderNoフィールドを作成し、データセットRELATION-FIELDS属性のそれと一致します。データはXMLファイルからロードされるので、これは難しいでしょう。

最終目標は、その代わりにこのは次のとおりです。

FIND FIRST ttOrder. 
FOR EACH ttOrderLine WHERE ttOrderLine.iParent = RECID(ttOrder): 
    // Do something 
END. 

私はこれを行うにしたいと思います。最後のメソッドを使用しているとき、私は今取得

FIND FIRST ttOrder. 
FOR EACH ttOrderLine of ttOrder: 
    // Do something 
END. 

エラーがIndex field of table1 must be fields in table2です。

誰かが私にこれをどのように行うことができるか教えてもらえますか?

答えて

4

TEMP-表は、一時テーブルは(ないで-参照)により、値の周りに渡され、クライアントとAppServerの間で渡されるたびにRECIDのが変更されます記録されます。

一般に、RECIDを他のテーブルのキーとして使用することは非常に危険です。

OrderlineテーブルのOrder RECIDを持つデータセットがAppServerに配置され、クライアントで処理されると、シナリオが途切れることがあります。

+0

これは良い点です! – Jensd

+0

本当に良い点です。 @MikeFechner。オーダーラインを読み込むときにオーダーIDにアクセスできない場合、どうすればこの問題を解決できますか? –

+0

IMHOでは、OrderLineで参照されるOrderにキーフィールドが必要です。 PUKフィールドまたは注文(アクセス)がない場合は、GUIDを使用します。 ABL GUID関数は、必要に応じてGUID値を提供します。 –

-2

OF構文を使用するには、親テーブルを子テーブルの一意のインデックスに格納する必要があります。

この構文ではデータセットは必要ありませんが、実際にrecidを使用してデータセットが必要な場合は、RELATIONS-FIELDSの代わりにPARENT-ID-RELATIONを調べる必要があります。このを見て

スタート:

DEFINE TEMP-TABLE ttOrder NO-UNDO 
    FIELD iOrderNo AS INTEGER 
    FIELD iOrderDate AS DATE 
    FIELD iParent AS RECID. 


DEFINE TEMP-TABLE ttOrderLine NO-UNDO 
    FIELD iParent AS RECID 
    FIELD iArticleNo AS INTEGER 
    FIELD dPrice  AS DECIMAL 
    INDEX ix IS UNIQUE iParent. 


DEFINE DATASET dsOrder FOR ttOrder, ttOrderLine 
    PARENT-ID-RELATION Order_OrderLine FOR ttOrder, ttOrderLine PARENT-ID-FIELD iParent. 


FOR EACH ttOrder, EACH ttOrderLine OF ttOrder: 
    DISPLAY ttOrder. 
    DISPLAY ttOrderLine. 
END. 
+1

私はdownvoting時にコメントすることをお勧めします。この解決策は実際に問題を解決します(生存記録と一時表が良い考えであるかどうかは状況に左右される可能性があります)。 – Jensd

+1

jensdが指摘する重要な、しかし恐らく微妙なことは、OFはRECIDを必要としないということです。フィールド名が両方のテーブルに存在し、それが一意に索引付けされていることのみが必要です。 –

関連する問題