2017-03-01 1 views
1

J'ai besoin d'un rapport dans lequel un utilisateur doit choisir 2 paramètres. Le premier paramètre contient les années (2017, 2016 ...), et le second contient le processus d'identification. Selon le processus que l'utilisateur choisit, l'instruction SQL sera l'un ou l'autre. L'année du paramètre fait partie de la clause WHERE du SQL contenue dans le second paramètre. J'ai donc ce rapport avec 2 paramètres (param_year, Indicador). Le paramètre de requête est effectué à l'aide d'une source de données de table, où la colonne ID contient les phrases SQL et la colonne Values ​​contient le texte que l'utilisateur doit sélectionner.Requêtes SQL dynamiques en tant que paramètre

Setting the parameter

Alors ce que je fais est à côté set ${Indicador} comme l'instruction SQL dans la connexion JDBC que je l'ai fait à la base de données. Cela me signale une erreur SQL

« a échoué à la requête:. $ {Indicador}

Setting the parameter as the SQL statement

Toutes les suggestions seront appréciées Merci d'avance

Répondre

0

Une autre option consiste à créer plusieurs sources de données dans votre maître/sous rapport, puis sélectionner la source de données appropriée en utilisant l'expression sur Master/sub Report -> Attributes -> query -> name PRD attribut.

explication plus détaillée:

  1. Créer une requête (je veux dire une requête comme un objet PRD, qui utilise le PRD source de données) pour chaque chaîne SQL dont vous avez besoin et déplacer les chaînes SQL de la table des paramètres dans les définitions de requêtes de Report Designer.
  2. Remplacer les chaînes SQL dans votre table de paramètres avec les noms des requêtes correspondantes, par exemple: parameter table
  3. Utilisez la valeur de votre paramètre (qui devrait être égal au nom de la requête PRD) en tant que valeur pour Master/sub Report -> Attributes -> query -> name attribut: query name expression
+0

Je n'avais pas trop tort. Cela fonctionne parfaitement. Merci beaucoup!!! – Mascu

0

Vous avez besoin.. Pentaho Data Integration pour faire ce type de requête dynamique

0

Si la structure de la table (colonnes de sortie) pour les deux requêtes est le même, vous pouvez les assembler en une seule grosse instruction SQL avec UNION ALL et mettre dans chaque requête "WHERE $ {Indicador} = ValueToRunThisQuery".

L'optimiseur devrait être assez intelligent pour savoir que la sous-requête non-sélectionnée va retourner zéro lignes et même pas l'exécuter. Vous pouvez fournir quelques colonnes nulles si une requête contient moins de colonnes, mais que les types de données doivent être les mêmes pour les colonnes remplies.

Si la structure de la table de sortie est différente entre les deux requêtes, elles doivent se trouver dans des sources de données différentes, voire des rapports.

SELECT ID, BLA, BLA, BLA, ONLY_IN_A 
FROM TABLE A 
WHERE ${Indicador} = "S010" 
UNION ALL 
SELECT ID, BLA, BLA, BLA, NULL 
FROM TABLE B 
WHERE ${Indicador} = "S020"