加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Genero(Tiptop)中调用WebServices?

发布时间:2020-12-17 01:22:41 所属栏目:安全 来源:网络整理
导读:1. ???????? 什么是 WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通讯的操作系统中实施运行,它是一种新的 web 应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过 web 调用。 Web Service 是一个应用组件,它逻辑性

1.???????? 什么是WebServices?

它是一种构建应用程序的普遍模型,可以在任何支持网络通讯的操作系统中实施运行,它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务,各应用程序通过网络协议和规定的一些标准数据格式(HttpXMLSoap)来访问Web Service,通过Web Service内部执行得到所需结果。Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。实际上,WebSerice的主要目标是跨平台的可互操作性。为了达到这一目标,WebService完全基于XMLXSD等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。在以下三种情况下,使用WebService会带来极大的好处:

1)??????? 跨防火墙的通讯

2)??????? 应用程序集成

3)??????? B2B的集成

4)??????? 软件和数据重用

不过,也有一些情况,WebService根本不能带来任何好处。

一、单机应用程序

二、局域网的统购应用程序(此种集成,使用DCOMSOAP/HTTP效率高的多)

2.???????? 背景说明

鼎新的Tiptop ERP系统,采用法国4js公司的Genero开发工具,也就是俗称的第四代开发语音(4gl),其前身来源于Informix数据库,后经过4js公司的扩展,目前已可以兼容多种数据库,比如重量级的OracleDB2等,还有一些轻量级的,如GeneroDB,mySQL等。因为Tiptop系统通常运行在Unix/Linux平台,跟基于SQL Server数据库的应用程序集成的时候便显得异常困难。虽然可以使用如Oracle的透明网关之类的解决方法,但是却受到颇多限制(Oracle也只限Win平台),因此使用WebService的方式就顺利成章了。所幸,Genero中已经提供了针对WebService的解决方案,而且相当的简单。

本人使用的Tiptop版本为GP5.X。鼎新已经在其产品包中提供了很多关于Web Services的程序,本文不打算讨论这些针对ERPWeb Services,就从Genero的底层开始,探讨如何使用4gl调用Web Service函数,来实现ERP数据跟另外一个系统(数据库平台为SQL Server)的同步。除了实现数据库同步外,还可以实现其他复杂的业务逻辑,本文仅抛砖引玉,如果你有更好的方案,可以同作者交流。

如果需在在Genero中提供Web Service服务函数,另开文章探讨。

3.???????? 测试本文档需要具备的条件?

l???????? IIS(Internet Information Services)Web Server,部署web servies的服务器

l???????? Visual Studio 2005,开发Web Services服务函数。当然也可以使用其他开发工具开发,本文以C#为例说明。

l???????? Genero Studio,开发客户端4gl程序,可以是其他工具,如UEVI等。

l???????? 程序要达到的目的:ERP有一个基本档aooi040,用来输入员工基本信息,员工的工号为Key值,不允许在ERP中直接修改。程序最终看到的结果:ERP中新增、修改、删除数据记录时,同时在另一个系统的SQL Server数据库的数据也会同步更新。SQL SERVER的数据结构如下:

CREATE TABLE [dbo].[Employee](

??? [ID] [int] IDENTITY(1,1) NOT NULL,

??? [EmpCode] [varchar](8) COLLATE Chinese_PRC_CI_AS NOT NULL,

??? [EmpName] [varchar](30) COLLATE Chinese_PRC_CI_AS NULL,

??? [EmpDept] [varchar](6) COLLATE Chinese_PRC_CI_AS NULL,

??? [CreateDate] [smalldatetime] NULL,

?CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED

(

??? [EmpCode] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

4.???????? 服务端程序的开发?

1)??????? 创建ASP.NET Web服务应用程序,如下图:

?

2)??????? 程序代码如下:(省去中间IDE中处理若干)

using System;

using System.Data;

using System.Web;

using System.Collections;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.ComponentModel;

using System.Data.SqlClient;

?

namespace sync2

