升级Crystal Report 8.5 to Crystal Report 2011

升级过程中有两点需要注意:

  1. 在AIX安装字体,繁体就用新细明体mingliu.ttf和mingliub.ttf(粗体),英文就用Times New Roman:times.ttf,timesbd.ttf,timesbi.ttf,timesi.ttf。

  2. 设置Locale,因不知为何在AIX上生成的PDF文件编码总是日文语系的,当设置完Locale后问题才得以解决,reportClientDoc.setLocale(Locale.TRADITIONAL_CHINESE);

  3. 运行时动态改变datasource的jndi,在oralce上尝试几个方法都失败,但感觉这些code都应该有参考价值的,也会列出来。

    package dh.report;

    import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern;

    import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

    import com.crystaldecisions.report.web.viewer.CrPrintMode; import com.crystaldecisions.report.web.viewer.CrystalReportViewer; import com.crystaldecisions.report.web.viewer.ReportExportControl; import com.crystaldecisions.sdk.occa.report.application.ISubreportClientDocument; import com.crystaldecisions.sdk.occa.report.application.ReportClientDocument; import com.crystaldecisions.sdk.occa.report.data.Fields; import com.crystaldecisions.sdk.occa.report.data.ParameterField; import com.crystaldecisions.sdk.occa.report.data.ParameterFieldDiscreteValue; import com.crystaldecisions.sdk.occa.report.exportoptions.ExportOptions; import com.crystaldecisions.sdk.occa.report.exportoptions.ReportExportFormat; import com.crystaldecisions.sdk.occa.report.lib.IStrings; import com.crystaldecisions.sdk.occa.report.lib.ReportSDKException; import com.crystaldecisions.sdk.occa.report.lib.ReportSDKExceptionBase; import com.crystaldecisions.sdk.occa.report.reportsource.IReportSource;

    public class ReportServlet extends HttpServlet { public static String JNDI_NAME = "java:comp/env/jdbc/psuat";

     //public static String JNDI_NAME = "jdbc/dhprd";
    
     @Override
     public void init(ServletConfig config) throws ServletException {
     	String fontsPath = config.getServletContext().getRealPath("/") + "/WEB-INF/lib/fonts/";
     	System.out.println("real path " + fontsPath);
     	try {
     		/*GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
     		ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontsPath + "mingliu.ttf")));
     		ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontsPath + "mingliub.ttf")));
     		ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontsPath + "times.ttf")));
     		ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontsPath + "timesbd.ttf")));
     		ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontsPath + "timesbi.ttf")));
     		ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontsPath + "timesi.ttf")));
    
     		String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    
     		for (int i = 0; i < fonts.length; i++) {
     			System.out.println("System font " + fonts[i]);
     		}*/
    
     	} catch (Exception e) {
     		e.printStackTrace();
     	}
     }
    
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     	doGet(req, resp);
     }
    
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
     	String report = req.getParameter("report");
     	if (report != null) {
     		report = report.replace("file:", "");
    
     		if ("127.0.0.1".equals(req.getLocalAddr()) || "10.13.135.40".equals(req.getLocalAddr())) {
     			report = report.replace("/piers/apps/uat/installedApps/DHApps.ear/dh.war/rpt", "");
     		} else {
     			if (report.indexOf("uat") != -1) {
     				report = report.replace("/piers/apps/uat", "/dh/apps/prod");
     			}
     		}
     	}
    
     	//		List<String> promptValues = retrieveParameterValues(req);
    
     	System.out.println("report = " + report);
    
     	ReportClientDocument reportClientDoc = new ReportClientDocument();
    
     	Map parameterMap = new HashMap();
    
     	try {
     		reportClientDoc.setLocale(Locale.TRADITIONAL_CHINESE);
    
     		reportClientDoc.open(report, 0);
    
     		ReportUtil.switch_tables(reportClientDoc.getDatabaseController());
    
     		//Perform the same operation against all tables in the subreport as well.
     		IStrings subreportNames = reportClientDoc.getSubreportController().getSubreportNames();
    
     		//Set the datasource for all the subreports.
     		for (int i = 0; i < subreportNames.size(); i++) {
     			ISubreportClientDocument subreportClientDoc = reportClientDoc.getSubreportController().getSubreport(
     					subreportNames.getString(i));
    
     			//Switch tables for each subreport in the report using the same connection information.  See utility
     			//method below.
     			ReportUtil.switch_tables(subreportClientDoc.getDatabaseController());
    
     		}
    
     		Fields paraFields = reportClientDoc.getDataDefinition().getParameterFields();
    
     		for (int i = 0; i < paraFields.size(); i++) {
     			String value = "";
    
     			// get pre-set value
     			ParameterField field = (ParameterField) paraFields.get(i);
     			if (field.getValues() != null && field.getValues().size() > 0) {
     				ParameterFieldDiscreteValue v = (ParameterFieldDiscreteValue) field.getValues().get(0);
     				value = v.getValue().toString();
     			}
    
     			String paramValue = req.getParameter("prompt" + i);
     			System.out.println("paramValue = " + paramValue);
     			if (paramValue != null) {
     				value = paramValue;
     				if (value.indexOf("Date") != -1) {
     					parameterMap.put(field.getName(), getDate(value));
     				} else {
     					parameterMap.put(field.getName(), value);
     				}
     			} else {
     				parameterMap.put(field.getName(), value);
     			}
     		}
    
     		Fields fields = ReportUtil.prepareParameter(report, parameterMap);
    
     		IReportSource reportSource = reportClientDoc.getReportSource();
    
     		showByPdf(reportSource, fields, req, resp);
     	} catch (ReportSDKException e) {
     		e.printStackTrace();
     	} catch (ReportSDKExceptionBase e) {
     		e.printStackTrace();
     	}
    
     }
    
     private void showByPdf(IReportSource reportSource, Fields fields, HttpServletRequest req, HttpServletResponse resp)
     		throws ReportSDKExceptionBase {
     	ExportOptions exportOptions = new ExportOptions();
     	exportOptions.setExportFormatType(ReportExportFormat.PDF);
    
     	ReportExportControl exportControl = new ReportExportControl();
     	exportControl.setReportSource(reportSource);
     	exportControl.setExportOptions(exportOptions);
     	exportControl.setExportAsAttachment(false);
     	exportControl.setParameterFields(fields);
     	exportControl.setOwnPage(true);
    
     	exportControl.processHttpRequest(req, resp, req.getSession().getServletContext(), null);
    
     	exportControl.dispose();
     }
    
     private void showByHtml(IReportSource reportSource, Fields fields, HttpServletRequest req, HttpServletResponse resp)
     		throws ReportSDKExceptionBase, IOException {
     	//JPEReportSourceFactory rptSrcFactory = new JPEReportSourceFactory();
     	//Object reportSource =rptSrcFactory.createReportSource(report,Locale.TRADITIONAL_CHINESE);
     	CrystalReportViewer viewer = new CrystalReportViewer();
    
     	viewer.setReportSource(reportSource);
     	viewer.setPrintMode(CrPrintMode.ACTIVEX);
     	viewer.setParameterFields(fields);
     	viewer.setOwnPage(true);
     	String html = viewer.getHtmlContent(req, resp, getServletContext());
     	System.out.println("html = " + html);
    
     	resp.setHeader("Cache-Control", "no-cache, post-check=0, pre-check=0");
     	resp.setContentType("text/html");
     	resp.setCharacterEncoding("UTF-8");
    
     	viewer.processHttpRequest(req, resp, req.getSession().getServletContext(), resp.getWriter());
     	viewer.dispose();
     }
    
     private List<String> retrieveParameterValues(HttpServletRequest req) {
     	List<String> parameterValues = new ArrayList<String>();
     	Enumeration<String> e = req.getParameterNames();
     	List<String> paraNames = new ArrayList<String>();
    
     	while (e.hasMoreElements()) {
     		String paramName = e.nextElement();
     		paraNames.add(paramName);
     	}
    
     	Collections.sort(paraNames);
     	for (String paramName : paraNames) {
     		String paramValue = req.getParameter(paramName);
    
     		System.out.println("paramName = " + paramName + ", paramValue = " + paramValue);
     		if (paramName.startsWith("prompt")) {
     			System.out.println("prompt = " + paramValue);
     			parameterValues.add(paramValue);
     		}
     	}
    
     	return parameterValues;
     }
    
     private Date getDate(String date) {
     	Calendar c = Calendar.getInstance();
     	Pattern p = Pattern.compile("Date\\((\\d+),(\\d+),(\\d+)\\)");
     	Matcher m = p.matcher(date);
     	if (m.matches()) {
     		System.out.println("year " + m.group(1) + ",month " + m.group(2) + ", date " + m.group(3));
     		c.set(Calendar.YEAR, Integer.parseInt(m.group(1)));
     		c.set(Calendar.MONTH, Integer.parseInt(m.group(2)));
     		c.set(Calendar.DAY_OF_MONTH, Integer.parseInt(m.group(3)));
     	}
     	return c.getTime();
     }
    

    }


