2024年1月24日发(作者:)

Delphi Client端数据包发送接收处理说明

1> 自定义报文简介

以不定长字符流方式设计。报文结构大致可理解为报文头+报文体,最小单位以“NAME:VALUE”对的型式, NAME、VALUE都以各自的长度为前缀;一条典型的发送报文如下所示:

009MessageID:00574606:013TransactionID:005BOKFS:

003///:0011:003ROW:0011:003COL:0014:010Packeduser:003LHY:010packedtime:0192006-06-06 10:29:37:004flag:001Y:009accessory:0011:

003///:0012:003ROW:0011:003COL:0017:009IMPRESTNO:5721:008inittime:0192006-06-16 15:30:04:009CompanyID:003ITC:

011Companytype:001A:009payamount:0041936:012actualamount:0041936:008category:006帐单:003$$$

解析说明:

NAME

Length

009

013

006

008

008

003

003

003

010

010

004

009

......

003

NAME

MessageID

TransactionID

Err_ID

Err_DESC

Err_DESE

///

ROW

COL

Packeduser

packedtime

flag

accessory

$$$

Req?

Y

Y

返回报文Y

返回报文Y

返回报文Y

如有内容Y

如有内容Y

如有内容Y

N

N

N

N

Y

VALUE

Length

005

005

003

004

007

001

001

001

003

019

001

001

VALUE

74606

BOKFS

000

成功

Success

1

1

4

LHY

2006-06-06 10:29:37

Y

1

说明

报文头,报文ID

报文头,交易ID

出错ID,000为成功,

异常中文描述

异常英文描述

报文体,组号符

报文体,行数

报文体,列数

报文体,内容值

报文体,内容值

报文体,内容值

报文体,内容值

报文结束符

一条典型的返回报文如下所示:

009MessageID:00573936:013TransactionID:013COMSQL_SELECT:006Err_ID:003000:008Err_DESC:004正确:008Err_DESE:002OK:

003///:0011:003ROW:0013:003COL:0012:008CTN_TYPE:002GS:020CTN_TYPE_DESCRIPTION:009普通箱[3]:008CTN_TYPE:002TN:020CTN_TYPE_DESCRIPTION:006罐状箱:008CTN_TYPE:002UT:020CTN_TYPE_DESCRIPTION:006开顶箱:003$$$

★请解析说明?

注意:返回报文必须要带有错误信息Err_ID、Err_DESC、Err_DESE。

2> 报文收发流程

主流程相关函数 Send_ComSql_Select () Send_ComSql_Update () Send_Transaction_Package ()功能子窗体组织需发送的请求数据 xt ()主窗体发送请求数据子窗体句柄、接收数据容器进入等待队列;加锁子窗体 Push () UnEnableForm ()主窗体接收返回数据 eText ()主窗体收到返回数据后拼包 CreateReceivePackage ()否是否报文尾是子窗体解锁,子窗体句柄、接收数据容器出队列 Pop () Enableform ()解析报文;分组;返回数据装入接收数据容器 DisPackage()

ReceivedPackageToGrid ()执行窗体Execute

(),显示返回的数据集 Execute ()

3> 发送接收报文关键函数介绍:

发送Select型简单Sql函数:

Send_ComSql_Select(const Comsql:string; //要发送的SQL查询语句

AForm:TForm; //当前发送的窗口

var ResultGrid:TstringGrid; //返回的错误信息(1行3列)

var ADASGrid: TDASG; //返回的查询结果集

const ExecuteNo:integer); // Execute () 执行序号

ResultGrid的结构:

返回代码(Err_ID)

000

001-099

100-199

200-999

003

英文描述(Err_DESE)

ok

SystemError

DataBaseError

transactionError

timeout

中文描述(Err_DESC)

操作成功

系统级错误

数据库级错误

业务级错误

连接超时

一次发送多条Select型Sql函数:

Send_ComSql_Select(const Comsql: TDAS; //要发送的SQL查询语句(String数组)

AForm: TForm;

var ResultGrid: TstringGrid;

var ADASGrid: TDASG; //查询结果集(StringGrid数组)

const ExecuteNo: integer;

var ACmb_FieldName: TCombobox); // ComboBox可以不用

发送Update型简单Sql(执行 update ,delete,insert类型的SQL语句):

Send_ComSql_Update(const Comsql:string;

AForm:TForm;

var ResultGrid:TstringGrid; //返回的错误信息(1行3列)000

const ExecuteNo:integer);

发送Transaction数据包(执行有事务性控制的交互如:存储过程、多表更新、批量更新)

Send_Transaction_Package(const TransactionID: string; //交易ID

AForm: TForm; //当前发送的窗口

var ResultGrid: TstringGrid; // 返回的错误信息(1行3列)

var FdataGrid: TDASG; //返回的查询结果集

const ExecuteNo: integer; //Execute () 执行序号

const TransactionStr: string = 'Null'); //发送字符串(报文体)

(从003///到003$$$的报文体)

发送Transaction数据包 (不带结果集)

Send_Transaction_Package(const TransactionID: string;

AForm: TForm;

var ResultGrid: TstringGrid;

const ExecuteNo: integer;

const TransactionStr: string);

典型的Transaction介绍

TransactionID : COMSP (调用存储过程,使用第一种Send Transaction)

TransactionStr : 003///:0011:003ROW:0011:003COL:00213:

006SPNAME:025SP_SHP_TRANSRF_VESSELLIST:

005PARA1:001T:009PARA1TYPE:008VARCHAR2:

005PARA2:003N/A:009PARA2TYPE:008VARCHAR2:

005PARA3:005ERRID:009PARA3TYPE:008VARCHAR2:

005PARA4:007ERRDESC:009PARA4TYPE:008VARCHAR2:

005PARA5:007ERRDESE:009PARA5TYPE:008VARCHAR2:

005PARA6:004DATA:009PARA6TYPE:004CLOB:

TransactionID : COMSQL_UPDATETRANS(多表/批量更新,使用第二种Send Transaction)

TransactionStr : 003///:0011:003ROW:0013:003COL:0011:

009SQLUPDATE: [ Length + SQL ] :

009SQLUPDATE: [ Length + SQL ] :

009SQLUPDATE: [ Length + SQL ] :

把当前界面上Tag标记大于0的StringGrid内容组织成发送报文

FormSend (const Form1: TForm;

const De: boolean): string; // 返回组织好的发送报文(报文体)

接收返回数据函数

Execute(var ResultGrid: TStringGrid; // 对应的返回的错误信息集

var ADateGrid: TDASG; //对应的查询结果集(StringGrid数组)

const No: integer) // 执行序号

每个功能子窗体都应有此函数,声明成public ,供主窗体解析返回报文后调用;

4> 代码命名规范

窗体名:必须以“Form”开头后跟该窗体功能的缩略英文描述

单元名:必须以“Unit” 开头后跟窗体名(有窗体的)或功能的缩略英文描述

常用控件名:必须前缀+”_”+缩略英文描述(前缀名见《Delphi 4 code chinese》)

5> 练习

说明:

完成对指定单表的增、删、改、查操作。

要求:

1.严格遵照编码设计规范命名。

2.灵活运用<3>中多种手段实现。