开端2(2)

--------------------------------------------
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
 

posted @ 2010-06-18 16:49  9421  阅读(523)  评论(0编辑  收藏  举报