Difference between revisions of "Using the ADE Server/zh"
(Created page with "试用ADE服务器") |
|||
(141 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
[[Category:ADE User Guide]] | [[Category:ADE User Guide]] | ||
<languages /> | <languages /> | ||
− | [[ADE User Guide]] > | + | [[ADE User Guide/zh|ADE用户指南]] > |
− | + | 此章描述了Analytica决策引擎服务器类型[[CAEngine/zh|CAEngine]]、[[CALicense/zh|CALicense]]、[[CAObject/zh|CAObject]]、[[CATable/zh|CATable]]、[[CAIndex/zh|CAIndex]]和[[CARenderingStyle/zh|CARenderingStyle]],以及服务器类型构架。 | |
− | ==ADE | + | ==ADE 类型== |
− | + | ADE使用一下六种类型: | |
− | * | + | *[[CAEngine/zh|CAEngine]]类型所包含的方法和属性允许你打开和关闭现有模型、建立新模型、建立新的Analytica对象,以及访问你模型中所包含的Analytica对象。 |
− | * | + | *[[CALicense/zh|CALicense]]类型所包含的方法允许你实例化[[CAEngine/zh|CAEngine]]、允许你使用一种特殊应用程序许可证代码、允许你检查ADE许可证上的某种限制、以及获取关于为什么[[CAEngine/zh |CAEngine]]未能成功实例化的详细信息。 |
− | * | + | *[[CAObject]]类型所包含的方法和属性允许你设置和获取从[[CAEngine/zh|CAEngine]]获取的Analytica 对象(例如变量模块)的相关信息。 |
− | * | + | *[[CATable/zh | CATable]]类型用来检查多维结果或者查看和修改多维定义表格(也称为编辑表)。 |
− | * | + | *一个[[CAIndex/zh|CAIndex]]对象 允许你访问一个多维[[CATable/zh | CATable]]的一个维度。 |
− | * | + | *[[CARenderingStyle/zh | CARenderingStyle]]是在ADE 4.0中出现的新特征,允许你控制或改变ADE返回值的格式 。 |
− | ''''' | + | '''''注意:''' 着些类型名称中的“CA”代表“Class Analytica。”'' |
− | + | 下面的部分描述了如何从Visual Basic或者C#中访问这些Analytica Server对象。 | |
− | == | + | ==服务器类型构架== |
− | === | + | ===COM、Autoation、 和.NET=== |
− | ADE 4. | + | ADE 4.6支持两种调用约定:COM和ActiveX Automation。COM是一种前期绑定的约定,在此约定中方法和数据类型会在你的应用程序代码被编译时确定。Automation是一种后期绑定的约定,在运行时间内决定方法调用。COM约定稍微有效一点,虽然对于大多数应用程序,该效率上的差异被计算模型结果所需时间远远地盖过。 |
− | + | 在Visual Basic中,使用COM或Automation的调用语法是相同的,使用哪种结构取决于你如何声明你的对象。在其他语言中,例如C#或C++,调用方法看起来完全不同。在C#或C++中,使用COM结构一般更加方便。VBScript(Windows Scripting Host和更旧的IIS ASP版本使用)只支持Automation接口。 | |
− | + | COM接口可以在.NET环境中,例如Visual Studio 2005,透明地使用。.NET编程环境通过使用.NET互操作对象隐藏了COM对象,这给与了ADE接口.NET接口的外观。 | |
− | + | 在ADE 3.1以及以前版本中,Automation接口是推荐使用的约定。但是随着ADE 4.6的发布,我们推荐使用COM接口,除非在你的编程环境(例如VBScript)中没法使用。 | |
− | === | + | ===进程内和进程外比较 === |
− | + | ADE可以在进程内或进程外启动。当我们在进程内(ASEW)启动时,<tt>Adew.dll</tt>库被载入到你的应用程序进程空间内。当启动进程外(ADE)时,<tt>ADE.exe</tt>服务器启动,并且在不同进程内运行。两种服务器类型都是用相同的类型接口,所以到底选择使用哪种服务器通常可以通过编辑单独实例化'''CAEngine'''的这一行代码就可以改变选择。 | |
− | + | 进程内服务器性能稍微好一点,但同时有一些限制。首先,ADEW的 ''单元 ''线程模型必须和你的应用程序的线程模型兼容。例如Microsoft IIS web server(IIS 5.0或后期版本)在其默认设置下不允许你使用单元-线程组件。其次,还限制你在任何时候在内存内只有一个[[CAEngine/zh|CAEngine]]实例(因此只有一个模型)。 | |
− | + | ADE的进程外实例在不同进程内运行,能够设置让你从你的应用程序上在另一台电脑运行。因为数据必须是跨进程打包。你的程序可以同时使用多个ADE实例,每一个都有单独的载入模型实例。例如,过程外服务器几乎总是更适合web应用程序,因为对于每一个回话,你都可以有一个ADE实例。 | |
===Typescript=== | ===Typescript=== | ||
− | + | 除了程序接口,ADE还有一个完整的函数命令结构,称为''typescript''语言。该语言在[[Analytica Scripting Guide|Analytica脚本指南]]有描述。该语言允许你获取并使用ADE全部功能。API提供了一个更加方便、定向于对象的一组函数,用来从Visual Basic和C++中与引擎通讯。一个调用程序可以使用API函数,或者可以将typescript指令直接传递给typescript接口。 | |
− | [[File:AnalyticaDecisionEngineArchitecture.jpg|375px]] | + | [[File:AnalyticaDecisionEngineArchitecture.jpg|375px|文件:AnalyticaDecisionEngineArchitecture.jpg|375px]] |
− | === | + | ===IIS下的安全性权限=== |
− | + | 当在Internet Information Server (IIS:互联网信息服务器)下的Microsoft Active Server Pages(ASP/ASPX:动态服务器页面)中使用ADE时,你可能需要陪着许可权限设置以便从你的应用程序实例化、访问ADE COM组件。 | |
− | + | 在建立一个web应用程序或者web服务器时,你应该使用进程外ADE服务器。当你的ASPX应用程序在提供页面请求时被执行的情况下,ADE COM | |
+ | 组件将从一个特殊的内部Windows账户名中启动并访问。即使在你的账户下运行时,你的应用程序能够建立并访问ADE,对于ASP或者ASPX来说不存在同样的访问。要配置安全性权限以便你的ASPX应用程序可以使用ADE,按照下面步骤操作: | ||
− | # | + | #从Windows控制面板上选择'''管理员工具 > 组建服务'''. |
− | #*''''' | + | #*'''''注意:'''如果你在一台64位计算机上使用32位版本ADE,那么你必须运行:<tt>mmc comexp.msc /32 </tt> |
− | # | + | #在'''DCOM Config''' 文件夹中找到“Analytica Decision Engine Local Server 4.6。” |
− | # | + | #从右鼠标快捷菜单上选择'''Properties'''(属性) ,再选择 Security(安全性)标签。 |
− | # | + | #将'''Launch and Activation Permissions'''(启动并激活许可) 设置成'''Customize'''(自定义)然后点击'''Edit'''(编辑) |
− | # | + | #授予IIS使用账户本地启动以及本地激活许可。在 IIS 5通常是<tt>{computer_name}\ASPNET</tt>。在IIS 6 & 7通常为<tt>NETWORKSERVICES</tt>或者 <tt>IIS_IUSRS</tt>,在 IIS 7.5,应该设置应用程序池名称上相应的这些设置。,通常为“<tt>IIS AppPool\DefaultAppPool</tt>”。 |
− | # | + | #保存这些设置。你可能需要重启你的机器才能完成这些改变。 |
− | + | 当这些许可配置不正确时,在你尝试实例化的 [[CAEngine/zh|CAEngine]]的程序上将出现一条“security exception” (安全故障)信息。 | |
− | == | + | ==ADE测试程序== |
− | ADE 4. | + | ADE 4.6和名称为<tt>AdeTest.exe</tt>的示例程序一同安装。可执行文件位于<tt>Examples/AdeTest/bin 目录</tt>。你可以使用AdeTest来联系内部进程(<tt>Adew.dll</tt>)或者AD4.6E的本地进程(<tt>ADE.exe</tt>)版本的功能。通过使用AdeTest,你可以将脚本指令发送给引擎,建立ADE对象,实际上设置或调用ADE对象的任何属性和方法。如果你安装了Visual Studio 2005,你可以逐句调试Visual Studio Debugger中的代码以观察调用的方法。 |
− | + | 下面的图像显示了AdeTest程序对话窗口。左手边的窗体显示了一个当前程序所包含的ADE对象列表。右边显示了其中一个对象的详细信息。在此图中,有三个[[CAEngine/zh|CAEngine]]实例,每一个都有一个打开的不同模型,第一个[[CAEngine/zh|CAEngine]]是一个个进程内实例(<tt>Adew.dll</tt),而其他两个是进程外服务器实例(<tt>ADE.exe</tt)。当右手边窗体右下角的'''Release'''按钮释放一个实例时,左边窗体上方的两个按钮可以用来建立其他的[[CAEngine/zh|CAEngine]]实例。右边窗体显示了第三个[[CAEngine/zh|CAEngine]]实例的相关信息。[[CAEngine/zh|CAEngine]]相关属性:'''ErrorCode'''、'''ErrorText'''、'''CurrentModule'''、'''OutputBuffer''',和 '''Photo''' 的当前值将显示。通过将指令输入进文本框并点击'''Send''' (发送)按钮,你可以执行一个typescript指令。或者通过选择'''Method''' (方法)下拉框中的方法,填写参数并点击'''Execute Method'''(执行方法)按钮,你可以[[CAEngine/zh|CAEngine]]的任何一种方法。 | |
− | [[File:ADETestDialog.jpg]] | + | [[File:ADETestDialog.jpg|文件:ADETestDialog.jpg]] |
− | + | 如果你点击右手边窗体中的一个对象,其对象属性将显示在收邮编,你可以设置其属性或者调用其方法。因此,你可以模拟你的程序在一个图形接口界面可能执行的一系列的步骤。 | |
− | + | 当一种方法返回一个对象时,例如,就'''CAEngine::GetObjectByName'''来说,返回对象被添加到左手边的关系树上成为创建它的对象的子对象。在从一个类型而非[[CAEngine/zh|CAEngine]]执行一种方法后,浏览一下相应的[[CAEngine/zh|CAEngine]]面板检查''ErrorCode'''、'''ErrorText''',和'''OutputBuffer''' 等属性是一个不错的习惯。 | |
− | + | Analytica窗口上的'''Photo'''复选框是[[CAEngine/zh|CAEngine]]类型'''Photo''' 属性的映射。默认情况下'''Photo'''的属性是 False(假),因此用户和ADE之间的typescript通讯不会被复制到Analytica日志窗口中。将'''Photo'''属性设置成True(真)将复制用户和ADE之间的所有后继的typescript通讯。在Visual Basic中,实现此过程如下所示: | |
:ADE.Photo=True | :ADE.Photo=True | ||
:ADE.Photo=False </tt> | :ADE.Photo=False </tt> | ||
− | + | 打开'''Photo'''属性将明显减慢与ADE之间的通讯。 | |
− | == | + | == Excel中Visual Basic样本应用程序== |
− | + | 另一个名称为<tt>excel_exam</tt>的示例应用程序也包含到ADE程序包中。在<tt>excel_exam</tt>目录下的 <tt>Analytica.xls</tt>程序可以载入到Microsoft Excel中,作为一个宏来运行。该程序演示了Visual Basic如何用来在Excel中应用程序里面和ADE通讯。该示例使用了ADE本地服务器版本。 | |
− | == | + | ==ASP web 应用程序示例== |
− | + | <tt>asp_exam</tt>中的示例演示了如何从一个动态服务器页面web应用程序中使用ADE。该应用程序生成了一个使用HTML语言编写的你的模型结构的分层大纲。该目录中的<tt>readme.txt</tt>文件包含配置运行该示例的web服务器的说明。 | |
− | + | 在使用Microsoft的ASP(动态服务器网页)时,我们推荐使用本地服务器。通过使用本地服务器(<tt>ADE.exe</tt>),你可以确保每一个web应用程序,或者甚至每一个会话使用<tt>ADE.exe</tt>的不同版本。当前,在ADE中有一个限制阻止同时建立两个或者多个进程内服务器对象。因此,如果你想同时有多个ADE会话(同基于web的应用程序基本完全一样),总是使用ADE本地服务器。 | |
− | == | + | ===在Visual Studio 2005中的.NET项目中=== |
− | === | + | ==使用ADE COM 接口== |
− | + | 在Visual Studio 2005中的Visual Basic、C#、J#、ASP.NET、或者 C++/CLR项目中,你可以通过在你项目中向其添加一个引用来访问ADE。旧的Visual Basic版本(pre-.NET)和少数其他非Microsoft开发环境该方法稍微有点变化。 | |
− | + | 在Visual Studio 2005中,选择'''Project''' (项目)菜单上选择 '''Add reference or References'''(添加引用),在出现的对话框中,选择'''COM'''标签(在VC++中你必须点击'''Add new reference'''按钮来获得'''COM'''标签)。在组件列表中,找到并选择下面其中的一个:<tt> | |
:Analytica Decision Engine Local Server 4.6 | :Analytica Decision Engine Local Server 4.6 | ||
:Analytica Decision Engine Server 4.6 </tt> | :Analytica Decision Engine Server 4.6 </tt> | ||
− | + | 对于进程外 <tt>ADE.exe</tt>服务器,选择Local server(本地服务器)。要使用<tt>Adew.dll</tt>,选择nonlocal server(非本地服务器)。当然也可能对一个项目添加这两个引用(示例AdeTest就是这样做的),但是这很少见。 | |
− | + | 对于本地服务器和进程内服务器,ADE类型出现在同一名称空间。为了方便起见,你可以添加<tt>using</tt>声明到你的源文件的顶部,如下所示<tt> | |
:Imports ADE ’ Visual basic | :Imports ADE ’ Visual basic | ||
:using ADE; // C# | :using ADE; // C# | ||
Line 97: | Line 98: | ||
:import ADE.*; // J#</tt> | :import ADE.*; // J#</tt> | ||
− | + | 当然,在使用进程内服务器时,你将在上面的<tt>ADE</tt>的地方输入<tt>ADEW</tt> 。这些声明允许你在你的代码证引用[[CAEngine/zh|CAEngine]]、[[CAObject/zh|CAObject]]等等,而非'''ADE.CAEngine'''、 '''ADE.CAObject'''等,这使从本地ADE服务器装换成进程内服务器非常容易。 | |
− | + | 在开始使用ADE之前,你必须先先安装[[CAEngine/zh|CAEngine]],按照如下所示完成:<tt>:dim ADE as [[CAEngine/zh|CAEngine]] = new CAEngineClass ’ VB | |
− | :dim ADE as [[CAEngine]] = new CAEngineClass ’ VB | + | :[[CAEngine/zh|CAEngine]] ADE = new CAEngineClass(); // C#, J# |
− | :[[CAEngine]] ADE = new CAEngineClass(); // C#, J# | + | :[[CAEngine/zh|CAEngine]]^ pAde = gcnew CAEngineClass(); // C++/CLR </tt> |
− | :[[CAEngine]]^ pAde = gcnew CAEngineClass(); // C++/CLR </tt> | ||
− | [[CAEngine]] | + | [[CAEngine/zh|CAEngine]]是一个特殊抽象接口的名称,而'''ADEW.CAEngineClass'''和'''ADE.CAEngineClass'''是执行该结构的两个特殊对象的名称。[[CAEngine/zh|CAEngineClass]]是唯一你能直接建立的对象;所有其他ADE对象实例是通过调用现有对象上的方法来获取的。 |
− | + | 要继续使用COM接口,你得使用[[CAEngine/zh|CAEngine]]、[[CAObject/zh|CAObject]]、[[CATable/zh|CATable]]、[[CAIndex/zh|CAIndex]]和[[CARenderingStyle/zh|CARenderingStyle]]等类型名称声明你的变量。避免分配对象实例给声明为'''System.Object'''的变量。这允许编译器执行初期绑定和类型检查。 | |
− | === | + | ===.释放NET中的对象=== |
− | + | 在pre-.NET Visual Basic和脚本语言中,编程环境自动确保COM对象立即释放。这和在VB.NET、ASP.NET、或其他.NET程序中情况不一样。当释放对象贯穿真个程序时,程序从.NET明确释放每一个COM对象非常重要。将一个指针设置成Null(或者Nothing)是不够的,因为实际释放知道下一个垃圾回收菜发生。 | |
− | + | 要想从.NET程序释放一个COM对象的话,你必须执行下面相似的代码(C# 语法):<tt> | |
:System.Runtime.InteropServices.Marshal.ReleaseComObject(ADE); | :System.Runtime.InteropServices.Marshal.ReleaseComObject(ADE); | ||
:ADE = null; </tt> | :ADE = null; </tt> | ||
− | + | 在你使用一个进程外COM服务器(例如:'''ADE.CAEngine''')时,以这种方式释放对象尤其重要。在此情况下,内存资源主要被ADE进程消耗,而不是被你的程序进程。这可能导致在你的程序使用足够的内存之前,ADE进程用完内存,导致自动垃圾回收发生。基于.NET的web应用程序的<tt>ADE.exe</tt>旧进程在一个会话完成后将长时间存在,除非你明确释放[[CAEngine/zh|CAEngine]]对象。 | |
− | + | 需要释放COM对象不是ADE特有的。你必须处理释放所有COM对象,包括Microsoft提供的,尤其是当这些COM对象时进程外的时候。 | |
− | + | 因为.NET中缺少这种确定性资源回收,所以确保所有COM对象都被释放让人感到很厌烦。一次,你可能偶尔想在你的代码中执行明确的垃圾回收,以此释放所有无用对象。可以通过调用下面的函数完成:<tt> | |
:System.GC.Collect()</tt> | :System.GC.Collect()</tt> | ||
− | === | + | ===在C++ATL项目中=== |
− | + | 如果要在一个非.NET C++项目中使用ADE 4.6,将下面两行放在源文件的顶部:<tt> | |
:<nowiki>#</nowiki>import "ADE.exe" | :<nowiki>#</nowiki>import "ADE.exe" | ||
:using namespace ADE; </tt> | :using namespace ADE; </tt> | ||
− | + | 或者如果你想使用进程内服务器时,可以使用下面的语句:<tt> | |
:<nowiki>#</nowiki>import "Adew.dll" | :<nowiki>#</nowiki>import "Adew.dll" | ||
using namespace ADEW; </tt> | using namespace ADEW; </tt> | ||
− | + | 你必须将ADE根目录包含到项目设置中的包含路径中,或者在<tt>#import</tt>声明中清楚说明完整路径。 | |
− | + | 接下来,使用下面的代码获取第一个ADE引擎实例:<tt> | |
:CoInitialize(NULL); | :CoInitialize(NULL); | ||
:CAEnginePtr pAde(__uuidof(_CAEngine)); | :CAEnginePtr pAde(__uuidof(_CAEngine)); | ||
Line 141: | Line 141: | ||
:CoUninitialize(); </tt> | :CoUninitialize(); </tt> | ||
− | '''CoInitialize()''' | + | '''CoInitialize()'''是一个Windows系统调用,在COM系统能够使用之前必须调用。 |
− | + | 如果你的项目跨越多个代码文件,在你的每个源文件中使用以下代码:<tt> | |
:<nowiki>#</nowiki>import "ADE.exe" no_implementation </tt> | :<nowiki>#</nowiki>import "ADE.exe" no_implementation </tt> | ||
− | + | 然后只在一个文件中(比如所stdafx.cpp)包含以下代码:<nowiki>#</nowiki>import "ADE.exe" implementation_only</tt> | |
− | |||
− | == | + | ==使用ADE自动化接口== |
− | + | VBScript是一个脚本语言示例,可以在Windows脚本主机(<tt>CScript.exe</tt>或 <tt>WScript.exe</tt>)、动态服务器页面pre-.NET版本、Internet Explorer等环节下使用。JScript是另一种可以使用的脚本语言,还有其他许多脚本 OLE(对象链接和嵌入)自动化编译脚本语言可以使用,其中包含Perl语言。 | |
− | + | 这些脚本语言支持ActiveX自动化脚本,但是不支持COM接口。通过使用自动化接口,ADE能够在这些语言中使用,通常不需要其他工具,只需要一个简单的文本编辑器。 | |
− | + | 对于ADE4.6之前的版本,自动化接口是使用首选。对于支持直接调用COM的语言,ADE4.6中推荐首选COM接口。在C++或C#使用自动化接口是相当单调乏味的,在此我们没有叙述。 | |
− | === | + | ===在Visual Basic或 VBScript中使用=== |
− | + | 要使用自动化接口,没有必要给你的Visual Basic项目添加参考。下面的语法和其他脚本语言中使用情况相似。在Visual Basic中,实例化[[CAEngine]]的代码如下:<tt> | |
:dim ADE as Object | :dim ADE as Object | ||
:ADE = CreateObject("ADE4.CAEngine") </tt> | :ADE = CreateObject("ADE4.CAEngine") </tt> | ||
− | + | 在VBScript和更早的Visual Basic版本,set关键字是必须的:<tt> | |
:dim ADE | :dim ADE | ||
:set ADE = CreateObject("ADE4.CAEngine") </tt> | :set ADE = CreateObject("ADE4.CAEngine") </tt> | ||
− | + | 对于进程内服务器,将参数'''ADEW4.CAEngine'''发送给[[CreateObject/zh| CreateObject]]调用。 | |
− | ==ADE | + | ==ADE Typescript语言:指令语言通讯== |
− | + | [[CAEngine/zh|CAEngine]]类型的'''[[CAEngine::Command/zh|Command]]'''属性和'''[[CAEngine::Send/zh|Send]]'''方法允许你使用typeScript指令,作为ASCII字符串发送给引擎,并获取同为ASCII字符串的输出结果。在以下情况中,你可能更偏向于使用typescript指令: | |
− | * | + | *你想自己对来自Analytica决策引擎,以逗号隔开的文本字符串形式的ADE输出(例如一个列表数据)执行解析。 |
− | * | + | *不存在合适的API方法。 |
− | + | 你可以通过执行以下操作将typescript指令发送给ADE: | |
− | ! | + | !将包含该指令的一个文本字符串赋值给你的[[CAEngine/zh|CAEngine]]对象的Command(指令)属性。 |
− | # | + | #使用 [[CAEngine::Send/zh|Send]]方法将指令发送给引擎。如果[[CAEngine::Send/zh|Send]]方法返回<tt>True</tt>,那么ADE处理的指令没有错误。 |
− | # | + | #如果返回代码为非零,将错误代码和错误文本存储起来。这两条信息分别存储在[[CAEngine/zh|CAEngine]]属性[[CAEngine::ErrorCode]] 和[[CAEngine::ErrorText/zh|ErrorText]]中。 |
− | # | + | #通过调用[[CAEngine::Send/zh|Send]]类型中的[[CAEngine::OutputBuffer/zh|OutputBuffer]]函数获取输出。 |
− | ''''' | + | '''''注意:'''你也可以通过调用<tt>CAEngine.[[CAEngine::SendCommand/zh|SendCommand]](cmd)</tt>。''将前两步合并到其中。 |
− | + | 这些步骤在下面各种编程语言中有演示说明。在这些简单示例后面,跟了几个使用Visual Basic语法的例子,你应该能够推断使用了何种语言。 | |
− | === | + | ===在Visual Basic中=== |
<tt> | <tt> | ||
:Imports ADE | :Imports ADE | ||
Line 191: | Line 190: | ||
::Dim ErrCode as Integer | ::Dim ErrCode as Integer | ||
− | + | :dim ADE as [[CAEngine/zh|CAEngine]] = new [[CAEngine/zh|CAEngineClass]] | |
::ADE.Command = "news" ’any typescript command | ::ADE.Command = "news" ’any typescript command | ||
− | ::dim SendCode as Boolean = ADE.[[CAEngine::Send|Send]] | + | ::dim SendCode as Boolean = ADE.[[CAEngine::Send/zh|Send]] |
::If SendCode = False Then | ::If SendCode = False Then | ||
− | :::ErrCode = ADE.[[CAEngine::ErrorCode|ErrorCode]] | + | :::ErrCode = ADE.[[CAEngine::ErrorCode/zh|ErrorCode]] |
− | :::ErrT = ADE.[[CAEngine::ErrorText|ErrorText]] | + | :::ErrT = ADE.[[CAEngine::ErrorText/zh|ErrorText]] |
::Else | ::Else | ||
− | :::Result = ADE.[[CAEngine::OutputBuffer|OutputBuffer]] | + | :::Result = ADE.[[CAEngine::OutputBuffer/zh|OutputBuffer]] |
::End If | ::End If | ||
:End Sub | :End Sub | ||
:End Module </tt> | :End Module </tt> | ||
− | === | + | ===在VBScript中=== |
<tt> | <tt> | ||
:set ADE = CreateObject("ADE4.CAEngine") | :set ADE = CreateObject("ADE4.CAEngine") | ||
:ADE.Command = “news” | :ADE.Command = “news” | ||
:If ADE.Send = False Then | :If ADE.Send = False Then | ||
− | ::ErrCode = ADE.[[CAEngine::ErrorCode|ErrorCode]] | + | ::ErrCode = ADE.[[CAEngine::ErrorCode/zh|ErrorCode]] |
− | ::ErrT = ADE.[[CAEngine::ErrorText|ErrorText | + | ::ErrT = ADE.[[CAEngine::ErrorText/zh|ErrorText]] |
:Else | :Else | ||
− | ::Result = ADE.[[CAEngine::OutputBuffer|OutputBuffer]] | + | ::Result = ADE.[[CAEngine::OutputBuffer/zh|OutputBuffer]] |
:End if </tt> | :End if </tt> | ||
− | === | + | ===在C#中=== |
<tt> | <tt> | ||
:using System; | :using System; | ||
Line 226: | Line 225: | ||
::::String errT, result; | ::::String errT, result; | ||
::::int errCode; | ::::int errCode; | ||
− | ::::[[CAEngine]] ADE = new [[CAEngineClass]](); | + | ::::[[CAEngine/zh|CAEngine]] ADE = new [[CAEngine/zh|CAEngineClass]](); |
− | ::::ADE.[[CAEngine::Command|Command]] = "[[News]]"; | + | ::::ADE.[[CAEngine::Command/zh|Command]] = "[[News]]"; |
− | ::::if (!ADE.[[CAEngine::Send|Send]]()) { | + | ::::if (!ADE.[[CAEngine::Send/zh|Send]]()) { |
− | :::::errCode = ADE.[[CAEngine::ErrorCode|ErrorCode]]; | + | :::::errCode = ADE.[[CAEngine::ErrorCode/zh|ErrorCode]]; |
− | :::::errT = ADE.[[CAEngine::ErrorText|ErrorText]]; | + | :::::errT = ADE.[[CAEngine::ErrorText/zh|ErrorText]]; |
::::} else { | ::::} else { | ||
− | :::::result = ADE.[[CAEngine::OutputBuffer|OutputBuffer]]; | + | :::::result = ADE.[[CAEngine::OutputBuffer/zh|OutputBuffer]]; |
::::} | ::::} | ||
:::} | :::} | ||
Line 238: | Line 237: | ||
:}</tt> | :}</tt> | ||
− | === | + | ===在J#中=== |
<tt> | <tt> | ||
:import ADE.*; | :import ADE.*; | ||
Line 247: | Line 246: | ||
:::String errT, result; | :::String errT, result; | ||
:::int errCode; | :::int errCode; | ||
− | :::ADE.[[CAEngine]] ADE = new ADE.CAEngineClass(); | + | :::ADE.[[CAEngine/zh|CAEngine]] ADE = new ADE.CAEngineClass(); |
− | :::ADE.[[CAEngine::Command|set_Command]]("[[News]]"); | + | :::ADE.[[CAEngine::Command/zh|set_Command]]("[[News]]"); |
− | :::boolean sendRes = ADE.[[CAEngine::Send|Send]](); | + | :::boolean sendRes = ADE.[[CAEngine::Send/zh|Send]](); |
:::if (!sendRes) { | :::if (!sendRes) { | ||
− | ::::errCode = ADE.[[CAEngine::ErrorCode|get_ErrorCode]](); | + | ::::errCode = ADE.[[CAEngine::ErrorCode/zh|get_ErrorCode]](); |
− | ::::errT = ADE.[[CAEngine::ErrorText|get_ErrorText]](); | + | ::::errT = ADE.[[CAEngine::ErrorText/zh|get_ErrorText]](); |
:::} else { | :::} else { | ||
− | ::::result = ADE.[[CAEngine::OutputBuffer|get_OutputBuffer]](); | + | ::::result = ADE.[[CAEngine::OutputBuffer/zh|get_OutputBuffer]](); |
:::} | :::} | ||
::} | ::} | ||
:} </tt> | :} </tt> | ||
− | === | + | ===在C++/CLR中=== |
<tt> | <tt> | ||
:using namespace System; | :using namespace System; | ||
Line 267: | Line 266: | ||
::String ^result, ^errT; | ::String ^result, ^errT; | ||
::int errCode; | ::int errCode; | ||
− | ::[[CAEngine]]^ ADE = gcnew [[CAEngineClass]](); | + | ::[[CAEngine/zh|CAEngine]]^ ADE = gcnew [[CAEngine/zh|CAEngineClass]](); |
− | ::ADE->[[CAEngine::Command|Command]] = "[[News]]"; | + | ::ADE->[[CAEngine::Command/zh|Command]] = "[[News]]"; |
− | ::if (!ADE->[[CAEngine::Send|Send]]()) { | + | ::if (!ADE->[[CAEngine::Send/zh|Send]]()) { |
− | :::errCode = ADE->[[CAEngine::ErrorCode|ErrorCode]]; | + | :::errCode = ADE->[[CAEngine::ErrorCode/zh|ErrorCode]]; |
− | :::errT = ADE->[[CAEngine::ErrorText|ErrorText]]; | + | :::errT = ADE->[[CAEngine::ErrorText/zh|ErrorText]]; |
::} else { | ::} else { | ||
− | :::result = ADE->[[CAEngine::OutputBuffer|OutputBuffer]]; | + | :::result = ADE->[[CAEngine::OutputBuffer/zh|OutputBuffer]]; |
::} | ::} | ||
:} </tt> | :} </tt> | ||
− | === | + | ===在VC++中 (不带 .NET)=== |
<tt> | <tt> | ||
:<nowiki>#</nowiki>import "ADE.exe" | :<nowiki>#</nowiki>import "ADE.exe" | ||
Line 287: | Line 286: | ||
::int errCode; | ::int errCode; | ||
::_CAEnginePtr pAde(__uuidof(_CAEngine)); | ::_CAEnginePtr pAde(__uuidof(_CAEngine)); | ||
− | ::pAde->[[CAEngine::Command|Command]] = "[[News]]"; | + | ::pAde->[[CAEngine::Command/zh|Command]] = "[[News]]"; |
::if (!pAde->Send()) { | ::if (!pAde->Send()) { | ||
− | :::errT = pAde->[[CAEngine::ErrorText|ErrorText]]; | + | :::errT = pAde->[[CAEngine::ErrorText/zh|ErrorText]]; |
− | :::errCode = pAde->[[CAEngine::ErrorCode|ErrorCode]]; | + | :::errCode = pAde->[[CAEngine::ErrorCode/zh|ErrorCode]]; |
::} else { | ::} else { | ||
− | :::result = pAde->[[CAEngine::OutputBuffer|OutputBuffer]]; | + | :::result = pAde->[[CAEngine::OutputBuffer/zh|OutputBuffer]]; |
::} | ::} | ||
::CoUninitialize(); | ::CoUninitialize(); | ||
:}</tt> | :}</tt> | ||
− | == | + | ==错误与错误处理== |
− | + | 在进行任何ADE操作后,只要可能存在错误,就必须查询[[CAEngine/zh|CAEngine]]的[[CAEngine::ErrorCode/zh|ErrorCode]]和[[CAEngine::ErrorText/zh|ErrorText]]属性。读取ADE对象属性的一个值不会改变错误代码。设置属性值可能导致错误发生,通常说明该属性的值不合理。如果不存在错误所有方法调用都将ErrorCode设置为0,或者设置成表示该错误的值。 | |
− | + | 要获取关于一个错误的额外信息,检查[[CAEngine/zh|CAEngine]]的[[CAEngine::OutputBuffer/zh|OutputBuffer]]属性即可。任何Analytica用户中的错误信息 | |
− | == | + | ==另请参考== |
{| style="margin: 1em auto 1em auto;width: 100%;border:0;table-layout: fixed;" cellpadding=5 | {| style="margin: 1em auto 1em auto;width: 100%;border:0;table-layout: fixed;" cellpadding=5 | ||
|- style="text-align: center" | |- style="text-align: center" | ||
− | | [[The ADE Tutorial]] <- || [[Using the ADE Server]] || -> [[Working with Models, Modules, and Files in ADE]] | + | | [[The ADE Tutorial/zh|ADE入门教程]] <- || [[Using the ADE Server/zh|使用ADE服务器]] || -> [[Working with Models, Modules, and Files in ADE/zh|在ADE中处理模型、模块和文件]] |
|} | |} |
Latest revision as of 02:52, 22 October 2015
ADE用户指南 >
此章描述了Analytica决策引擎服务器类型CAEngine、CALicense、CAObject、CATable、CAIndex和CARenderingStyle,以及服务器类型构架。
ADE 类型
ADE使用一下六种类型:
- CAEngine类型所包含的方法和属性允许你打开和关闭现有模型、建立新模型、建立新的Analytica对象,以及访问你模型中所包含的Analytica对象。
- CALicense类型所包含的方法允许你实例化CAEngine、允许你使用一种特殊应用程序许可证代码、允许你检查ADE许可证上的某种限制、以及获取关于为什么CAEngine未能成功实例化的详细信息。
- CAObject类型所包含的方法和属性允许你设置和获取从CAEngine获取的Analytica 对象(例如变量模块)的相关信息。
- CATable类型用来检查多维结果或者查看和修改多维定义表格(也称为编辑表)。
- 一个CAIndex对象 允许你访问一个多维 CATable的一个维度。
- CARenderingStyle是在ADE 4.0中出现的新特征,允许你控制或改变ADE返回值的格式 。
注意: 着些类型名称中的“CA”代表“Class Analytica。”
下面的部分描述了如何从Visual Basic或者C#中访问这些Analytica Server对象。
服务器类型构架
COM、Autoation、 和.NET
ADE 4.6支持两种调用约定:COM和ActiveX Automation。COM是一种前期绑定的约定,在此约定中方法和数据类型会在你的应用程序代码被编译时确定。Automation是一种后期绑定的约定,在运行时间内决定方法调用。COM约定稍微有效一点,虽然对于大多数应用程序,该效率上的差异被计算模型结果所需时间远远地盖过。
在Visual Basic中,使用COM或Automation的调用语法是相同的,使用哪种结构取决于你如何声明你的对象。在其他语言中,例如C#或C++,调用方法看起来完全不同。在C#或C++中,使用COM结构一般更加方便。VBScript(Windows Scripting Host和更旧的IIS ASP版本使用)只支持Automation接口。
COM接口可以在.NET环境中,例如Visual Studio 2005,透明地使用。.NET编程环境通过使用.NET互操作对象隐藏了COM对象,这给与了ADE接口.NET接口的外观。
在ADE 3.1以及以前版本中,Automation接口是推荐使用的约定。但是随着ADE 4.6的发布,我们推荐使用COM接口,除非在你的编程环境(例如VBScript)中没法使用。
进程内和进程外比较
ADE可以在进程内或进程外启动。当我们在进程内(ASEW)启动时,Adew.dll库被载入到你的应用程序进程空间内。当启动进程外(ADE)时,ADE.exe服务器启动,并且在不同进程内运行。两种服务器类型都是用相同的类型接口,所以到底选择使用哪种服务器通常可以通过编辑单独实例化CAEngine的这一行代码就可以改变选择。
进程内服务器性能稍微好一点,但同时有一些限制。首先,ADEW的 单元 线程模型必须和你的应用程序的线程模型兼容。例如Microsoft IIS web server(IIS 5.0或后期版本)在其默认设置下不允许你使用单元-线程组件。其次,还限制你在任何时候在内存内只有一个CAEngine实例(因此只有一个模型)。
ADE的进程外实例在不同进程内运行,能够设置让你从你的应用程序上在另一台电脑运行。因为数据必须是跨进程打包。你的程序可以同时使用多个ADE实例,每一个都有单独的载入模型实例。例如,过程外服务器几乎总是更适合web应用程序,因为对于每一个回话,你都可以有一个ADE实例。
Typescript
除了程序接口,ADE还有一个完整的函数命令结构,称为typescript语言。该语言在Analytica脚本指南有描述。该语言允许你获取并使用ADE全部功能。API提供了一个更加方便、定向于对象的一组函数,用来从Visual Basic和C++中与引擎通讯。一个调用程序可以使用API函数,或者可以将typescript指令直接传递给typescript接口。
IIS下的安全性权限
当在Internet Information Server (IIS:互联网信息服务器)下的Microsoft Active Server Pages(ASP/ASPX:动态服务器页面)中使用ADE时,你可能需要陪着许可权限设置以便从你的应用程序实例化、访问ADE COM组件。
在建立一个web应用程序或者web服务器时,你应该使用进程外ADE服务器。当你的ASPX应用程序在提供页面请求时被执行的情况下,ADE COM 组件将从一个特殊的内部Windows账户名中启动并访问。即使在你的账户下运行时,你的应用程序能够建立并访问ADE,对于ASP或者ASPX来说不存在同样的访问。要配置安全性权限以便你的ASPX应用程序可以使用ADE,按照下面步骤操作:
- 从Windows控制面板上选择管理员工具 > 组建服务.
- 注意:如果你在一台64位计算机上使用32位版本ADE,那么你必须运行:mmc comexp.msc /32
- 在DCOM Config 文件夹中找到“Analytica Decision Engine Local Server 4.6。”
- 从右鼠标快捷菜单上选择Properties(属性) ,再选择 Security(安全性)标签。
- 将Launch and Activation Permissions(启动并激活许可) 设置成Customize(自定义)然后点击Edit(编辑)
- 授予IIS使用账户本地启动以及本地激活许可。在 IIS 5通常是{computer_name}\ASPNET。在IIS 6 & 7通常为NETWORKSERVICES或者 IIS_IUSRS,在 IIS 7.5,应该设置应用程序池名称上相应的这些设置。,通常为“IIS AppPool\DefaultAppPool”。
- 保存这些设置。你可能需要重启你的机器才能完成这些改变。
当这些许可配置不正确时,在你尝试实例化的 CAEngine的程序上将出现一条“security exception” (安全故障)信息。
ADE测试程序
ADE 4.6和名称为AdeTest.exe的示例程序一同安装。可执行文件位于Examples/AdeTest/bin 目录。你可以使用AdeTest来联系内部进程(Adew.dll)或者AD4.6E的本地进程(ADE.exe)版本的功能。通过使用AdeTest,你可以将脚本指令发送给引擎,建立ADE对象,实际上设置或调用ADE对象的任何属性和方法。如果你安装了Visual Studio 2005,你可以逐句调试Visual Studio Debugger中的代码以观察调用的方法。
下面的图像显示了AdeTest程序对话窗口。左手边的窗体显示了一个当前程序所包含的ADE对象列表。右边显示了其中一个对象的详细信息。在此图中,有三个CAEngine实例,每一个都有一个打开的不同模型,第一个CAEngine是一个个进程内实例(Adew.dll</tt),而其他两个是进程外服务器实例(ADE.exe</tt)。当右手边窗体右下角的Release按钮释放一个实例时,左边窗体上方的两个按钮可以用来建立其他的CAEngine实例。右边窗体显示了第三个CAEngine实例的相关信息。CAEngine相关属性:ErrorCode、ErrorText、CurrentModule、OutputBuffer,和 Photo 的当前值将显示。通过将指令输入进文本框并点击Send (发送)按钮,你可以执行一个typescript指令。或者通过选择Method (方法)下拉框中的方法,填写参数并点击Execute Method(执行方法)按钮,你可以CAEngine的任何一种方法。
如果你点击右手边窗体中的一个对象,其对象属性将显示在收邮编,你可以设置其属性或者调用其方法。因此,你可以模拟你的程序在一个图形接口界面可能执行的一系列的步骤。
当一种方法返回一个对象时,例如,就'CAEngine::GetObjectByName来说,返回对象被添加到左手边的关系树上成为创建它的对象的子对象。在从一个类型而非CAEngine执行一种方法后,浏览一下相应的CAEngine面板检查ErrorCode、ErrorText,和OutputBuffer 等属性是一个不错的习惯。
Analytica窗口上的Photo复选框是CAEngine类型Photo 属性的映射。默认情况下Photo的属性是 False(假),因此用户和ADE之间的typescript通讯不会被复制到Analytica日志窗口中。将Photo属性设置成True(真)将复制用户和ADE之间的所有后继的typescript通讯。在Visual Basic中,实现此过程如下所示:
- ADE.Photo=True
- ADE.Photo=False
打开Photo属性将明显减慢与ADE之间的通讯。
Excel中Visual Basic样本应用程序
另一个名称为excel_exam的示例应用程序也包含到ADE程序包中。在excel_exam目录下的 Analytica.xls程序可以载入到Microsoft Excel中,作为一个宏来运行。该程序演示了Visual Basic如何用来在Excel中应用程序里面和ADE通讯。该示例使用了ADE本地服务器版本。
ASP web 应用程序示例
asp_exam中的示例演示了如何从一个动态服务器页面web应用程序中使用ADE。该应用程序生成了一个使用HTML语言编写的你的模型结构的分层大纲。该目录中的readme.txt文件包含配置运行该示例的web服务器的说明。
在使用Microsoft的ASP(动态服务器网页)时,我们推荐使用本地服务器。通过使用本地服务器(ADE.exe),你可以确保每一个web应用程序,或者甚至每一个会话使用ADE.exe的不同版本。当前,在ADE中有一个限制阻止同时建立两个或者多个进程内服务器对象。因此,如果你想同时有多个ADE会话(同基于web的应用程序基本完全一样),总是使用ADE本地服务器。
在Visual Studio 2005中的.NET项目中
使用ADE COM 接口
在Visual Studio 2005中的Visual Basic、C#、J#、ASP.NET、或者 C++/CLR项目中,你可以通过在你项目中向其添加一个引用来访问ADE。旧的Visual Basic版本(pre-.NET)和少数其他非Microsoft开发环境该方法稍微有点变化。
在Visual Studio 2005中,选择Project (项目)菜单上选择 Add reference or References(添加引用),在出现的对话框中,选择COM标签(在VC++中你必须点击Add new reference按钮来获得COM标签)。在组件列表中,找到并选择下面其中的一个:
- Analytica Decision Engine Local Server 4.6
- Analytica Decision Engine Server 4.6
对于进程外 ADE.exe服务器,选择Local server(本地服务器)。要使用Adew.dll,选择nonlocal server(非本地服务器)。当然也可能对一个项目添加这两个引用(示例AdeTest就是这样做的),但是这很少见。
对于本地服务器和进程内服务器,ADE类型出现在同一名称空间。为了方便起见,你可以添加using声明到你的源文件的顶部,如下所示
- Imports ADE ’ Visual basic
- using ADE; // C#
- using namespace ADE; // C++/CLR
- import ADE.*; // J#
当然,在使用进程内服务器时,你将在上面的ADE的地方输入ADEW 。这些声明允许你在你的代码证引用CAEngine、CAObject等等,而非ADE.CAEngine、 ADE.CAObject等,这使从本地ADE服务器装换成进程内服务器非常容易。
在开始使用ADE之前,你必须先先安装CAEngine,按照如下所示完成::dim ADE as CAEngine = new CAEngineClass ’ VB
CAEngine是一个特殊抽象接口的名称,而ADEW.CAEngineClass和ADE.CAEngineClass是执行该结构的两个特殊对象的名称。CAEngineClass是唯一你能直接建立的对象;所有其他ADE对象实例是通过调用现有对象上的方法来获取的。
要继续使用COM接口,你得使用CAEngine、CAObject、CATable、CAIndex和CARenderingStyle等类型名称声明你的变量。避免分配对象实例给声明为System.Object的变量。这允许编译器执行初期绑定和类型检查。
.释放NET中的对象
在pre-.NET Visual Basic和脚本语言中,编程环境自动确保COM对象立即释放。这和在VB.NET、ASP.NET、或其他.NET程序中情况不一样。当释放对象贯穿真个程序时,程序从.NET明确释放每一个COM对象非常重要。将一个指针设置成Null(或者Nothing)是不够的,因为实际释放知道下一个垃圾回收菜发生。
要想从.NET程序释放一个COM对象的话,你必须执行下面相似的代码(C# 语法):
- System.Runtime.InteropServices.Marshal.ReleaseComObject(ADE);
- ADE = null;
在你使用一个进程外COM服务器(例如:ADE.CAEngine)时,以这种方式释放对象尤其重要。在此情况下,内存资源主要被ADE进程消耗,而不是被你的程序进程。这可能导致在你的程序使用足够的内存之前,ADE进程用完内存,导致自动垃圾回收发生。基于.NET的web应用程序的ADE.exe旧进程在一个会话完成后将长时间存在,除非你明确释放CAEngine对象。
需要释放COM对象不是ADE特有的。你必须处理释放所有COM对象,包括Microsoft提供的,尤其是当这些COM对象时进程外的时候。
因为.NET中缺少这种确定性资源回收,所以确保所有COM对象都被释放让人感到很厌烦。一次,你可能偶尔想在你的代码中执行明确的垃圾回收,以此释放所有无用对象。可以通过调用下面的函数完成:
- System.GC.Collect()
在C++ATL项目中
如果要在一个非.NET C++项目中使用ADE 4.6,将下面两行放在源文件的顶部:
- #import "ADE.exe"
- using namespace ADE;
或者如果你想使用进程内服务器时,可以使用下面的语句:
- #import "Adew.dll"
using namespace ADEW;
你必须将ADE根目录包含到项目设置中的包含路径中,或者在#import声明中清楚说明完整路径。
接下来,使用下面的代码获取第一个ADE引擎实例:
- CoInitialize(NULL);
- CAEnginePtr pAde(__uuidof(_CAEngine));
- .
- .
- .
- CoUninitialize();
CoInitialize()是一个Windows系统调用,在COM系统能够使用之前必须调用。
如果你的项目跨越多个代码文件,在你的每个源文件中使用以下代码:
- #import "ADE.exe" no_implementation
然后只在一个文件中(比如所stdafx.cpp)包含以下代码:#import "ADE.exe" implementation_only
使用ADE自动化接口
VBScript是一个脚本语言示例,可以在Windows脚本主机(CScript.exe或 WScript.exe)、动态服务器页面pre-.NET版本、Internet Explorer等环节下使用。JScript是另一种可以使用的脚本语言,还有其他许多脚本 OLE(对象链接和嵌入)自动化编译脚本语言可以使用,其中包含Perl语言。
这些脚本语言支持ActiveX自动化脚本,但是不支持COM接口。通过使用自动化接口,ADE能够在这些语言中使用,通常不需要其他工具,只需要一个简单的文本编辑器。
对于ADE4.6之前的版本,自动化接口是使用首选。对于支持直接调用COM的语言,ADE4.6中推荐首选COM接口。在C++或C#使用自动化接口是相当单调乏味的,在此我们没有叙述。
在Visual Basic或 VBScript中使用
要使用自动化接口,没有必要给你的Visual Basic项目添加参考。下面的语法和其他脚本语言中使用情况相似。在Visual Basic中,实例化CAEngine的代码如下:
- dim ADE as Object
- ADE = CreateObject("ADE4.CAEngine")
在VBScript和更早的Visual Basic版本,set关键字是必须的:
- dim ADE
- set ADE = CreateObject("ADE4.CAEngine")
对于进程内服务器,将参数ADEW4.CAEngine发送给 CreateObject调用。
ADE Typescript语言:指令语言通讯
CAEngine类型的Command属性和Send方法允许你使用typeScript指令,作为ASCII字符串发送给引擎,并获取同为ASCII字符串的输出结果。在以下情况中,你可能更偏向于使用typescript指令:
- 你想自己对来自Analytica决策引擎,以逗号隔开的文本字符串形式的ADE输出(例如一个列表数据)执行解析。
- 不存在合适的API方法。
你可以通过执行以下操作将typescript指令发送给ADE: !将包含该指令的一个文本字符串赋值给你的CAEngine对象的Command(指令)属性。
- 使用 Send方法将指令发送给引擎。如果Send方法返回True,那么ADE处理的指令没有错误。
- 如果返回代码为非零,将错误代码和错误文本存储起来。这两条信息分别存储在CAEngine属性CAEngine::ErrorCode 和ErrorText中。
- 通过调用Send类型中的OutputBuffer函数获取输出。
注意:你也可以通过调用CAEngine.SendCommand(cmd)。将前两步合并到其中。
这些步骤在下面各种编程语言中有演示说明。在这些简单示例后面,跟了几个使用Visual Basic语法的例子,你应该能够推断使用了何种语言。
在Visual Basic中
- Imports ADE
- Module Module1
- Sub Main()
- Dim Result,ErrT As String
- Dim ErrCode as Integer
- dim ADE as CAEngine = new CAEngineClass
- ADE.Command = "news" ’any typescript command
- dim SendCode as Boolean = ADE.Send
- If SendCode = False Then
- Else
- Result = ADE.OutputBuffer
- End If
- End Sub
- End Module
在VBScript中
- set ADE = CreateObject("ADE4.CAEngine")
- ADE.Command = “news”
- If ADE.Send = False Then
- Else
- Result = ADE.OutputBuffer
- End if
在C#中
- using System;
- using ADE;
- namespace ADE_from_Csharp
- {
- class Program
- {
- static void Main()
- {
- String errT, result;
- int errCode;
- CAEngine ADE = new CAEngineClass();
- ADE.Command = "News";
- if (!ADE.Send()) {
- } else {
- result = ADE.OutputBuffer;
- }
- }
- }
- }
在J#中
- import ADE.*;
- public class Program
- {
- public static void main( )
- {
- String errT, result;
- int errCode;
- ADE.CAEngine ADE = new ADE.CAEngineClass();
- ADE.set_Command("News");
- boolean sendRes = ADE.Send();
- if (!sendRes) {
- errCode = ADE.get_ErrorCode();
- errT = ADE.get_ErrorText();
- } else {
- result = ADE.get_OutputBuffer();
- }
- }
- }
在C++/CLR中
- using namespace System;
- using namespace ADE;
- void main( )
- {
- String ^result, ^errT;
- int errCode;
- CAEngine^ ADE = gcnew CAEngineClass();
- ADE->Command = "News";
- if (!ADE->Send()) {
- } else {
- result = ADE->OutputBuffer;
- }
- }
在VC++中 (不带 .NET)
- #import "ADE.exe"
- using namespace ADE;
- void main( )
- {
- CoInitialize(NULL);
- _bstr_t errT, result;
- int errCode;
- _CAEnginePtr pAde(__uuidof(_CAEngine));
- pAde->Command = "News";
- if (!pAde->Send()) {
- } else {
- result = pAde->OutputBuffer;
- }
- CoUninitialize();
- }
错误与错误处理
在进行任何ADE操作后,只要可能存在错误,就必须查询CAEngine的ErrorCode和ErrorText属性。读取ADE对象属性的一个值不会改变错误代码。设置属性值可能导致错误发生,通常说明该属性的值不合理。如果不存在错误所有方法调用都将ErrorCode设置为0,或者设置成表示该错误的值。
要获取关于一个错误的额外信息,检查CAEngine的OutputBuffer属性即可。任何Analytica用户中的错误信息
另请参考
ADE入门教程 <- | 使用ADE服务器 | -> 在ADE中处理模型、模块和文件 |
Enable comment auto-refresher