2017-11-01 27 views
0

xml 파일로 채워진 두 개의 임시 테이블을 포함하는 데이터 세트를 만들고 싶습니다. 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

온도 - 테이블 레코드를 RECID의이 변경됩니다 (하지 않음으로써 참조) 및 클라이언트와 AppServer를 사이에 통과했다.

일반적으로 RECID를 다른 테이블의 키로 사용하는 것은 매우 위험한 시나리오입니다.

Orderline 테이블의 Order RECID가있는 데이터 세트가 AppServer에 채워지고 클라이언트에서 처리되면 시나리오가 중단됩니다.

+0

이것은 좋은 지적입니다! – Jensd

+0

정말로 좋은 점. @MikeFechner. 주문 행을로드 할 때 orderid에 액세스 할 수 없다면 어떻게 해결할 수 있습니까? –

+0

이럴 경우 OrderLine에서 참조되는 Order에 keyfield가 있어야합니다. PUK 필드 또는 주문 (액세스)이없는 경우 GUID를 사용하십시오. ABL GUID 함수는 필요할 때마다 GUID 값을 제공합니다. –

-2

OF 구문이 작동하려면 하위 테이블의 고유 색인에 상위 ID를 저장해야합니다.

이 구문에는 데이터 집합이 필요하지 않지만 실제로 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를 요구하지 않는다는 것입니다. 필드 이름이 두 테이블에 모두 존재해야하며 고유 한 인덱스가 있어야합니다. –