SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

188 lines
5.7 KiB

package de.superx.servlet;
import java.math.BigDecimal;
import java.sql.Date;
import java.text.ParseException;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import de.memtext.util.DateUtils;
import de.superx.common.Field;
import de.superx.common.Maske;
import de.superx.common.SxResultRow;
import de.superx.common.SxUser;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
public class SxJasperDataSource implements JRDataSource {
private Maske maske;
private String mandantenID;
private int index = -1;
private List headerCaptions;
private Iterator it;
private SxResultRow row;
private SxUser user;
private Locale desiredLocale;
private static final String captionIds[] = { "REPORT_HEADING_INSTITUTION",
"REPORT_HEADING_URL", "REPORT_LOGO_FILE", "REPORT_HEADING_ADRESS",
"REPORT_EMAIL", "REPORT_DOCUMENTATION_URL"
};
SxJasperDataSource(String mandantenID,Locale desiredLocale,SxUser user, Maske maske) {
this.mandantenID=mandantenID;
this.desiredLocale=desiredLocale;
this.user = user;
this.maske = maske;
headerCaptions = maske.getHeaderCaptionList(mandantenID,true);
it = maske.getResult_el().getResultSet().iterator();
}
/**
* seltsam, man muss Jasper vorgaukeln, dass noch ein weiterer Datensatz
* kommt, damit er ihn auch verarbeitet, wenn dann der scheinbar nächste
* nachdem letzten aufgerufen wird, verhindert ein if vor it.next das er in
* einen Fehler rennt
*/
public boolean next() throws JRException {
index++;
// System.out.println("line " + index + " of " +
// maske.getResult_el().getResultSet().size());
if (it.hasNext())
row = (SxResultRow) it.next();
// System.out.println("Budgetstelle "+getVal("Budgetstelle"));
return it.hasNext()
|| index < maske.getResult_el().getResultSet().size();
}
/**
*
*/
public Object getFieldValue(JRField field) throws JRException {
Object value = null;
String fieldName = field.getName();
if (fieldName.equals("Berichtsname"))
value = maske.getName();
else if (fieldName.equalsIgnoreCase("Erlaeuterung"))
value = maske.getExplanation();
else if (fieldName.equalsIgnoreCase("Hinweis"))
value = maske.getHinweisCaption();
else if (fieldName.equalsIgnoreCase("standdatum"))
value = maske.getStandString();
else if (fieldName.equalsIgnoreCase("user"))
value = user.getName();
else if (fieldName.startsWith("legende_")
&& fieldName.endsWith("_value"))
value = getLegendFieldValue(fieldName);
else if (fieldName.startsWith("legende_")
&& fieldName.endsWith("_label"))
value = getLegendFieldLabel(fieldName);
else if (isSxCaptionsField(fieldName))
value=getSxCaption(fieldName);
else
value = getVal(fieldName);
if (value instanceof Short)
value = new Integer(((Short) value).intValue());
if (value instanceof BigDecimal)
value = new Double(((BigDecimal) value).doubleValue());
//Datumsobjekte als String Formatieren
//DQ 14.1.2012: Problem bei Konvertierung im Servlet Betrieb, daher entfernen
/* if (value instanceof java.util.Date)
value =DateUtils.format((Date) value);
if (value instanceof java.sql.Date)
value =DateUtils.format((java.sql.Date) value);*/
// System.out.println("returning "+value+" for "+fieldName +" row "+index);
return value;
}
private String getSxCaption(String fieldName) {
return SxPools.get(mandantenID).getTranslationShort(fieldName,desiredLocale);
}
private boolean isSxCaptionsField(String fieldName) {
boolean result=false;
for (int i=0;i<captionIds.length;i++)
{
if (fieldName.equals(captionIds[i]))
{
result=true;
break;
}
}
return result;
}
private int getColNo(String fieldName) {
int col = -1;
//System.out.println("Suche x"+fieldName+"x");
for (int i = 0; i < headerCaptions.size(); i++) {
if (headerCaptions.get(i).toString().equals(fieldName)) {
col = i;
break;
}
}
return col;
}
private Object getVal(String fieldName) {
Object result = null;
int colno = getColNo(fieldName);
if (colno > -1)
result = row.get(colno);
/*DQ 14.1.2012: Unnötige Fehlermeldung, einfach NULL zurückgeben:
* else
throw new IllegalArgumentException("JasperReport-Feld " + fieldName
+ " wurde nicht im Ergebnis der Maske gefunden");*/
if (result != null && result.equals(""))
result = null;
return result;
}
private String getLegendFieldValue(String fieldName) {
String result = "";
int pos = fieldName.indexOf("_value");
Field f = maske.getField(fieldName.substring(8, pos));
// result = f.getSelectedKey();
try {
result = f.getSelectedKeyValueCaption();
} catch (ParseException e) {
e.printStackTrace();
throw new IllegalArgumentException("Ungültiger wert für Feld "
+ f.getName() + "(" + f.getSelectedKey() + ")");
}
if (result == null)
System.out.println("Warnung: JasperReport-Legende-Wert "
+ fieldName.substring(7, pos)
+ " wurde nicht im Ergebnis der Maske gefunden");
return result;
}
private String getLegendFieldLabel(String fieldName) {
String result = "";
int pos = fieldName.indexOf("_label");
Field f = maske.getField(fieldName.substring(8, pos));
result = f.getName();
if (f.getCaptionShort() != null && !f.getCaptionShort().equals(""))
result = f.getCaptionShort();
if (result == null)
System.out.println("Warnung: JasperReport-Legende-Label "
+ fieldName.substring(7, pos)
+ " wurde nicht im Ergebnis der Maske gefunden");
return result;
}
}