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

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

posted @ 2010-05-28 17:07  9421  阅读(1487)  评论(1编辑  收藏  举报