2010-07-14 55 views
11

J'ai un rapport BIRT qui se connecte à notre base de données de test. Dans l'environnement productif, je voudrais fournir une source de données fournie par le conteneur via jndi.Comment définir une source de données pour un rapport BIRT par programme?

Comment définir la source de données par programme pour le rapport donné?

... 
    IReportRunnable design = birtEngine.openReportDesign (new File (properties.getProperty ("reportPath"), report + ".rptdesign").getAbsolutePath()); 
    IRunAndRenderTask task = birtEngine.createRunAndRenderTask (design); 

    PDFRenderOption options = new PDFRenderOption(); 
    options.setOutputFormat (PDFRenderOption.OUTPUT_FORMAT_PDF); 
    options.setOutputStream (out); 
    task.setRenderOption (options); 
    for (Entry<String, Object> entry : parameters.entrySet()) 
    { 
     task.setParameterValue (entry.getKey(), entry.getValue()); 
    } 

    task.run(); 
    task.close(); 
    ... 

Je suppose que je devrais modifier le design, mais d'autre part task a une méthode setDataSource mais qui ressemble un peu comme je dois fournir quelques éléments dom xml.

Répondre

2

La définition de la source de données au moment de l'exécution pose problème car l'ensemble de données est lié à une source de données unique et vos contrôles du rapport sont alors liés à un ensemble de données spécifique. Cette hiérarchie serait plutôt collante pour essayer de vous construire chaque fois que le rapport s'exécute.

Vous pouvez paramétrer tous les aspects de la définition de la source de données rendant votre conception portable dans tous les environnements. Lorsque vous modifiez votre source de données, regardez le groupement de liaison de propriété sur le côté gauche. Cela devrait vous donner suffisamment de flexibilité pour rendre votre source de données plus portable. Vous pouvez spécifier des paramètres d'exécution pour les éléments d'URL JDBC ou un profil JNDI d'exécution.

Espérons que cela aide.

3

Vous pouvez créer un paramètre de rapport pour la chaîne de connexion à la base de données.

Ensuite, définissez l'URL JNDI sous Source de données -> Propriété Binding -> URL JNDI, comme:. Params [ "base de données"] Valeur
(Où "Base de données" est le nom du paramètre du rapport)

5

Regardez le code suivant, vous pouvez obtenir de l'aide pour fournir la source de données lors de l'exécution.

Pour mes besoins, cela fonctionne très bien.

Je l'ai eu de certains site ne me souviens pas.

import java.io.IOException; 
import java.util.ArrayList; 

import org.eclipse.birt.core.framework.Platform; 
import org.eclipse.birt.report.model.api.CellHandle; 
import org.eclipse.birt.report.model.api.DataItemHandle; 
import org.eclipse.birt.report.model.api.DesignConfig; 
import org.eclipse.birt.report.model.api.ElementFactory; 
import org.eclipse.birt.report.model.api.IDesignEngine; 
import org.eclipse.birt.report.model.api.IDesignEngineFactory; 
import org.eclipse.birt.report.model.api.LabelHandle; 
import org.eclipse.birt.report.model.api.OdaDataSetHandle; 
import org.eclipse.birt.report.model.api.OdaDataSourceHandle; 
import org.eclipse.birt.report.model.api.PropertyHandle; 
import org.eclipse.birt.report.model.api.ReportDesignHandle; 
import org.eclipse.birt.report.model.api.RowHandle; 
import org.eclipse.birt.report.model.api.SessionHandle; 
import org.eclipse.birt.report.model.api.StructureFactory; 
import org.eclipse.birt.report.model.api.TableHandle; 
import org.eclipse.birt.report.model.api.activity.SemanticException; 
import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn; 

import com.ibm.icu.util.ULocale; 

/** 
* Dynamic Table BIRT Design Engine API (DEAPI) demo. 
*/ 

public class DECreateDynamicTable 
{ 
    ReportDesignHandle designHandle = null; 
    ElementFactory designFactory = null; 
    StructureFactory structFactory = null; 

