2014-12-10 3 views
1

쿼리에서 반복되는 행을 제거해야하지만 예상 한 결과를 얻을 수 없습니다. 내가 GROUP BY을 사용해야한다는 것을 알았지 만, 그 결과를 얻지 못한다면 내가 전에 얻었던 것을 얻게된다. 이 방법이 X ++의 고유 레코드에 올바른 방법입니까?Dynamics X ++에서 별개의 레코드를 만드는 방법은 무엇입니까?

여기 RecId - Location - StateName

5637145326 - 0 - 
5637145327 - 0 - 
5637145328 - 0 - 
5637146076 - 0 - 
5637146077 - 0 - 
5637150576 - 0 - 
5637150577 - 0 - 
5637150578 - 0 - 

GROUP BY RecId없이입니다 :

5637150578 - 5637145326 - New York 
... 
5637150578 - 5637145326 - New York 
다음
SELECT RecId, City, BuildingCompliment 
    FROM %1 GROUP BY RecId JOIN Location FROM %2 
     OUTER JOIN StateId, Name FROM %3 
     OUTER JOIN ISOcode FROM %4 
     OUTER JOIN CurrencyCode, Symbol, Txt FROM %5 
     OUTER JOIN ShortName FROM %6 
    WHERE (%1.ValidTo == DateTimeUtil::maxValue() || %1.ValidTo > DateTimeUtil::utcNow()) 
     && %2.Location == %1.Location 
     && %3.CountryRegionId == %2.CountryRegionId && %3.StateId == %2.State 
     && %4.CountryRegionId == %1.CountryRegionId 
     && %5.CurrencyCode == %4.CurrencyCode 
     && %6.LanguageId == 'EN-US' && %6.CountryRegionId == %1.CountryRegionId 

GROUP BY RecId과 결과입니다 : 그건 그렇고, 내가 6 개 테이블을 사용하고, 여기 내 X ++ 쿼리

모두 반복됩니다. 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 감사!

UPDATE

테이블/사용 조회 :

DirPartyPostalAddressView //%1 
LogisticsPostalAddress //%2 
LogisticsAddressState //%3 
LogisticsAddressCountryRegion //%4 
Currency //%5 
LogisticsAddressCountryRegionTranslation //%6 

편집 쿼리

string sqlAxCommand = @"SELECT RecId, City, BuildingCompliment, Location, CountryRegionId FROM %2 
             GROUP BY RecId, City, BuildingCompliment, Location, CountryRegionId 
            OUTER JOIN StateId, Name FROM %3 
             WHERE %3.CountryRegionId == %2.CountryRegionId 
              && %3.StateId   == %2.State 
            OUTER JOIN ISOcode FROM %4 
             WHERE %4.CountryRegionId == %2.CountryRegionId 
            OUTER JOIN CurrencyCode, Symbol, Txt FROM %5 
             WHERE %5.CurrencyCode == %4.CurrencyCode 
            OUTER JOIN ShortName FROM %6 
             WHERE %6.CountryRegionId == %2.CountryRegionId 
              && %6.LanguageId  == 'EN-US' 
            EXISTS JOIN %1 
             WHERE %1.Location   == %2.Location 
              && %1.IsPostalAddress == NoYes::Yes"; 
+0

% 1- % 6을 실제 테이블 이름으로 바꿀 수 있다면 도움이 될 것입니다. – 10p

+0

@ 10p 확실합니다. 방금 내 질문을 업데이트했습니다. – eestein

+0

X ++에서 (정적) 메서드를 만들고 C#에서 호출하는 것이 가능합니까? 이 방법으로 모든 표준 X ++ 함수와 클래스를 사용할 수 있습니다. 절대적으로 필요한 경우 X ++에서 직접 SQL을 실행할 수도 있습니다 (dataAreaId 및/또는 파티션을 포함하는 것을 잊지 마십시오). –

답변

2

내가 기대 당신은 GROUP BY RecId, City, BuildingCompliment을 사용했다.

업데이트 :

당신이 LocationCountryRegionId에 가입해야하는 경우, 당신은뿐만 아니라 GROUP BY에 추가해야합니다 나는이 지나서 달에 많이 개발했습니다

