发新话题
打印

关于分割表的研究问题,就是xml同时查多数据的问题

关于分割表的研究问题,就是xml同时查多数据的问题

我对你们之前发布的xml例子进行研究,发现有些XML表能够对多个数据库进行查询和显示,我在这个基础上尝试做了一张风格表,因为不知为何不能贴图了,直接传xml文件.
之后我又想,能否直接用后台的代码直接查,但我能成功删掉普通的XML表的的<Reader>,<Connection>,<Tagname> 标签移到后台查数据库,但发现只能实现只查但数据库的XML模板,如果涉及到风格表这样的多数据表,我该怎么将查数据的功能放入后台,毕竟是多数据源,以前没接触这么复杂的(主要想尝试将XML模板在后台接入更庞大的oracle数据库查更复杂的数据,看能否实现。)

版主你会怎么构思呢。。。。。期待

[ 本帖最后由 cnjiexie12 于 2010-7-29 16:46 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP

原本我以为,读XML时是通过Util.java对每一个标签进行读取然后通过
public static void setValue(Object obj, String prop, Object newValue, Class valueType) {
        Class c = obj.getClass();
        Method setter = null;

        try {
            setter = c.getMethod("set" + prop, new Class[] { valueType });
        } catch (SecurityException ex) {
            ex.printStackTrace();
        } catch (NoSuchMethodException ex) {
            ex.printStackTrace();
        }

   try {
               
            setter.invoke(obj, new Object[] { newValue });


        } catch (InvocationTargetException ex) {
            ex.printStackTrace();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        }
        的反射机制进行对各个标签的set+name的方法,

所以我想直接将读数据库标签的SET给手动加上,然后删掉XML表上,例如(期间还有其他方法的添加,编译无错误,但是执行时还是没把数据注入)
jatools.dom.src.DatasetNodeSource dns = new jatools.dom.src.DatasetNodeSource();
          jatools.data.reader.sql.SqlReader sr = new jatools.data.reader.sql.SqlReader();

          sr.setSql("SELECT * FROM 订单查询");
          sr.setConn(getConnection33());
          sr.setName("订单明细");
          dns.setReader((jatools.data.reader.DatasetReader)sr);
          dns.setTagName("RESULT_0");

TOP

难道我的想法太幼稚了,杰表太复杂了

TOP

运行时替换,应该这样
复制内容到剪贴板
代码:
ReportJob job =  new ReportJob(new FileInputStream("d:/a.xml"));
            
DatasetNodeSource dns = job.getDocument().getNodeSource().getNodeSourceByTagName("学生表");
SqlReader sr = new SqlReader();
sr.setSql("SELECT * FROM 订单查询");
sr.setConn(getConnection33());
sr.setName("订单明细");
dns.setReader((jatools.data.reader.DatasetReader)sr);
//dns.setTagName("RESULT_0");

job.printAsXLS(new FileOutputStream("d:/a.xls"));

TOP

根据版主的思路与我昨晚的思考(其实我已经接近了,主要是没考虑到更高的根节点<NodeSource> 的也要set标签。因此做出调整,在UTIL.JAVAL里加入 jatools.dom.src.DatasetNodeSource ns = (jatools.dom.src.DatasetNodeSource) jatools.ReportDocument.nodeSource.getChildren().get(0);
        SqlReader sr= (SqlReader) ns.getReader();    //进行根部连接
然后调用我自己设置的SetMsg方法(方便对应不同的表进行连接操作)
      SetMsg sm= new SetMsg();
            sm.setFGB();再读也没问题了,也能解决多数据库的后台问题。。

TOP

附上自定义的代码:
package jatools.util;

public class SetMsg {
        /**
     * 分割表
     */
    public static void setFGB(){
            jatools.dom.src.RootNodeSource rsa = (jatools.dom.src.RootNodeSource)jatools.ReportDocument.nodeSource;
        jatools.dom.src.DatasetNodeSource dns = (jatools.dom.src.DatasetNodeSource) rsa.getChildren().get(0);
        jatools.dom.src.DatasetNodeSource dns1 = (jatools.dom.src.DatasetNodeSource) rsa.getChildren().get(1);
           
        jatools.data.reader.sql.SqlReader sr = new jatools.data.reader.sql.SqlReader();

        String driver = "org.hsqldb.jdbcDriver";
            String url = "jdbc:hsqldb:C:/demosdb/mydb";
            String user = "sa";
            String password = "";
           
        sr.setSql("select top 5 * from 订单查询");
        sr.setConnection(new jatools.data.reader.sql.Connection(driver, url, user, password));
        sr.setName("订单查询");
        dns.setReader((jatools.data.reader.DatasetReader)sr);
        dns.setTagName("result_0");
           
        jatools.data.reader.sql.SqlReader sr2 = new jatools.data.reader.sql.SqlReader();

        sr2.setSql("select top 5 * from 供应商");
        sr2.setConnection(new jatools.data.reader.sql.Connection(driver, url, user, password));
        sr2.setName("供应商");
        dns1.setReader((jatools.data.reader.DatasetReader)sr2);
        dns1.setTagName("result_1");
    }
   
    /**
     * 分栏报表
     */
    public static void setFL(){
            jatools.dom.src.RootNodeSource rsa = (jatools.dom.src.RootNodeSource)jatools.ReportDocument.nodeSource;
        jatools.dom.src.DatasetNodeSource dns = (jatools.dom.src.DatasetNodeSource) rsa.getChildren().get(0);
           
        jatools.data.reader.sql.SqlReader sr = new jatools.data.reader.sql.SqlReader();

        String driver = "org.hsqldb.jdbcDriver";
            String url = "jdbc:hsqldb:C:/demosdb/mydb";
            String user = "sa";
            String password = "";
           
        sr.setSql("SELECT 订单明细.订单ID,订单明细.单价,订单明细.数量,订单明细.折扣,产品.产品名称 FROM 订单明细,产品 where 订单明细.产品ID =产品.产品ID");
        sr.setConnection(new jatools.data.reader.sql.Connection(driver, url, user, password));
        sr.setName("订单明细");
        dns.setReader((jatools.data.reader.DatasetReader)sr);
        dns.setTagName("订单明细");
    }
}

TOP

感谢版主 每次都及时地给于帮助 ,也倾囊相教 ,再次谢谢杰表小组将这么好的程序开源,对于我们交流以及提高有很大的作用,最后,杰表还是很强大,可想在这个基础上进行更复杂的功能编制的可能性。

TOP

加入 jatools.dom.src.DatasetNodeSource ns = (jatools.dom.src.DatasetNodeSource) jatools.ReportDocument.nodeSource.getChildren().get(0);
        SqlReader sr= (SqlReader) ns.getReader();    //进行根部连接
然后调用我自己设置的SetMsg方法(方便对应不同的表进行连接操作)
      SetMsg sm= new SetMsg();
            sm.setFGB();再读也没问题了,也能解决多数据库的后台问题。。
其实是废话
就调用   SetMsg sm= new SetMsg();
            sm.setFGB();就可以

TOP

发新话题