< To: BIRT/FAQ
Q: What aggregate operations does BIRT support?
"Aggregate" is the fancy word to describe totals. BIRT supports a wide variety of totals: sum, running sum, average, minimum, maximum, count, count distinct, and many more. See the ROM Scripting Specification for details.
Q: Does BIRT support look-ahead (two-pass) aggregates?
Look-ahead aggregates are of the form "this value as a percentage of an overall total". For example, a customer's sales as a percentage of overall sales for a sales rep, sales region, and so on. These are often called two-pass aggregates becuase they require the reporting tool to make one pass over the data to compute totals, then another pass to compute the percentages for each record.
BIRT does provide support for such totals. Just enter the calculation and BIRT figures out the right way to compute it:
Total.percent( row.Sales, Total.sum( row.Sales ) )
Q: Is an example of simple calculations like count, sum, max, min?
Q: Can I add custom logic (scripting) to my report?
sum( row.orderTotal )
This summarizes the orderTotal column over all rows. This makes aggregates look like other expressions, even though the BIRT report engine needs to "rewrite" them.
Q: Good, but most report developers don't like to write code.
1. Simple expressions: row.Price * row.Quantity 2. Business expressions: choose a salutation (Mr., Mrs., Ms., etc.) depending on a database code, and concatenate the salutation, first name and last name. 3. Complex logic written in Java: Compute the recommendation rating for a stock based on factors in the database, and proprietary stock-rating algorithms.
Simple tasks require no code. This includes conditional formatting (make negative numbers red, for example), data transformations (filters, sorting, totals), conditional display (hide certain fields for certain types of customers), and so on.
Accessing Java Classes
Q: Can BIRT access existing Java code or objects?
importPackage( Packages.com.company.AppLogic );
Let's assume that MyClass is a class within the AppLogic package, and it provides business logic for working with, say, customer orders:
obj = new MyClass( ); result = obj.calculate( row.balance, row.dueDate );
With BIRT there are several ways to include your custom classes into BIRT's scripting classpath.
- If you are using the BIRT Designer, create a Java Project which includes the custom classes and then set the BIRT Report project classpath in Windows-Preferences-Report Design-Classpath. Note that this classpath can be configured per project (see BirtWorld post). You can also add specific classes to a report's classpath by importing a jar containing the classes into the resource folder and then add the jar to the report in the resources tab of report properties. If you use this approach the jar will need to be in the resource folder of the deployed environment as well.
- When using the BIRT Runtime to run reports outside the Designer, package your custom classes into a jar-file and put them into the ReportEngine/lib subfolder of the BIRT Runtime distribution.
- If using the Report Engine API set the APPCONTEXT_CLASSLOADER_KEY as shown below.
I think, it can use path set in projects by using:
config = new EngineConfig(); HashMap hm = config.getAppContext(); hm.put( EngineConstants.APPCONTEXT_CLASSLOADER_KEY, MyClass.class.getClassLoader()); config.setAppContext(hm);
If additional classpath entries are desired when using the Report Engine API, use code similar to:
System.setProperty( EngineConstants.WEBAPP_CLASSPATH_KEY, "c:/classpath/jar1.jar;c:/classpath/jar2.jar" );
NOTE: Note also that the new Preferences setting does not yet appear to work correctly with Classpath variables -- I had to specify the jar files as "external" and give absolute paths. See bug 332056.
Q: Where can I find logs?
When using BIRT Designer the logs can be found in the directory $ECLIPSE_HOME/plugins/org.eclipse.birt.report.viewer_version/birt/logs. The logging can be configured in the file $ECLIPSE_HOME/plugins/org.eclipse.birt.report.viewer_version/birt/WEB-INF/web.xml, namely the properties BIRT_VIEWER_LOG_DIR and BIRT_VIEWER_LOG_LEVEL. Available values are SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST and OFF.
You can use standard Java logging package. First initialize the Logger:
importPackage(Packages.java.util.logging); var fileHandler = new FileHandler("/tmp/birt.log", true); var rootLogger = Logger.getLogger(""); rootLogger.addHandler(fileHandler);
and then you can log the string with