Nombre de esquema dinámico BIRT 2.2
Pregunta
¿Es posible hacer que el nombre del esquema sea dinámico en una consulta BIRT?
He intentado esto:
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"
Esto genera el siguiente error: Los siguientes elementos tienen errores:
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
Pero el? Solo parece funcionar para la cláusula where.
Necesito pasar el esquema como parámetro y usarlo dinámicamente porque cambia basado en dev / cat / prod
¿no hay alguna forma de generar un exterior de sql del birt xml e inyectarlo de alguna manera?
Hice más búsquedas sobre el tema y encontré esta solución
<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>
Sin embargo, independientemente de la cantidad de ejemplos que haya sobre este problema, la inyección de SQL de esta manera solo genera el siguiente error.
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
Incluso probé la ruta reportContext.getParameterValue (" SCHEMANAME ")
con los mismos resultados.
Solución
¡ARRRGH fue un problema estúpido con espacios!
" FIN) COMO DAYOFWEEK " + " FROM " + params [" SCHEMA "] + " .COBOL_CALENDAR " +
Agregar un espacio delante del FROM lo ha arreglado.
golpea la cabeza en la pantalla lcd.
Otros consejos
Parece que ha editado la fuente XML de su informe. Aquí hay una manera más gráfica de reemplazar una cadena arbitraria en su consulta SQL:
Escriba su consulta de la siguiente manera:
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
es un esquema válido, ahora puede seleccionar el conjunto de metadatos y aún puede reemplazarlo con un parámetro de informe.
A continuación, haga clic en su conjunto de datos y seleccione la secuencia de comandos " " Lengüeta. Aquí seleccionas " antesAbrir " e ingrese el código de reemplazo:
this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);
De esta manera reemplaza el String dev
en el texto de su consulta con el valor de su SCHEMA
Parámetro antes de ejecutar la consulta. Podría reemplazar todas las cadenas que desee (linke **? **
de su pregunta, pero con un esquema válido, en primer lugar, puede usar el conjunto de metadatos para la fase de diseño.