• 开端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
     

  • 相关阅读:
    英文哲理短句
    经历的一次诈骗
    英文哲理短句
    反思对待新人的方式
    Java 开源报表制作
    现在开始写字
    关于Visual C++ 6.0的调试技巧和经验总结
    一步一步教你实现CTreeCtrl 自绘
    VC中动态加载ODBC解决方法
    VC++程序编译链接的原理与过程
  • 原文地址:https://www.cnblogs.com/9421/p/1760419.html
Copyright © 2020-2023  润新知