刚到,下周才给分任务,只是自己看一些文档,很多新的东西需要去深入学习
:::::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。 分页
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链接库
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++ 的标准头文件部分 *****/