package dh.report;

import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpSession;

import com.crystaldecisions.report.web.viewer.ReportExportControl;
import com.crystaldecisions.sdk.occa.report.application.DBOptions;
import com.crystaldecisions.sdk.occa.report.application.DatabaseController;
import com.crystaldecisions.sdk.occa.report.application.ReportClientDocument;
import com.crystaldecisions.sdk.occa.report.data.ConnectionInfo;
import com.crystaldecisions.sdk.occa.report.data.ConnectionInfoKind;
import com.crystaldecisions.sdk.occa.report.data.ConnectionInfos;
import com.crystaldecisions.sdk.occa.report.data.Fields;
import com.crystaldecisions.sdk.occa.report.data.IConnectionInfo;
import com.crystaldecisions.sdk.occa.report.data.ITable;
import com.crystaldecisions.sdk.occa.report.data.ParameterField;
import com.crystaldecisions.sdk.occa.report.data.ParameterFieldDiscreteValue;
import com.crystaldecisions.sdk.occa.report.data.Tables;
import com.crystaldecisions.sdk.occa.report.data.Values;
import com.crystaldecisions.sdk.occa.report.lib.PropertyBag;
import com.crystaldecisions.sdk.occa.report.lib.PropertyBagHelper;
import com.crystaldecisions.sdk.occa.report.lib.ReportSDKException;

