这里只讨论一下TypeId(),查了半天都没找到关于这个函数的描述,倒是Inside AX这本书对TypeOf()有所描述:
Typeof()这个系统函数以变量实例为入参,返回入参对应的基本类型,比如下面的例子:
int i = 123;
str s = "Hello world";
MyClass c;
Guid g = newGuid();
print typeOf(i); //Prints Integer
print typeOf(s); //Prints String
print typeOf(c); //Prints Class
print typeOf(g); //Prints Guid
pause;
static void Types(Args _args)
{
DictEnum dictEnum = new DictEnum(enumNum(Types));
int i;
;
for(i=0;i<dictEnum.values();i++)
{
info(int2str(dictEnum.index2Value(i)));
info(dictEnum.index2Label(i));
}
}
/*
Returns a valid Extended Data Type Id, given the argument in the form the system function typeId returns
*/
static extendedTypeId typeId2ExtendedTypeId(int _extendedType)
{
if ((_extendedType & 0xffff) != Types::UserType)
throw error(strfmt("@SYS26445",funcname()));
return _extendedType >> 16 & 0xffff;
}
/*
Returns a valid Enum Id, given the argument in the form the system function typeId returns.
Consider use the enumNum intrinsic function, instead of this function!
*/
static enumId typeId2EnumId(enumId _enumId)
{
if ((_enumId & 0xffff) != Types::Enum)
throw error(strfmt("@SYS23815",funcname()));
return _enumId >> 16 & 0xffff;
}
*** 错误: 97,FunctionModuleID 的参数不是模块。
从上面的两个函数我们就可以推测出typeId()这个函数的返回值是什么了。
if ((_extendedType & 0xffff) != Types::UserType)
throw error(strfmt("@SYS26445",funcname()));
return _extendedType >> 16 & 0xffff;猜想的话,这些信息应该存在了AOD文件里,typeId()这个函数取得了该信息。
如果用typeId来取得EDT类型的Id,代码应该类似下面代码的样子:
typeId2ExtendedTypeId(typeId(AccountNum));
extendedTypeNum(AccountNum);typeId()这个方法还是有其用武之地的,在有些场景下需要传入的参数带有其原始数据类型信息,比如最常见的Runbase框架下通过代码添加控件的情况,服务端代码需要知道客户端代码是否为UserType(即:EDT类型)然后做相应的处理,这时用typeId()这个方法就方便多了,否则客户端每次调用还要传一个参数过去表示是否为UserType,估计会不怎么爽,呵呵。
当然typeId()这个方法可能还有其他用武之地。

