Question

Est-il possible de rendre le nom de schéma dynamique dans une requête BIRT.

J'ai essayé ceci:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
      END) AS DAYOFWEEK
FROM **?**.COBOL_CALENDAR
 WHERE SERVICE_DATE = CURRENT DATE"

Ceci génère l'erreur suivante: Les éléments suivants comportent des erreurs:

ReportDesign (id = 1): 
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "?" was found following "".  Expected tokens may include:  "( TABLE FINAL <IDENTIFIER> XMLTABLE".  SQLSTATE=42601

Mais le? ne semble fonctionner que pour la clause where.

Je dois passer le schéma en tant que paramètre et l’utiliser de manière dynamique car il change en fonction de dev / cat / prod

n’existe-t-il pas un moyen de générer un emplacement SQL du birt xml et de l’injecter d’une manière ou d’une autre ??

J'ai fait quelques recherches supplémentaires sur le sujet et trouvé cette solution

<method name="beforeOpen"><![CDATA[this.queryText = "SELECT CURRENT DATE AS DATE, "+
"(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'"+
"      END) AS DAYOFWEEK"+
"FROM "+params["SCHEMA"]+".COBOL_CALENDAR"+
" WHERE SERVICE_DATE = CURRENT DATE";]]></method>

Cependant, quel que soit le nombre d'exemples cités sur ce problème, l'injection de SQL de cette manière ne génère que l'erreur suivante.

ReportDesign (id = 1): 
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "SCHEMANAME" was found following "".  Expected tokens may include:  ", FROM INTO".  SQLSTATE=42601

J'ai même essayé l'itinéraire reportContext.getParameterValue ("SCHEMANAME") avec les mêmes résultats.

Était-ce utile?

La solution

ARRRGH c'était un problème stupide avec des espaces !!

" FIN) COMME DAYOFWEEK "+ "FROM" + params ["SCHEMA"] + ".COBOL_CALENDAR" +

L'ajout d'un espace devant le FROM l'a corrigé.

cogne la tête sur l’affichage à cristaux liquides.

Autres conseils

On dirait que vous avez modifié la source XML de votre rapport. Voici une manière plus graphique de remplacer une chaîne arbitraire dans votre requête SQL:

Écrivez votre requête comme suit:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
      END) AS DAYOFWEEK
FROM dev.COBOL_CALENDAR
 WHERE SERVICE_DATE = CURRENT DATE

Si dev est un schéma valide, vous pouvez maintenant sélectionner le jeu de métadonnées et le remplacer par un paramètre de rapport.

Cliquez ensuite sur votre ensemble de données et sélectionnez le " script " Languette. Ici, vous sélectionnez " beforeOpen " et entrez le ccript de remplacement:

this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);

Ainsi, vous remplacez la chaîne dev dans le texte de votre requête par la valeur de votre paramètre SCHEMA avant d'exécuter la requête. Vous pouvez remplacer chaque chaîne souhaitée (linke **? ** de votre question, mais avec un schéma valide en premier lieu, vous pouvez utiliser le méta-ensemble de données pour la phase de conception. entrer la description de l'image ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top