2014-02-14 2 views
3

플랫폼 : SoftwareAG WebMethods 8.2 문제점 : 2 개의 DocumentList가 있습니다. 그들 중 하나는 XOPObjects 다른 문자열 포함되어 있습니다. XOPObject를 String으로 변환하고 다른 DocList의 correspondingpoding String 필드에 복사해야합니다. 무슨 일이야? 아무것도. String 필드는 XOPObject의 base64string이 멋지게 생성되는 동안 입력 된 채로 있습니다. 감안할 때 문서 목록에DocumentList의 i 번째 문서 필드를 String으로 설정하십시오.

수행 단계 : 문서 목록 A (XOP와 소스) : B (대상 문자열 필드)

1. Loop over A 
2. Create Base64String from XOPObject using pub.soap.utils:getXOPObjectContent 
3. Call pub.flow:debugLog to check if the base64String is generated 
4. Generate index variable from $iteration with pub.math:subtractInts as index:=$iteration-1 
5. Perform map step from base64String to B's String field with index set to %index% 
6. After loop 
7. pub.xml:documentToXmlString to generate xml representation of the B document 
8. pub.flow:debugLog 
9. Nothing is in the String field... 

여기에 잘못된 것입니다 어떤 생각?

답변

1

webMethods Integration Server 플로우 서비스에서 루프에는 반복되는 목록을 식별하는 두 가지 속성, 필수 입력 배열 및 선택적 출력 배열이 있습니다.

루프 단계가 작동하는 방식은 입출력 배열의 항목에 대한 변경 사항 만 보존한다는 것입니다. 파이프 라인의 다른 목록에서 항목을 변경하면 루프 단계가 종료 될 때 변경 내용이 손실됩니다. 이것이 작동하는 방식입니다.

webMethods Developer User's Guide 페이지 198에서 인용 :

입력으로 사용될 개별 요소를 포함하는 입력 배열을 지정하는 LOOP 단계를 필요

입력 배열 지정 LOOP에서 하나 이상의 단계로 이동하십시오. 런타임에 LOOP 단계는 지정된 배열의 각 멤버에 대해 루프 의 한 번만 실행합니다. 예를 들어 주문에 저장된 각 광고 항목에 대해 을 실행하려는 경우 주문의 행 개가 LOOP의 입력 배열로 저장된 문서 목록을 사용합니다.

LOOP 단계의 등록 정보 패널에서 입력 배열의 이름을 지정하십시오. 사용자가 지정하는 배열은 다음 데이터 유형 중 하나 일 수 있습니다 *이 문자열 목록 * 문자열 테이블 *이 문서 목록 *이 개체 목록

루프 단계는 입력 배열에 지정된 배열의 각 구성원에 대해 한 번 실행합니다.

당신이 루프 내에서 서비스가 지정된 입력 배열의 개별 요소에 대해 작동하므로, 그들은 입력, 전체가 아닌 배열로 배열의 요소를하도록 설계되어야 함을 기억, 당신의 흐름을 설계

.

Loop Step Properties

는 예를 들어, LOOP 문서 목록에 대해 실행하는 경우이 항목라고 아이들이, 수량 및 단가, 당신이 LOOP 단계에 대한 입력 배열로 LineItems을 지정합니다 포함 LineItems라고 하지만, 루프 내의 서비스는 LineItem (예 : Item, Qty, UnitPrice 등)의 개별 요소를 입력으로 사용합니다.루프 단계는 출력 변수를 생성하는 경우

루프 단계에서

출력을 수집 서버는 파이프 라인의 배열로 그 출력을 수집 할 수있다.

이렇게하려면 출력 배열 매개 변수를 사용하여 서버에서 수집 할 배열 변수 의 이름을 지정하여 루프의 반복마다 출력 을 지정합니다. 예를 들어 루프가 구매 주문의 각 라인 항목 재고 상태를 확인하고 실행될 때마다 InventoryStatus라는 문자열을 생성하면 출력 배열의 값으로 InventoryStatus를 지정합니다. 런타임에 서버는 InventoryStatus를 루프의 각 반복에서 출력되는 변수로 자동 변환합니다.

루프의 각 단계에서 출력을 수집하려면 서버에서 각 반복마다 수집 할 출력 변수의 이름을 지정하십시오.

  1. 루프 단계의 출력 배열 속성에 두 번째 문서 목록 변수 이름을 지정

가 문제를 해결하기위한 몇 가지 방법이 실제로있다, 모든 것을 감안할 때. 이렇게하면 루프 단계가 종료 될 때 두 번째 문서 목록에 대한 변경 사항이 유지됩니다.

  • 루프 단계 이전의 맵 단계에서 첫 번째 문서 목록 (XOPObject 개체가있는 문서 목록)의 복사본을 가져온 다음 원본 대신 복사본을 반복하고 복사본 항목을 인라인으로 변경합니다.

  • 루프 단계에서 각각 pub.list:appendToDocumentList 또는 pub.list:appendToStringList을 사용하여 새 문서 목록 또는 문자열 목록을 구성하십시오. 이렇게하려면 더 많은 코드가 필요하며 입력 목록의 모든 항목에 대한 항목을 출력 목록에 포함시키고 싶지만 입력 목록 항목을 필터링 할 때 유용합니다 (결과 출력 목록은 입력리스트의 부분 집합).

  • +0

    답장을 보내 주셔서 감사합니다. 문제는 약간 다르다. 나는 두려워한다. 두 개의 거의 동일한 문서가 있습니다. 하나는 Object (XOP)를 포함하고 다른 하나는 XOPObject 대신 String을 포함합니다. 나는 XOP 객체의 복사본을 만들었고, 그 객체는 물론 XOP 객체를 제외한 다른 문서를 채웠다. 이제 원본 문서의 첨부 파일을 반복하고 getXOPObjectContent를 실행합니다. 좋아, 나는 그것이 작동하는지 확인하기 위해 debugLog를 만들 수도있는 결과를 얻는다. 그런 다음지도 단계를 수행하여 실제로 다른 문서의 문자열 필드에 매핑하고 결과는 파이프 라인에도 표시되지 않습니다. – Wrath

    +1

    코드가 필요합니다.가짜 코드만으로는 도움이되지 않습니다. – TchiYuan

    0

    아직 답변을 찾고 계신지 확실하지 않습니다. 한 번 같은 문제가 있었음을 기억합니다. 개체 유형과 문자열 간의 매핑으로 인해 문제가 발생합니다. 따라서 맵 내에서 런타임 중에 base64String이 포함될 것으로 예상 할 때 객체 유형을 string으로 매핑해야합니다.

    직접 매핑 대신 대상 문서 목록에서 변수 이름을 바꾸어 시도 할 수 있습니다.

    0

    아마도 루프 출력 배열로 문자열 목록을 생성 한 다음 루프 외부에서 출력 문자열 목록을 B의 필드로 매핑 할 수 있습니까?