2012-06-05 2 views
0

나는 현재 그룹의 세 가지 수준이 손익 보고서가 약국, 고객 및 포장 유형에 대한 값을 제공하라는 메시지를 표시합니다. 세부 밴드에는 수익 및 마진과 같은 측정 값이 표시됩니다. 약국, 고객 또는 포장 유형의 기본값을 선택하면 그룹의 모든 값이 반환됩니다."마구"그룹

궁금합니다. 사용자가 매개 변수에 "기본값 사용"을 선택하면 iReport에 그룹을 표시하도록 알려줍니다. 현재 약국과 고객을 선택했지만 포장 유형에 기본값을 사용하면 몇 가지 포장 유형마다 세부 밴드가 표시됩니다. 모든 포장 유형에 대해 iReport를 합산하도록 말할 수 있습니까? 또는 고객이 지정되지 않은 경우 모든 고객에게 특정 약국에 대한 금액을 합산합니까? 아니면 쿼리에서 할 수 있을까요? Oracle 데이터베이스가 있고 iReport Professional 4.5.1을 사용하고 있습니다. 내가 쿼리에서 그것을 시도 할 것

SELECT 
     FAC.FILL_MONTH AS FILL_MO, 
     FAC.PHAR_CODE AS PHAR_CODE, 
     FAC.FAC_ID AS FAC_ID, 
     FAC.PACKTYPE_CODE AS PACKTYPE, 
     SUM(FAC.TOT_RXCOUNT_NUM) AS RX_COUNT, 
     SUM(FAC.TOT_REVENUE_AMT) AS REVENUE, 
     SUM(FAC.TOT_COGS_AMT) AS COGS, 
     SUM(FAC.TOT_MARGIN_AMT) AS MARGIN 
FROM 
     MySchema.Table FAC 
WHERE 
     FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate} 
     AND $X{IN, FAC.PHAR_CODE, pharmacy} 
     AND $X{IN, FAC.FAC_ID, facility} 
     AND $X{IN, FAC.PACKTYPE_CODE, packtype} 
GROUP BY 
     FAC.PHAR_CODE, 
     FAC.FAC_ID, 
     FAC.PACKTYPE_CODE, 
     FAC.FILL_MONTH 
ORDER BY 
     PHAR_CODE ASC, 
     FAC_ID ASC, 
     PACKTYPE ASC, 
     FILL_MO ASC 
+1

SQL (또는 간단한 버전)을 게시하십시오. 매개 변수를 사용하여 필요한 것을 얻을 수 있어야합니다. – mdahlman

+0

고마워요! 내 코드의 단순화 된 버전을 게시했습니다. – Lisa

답변

3

원하는 원시 데이터를 정확하게 얻으려면 SQL을 사용하십시오. 그러나 사용자가 PACKTYPE을 지정하는 특수한 경우에 PACKTYPE (및 다른 필드)이 다르게 그룹화되도록 수정해야합니다.

새 매개 변수 $P{PACKTYPE_SELECT_SQL}을 만듭니다. 기본값은 기존 매개 변수 $P{packtype}의 값을 직접 기반으로합니다. (이 $P{packtype}은은 .jrxml에서 먼저 표시해야 함을 의미합니다.)이 같은으로 설정 $P{PACKTYPE_SELECT_SQL}의 기본 값 :

$P{packtype}==null ? " 'All Package Types' " : " FAC.PACKTYPE_CODE " 

는 다음과 같이 SQL 쿼리 (단일 라인 수정을 수정, 나머지는 그냥) 컨텍스트 : 그것은 예전으로 $P{packtype}가 null가 아닌 경우

SELECT 
    FAC.FILL_MONTH AS FILL_MO, 
    FAC.PHAR_CODE AS PHAR_CODE, 
    FAC.FAC_ID AS FAC_ID, 
    $P!{PACKTYPE_SELECT_SQL} AS PACKTYPE, 
... 
WHERE 
    FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate} 
    AND $X{IN, FAC.PHAR_CODE, pharmacy} 
    AND $X{IN, FAC.FAC_ID, facility} 
    AND $X{IN, FAC.PACKTYPE_CODE, packtype} 

