Pergunta

É possível fazer o nome do esquema dinâmico em uma consulta BIRT.

Eu tentei isso:

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"

Isso gera o seguinte erro: Os seguintes itens têm erros:

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

Mas o? só parece funcionar para a cláusula WHERE.

Eu preciso passar o esquema como um param e usar de forma dinâmica porque muda com base em dev / cat / prod

Não há alguma maneira de genereate sql outsite do xml birt e injetá-lo de alguma forma ??

Eu fiz mais algumas pesquisas sobre o assunto e encontrei esta solução

<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>

No entanto, independentemente de quantos exemplos que estão lá fora, sobre esta questão injeção de SQL dessa maneira só gera o seguinte erro.

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

Eu até tentei a rota reportContext.getParameterValue("SCHEMANAME") com os mesmos resultados.

Foi útil?

Solução

arrrgh que era um problema estúpido com espaços !!

"END) AS DAYOFWEEK" + "De "params + [" esquema"] + "COBOL_CALENDAR" +

Como adicionar um espaço em frente ao DE fixa-lo.

bangs cabeça no visor LCD.

Outras dicas

Parece que seu editou o XML-Source do seu relatório. Aqui está uma forma mais gráfica de fazer a substituição de uma cadeia arbitrária em sua SQL-consulta:

Escreva sua consulta como o seguinte:

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

Se dev é um esquema válido agora você é capaz de selecionar a meta-dados-set e ainda é capaz de substituí-lo com um parâmetro de relatório.

Em seguida, clique no seu dados em conjunto e selecione o "script" Tab. Aqui você seleciona "beforeOpen" e digite o ccript substituição:

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

Desta forma, você substituir o dev de Cordas em seu texto de consulta com o valor da sua SCHEMA parâmetro antes de sua executar a consulta. Você poderia substituir cada corda que você quer (**?** linke da sua pergunta, mas com um esquema válido, em primeiro lugar você pode usar o meta-dados-set para a fase de design. enter descrição da imagem aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top