{

??? /// <summary>

??? /// Service1 的摘要说明

??? /// </summary>

??? [WebService(Namespace = "http://tempuri.org/")]

??? [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

??? [ToolboxItem(false)]

??? public class sync2 : System.Web.Services.WebService

??? {

?

??????? public struct myGen

??????? {

??????????? public string gen01;

??????????? public string gen02;

??????????? public string gen03;

??????????? public DateTime gendate;

??????? }

?

??????? [WebMethod]

??????? public bool AccessGenN(String AccessType,myGen RecValue)

??????? //返回值:作业成功返回true,失败返回false

??????? //输入参数:AccessType:I->Insert,D->Delete,U->Update

??????? {

?

??????????? //连接Sql Server数据库

??????????? SqlConnection SqlCn = new SqlConnection();

??????????? SqlCn.ConnectionString = @"Password=test;Persist Security Info=True;User ID=test;Initial Catalog=testDB;Data Source=.";

??????????? SqlCn.Open();

?

??????????? //数据写入sql server数据库中

??????????? int rowcount;

??????????? try

??????????? {

??????????????? string strSQL = "";

?

??????????????? if (AccessType == "I")

?????????? ?????{

??????????????????? strSQL = "Insert Into Employee Values ('" + RecValue.gen01 + "','" +

????????????????????????????? RecValue.gen02 + "','" + RecValue.gen03 + "','" +

????????????????????????????? RecValue.gendate + "')";

??????????????? }

????? ??????????if (AccessType == "D")

??????????????? {

??????????????????? strSQL = "Delete Employee Where EmpCode='" + RecValue.gen01 + "'";

??????????????? }

??????????????? if (AccessType == "U")

??????????????? {

??????????????????? strSQL = "Update Employee Set " + "EmpName='" + RecValue.gen02 +

???????????????????????????? "',EmpDept='" + RecValue.gen03 + "' Where EmpCode='" +

???????????????????????????? RecValue.gen01 + "'";

??????????????? }

?

??????????????? SqlCommand mySqlCommand = new SqlCommand(strSQL,SqlCn);

??????????????? rowcount = mySqlCommand.ExecuteNonQuery();

?

??????????? }

??????????? catch

??????????? {

??????????????? rowcount = 0;

??????????? }

??????????? SqlCn.Close();

??????????? if (rowcount > 0)

??????????????? return true;

????? ??????else

??????????????? return false;

??????? }

??? }

}

?

不熟悉.netWeb Service的写法的可以去参考相关书籍,注意代码中的[WebMethod]声明。

3)??????? 代码编译

4)??????? 发布到IIS

?

?

5)??????? 打开IE,看看浏览器中显示是否正常?

?

至此,服务端已经开发完成且发布OK

5.???????? 客户端程序的开发?

1)??????? 生成客户端4gl的代理类。在</u1/toptest/topcust/coo/4gl>路径下执行以下命令:fglwsdl http://localhost/services/sync2.asmx?WSDL,执行后便在当前路径下产生两个文件,一个是inc文件(存储调用web service时的变量定义),另一个是代理类文件,以4gl结尾。此代理类文件跟.NET中代理类的含义类似,但是较.NET稍微复杂一点,有兴趣的可以打开看看,里面包含了web serviceuri地址,其中比较重要的算是Import com这句了,可以看到4gl的所有涉及web service的程序都在这个模组当中。然后编译此4gl,生成42m档。

2)??????? 修改调用程序。依照tiptop的客制规范,将aooi040.4gl拷贝到$CUST下相应目录进行修改。首先要把inc文件放在代码的头部。如:GLOBALS "/u1/toptest/topcust/coo/4gl/sync2_sync2Soap.inc"。新增加一个函数来统一调用web services函数

FUNCTION i0401_syncsqlN(p_type,p_recval)

? DEFINE p_type STRING

? DEFINE p_recval RECORD

??????????????????? gen01 STRING,

??????????????????? gen02 STRING,

??????????????????? gen03 STRING,

??????????????????? gendate DATETIME YEAR TO FRACTION(5)

????????????????? END RECORD

?

? DEFINE wsstatus INTEGER

? LET AccessGenN.AccessType=p_type

? LET AccessGenN.RecValue.*=p_recval.*

? LET wsstatus = AccessGenN_g()

? IF wsstatus <>0 THEN

??? DISPLAY "Error ("||wsError.code||") :",wsError.description

? ELSE

??? IF AccessGenNResponse.AccessGenNResult = 0 THEN

????? DISPLAY "Run Failed!"

??? ELSE

????? DISPLAY "Run Succeed!"

??? END IF

? END IF

END FUNCTION???

3)??????? 在代码的适当位置,调用此函数。如在Insert Into gen_file之后执行:

?????????? let l_gen.gen01=g_gen[l_ac].gen01

?????????? let l_gen.gen02=g_gen[l_ac].gen02

?????????? let l_gen.gen03=g_gen[l_ac].gen03??????????

?????????? let l_gen.gendate=g_today??????????

?????????? CALL i0401_syncsqlN("I",l_gen.*)

4)??????? 好了,现在编译此文件,然后进行linklink的时候记得把之前代理类的42m文件一起进行编译。编译完成,运行一下看看吧,是不是:So easy!。当然web service的功能不限于此,发挥你的想象力吧。4gl有了这把利剑,是不是如虎添翼了。

?

?

后记:

此代码测试环境:sql server 2005/IIS5.1/visual studio 2005/tiptop gp 5.1

如果需要完整的源代码,可以联系billfox@yeah.net索取,如果您有更好的解决办法或者更好的想法,欢迎交流。QQ19228565

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读