2016-04-08 11 views
0

SSRS 2012の新機能&は苦労しています。SSRS 2012.クエリーデザイナーでレポートをグループ化すると結果が

クライアントデータにサブレポートを含むレポートがあります。 1つのクライアントでテストするとき(ちょうどすべてがOKだったことを確認するために)、それは完全に動作します。
フィルタが削除されると、タイムアウトになります(実際にはユーザーによってキャンセルされたというメッセージが表示されます)。

明らかに、サブレポートを含めることは問題です(メインレポートはそれなしで正常に実行されるため)。

サブレポートは、クライアントごとに複数のレコードを有効に返すことができます。サブレポートはClientIdでグループ化されます。次に、2つのフィールド(ICとPC)を連結してYesYesまたはYesNoのいずれかを生成する演算フィールド、たとえばHasIPがあります。 TablixはHasIPによってZからAにソートされます。

ClientIDフッターの情報は、私が表示しているものです。

ClientID HasIP 
22   YesNo - has two records, but since it has a YesYes, I don't want this one 
22   YesYes - has two records, but I want the this one 
52   YesYes - may only have 1 record, I want this record 
76   YesNo - may only have 1 record, I want this record 

クライアントがHasIPの複数のインスタンスを持つことができない理論= Yesはい&は、2つの以上のレコードを持つべきではありません。クエリデザイナーでこのエフェクトを再現するにはどうすればよいですか?基本的にはHasIP = yesyesの場合はそのレコードを使用し、それ以外の場合は他のレコードを使用します。

これを行うことができれば、サブレポートを完全に削除してメインレポート&にこのデータセットを追加してデータを取得します。

私たちのレポートシナリオが設定されている方法では、クエリを変更できません[データセットプロパティでクエリデザイナボタンをクリックする必要があります] &私はMDXでの経験がありません。

答えて

0

解決しよう!!!:

OKは - ここに私が作ってみたものです。

をICに数値順序を割り当て、PCは

値Iが一緒IC & PCフィールド値を連結した値を割り当てられ、元のサブレポート内のレコードのIDを追加しました。の値を除外するために

=Left(Fields!HasIP.Value, 1) 

:私は

これは、2-XXXXで私を残し、1-YYYYなど

=Switch(Fields!IC.Value+Fields!PC.Value="YesYes", 1, 
Fields!IC.Value+Fields!PC.Value="YesNo", 2, 
Fields!IC.Value+Fields!PC.Value="NoNo", 3) & "-" & Fields!R_Name.Value 

HasIP

このフィールドと呼ばれる、私はその後、私の第二のデータセットにフィルターを追加しました(LookupSetによって使用される) "Noいいえ"

を連結HasIPとDATASET2の他のフィールド

さらに、出力のためにテキスト値をコードに変換しなければなりませんでした(例えばYes = 1、No = 2、Unknown = 3など)。これを行うには、HasIPを含むDataset2の計算フィールドをクエリではなくレポートに作成します。私はドル記号を使って値からHasIPを区切った。

=Fields!HasIP.Value & "$" & 
SWITCH(
    left(Fields!CoR.Value, 1)="C", 1, 
    Left(Fields!CoR.Value, 1)="N", 2, 
    True, "" 
) 

これは、私に2-xxxx $ 2、1-yyyy $ 1などを残しました。

ソートLookupSetは

LookupSetは、配列を作成結果(はい、今あなたも知っています)。私はこれをソートする必要があったので、後にあるものが返された最初の値になりました。これは、以下をコピーしてレポートのカスタムコードセクションに貼り付けることで実現します。 (必要なら逆順でソートできるようにコードを追加しました)。

Function JoinSorted(m_Array As Object()) As String()  
System.Array.Sort(m_Array) 
' Array.Reverse(m_Array) 'uncomment this line if you want to sort in reverse 

    Dim k As Integer = 0 
    For i As Integer = 0 To m_Array.Length - 1 
     If i > 0 AndAlso m_Array(i).Equals(m_Array(i - 1)) Then 
      Continue For 
     End If 
     m_Array(k) = m_Array(i) 
     k += 1 
    Next 
    Dim fred As [String]() = New [String](k - 1) {} 
    System.Array.Copy(m_Array, 0, fred, 0, k) 
    Return fred 
End Function 

あなたのレポート式に次のように使用してこれを呼び出す:

Join(
    Code.JoinSorted(
     LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!YourField.Value,"Dataset2") 
    ),"" 
) 

ので、関係なく、LookupSetは、配列を返すように望んでいたかの、私はいつも最初の$ 1を1-YYYYました。レポートにLookupSet出力の取り扱い

- レコードなしのレポートでは、いくつかのLookupSetの結果を得るために

のデフォルトを含め、私はレコードが返されなかった場合、デフォルトの値を返す必要がありました。それ以外の場合は、割り当てられた値(1,2,3など)を返す必要がありました。場合は、これを行うには2つの方法が見つかりました。

これは、配列数[はい、長さを使用する]が0より大きいかどうかをチェックします。

=SWITCH(
    LookupSet(
     Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2" 
    ) 
    .Length=0, 
    2, 
    LookupSet(
     Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2") 
    .Length>0, 

1)

OR これは同じである:もしそうなら、その配列結果にミッド機能を使用すると、14番目の文字を返します

=iif(
    LookupSet(
     Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2" 
    ).Length>0, 
    Mid(
     Split(
      Join(
       Code.JoinSorted(
        LookupSet(
         Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2") 
        ) 
      ,";") 
     ,";").GetValue(0) 
    , 'start point of mid 
     InStr(
      Join(
       Code.JoinSorted(
        LookupSet(
         Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2" 
        ) 
       ) 
      ,";") 
     ,"$") 
    +1, 
    1), 
"2" 
) 

取り扱いLookupSet出力にレポート - 値の長さが変化するときのMIDの使用

場合によっては、 nは長さが変化しました。たとえば、2または10です。LookupSetが結果を返さなかった場合、何も返さないようにする必要がありました。それは#ERRORを投げたとして、一部のレコードの文字列に負の長さを作るため、(最後に)-1の使用に

Mid(
    Join(Code.JoinSorted(
     LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2")), 
     ";"), 
    InStr(
     Join(
      Code.JoinSorted(
      LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2") 
      ), 
     ";"), 
    "$")+1, 
    (
     InStr(
      Join(
       Code.JoinSorted(
        LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2") 
        ), 
      ";"), 
     ";") 
    - 
     InStr(
      Join(
       Code.JoinSorted(
        LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2") 
       ), 
      ";"), 
     "$") 
    - 1) 
) 

:私はこのようなMIDの「正常な」バージョンを使用できませんでした。

だから、ここで私が使うことができるものである:

= 
Mid(
    Split(
     Join(
      Code.JoinSorted(
       LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12b.Value,"Dataset2") 
      ), 
     ";"), 
    ";").GetValue(0) 
, 
    InStr(
     Join(
      Code.JoinSorted(
       LookupSet(
        Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12b.Value,"Dataset2") 
      ), 
     ";"), 
    "$") 
+1, 
1) 

こうすることによって、私は私が詳細に後にした結果はフッターを&得ることができます。

私はこれが他の人に役立つことを願っています。

関連する問題