    public static void main(String[] args) 
    { 
     try 
     { 
      DECreateDynamicTable de = new DECreateDynamicTable(); 
      ArrayList al = new ArrayList(); 
      al.add("USERNAME"); 
      al.add("COUNTRY"); 
      de.buildReport(al, "From GTM_REPORT_APP_USER"); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     catch (SemanticException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    void buildDataSource() throws SemanticException 
    { 

     OdaDataSourceHandle dsHandle = designFactory.newOdaDataSource(
       "Data Source", "org.eclipse.birt.report.data.oda.jdbc"); 
     dsHandle.setProperty("odaDriverClass", 
       "oracle.jdbc.driver.OracleDriver"); 
     dsHandle.setProperty("odaURL", "jdbc:oracle:thin:@xeon:1521:ora9i"); 
     dsHandle.setProperty("odaUser", "AIMS_GTMNE"); 
     dsHandle.setProperty("odaPassword", "AIMS_GTMNE"); 

     designHandle.getDataSources().add(dsHandle); 

    } 

    void buildDataSet(ArrayList cols, String fromClause) throws SemanticException 
    { 

     OdaDataSetHandle dsHandle = designFactory.newOdaDataSet("ds", 
       "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet"); 
     dsHandle.setDataSource("Data Source"); 
     String qry = "Select "; 
     for(int i=0; i < cols.size(); i++){ 
      qry += " " + cols.get(i); 
      if(i != (cols.size() -1)){ 
       qry += ","; 
      } 

     } 
     qry += " " + fromClause; 

     dsHandle.setQueryText(qry); 

     designHandle.getDataSets().add(dsHandle); 



    } 
    void buildReport(ArrayList cols, String fromClause) throws IOException, SemanticException 
    { 


     //Configure the Engine and start the Platform 
     DesignConfig config = new DesignConfig(); 

     config.setProperty("BIRT_HOME", "D:/Softwares/Frame Works - APIs-Tools/birt-runtime-2_6_1/birt-runtime-2_6_1/ReportEngine"); 

     IDesignEngine engine = null; 
     try{ 


      Platform.startup(config); 
      IDesignEngineFactory factory = (IDesignEngineFactory) Platform.createFactoryObject(IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY); 
      engine = factory.createDesignEngine(config); 

     }catch(Exception ex){ 
      ex.printStackTrace(); 
     }  


     SessionHandle session = engine.newSessionHandle(ULocale.ENGLISH) ; 



     try{ 
      //open a design or a template 

      designHandle = session.openDesign("D:/tempBirtReport/test.rptdesign"); 

      designFactory = designHandle.getElementFactory(); 

      buildDataSource(); 
      buildDataSet(cols, fromClause); 

      TableHandle table = designFactory.newTableItem("table", cols.size()); 
      table.setWidth("100%"); 
      table.setDataSet(designHandle.findDataSet("ds")); 


      PropertyHandle computedSet = table.getColumnBindings(); 
      ComputedColumn cs1 = null; 

      for(int i=0; i < cols.size(); i++){ 
       cs1 = StructureFactory.createComputedColumn(); 
       cs1.setName((String)cols.get(i)); 
       cs1.setExpression("dataSetRow[\"" + (String)cols.get(i) + "\"]"); 
       computedSet.addItem(cs1); 
      } 


      // table header 
      RowHandle tableheader = (RowHandle) table.getHeader().get(0); 


      for(int i=0; i < cols.size(); i++){ 
       LabelHandle label1 = designFactory.newLabel((String)cols.get(i)); 
       label1.setText((String)cols.get(i)); 
       CellHandle cell = (CellHandle) tableheader.getCells().get(i); 
       cell.getContent().add(label1); 
      }       

      // table detail 
      RowHandle tabledetail = (RowHandle) table.getDetail().get(0); 
      for(int i=0; i < cols.size(); i++){ 
       CellHandle cell = (CellHandle) tabledetail.getCells().get(i); 
       DataItemHandle data = designFactory.newDataItem("data_"+(String)cols.get(i)); 
       data.setResultSetColumn((String)cols.get(i)); 
       cell.getContent().add(data); 
      } 

      designHandle.getBody().add(table); 

      // Save the design and close it. 

      designHandle.saveAs("D:/tempBirtReport/test.rptdesign"); //$NON-NLS-1$ 
      designHandle.close(); 
      System.out.println("Finished"); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     }  

    } 
} 
1

J'aime l'approche d'Adams. Voilà comment nous le faisons:

/* 
* Change the data sources in the .rptdesign 
*/ 
void changeDataSource(ElementFactory designFactory, 
     ReportDesignHandle designHandle, String userConnect) 
     throws SemanticException { 

    SlotHandle datasources = designHandle.getDataSources(); 
    SlotIterator iter = (SlotIterator) datasources.iterator(); 
    while (iter.hasNext()) { 
     DesignElementHandle dsHandle = (DesignElementHandle) iter.next(); 
     if (dsHandle instanceof OdaDataSourceHandle && dsHandle.getName().equals("lisa")) { 
      log.debug("changeDataSource: Changing datasource " 
        + dsHandle.getName() + " new url=" + getLisaDbUrl()); 
      dsHandle.setProperty("odaDriverClass", 
        "oracle.jdbc.driver.OracleDriver"); 
      dsHandle.setProperty("odaURL", getLisaDbUrl()); 
      dsHandle.setProperty("odaUser", getLisaUser()); 
      dsHandle.setProperty("odaPassword", getLisaPassword()); 
     } else { 
      log.debug("changeDataSource: Ignoring DS " + dsHandle.getName()); 
     } 
    } 
} 

Ici, « lisa » ist il nom de la source de données que nous voudrions changer à l'exécution. La fonction get ... renvoie les valeurs nécessaires à l'exécution "production".

0

Cela a fonctionné pour moi. J'ai eu le contexte et du contexte a obtenu le dataSource et passé la connexion au rapport de Birt comme ci-dessous

Context initialContext = new InitialContext(); 
    if (initialContext == null){ 
    System.out.println("JNDI problem. Cannot get InitialContext."); 
     } 
     DataSource datasource = (DataSource)initialContext.lookup("java:/datasources/SAMPLE"); 
    task.getAppContext().put("OdaJDBCDriverPassInConnection", datasource.getConnection());