public class ReportUtil {

	public static Object getReportSource(HttpSession session, String reportName) throws ReportSDKException {
		System.out.println("getReportSource() ---------- start ----------------- \n reportName=" + reportName
				+ "\n session=" + session);
		//		if(session==null || reportName==null){
		//			return null ;
		//		}

		Object reportSource = session.getAttribute("reportSource");

		if (reportSource == null) {
			System.out.println("getReportSource() ......... reportSource == null ,  create reportSource");
			ReportClientDocument reportClientDoc = new ReportClientDocument();
			reportClientDoc.open(reportName, 0);
			reportSource = reportClientDoc.getReportSource();
			session.setAttribute("reportSource", reportSource);
		}
		System.out.println("getReportSource() ---------- finish ----------------- \n reportSource=" + reportSource);
		return reportSource;

	}

	public static ParameterField createParameter(String parameterName, Object parameterValue) {
		System.out.println("createParameter() ---------- start ----------------- \t parameterName=" + parameterName
				+ "\t parameterValue=" + parameterValue);
		ParameterField pfield = new ParameterField();
		pfield.setName(parameterName);
		pfield.setReportName("");

		Values vals = new Values();
		ParameterFieldDiscreteValue pfieldDV = new ParameterFieldDiscreteValue();
		pfieldDV.setValue(parameterValue);
		vals.add(pfieldDV);

		pfield.setCurrentValues(vals);

		return pfield;
	}

	public static Fields prepareParameter(String reportTemplateFileName, Map parameterMap) {
		//		logger.info("prepareParameter() ---------- start ----------------- \t parameterName=" + parameterName + "\t parameterValue=" + parameterValue) ;
		System.out.println("prepareParameter() ---------- start ----------------- \t reportTemplateFileName="
				+ reportTemplateFileName + "\t parameterMap=" + parameterMap);

		Fields fields = null;

		if (parameterMap != null) {
			fields = new Fields();
			for (Iterator itr = parameterMap.keySet().iterator(); itr.hasNext();) {
				String key = (String) itr.next();
				if (key != null) {
					Object value = parameterMap.get(key);
					fields.add(ReportUtil.createParameter(key, value));
					System.out.println("put parameter " + key + " : " + value);
				}
			}
		}

		System.out.println("prepareParameter() ---------- Finish ----------------- \t fields=" + fields);

		return fields;
	}

