开端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。 分页  

 

ExpandedBlockStart.gif 代码
//  efPager2
//  
this .efPager2.Controls.Add( this .efNumericUpDown1);
this .efPager2.Controls.Add( this .efNumericUpDown2);
this .efPager2.CurrPageNo  =   0 ;
this .efPager2.Location  =   new  System.Drawing.Point( 512 440 );
this .efPager2.Name  =   " efPager2 " ;
this .efPager2.RecordCountPerPage  =   20 ;
this .efPager2.Size  =   new  System.Drawing.Size( 376 24 );
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( 512 440 );
this .efPager2.Name  =   " efPager2 " ;
this .efPager2.RecordCountPerPage  =   20 ;
this .efPager2.Size  =   new  System.Drawing.Size( 376 24 );
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链接库

ExpandedBlockStart.gif 代码
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++ 的标准头文件部分 *****/

ExpandedBlockStart.gif 代码
#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, 
0x00 sizeof (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,  0L 0 );
/*  ***** -EP_SYSTEM_HEAD_END *****  */


int  f_ymbw01_inq1(EIClass  *  bcls_rec, EIClass  *  bcls_ret) 
{
 
 EDLog(
1 1 "  **************%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(
1 1 " [%s] S.FLAG [%d] " , s.svc_name, s.flag);
 EDLog(
1 1 " [%s] S.MSG  [%s] " , s.svc_name, s.msg);
 EDLog(
1 1 " [%s] S.SQLCODE [%d] " , s.svc_name, s.sqlcode);
 EDLog(
1 1 " [%s] S.SQLMES [%s] " , s.svc_name, s.sqlmes);
 EDLog(
1 1 "  **************%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);
 }
 
}

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

转载于:https://www.cnblogs.com/9421/archive/2010/05/28/1746478.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值