zoukankan      html  css  js  c++  java
  • 开端1

    刚到,下周才给分任务,只是自己看一些文档,很多新的东西需要去深入学习

    :::::Oracle,DB2,Pro*C,Tuxedo,TTA,水晶报表,新的代码管理工具,新的项目管理方式,新的项目框架,新的自定义库(各种库类,控件方法等),新的同事,新的工作方式----

     

    EI包
    EI.EITuxedoAPI.tuxputenv("WSNADDR=//10.25.88.200:9001");
    strk = EI.EITuxedo.CallService("eslogin", strw);


    EF包::包含各种前台控件
    EFLabelText,EFButton,EFListBox,EFFormBase,EF.EFPagerEF.EFNumericUpDown(this.components);
    EF.EFFunction.EFGetRectangle(qry_backlog_code),30);//qry_back_log_code是个combox控件名
    控件常见属性:EFArrange布局,EFCname 中文显示名称,EFEname 英文显示名称,EFLen,EFType,EFUpperCase,Location,Name,Size,TabIndex,Text
    EFEnterText,
    C1.Win.C1FlexGrid
    EF.EFGrid efGrid2;


    EP包
    EP_Args, EP.PMainForm ep = new EP.EPMainForm();
    EP.EP_Args   init_ep_args = EP.EPXml.ReadXmlFile();


    1.基本操作(调用后台程序)
    //定义参数(类似parameter或Dictory)
    EI.EIInfo inBlock = new EI.EIInfo();
    EI.EIInfo outBlock ; //设置参数值 inBlock.SetColName(1,"whole_block_code");
    inBlock.SetColVal(1,1,"Test");
    //调用后台方法类wowo_view
    outBlock = EI.EITuxedo.CallService("wowo_view",inBlock);

    if(outBlock.sys_info.flag != 0)
    {//失败;}
    str = outBlock.GetColVal(choice,"whole_backlog_code");
    //:::::::::::::EFGrid的使用::::::::::::::::::::
    2.DataMap属性的使用
    Hashtable proc_typeHT = new Hashtable();
    proc_typeHT.Add("00","管理工序");
    proc_typeHT.Add("10","生成工序");
    efGride1.Cols["proc_type"].DataMap = proc_typeHT;
    efGrid1显示proc_type列的值时会把"00","10"转换为"管理工序","生成工序"

    3.汇总数据
    efGrid1.Subtotal(AggregateEnum.Clear); //先清空汇总数据
    efGrid1.Tree.Column = 2;
    efGrid1.SubtotalPosition = SubtotalPositionEnum.AboveData;
    int totalOn = efGrid1.Cols["entry_mat_wt"].Index;
    int groupon = efGrid1.Cols["plan_status"].Index;

    //对所有的数据sum(entry_mat_wt),count
    efGrid1.Subtotal(AggregateEnum.Sum,0,-1,totalOn,"合计:");
    efGrid1.Subtotal(AggregateEnum.Count,0,-1,groupon);

    4.增加列
    //在efGrid1的最后新增一列
    efGrid1.Cols.Add();
    efGrid1.Cols[efGrid1.Cols.Count-1].Name = "pro_num" ;//设置新增列名
    efGrid1.Cols["prod_num"].Caption = "生产个数";//设置列标题
    efGrid1.Cols["prod_num"].DataType = typeof(System.Int32); //设置列类型
    efGrid1.Cols[""].Width = 58;
    efGrid1.Cols[""].StyleDisplay.BackColor = Color.Khaki ;//列背景色
    efGrid1.Cols[""].StyleDisplay.ForeColor = Color.Black;//列字体颜色

    5。移动列
    //调整列位置
    efGrid.Cols.Move(colold,colnew);//被移动列的索引,新索引

    6.允许编辑
    efGrid1.AllowEditing = true;
    efGrid1.Cols[i].AllowEditing = true;

    efGrid1.Cols[i].Caption = "选择";

    7.一个事件执行过程中停止/启动另一个事件
    -= :做某个事件的时候,停止一个需要停止的事件
    += :启动一个事件
    //运用,如要给efGrid1[row,"prod_num"]赋值,则会触发efGrid1.CellChanged事件,如果不写停止事件会成死循环
    efGrid1.CellChanged -= new C!.Win.C1FlexGrid.RowColEventHandler(efGrid1_CellChanged);
    efGrid1[row,"prod_num"] = prod_num.ToString();
    p_calallexwt(); //计算总重
    efGrid1.CellChanged += new C!.Win.C1FlexGrid.RowColEventHandler(efGrid1_CellChanged);

    8.EFGrid的ComboList属性
    efGrid1.Cols["proc_type"].ComboList = "|管理工序|生产工序"

    9。实现下拉grid列表
    efGrid1.Cols["whole_blocklog_code"].ComboList = "|...";
    在cellbuttonclick事件中
    if(efGrid1.Cols[e.Col].Name == "whole_backlog_code")
    {
       EI.EIInfo  inBlock = new EI.EIInfo();
       EI.EIInfo  outBlock ;
       inBlock.SetColName(1,"whole_backlog_cod");
       inBlock = EI.EITuxedo.CallService("psbacklog_inq",inBlock);
       if(outBlock.sys_info.flag < 0)
       {
           MessageBox.show(outBlock.sys_info.msg.ToString(),"error");
       }
       else
       {
          int choice = outBlock.GetDropDownChoice(EF.EFFunction.EFGetRectangle(efGrid1,e.Row,e.Col),30);
          if(choice != -1)
          {
            efGrid1[e.Row,"whole_backlog_code"] = outBlock.getColVal(choice,"whole_backlog_code");
          }
       }
    }
    10.EFGrid列的固定(只能固定前几列)
    efGrid1.Cols.Frozen = 2;
    efGrid1.Rows.Frozen = 3;
    固定前两列,前3行
    //:::::::::::::EFComboBox的使用::::::::::::::::::::
    EFDropDown属性设为True,可显示GRID的列表,,若下拉信息少可使用Items属性
    qry_backlog_code.Text = outBlock.GetColVal(choise,"whole_backlog_code");

     efComboBox5.Items.Add(outBlock_info.GetColVal(1,i,"stock_no").ToString());
    ------------登陆----------------
    8.登陆成功后显示主窗体
    //this指登陆窗体
    EP.EPMainForm ep = new EP.EPMainForm();
    ep.Text = this.efListBox1.SelectedItem.ToString();//标题
    EP.EPMainForm.ep_args.epDirectory = Path.GetFullPath(".");
    EP.EPMainForm.ep_args.epCname = this.efListBox1.SelectedItem.ToString();
    EP.EPMainForm.ep_args.epUserCname = xmlItemList.Item(0).ChildNodes.Item(1).InnerText;
    EP.EPMainForm.ep_args.epUserId = this.efLabelTextUserId.EFEnterText;
    EP.EPMainForm.ep_args.es_login_form = this;
    ep.EPShow();
    this.Hide();

    9.设为EFLabelText的密码输入框显示*
    this.efLabelTextPassword.EFTextRef.PasswordChar = '*';

    10。读取xml

    StringWriter writerString = new StringWriter();
    XmlTextWriter writer = new XmlTextWriter(writerString);
    writer.Formatting = Formatting.Indented;
    string id= this.efLabelTextUserId.EFEnterText;
    string key =this.efLabelTextPassword.EFEnterText);

    writer.WriteStartElement("REQUEST");
    writer.WriteStartElement("LOGIN");
    writer.WriteElementString("USERID", id);
    writer.WriteElementString("KEYVALUE", key);
    writer.WriteEndElement();
    writer.WriteEndElement();

    string w = writerString.ToString();
    writer.Close();

    k = EI.EITuxedo.CallService("eslogin", w);
    if (k == null) {
      MessageBox.Show("登陆失败!请重试....","登录信息");
      return;
    }

    //对返回的k(xml文本)进行解析,判断是否继续打开窗口还是登陆错误。
    XmlImplementation objXImp = new XmlImplementation();
    XmlDocument xmlParser = objXImp.CreateDocument(); 
    xmlParser.LoadXml(k);
    XmlNodeList xmlItemList = xmlParser.GetElementsByTagName("LOGIN");


    if (xmlItemList.Item(0).ChildNodes.Item(0).InnerText == "0")
    {//登陆成功}

    10..建前台流程,新建项目(类库) -->设置属性,指定输出路径 ->添加引用,添加工具栏(EF)
    -->新建页面(添加继承窗体,一般的继承自EF.EFFormBase,带按钮条的继承自EF.EFForm
    -->托对应控件写方法(尽量使用新添加的自定义控件)
    窗体命名(Form+XX模块名+YY小模块名+ZZ自定义名)
    带按钮条的窗体,上的按钮触发事件分EF_PRE_DO_F**, EF_CANCEL
    _F**,EF_DO_F**..对应预处理,取消,确定事件

    11。在主窗体调用另一个窗体
    //切换到TPP90画面,关闭当前画面
    this.EFXcyForm("TP900",param_from_main_tosub.EFEnterText);
    //打开TPP90画面,保留当前画面
    this.EFCallForm("TPP90",param_from_main_to_sub.EFEnterText); 
    被调窗口事件
    private void FormTPP90_EF_START_FORM_BY_EF(object sender,EF.EF_Args i_args)
    {
      param_from_main_to_sub.Text = i_args.callParams[0];
    }

    12.当添加一新画面时,数据库表的配置
    insert into ES.TESFORMPARA(FORM_NAME,FORM_BASE_NAME,,PK1,PK1_NAME,PK2,PK2_NAME,PK3,PK3_NAME)
    新画面需要在ESFORM 等ES授权画面配置,即可以使用.

    13。数据分发EDCALL,类似一个调度程序,按顺序启动各函数
    配置画面ED00-点击生成文件,将生成2各配置文件edcall_func_map_data.h(函数声明文件) ,edcall_func_map_decalare.h(配置信息映射数据)
    前台调用:
    EI.EIInfo.eiinfo_ed ed = new EI.EIInfo.eiinfo_ed();
    ed.func_name[0] = "PSRS_SELECT_PLANMAT";
    ed.pk_name[0] = "WHOLE_BACKLOG_CODE";
    ed.pk_val[0] = efComboBox2.Text;
    inBlock.SetED(ed);
    outBlock = EI.EITuxedo.EDCall(inBlock);

    14.EDA2字段显示配置

    15。创建报表

    16。 分页  

    代码
    // efPager2
    // 
    this.efPager2.Controls.Add(this.efNumericUpDown1);
    this.efPager2.Controls.Add(this.efNumericUpDown2);
    this.efPager2.CurrPageNo = 0;
    this.efPager2.Location = new System.Drawing.Point(512440);
    this.efPager2.Name = "efPager2";
    this.efPager2.RecordCountPerPage = 20;
    this.efPager2.Size = new System.Drawing.Size(37624);
    this.efPager2.TabIndex = 12;
    this.efPager2.TotalRecordCount = 0;
    this.efPager2.PageUpClicked += new System.EventHandler(this.efPager2_PageUpClicked);
    this.efPager2.PageBottomClicked += new System.EventHandler(this.efPager2_PageBottomClicked);
    this.efPager2.PageTopClicked += new System.EventHandler(this.efPager2_PageTopClicked);
    this.efPager2.PageDownClicked += new System.EventHandler(this.efPager2_PageDownClicked);

    // 
    // efPager2
    // 
    this.efPager2.Controls.Add(this.efNumericUpDown1);
    this.efPager2.Controls.Add(this.efNumericUpDown2);
    this.efPager2.CurrPageNo = 0;
    this.efPager2.Location = new System.Drawing.Point(512440);
    this.efPager2.Name = "efPager2";
    this.efPager2.RecordCountPerPage = 20;
    this.efPager2.Size = new System.Drawing.Size(37624);
    this.efPager2.TabIndex = 12;
    this.efPager2.TotalRecordCount = 0;
    this.efPager2.PageUpClicked += new System.EventHandler(this.efPager2_PageUpClicked);
    this.efPager2.PageBottomClicked += new System.EventHandler(this.efPager2_PageBottomClicked);
    this.efPager2.PageTopClicked += new System.EventHandler(this.efPager2_PageTopClicked);
    this.efPager2.PageDownClicked += new System.EventHandler(this.efPager2_PageDownClicked);

    17。EFGrid增加一个选择列
     this.efGrid1.ColumnInfo = "25,1,0,0,0,125,Columns:0{Width:29;AllowSorting:False;Name:\"grid_head\";DataType:Sy" +
        "stem.Int32;TextAlign:RightCenter;}\t1{Width:57;AllowSorting:False;Name:\"check_opt" +
        "ion\";Caption:\"选择\";AllowDragging:False;DataType:System.Boolean;TextAlignFixed:Cen" +
        "terCenter;ImageAlign:CenterCenter;}\----";

    18--后台
    使用Reflecttor对动态链接库,进行反编译
    EI 库
    实现便捷的前后台数据交互,引用了C1.Win.C1FlexGrid和EF
    包含的类有EIBlock,EIInfo,EITuxedo,EITuxedoAPI,EITuxedoBuffer,EITuxedoBufferFML32,EITuxedoBufferString
    EIBlock:::: 构造方法如下,其实类似一个而为表,有行,列,列名称,列长度,列类型,列值等
    public EIBlock()
    {
        int num;
        this.col = 0;
        this.row = 0;
        this.col_size = 50;
        this.row_size = 50;
        this.colname = new string[50];
        this.colcname = new string[50];
        this.coltype = new string[50];
        this.collen = new int[50];
        this.coldeclen = new int[50];
        this.colvalue = new string[50, 50];
        this.trimFlag = 0;
        for (num = 0; num < this.col_size; num++)
        {
            this.colname[num] = " ";
            this.colcname[num] = " ";
            this.coltype[num] = " ";
            this.collen[num] = 0;
            this.coldeclen[num] = 0;
        }
        for (num = 0; num < this.col_size; num++)
        {
            for (int i = 0; i < this.row_size; i++)
            {
                this.colvalue[num, i] = " ";
            }
        }
    }
    EIInfo::构造方法如下,信息块就是包含一个  (多个EIBlock类的)结构,主要用来传递,储存参数

    public EIInfo()
    {
        this.sys_info = new eiinfo_sys();
        this.ed_info = new eiinfo_ed();
        this.blk_count = 0;
        this.blk_now = 0;
        this.blk_info = new EIBlock[MAX_BLOCK];
        this.blk_name = new string[MAX_BLOCK];
        this.blk_info[0] = new EIBlock();
        this.blk_now = 0;
        this.blk_count = 1;
        this.sys_info.fore_machine = Dns.GetHostName();
        try
        {
            this.sys_info.fore_ip = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
        }
        catch
        {
        }
        this.sys_info.userid = EF_Args.formUserId;
        this.sys_info.username = EF_Args.formUserName;
        this.sys_info.formname = EF_Args.formENameNow;
        for (int i = 0; i < MAX_BLOCK; i++)
        {
            this.blk_name[i] = " ";
        }
    }
    EITuxedo:::类结构如下,包含,日志记录方法,以及调用service的方法(内部实现其实是调用EITuxedoAPI去实现的

     public class EITuxedo
    {
        // Fields
        private static EILogEvent EI_LOG_EVENT;
        public static IntPtr out_buffer;
        public static int out_len;

        // Events
        public static  event EILogEvent EI_LOG_EVENT;

        // Methods
        static EITuxedo();
        public EITuxedo();
        public static EIInfo CallService(string service_name, EIInfo i_blks);
        public static string CallService(string service_name, string w);
        public static EIInfo EDCall(EIInfo i_blks);
        public static string GetErrorMsg();
        public static bool LogInfo(string i_service_name, string i_info, string i_code);

        // Nested Types
        public delegate void EILogEvent(string i_service_name, string i_info, string i_code);
    }
    ETTuxedoAPI:::api,引用了Tuxedo对应的api链接库

    代码
    public class EITuxedoAPI
    {
        
    // Methods
        public EITuxedoAPI();
        [DllImport(
    "libfml32", SetLastError=true)]
        
    public static extern int Fget32(IntPtr fbfr, int fldid, int occ, uint loc, ref int maxlen);
        [DllImport(
    "wtuxws32", SetLastError=true)]
        
    public static extern int gettperrno();
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern uint tpalloc([MarshalAs(UnmanagedType.LPStr)] string type, [MarshalAs(UnmanagedType.LPStr)] string subtype, long size);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern int tpcall([MarshalAs(UnmanagedType.LPStr)] string svc, IntPtr idata, int ilen, out IntPtr odata, out int olen, int flags);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern long tpchkunsol();
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern unsafe void tpfree(char* ptr);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern int tpgetctxt(IntPtr i_tpcontext, long i_flag);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern int tpinit(int i);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern long tpsetunsol([MarshalAs(UnmanagedType.FunctionPtr)] EIPostEvent UnsolMsgHandler);
        [DllImport(
    "wtuxws32", SetLastError=true)]
        
    public static extern string tpstrerror(int errno);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern long tpsubscribe([MarshalAs(UnmanagedType.LPStr)] string eventexpr, [MarshalAs(UnmanagedType.LPStr)] string filter, IntPtr ctl, long flags);
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern int tpterm();
        [DllImport(
    "libwsc", SetLastError=true)]
        
    public static extern long tpunsubscribe(long subscription, long flags);
        [DllImport(
    "wtuxws32", SetLastError=true)]
        
    public static extern int tuxputenv(string env_string);

        
    // Nested Types
        public delegate void EIPostEvent(IntPtr buffer, long a, long b);
    }

    EITuxedoBuffer,EITuxedoBufferFML32,EITuxedoBufferString

    ;;;;;
    EP库 是开发平台中自定义通用函数库文件,集成了经常使用的一些功能函数
    ED库:::数据分发,电文解析和封装,调试文件打印---
    数据分发:为了提高程序通用性和构件性而设计,可实现功能模块内部各功能元之间的装配和拆解,实现程序灵活配置
    电文:三层系统中数据通信的各数据包,我们称之为电文,其解析和封装都是由ED库提供的功能函数实现
    调试文打印:mes自制了后台调试方法,其中之一就是将程序运行的中间结果保存在文本文件(.trace)中;EDLog(int typea,int typed,char*formate,...);

    19:Tuxedo简介:
    mes采用的三层:前台用net1.1 ,中间件使用BEA的tuxedo 7.0 ,后台使用数据库Oracle9i
    真正的业务逻辑写在后台的应用程序上并运行于tuxedo中间件环境下,后台的应用程序作为一个个服务元嵌在tuxedo中,称为service,一个或多个service构成一个服务单元,由tuxedo进行有效的管理,称为server
    ,server的管理是有tuxedo中间件自身完成的.具体的service程序由程序员编写,必须符合tuxedo中service的编制标准,使用ANSI C或C++编写,为了方便开发了接口如EI等.
    19.pro * C:::是C或C++语言与SQL语言结合实现高级语言和数据库交互的一种编程规范,
    例子程序

    /***** C/C++ 的标准头文件部分 *****/

    代码
    #include <stdio.h>
    #include 
    <stdlib.h>
    #include 
    <ctype.h>

    #include 
    "EI_TUXClass.h"

    /* 标准SQLCA引用方式 */
    #define SQLCA_STORAGE_CLASS extern
    EXEC SQL INCLUDE SQLCA;

    /***** 宏定义、常量定义 *****/
    #define SQL_ABNORMAL_HANDLER f_epep_sqlerror_handler


    /* **** 全局静态宿主变量定义 **** */
    EXEC SQL BEGIN DECLARE SECTION;


    EXEC SQL END DECLARE SECTION;

    /* ***** 全局静态变量定义 ***** */

     

    /* ***** 外部函数申明 ***** */

     

    /* ***** 静态函数申明 ***** */
    int f_ymbw01_inq1(EIClass *bcls_rec,EIClass *bcls_ret);
    void f_epep_sqlerror_handler(void);


    #ifdef __cplusplus
    extern "C"
    #endif

    //-EP_CODE_VERSION 1
    //-EP_SYSTEM_HEAD_BEGIN
    //-此节代码请勿更改
    void ymbw01_inq1(TPSVCINFO *w_rqst)
    {
     FBFR32 
    *w_ret_buf;

     
    if (EP_ENABLE) 
     {
      EI_TUXClass w_tux;
      EIClass  w_bcls_rec;
      EIClass  w_bcls_ret;
      
    int   wi_ret_flag = 0;

      
    /* **** 初始化bcls_rec块 **** */
      EILog(
    "Begin service: %s", w_rqst->name);
      wi_ret_flag 
    = w_tux.Init(w_rqst, &w_bcls_rec);
      
      
    if ( wi_ret_flag < 0 ) 
      {
       w_bcls_rec.SetSYS(s);
       
    goto TUXRET;
      }
      
      
    /* ***** 初始化s结构体的内容 ***** */
      memset(s.msg, 
    0x00sizeof(s.msg));
      s.flag 
    = 0;
      s.sqlcode 
    = 0;
      sprintf(s.svc_name, 
    "%.15s", w_rqst->name);
      
      
    /* ***** 开始调用应用处理程序 ***** */
      EILog(
    "Begin logic function");
      wi_ret_flag 
    = f_ymbw01_inq1(&w_bcls_rec, &w_bcls_ret);
      EILog(
    "End logic function.( return flag =[%d])", wi_ret_flag);
      EILog(
    "End service: %s", w_rqst->name);
      
    TUXRET: 
      
    /* ***** 关闭程序 ***** */
      w_ret_buf 
    = w_tux.Close(wi_ret_flag, &w_bcls_ret);
     
     }

     tpreturn(TPSUCCESS, 
    0, (char *)w_ret_buf, 0L0);
    /* ***** -EP_SYSTEM_HEAD_END ***** */


    int f_ymbw01_inq1(EIClass * bcls_rec, EIClass * bcls_ret) 
    {
     
     EDLog(
    11" **************%s Begin *****************",s.svc_name);
     
     
    /* ***** 静态变量定义 ***** */
     
    int  doFlag = 0;
       
    int  fetchRowCount = 0;
     
    char lpsz_tc_no[21= " ";
     
     
    /* ***** 程序表结构引用 ***** */
      EXEC SQL INCLUDE SQLCA;
     EXEC SQL INCLUDE tymbw31.h;
     
        
    /* ***** 宿主变量定义 ***** */
     EXEC SQL BEGIN DECLARE SECTION;
     
    char v_main_backlog_code[2]; 
     
    char v_factory_div[4]="";  
     EXEC SQL END DECLARE SECTION;
     
     
    // 创建电文处理对象
    // EPEX epex(&s);
     
     EXEC SQL
      WHENEVER SQLERROR GOTO L_SQLERROR;
     EXEC SQL
         ALTER SESSION SET NLS_DATE_FORMAT 
    = 'YYYYMMDDhh24miss';

      
     
    /* ***** 初始化全局变量 ***** */
     memset(
    &elog,0x00,sizeof(elog));
     elog.gs_lineSeq 
    = 0;

     
     
    /* ***** 获取输入参数 ***** */
     elog.gs_lineSeq 
    = 10;
      bcls_rec
    ->GetSYS(&s);
     
    //bcls_rec->GetColVal(1,1,"factory_div",v_factory_div);  
       
       
       
    /* ***** 打印输入参数 ***** */
     
    //EDLog(1,1,"factory_div[%s]",v_factory_div);
     
     
    /* ***** 检查输入参数合法性 ***** */
     elog.gs_lineSeq 
    = 20;
     
     
    /* ***** 程序处理 ***** */
     elog.gs_lineSeq 
    = 30;
     EXEC SQL DECLARE tymbw01_inq1_q CURSOR FOR 
      SELECT 
    *
      FROM tymbw31
      
    //WHERE factory_div=trim(:v_factory_div) 
       WHERE stock_type_code<>'4' AND stock_type_code<>'5' 
       order by stock_no ASC;


     EXEC SQL OPEN tymbw01_inq1_q; 
     
     
    /* ***** 记录操作的SQL语句信息 ***** */
     (
    void)strcpy(elog.gs_key1   , v_factory_div);
       (
    void)sprintf(elog.gs_logMsg  , "[%02d] 执行SELECT操作,查询所有的库号以及库说明",elog.gs_lineSeq);
       (
    void)strcpy(elog.gs_sqlOper   , "SELECT");
       (
    void)strcpy(elog.gs_sqlTableName  , "tymbw31");

     elog.gs_lineSeq 
    = 40;
       
    for (fetchRowCount = 0; ;) 
       {
        EDLog(
    1,1,"factory_div[%s]",v_factory_div); 
      EXEC SQL FETCH tymbw01_inq1_q INTO :tymbw31; 
         
         rtrim_1par((T_INFO 
    *)&tymbw31_info);
           

         
    if (M_NO_DATA_FOUND == sqlca.sqlcode || fetchRowCount > 2000)
         {
          
    break;
         }
         
         fetchRowCount
    ++;
        
        
    /* 返回选择数据 */
         bcls_ret
    ->SetColVal(1, fetchRowCount, (T_INFO *)&tymbw31_info);
       
       }
    /* end of for (fetchRowCount = 0; ;)  */
       

     elog.gs_lineSeq 
    = 60;
     EXEC SQL CLOSE tymbw01_inq1_q ;
     
      
     
     doFlag 
    = 0;
     s.sqlcode 
    = 0;
       (
    void)strcpy(elog.gs_logMsg    , "处理正常结束");
       

     
    goto L_RETURN;


    /* ***** 处理SQL错误 ***** */
    L_SQLERROR:
     doFlag 
    = -2;
     SQL_ABNORMAL_HANDLER();
     
    goto L_RETURN;

    /* ***** 处理应用错误 ***** */
    L_APPERROR:
     
    if (doFlag >= 0)
     {
      doFlag 
    = -1;
     }
     
    goto L_RETURN;

    /* ***** 应用程序返回 ***** */
    L_RETURN:
     s.flag 
    = doFlag;
     sprintf(s.msg,
    " %.100s ",elog.gs_logMsg);
     bcls_ret
    ->SetSYS(s);
     
    /* ***** 记录程序操作日志 ***** */
     EDLog(
    11"[%s] S.FLAG [%d]", s.svc_name, s.flag);
     EDLog(
    11"[%s] S.MSG  [%s]", s.svc_name, s.msg);
     EDLog(
    11"[%s] S.SQLCODE [%d]", s.svc_name, s.sqlcode);
     EDLog(
    11"[%s] S.SQLMES [%s]", s.svc_name, s.sqlmes);
     EDLog(
    11" **************%s end*****************",s.svc_name);
     
        
    if ( 0 == s.flag )
        {
         (
    void)strcpy(elog.gs_logType    , "0");
     
    // EPLog(&s,&elog);
     }
     
    else
     {
      (
    void)strcpy(elog.gs_logType    , "1");
     
    // EPLog(&s,&elog); 
     }
     
     
    return(doFlag);
    }


    /* **************************************************
    *函数介绍: SQL出错处理,每个service程序都必须保留
    *输入参数: 无
    *输出参数: 无
    *返回值 : 无
    ************************************************** 
    */
    void f_epep_sqlerror_handler(void)
    {
     
     s.sqlcode 
    = sqlca.sqlcode;
     sprintf(s.sqlmes, 
    "%.*s", sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);

     
    /* ***** 判断SQLCODE ***** */
     
    if ( M_NO_DATA_FOUND == sqlca.sqlcode) 
     {
      sprintf(elog.gs_logMsg,
    "数据不存在.(DB=%s, KEY=[%s][%s][%s])",
        elog.gs_sqlTableName,elog.gs_key1,elog.gs_key2,elog.gs_key3);
     }
     
    else if ( M_VALUE_LAGER_COL_PREC == sqlca.sqlcode )
     {
      sprintf(elog.gs_logMsg,
    "数据类型或长度错误.(DB=%s, KEY=[%s][%s][%s])",
        elog.gs_sqlTableName,elog.gs_key1,elog.gs_key2,elog.gs_key3);
     }
     
    else if ( M_INVALID_NUMBER == sqlca.sqlcode)
     {
      sprintf(elog.gs_logMsg,
    "非法数据.(DB=%s, KEY=[%s][%s][%s])",
        elog.gs_sqlTableName,elog.gs_key1,elog.gs_key2,elog.gs_key3);
     }
     
    else if ( M_STR_TERM_NULL_MISSING == sqlca.sqlcode)
     {
      sprintf(elog.gs_logMsg,
    "字符串超长.(DB=%s, KEY=[%s][%s][%s])",
        elog.gs_sqlTableName,elog.gs_key1,elog.gs_key2,elog.gs_key3);
     }
     
    else if ( M_DUP_VAL_ON_INDEX == sqlca.sqlcode )
     {
      sprintf(elog.gs_logMsg,
    "主键重复.(DB=%s, KEY=[%s][%s][%s])",
        elog.gs_sqlTableName,elog.gs_key1,elog.gs_key2,elog.gs_key3);
     }
     
    else {
      sprintf(elog.gs_logMsg,
    "SQL error, SQLCODE=[%d]. %.*s",
        sqlca.sqlcode, sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
     }
     
    }

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

  • 相关阅读:
    Combine 框架,从0到1 —— 4.在 Combine 中使用计时器
    Combine 框架,从0到1 —— 4.在 Combine 中使用通知
    Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
    Combine 框架,从0到1 —— 2.通过 ConnectablePublisher 控制何时发布
    使用 Swift Package Manager 集成依赖库
    iOS 高效灵活地配置可复用视图组件的主题
    构建个人博客网站(基于Python Flask)
    Swift dynamic关键字
    Swift @objcMembers
    仅用递归函数操作逆序一个栈(Swift 4)
  • 原文地址:https://www.cnblogs.com/9421/p/1746478.html
Copyright © 2011-2022 走看看