	/*
	 // ref: Crystal report official tutorial
	public static void changeDataSource(ReportClientDocument rcd) throws ReportSDKException
	{ 

		System.out.println("changeDataSource() ---------- start ----------------- \t rcd=" + rcd);
	  DatabaseController databaseController = rcd.getDatabaseController();
	  ConnectionInfos connectionInfos = (ConnectionInfos)databaseController.getConnectionInfos(null);
	  IConnectionInfo oldConnectionInfo = connectionInfos.getConnectionInfo(0);
	  IConnectionInfo newConnectionInfo = new ConnectionInfo();
	  
	  newConnectionInfo.setKind(ConnectionInfoKind.SQL);

	  PropertyBag newProperties = new PropertyBag();
	  newProperties.putStringValue("DSN", "Xtreme Sample Database 2005");
	  newProperties.put("UseDSNProperties", false);
	  newProperties.putStringValue(PropertyBagHelper.CONNINFO_SERVER_NAME, "Xtreme Sample Database 2005");
	  newProperties.putStringValue(PropertyBagHelper.CONNINFO_SERVER_TYPE, "ODBC (RDO)");
	  newProperties.putStringValue(PropertyBagHelper.CONNINFO_DATABASE_DLL, "crdb_odbc.dll");
	  
	  newConnectionInfo.setAttributes(newProperties);
	  newConnectionInfo.setUserName("guest");
	  newConnectionInfo.setPassword("bobobo");
	  
	  try 
	  {
	    databaseController.replaceConnection(oldConnectionInfo, newConnectionInfo, null, DBOptions._useDefault);
	  }
	  catch (ReportSDKException error) 
	  {
	    System.out.println(error.getSDKError());
	  }
	  
	  System.out.println("changeDataSource() ---------- finish ----------------- ");
	}
	*/

	// Change the document's all table's source to a JNDI, 实际上是不行的
	// ref: http://scn.sap.com/thread/1688419
	public static void changeDB(ReportClientDocument rcd, String reportJndiName) {
		System.out.println("changeDB() ---------- start ----------------- \t rcd=" + rcd + "\t change to JNDI:"
				+ reportJndiName);
		DatabaseController databaseController;
		try {
			databaseController = rcd.getDatabaseController();

			IConnectionInfo connectionInfo = new ConnectionInfo();
			PropertyBag propertyBag = new PropertyBag();
			propertyBag.put("JNDI Datasource Name", reportJndiName);
			propertyBag.put("Use JDBC", "true");
			// by Ricky
			//		propertyBag.put("Database DLL", DATABASE_DLL); // required!!! (but we don't actually provide a DLL, or even run in windows)
			propertyBag.put(PropertyBagHelper.CONNINFO_DATABASE_DLL, "crdb_oracle.dll");

			connectionInfo.setAttributes(propertyBag);
			connectionInfo.setKind(ConnectionInfoKind.SQL);

			ConnectionInfos connectionInfos = databaseController.getConnectionInfos(null);
			IConnectionInfo oldConnectionInfo = connectionInfos.getConnectionInfo(0);

			databaseController.replaceConnection(oldConnectionInfo, connectionInfo, null, DBOptions._useDefault);
		} catch (ReportSDKException e) {
			e.printStackTrace();
		}

		System.out.println("changeDB() ---------- finish ----------------- ");
	}