LogisticsPostalAddress   logisticsPostalAddress; 
LogisticsAddressState   logisticsAddressState; 
LogisticsAddressCountryRegion logisticsAddressCountryRegion; 
LogisticsAddressCountryRegionTranslation logisticsAddressCountryRegionTranslation; 
Currency   currency; 
DirPartyLocation dirPartyLocation; 
utcdatetime   _validFrom = DateTimeUtil::utcNow(); 
utcdatetime   _validTo = DateTimeUtil::maxValue(); 

SELECT validTimeState(_validFrom, _validTo) RecId, City, BuildingCompliment, Location, CountryRegionId FROM logisticsPostalAddress 
    GROUP BY RecId, City, BuildingCompliment, Location, CountryRegionId 
OUTER JOIN StateId, Name FROM logisticsAddressState 
    WHERE logisticsAddressState.CountryRegionId == logisticsPostalAddress.CountryRegionId 
     && logisticsAddressState.StateId   == logisticsPostalAddress.State 
OUTER JOIN ISOcode FROM logisticsAddressCountryRegion 
    WHERE logisticsAddressCountryRegion.CountryRegionId == logisticsPostalAddress.CountryRegionId 
OUTER JOIN CurrencyCode, Symbol, Txt FROM currency 
    WHERE currency.CurrencyCode == logisticsAddressCountryRegion.CurrencyCode 
OUTER JOIN ShortName FROM logisticsAddressCountryRegionTranslation 
    WHERE logisticsAddressCountryRegionTranslation.CountryRegionId == logisticsPostalAddress.CountryRegionId 
     && logisticsAddressCountryRegionTranslation.LanguageId  == 'EN-US' 
EXISTS JOIN dirPartyLocation 
    WHERE dirPartyLocation.Location   == logisticsPostalAddress.Location 
     && dirPartyLocation.IsPostalAddress == NoYes::Yes; 
+0

답변을 주셔서 감사합니다.하지만 불행히도 아니오, 나는 RecId와 모든 프로젝션 필드에서 동일한 결과를 얻었습니다. – eestein

+0

답안에 예제를 추가했습니다 - 귀하에게 적합한 지 확인할 수 있습니까? – 10p

+0

시도했는지 모르겠지만 컴파일하지 않았습니다. 예를보고 싶었어? – eestein

0

역 동성 Ax와 대부분의 경우 중복 된 레코드를 가져 오는 것은 잘못된 조인이라고 설명합니다. 각 개별 테이블 아래에서 조인이 올바른지 확인합니다. 때때로 Axe는 자동으로 조인을 해줄 것입니다. 그러나 자동으로 조인 할 수는 있지만 필요한 것은 아닙니다. 이러한 상황은 Base Axe에서 벗어날 때 자주 발생합니다. 내부 조인 전환 및 OuterJoins를 사용하여 하나의 레코드를 가져 오는 것이 좋습니다. LogisticselectronicAddress 테이블을 처리 할 때 inventtable 및 몇 가지 주요 다른 것들과 함께 사용하면 dups를 공유하고 생성하는 것을 좋아하지 않습니다. 또한 개별적인 뷰를 만들고 C#으로 함께 링크 해 볼 수도 있습니다. 희망이 도움이됩니다. 또한 ExistsJoin은 원하는 방식으로 완전히 작동하지 않을 수도 있습니다. 조인을 먼저 꺼내서 조금만 수정하십시오. 적절하지 않다고 생각되면 삭제하십시오.

+0

안녕하세요 Ben, 스택 오버플로에 오신 것을 환영합니다. 이 대답이 문제를 해결할 수도 있지만 특히 간결하지 않고 솔리드 한 대답보다는 추측쪽으로 더 기울입니다. 나는 그것을 편집하고 당신이 기회를 가질 때 그것을 향상시키는 것이 좋습니다. – brandonscript

+0

답변 해 주셔서 감사합니다. 아무런 소용이없는 상태로 게시되기 전에도 내 질문에 잠시 놀았습니다. 어쨌든 AIF 서비스를 사용하기로 결정 했으므로 문제가 해결 될 것이며 유연성이 향상 될 것입니다. – eestein

관련 문제