private void InitModel(string modelname) { CustomClassCache.DelComboCache(); /* remoting * string sql = string.Format("SELECT * FROM sys_modl_def WHERE modelname_en='{0}'", modelname); * DataTable tbl = Helper.GetDataTable(sql, Conn); */ string filter = string.Format("modelname_en='{0}'", modelname); DataTable tbl = Helper.GetDataTableProxy("sys_modl_def", filter, null, Conn); DataRow row = tbl.Rows[0]; string modl_id = row["id"].ToString(); // 模块id ModID = Convert.ToInt32(modl_id); //不检查调试库中的内容 if (MainForm.conn.Database.ToString().ToLower() != "s3design" && MainForm.conn.Database.ToString().ToLower() != "s3design_debug") { // 当前用户能否执行保存命令 /* remoting * sql = string.Format("SELECT * FROM sys_useracl_desc WHERE userindex = {0} AND moduleid = {1} AND canwrite = 1", Program.m_rightmgr._userindex, this.ModID); * DataTable tbl_acl_desc = Helper.GetDataTable(sql, Conn); */ filter = string.Format("userindex = {0} AND moduleid = {1} AND canwrite = 1", Program.m_rightmgr._userindex, this.ModID); DataTable tbl_acl_desc = Helper.GetDataTableProxy("sys_useracl_desc", filter, null, Conn); if (tbl_acl_desc.Rows.Count > 0) { this.CanSaveDB = true; } // 当前用户能否配置表元 /* remoting * sql = string.Format("SELECT * FROM sys_useracl_desc WHERE userindex = {0} AND moduleid = {1} AND canconfigmeta = 1", Program.m_rightmgr._userindex, this.ModID); * tbl_acl_desc = Helper.GetDataTable(sql, Conn); */ filter = string.Format("userindex = {0} AND moduleid = {1} AND canconfigmeta = 1", Program.m_rightmgr._userindex, this.ModID); tbl_acl_desc = Helper.GetDataTableProxy("sys_useracl_desc", filter, null, Conn); if (tbl_acl_desc.Rows.Count > 0) { this.CanCfg = true; } } // 模块名 ModelName = modelname; this.bar1.Text = ModelName + "树"; // 模块中文名 this.Text = ModelName; // 主表名 /* * sql = string.Format("SELECT * FROM sys_modl_tab_def WHERE modid='{0}'", modl_id); * DataTable tbl_tab_def = Helper.GetDataTable(sql, Conn); */ filter = string.Format("modid='{0}'", modl_id); DataTable tbl_tab_def = Helper.GetDataTableProxy("sys_modl_tab_def", filter, null, Conn); if (tbl_tab_def.Rows.Count < 1) { MessageBox.Show("在表 sys_modl_tab_def 中找不到模块的信息。请检查相关数据表。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataRow row_tab = tbl_tab_def.Rows[0]; MainTableName = row_tab["tablename"].ToString().Trim(); // 主表 //TblMain = Helper.GetDataTable("SELECT * FROM " + MainTableName, Conn); //TblMain = Helper.GetDataTableProxy(MainTableName, Conn); TblMain = Helper.GetDataTableTopRowProxy(MainTableName, Conn); HasDefaultRow = Helper.HasTableDefaultRow(MainTableName, Conn); // 显示的字段 DisplayField = row_tab["display_field"].ToString().Trim(); // tree分类的字段们 CatFields = row_tab["catfields"].ToString().Trim().Split(new char[] { ',' }); // 显示字段也用来作分类吗 CatfieldsContainsDisplayfield = false; foreach (string str in CatFields) { if (str == DisplayField) { CatfieldsContainsDisplayfield = true; break; } } ArrayList arrDBPrimaryKey = new ArrayList(); // 显示字段是key foreach (DataColumn col in TblMain.PrimaryKey) { if (col.ColumnName == DisplayField) { KeysContainsDisplayfileld = true; //break; } arrDBPrimaryKey.Add(col.ColumnName); } // 分类字段中有key吗 foreach (DataColumn col in TblMain.PrimaryKey) { foreach (string strCat in CatFields) { if (strCat == col.ColumnName) { CatFieldsContainsKey = true; break; } } } if (CatFieldsContainsKey) { for (int i = 0; i < TblMain.PrimaryKey.Length; i++) { string strkey = TblMain.PrimaryKey[i].ColumnName; bool bThisKeyInCat = false; foreach (string strCat in CatFields) { if (strkey == strCat) { bThisKeyInCat = true; } } if (!bThisKeyInCat) { ToChangeIndex = i; break; } } } // 新建记录时的起始 id UpdateStartIDs(); // 分页们 m_Pages = new ArrayList(); bool bFirstTab = true; foreach (DataRow r in tbl_tab_def.Rows) { bool bCustom = false; if (r["custom_tab"] != DBNull.Value) { bCustom = (r["custom_tab"].ToString().Trim() == "1"); } PageDesc tab = new PageDesc(); tab.id = Convert.ToInt32(r["modtabid"]); tab.name_cn = r["name"].ToString(); tab.bCustomTab = bCustom; if (!bCustom) { tab.pg = new PropertyGrid(); this.contextMenuBar1.SetContextMenuEx(tab.pg, this.cmScriptOp); } AddTab(ref tab, bFirstTab); bFirstTab = false; tab.dbClass = new DBCustomClass(null, m_lua, tab.id, -1); tab.Properties = tab.dbClass; tab.dbClass.OnAsynNotify += new DBCustomClass.AsynNotifyHandler(OnAsynNotify); //todo:增加子结点中的Onasynnotify m_Pages.Add(tab); } if (arrDBPrimaryKey.Count > 0) { m_recLock = new RecordLockEx(Conn, MainTableName, (string[])arrDBPrimaryKey.ToArray(typeof(string)), ModID); } }
private void InitMetaInfo(object parent, LuaEx lua, int nTabId, int nParentFieldId) { m_findkeyvalues = null; m_lua = lua; // 根据ParentFieldid不同,获取结果完全不同 = -1表示第一层 string strParentField = nParentFieldId >= 0 ? " AND parentfield=" + nParentFieldId : "AND (parentfield IS NULL OR parentfield = '0')"; // 根据TabId 获取主模块id DataTable tbl = CustomClassCache.GetModTabDefProxy("sys_modl_tab_def", string.Format("SELECT modid FROM sys_modl_tab_def WHERE modtabid = {0}", nTabId)); int nModalId = int.Parse(tbl.Rows[0][0].ToString()); // 获取本Tab页主表名 tbl = CustomClassCache.GetModTabDefProxy("sys_modl_tab_def", string.Format("SELECT tablename, catfields FROM sys_modl_tab_def WHERE modid = {0} AND modtabid = {1}", nModalId, nTabId)); m_TabMainTableName = tbl.Rows[0]["tablename"].ToString().Trim(); // no lower here. if (nParentFieldId < 0) { m_strCats = GetFieldStr(tbl.Rows[0], "catfields").Split(new char[] { ',' }); } // 获取本层主表名 string currentTableName = null; tbl = CustomClassCache.GetModTabDefProxy("sys_meta_info", string.Format("SELECT tablename, fieldname FROM sys_meta_info WHERE fieldid = {0}", nParentFieldId)); if (tbl.Rows.Count > 0) { currentTableName = tbl.Rows[0]["tablename"].ToString().Trim(); // no lower here. } if (nParentFieldId >= 0) { m_strMainTableName = currentTableName; } else { m_strMainTableName = m_TabMainTableName; } // 生成 metainfo SQL语句, 只选择当前可见的字段 m_strMetaSql = string.Format("SELECT * FROM sys_meta_info WHERE modtabid = {0} {1} ORDER BY {2}", nTabId, strParentField, "orderno"); DataTable metatbl = CustomClassCache.GetDbMetaInfoProxy("sys_meta_info", m_strMetaSql); // visible设置不可用,隐藏之后会找不到该字段 StringBuilder visibleFields = new StringBuilder(); if (m_strMainTableName != m_TabMainTableName) // 和模块主表相同则直接从Cache里取记录即可 { List<string> visibleFieldList = new List<string>(); List<string> primaryKeyList = CustomClassCache.GetPrimaryKeys(m_strMainTableName); foreach (DataRow row in metatbl.Rows) { string fieldType = row["fieldtype"].ToString(); if (fieldType != "1") { visibleFieldList.Add(GetFieldStr(row, "fieldname")); } else { // 虚拟字段需要读取关联条件相关字段的信息 List<string> splitFiledList = GetSplitField(row["subtablefilter"].ToString(), false); foreach (string s in splitFiledList) { if (!visibleFieldList.Contains(s)) { visibleFieldList.Add(s); } } } } // 需要读父结点的关联信息 if (parent != null && (parent as DBCustomClass).m_nParentFieldType == 1) { tbl = CustomClassCache.GetDbMetaInfoProxy("sys_meta_info", string.Format("SELECT subtablefilter FROM sys_meta_info WHERE fieldid = '{0}'", nParentFieldId.ToString())); List<string> splitFiledList = GetSplitField(tbl.Rows[0]["subtablefilter"].ToString(), true); foreach (string s in splitFiledList) { if (!visibleFieldList.Contains(s)) { visibleFieldList.Add(s); } } } // 加入主键 foreach (string s in primaryKeyList) { string keyField = s.ToLower(); if (!visibleFieldList.Contains(keyField)) { visibleFieldList.Add(keyField); } } foreach (string s in visibleFieldList) { visibleFields.Append(string.Format("[{0}],", s)); } if (visibleFields.Length > 0) { visibleFields.Remove(visibleFields.Length - 1, 1); } } string strVisibleFeilds = visibleFields.ToString(); //m_strSql = string.Format("SELECT {1} FROM {0}", m_strMainTableName, strVisibleFeilds.Length > 0 ? strVisibleFeilds : "*"); m_strSql = string.Format("SELECT {1} FROM {0}", m_strMainTableName, "*"); m_nModlId = nModalId; m_nModlTabId = nTabId; m_nParentFieldId = nParentFieldId; m_parent = parent; // 查找主键 m_strPrimaryKeys = GetPrimaryKeys(); InitMetaInfo(m_strSql); // 初始化行锁 m_reclock = new RecordLockEx(Conn, m_strMainTableName, m_strDBPrimaryKeys, m_nModlId); }
private void InitModel(string modelname) { CustomClassCache.DelComboCache(); /* remoting string sql = string.Format("SELECT * FROM sys_modl_def WHERE modelname_en='{0}'", modelname); DataTable tbl = Helper.GetDataTable(sql, Conn); */ string filter = string.Format("modelname_en='{0}'", modelname); DataTable tbl = Helper.GetDataTableProxy("sys_modl_def", filter, null, Conn); DataRow row = tbl.Rows[0]; string modl_id = row["id"].ToString(); // 模块id ModID = Convert.ToInt32(modl_id); //不检查调试库中的内容 if (MainForm.conn.Database.ToString().ToLower() != "s3design" && MainForm.conn.Database.ToString().ToLower() != "s3design_debug") { // 当前用户能否执行保存命令 /* remoting sql = string.Format("SELECT * FROM sys_useracl_desc WHERE userindex = {0} AND moduleid = {1} AND canwrite = 1", Program.m_rightmgr._userindex, this.ModID); DataTable tbl_acl_desc = Helper.GetDataTable(sql, Conn); */ filter = string.Format("userindex = {0} AND moduleid = {1} AND canwrite = 1", Program.m_rightmgr._userindex, this.ModID); DataTable tbl_acl_desc = Helper.GetDataTableProxy("sys_useracl_desc", filter, null, Conn); if (tbl_acl_desc.Rows.Count > 0) this.CanSaveDB = true; // 当前用户能否配置表元 /* remoting sql = string.Format("SELECT * FROM sys_useracl_desc WHERE userindex = {0} AND moduleid = {1} AND canconfigmeta = 1", Program.m_rightmgr._userindex, this.ModID); tbl_acl_desc = Helper.GetDataTable(sql, Conn); */ filter = string.Format("userindex = {0} AND moduleid = {1} AND canconfigmeta = 1", Program.m_rightmgr._userindex, this.ModID); tbl_acl_desc = Helper.GetDataTableProxy("sys_useracl_desc", filter, null, Conn); if (tbl_acl_desc.Rows.Count > 0) this.CanCfg = true; } // 模块名 ModelName = modelname; this.bar1.Text = ModelName + "树"; // 模块中文名 this.Text = ModelName; // 主表名 /* sql = string.Format("SELECT * FROM sys_modl_tab_def WHERE modid='{0}'", modl_id); DataTable tbl_tab_def = Helper.GetDataTable(sql, Conn); */ filter = string.Format("modid='{0}'", modl_id); DataTable tbl_tab_def = Helper.GetDataTableProxy("sys_modl_tab_def", filter, null, Conn); if (tbl_tab_def.Rows.Count < 1) { MessageBox.Show("在表 sys_modl_tab_def 中找不到模块的信息。请检查相关数据表。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataRow row_tab = tbl_tab_def.Rows[0]; MainTableName = row_tab["tablename"].ToString().Trim(); // 主表 //TblMain = Helper.GetDataTable("SELECT * FROM " + MainTableName, Conn); //TblMain = Helper.GetDataTableProxy(MainTableName, Conn); TblMain = Helper.GetDataTableTopRowProxy(MainTableName, Conn); HasDefaultRow = Helper.HasTableDefaultRow(MainTableName, Conn); // 显示的字段 DisplayField = row_tab["display_field"].ToString().Trim(); // tree分类的字段们 CatFields = row_tab["catfields"].ToString().Trim().Split(new char[] { ',' }); // 显示字段也用来作分类吗 CatfieldsContainsDisplayfield = false; foreach (string str in CatFields) { if (str == DisplayField) { CatfieldsContainsDisplayfield = true; break; } } ArrayList arrDBPrimaryKey = new ArrayList(); // 显示字段是key foreach (DataColumn col in TblMain.PrimaryKey) { if (col.ColumnName == DisplayField) { KeysContainsDisplayfileld = true; //break; } arrDBPrimaryKey.Add(col.ColumnName); } // 分类字段中有key吗 foreach (DataColumn col in TblMain.PrimaryKey) { foreach (string strCat in CatFields) { if (strCat == col.ColumnName) { CatFieldsContainsKey = true; break; } } } if (CatFieldsContainsKey) { for (int i = 0; i < TblMain.PrimaryKey.Length; i++) { string strkey = TblMain.PrimaryKey[i].ColumnName; bool bThisKeyInCat = false; foreach (string strCat in CatFields) { if (strkey == strCat) { bThisKeyInCat = true; } } if (!bThisKeyInCat) { ToChangeIndex = i; break; } } } // 新建记录时的起始 id UpdateStartIDs(); // 分页们 m_Pages = new ArrayList(); bool bFirstTab = true; foreach (DataRow r in tbl_tab_def.Rows) { bool bCustom = false; if (r["custom_tab"] != DBNull.Value) bCustom = (r["custom_tab"].ToString().Trim() == "1"); PageDesc tab = new PageDesc(); tab.id = Convert.ToInt32(r["modtabid"]); tab.name_cn = r["name"].ToString(); tab.bCustomTab = bCustom; if (!bCustom) { tab.pg = new PropertyGrid(); this.contextMenuBar1.SetContextMenuEx(tab.pg, this.cmScriptOp); } AddTab(ref tab, bFirstTab); bFirstTab = false; tab.dbClass = new DBCustomClass(null, m_lua, tab.id, -1); tab.Properties = tab.dbClass; tab.dbClass.OnAsynNotify += new DBCustomClass.AsynNotifyHandler(OnAsynNotify); //todo:增加子结点中的Onasynnotify m_Pages.Add(tab); } if (arrDBPrimaryKey.Count > 0) m_recLock = new RecordLockEx(Conn, MainTableName, (string[])arrDBPrimaryKey.ToArray(typeof(string)), ModID); }