후 생성 된 SQL 정확히 될 것입니다. 그러나 $P{packtype}이 null 인 경우 PACKTYPE_CODE 대신 하드 코딩 된 문자열이 표시됩니다.

아마도 보고서의 그룹은 PACKTYPE 일 것입니다. 따라서 보고서의 레이아웃과 그룹을 변경하지 않고 그대로 둘 수 있습니다.

보고서에 PACKTYPE을 유지할지 여부를 명시 적으로 사용자가 선택할 수 있도록 부울 입력 컨트롤을 추가하는 것과 같은 변형을 상상할 수 있습니다. 그러나이 기본 아이디어는 당신에게 필요한 것을 얻게합니다.

+0

이것은 아름답게 작동합니다. 도와 주셔서 정말 감사합니다! 나는 $ P를 사용할 수 있도록 다른 매개 변수를 정의하는 것에 대해 생각하지 않았습니다! 그런 식으로. 나는 이것을 자주 사용하는 것을 볼 수있다. – Lisa

+0

매우 흥미 롭습니다. 나는 전에 그것을 한 적이 없다. 매우 창의적인 솔루션. – Tom

+0

Matthew, JasperServer에 이것을 배치하고 설비 및 packtype 값에 대한 계단식 입력 제어를 설정합니다. iReport에서는 작동하지만 JasperServer에서는 작동하지 않습니다. 입력 컨트롤은 필수 사항이 아니며 JasperServer에서는 "always prompt"를 선택하지 않았습니다. 보고서가 처음 열리면 예상 한 것처럼 그룹이 롤업되지만 입력 컨트롤에서 약국을 선택하고 다른 입력 컨트롤을 선택하지 않으면 다른 입력 컨트롤의 모든 요소가 표시됩니다 _select_sql 매개 변수는 무시됩니다. 이 문제를 해결하기 위해 내가 할 수있는 일에 대한 의견이 있으십니까? 다시 감사합니다. – Lisa

2

:

감사합니다, 리사

편집 됨 코드를 추가합니다. 귀하의 질의를 보지 않고 구체적인 내용을 설명하기는 어렵지만, 예를 들어 몇 가지 코드를 제공 할 수 있습니다. 이 특정 재 스퍼 보고서에서 사용자가 지정한 PGM_NAME 및 USER_NAME을 기반으로 값을 표시하고 있습니다. 그러나 이러한 매개 변수를 지정하는 것은 선택 사항입니다. 매개 변수를 지정하지 않으면 기본값은 모든 PGM_NAME 및/또는 USER_NAME에 대해보고하는 것입니다. 내 ireport 쿼리에서 WHERE 절에는 다음과 같은 행이 있습니다.

WHERE ($P{PGM_NAME} IS NULL OR job.pgm_name = $P{PGM_NAME}) 
AND  ($P{USER_NAME} IS NULL OR details.username = $P{USER_NAME}) 

이것은 매력처럼 작동합니다. 자신의 검색어를 조정하는 방법을 결정하는 데 도움이되기를 바랍니다. 도움이 필요하시면 질문에 검색어 자체를 게시하십시오.

+0

약국, 고객 및 포장 유형은 모두 java.util.collection 유형의 변수이며 내 검색어의 where 절에서 $ X {IN, PHARMACIES, pharmacy}와 같이 $ X를 사용하여 매개 변수를 설정합니다. 귀하의 대답은 제가 약국/고객/포장 유형에 대한 기본값을 사용할 때 각각의 값을 반환한다는 것을 깨닫게했습니다. 나는 각각에 대해 뚜렷한 가치를 원하지 않는다. 나는 그룹 전체를 원한다. 나는 iReport에게 어떻게 말해야 하는지를 알아야합니다. – Lisa

+0

우리는 더 많은 데이터를 지정할 수있는 것처럼 보입니다. (주어진 고객을위한 모든 패키징 유형을 얻으려면 $ X {...를 사용하거나 하나의 유형 또는 여러 유형을 가져올 수 있지만) 그룹화 수를 조작 할 수는없는 것으로 보입니다 레벨을 즉시 전송할 수 있습니다. – Lisa