2009-08-12 6 views
0

J'utilise Crystal Reports Basic pour Visual Studio 2008 pour générer un rapport à partir d'une base de données. Dans la base de données, il y a un champ "données structurées" appelé données. Il est une façon de représenter un Hashtable et le format est:Analyser un champ étrange dans 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 

donc si je devais encoder

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

j'aurais.

 
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) 

donc le champ de cet enregistrement contiendrait

 
14Name223John Robert Oxley228Age Of Poor Little Developer1227 

Il y a un certain nombre de domaines que je sais que je veux dans le rapport. Ils peuvent ne pas être dans le champ de données dans le tableau cependant. Maintenant pour mes questions

  • Je suppose que je dois créer une fonction personnalisée parseStructuredData (données, champ) qui retourne le champ que je veux ou null s'il n'est pas présent.
  • Y at-il des ressources sur le net pour des fonctions personnalisées ou un livre que je devrais acheter pour Crystal Reports (de préférence ebook) car j'ai très peu d'expérience?
  • Puis-je utiliser un "champ de formule" pour le mettre dans le rapport?

Mise à jour Ceci est en cours d'exécution sur le serveur MS SQL, mais je préfère ne pas utiliser une procédure stockée pour analyser les données que je ne veux pas modifier la base de données.

+0

J'essaie très fort de ne pas en faire une question «fais mon travail pour moi» –

+1

Quelle base de données?Je pense qu'il serait plus facile et meilleur d'écrire une procédure stockée qui fait l'analyse et l'utilise pour la source de données dans le cristal. Je ne m'attendrais pas à des performances fulgurantes sur de grandes tables, peu importe où vous allez. – SqlACID

Répondre

1

Voici ma fonction. C'est plus laid que le péché et j'ai honte d'afficher cela sur internet. Mais ça fonctionne. Ne jamais avoir utilisé VB correctement avant va donc ici:

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 

Si quelqu'un peut trouver une meilleure fonction, s'il vous plaît mettre dans une réponse.

2

Je vois dans votre édition que vous ne voulez pas modifier la base de données, mais obtenir la sortie que vous recherchez sera très difficile, voire impossible, sans une procédure stockée pour le transformer en plus d'une vue tabulaire. Même si vous étiez capable de le faire dans Crystal, j'imaginerais que vous deviez utiliser la boucle et la manipulation de chaînes, ce qui rendrait ces calculs sur chaque ligne très lents et nécessiterait beaucoup de ressources.

Je vous recommande d'utiliser des tables T-SQL ou temporaires dans une procédure stockée pour formater les données au lieu d'essayer de le faire dans Crystal. Accordé en utilisant un curseur dans SQL Server peut être plus lent, je crois que ce serait beaucoup plus rapide que dans Crystal.

EDIT: J'ai raté la partie où vous avez dit que vous utilisiez VS2008. Si vous ne voulez pas faire ceci dans un SP parce que vous ne voulez pas changer la base de données alors vous pouvez créer une fonction à la place pour faire ceci qui passe un ArrayList ou un DataTable en tant que source de données de rapports.

Je vais essayer de réexaminer ceci dans un peu et éditer ma réponse pour fournir comment je pourrais faire cela dans une procédure stockée ou une fonction.

+0

+1 ce n'est pas quelque chose que vous voulez vraiment faire en cristal. Vous pourriez, mais ce serait difficile et difficile à suivre à moins que vous connaissiez beaucoup de CR. – dotjoe