  // 全局性转换登录信息
	public static void changeDB2(ReportClientDocument rcd, String reportJndiName) {
		String DBUSERNAME = "dhdba";
		String DBPASSWORD = "password";
		String CONNECTION_STRING = "jdbc:oracle:thin:@server:1521:sid";
		String SERVERTYPE = "JDBC (JNDI)";
		String DATABASE_DLL = "crdb_oracle.dll";
		String DATABASE = "server";
		final String TRUSTEDCON = "false";
		String DBCLASSNAME = "oracle.jdbc.driver.OracleDriver";
		String USEJDBC = "true";
		String SERVERNAME = "jdbc:oracle:thin:@server:1521:sid";
		String CONNECTIONURL = "jdbc:oracle:thin:@server:1521:sid";
		String SERVER = "server";
		final String DATABASE_NAME = "sid";

		try {
			System.out.println("change to " + reportJndiName);
			// Set DB Username and Password
			//rcd.getDatabaseController().logon(DBUSERNAME, DBPASSWORD);

			// Create the two connectioninfo objects to use
			IConnectionInfo oldConnectionInfo = new ConnectionInfo();
			IConnectionInfo newConnectionInfo = new ConnectionInfo();

			// Assign the old Connection info to the reports current info
			DatabaseController dbController = rcd.getDatabaseController();
			oldConnectionInfo = dbController.getConnectionInfos(null).getConnectionInfo(0);

			// Create a new propertybag for the new location
			PropertyBag boPropertyBag1 = new PropertyBag();

			// Set new table logon properties
			boPropertyBag1.put("JDBC Connection String", CONNECTION_STRING);
			boPropertyBag1.put("Trusted_Connection", TRUSTEDCON);
			boPropertyBag1.put("Server Type", SERVERTYPE);
			boPropertyBag1.put("Database DLL", DATABASE_DLL);
			boPropertyBag1.put("Database", DATABASE);
			boPropertyBag1.put("Database Class Name", DBCLASSNAME);
			boPropertyBag1.put("Use JDBC", USEJDBC);
			boPropertyBag1.put("Database Name", DATABASE_NAME);
			boPropertyBag1.put("Server Name", SERVERNAME);
			boPropertyBag1.put("Connection URL", CONNECTIONURL);
			boPropertyBag1.put("Server", SERVER);

			// Assign the properties to the connection info
			newConnectionInfo.setAttributes(boPropertyBag1);

			// Set the DB Username and Pwd
			newConnectionInfo.setUserName(DBUSERNAME);
			newConnectionInfo.setPassword(DBPASSWORD);

			// The Kind of connectionInfos is SQL
			newConnectionInfo.setKind(ConnectionInfoKind.SQL);

			// set the parameters to replace.
			// The 4 options are:
			// _doNotVerifyDB 
			// _ignoreCurrentTableQualifiers 
			// _mapFieldByRowsetPosition 
			// _useDefault  
			int replaceParams = DBOptions._ignoreCurrentTableQualifiers + DBOptions._doNotVerifyDB;
			//int replaceParams = DBOptions._useDefault;

			// Now replace the connections 	
			dbController.replaceConnection(oldConnectionInfo, newConnectionInfo, null, replaceParams);

			//Store the report source in session, will be used by the CrystalReportViewer.

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

  // 对Report里每一Table进行转换
	public static void changeDB3(ReportClientDocument rcd, String reportJndiName) {
		final String TABLE_NAME_QUALIFIER = "dhdba.";
		final String DBUSERNAME = "dhdba";
		final String DBPASSWORD = "password";
		String CONNECTION_STRING = "jdbc:oracle:thin:@server:1521:sid";
		final String DATABASE_NAME = "dhdba";
		final String URI = "!oracle.jdbc.driver.OracleDriver!jdbc:oracle:thin:@server:1521:sid";
		String SERVERNAME = "jdbc:oracle:thin:@server:1521:sid";
		final String DATABASE_DLL = "crdb_jdbc.dll";
		String DBCLASSNAME = "oracle.jdbc.driver.OracleDriver";

		try {
			DatabaseController dbController = rcd.getDatabaseController();
			Tables tables = dbController.getDatabase().getTables();
			for (int i = 0; i < tables.size(); i++) {

				ITable table = tables.getTable(i);

				//Keep existing name and alias.
				table.setName(table.getName());
				table.setAlias(table.getAlias());
				System.out.println("getName " + table.getName());
				System.out.println("getAlias" + table.getAlias());
				//Change properties that are different from the original datasource.
				table.setQualifiedName(TABLE_NAME_QUALIFIER + table.getName());

				//Change connection information properties.
				IConnectionInfo connectionInfo = table.getConnectionInfo();
				connectionInfo.getAttributes().clear();
				//Set new table connection property attributes.
				PropertyBag propertyBag = new PropertyBag();

				//Overwrite any existing properties with updated values.
				propertyBag.put("Trusted_Connection", "false");
				propertyBag.put("Server Name", SERVERNAME); //Optional property.
				propertyBag.put("Connection String", CONNECTION_STRING);
				propertyBag.put("Database Name", DATABASE_NAME);
				//propertyBag.put("Server Type", "JDBC (JNDI)");
				propertyBag.put("URI", URI);
				propertyBag.put("Use JDBC", "false");
				propertyBag.put("JDBC Connection String", CONNECTION_STRING);
				propertyBag.put("Database Class Name", DBCLASSNAME);
				propertyBag.put("Database DLL", DATABASE_DLL);
				propertyBag.put("Connection Name", CONNECTION_STRING);
				propertyBag.put("PreQEServerName", "server");
				propertyBag.put("PASSWORD", "password");

				connectionInfo.setAttributes(propertyBag);

				//Set database username and password.
				//NOTE: Even if these the username and password properties don't change when switching databases, the 
				//database password is *not* saved in the report and must be set at runtime if the database is secured.  
				connectionInfo.setUserName(DBUSERNAME);
				connectionInfo.setPassword(DBPASSWORD);
				connectionInfo.setKind(ConnectionInfoKind.SQL);

				table.setConnectionInfo(connectionInfo);
				rcd.getDatabaseController().logon(DBUSERNAME, DBPASSWORD);
				//Update old table in the report with the new table.
				dbController.setTableLocation(table, tables.getTable(i));

			}

		} catch (ReportSDKException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static void changeDB4(ReportClientDocument rcd, String reportJndiName, ReportExportControl exportControl)
			throws ReportSDKException {
		IConnectionInfo oldConnectionInfo = new ConnectionInfo();
		IConnectionInfo newConnectionInfo = new ConnectionInfo();

		String DBUSERNAME = "dhdba";
		String DBPASSWORD = "password";
		String CONNECTION_STRING = "jdbc:oracle:thin:@server:1521:sid";
		String SERVERTYPE = "JDBC (JNDI)";
		String DATABASE_DLL = "crdb_oracle.dll";
		String DATABASE = "server";
		final String TRUSTEDCON = "false";
		String DBCLASSNAME = "oracle.jdbc.driver.OracleDriver";
		String USEJDBC = "true";
		String SERVERNAME = "jdbc:oracle:thin:@server:1521:sid";
		String CONNECTIONURL = "jdbc:oracle:thin:@server:1521:sid";
		String SERVER = "server";
		final String DATABASE_NAME = "sid";

		// Assign the old Connection info to the reports current info
		DatabaseController dbController = rcd.getDatabaseController();
		oldConnectionInfo = dbController.getConnectionInfos(null).getConnectionInfo(0);

		// Create a new propertybag for the new location
		PropertyBag boPropertyBag1 = new PropertyBag();

		// Set new table logon properties
		boPropertyBag1.put("JDBC Connection String", CONNECTION_STRING);
		boPropertyBag1.put("Trusted_Connection", TRUSTEDCON);
		boPropertyBag1.put("Server Type", SERVERTYPE);
		boPropertyBag1.put("Database DLL", DATABASE_DLL);
		boPropertyBag1.put("Database", DATABASE);
		boPropertyBag1.put("Database Class Name", DBCLASSNAME);
		boPropertyBag1.put("Use JDBC", USEJDBC);
		boPropertyBag1.put("Database Name", DATABASE_NAME);
		boPropertyBag1.put("Server Name", SERVERNAME);
		boPropertyBag1.put("Connection URL", CONNECTIONURL);
		boPropertyBag1.put("Server", SERVER);

		// Assign the properties to the connection info
		newConnectionInfo.setAttributes(boPropertyBag1);

		// Set the DB Username and Pwd
		newConnectionInfo.setUserName(DBUSERNAME);
		newConnectionInfo.setPassword(DBPASSWORD);

		// The Kind of connectionInfos is SQL
		newConnectionInfo.setKind(ConnectionInfoKind.SQL);

		// set the parameters to replace.
		// The 4 options are:
		// _doNotVerifyDB 
		// _ignoreCurrentTableQualifiers 
		// _mapFieldByRowsetPosition 
		// _useDefault  
		int replaceParams = DBOptions._ignoreCurrentTableQualifiers + DBOptions._doNotVerifyDB;

		ConnectionInfos infos = new ConnectionInfos();
		infos.add(newConnectionInfo);
		Iterator it = infos.iterator();
		while (it.hasNext()) {
			ConnectionInfo info = (ConnectionInfo) it.next();
			PropertyBag bag = info.getAttributes();
			System.out.println("EEEEE " + bag.getStringValue("JDBC Connection String"));
			System.out.println("EEEEE " + info.getPassword());
		}

		exportControl.setDatabaseLogonInfos(infos);  // 尝试用exportControl设置登录信息
	}

  // 唯有这个方法可行,其他都失败了
	public static void switch_tables(DatabaseController databaseController) throws ReportSDKException {

		final String TABLE_NAME_QUALIFIER = "DHDBA.";
		final String SERVERNAME = "server";
		final String CONNECTION_STRING = "Use JDBC=b(true);Connection URL=s(jdbc:oracle:thin:@server:1521:sid);"
				+ "Database Class Name=s(oracle.jdbc.driver.OracleDriver);Server=s(server);"
				+ "User ID=s(dhdba);Password=;Trusted_Connection=b(false);"
				+ "JDBC Connection String=s(!oracle.jdbc.driver.OracleDriver!jdbc:oracle:thin:{userid}/{password}@server:1521:sid)";
		final String JNDI_DATASOURCE_NAME = "testing";
		final String DATABASE_CLASS_NAME = "oracle.jdbc.driver.OracleDriver";
		final String DATABASE_DLL = "crdb_jdbc.dll";
		final String DBURI = "!oracle.jdbc.driver.OracleDriver!jdbc:oracle:thin:{userid}/{password}@server:1521:sid";
		final String DBUSERNAME = "dhdba";
		final String DBPASSWORD = "password";

		//Obtain collection of tables from this database controller.
		Tables tables = databaseController.getDatabase().getTables();

		//Set the datasource for all main report tables.
		for (int i = 0; i < tables.size(); i++) {

			ITable table = tables.getTable(i);

			//Keep existing name and alias.
			table.setName(table.getName());
			table.setAlias(table.getAlias());

			//Change properties that are different from the original datasource.
			table.setQualifiedName(TABLE_NAME_QUALIFIER + table.getName());

			//Change connection information properties.
			IConnectionInfo connectionInfo = table.getConnectionInfo();

			PropertyBag innerProp = connectionInfo.getAttributes();
			innerProp.clear();

			//Set new table connection property attributes.
			PropertyBag propertyBag = new PropertyBag();

			//Overwrite any existing properties with updated values.
			propertyBag.put("Trusted_Connection", "b(false)");
			propertyBag.put("Server Name", SERVERNAME);
			propertyBag.put("Connection String", CONNECTION_STRING);
			propertyBag.put("Server Type", "JDBC (JNDI)");
			propertyBag.put("JNDI Datasource Name", JNDI_DATASOURCE_NAME);
			propertyBag.put("Database Class Name", DATABASE_CLASS_NAME);
			propertyBag.put("Use JDBC", "true");
			propertyBag.put("URI", DBURI);
			propertyBag.put("Database DLL", DATABASE_DLL);

			connectionInfo.setAttributes(propertyBag);

			//Set database username and password.
			//NOTE: Even if these the username and password properties don't change when switching databases, the 
			//database password is *not* saved in the report and must be set at runtime if the database is secured.  
			connectionInfo.setUserName(DBUSERNAME);
			connectionInfo.setPassword(DBPASSWORD);
			connectionInfo.setKind(ConnectionInfoKind.SQL);

			table.setConnectionInfo(connectionInfo);

			//Update old table in the report with the new table.
			databaseController.setTableLocation(table, tables.getTable(i));

		}

	}

}

参考资料:

http://www.sdn.sap.com/irj/boc/index?rid=/webcontent/uuid/909355da-5b84-2b10-76a4-eed3ccf9e650

http://www.sdn.sap.com/irj/boc/index?rid=/webcontent/uuid/c020cd81-5c84-2b10-3585-bff096303cf6

转载于:https://my.oschina.net/l1z2g9/blog/157279

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值