--------------------------------------------
1。是否允许同时增删改多行?如果允许,是否需要引入事务???中途出错怎么处理??
2。在页面取消一个操作时,是否要重新查询
3。执行服务出错是否需要按钮状态保持- - //暂时保持
4.删除组时,是否要查看组下面是否有单位存在??--是否建立了外键??
5. 复制新增咋不能用啦??-----它会自动根据你选择的行,是否可以复制新增而是否显示
6。.做日历模板改咋做里?不清楚内部逻辑--
(!)05中,哪个是主键:模板id,星期,属性--共同做主键? 是共同做主键,修改时不可修改
(2)删除04表时,是否要把05表对应的删除掉 -- 是,05表是由根据04表的id来查询的,若没了04表中对应数据,对用户来说,05表中数据不可见
(3)是否允许删除多行..-功能键主要是对哪个gridview的操作,,哪个tab页为当前页,操作哪个不太合理,因可以来回变动--设置为不可来回变动的,用一个bool值表示是否点击了2步操作的按钮
另用一个int值表示当前所应保持的tab页..
(4)所有表数据将来会有个主键,rec_id是通过GUID生成的,使用:System.Guid.NewGuid().ToString();将产生一个唯一的字符串.世界唯一,干!
(5)EIInfo没能找到合适的行过滤的方法,,用DetaView不方便.查询多次有损效率,,郁闷--需求,当选择模板id时,根据id查询具体模板,然后在显示时,按照星期字段,分别显示在七个不同的grid中..
(6)重构,重构,,干,,貌似很多相似的方法都可以再继续重构-->结果成了,方法名套方法名-,再套方法名---究竟是好还是不好呢??是清晰了还是更复杂啦?
(7)TTA数据字典..公司内部操作数据库的工具可能和 dbDesinger相似,,没用户名密码不能深层研究下
(8)笔记本功能键要去了解下,,干Fn+ F11把无线关了..省的它自动搜索,不停弹出图标提示,已连接
(9)还是得抽时间,细看下所谓的业务流程,别总想着有人解释,总想着做时在看
------
FMBD05: 多记录区域1,2,3,对应06,07.08表,查询区域06。.复制区域 2个下拉框,新增区域?
日,周,月 对应什么????
新增区域的: 日历,使用基本日历,工作时间模板什么意思
--------------------------------------------
SELECT * from test where code_name = dbo.nvl(@NAME,code_name) and code_id = dbo.nvl(@ID,code_id)
dbo.nvl()使用方法,判断是否是空值,空值则取后一个参数的值,当后一个参数为列名时--也即表示,当后一个参数为空时,后一个参数将不作为选择条件,因如code_name=code_name
在程序中的使用--针对一个表即可只写一个查询即可,列出所有字段,对于不做为查询依据的只要为该值赋空值即可
当在efgrid中添加一列时,默认没有列明称,当使用该控件时就会报异常"**列名是必须的
strAttribId = inInfo.blk_info[0].Rows[index]["ATTRIB_ID"].ToString(); index是从零开始的,超出范围时会报错
很傻的一个错误,当还原数据库时,选中总项,在选择任务还原,,而不是选中要还原的数据库,右击原则还原..会提示正在使用???不知道哈
删除原来数据库(关闭连接)--再重新还原
保存的是用户名还是用户id
1。怎样判断是否选中行;
(1)if ((bool)this.efGridResult[i, "check_option"] == true)
i的取值?grid标题行为第0行,一次类推;;;;;EFUserRows 表示数据行,Rows.Count包含标题行,在grid属性中可设置EFUserRows = 0 则不会有初始化时的空行
代码:
for (int i = 1; i <= this.efGridResult.EFUserRows; i++)
{
if ((bool)this.efGridResult[i, "check_option"] == true)
{
//代码代号不能为空
if (this.efGridResult[i, "code_t_no"] == null || string.IsNullOrEmpty(this.efGridResult[i, "code_t_no"].ToString().Trim()))
{
MessageBox.Show("代码代号不能为空");
return false;
}
}
}
2。怎样固定一列不可修改..如在修改时不能修改主键,新增时可修改,且变色
(1)色变了怎么还原回去???
this.efGridResult.Cols["code_t_no"].AllowEditing = false;
this.efGridResult.Cols["code_t_no"].StyleNew.BackColor =SystemColors.ScrollBar;// Color.Gray; //设为灰色
----当修改时,设置为不可编辑不好,,改为::当新增时可编辑,初始状态不可编辑
3。分析下c++文件AssisFunction.cpp的内容
#region{
#include "stdafx.h"
using namespace BM2;
using namespace BM2::Data;
using namespace BM2::Data::DbClient;
/******************************************************************
* 函数功能:实现数据库非查询操作
* 参数描述:
* 1. CDbConnection * conn 数据库链接对象
* 2. BM2_TCHAR * sqlstr SQL语句
* 3. EIClass * paraei SQL参数
* 返回值 :小于0表示SQL操作不成功,正值为影响的行数
*****************************************************************/
int NonQuerySQLFunc(CDbConnection * conn, BM2_TCHAR * sqlstr, EIClass * paraei)
{
int flag = 0, flag2 = 0;
CString tmp(""), tmp2("");
CString sql(sqlstr);
sql = sql.Trim();
EIClass para;
//正常的sql 语句如select,update,delete 等大于6位字符.
if(sql.GetLength() <= 6 || paraei == NULL)
{
EDLog(1,1,"%s","SQL操作类型不正确!");
return -1;
}
try
{
//根据前6位字符判断是增删改的哪一项
if(sql.Substring(0,6).ToLower() == "update") //更新--可更新多行.若paraei 含多行记录,则生成 的sql语句??????有疑问
{
flag = -1;
//如果更新语句含有*,则去掉*
for(int i=0;i<sql.GetLength();i++)
{
if(sql[i] == '*')
{
flag = i;
sql = sql.Delete(flag,1); //删除*;
break;
}
}
//含有*号
if(flag != -1)
{
//需要替换*为表字段和@参数
//更新数据 条数:paraei->Tables[0].Columns.get_Count()
for(int i=0;i<paraei->Tables[0].Columns.get_Count();i++)
{
CDataColumn & col = paraei->Tables[0].Columns[i];
tmp = col.get_ColumnName().ToUpper(); //如id列,列名id; tem = " id "
//硬编码方式,去除EI_ROW_NUM列
if(tmp == "EI_ROW_NUM")
continue;
tmp += "=@"; //tem = " id=@ "
tmp += col.get_ColumnName().ToLower(); //temp = "id=@ID"
tmp += ","; //temp = "id=@ID,"
sql = sql.Insert(flag,tmp); //在原*位置插入类似 id = @ID, 的语句
flag += tmp.GetLength();
}
sql = sql.Delete(flag-1,1); //删除一个,类似 temp = "id = @ID,name=@NAME"
}
}
else if(sql.Substring(0,6).ToLower() == "insert")
{
flag = -1;
flag2 = -1;
for(int i=0;i<sql.GetLength();i++)
{
if(sql[i] == '*')
if(flag == -1)
{
flag = i;
sql = sql.Delete(i,1);
i--;
}
else
{
flag2 = i;
sql = sql.Delete(i,1);
break;
}
}
if(flag != -1 && flag2 != -1)
{
//需要替换*为表字段和@参数
for(int i=0;i<paraei->Tables[0].Columns.get_Count();i++)
{
CDataColumn & col = paraei->Tables[0].Columns[i];
tmp = col.get_ColumnName().ToUpper();
//硬编码方式,去除EI_ROW_NUM列
if(tmp == "EI_ROW_NUM")
continue;
tmp += ",";
sql = sql.Insert(flag,tmp);
flag += tmp.GetLength();
flag2 += tmp.GetLength();
if(col.get_DataType() == DsType::DT_STRING)
{
tmp = tmp.Insert(0,"@");
tmp = tmp.Insert(tmp.GetLength()-1,"");
}
else
tmp = tmp.Insert(0,"@");
sql = sql.Insert(flag2,tmp.ToLower());
flag2 += tmp.GetLength();
}
sql = sql.Delete(flag2-1,1);
sql = sql.Delete(flag-1,1);
}
}
else if(sql.Substring(0,6).ToLower() == "delete")
{
}
else
{
EDLog(1,1,"%s","SQL操作类型不正确!");
return -1;
}
//解析sql,将@参数名统一放入para中
flag = -1;
flag2 = 1;
CDataTable & t = para.Tables[0];
t.Columns.Add(DsType::DT_STRING,"paraname");
//只记录SQL语句中的@参数名
for(int i=0;i<sql.GetLength();i++)
{
if(sql[i] == '@')
{
flag = i;
continue;
}
if(flag >= 0 && (sql[i] == ',' || sql[i] == ' '
|| sql[i] == ')' || sql[i] == '(' || sql[i] == '\0'
|| sql[i] == ' ' || sql[i] == '\''))
{
tmp = sql.Substring(flag+1,i-flag-1).ToLower(); /////
CDataRow & row = t.Rows.Add();
row["paraname"] = tmp;
flag = -1;
continue;
}
if(flag >= 0 && i == sql.GetLength() - 1)
{
tmp = sql.Substring(flag+1,i-flag).ToLower();
CDataRow & row = t.Rows.Add();
row["paraname"] = tmp;
flag = -1;
}
}
//使用Command对象
CDbCommand command(sql,conn);
//为参数赋值,并执行sql:command.ExecuteNonQuery();
for(int i=0;i<paraei->Tables[0].Rows.get_Count();i++)
{
//遍历要处理的行,每次循环处理一行
command.Parameters.Clear();
for(int j=0;j<para.Tables[0].Rows.get_Count();j++)
{
//遍历参数表
CDataRow & row = para.Tables[0].Rows[j];
tmp = (CString)row["paraname"];
CDataProxy * cp = NULL;
flag = -1;
//开始查找参数值
for(int tc=0;tc<paraei->Tables.get_Count();tc++)
{
for(int cc=0;cc<paraei->Tables[tc].Columns.get_Count();cc++)
{
//遍历每一个列
tmp2 = paraei->Tables[tc].Columns[cc].get_ColumnName().ToLower();
if(tmp2 == tmp)
{
flag = 0;
if(tc == 0)
{
//参数在主数据源中,取当前第i行
cp = &(paraei->Tables[tc].Rows[i][cc]);
}
else
{
//参数在辅助数据源中
if(paraei->Tables[tc].Rows.get_Count() > i)
{
//取对应行的参数
cp = &(paraei->Tables[tc].Rows[i][cc]);
}
else
{
//取第一行的参数
cp = &(paraei->Tables[tc].Rows[0][cc]);
}
}
break;
}
}
//找到后跳出
if(flag == 0) break;
}
if(flag < 0) return -1;
tmp2 = (CString)(*cp);
//防止空字符参数
if(cp->m_DataType == DsType::DT_STRING)
if(tmp2 == "") tmp2 = " ";
command.Parameters.Set(tmp,tmp2);
}
flag = command.ExecuteNonQuery();
if(flag < 0) return -1;
}
}
catch(CDbException& ex)
{
EDLog(1,1,"%s",ex.GetMsg());
return -1;
}
return flag;
}
#endregion }
4。分析下基础画面类型
(1)类似模板画面一
(2)上面查询框,下面tab 如:FMBD04 ,FMBD10
(3)多个相关联的grid.如: FMBD05
(4)含有树状节点的,和tab,如FMBD06 ,FMBD23,FMBD28,FMBD29
(5)不含grid的如:FMBD18
----------先去看下,含树结构的
5.EA01画面后台待配置SERVICE查询区究竟查的傻???
查询的,在EA03表中,但在EA01表中没有的项
6..当执行到 outInfo.sys_info.flag < 0 内时,也要按钮状态保持
7。当查询没有数据时也要提示下
private void efGrid1_CellButtonClick(object sender, RowColEventArgs e)
{
EIInfo info = new EIInfo();
EIInfo eiInfo = new EIInfo();
if (this.efGrid1.Cols[this.efGrid1.Col].Name == "resname")
{
info.SetColName(1, "name");
info.SetColName(2, "appname");
if (this.efGrid1[this.efGrid1.Row, "resname"] == null)
{
info.SetColVal(1, 1, 1, "");
info.SetColVal(1, 1, 2, this.cursystem);
}
else
{
info.SetColVal(1, 1, 1, this.efGrid1[this.efGrid1.Row, "resname"].ToString());
info.SetColVal(1, 1, 2, this.cursystem);
}
eiInfo = EITuxedo.CallService("esqueryformname", info);
if (eiInfo != null)
{
int row = eiInfo.GetDropDownChoice(EFFunction.EFGetRectangle(this.efGrid1, this.efGrid1.Row, this.efGrid1.Col), 10, new object[] { "name", "description" });
if (row != -1)
{
this.efGrid1[this.efGrid1.Row, "resname"] = eiInfo.GetColVal(1, row, "name");
this.efGrid1[this.efGrid1.Row, "description"] = eiInfo.GetColVal(1, row, "description");
}
}
}
11,1,0,0,0,95,Columns:0{Width:29;AllowSorting:False;Name:"grid_head";Style:"DataType:System.Int32;TextAlign:RightCenter;";} 1{Width:57;AllowSorting:False;Name:"check_option";Caption:"选择";AllowDragging:False;Style:"DataType:System.Boolean;ImageAlign:CenterCenter;";StyleFixed:"TextAlign:CenterCenter;";} 2{Caption:"物料";} 3{Caption:"源单位";} 4{Width:35;Caption:"符号";} 5{Caption:"系数";} 6{Width:32;Caption:"符号";} 7{Caption:"额外数量";} 8{Width:37;Caption:"符号";} 9{Caption:"目的单位";} 10{Caption:"化整";}
C1.Win.C1FlexGrid.ColumnCollection
/OUT:"..\..\..\Ubind\p_lmtm_9400.dll" /INCREMENTAL /NOLOGO /LIBPATH:"D:\Source\Server\Libd" /LIBPATH:"D:\Source\Server\Arch\CPP\Libd" /DLL /MANIFEST /MANIFESTFILE:"..\..\..\Obj\Win32\Debug\p_lmtm_9400.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /ASSEMBLYDEBUG /PDB:"d:\Source\Server\Arch\CPP\Ubind\p_lmtm_9400.pdb" /DYNAMICBASE /FIXED:No /NXCOMPAT /IMPLIB:"..\..\..\Libd\p_lmtm_9400.lib" /MACHINE:X86 /ERRORREPORT:PROMPT bm2core.lib bm2data.lib bm2ei.lib bm2dbclnt.lib libEPCrypt.lib libEPES.lib libBM.lib libLMTM.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib