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);
     }
     
    }

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

  • 相关阅读:
    ACM实用C语言函数
    Java中的数组和方法
    eclipse常用快捷键
    【转载】第十章 五种对称加密算法总结
    【转载】ZooKeeper学习第二期--ZooKeeper安装配置
    【转载】Java垃圾回收机制
    【转载】JVM系列三:JVM参数设置、分析
    【转载】JVM系列二:GC策略&内存申请、对象衰老
    【转载】JVM系列一:JVM内存组成及分配
    java项目性能测试过程记录
  • 原文地址:https://www.cnblogs.com/9421/p/1746478.html
Copyright © 2011-2022 走看看