2009-08-12 8 views
0

Visual Studio 2008のCrystal Reports Basicを使用して、データベースからレポートを生成しています。データベースには、データと呼ばれる「構造化データ」フィールドがあります。 それはハッシュテーブルを表現する方法であり、フォーマットは次のとおりCrystal Reportsの奇妙なフィールドを解析します

 
XLLLKeyYMMMValue 
where: 
X is the length of the length of the Key 
L is the length of the Key 
Y is the length of the length of the Value 
M is the length of the Value 

私は

 
Name = John Robert Oxley 
Age Of Poor Little Developer = 27 

を符号化した場合、私が持っているであろう。

 
Name (L = 4 therefore X = 1) 
John Robert Oxley (M = 17 therefore Y = 2) 
Age Of Poor Little Developer (L = 28 therefore X = 2) 
27 (M = 2 therefore Y = 1) 

ので、このレコードのフィールドは、私は私がレポートにしたい知っているフィールドの数があります

 
14Name223John Robert Oxley228Age Of Poor Little Developer1227 

含まれています。ただし、テーブルのデータフィールドには表示されません。今すぐ私の質問のために

  • 私は、私が望むフィールドを返すカスタム関数parseStructuredData(data、field)を作成しなければならないと思います。
  • カスタム機能のためのネットや、Crystal Reports用に購入する必要のある書籍(できれば電子ブック)のリソースはほとんどありませんか?
  • 次に、「フォーミュラフィールド」を使用してレポートに配置しますか?

更新これは、MS SQLサーバー上で実行されているが、私は、私はデータベースを変更したくないとして、データを解析するために、ストアドプロシージャを使用しないでしょう。

+0

私はこれを「私の仕事をしてください」という質問にしないと非常に努力しています質問 –

+1

どのデータベースプラットフォームですか?私は、構文解析を行い、クリスタル内のデータソース用のストアドプロシージャを使用するストアドプロシージャを書く方が簡単で、より簡単になると思います。私はあなたがどこで解析しても大きなテーブルで猛烈なパフォーマンスを期待しません。 – SqlACID

答えて

1

ここは私の機能です。それは罪よりも醜いです。私はインターネットでこれを投稿することを恥じています。しかし、それは動作します。これまでにVBを正しく使用したことはありません。

Function ParseStructData (struct As String, key As String) As String 
    Dim leng As Number 
    Dim ll As Number 
    Dim data As String 
    Dim rest As String 
    Dim kk As String 

    rest = struct 

    Do 
     ll = Val(Left(rest, 1)) 
     If ll < 1 Then 
      Exit Function 
     End If 
     rest = Right(rest, Len(rest) - 1) 
     leng = Val(Left(rest, ll)) 
     rest = Right(rest, Len(rest)-ll) 
     kk = Left(rest, leng) 
     rest = Right(rest, Len(rest)-leng) 
     ll = Val(Left(rest, 1)) 
     rest = Right(rest, Len(rest)-1) 
     leng = Val(Left(rest, ll)) 
     rest = Right(rest, Len(rest)-ll) 

     data = Left(rest, leng) 
     If kk = key Then 
      ParseStructData = data 
      Exit Function 
     End If 
     rest = Right(rest, Len(rest)-leng) 
    Loop Until Len(rest) <= 0 

End Function 

誰かがより良い機能を発揮できるのであれば、答えを記入してください。

2

あなたはデータベースを変更したくないが、あなたが探している出力を得ることは不可能ではないにしても、ストアドプロシージャをそれ以上の表形式のビューに変換することが不可能になるだろう。たとえあなたがCrystalでそれを行うことができたとしても、各行でこれらの計算を実行するループと文字列の操作は、非常に遅くてプロセッサ集中的でなければならないと思います。

私は、T-SQLまたはテンポラリテーブルをストアドプロシージャで使用して、Crystalで実行しようとする代わりにデータをフォーマットすることをお勧めします。 SQL Serverのカーソルを使用すると、Crystalよりもはるかに高速になると考えられます。

EDIT:私はあなたがVS2008を使ってこれをやっていると言いました。データベースを変更したくないため、SPでこれを実行したくない場合は、ArrayListまたはDataTableをレポートデータソースとして渡す代わりに関数を作成することができます。

これを少し再検討して、ストアドプロシージャや関数でこれを行う方法について私の答えを編集しようとします。

+0

+1これはあなたが本当にクリスタルでしたいことではありません。あなたはそうすることができますが、あなたが多くのCRを知っていなければ、それはハッキーであり、追跡が難しいでしょう。 – dotjoe