Browse Source

REPORT-69725 远程集群环境,存储过程数据集的参数没有复制过来

【问题原因】粘贴数据集的逻辑是使用TableDataWrapper生成TableDataPane + 使用当使用TableDataPane生成新的数据集;在生成TableDataPane的时候,会调用对应Class类型的构造方法,并populateBean一下;对于存储过程,ProcedureDataPane在populateBean的时候会在SwingWorker的doInBackground()中去做一次查询,然后在done()更新参数;远程连接下,查询的过程变长,导致还没来得及更新上参数,后续使用TableDataPane生成新的数据集时,参数为空,因此创建DataModel的时候后台报错缺失参数,前端表现为数据集编辑面板上没参数
【改动方案】1.专属于存储过程的ProcedureDataPane中提供可以更新参数的方法;2.对复制粘贴时调用的生成TableDataPane的方法包了一层,然后判断是否为存储过程,如果是的话,将源TableData的参数直接更新进去,保证后面这个Pane里是一直有参数的
【review建议】可能有更好的改法,这里这么改主要是因为生成TableDataPane和populateBean的代码都比较古老,逻辑也不熟,不太敢改。
release/11.0
Yvan 3 years ago
parent
commit
7ad91ed466
  1. 4
      designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
  2. 20
      designer-base/src/main/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtils.java
  3. 8
      designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java

4
designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java

@ -19,6 +19,7 @@ import com.fr.design.data.datapane.management.search.pane.TreeSearchToolbarPane;
import com.fr.design.data.datapane.management.search.searcher.TableDataSearchMode;
import com.fr.design.data.datapane.management.search.TableDataTreeSearchManager;
import com.fr.design.data.tabledata.StoreProcedureWorkerListener;
import com.fr.design.data.tabledata.paste.TableDataFollowingPasteUtils;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.DBTableDataPane;
import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper;
@ -1132,8 +1133,7 @@ public class TableDataTreePane extends BasicTableDataTreePane {
// 处理数据集名称
String dsName = getNoRepeatedDsName4Paste(dataWrapperEntry.getKey());
AbstractTableDataWrapper wrapper = dataWrapperEntry.getValue();
AbstractTableDataPane<?> tableDataPane = wrapper.creatTableDataPane();
addDataPane(tableDataPane, dsName);
addDataPane(TableDataFollowingPasteUtils.generateTableDataPaneWhenPaste(wrapper), dsName);
}
}
}

20
designer-base/src/main/java/com/fr/design/data/tabledata/paste/TableDataFollowingPasteUtils.java

@ -3,10 +3,12 @@ package com.fr.design.data.tabledata.paste;
import com.fr.base.TableData;
import com.fr.base.chart.BaseChartCollection;
import com.fr.data.TableDataSource;
import com.fr.data.impl.storeproc.StoreProcedure;
import com.fr.design.DesignModelAdapter;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.datapane.TableDataTreePane;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.ProcedureDataPane;
import com.fr.design.data.tabledata.wrapper.AbstractTableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper;
@ -63,8 +65,7 @@ public class TableDataFollowingPasteUtils {
continue;
}
AbstractTableDataWrapper tableDataWrapper = new TemplateTableDataWrapper(dataWrapperEntry.getValue(), dsName);
AbstractTableDataPane<?> tableDataPane = tableDataWrapper.creatTableDataPane();
tableDataTreePane.addDataPane(tableDataPane, dsName);
tableDataTreePane.addDataPane(generateTableDataPaneWhenPaste(tableDataWrapper), dsName);
}
}
@ -337,4 +338,19 @@ public class TableDataFollowingPasteUtils {
return templeteDataSet;
}
/**
* 生成粘贴新建时使用的AbstractTableDataPane
* 主要是为了处理StoreProcedure它在远程情况下无法及时获取参数这边因为是复制粘贴所以直接用原TableData的参数即可
* @param tableDataWrapper wrapper
* @return AbstractTableDataPane
*/
public static AbstractTableDataPane<?> generateTableDataPaneWhenPaste(AbstractTableDataWrapper tableDataWrapper) {
AbstractTableDataPane<?> tableDataPane = tableDataWrapper.creatTableDataPane();
TableData tableData = tableDataWrapper.getTableData();
if (tableData instanceof StoreProcedure) {
StoreProcedure storeProcedure = (StoreProcedure) tableData;
((ProcedureDataPane) tableDataPane).populateParameters(storeProcedure.getParameters());
}
return tableDataPane;
}
}

8
designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java

@ -225,6 +225,14 @@ public class ProcedureDataPane extends AbstractTableDataPane<StoreProcedure> imp
}
/**
* 手动更新参数用于上面populateBean方法中SwingWorker查询来不及的情况
* @param procedureParameters
*/
public void populateParameters(StoreProcedureParameter[] procedureParameters) {
this.editorPane.populate(procedureParameters);
}
/**
* 增加存储过程监听器
*

Loading…
Cancel
Save