`
wuhaidong
  • 浏览: 357792 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

NC表型参照类

    博客分类:
  • NC
 
阅读更多

package nc.ui.bd.ref;

/**
 * 表参照-其他参照基类。 创建日期:(2001-8-23 20:26:54) 模型里未处理栏目
 * 
 * @author:张扬
 *  
 */

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;

import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.RuntimeEnv;
import nc.bs.logging.Logger;
import nc.jdbc.framework.misc.LRUMap;
import nc.ui.bd.BDGLOrgBookAccessor;
import nc.ui.bd.mmpub.DataDictionaryReader;
import nc.ui.uap.bd.def.DefFieldInfo;
import nc.ui.uap.bd.def.UFRefDefTanslateUtil;
import nc.vo.bd.access.BdinfoVO;
import nc.vo.bd.ref.DocSealWherePartMng;
import nc.vo.bd.ref.IFilterStrategy;
import nc.vo.bd.ref.RefColumnDispConvertVO;
import nc.vo.bd.ref.RefQueryResultVO;
import nc.vo.bd.ref.RefQueryVO;
import nc.vo.bd.ref.RefVO_mlang;
import nc.vo.bd.ref.RefcolumnVO;
import nc.vo.bd.ref.ReftableVO;
import nc.vo.bd.refdatatemp.RefdatatempVO;
import nc.vo.jcom.lang.StringUtil;
import nc.vo.logging.Debug;
import nc.vo.ml.NCLangRes4VoTransl;
import nc.vo.pub.BusinessException;
import nc.vo.pub.formulaset.FormulaParseFather;
import nc.vo.pub.lang.UFBoolean;
import nc.vo.sm.nodepower.OrgnizeTypeVO;

public abstract class AbstractRefModel implements IRefModel {

	private String para1 = null;

	private String para2 = null;

	private String para3 = null;

	protected IRefModelHandler modelHandler;

	private ArrayList hiddenFieldList = new ArrayList();

	// V55需求,是否大小写敏感
	private boolean isCaseSensitve = false;

	//
	private Vector vecAllColumnNames = null;

	private RefQueryVO queryVO = new RefQueryVO();

	/**
	 * AbstractRefModel 构造子注解。
	 */
	public AbstractRefModel() {
		super();
		try {
			Class c;
			// 加载服务器类。
			if (RuntimeEnv.getInstance().isRunningInServer())
				c = Class.forName("nc.ui.bd.ref.impl.RefModelHandlerForServer");
			// 加载客户端类
			else {
				// Server server = (Server)
				// NCLocator.getInstance().lookup(Server.class.getName());
				// Container container = server.getContainer("uap");
				// if(container == null)
				// throw new ServletException("无法找到模块uap");
				// ClassLoader cl = container.getClassLoader();
				c = Class.forName("nc.ui.bd.ref.RefModelHandlerForClient");
			}

			Constructor cs = c
					.getConstructor(new Class[] { AbstractRefModel.class });
			modelHandler = (IRefModelHandler) cs.newInstance(this);
		} catch (Exception e) {
			Logger.error(e);
		}
	}

	private String[] m_strFieldCode = null; // 业务表的字段名

	private String[] m_strFieldName = null; // 业务表的字段中文名

	// 业务表字段类型
	private int[] m_intFieldType = null;

	private String m_strPkFieldCode = null;

	private String m_strTableName = null; // 业务表名

	private java.lang.String m_strBlurValue = null;

	private String m_strRefTitle = null;

	protected Vector m_vecData = null;

	private int m_iDefaultFieldCount = 2;

	private String m_strOrderPart = null;

	protected java.lang.String m_strPk_corp = null;

	protected String m_strRefCodeField = null;

	protected String m_strRefNameField = null;

	protected Vector m_vecSelectedData = null;

	private String m_strStrPatch = "";

	private String m_strWherePart = null;

	private boolean m_bCacheEnabled = true;

	private Hashtable m_htCodeIndex = null;

	private String m_orgTypeCode = OrgnizeTypeVO.COMPANY_TYPE;

	// 当前参照所在界面的功能节点号
	private String m_fun_code = null;

	// 参照增加按钮打开节点的功能节点编码
	private String m_fun_code_DocOpen = null;

	// 主体账簿主键
	private String m_pk_glOrgBook = null;

	// 增加从临时表取数的方式 2004-06-10
	private boolean isFromTempTable = false;

	// 是否包含模糊匹配Sql
	private boolean isIncludeBlurPart = true;

	// sxj 返回值是否包含下级节点
	private boolean isIncludeSub = false;

	private boolean isPKMatch = false;

	// 树表和树型参照可以带一个表型参照,用来匹配助记码等。
	private AbstractRefModel m_defGridmodel = null;

	// sxj 2003-10-31
	// 匹配数据时,如果匹配不上,是否刷新数据再匹配一次
	private boolean m_isRefreshMatch = true;

	// sxj 2004-03-17
	// 是否显示封存数据
	private boolean m_isSealedDataShow = false;

	// 增加用户可以自定义setPk匹配的列。 2004-09-23
	private String m_matchField = null;

	// 数据匹配
	private HashMap m_matchHM = new HashMap();

	// 支持助记码2003-02-19
	// 支持助记码组 2004-01-12
	private String[] m_mnecodes = null;

	// sxj 2003-11-14
	private String querySql = null;

	// 高级过滤类名
	private String refFilterDlgClaseName = null;

	private String refQueryDlgClaseName = null;

	// sxj
	private Object userPara = null;

	protected static final String LARGE_NODE_NAME = "客商基本档案:客商档案:客户档案:供应商档案:客商辅助核算:客户辅助核算:供应商辅助核算:客商档案包含冻结:客户档案包含冻结:供应商档案包含冻结:存货基本档案:存货档案:存货辅助核算:物料档案";

	// 参照setpk匹配数据时,是否包含参照WherePart的开关
	private boolean isMatchPkWithWherePart = false;

	// 参照的编辑状态,该状态和界面的可编辑性一致
	private boolean m_isRefEnable = true;

	// 参照对公式解析的支持
	// 格式举例 formula[0][0] ="字段";formula[0][1]="公式内容"
	private String[][] formulas = null;

	// 树表参照查询是否启用(不是高级查询)
	boolean isLocQueryEnable = true;

	// 是否允许选择非末级
	private boolean m_bNotLeafSelectedEnabled = true;

	// isUseDataPower 2002-09-09
	private boolean m_bUserDataPower = true;

	// 动态列接口名字
	private String m_dynamicColClassName = null;

	// sxj 2003-04-10
	// 提供按给定的Pks进行过滤

	private int m_filterStrategy = IFilterStrategy.INSECTION;

	private HashMap m_hmFilterPks = new HashMap();

	private String[] m_filterPks = null;

	// htDispConvert2002-08-30
	private Hashtable m_htDispConvertor = null;

	// sxj 2003-10-28 动态列启用开关
	private boolean m_isDynamicCol = false;

	private int[] m_iShownColumns = null;

	// 支持助记码多条记录的匹配2003-02-21
	private boolean m_mnecodeInput = false;

	private String[] m_strBlurFields = null;

	private java.lang.String m_strDataSource = null;

	// 动态列名称
	private String[] m_strDynamicFieldNames = null;

	private java.lang.String m_strGroupPart = null;

	private String[] m_strHiddenFieldCode = null;

	private java.lang.String m_strOriginWherePart;

	// 新增参照ID(这里是名称)
	protected String m_strRefNodeName = null;

	// 用户调用动态列接口时,要使用到的参数。
	private Object m_userParameter = null;

	//
	// private Vector m_vecUnMatchData = null;

	private String refTempDataWherePart = null;

	// 模糊匹配时,默认把code+助记码列(数组)作为匹配的列。该参数决定是否只用助记码列来匹配
	private boolean isOnlyMneFields = false;

	// 增补的wherePart
	private String m_addWherePart = null;

	// 处理特殊列显示转换
	private Object[][] m_columnDispConverter = null;

	// 用户
	private String m_pk_user = null;

	FormulaHandler formulaHandler = null;

	DefFieldsHandler defFieldHandler = null;

	private EventListenerList eListenerList = new EventListenerList();

	private Map eventListMap = new HashMap();

	private transient ChangeEvent changeEvent = null;

	// 是否只显示集团数据
	private boolean isGroupAssignData = false;

	// 参照数据缓存Key前缀字符串
	private String refDataCachekeyPreStr = "REFDATACACHE";

	private DDReaderVO ddReaderVO = null;

	// 对于自定义参照数据权限的支持.数据权限优先按资源ID查询。
	private int resourceID = -1;

	private String sealedWherePart = null;

	// 该条件会根据环境变量变化,同时在setpk时不带此条件
	private String envWherePart = null;

	private BdinfoVO bdinfoVO = null;

	// 是否已初始化BDInfoVO
	private boolean isInitBDinfoVO = false;

	// 是否要改变关联表的顺序(为缓存)
	private boolean isChangeTableSeq = true;

	// 维护按钮是否可用
	private boolean isMaintainButtonEnabled = true;

	// 数据权限资源字段
	private String dataPowerResourceColumn = null;

	// 记录详细信息显示组件
	private String refCardInfoComponentImplClass = null;

	// 参照显示字段
	private String refShowNameField = null;

	// 自定义项字段,必须是表名.字段名
	private String[] defFields = null;

	// 对齐方式Map
	private Map<String, Integer> alignMap = null;

	// 界面控制自定义组件名称,该实现类必须继承JComponent,且包含AbstractRefMOdel的构造子
	private String uiControlComponentClassName = null;

	// 参照维护接口类,since v5.5 支持自定义档案维护界面
	private String refDocEditClassName = null;

	private class DDReaderVO {
		String tableName = null;

		String[] fieldNames = null;

		/**
		 * @return 返回 fieldNames。
		 */
		public String[] getFieldNames() {
			return fieldNames;
		}

		/**
		 * @param fieldNames
		 *            要设置的 fieldNames。
		 */
		public void setFieldNames(String[] fieldNames) {
			this.fieldNames = fieldNames;
		}

		/**
		 * @return 返回 tableName。
		 */
		public String getTableName() {
			return tableName;
		}

		/**
		 * @param tableName
		 *            要设置的 tableName。
		 */
		public void setTableName(String tableName) {
			this.tableName = tableName;
		}
	}

	/**
	 * @return 返回 m_columnDispConverterClass。
	 */
	public Object[][] getColumnDispConverter() {
		return m_columnDispConverter;
	}

	/**
	 * @param dispConverterClass
	 *            要设置的 m_columnDispConverterClass。
	 */
	public void setColumnDispConverter(Object[][] dispConverter) {
		m_columnDispConverter = dispConverter;
	}

	/**
	 * 增加where子句 创建日期:(2001-8-16 12:42:02)
	 * 
	 * @param newWherePart
	 *            java.lang.String
	 */
	public void addWherePart(String newWherePart) {
		// 从原始Where增加
		// m_strWherePart = getOriginWherePart();
		// if (m_strWherePart == null || m_strWherePart.trim().length() == 0) {
		// m_strWherePart = " ( 11 = 11 )";
		// }
		// if (newWherePart != null && newWherePart.trim().length() > 0) {
		// m_strWherePart = "( " + m_strWherePart + " )";
		// m_strWherePart += " " + newWherePart + " ";
		// }

		// setAddWherePart(newWherePart);

		m_addWherePart = newWherePart;

		// clearData();
		resetSelectedData_WhenDataChanged();
	}

	/**
	 * 创建日期:(2004-9-23 9:03:51)
	 * 
	 * @param newM_matchField
	 *            java.lang.String 自定义的列。用SetPk方法设的值在该列中匹配。 不建议使用。
	 */
	public void setMatchField(java.lang.String newM_matchField) {
		m_matchField = newM_matchField;
	}

	/**
	 * 此处插入方法说明。
	 * 
	 * /** 清除数据及缓存。 创建日期:(2001-8-23 21:01:00)
	 */
	public void clearData() {

		clearModelData();
		clearCacheData();

	}

	/**
	 * 删除参照缓存数据
	 */
	public void clearCacheData() {
		modelHandler.clearCacheData();
	}

	protected void clearModelData() {
		m_vecData = null;
		setSelectedData(null);

	}

	protected void clearDataPowerCache() {
		modelHandler.clearDataPowerCache();
	}

	/**
	 * 将一行数据转化为VO,如不使用VO可以虚实现。 创建日期:(2001-8-13 16:34:11)
	 * 
	 * @return nc.vo.pub.ValueObject
	 * @param vData
	 *            java.util.Vector
	 */
	public nc.vo.pub.ValueObject convertToVO(java.util.Vector vData) {
		return null;
	}

	/**
	 * 将多行数据转化为VO数组。 创建日期:(2001-8-13 16:34:11)
	 * 
	 * @return nc.vo.pub.ValueObject[]
	 * @param vData
	 *            java.util.Vector
	 */
	public nc.vo.pub.ValueObject[] convertToVOs(java.util.Vector vData) {
		if (vData == null || vData.size() == 0)
			return null;
		nc.vo.pub.ValueObject[] vos = new nc.vo.pub.ValueObject[vData.size()];
		for (int i = 0; i < vData.size(); i++) {
			Vector vRecord = (Vector) vData.elementAt(i);
			vos[i] = convertToVO(vRecord);
		}
		return vos;
	}

	/**
	 * 模糊字段值。 创建日期:(2001-8-17 11:17:42)
	 * 
	 * @return java.lang.String
	 */
	public String getBlurValue() {
		return m_strBlurValue;
	}

	/**
	 * 获取缓存或数据库表中的参照数据--二维Vector。
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-7-12</strong>
	 * <p>
	 * 
	 * @param
	 * @return Vector
	 * @exception BusinessException
	 * @since NC5.0
	 */
	public final Vector getRefData() {
		return modelHandler.getRefData();
	}

	/**
	 * 获取参照数据--二维Vector。 自定义参照可以覆盖
	 * 
	 * @return java.util.Vector
	 */

	public java.util.Vector getData() {

		String sql = getRefSql();

		Vector v = null;
		if (isCacheEnabled()) {
			/** 从缓存读数据 */
			v = modelHandler.getFromCache(getRefDataCacheKey(),
					getRefCacheSqlKey());
		}

		if (v == null) {

			// 从数据库读--也可以在此定制数据

			try {

				if (isFromTempTable()) {
					v = modelHandler.queryRefDataFromTemplateTable(sql);
				} else {
					// 同时读取参照栏目数据
					v = getQueryResultVO();
				}

			} catch (Exception e) {
				Debug.debug(e.getMessage(), e);
			}

		}

		putToCache(v);

		m_vecData = v;
		return m_vecData;
	}

	public void putToCache(Vector v) {
		if (v != null && isCacheEnabled()) {
			/** 加入到缓存中 */
			modelHandler.putToCache(getRefDataCacheKey(), getRefCacheSqlKey(),
					v);
		}
	}

	public Vector getConvertedData1(boolean isDataFromCache, Vector v,
			boolean isDefConverted) {
		return getConvertedData(isDataFromCache, v, isDefConverted);
	}

	/**
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-7-12</strong>
	 * <p>
	 * 
	 * @param
	 * @return void
	 * @exception BusinessException
	 * @since NC5.0
	 */
	protected Vector getConvertedData(boolean isDataFromCache, Vector v,
			boolean isDefConverted) {
		if (v == null) {
			return v;
		}
		Vector vecData = v;

		// 与总账协商的结果,按传入Pks过滤
		if (vecData != null && vecData.size() > 0) {
			vecData = getFilterPKsVector(vecData, getFilterStrategy());

		}
		// 多语言处理
		// 缓存中的数据已经处理过了.
		if (!isDataFromCache) {
			setMlangValues(vecData, getRefVO_mlang());
			if (getFormulas() != null) {
				getFormulaHandler().setFormulaValues(vecData, getFormulas());
			}
			// 统计型自定义项pk-->name
			if (isDefConverted) {
				getDefFieldHandler().setDefFieldValues(vecData);
			}

		}
		// 特殊处理结束
		// try to convert
		handleDispConvertor(vecData);
		// end converts
		// 处理特殊显示列。
		if (getColumnDispConverter() != null) {
			setColDispValues(vecData, getColumnDispConverter());
		}
		return vecData;
	}

	/**
	 * 枚举类型显示值的转换
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-3-9</strong>
	 * <p>
	 * 
	 * @param
	 * @return void
	 * @exception
	 * @since NC5.0
	 */
	private void handleDispConvertor(Vector v) {
		if (getDispConvertor() != null) {
			Hashtable convert = getDispConvertor();
			Enumeration e = convert.keys();
			while (e.hasMoreElements()) {
				String convertColumn = (String) e.nextElement();
				Hashtable conv = (Hashtable) convert.get(convertColumn);
				Integer Idx = (Integer) getHtCodeIndex().get(convertColumn);
				if (Idx == null || Idx.intValue() < 0)
					continue;
				int idx = Idx.intValue();
				if (v != null) {
					int rows = v.size();
					for (int i = 0; i < rows; i++) {
						Vector vRow = (Vector) v.elementAt(i);
						if (vRow != null) {
							Object oldValue = vRow.elementAt(idx);
							if (oldValue == null)
								continue;
							Object newValue = conv.get(oldValue.toString());
							if (newValue != null) {
								vRow.setElementAt(newValue, idx);
								// 如果需求,可以转换为原值,目前先保持翻译后的值
								// Object obj =
								// getRefValueVO(vRow.elementAt(idx),
								// newValue);
								// vRow.setElementAt(obj, idx);
							}
						}
					}
				}
			}
		}
	}

	/**
	 * 默认显示字段中的显示字段数----表示显示前几个字段
	 */
	public int getDefaultFieldCount() {
		return m_iDefaultFieldCount;
	}

	/**
	 * 得到一个字段在所有字段中的下标。 创建日期:(2001-8-16 15:39:23)
	 * 
	 * @return int
	 * @param fieldList
	 *            java.lang.String[]
	 * @param field
	 *            java.lang.String
	 */
	public int getFieldIndex(String field) {

		if (field == null || field.trim().length() == 0
				|| getHtCodeIndex() == null || getHtCodeIndex().size() == 0)
			return -1;
		Object o = getHtCodeIndex().get(field.trim());
		if (o == null) {
			// 加入动态列
			int index = m_htCodeIndex.size();
			if (isDynamicCol() && getDynamicFieldNames() != null) {
				for (int i = 0; i < getDynamicFieldNames().length; i++) {
					m_htCodeIndex.put(getDynamicFieldNames()[i].trim(),
							new Integer(index + i));
				}
			}
			o = getHtCodeIndex().get(field.trim());
		}

		return (o == null) ? -1 : ((Integer) o).intValue();
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-6-17 18:35:14)
	 * 
	 * @return java.util.Hashtable
	 */
	public Hashtable getHtCodeIndex() {
		if (m_htCodeIndex == null || m_htCodeIndex.size() == 0) {
			m_htCodeIndex = new Hashtable();
			if (getFieldCode() != null)
				for (int i = 0; i < getFieldCode().length; i++) {
					m_htCodeIndex.put(getFieldCode()[i].trim(), new Integer(i));
				}

			if (getHiddenFieldCode() != null) {
				int index = 0;
				if (getFieldCode() != null) {
					index = getFieldCode().length;
				}
				for (int i = 0; i < getHiddenFieldCode().length; i++) {
					if (getHiddenFieldCode()[i] != null) {
						m_htCodeIndex.put(getHiddenFieldCode()[i].trim(),
								new Integer(index + i));
					} else {
						System.out
								.println("Waring: The RefModel has some errors.");
					}
				}
			}

		}
		return m_htCodeIndex;
	}

	/**
	 * Order子句。
	 * 
	 * @return java.lang.String
	 */
	public String getOrderPart() {
		if (m_strOrderPart == null && getFieldCode() != null
				&& getFieldCode().length > 0)
			m_strOrderPart = getFieldCode()[0];
		return m_strOrderPart;
	}

	/**
	 * 得到公司主键--默认参照使用。 创建日期:(2001-8-17 11:17:03)
	 * 
	 * @return java.lang.String
	 */
	public String getPk_corp() {
		if (m_strPk_corp == null) {
			m_strPk_corp = modelHandler.getPk_corp();
		}
		return m_strPk_corp;
	}

	/**
	 * 返回值--主键字段
	 * 
	 * @return java.lang.String
	 */
	public String getPkValue() {
		String strValue = null;
		Object objValue = getValue(getPkFieldCode());
		if (objValue != null) {
			strValue = objValue.toString();
		}

		return strValue;
	}

	/**
	 * 返回值数组--主键字段
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String[] getPkValues() {

		Object[] oDatas = getValues(getPkFieldCode());
		String[] sDatas = objs2Strs(oDatas);
		return sDatas;
	}

	/**
	 * 参照编码字段。 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.String
	 */
	public String getRefCodeField() {
		if (m_strRefCodeField == null && getFieldCode() != null
				&& getFieldCode().length > 0)
			m_strRefCodeField = getFieldCode()[0];
		return m_strRefCodeField;
	}

	/**
	 * 返回值--编码字段 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.String
	 */
	public String getRefCodeValue() {

		String strValue = null;
		String[] strValues = getRefCodeValues();
		if (strValues != null && strValues.length > 0) {
			strValue = strValues[0];
		}
		return strValue;
	}

	/**
	 * 返回值数组--编码字段 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.String[]
	 */
	public java.lang.String[] getRefCodeValues() {
		Object[] oDatas = getValues(getRefCodeField());
		String[] sDatas = objs2Strs(oDatas);
		return sDatas;
	}

	protected String[] objs2Strs(Object[] oDatas) {
		if (oDatas == null)
			return null;
		String[] sDatas = new String[oDatas.length];
		for (int i = 0; i < oDatas.length; i++) {
			if (oDatas[i] == null)
				sDatas[i] = null;
			else
				sDatas[i] = oDatas[i].toString().trim();
		}
		return sDatas;
	}

	/**
	 * 参照名称字段。 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.String
	 */
	public String getRefNameField() {
		if (m_strRefNameField == null && getFieldCode() != null
				&& getFieldCode().length > 1)
			m_strRefNameField = getFieldCode()[1];
		return m_strRefNameField;
	}

	/**
	 * 返回值-名称字段 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getRefNameValue() {

		String strValue = null;
		String[] strValues = getRefNameValues();
		if (strValues != null && strValues.length > 0) {
			strValue = strValues[0];
		}
		return strValue;
	}

	/**
	 * 返回值-名称字段 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.String[]
	 */
	public java.lang.String[] getRefNameValues() {
		// 名称列,取翻译后的值
		Object[] oDatas = getValues(getRefNameField(), getSelectedData(), false);

		String[] sDatas = objs2Strs(oDatas);

		return sDatas;
	}

	public java.lang.String[] getRefShowNameValues() {
		// 名称列,取翻译后的值
		Object[] oDatas = getValues(getRefShowNameField(), getSelectedData(),
				false);

		return objs2Strs(oDatas);
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-15 17:30:17)
	 * 
	 * @return java.lang.String
	 */
	public String getRefSql() {

		return getSql(getStrPatch(), getFieldCode(), getHiddenFieldCode(),
				getTableName(), getWherePart(), getGroupPart(), getOrderPart());

	}

	/**
	 * 返回选择数据--二维数组。 创建日期:(2001-8-23 19:10:29)
	 * 
	 * @return java.util.Vector
	 */
	public java.util.Vector getSelectedData() {
		return m_vecSelectedData;
	}

	/**
	 * DISTINCT子句
	 * 
	 * @return java.lang.String
	 */
	public String getStrPatch() {
		return m_strStrPatch;
	}

	/**
	 * 返回值-根据参数字段 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.Object
	 */
	public Object getValue(String field) {
		Object[] values = getValues(field);

		Object value = null;

		if (values != null && values.length > 0) {
			value = values[0];
		}

		return value;
	}

	/**
	 * 返回值数组-根据参数字段 创建日期:(2001-8-13 16:19:24)
	 * 
	 * @return java.lang.Object[]
	 */
	public java.lang.Object[] getValues(String field) {

		return getValues(field, true);
	}

	/**
	 * 取参照选中记录给定列的值
	 * 
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-11-16</strong>
	 * <p>
	 * 
	 * @param field
	 *            列
	 * @param 是否是原值。列可能已被翻译(例如定义了公式,定义了多语翻译,定义了枚举类型的对应值)
	 * 
	 * @return java.lang.Object[]
	 * @exception BusinessException
	 * @since NC5.0
	 */
	public java.lang.Object[] getValues(String field, boolean isOriginValue) {

		return getValues(field, getSelectedData(), isOriginValue);
	}

	/**
	 * 
	 */
	public java.lang.Object[] getValues(String field, Vector datas) {

		return getValues(field, datas, true);
	}

	protected java.lang.Object[] getValues(String field, Vector datas,
			boolean isOriginValue) {
		int col = getFieldIndex(field);
		if (datas == null || datas.size() == 0)
			return null;
		if (col < 0) {
			throw new RuntimeException("参照中没有该属性");
		}
		Vector vRecord = null;
		Object[] oData = new Object[datas.size()];
		for (int i = 0; i < datas.size(); i++) {
			vRecord = (Vector) datas.elementAt(i);
			if (vRecord == null || vRecord.size() == 0 || col >= vRecord.size())
				oData[i] = null;
			else {
				oData[i] = getValueOfRefvalueVO(vRecord.elementAt(col),
						isOriginValue);
			}
		}
		return oData;
	}

	private Object getValueOfRefvalueVO(Object obj, boolean isOriginValue) {
		Object value = obj;
		if (obj instanceof RefValueVO && isOriginValue) {
			value = ((RefValueVO) obj).getOriginValue();
		}
		/**
		 * V55 数据库中查出的原始类型为BigDecimal,为NC处理简便,参照对外统一转换为UFDouble
		 * 
		 */

		value = RefPubUtil.bigDecimal2UFDouble(value);

		return value;

	}

	/**
	 * 获取已经读出的参照数据--二维Vector。 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector
	 */
	public java.util.Vector getVecData() {
		return m_vecData;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-25 12:06:11)
	 * 
	 * @return nc.vo.pub.ValueObject
	 */
	public nc.vo.pub.ValueObject getVO() {
		if (getSelectedData() != null && getSelectedData().size() > 0)
			return convertToVO(((Vector) getSelectedData().elementAt(0)));
		else
			return null;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-25 12:06:11)
	 * 
	 * @return nc.vo.pub.ValueObject
	 */
	public nc.vo.pub.ValueObject[] getVOs() {
		return convertToVOs(getSelectedData());
	}

	/**
	 * getWherePart 方法注解。
	 */
	public String getWherePart() {
		return m_strWherePart;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-23 21:03:06)
	 * 
	 * @return boolean
	 */
	public boolean isCacheEnabled() {
		return m_bCacheEnabled;
	}

	/**
	 * 匹配界面输入数据--选择数据也改变了。 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector
	 */
	public Vector matchBlurData(String strBlurValue) {
		Vector v = null;
		if (strBlurValue != null && strBlurValue.trim().length() > 0) {
			v = matchData(getBlurFields(), new String[] { strBlurValue });
			// 如果是模糊查询的结果或者是编码等多条匹配,处理叶子节点是否可以选中
			// 用于树形参照通过模糊匹配变成表型,过滤掉非叶子节点

			if (!isNotLeafSelectedEnabled()
					&& (!isNull(strBlurValue) || isMnecodeInput())) {

				v = filterNotLeafNode(v);
			}

		}
		// 清空已选择数据
		setSelectedData(v);
		return v;

	}

	private boolean isNull(String str) {
		return str == null || str.trim().length() == 0;
	}

	/**
	 * 获取匹配数据 匹配成功 数据->m_vecSelectedData 匹配不成功 null->m_vecSelectedData
	 * 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector sxj 修改如果value= null or value.length()=0
	 *         不做匹配,提高效率,防止重复reloadData()
	 */
	public Vector matchData(String field, String value) {
		return matchData(new String[] { field }, new String[] { value });
	}

	/**
	 * 匹配主键数据--选择数据也改变了。 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector sxj 2004-06-08 如果是用Pk 进行匹配,则在最大集内进行匹配。 根据
	 *         getMatchField()提供的列进行匹配
	 */
	public Vector matchPkData(String strPkValue) {

		if (strPkValue == null || strPkValue.trim().length() == 0) {
			setSelectedData(null);
			return null;

		}
		return matchPkData(new String[] { strPkValue });
	}

	/**
	 * 重新载入数据。 1.使用缓存手动调用如刷新按钮。 创建日期:(2001-8-23 21:14:19)
	 * 
	 * @return java.util.Vector
	 */
	public java.util.Vector reloadData() {

		reloadData1();

		return getRefData();
	}

	// 重载数据前的处理
	public void reloadData1() {
		// 刷新前已选择的数据
		String[] selectedPKs = getPkValues();

		clearData();
		// 清数据权限缓存
		clearDataPowerCache();

		modelHandler.getLRUMap().clear();

		// 刷新后重新匹配数据。
		if (selectedPKs != null && selectedPKs.length > 0) {
			matchPkData(selectedPKs);
		}
		modelHandler.fireDBCache();
	}

	/**
	 * 设置模糊值。 创建日期:(2001-8-17 12:57:37)
	 */
	public void setBlurValue(String strBlurValue) {
		m_strBlurValue = strBlurValue;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-23 21:03:06)
	 */
	public void setCacheEnabled(boolean cacheEnabled) {
		m_bCacheEnabled = cacheEnabled;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-24 10:32:33)
	 * 
	 * @param vData
	 *            java.util.Vector
	 */
	public void setData(Vector vData) {
		m_vecData = vData;
		// 默认参照支持自定义数据
		if (isCacheEnabled()) {
			String sql = getRefSql();
			modelHandler.putToCache(getRefDataCacheKey(), sql, vData);
		}
	}

	/**
	 * 默认显示字段中的显示字段数----表示显示前几个字段
	 */
	public void setDefaultFieldCount(int iDefaultFieldCount) {
		m_iDefaultFieldCount = iDefaultFieldCount;
	}

	/**
	 * Order子句。
	 */
	public void setOrderPart(String strOrderPart) {
		m_strOrderPart = strOrderPart;
	}

	/**
	 * 设置公司主键--默认参照使用。 自定义参照不支持动态改变环境变量动态改变WherePart
	 * 
	 * @return java.lang.String
	 */
	public void setPk_corp(String strPk_corp) {
		if (strPk_corp == null) {
			return;
		}
		// 切换公司,主体账簿主键也会改变(对于会计科目参照等主体账簿)
		m_pk_glOrgBook = null;
		// 自定义参照,用字符串替换算法来动态改变Wherepart,对于系统默认参照
		setPk_corpForDefRef(strPk_corp, m_strPk_corp);
		m_strPk_corp = strPk_corp;
		// 系统默认参照
		// 重置WherePart,也可能有其他信息也要改变,
		resetWherePart();
	}

	/**
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-6-16</strong>
	 * <p>
	 * 
	 * @param
	 * @return void
	 * @exception BusinessException
	 * @since NC5.0
	 */
	private void resetWherePart() {
		setRefNodeName(getRefNodeName());
		// 可能有业务组添加的WherePart
		String wherePart = getWherePart();
		// 如果WherePart中不包含业务组添加的WherePart,再给添加上
		if (getAddWherePart() != null && wherePart != null
				&& wherePart.indexOf(getAddWherePart()) < 0) {
			addWherePart(getAddWherePart());
		}
	}

	/**
	 * 设置公司主键同时重置参照默认配置条件
	 * 
	 * @deprecated
	 */
	public void setPk_corpAndRefreshRefNodeName(String strPk_corp) {
		setPk_corp(strPk_corp);

	}

	/*
	 * 自定义参照动态改变公司主键后,要重新设置WherePart
	 */
	private void setPk_corpForDefRef(String pk_corp, String pk_corpOld) {

		if (pk_corpOld != null && pk_corp != null
				&& (!pk_corpOld.equals(pk_corp))) {
			String wherePartOld = getWherePart();
			String wherePart = "";
			if (wherePartOld != null) {
				int index = wherePartOld.indexOf("'" + pk_corpOld + "'");
				if (index > 0) {
					wherePart = wherePartOld.replaceFirst("'" + pk_corpOld
							+ "'", "'" + pk_corp + "'");
					setWherePart(wherePart);
				}
			}
		}
	}

	/**
	 * 设置参照编码字段。 创建日期:(2001-8-13 16:19:24)
	 */
	public void setRefCodeField(String strRefCodeField) {
		m_strRefCodeField = strRefCodeField;
	}

	/**
	 * 设置参照名称字段。 创建日期:(2001-8-13 16:19:24)
	 */
	public void setRefNameField(String strRefNameField) {
		m_strRefNameField = strRefNameField;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-25 18:58:00)
	 * 
	 * @param vecSelectedData
	 *            java.util.Vector
	 */
	public void setSelectedData(Vector vecSelectedData) {
		m_vecSelectedData = vecSelectedData;
	}

	public void setSelectedDataAndConvertData(Vector vecSelectedData) {
		if (vecSelectedData == null) {
			setSelectedData(vecSelectedData);
			return;
		}
		Vector matchVec = getConvertedData(false, vecSelectedData, false);
		setSelectedData(matchVec);
		putLruMap(matchVec);
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-6-19 21:15:22)
	 * 
	 * @param newStrPatch
	 *            java.lang.String
	 */
	public void setStrPatch(java.lang.String newStrPatch) {
		m_strStrPatch = newStrPatch;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-16 12:42:02)
	 * 
	 * @param newWherePart
	 *            java.lang.String
	 */
	public void setWherePart(String newWherePart) {

		if (newWherePart != null) {
			newWherePart = newWherePart.trim();
			int index = newWherePart.toLowerCase().indexOf("where ");
			if (index == 0)
				newWherePart = newWherePart.substring(index + 5, newWherePart
						.length());
		}
		m_strWherePart = newWherePart;
		// 同时修改原始where
		m_strOriginWherePart = m_strWherePart;

		resetSelectedData_WhenDataChanged();

	}

	/**
	 * 当Where 条件改变后,清空m_vecData,重新匹配已经设置的pks.
	 */
	private void resetSelectedData_WhenDataChanged() {

		String[] selectedPKs = getPkValues();
		// 清数据。
		clearModelData();

		if (selectedPKs != null && selectedPKs.length > 0) {
			matchPkData(selectedPKs);
		}

		Vector selectedData = getSelectedData();

		setSelectedData(selectedData);
		// 通知UIRefPane,刷新界面
		fireChange();
	}

	/**
	 * java.util.Vector 过滤非末级节点
	 */
	protected Vector filterNotLeafNode(Vector vec) {
		return vec;
	}

	/**
	 * 模糊字段名。 创建日期:(01-4-4 0:57:23)
	 * 
	 * @return java.lang.String
	 */
	public String[] getBlurFields() {

		if (m_strBlurFields == null || m_strBlurFields.length == 0) {

			if (isOnlyMneFields()) {
				return m_strBlurFields = getMnecodes();
			} else if (getFieldCode() != null) {
				ArrayList al = new ArrayList();
				int len = getFieldCode().length;

				al.add(getFieldCode()[0]);
				if (len >= 2) {
					al.add(getFieldCode()[1]);
				}

				if (getMnecodes() != null) {
					for (int i = 0; i < getMnecodes().length; i++) {
						if (al.contains(getMnecodes()[i])) {
							continue;
						}
						al.add(getMnecodes()[i]);
					}
				}
				m_strBlurFields = new String[al.size()];
				al.toArray(m_strBlurFields);

			}

		}

		return m_strBlurFields;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-9 8:54:00)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getDataSource() {
		return m_strDataSource;
	}

	/**
	 * 用于参照内容转换的影射表 如attrib1属性1-上海 2-南京3-北京 Hashtable conv=new Hashtable();
	 * Hashtable contents=new Hashtable(); contents.put("1","上海");
	 * contents.put("2","南京"); contents.put("3","北京");
	 * conv.put("attrib1",contents); return conv; 童志杰2002-08-30
	 */
	public java.util.Hashtable getDispConvertor() {
		if (getDdReaderVO() != null && m_htDispConvertor == null) {
			m_htDispConvertor = getDDReaderMap(getDdReaderVO().getTableName(),
					getDdReaderVO().getFieldNames());
		}
		return m_htDispConvertor;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-28 19:40:50)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getDynamicColClassName() {
		return m_dynamicColClassName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-30 8:34:51)
	 * 
	 * @return java.lang.String[]
	 */
	public java.lang.String[] getDynamicFieldNames() {
		return m_strDynamicFieldNames;
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-4-3 20:08:40)
	 * 
	 * @return java.util.Hashtable
	 * @param tableName
	 *            java.lang.String
	 */
	public Map getFieldCNName() {
		return modelHandler.getFieldCNName();
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-4-10 18:42:56) 取过滤后的数据集. vecData 当前结果集
	 */
	public Vector getFilterPKsVector(Vector vecData, int filterStrategy) {
		Vector filterVector = null;
		int pkIndex = getFieldIndex(getPkFieldCode());
		if (vecData != null) {
			// 没有过滤的PKs
			if (getFilterPks() == null) {
				return vecData;
			}
			filterVector = new Vector();
			for (int i = 0; i < vecData.size(); i++) {
				Object vecpk = ((Vector) vecData.elementAt(i))
						.elementAt(pkIndex);

				switch (filterStrategy) {

				case IFilterStrategy.INSECTION: {
					if (m_hmFilterPks.size() == 0) {
						return null;
					}
					if (m_hmFilterPks.get(vecpk.toString()) != null) {
						filterVector.add(vecData.elementAt(i));
					}
					break;
				}

				case IFilterStrategy.REFDATACOLLECT_MINUS_INSECTION: {
					if (m_hmFilterPks.size() == 0) {
						return vecData;
					}
					if (m_hmFilterPks.get(vecpk.toString()) == null) {
						filterVector.add(vecData.elementAt(i));
					}
					break;
				}
				default:

				}
			}
		}
		return filterVector;

	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-8 13:31:41)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getGroupPart() {
		return m_strGroupPart;
	}

	/**
	 * 不显示字段列表
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String[] getHiddenFieldCode() {
		return m_strHiddenFieldCode;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-9 9:38:40)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getOriginWherePart() {
		return m_strOriginWherePart;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-8 10:36:45)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getRefNodeName() {
		return m_strRefNodeName == null ? getClass().getName()
				: m_strRefNodeName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-29 10:08:50)
	 * 
	 * @return int[]
	 */
	public int[] getShownColumns() {
		if ((m_iShownColumns == null || m_iShownColumns.length == 0)
				&& getDefaultFieldCount() > 0) {
			m_iShownColumns = new int[getDefaultFieldCount()];
			for (int i = 0; i < getDefaultFieldCount(); i++) {
				m_iShownColumns[i] = i;
			}
		}
		return m_iShownColumns;
	}

	/**
	 * 此处插入方法说明。 创建日期:(02-7-4 18:40:10)
	 * 
	 * @return java.util.Vector
	 */
	// public java.util.Vector getUnMatchData() {
	// if (m_vecUnMatchData == null)
	// m_vecUnMatchData = new Vector();
	// return m_vecUnMatchData;
	// }
	/**
	 * 此处插入方法说明。 创建日期:(2003-10-28 19:54:29)
	 * 
	 * @return java.lang.Object
	 */
	public java.lang.Object getUserParameter() {
		return m_userParameter;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-28 19:38:34)
	 * 
	 * @return boolean
	 */
	public boolean isDynamicCol() {
		return m_isDynamicCol;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-2-21 16:27:33)
	 * 
	 * @return boolean
	 */
	public boolean isMnecodeInput() {
		return m_mnecodeInput;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-4-10 20:39:56)
	 * 
	 * @return boolean
	 */
	public boolean isNotLeafSelectedEnabled() {
		return m_bNotLeafSelectedEnabled;
	}

	/**
	 * 是否允许使用数据权限
	 * 
	 * @return boolean
	 */
	public boolean isUseDataPower() {
		return m_bUserDataPower;
	}

	/**
	 * 设置模糊字段。 创建日期:(2001-8-17 12:57:37)
	 */
	public void setBlurFields(String[] strBlurFields) {
		m_strBlurFields = strBlurFields;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-9 8:54:00)
	 * 
	 * @param newDataSource
	 *            java.lang.String
	 */
	public void setDataSource(java.lang.String newDataSource) {
		m_strDataSource = newDataSource;
	}

	/**
	 * 用于参照内容转换的影射表 如attrib1属性1-上海 2-南京3-北京 Hashtable conv=new Hashtable();
	 * Hashtable contents=new Hashtable(); contents.put("1","上海");
	 * contents.put("2","南京"); contents.put("3","北京");
	 * conv.put("attrib1",contents); return conv; 童志杰2002-08-30
	 */
	public void setDispConvertor(java.util.Hashtable newDispConvertor) {
		m_htDispConvertor = newDispConvertor;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-28 19:40:50)
	 * 
	 * @param newColClassName
	 *            java.lang.String
	 */
	public void setDynamicColClassName(java.lang.String newColClassName) {
		m_dynamicColClassName = newColClassName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-30 8:34:51)
	 * 
	 * @param newDynamicFieldNames
	 *            java.lang.String[]
	 */
	public void setDynamicFieldNames(java.lang.String[] newDynamicFieldNames) {
		m_strDynamicFieldNames = newDynamicFieldNames;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-4-10 18:32:43)
	 * 
	 * @param newM_filterPks
	 *            java.lang.String[]
	 * 
	 * 设置过滤的Pks
	 */
	public void setFilterPks(java.lang.String[] newM_filterPks) {
		setFilterPks(newM_filterPks, IFilterStrategy.INSECTION);
	}

	/**
	 * 此处插入方法说明。 创建日期:(2005-9-02 18:32:43)
	 * 
	 * @param newM_filterPks
	 *            java.lang.String[]
	 * 
	 * 
	 * 设置过滤的Pks
	 */
	public void setFilterPks(java.lang.String[] newM_filterPks,
			int filterStrategy) {
		m_filterPks = newM_filterPks;
		// 过滤策略
		m_filterStrategy = filterStrategy;
		m_hmFilterPks.clear();
		if (m_filterPks != null && m_filterPks.length > 0) {

			for (int i = 0; i < m_filterPks.length; i++) {
				m_hmFilterPks.put(m_filterPks[i], m_filterPks[i]);
			}
		}
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-8 13:31:41)
	 * 
	 * @param newGroupPart
	 *            java.lang.String
	 */
	public void setGroupPart(java.lang.String newGroupPart) {
		m_strGroupPart = newGroupPart;
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-6-25 10:53:54)
	 * 
	 * @param newHiddenFieldCode
	 *            java.lang.String[]
	 */
	public void setHiddenFieldCode(java.lang.String[] newHiddenFieldCode) {
		getHtCodeIndex().clear();
		hiddenFieldList.clear();
		hiddenFieldList.addAll(Arrays.asList(newHiddenFieldCode));
		m_strHiddenFieldCode = newHiddenFieldCode;
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-6-17 18:35:14)
	 * 
	 * @return java.util.Hashtable
	 */
	public void setHtCodeIndex(Hashtable ht) {
		m_htCodeIndex = ht;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-28 19:38:34)
	 * 
	 * @param newDynamicCol
	 *            boolean
	 */
	public void setIsDynamicCol(boolean newDynamicCol) {
		m_isDynamicCol = newDynamicCol;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-2-21 16:27:33)
	 * 
	 * @param newM_mnecodeInput
	 *            boolean
	 */
	public void setMnecodeInput(boolean newM_mnecodeInput) {
		m_mnecodeInput = newM_mnecodeInput;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-4-10 20:39:56)
	 * 
	 * @param newM_bNotLeafSelectedEnabled
	 *            boolean
	 */
	public void setNotLeafSelectedEnabled(boolean newM_bNotLeafSelectedEnabled) {
		m_bNotLeafSelectedEnabled = newM_bNotLeafSelectedEnabled;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-11-8 10:36:45)
	 * 
	 * @param newRefNodeName
	 *            java.lang.String
	 */
	public void setRefNodeName(java.lang.String newRefNodeName) {
		m_strRefNodeName = newRefNodeName;
	}

	/**
	 * v5 不建议使用 替换方式,请分步调用 1、setRefNodeName(refnodename); 2、setPk_corp(pk_corp);
	 * 
	 * @deprecated
	 */
	public void setRefNodeName(java.lang.String newRefNodeName, String pk_corp) {
		m_strPk_corp = pk_corp;
		m_strRefNodeName = newRefNodeName;
	}

	/**
	 * 为了适配三种DefaultModel添加的方法,在DefaultModel里被覆盖 对于自定义model不能直接调用该方法,请覆盖它
	 */
	public void setRefTitle(java.lang.String newRefTitle) {
		m_strRefTitle = newRefTitle;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-29 10:08:50)
	 * 
	 * @return int[]
	 */
	public void setShownColumns(int[] iShownColumns) {
		m_iShownColumns = iShownColumns;
		return;
	}

	/**
	 * 为了适配三种DefaultModel添加的方法,在DefaultModel里被覆盖 对于自定义model不能直接调用该方法,请覆盖它
	 */
	public void setTableName(java.lang.String newTableName) {
		m_strTableName = newTableName;
	}

	/**
	 * 设置是否使用数据权限。 创建日期:(2001-8-23 21:03:06)
	 */
	public void setUseDataPower(boolean useDataPower) {
		m_bUserDataPower = useDataPower;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-28 19:54:29)
	 * 
	 * @param newParameter
	 *            java.lang.Object
	 */
	public void setUserParameter(java.lang.Object newParameter) {
		m_userParameter = newParameter;
	}

	/**
	 * 根据记录位置,列名称插入列值
	 */
	public void setValue(int recordIndex, String field, Object value) {
		Vector vecData = getSelectedData();
		if (vecData == null || recordIndex >= vecData.size()) {
			return;
		}
		Vector vRecord = (Vector) vecData.get(recordIndex);
		int col = getFieldIndex(field);

		//
		if (isDynamicCol()) {
			if (vRecord == null || vRecord.size() == 0 || col < 0)
				return;

			if (value != null) {

				if (col >= vRecord.size()) {
					vRecord.add(value);
				} else {
					vRecord.setElementAt(value, col);
				}
				return;

			}
		}

		if (vRecord == null || vRecord.size() == 0 || col < 0
				|| col >= vRecord.size())
			return;

		if (value != null) {
			vRecord.setElementAt(value, col);

		}

	}

	/**
	 * 自定义参照,可以添加封存条件
	 */
	public void addSealedWherePart(String refNodeName, String sealedWherePart) {

		DocSealWherePartMng.addSealedWherePart(refNodeName, sealedWherePart);
	}

	/**
	 * sxj 2004-5-26 新增 改变WherePart时是否清除数据
	 */
	public void addWherePart(String newWherePart, boolean isRrefreshData) {
		addWherePart(newWherePart);
		if (isRrefreshData) {
			clearModelData();
		}

	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-6-1 10:21:59)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getFilterDlgClaseName() {
		return refFilterDlgClaseName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-9-23 9:03:51)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getMatchField() {
		if (m_matchField == null) {
			return getPkFieldCode();
		}
		return m_matchField;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-11-10 10:31:47)
	 * 
	 * @return java.util.HashMap
	 */
	private java.util.HashMap getMatchHM() {
		return m_matchHM;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-2-19 9:24:17)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String[] getMnecodes() {
		return m_mnecodes;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-4-16 10:31:17)
	 * 
	 * @return java.lang.Object
	 */
	public java.lang.Object getPara() {
		return userPara;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-11-14 15:42:52)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getQuerySql() {
		return querySql;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-11-15 10:51:44)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getRefQueryDlgClaseName() {
		return refQueryDlgClaseName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-4-14 16:01:25)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getTempDataWherePart() {
		return refTempDataWherePart;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-6-10 12:09:05)
	 * 
	 * @return boolean
	 */
	public boolean isFromTempTable() {
		return isFromTempTable;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-4-14 16:13:36)
	 * 
	 * @return boolean
	 */
	public boolean isIncludeSub() {
		return isIncludeSub;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-31 15:57:17)
	 * 
	 * @return boolean
	 */
	public boolean isRefreshMatch() {
		return m_isRefreshMatch;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-3-17 12:53:23)
	 * 
	 * @return boolean
	 */
	public boolean isSealedDataShow() {
		return m_isSealedDataShow;
	}

	/**
	 * 获取匹配数据 匹配成功 数据->m_vecSelectedData 匹配不成功 null->m_vecSelectedData
	 * 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector sxj 修改如果value= null or value.length()=0
	 *         不做匹配,提高效率,防止重复reloadData() sxj 2004-11-11 add
	 */
	public Vector matchData(String field, String[] values) {
		return matchData(new String[] { field }, values);
	}

	/**
	 * 匹配主键数据--选择数据也改变了。 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector sxj 2004-06-08 如果是用Pk 进行匹配,则在最大集内进行匹配。 根据
	 *         getMatchField()提供的列进行匹配
	 */
	public Vector matchPkData(String[] strPkValues) {

		if (strPkValues == null) {
			return null;
		}

		Vector v = null;
		String matchsql = null;

		matchsql = getMatchSql(strPkValues);

		Vector matchVec = getMatchVectorFromLRU(strPkValues);

		if (matchVec != null) {
			// setSelectedDataAndConvertData(matchVec);
			setSelectedData(matchVec);

			return matchVec;
		}

		try {
			if (isNonSqlMatch(matchsql)) {
				v = matchData(getMatchField(), strPkValues);

			} else {

				if (isFromTempTable()) {
					v = modelHandler.queryRefDataFromTemplateTable(matchsql);
				} else {
					v = modelHandler.matchPK(getDataSource(), matchsql);
				}
			}

		} catch (Exception e) {
			Debug.error(e.getMessage(), e);
		}

		// putLruMap(strPkValues, v);

		setSelectedDataAndConvertData(v);

		return getSelectedData();
	}

	public Vector getMatchVectorFromLRU(String[] strPkValues) {
		if (isCacheEnabled()) {
			LRUMap<String, Vector> lruMap = modelHandler.getLRUMap();

			String lruKey = getLRUKey(strPkValues);

			Vector matchVec = lruMap.get(lruKey);
			return matchVec;
		}
		return null;
	}

	private void putLruMap(Vector vecData) {
		if (isCacheEnabled()) {
			String[] pkValues = getPkValues();
			if (pkValues == null) {
				return;
			}
			LRUMap<String, Vector> lruMap = modelHandler.getLRUMap();
			String lruKey = getLRUKey(pkValues);
			lruMap.put(lruKey, vecData);
		}
	}

	private String getLRUKey(String[] strPkValues) {
		StringBuffer sb = new StringBuffer();
		String dsName = getDataSource();
		if (dsName == null) {
			dsName = InvocationInfoProxy.getInstance().getUserDataSource();
		}
		sb.append(dsName).append(getRefNodeName()).append(
				getMatchSql(strPkValues));

		if (strPkValues != null && strPkValues.length > 0) {
			for (int i = 0; i < strPkValues.length; i++) {
				sb.append(strPkValues[i]);
			}

		}
		return sb.toString();
	}

	/**
	 * 
	 */
	public boolean isNonSqlMatch(String matchsql) {
		return modelHandler.isNonSqlMatch(matchsql);
	}

	public String getMatchSql(String[] strPkValues) {
		setPKMatch(true);
		boolean originSealedDataShow = isSealedDataShow();
		boolean originUseDataPower = isUseDataPower();

		if (!isRefEnable()) {
			// 如果参照不可编辑,不启用数据权限控制;包含封存数据 ---〉V5新需求
			setUseDataPower(false);
			setSealedDataShow(true);
		}

		String matchsql;
		// pk匹配时,带distinct,防止关联表出现重复数据的问题。
		String strPatch = IRefConst.DISTINCT;
		String strWherePart = null;

		String[] fieldCodes = getFieldCode();

		if (fieldCodes != null && fieldCodes.length > 0) {
			if (fieldCodes[0] != null
					&& strPatch.indexOf(fieldCodes[0].toLowerCase()) >= 0) {
				strPatch = "";
			}
		}
		if (isMatchPkWithWherePart()) {
			strWherePart = getWherePart();
		}

		if (isLargeDataRef() && canUseDB())
			matchsql = getSpecialMatchSql(new String[] { getMatchField() },
					strPkValues, strPatch, getFieldCode(),
					getHiddenFieldCode(), getTableName(), strWherePart,
					getOrderPart());
		// 批处理Sql
		else
			matchsql = getSql_Match(new String[] { getMatchField() },
					strPkValues, strPatch, getFieldCode(),
					getHiddenFieldCode(), getTableName(), strWherePart,
					getOrderPart());// 批处理Sql

		setPKMatch(false);

		setSealedDataShow(originSealedDataShow);
		setUseDataPower(originUseDataPower);

		return matchsql;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-6-1 10:21:59)
	 * 
	 * @param newFilterDlgClaseName
	 *            java.lang.String
	 */
	public void setFilterDlgClaseName(java.lang.String newFilterDlgClaseName) {
		refFilterDlgClaseName = newFilterDlgClaseName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-6-10 12:09:05)
	 * 
	 * @param newFromTempTable
	 *            boolean
	 */
	public void setFromTempTable(boolean newFromTempTable) {
		isFromTempTable = newFromTempTable;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-4-14 16:13:36)
	 * 
	 * @param newIncludeSub
	 *            boolean
	 */
	public void setIncludeSub(boolean newIncludeSub) {
		isIncludeSub = newIncludeSub;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-10-31 15:57:17)
	 * 
	 * @param newRefreshMatch
	 *            boolean
	 */
	public void setIsRefreshMatch(boolean newRefreshMatch) {
		m_isRefreshMatch = newRefreshMatch;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-2-19 9:24:17)
	 * 
	 * @param newM_mnecode
	 *            java.lang.String
	 */
	public void setMnecode(java.lang.String[] newM_mnecodes) {
		m_mnecodes = newM_mnecodes;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-4-16 10:31:17)
	 * 
	 * @param newPara
	 *            java.lang.Object
	 */
	public void setPara(java.lang.Object newPara) {
		userPara = newPara;
	}

	/**
	 * sxj 2004-5-26 新增 改变WherePart时是否清除数据
	 */
	public void setPara(java.lang.Object newPara, boolean isRrefreshData) {
		setPara(newPara);
		if (isRrefreshData) {
			clearModelData();
		}
	}

	/**
	 * sxj 2004-5-26 新增 改变WherePart时是否清除数据
	 */
	public void setPk_corp(String strPk_corp, boolean isRrefreshData) {
		setPk_corp(strPk_corp);
		if (isRrefreshData) {
			clearModelData();
		}
	}

	/**
	 * 只修改变量的值,不同步WherePart中的值。
	 */
	public void setPk_corpValue(String strPk_corp) {
		m_strPk_corp = strPk_corp;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-11-14 15:42:52)
	 * 
	 * @param newQuerySql
	 *            java.lang.String
	 */
	public void setQuerySql(java.lang.String newQuerySql) {
		querySql = newQuerySql;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-11-15 10:51:44)
	 * 
	 * @param newRefQueryDlgClaseName
	 *            java.lang.String
	 */
	public void setRefQueryDlgClaseName(java.lang.String newRefQueryDlgClaseName) {
		refQueryDlgClaseName = newRefQueryDlgClaseName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-3-17 12:53:23)
	 * 
	 * @param newSealedDataShow
	 *            boolean
	 */
	public void setSealedDataShow(boolean newSealedDataShow) {
		m_isSealedDataShow = newSealedDataShow;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2004-4-14 16:01:25)
	 * 
	 * @param newTempDataWherePart
	 *            java.lang.String
	 */
	public void setTempDataWherePart(java.lang.String newTempDataWherePart) {
		refTempDataWherePart = newTempDataWherePart;
	}

	/**
	 * sxj 2004-5-26 新增 改变WherePart时是否清除数据
	 */
	public void setWherePart(String newWherePart, boolean isRrefreshData) {
		setWherePart(newWherePart);
		if (isRrefreshData) {
			clearModelData();
		}
	}

	/**
	 * 此处插入方法描述。 创建日期:(2004-6-3 16:56:59)
	 * 
	 * @author:毛士福
	 * @return nc.ui.bd.ref.AbstractRefModel
	 * @deprecated since v5.0
	 */
	public AbstractRefModel getM_defGridmodel() {
		return m_defGridmodel;
	}

	/**
	 * @return 返回 m_pk_org。
	 */
	public String getPk_GlOrgBook() {
		return m_pk_glOrgBook;
	}

	/**
	 * @return 返回 m_orgTypeCode。
	 */
	public String getOrgTypeCode() {
		return m_orgTypeCode;
	}

	/**
	 * 本方法不支持自定义参照,动态改变主体账簿后,WherePart的动态改变。
	 * 
	 * @param orgTypeCode
	 *            要设置的 m_orgTypeCode。
	 * @param pk_org
	 *            要设置的 m_pk_org。 多账簿、多会计主体设置接口 主要功能:
	 *            提供给总账按主体账簿方式设置,其他业务组调用可能会产生问题。
	 */
	public void setPk_GlOrgBook(String orgTypeCode, String pk_GlOrgBook) {
		// 档案的真正类型
		String pk = pk_GlOrgBook;
		String type = orgTypeCode;
		BdinfoVO infoVO = getBdinfoVO();
		if (infoVO != null) {
			pk = BDGLOrgBookAccessor.getAccuratePK(infoVO.getOrgtypecode(),
					orgTypeCode, pk_GlOrgBook);
			type = infoVO.getOrgtypecode();
		}
		setOrgTypeCodeAndPK(type, pk);

		// 重新设置条件.
		resetWherePart();

	}

	/*
	 * 设置档案类型等属性。
	 */
	public void setOrgTypeCodeAndPK(String orgTypeCode, String pk) {
		// 如果是公司类型
		if (OrgnizeTypeVO.COMPANY_TYPE.equals(orgTypeCode)) {
			setPk_corp(pk);
			m_orgTypeCode = null;
			m_pk_glOrgBook = null;

		} else if (OrgnizeTypeVO.ZHUZHANG_TYPE.equals(orgTypeCode)) {
			m_orgTypeCode = orgTypeCode;
			m_pk_glOrgBook = pk;
		}

	}

	/**
	 * @param newM_defGridmodel
	 *            nc.ui.bd.ref.AbstractRefModel
	 * @deprecated since v5.0
	 */
	public void setM_defGridmodel(AbstractRefModel newM_defGridmodel) {
		m_defGridmodel = newM_defGridmodel;
	}

	/*
	 * 
	 */
	public String getDataPowerSubSql(String strTableName,
			String strTableShowName) {
		String tableName = strTableName;
		if (strTableName != null) {
			tableName = strTableName.trim();
		}
		String powerSql = modelHandler.getDataPowerSubSql(tableName,
				strTableShowName, this);
		return powerSql;
	}

	protected String getDataPowerSqlKey(String strTableName,
			String strTableShowName) {
		String pk_org = null;
		if (getPk_GlOrgBook() != null) {
			pk_org = getPk_GlOrgBook();
		} else {
			pk_org = getPk_corp();
		}
		String tableName = strTableName;
		if (strTableName != null) {
			tableName = strTableName.trim();
		}
		String dataPowerKey = tableName + "_" + strTableShowName + pk_org;
		return dataPowerKey;
	}

	/**
	 * @return 返回 m_fun_code。
	 */
	public String getFun_code() {
		return m_fun_code;
	}

	/**
	 * @param m_fun_code
	 *            要设置的 m_fun_code。
	 */
	public void setFun_code(String m_fun_code) {

		boolean isEqual = modelHandler.equals(this.m_fun_code, m_fun_code);

		this.m_fun_code = m_fun_code;

		// 同时要重新初始化参照的设置
		if (!isEqual) {
			setRefNodeName(getRefNodeName());
		}
	}

	/**
	 * 为多语言添加此方法, 请覆盖此方法返回要翻译字段数组。
	 */
	protected RefVO_mlang[] getRefVO_mlang() {

		return null;

	}

	/**
	 * * 为多语言添加此方法, 并提供默认实现.
	 * 
	 * vecData:参照中的数据(全集),请用参数传入的vecData,不要用getData()方法得到,否则会死循环。
	 * vecData中的数据为每一行Record,每一个Record也是一个Vector.
	 * 
	 * 返回值为Vector,它的数据为翻译后的Object[],注意放置Object[]的顺序一定和refVO_mlangs的顺序一致。
	 * 
	 * 创建日期:(2005-3-30 16:19:24)
	 * 
	 * @return Vector
	 */
	private Vector getValues_mlang(Vector vecData, RefVO_mlang[] refVO_mlangs) {
		// 要翻译的列

		Vector datas = new Vector();

		if (vecData != null && vecData.size() > 0) {
			int recordAccout = vecData.size(); // 行记录数。
			if (refVO_mlangs != null) {
				for (int i = 0; i < refVO_mlangs.length; i++) {
					RefVO_mlang refVO_mlang = refVO_mlangs[i];
					String resid = "";
					String[] resIDFieldNames = refVO_mlangs[i]
							.getResIDFieldNames();

					Object[] oData_mlang = new Object[recordAccout];

					for (int j = 0; j < recordAccout; j++) {

						Vector record = (Vector) vecData.get(j); // 行记录
						resid = "";
						if (resIDFieldNames != null) {
							resid += refVO_mlang.getPreStr();
							for (int k = 0; k < resIDFieldNames.length; k++) {
								Object oValue = record
										.get(getFieldIndex(resIDFieldNames[k]));
								if (oValue != null) {
									resid += oValue.toString();
								}

							}
						}

						// 根据资源ID取翻译后的数据
						String str_multiLang = NCLangRes4VoTransl
								.getNCLangRes().getStrByID(
										refVO_mlang.getDirName(), resid);
						// 根据资源没有找到,返回原来的值.
						if (resid.equals(str_multiLang)) {
							str_multiLang = record.get(
									getFieldIndex(refVO_mlang.getFieldName()))
									.toString();
						}
						oData_mlang[j] = str_multiLang;

					}
					datas.add(oData_mlang);
				}

			}
		}

		return datas;

	}

	/**
	 * 为多语言添加此方法, 设置翻译后的值到参照数据中. 设置特定列的值 创建日期:(2005-3-30 16:19:24)
	 * 
	 */
	private void setMlangValues(Vector vecData, RefVO_mlang[] refVO_mlangs) {

		if (vecData == null || vecData.size() == 0 || refVO_mlangs == null) {
			return;
		}
		Vector vec_malng = getValues_mlang(vecData, refVO_mlangs);
		if (vec_malng == null || vec_malng.size() != refVO_mlangs.length) {
			return;
		}
		String[] fieldNames = new String[refVO_mlangs.length];
		for (int i = 0; i < refVO_mlangs.length; i++) {
			fieldNames[i] = refVO_mlangs[i].getFieldName();
		}
		setValuesByFieldName(vecData, vec_malng, fieldNames);

	}

	class DefFieldsHandler {

		/**
		 * 设有公式的参照,按公式取值。 创建日期:(2005-3-30 16:19:24)
		 * 
		 */
		void setDefFieldValues(Vector vecData) {

			String[] defFields = getShowDefFields();

			if (vecData == null || vecData.size() == 0 || defFields == null
					|| defFields.length == 0) {
				return;
			}
			Vector<Object[]> rawData = new Vector<Object[]>();
			Vector convertedData = null;
			DefFieldInfo defFieldInfo = new DefFieldInfo(defFields);

			for (int i = 0; i < defFields.length; i++) {
				rawData.add(getValues(defFields[i], vecData));
			}
			try {
				convertedData = UFRefDefTanslateUtil.getDefValues(defFieldInfo,
						rawData, Integer.valueOf(getOrgTypeCode()).intValue(),
						getPk_corp());
			} catch (Exception e) {
				Logger.error(e.getMessage(), e);
			}

			if (convertedData == null) {
				return;
			}

			setValuesByFieldName(vecData, convertedData, defFields);

		}
	}

	class FormulaHandler {

		private FormulaParseFather parse = null;

		/**
		 * 设有公式的参照,按公式取值。 创建日期:(2005-3-30 16:19:24)
		 * 
		 */
		void setFormulaValues(Vector vecData, String[][] formulas) {

			if (vecData == null || vecData.size() == 0 || formulas == null) {
				return;
			}
			String[][] showFormulas = getShowFieldFormulas(formulas);
			if (showFormulas == null) {
				return;
			}
			Object[][] datas = getValues_formulas(vecData, showFormulas);

			if (datas == null || datas.length != showFormulas.length) {
				return;
			}
			Vector v = new Vector();
			String[] fieldNames = new String[datas.length];
			for (int i = 0; i < datas.length; i++) {
				v.add(datas[i]);
				fieldNames[i] = (String) showFormulas[i][0];
			}
			setValuesByFieldName(vecData, v, fieldNames);

		}

		private String[][] getShowFieldFormulas(String[][] formulas) {
			List<String[]> list = new ArrayList<String[]>();
			for (int i = 0; i < formulas.length; i++) {
				String formulaField = formulas[i][0];
				if (isShowField(formulaField)) {
					list.add(formulas[i]);
				}
			}
			String[][] showFormulas = null;
			if (list.size() > 0) {
				showFormulas = new String[list.size()][];
				list.toArray(showFormulas);
			}
			return showFormulas;
		}

		private Object[][] getValues_formulas(Vector vecData,
				String[][] formulas) {
			// 要翻译的列

			Object[][] datas = null;
			int flen = formulas.length;
			if (vecData != null && vecData.size() > 0 && flen > 0) {

				int recordAccout = vecData.size(); // 行记录数。
				datas = new Object[flen][recordAccout];
				ArrayList list = new ArrayList();
				String formulaField = null;
				String strFormula = null;
				for (int i = 0; i < flen; i++) {
					list.clear();
					formulaField = formulas[i][0];
					strFormula = formulas[i][1];

					for (int j = 0; j < recordAccout; j++) {
						Vector record = (Vector) vecData.get(j);
						list.add(getFormulaValue(record, formulaField));
					}
					datas[i] = getFormulaValues(formulaField, strFormula, list);
				}
			}

			return datas;

		}

		/**
		 * <p>
		 * <strong>最后修改人:sxj</strong>
		 * <p>
		 * <strong>最后修改日期:2006-9-19</strong>
		 * <p>
		 * 
		 * @param
		 * @return String
		 * @exception BusinessException
		 * @since NC5.0
		 */
		private String getFormulaValue(Vector record, String formulaField) {
			int fieldIndex = getFieldIndex(formulaField);
			if (fieldIndex == -1) {
				return null;
			}
			Object obj = record.get(fieldIndex);

			String value = null;

			if (obj instanceof RefValueVO && obj != null) {

				Object originValue = ((RefValueVO) obj).getOriginValue();

				value = originValue == null ? null : originValue.toString();

			} else {
				if (obj != null) {
					value = obj.toString();
				}
			}
			return value;
		}

		private Object[] getFormulaValues(String fieldName, String formulas,
				List givenvalues) {
			FormulaParseFather parse = getParse();
			// String express = formula;
			String[] expresses = StringUtil.toArray(formulas, ";");
			parse.setExpressArray(expresses);
			parse.addVariable(fieldName, givenvalues);
			Object[][] values = parse.getValueOArray();
			return values[values.length - 1];
		}

		/**
		 * @return 返回 parse。
		 */
		private FormulaParseFather getParse() {
			if (parse == null) {
				parse = new nc.ui.pub.formulaparse.FormulaParse();
			}
			return parse;
		}

	}

	/*
	 * _ add by hetian 2005-04-11 ______________________________________
	 */
	/**
	 * 判断该参照是否是大数据表
	 * 
	 * @return
	 */
	public boolean isLargeDataRef() {
		if (m_strRefNodeName == null || m_strRefNodeName.equals(""))
			return false;
		if (LARGE_NODE_NAME.indexOf(m_strRefNodeName) >= 0
				&& isChangeTableSeq()) {
			return true;
		}
		return false;
	}

	/**
	 * 改变主表
	 * 
	 * @param table
	 * @return
	 */
	public String changeBaseTable(String table) {

		if (table == null || table.indexOf("join") < 0)
			return table;
		StringTokenizer token = new StringTokenizer(table);
		String firstTable = "";
		String secondTable = "";
		String lastElement = "";
		String joinStr = "";
		String onStr = "";
		boolean isJoin = false;
		boolean isOn = false;
		int index = 0;
		while (token.hasMoreTokens()) {
			String element = token.nextToken();
			if (lastElement.equalsIgnoreCase("join")) {
				secondTable = element;
				isJoin = false;
			}
			if (element.equalsIgnoreCase("on")) {
				isOn = true;
			}
			if (isJoin) {
				joinStr += new StringBuffer().append(" ").append(element)
						.append(" ").toString();
			}
			if (isOn) {
				onStr += new StringBuffer().append(" ").append(element).append(
						" ").toString();
			}
			if (index == 0) {
				firstTable = new StringBuffer().append(element).append(" ")
						.toString();
				isJoin = true;
			}

			lastElement = element;
			index++;
		}

		return secondTable + joinStr + firstTable + onStr;
	}

	/**
	 * 得到匹配语句
	 * 
	 * @return
	 */
	public String getSpecialMatchSql(String[] fieldNames, String values[],
			String strPatch, String[] strFieldCode, String[] hiddenFields,
			String strTableName, String strWherePart, String strOrderField) {
		if (strTableName == null || strTableName.trim().length() == 0)
			return null;
		if (!isPKMatch()) {
			strTableName = changeBaseTable(strTableName);
		}
		if (strOrderField != null) {
			strOrderField = filterColumn(strOrderField);
		}
		return getSql_Match(fieldNames, values, strPatch, strFieldCode,
				hiddenFields, strTableName, strWherePart, strOrderField);

	}

	/**
	 * 构造基本 SQL
	 */
	public String buildBaseSql(String patch, String[] columns,
			String[] hiddenColumns, String tableName, String whereCondition) {
		StringBuffer whereClause = new StringBuffer();
		StringBuffer sql = new StringBuffer("select ").append(patch)
				.append(" ");
		int columnCount = columns == null ? 0 : columns.length;
		addQueryColumn(columnCount, sql, columns, hiddenColumns);
		// 加入FROM子句
		sql.append(" from ").append(tableName);
		// 加入WHERE子句
		if (whereCondition != null && whereCondition.trim().length() != 0) {
			whereClause.append(" where (").append(whereCondition).append(" )");
		} else
			whereClause.append(" where 11=11 ");

		appendAddWherePartCondition(whereClause);

		addDataPowerCondition(getTableName(), whereClause);
		addSealCondition(whereClause);
		addEnvWherePart(whereClause);
		sql.append(" ").append(whereClause.toString());

		return sql.toString();
	}

	protected void addDataPowerCondition(String tableName,
			StringBuffer whereClause) {
		if (isUseDataPower()) {

			String powerSql = getDataPowerSubSql(tableName, getDataPowerName());

			if (powerSql != null)

				whereClause.append(" and (").append(
						getDataPowerResourceColumn()).append(" in (").append(
						powerSql).append("))");

		}

	}

	public String getDataPowerResourceColumn() {
		if (dataPowerResourceColumn == null) {
			return getPkFieldCode();
		}
		return dataPowerResourceColumn;
	}

	private void appendAddWherePartCondition(StringBuffer whereClause) {

		if (getAddWherePart() == null) {
			return;
		}

		if (isPKMatch() && !isMatchPkWithWherePart()) {

			return;

		}
		whereClause.append(" ").append(getAddWherePart());

	}

	/**
	 * 给数据权限重定向的机会,子类覆盖。 特殊情况下使用,例如会计科目多版本
	 */
	protected String getDataPowerName() {
		return getRefNodeName();
	}

	/**
	 * 添加列条件
	 * 
	 * @param iSelectFieldCount
	 * @param strSql
	 * @param strFieldCode
	 * @param hiddenFields
	 */
	public void addQueryColumn(int iSelectFieldCount, StringBuffer strSql,
			String[] strFieldCode, String[] hiddenFields) {
		for (int i = 0; i < iSelectFieldCount; i++) {
			strSql.append(strFieldCode[i]);
			if (i < iSelectFieldCount - 1)
				strSql.append(",");
		}
		// 加入隐藏字段
		if (hiddenFields != null && hiddenFields.length > 0) {
			for (int k = 0; k < hiddenFields.length; k++) {
				if (hiddenFields[k] != null
						&& hiddenFields[k].trim().length() > 0) {
					strSql.append(",");
					strSql.append(hiddenFields[k]);
				}
			}
		}
	}

	/**
	 * 添加封存条件
	 * 
	 * @param whereClause
	 */
	public void addSealCondition(StringBuffer whereClause) {
		// 封存数据不显示,添加Where条件
		if (!isSealedDataShow()) {

			String wherePart = getSealedWherePart();
			if (wherePart != null) {
				whereClause.append(" and (").append(wherePart).append(") ");

			}
		}
	}

	/**
	 * 查询参照封存条件。
	 * 
	 * @param refNodeName
	 * @return refNodeName对应参照的过滤封存数据的SQL where条件
	 */
	public String getSealedWherePart() {
		if (sealedWherePart != null) {
			return sealedWherePart;
		}

		sealedWherePart = DocSealWherePartMng
				.getSealedWherePart(getRefNodeName());
		if (sealedWherePart == null) {
			sealedWherePart = DocSealWherePartMng
					.getSealedWherePart(getTableName());
		}

		return sealedWherePart;
	}

	/**
	 * 设置封存条件
	 * 
	 * @param sealedWherePart
	 *            要设置的 sealedWherePart。
	 */
	public void setSealedWherePart(String sealedWherePart) {
		this.sealedWherePart = sealedWherePart;
	}

	/**
	 * 过滤表名
	 * 
	 * @param column
	 * @return
	 */
	public String filterColumn(String column) {
		return column.substring(column.indexOf(".") + 1, column.length());
	}

	/**
	 * 构造SQL语句
	 * 
	 * @author 张扬 贺扬修改
	 */
	protected String getSql(String strPatch, String[] strFieldCode,
			String[] hiddenFields, String strTableName, String strWherePart,
			String strGroupField, String strOrderField) {
		if (strTableName == null || strTableName.trim().length() == 0) {
			return null;
		}

		String basSQL = buildBaseSql(strPatch, strFieldCode, hiddenFields,
				strTableName, strWherePart);
		StringBuffer sqlBuffer = new StringBuffer(basSQL);
		if (getQuerySql() != null) {
			addQueryCondition(sqlBuffer);
		}
		if (getBlurValue() != null && isIncludeBlurPart()) {
			String blurSql = addBlurWherePart();
			sqlBuffer.append(blurSql);
		}

		//
		// 加入Group子句
		if (strGroupField != null) {
			sqlBuffer.append(" group by ").append(strGroupField).toString();
		}
		// 加入ORDER子句
		if (strOrderField != null && strOrderField.trim().length() != 0) {
			sqlBuffer.append(" order by ").append(strOrderField).toString();
		}
		return sqlBuffer.toString();
	}

	protected void addQueryCondition(StringBuffer sqlBuffer) {
		sqlBuffer.append(" and (").append(getPkFieldCode()).append(" in (")
				.append(getQuerySql()).append("))").toString();
	}

	/**
	 * @param sqlBuffer
	 */
	public String addBlurWherePart() {
		return modelHandler.addBlurWherePart();
	}

	/**
	 */
	protected String getSql_Match(String[] fieldNames, String[] values,
			String strPatch, String[] strFieldCode, String[] hiddenFields,
			String strTableName, String strWherePart, String strOrderField) {
		if (strTableName == null || strTableName.trim().length() == 0)
			return null;

		String basSQL = null;

		basSQL = buildBaseSql(strPatch, strFieldCode, hiddenFields,
				strTableName, strWherePart);

		StringBuffer buffer = new StringBuffer(basSQL);

		buffer.append(" and (");
		if (isPKMatch()) {
			buffer.append(getWherePartByFieldsAndValues(fieldNames, values));
		} else {
			String[] toLowCasefieldNames = new String[fieldNames.length];
			String[] toLowCaseValues = new String[values.length];
			for (int i = 0; i < toLowCasefieldNames.length; i++) {
				toLowCasefieldNames[i] = RefPubUtil.toLowerDBFunctionWrapper(
						this, fieldNames[i]);
			}
			for (int i = 0; i < toLowCaseValues.length; i++) {
				toLowCaseValues[i] = RefPubUtil.toLowerCaseStr(this, values[i]);
			}

			buffer.append(getWherePartByFieldsAndValues(toLowCasefieldNames,
					toLowCaseValues));
		}
		buffer.append(") ");
		// 加入ORDER子句
		if (strOrderField != null) {
			buffer.append(" order by ").append(strOrderField).toString();
		}
		return buffer.toString();
	}

	/*
	 * 
	 * 在java.util.Hashtable getDispConvertor()中初始化
	 * 
	 */
	public Hashtable getConvertHT(String tableName, String[] fieldNames) {
		// 只设置一个标识
		setDdReaderVO(tableName, fieldNames);
		// 读取值域
		return null;
	}

	/**
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-7-20</strong>
	 * <p>
	 * 
	 * @param
	 * @return Hashtable
	 * @exception BusinessException
	 * @since NC5.0
	 */
	private Hashtable getDDReaderMap(String tableName, String[] fieldNames) {
		DataDictionaryReader ddReader = new DataDictionaryReader(tableName);
		Hashtable convert = new Hashtable();

		for (int i = 0; i < fieldNames.length; i++) {
			// 如果列名已经包含表名,去掉表名.值域列没有表名
			String newfieldName = fieldNames[i];
			if (newfieldName.indexOf(".") > 0) {
				newfieldName = newfieldName.substring(
						newfieldName.indexOf(".") + 1, newfieldName.length());
			}
			String[] keys = ddReader.getQzsm(newfieldName);
			Hashtable contents = new Hashtable();
			for (int j = 0; j < keys.length; j++) {
				if (keys[j] != null) {
					contents.put(ddReader
							.getNumberByQzsm(newfieldName, keys[j]).toString(),
							keys[j]);
				}
			}

			convert.put(fieldNames[i], contents);
		}
		return convert;
	}

	/**
	 * @return 返回 isMatchPkWithWherePart。
	 * 
	 */
	public boolean isMatchPkWithWherePart() {
		return isMatchPkWithWherePart;
	}

	/**
	 * @param isMatchPkWithWherePart
	 *            要设置的 isMatchPkWithWherePart。
	 */
	public void setMatchPkWithWherePart(boolean isMatchPkWithWherePart) {
		this.isMatchPkWithWherePart = isMatchPkWithWherePart;
	}

	/**
	 * @return 返回 m_isRefEnable。
	 */
	public boolean isRefEnable() {
		return m_isRefEnable;
	}

	/**
	 * 参照是否可编辑 规则: 1、如果参照可以编辑 在matchPK时,包含数据权限和不包含封存数据 2、如果参照不能编辑
	 * 在matchPK时,不包含数据权限和包含封存数据
	 * 3、对于规则1,如果isUseDataPower()=false,就不包含数据权限;如果isSealedDataShow=true,就包含封存数据
	 */
	public void setisRefEnable(boolean refEnable) {
		m_isRefEnable = refEnable;

	}

	/**
	 * @return 返回 formulas。
	 */
	public String[][] getFormulas() {
		return formulas;
	}

	/**
	 * @param formulas
	 *            要设置的 formulas。
	 */
	public void setFormulas(String[][] formulas) {
		this.formulas = formulas;
	}

	/**
	 * @return 返回 isLocQueryEnable。
	 */
	public boolean isLocQueryEnable() {
		return isLocQueryEnable;
	}

	/**
	 * @param isLocQueryEnable
	 *            要设置的 isLocQueryEnable。
	 */
	public void setLocQueryEnable(boolean isLocQueryEnable) {
		this.isLocQueryEnable = isLocQueryEnable;
	}

	/**
	 * @return 返回 m_hmFilterPks。
	 */
	public HashMap getHmFilterPks() {
		return m_hmFilterPks;
	}

	/**
	 * @return 返回 m_filterStrategy。
	 */
	public int getFilterStrategy() {
		return m_filterStrategy;
	}

	/**
	 * @return 返回 m_filterPks。
	 */
	public String[] getFilterPks() {
		return m_filterPks;
	}

	/**
	 * 获取匹配数据 匹配成功 数据->m_vecSelectedData 匹配不成功 null->m_vecSelectedData
	 * 创建日期:(2001-8-23 18:39:24)
	 * 
	 * @return java.util.Vector sxj 修改如果value= null or value.length()=0
	 *         不做匹配,提高效率,防止重复reloadData() sxj 2004-11-11 add
	 */
	public Vector matchData(String[] fields, String[] values) {

		Vector vMatchData = getMatchedRecords(fields, values);

		// 使用缓存,并且匹配不到数据,刷新数据再执行一次

		if (isCacheEnabled() && vMatchData == null && isRefreshMatch()) {
			clearData();
			vMatchData = getMatchedRecords(fields, values);
		}
		// boolean isDefConverted = true;
		// if (vMatchData == null || vMatchData.size() == 1) {
		// isDefConverted = false;
		// }
		// if (vMatchData != null) {
		// vMatchData = getConvertedData(false, vMatchData, isDefConverted);
		// }
		setSelectedData(vMatchData);

		return vMatchData;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2005-10-21 14:43:00)
	 * 
	 * @param fieldNames
	 *            java.lang.String[]
	 * @param values
	 *            java.lang.String
	 */
	protected Vector getMatchedRecords(String[] fieldNames, String[] values) {

		Vector vMatchedRecords = null;
		// sxj
		if (values == null || values.length == 0) {
			return vMatchedRecords;
		}
		//
		if (fieldNames == null || fieldNames.length == 0) {

			return vMatchedRecords;
		}
		// 要比较的值放到HashMap
		getMatchHM().clear();
		for (int i = 0; i < values.length; i++) {
			if (values[i] != null) {
				getMatchHM().put(RefPubUtil.toLowerCaseStr(this, values[i]),
						RefPubUtil.toLowerCaseStr(this, values[i]));
			}
		}
		vMatchedRecords = new Vector();
		// 在全集中匹配数据
		setIncludeBlurPart(false);
		// 重新载入数据
		Vector data = null;

		data = getRefData();

		if (data != null) {
			for (int i = 0; i < data.size(); i++) {
				Vector vRecord = (Vector) data.elementAt(i);
				if (vRecord != null)

					for (int j = 0; j < fieldNames.length; j++) {
						int col = getFieldIndex(fieldNames[j]);
						if (col < 0 || col >= vRecord.size()) {
							continue;
						}
						if (vRecord.elementAt(col) != null
								&& getMatchHM().get(
										RefPubUtil.toLowerCaseStr(this, vRecord
												.elementAt(col).toString()
												.trim())) != null) {
							vMatchedRecords.addElement(vRecord);
							break;
						}
					}

			}
		}

		if (vMatchedRecords != null && vMatchedRecords.size() == 0)
			vMatchedRecords = null;
		setIncludeBlurPart(true); // 恢复原状态

		return vMatchedRecords;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2005-10-21 17:12:01)
	 * 
	 * @return boolean
	 */
	public boolean isOnlyMneFields() {
		return isOnlyMneFields;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2005-10-21 17:12:01)
	 * 
	 * @param newIsOnlyMneFields
	 *            boolean
	 */
	public void setOnlyMneFields(boolean newIsOnlyMneFields) {
		isOnlyMneFields = newIsOnlyMneFields;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2003-2-19 9:24:17)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getWherePartByFieldsAndValues(String[] fields,
			String[] values) {
		String wherePart = "";
		StringBuffer sb = new StringBuffer();
		if (fields != null && values != null) {
			int length = fields.length;
			for (int i = 0; i < length; i++) {
				if (values.length == 1) {
					// =
					sb.append(fields[i]).append("='").append(values[0]).append(
							"' ");

				} else {
					// in

					sb.append(RefPubUtil.getInSubSql(fields[i], values));

				}

				if (i == length - 1) {
					continue;
				}
				sb.append(" or ");

			}
		} else {
			return null;
		}

		wherePart = sb.toString();
		return wherePart;

	}

	/**
	 * @return Returns the m_addWherePart.
	 */
	public String getAddWherePart() {
		return m_addWherePart;
	}

	public void saveTempData(Object[] retPKs) {

		// 保存Pk 到临时表

		if (retPKs == null || retPKs.length == 0) {
			setTempDataWherePart(null);
			return;
		}

		String pk_ts = null;

		RefdatatempVO[] vos = new RefdatatempVO[retPKs.length];
		for (int i = 0; i < retPKs.length; i++) {
			vos[i] = new RefdatatempVO();
			vos[i].setPk_selecteddata(retPKs[i].toString());
			vos[i].setPk_corp(getPk_corp());
			vos[i].setCuserid(getPk_user());
			vos[i].setRefnodename(getRefNodeName());
			vos[i].setPk_ts("temp");

		}
		try {
			pk_ts = modelHandler.saveRefDataTempVOs(vos);

		} catch (Exception e) {
			Debug.error(e.getMessage(), e);
		}

		String selSql = "select pk_selecteddata from bd_refdatatemp ";
		// 设置临时表取树WherePart
		String wherePart = selSql + " where pk_corp='" + getPk_corp()
				+ "' and cuserid = '" + getPk_user() + "' "
				+ " and refnodename='" + getRefNodeName() + "' and pk_ts = '"
				+ pk_ts + "'";
		setTempDataWherePart(wherePart);

	}

	/**
	 * 设有公式的参照,按公式取值。 创建日期:(2005-3-30 16:19:24)
	 * 
	 */
	public void setColDispValues(Vector vecData, Object[][] dispConverter) {

		if (vecData == null || vecData.size() == 0 || dispConverter == null) {
			return;
		}

		// 列显示转换器循环
		for (int i = 0; i < dispConverter.length; i++) {

			// 列显示转化配置VO
			RefColumnDispConvertVO convertVO = (RefColumnDispConvertVO) dispConverter[i][0];
			if (convertVO == null) {
				continue;
			}
			// 实现类名称
			String className = dispConverter[i][1].toString();

			// 给列显示转化配置VO设置数据主键值
			// convertVO.setPks(pks);
			convertVO.setRefData(vecData);
			// 处理列显示转换
			m_vecData = modelHandler.setColDispValue(vecData, convertVO,
					className);
		}
	}

	/*
	 * 
	 */
	public ReftableVO getRefTableVO(String pk_corp) {

		return modelHandler.getRefTableVO(pk_corp);
	}

	/*
	 * 栏目信息数据放到缓存.
	 */
	public void setReftableVO2Cache(ReftableVO vo, String pk_org) {

		modelHandler.setReftableVO2Cache(vo, pk_org);
	}

	public String getReftableVOCacheKey(String pk_org) {
		String refNodeName = getRefNodeName();

		// if (OrgnizeTypeVO.ZHUZHANG_TYPE.equals(getOrgTypeCode())){
		// pk_org = getPk_GlOrgBook();
		// }else{
		// pk_org = getPk_corp();
		// }
		// 目前还是按当前登录公司来保存栏目信息,以后有需求可以加入对主体账簿的支持

		String key = refNodeName + pk_org;
		return key;
	}

	/*
	 * 查询参照数据以及参照栏目信息数据 1、栏目数据直接放入缓存. 2、参照数据返回
	 */
	public Vector getQueryResultVO() {
		boolean isQueryRefColumn = !modelHandler
				.isReftableVOCached(getPk_corp());

		RefQueryVO queryVO = getRefQueryVO();

		// 目前还是按当前登录公司来保存栏目信息,以后有需求可以加入对主体账簿的支持
		queryVO.setPk_org(getPk_corp());
		RefQueryResultVO resultVO = null;

		resultVO = modelHandler.queryRefdataByQueryVO(queryVO);

		if (resultVO == null) {
			return null;
		}
		Vector v = resultVO.getRefData();
		if (isQueryRefColumn) {
			setReftableVO2Cache(resultVO.getRefTableVO(), getPk_corp());
		}

		return v;
	}

	protected RefQueryVO getRefQueryVO() {
		boolean isQueryRefColumn = !modelHandler
				.isReftableVOCached(getPk_corp());

		queryVO.setDataSourceName(getDataSource());
		queryVO.setRefNodeName(getRefNodeName());
		queryVO.setQuerySql(getRefSql());
		queryVO.setObj(getPara());
		queryVO.setQueryRefColumn(isQueryRefColumn);
		return queryVO;
	}

	/**
	 * 参照标题 创建日期:(01-4-4 0:57:23)
	 * 
	 * @return java.lang.String
	 */
	public String getRefTitle() {
		if (m_strRefTitle != null) {
			return m_strRefTitle;
		}

		m_strRefTitle = modelHandler.getRefNodeName_mLang(getRefNodeName());

		if (m_strRefTitle == null) {
			m_strRefTitle = getRefNodeName();

		}
		return m_strRefTitle;
	}

	/**
	 * @param m_pk_user
	 *            要设置的 m_pk_user。
	 */
	public void setPk_user(String m_pk_user) {
		this.m_pk_user = m_pk_user;
	}

	/*
	 * 给名称字段赋值
	 */
	public void resetFieldName() {
		if (getFieldCode() != null && getTableName() != null
				&& (getFieldName() == null || getFieldName().length == 0)) {

			String[] name = new String[getFieldCode().length];

			for (int i = 0; i < getFieldCode().length; i++) {

				String fieldCode = modelHandler
						.getFieldCodeWithTableName(getFieldCode()[i]);

				String resid = modelHandler.getResID(fieldCode);

				name[i] = modelHandler.getRefMultiLangStr(resid, fieldCode);

			}
			setFieldName(name);
		}
	}

	/**
	 * @return 返回 formulaHandler。
	 */
	private FormulaHandler getFormulaHandler() {
		if (formulaHandler == null) {
			formulaHandler = new FormulaHandler();
		}
		return formulaHandler;
	}

	private DefFieldsHandler getDefFieldHandler() {
		if (defFieldHandler == null) {
			defFieldHandler = new DefFieldsHandler();
		}
		return defFieldHandler;
	}

	/**
	 * 设置自定义数据到指定vecData中的field列。 创建日期:(2005-3-30 16:19:24)
	 * 
	 * @return java.lang.Object[]
	 */
	private void setValuesByFieldName(Vector vecData, Vector newVecData,
			String[] fieldNames) {

		int col = -1;
		for (int i = 0; i < fieldNames.length; i++) {

			col = getFieldIndex(fieldNames[i]);
			Object[] values = (Object[]) newVecData.get(i);
			if (values == null) {
				continue;
			}
			for (int j = 0; j < values.length; j++) {
				Vector vRecord = (Vector) vecData.get(j);
				if (vRecord == null || vRecord.size() == 0 || col < 0
						|| col >= vRecord.size()) {
					continue;
				}

				Object obj = getRefValueVO(vRecord.elementAt(col), values[j]);

				vRecord.setElementAt(obj, col);

			}
		}
	}

	/**
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-5-17</strong>
	 * <p>
	 * 
	 * @param
	 * @return void
	 * @exception BusinessException
	 * @since NC5.0
	 */
	private RefValueVO getRefValueVO(Object originValue, Object newValue) {
		if (originValue instanceof RefValueVO) {
			return (RefValueVO) originValue;
		}
		RefValueVO valueVO = new RefValueVO();
		valueVO.setOriginValue(originValue);
		valueVO.setNewValue(newValue);
		return valueVO;
	}

	/**
	 * @return 返回 m_pk_user。
	 */
	public String getPk_user() {
		if (m_pk_user == null) {
			m_pk_user = modelHandler.getPk_user();
		}
		return m_pk_user;
	}

	/**
	 * 只添加不重复的监听类。
	 * <p>
	 * <strong>最后修改人:sxj</strong>
	 * <p>
	 * <strong>最后修改日期:2006-8-10</strong>
	 * <p>
	 * 
	 * @param
	 * @return void
	 * @exception BusinessException
	 * @since NC5.0
	 */
	public void addChangeListener(ChangeListener l) {

		if (eventListMap.get(l) == null) {
			eListenerList.add(ChangeListener.class, l);
			eventListMap.put(l, l);
		}
	}

	public void removeChangeListener(ChangeListener l) {
		eListenerList.add(ChangeListener.class, l);
		eventListMap.remove(l);
	}

	public ChangeListener[] getChangeListeners() {
		return (ChangeListener[]) eListenerList
				.getListeners(ChangeListener.class);
	}

	public void fireChange() {
		Object[] listeners = eListenerList.getListenerList();
		for (int i = listeners.length - 2; i >= 0; i -= 2) {
			if (listeners[i] == ChangeListener.class) {
				if (changeEvent == null) {
					changeEvent = new ChangeEvent(this);
				}
				((ChangeListener) listeners[i + 1]).stateChanged(changeEvent);
			}
		}
	}

	/**
	 * 显示字段列表 创建日期:(01-4-4 0:57:23)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String[] getFieldCode() {
		return m_strFieldCode;
	}

	/**
	 * 显示字段中文名 创建日期:(01-4-4 0:57:23)
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String[] getFieldName() {
		return m_strFieldName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(2001-8-31 18:59:51)
	 * 
	 * @return java.lang.String
	 */
	public String getGroupCode() {
		return IRefConst.GROUPCORP;
	}

	/**
	 * 主键字段名
	 * 
	 * @return java.lang.String
	 */
	public String getPkFieldCode() {
		return m_strPkFieldCode;
	}

	/**
	 * 参照标题 创建日期:(01-4-4 0:57:23)
	 * 
	 * @return java.lang.String
	 */

	/**
	 * 参照数据库表或者视图名 创建日期:(01-4-4 0:57:23)
	 * 
	 * @return java.lang.String
	 */
	public String getTableName() {
		return m_strTableName;
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-3-22 13:22:29)
	 * 
	 * @param newFieldCode
	 *            java.lang.String[]
	 */
	public void setFieldCode(java.lang.String[] newFieldCode) {
		getHtCodeIndex().clear();
		m_strFieldCode = newFieldCode;
	}

	/**
	 * 此处插入方法说明。 创建日期:(01-3-22 13:22:29)
	 * 
	 * @param newFieldName
	 *            java.lang.String[]
	 */
	public void setFieldName(java.lang.String[] newFieldName) {
		m_strFieldName = newFieldName;
	}

	/**
	 * 主键字段名
	 */
	public void setPkFieldCode(String strPkFieldCode) {
		m_strPkFieldCode = strPkFieldCode;
	}

	/**
	 * @return 返回 m_fun_code_DocOpen。
	 */
	public String getFun_code_DocOpen() {
		return m_fun_code_DocOpen;
	}

	/**
	 * @param docOpen
	 *            要设置的 m_fun_code_DocOpen。
	 */
	public void setFun_code_DocOpen(String docOpen) {
		m_fun_code_DocOpen = docOpen;
	}

	/**
	 * @return 返回 m_intFieldType。
	 */
	public int[] getIntFieldType() {
		return m_intFieldType;
	}

	/**
	 * @param fieldType
	 *            要设置的 m_intFieldType。
	 */
	public void setIntFieldType(int[] fieldType) {
		m_intFieldType = fieldType;
	}

	/**
	 * @return 返回 isGroupAssignData。
	 */
	public boolean isGroupAssignData() {
		return isGroupAssignData;
	}

	/**
	 * @param isGroupAssignData
	 *            要设置的 isGroupAssignData。
	 */
	public void setGroupAssignData(boolean isGroupAssignData) {
		this.isGroupAssignData = isGroupAssignData;
	}

	public String getRefDataCacheKey() {
		String key = refDataCachekeyPreStr
				+ getDataPowerSqlKey(getTableName(), getRefNodeName());

		return key;
	}

	public String getFieldShowName(String fieldCode) {
		int index = getFieldIndex(fieldCode);
		if (index < 0 || index > getFieldName().length - 1) {
			return null;
		} else {
			return getFieldName()[index];
		}
	}

	/**
	 * @return 返回 ddReaderVO。
	 */
	private DDReaderVO getDdReaderVO() {
		return ddReaderVO;
	}

	/**
	 * @param ddReaderVO
	 *            要设置的 ddReaderVO。
	 */
	public void setDdReaderVO(String tableName, String[] fieldnames) {
		if (ddReaderVO == null) {
			ddReaderVO = new DDReaderVO();
		}
		ddReaderVO.setTableName(tableName);
		ddReaderVO.setFieldNames(fieldnames);
	}

	/**
	 * @return 返回 resourceID。
	 */
	public int getResourceID() {
		return resourceID;
	}

	/**
	 * @param resourceID
	 *            要设置的 resourceID。
	 */
	public void setResourceID(int resourceID) {
		this.resourceID = resourceID;
	}

	/**
	 * @return 返回 isPKMatch。
	 */
	public boolean isPKMatch() {
		return isPKMatch;
	}

	/**
	 * @param isPKMatch
	 *            要设置的 isPKMatch。
	 */
	public void setPKMatch(boolean isPKMatch) {
		this.isPKMatch = isPKMatch;
	}

	/**
	 * @return 返回 isIncludeBlurPart。
	 */
	public boolean isIncludeBlurPart() {
		return isIncludeBlurPart;
	}

	/**
	 * @param isIncludeBlurPart
	 *            要设置的 isIncludeBlurPart。
	 */
	public void setIncludeBlurPart(boolean isIncludeBlurPart) {
		this.isIncludeBlurPart = isIncludeBlurPart;
	}

	/**
	 * @return 返回 envWherePart。
	 */
	private String getEnvWherePart() {
		return envWherePart;
	}

	/**
	 * 设置条件时,要利用参照的环境变量的方法去拼条件,否则无法根据环境变量的变化而变化。 例如:
	 * 
	 * @param envWherePart
	 *            要设置的 envWherePart。
	 */
	public void setEnvWherePart(String envWherePart) {
		this.envWherePart = envWherePart;
	}

	/**
	 * 
	 */
	private void addEnvWherePart(StringBuffer whereClause) {
		// setpk ,不包含此条件
		if (isPKMatch()) {
			return;
		}
		String wherePart = getEnvWherePart();
		if (wherePart != null) {

			whereClause.append(" and (").append(wherePart).append(") ");

		}

	}

	/**
	 * @return 返回 bdinfoVO。
	 */
	public BdinfoVO getBdinfoVO() {
		if (bdinfoVO == null && !isInitBDinfoVO) {
			bdinfoVO = modelHandler.getBdInfoVObyName(getRefNodeName());
			isInitBDinfoVO = true;
		}
		return bdinfoVO;
	}

	/**
	 * @param bdinfoVO
	 *            要设置的 bdinfoVO。
	 */
	public void setBdinfoVO(BdinfoVO bdinfoVO) {
		this.bdinfoVO = bdinfoVO;
		isInitBDinfoVO = true;
	}

	/**
	 * @return Returns the isChangeTableSeq.
	 */
	public boolean isChangeTableSeq() {
		return isChangeTableSeq;
	}

	/**
	 * @param isChangeTableSeq
	 *            The isChangeTableSeq to set.
	 */
	public void setChangeTableSeq(boolean isChangeTableSeq) {
		this.isChangeTableSeq = isChangeTableSeq;
	}

	/**
	 * @return 返回 isMaintainButtonEnabled。
	 */
	public boolean isMaintainButtonEnabled() {
		return isMaintainButtonEnabled;
	}

	/**
	 * @param isMaintainButtonEnabled
	 *            要设置的 isMaintainButtonEnabled。
	 */
	public void setMaintainButtonEnabled(boolean isMaintainButtonEnabled) {
		this.isMaintainButtonEnabled = isMaintainButtonEnabled;
	}

	/**
	 * @param dataPowerPK_column
	 *            要设置的 dataPowerPK_column。
	 */
	public void setDataPowerResourceColumn(String dataPowerResourceColumn) {
		this.dataPowerResourceColumn = dataPowerResourceColumn;
	}

	/**
	 * @return 返回 refCardInfoComponentImplClass。
	 */
	public String getRefCardInfoComponentImplClass() {
		return refCardInfoComponentImplClass;
	}

	/**
	 * @param refCardInfoComponentImplClass
	 *            要设置的 refCardInfoComponentImplClass。
	 */
	public void setRefCardInfoComponentImplClass(
			String refCardInfoComponentImplClass) {
		this.refCardInfoComponentImplClass = refCardInfoComponentImplClass;
	}

	public String getRefShowNameField() {
		return refShowNameField == null ? getRefNameField() : refShowNameField;
	}

	public void setRefShowNameField(String refShowNameField) {
		this.refShowNameField = refShowNameField;
	}

	// 初始化自定义项字段
	// defFields.length==0表示初始化过了。
	public String[] getDefFields() {
		return defFields;
	}

	/**
	 * 栏目显示的自定义项
	 * 
	 * @return
	 */
	public String[] getShowDefFields() {
		String[] defFieldNames = null;
		if (getDefFields() == null || getDefFields().length == 0) {
			return defFieldNames;
		}

		Map<String, RefcolumnVO> map = modelHandler.getRefColumnVOsMap();

		List<String> list = new ArrayList<String>();
		for (int i = 0; i < getDefFields().length; i++) {
			if (map.get(getDefFields()[i]) != null
					&& map.get(getDefFields()[i]).getIscolumnshow()
							.booleanValue()) {
				list.add(getDefFields()[i]);
			}
		}

		if (list.size() > 0) {
			String[] fieldNames = new String[list.size()];
			list.toArray(fieldNames);
			defFieldNames = fieldNames;
		}

		return defFieldNames;
	}

	public void setDefFields(String[] defFields) {
		this.defFields = defFields;
	}

	public Map<String, Integer> getAlignMap() {
		return alignMap;
	}

	private void setAlignMap(Map<String, Integer> alignMap) {
		this.alignMap = alignMap;
	}

	/**
	 * 栏目对齐方式
	 * 
	 * @param fieldName
	 *            栏目名称 要对齐的列(列名要和fieldCodes中的一致)
	 * @param alignment
	 *            对齐方式 常量见SwingConstants,例如 SwingConstants.RIGHT
	 */
	public void addFieldAlignment(String fieldName, int alignment) {
		if (getAlignMap() == null) {
			setAlignMap(new HashMap<String, Integer>());
		}
		getAlignMap().put(fieldName, new Integer(alignment));
	}

	public boolean canUseDB() {
		return modelHandler.canUseDB();
	}

	public Vector getCacheValue(String sql) {
		return modelHandler.getCacheValue(sql);
	}

	public Vector queryMain(String dsName, String sql) {
		return modelHandler.queryMain(dsName, sql);
	}

	public void removeCacheValue(String sql) {
		modelHandler.removeCache(sql);
	}

	public void setCacheValue(String sql, Vector value) {
		modelHandler.setCacheValue(sql, value);
	}

	public String getCodeRuleFromPara(String orgTypeCode, String pk_GlOrgBook,
			String codingRule, UFBoolean boolean1) {
		return modelHandler.getCodeRuleFromPara(orgTypeCode, pk_GlOrgBook,
				codingRule, boolean1);
	}

	public String getCodeRuleFromPara(String codingRule) {
		return modelHandler.getCodeRuleFromPara(codingRule);
	}

	public String getNumberCodingRule(String codingRule) {
		return modelHandler.getNumberCodingRule(codingRule);
	}

	public String[] getDefFields(String[] fieldCode) {
		return modelHandler.getDefFields(fieldCode);
	}

	public String getPara1() {
		return para1;
	}

	public void setPara1(String para1) {
		this.para1 = para1;
	}

	public String getPara2() {
		return para2;
	}

	public void setPara2(String para2) {
		this.para2 = para2;
	}

	public String getPara3() {
		return para3;
	}

	public void setPara3(String para3) {
		this.para3 = para3;
	}

	protected IRefModelHandler getModelHandler() {
		return modelHandler;
	}

	public String getUiControlComponentClassName() {
		return uiControlComponentClassName;
	}

	public void setUiControlComponentClassName(
			String uiControlComponentClassName) {
		this.uiControlComponentClassName = uiControlComponentClassName;
	}

	/**
	 * 界面控制组件变化时调用该方法,在子类实现具体业务逻辑。
	 * 
	 * @param eventData
	 *            暂时返回发生变化的组件名称
	 */
	public void UiControlClassValueChanged(UIControlClassEvent event) {

	}

	public String getRefDocEditClassName() {
		return refDocEditClassName;
	}

	public void setRefDocEditClassName(String refDocEditClassName) {
		this.refDocEditClassName = refDocEditClassName;
	}

	public boolean isShowField(String fieldName) {
		boolean isShowField = false;
		int[] showColumns = getShownColumns();
		int index = getFieldIndex(fieldName);
		for (int i = 0; i < showColumns.length; i++) {
			if (showColumns[i] == index) {
				isShowField = true;
				break;
			}
		}
		return isShowField;
	}

	public String[] getShowFields() {
		String[] showFields = new String[getShownColumns().length];
		int fieldCodeLength = getFieldCode().length;
		for (int i = 0; i < showFields.length; i++) {
			int index = getShownColumns()[i];
			if (index < fieldCodeLength) {
				showFields[i] = getFieldCode()[index];
			} else {
				Logger.debug("参照栏目信息有误,请点击参照栏目中的重置按钮。该参照为:" + getRefNodeName());
			}
		}
		return showFields;
	}

	public boolean isHiddenField(String fieldCode) {

		return hiddenFieldList.contains(fieldCode);
	}

	// 输入时是否大小写敏感
	public boolean isCaseSensitve() {
		return isCaseSensitve;
	}

	public void setCaseSensive(boolean isCaseSensitve) {
		this.isCaseSensitve = isCaseSensitve;
	}

	public Vector getAllColumnNames() {

		if (vecAllColumnNames != null) {
			return vecAllColumnNames;
		}

		vecAllColumnNames = new Vector();
		if (getFieldCode() != null && getFieldCode().length > 0) {
			if (getFieldName() == null || getFieldName().length == 0) {
				for (int i = 0; i < getFieldCode().length; i++) {
					vecAllColumnNames.addElement(getFieldCode()[i]);
				}
			} else {
				if (getFieldName().length >= getFieldCode().length) {
					for (int i = 0; i < getFieldCode().length; i++) {
						vecAllColumnNames.addElement(getFieldName()[i]);
					}
				} else {
					for (int i = 0; i < getFieldName().length; i++) {
						vecAllColumnNames.addElement(getFieldName()[i]);
					}
					for (int i = getFieldName().length; i < getFieldCode().length; i++) {
						vecAllColumnNames.addElement(getFieldCode()[i]);
					}
				}
			}

		}

		if (getHiddenFieldCode() != null)
			for (int i = 0; i < getHiddenFieldCode().length; i++) {
				vecAllColumnNames.addElement(getHiddenFieldCode()[i]);
			}

		// 加入动态列
		if (isDynamicCol()) {

			String[] dynamicColNames = getDynamicFieldNames();
			if (getDynamicFieldNames() != null) {

				for (int i = 0; i < dynamicColNames.length; i++) {

					// 加入到显示的列名中
					vecAllColumnNames.addElement(dynamicColNames[i]);
				}
			}
		}
		return vecAllColumnNames;
	}

	protected String getRefCacheSqlKey() {

		return getRefSql() == null ? getClass().getName() : getRefSql();
	}
}
 
分享到:
评论

相关推荐

    UAP ,NC65树表型参照

    根据给定文件的信息,我们可以提炼出以下IT领域的关键知识点: ...综上所述,UAP NC65树表型参照涉及了数据库操作、引用模型类的设计与实现、数据模型设计等多个方面,是IT领域中一项重要的技术实践。

    8.参照开发.pdf

    NC65参照开发文档,参考开发分为单表型,树型,树表型参照,此文档都有记录

    用友U8C参照开发-20190421.pptx

    1. **RefModel的开发**:首先需要开发一个RefModel类,该类继承自`AbstractRefTreeModel`或相关基类,并实现必要的方法如`setRefNodeName`、`setFieldCode`等来定义参照的行为。 ```java public class ...

    单项海洋环境影响评价等级表.docx

    单项海洋环境影响评价等级表.docx

    基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】

    【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 完全多元图的最大匹配问题研究 共9页.pdf

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 完全多元图的最大匹配问题研究 共9页.pdf

    毕设源码-基于Python Web的社区爱心养老管理系统设计与实现_hvhwz--论文-期末大作业+说明文档.rar

    本项目是基于Python Web的社区爱心养老管理系统,旨在为社区养老提供一个全面、高效的管理平台。系统集成了用户管理、老人信息管理、健康管理、活动管理、服务管理等多项功能,通过简洁明了的界面,让管理人员能够轻松地进行各项操作,从而更好地服务于社区老人。 在架构上,系统采用B/S模式,前端使用HTML、CSS、JavaScript等技术,搭配Vue.js框架,实现了用户友好的交互界面;后端则基于Python的Django框架,提供了稳定且高效的服务端逻辑处理能力。数据库选用MySQL,确保了数据的存储安全和高效访问。 开发此项目的目的,不仅是为了满足计算机相关专业学生的毕设需求,提供一个实战练习的平台,更是希望通过实际项目的开发,培养学生的专业技能和实践能力,同时,也希望能为社区养老服务贡献一份力量,通过科技手段,让老年人的生活更加美好、便捷。

    教学版单体spring-petlinic,课程《Kubernetes微服务实践》.zip

    教学版单体spring-petlinic,课程《Kubernetes微服务实践》

    密码学领域的Vigenère多表密码算法解析与实现

    内容概要:本文介绍了16世纪法国外交家Blaise de Vigenère提出的一种多表密码算法,详细解释了Vigenère密码的加密解密机制及其历史应用背景。特别提到了当明文M的长度超过密钥K的情况下,密钥会被重复使用的技巧。 适合人群:对古典密码学感兴趣的初学者,以及希望深入理解密码编码基本原理的学习者。 使用场景及目标:了解Vigenère密码的工作原理,掌握简单的加解密技术,增强信息安全意识。能够自行实施加解密操作,理解经典密码学的基本概念和技术。 其他说明:本文不仅提供了理论讲解,还给出了具体的例子帮助理解和实操练习。

    STM32-EMBPI.PDF

    STM32-EMBPI : Embedded Pi, triple-play platform for STM32, Raspberry Pi and Arduino

    电子电气架构-汽车网络管理策略分析(整车至单件层面)

    内容概要:本文主要探讨了电子电气架构中的网络管理策略,尤其是针对汽车中多个ECU(Electronic Control Unit)的协同管理和低功耗设计。通过引入网络管理状态机的概念,详细介绍了各状态(如常规运行状态、重复报文状态、准备睡眠模式、预睡眠模式、深度睡眠模式等)的具体运作机制及其在汽车电子系统中的重要性。文中还讨论了网络管理报文的设计与传输规则,特别是控制位向量CBV的定义,强调了网络管理在节能降耗方面的关键作用。 适用人群:具备一定汽车电子工程背景的专业人士或研究者,尤其对网络管理及低功耗设计感兴趣的工程师。 使用场景及目标:适用于汽车设计与制造企业的研发部门,帮助其优化电子控制系统,提升产品能效比,降低维护成本,提高用户体验。通过对网络管理策略的理解与应用,达到降低车载电子系统功耗的目的,进而延长电动车的续航能力和降低传统燃油车的油耗。 其他说明:文章不仅提供了理论上的阐述,还包括了具体的操作指南和技术细节,有助于从业者深入理解和实施网络管理方案。同时提醒在现代信息化社会中保持屏蔽力的重要性,鼓励读者专注于自己的发展目标,避免无效的精力分散。

    英飞凌TC3XX-MCAL培训PPT

    英飞凌TC3XX_MCAL培训PPT

    缴费综合服务系-JAVA-基于springBoot高校网上缴费综合服务系统设计与实现

    缴费综合服务系-JAVA-基于springBoot高校网上缴费综合服务系统设计与实现

    Python与机器学习方向,《TensorFlow基础教程》课程仓库.zip

    Python与机器学习方向,《TensorFlow基础教程》课程仓库

    本科毕业设计 基于Python+Django教学资源管理系统网站详细文档+全部资料.zip

    【资源说明】 本科毕业设计 基于Python+Django教学资源管理系统网站详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    电动汽车与软件定义汽车(SDV)时代的汽车行业数字化转型

    内容概要:文章详细讨论了汽车行业正经历的重大变革,尤其是电动汽车(EV)和软件定义汽车(SDV)对行业的深远影响。随着技术的进步,汽车的差异化优势不再仅限于机械硬件,而是越来越多地取决于软件和服务。这一转型要求汽车制造商重新评估现有的解决方案堆栈,加大在电气化和连接性等领域的投资,以实现车型的电气化并支持可扩展性和全生命周期更新。同时,汽车的开发重点已经从机电领域转向了芯片和软件领域,强调基于云计算的协作开发方法。 适合人群:汽车行业专业人士、汽车电子工程师、技术研发人员及政策制定者。 使用场景及目标:帮助读者理解和把握汽车行业数字化转型的趋势,指导他们在电动汽车和软件定义汽车领域做出正确的技术投资和战略调整。 其他说明:本文不仅讨论了技术变革,还深入剖析了由此带来的商业和运营模式的变化,为汽车行业的未来发展方向提供了洞见。

    微信课堂助手 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程.zip

    微信课堂助手 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程

    新设博士后科研工作站备案申请表.xlsx

    新设博士后科研工作站备案申请表.xlsx

    的玩具 Python 实现.zip

    的玩具 Python 实现手套蟒蛇GloVe的玩具 Python 实现。Glove 产生单词的密集向量嵌入,其中一起出现的单词在生成的向量空间中靠得很近。虽然这会产生与word2vec (在gensim中有一个很棒的 python 实现)类似的嵌入,但方法不同GloVe 通过对语料库词共现矩阵的对数进行分解来产生嵌入。代码采用异步随机梯度下降,用Cython实现,很可能存在大量bug。安装使用 pip 从 pypi 安装pip install glove_python。OSX 用户请注意由于使用 OpenMP,glove-python 无法在 Clang 下编译。要安装它,您需要一个较新的版本gcc(例如来自 Homebrew)。应该由 接收setup.py如果没有,请打开一个问题。使用 OSX 中包含的默认 Python 发行版进行构建也不受支持请尝试 Homebrew 或 Anaconda 中的版本。用法生成嵌入分为两个步骤从语料库中创建共现矩阵,然后使用它生成嵌入。该类Corpus有助于从可交互的标记构建语料库该类Glove训练嵌入(使

Global site tag (gtag.js) - Google Analytics