宏的使用

宏带给人的印象坏的远多于好的,即使没有写过程序的人也知道宏病毒,每次打开带有宏的Excel的时候都要提醒你是否要打开,打开可能会染毒的警告.
从程序实现的角度讲,Axapta中的宏跟Excel中的宏没什么区别,都是一段可执行代码,或者一个变量的定义,当然打开Axapta的时候不会因为有宏的存在就提醒你要不要打开Axapta,呵呵.
另外对于X++的程序员来说,宏带来的也是负面多余正面,因为宏不能精确定义出错的行,写起代码来确实很不方便.
但是一个事物存在总有它的道理,所谓存在即合理.
宏有什么好处那?我的理解是宏提供了一个集中管理代码的方式,这不正是所谓的OO要达到的封装变化的目的吗?不能用类和方法代替吗?大多数情况下是可以的,但是也有例外.
我接触最多的关于宏的使用是pack,unPack这两个方法的使用,还有就是库存模块中的几个宏.
随便打开一个继承自Runbase的类,都会在classdeclaration发现如下宏的定义:
None.gif      #define .CurrentVersion(1)
None.gif    
#define .version1(1)
None.gif    #localmacro.CurrentList
None.gif         localVar1,
None.gif         localVar2
None.gif    #endmacro
其中localvar1,localVar2等是类中的变量,CurrentVersion代表存放在数据库中的变量的版本.
在pack和unpack中使用的情况如下(以pack为例)
None.gif public  container pack()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
return [#CurrentVersion,#CurrentList];
ExpandedBlockEnd.gif}
当然这个可以用get方法或者直接把变量放到[]里来实现,但我这里用宏更简单,至少可以在类定义的地方修改,不是吗?
如果说上述需求还可以变通实现的话,库存模块中的几个宏,我还真想不出变通的方法.以#InventDimJoin为例,该宏的定义如下:
ExpandedBlockStart.gif ContractedBlock.gif /**/ /* %1 InventDimId           */
ExpandedBlockStart.gifContractedBlock.gif
/**/ /* %2 InventDim             */
ExpandedBlockStart.gifContractedBlock.gif
/**/ /* %3 InventDimCriteria     */
ExpandedBlockStart.gifContractedBlock.gif
/**/ /* %4 InventDimParm         */
ExpandedBlockStart.gifContractedBlock.gif
/**/ /* %5 Index hint            */
None.gif
None.gifjoin tableId from 
% 2
None.gif    #ifnot.empty(
% 5 )
None.gif        index hint 
% 5
None.gif    
#endif
None.gif    where (
% 2 .InventDimId        ==   % 1 &&
None.gif          (
% 2 .ConfigId           ==   % 3 .ConfigId               ||   !   % 4 .ConfigIdFlag)            &&
None.gif          (
% 2 .InventSizeId       ==   % 3 .InventSizeId           ||   !   % 4 .InventSizeIdFlag)        &&
None.gif          (
% 2 .InventColorId      ==   % 3 .InventColorId          ||   !   % 4 .InventColorIdFlag)       &&
None.gif          (
% 2 .InventLocationId   ==   % 3 .InventLocationId       ||   !   % 4 .InventLocationIdFlag)    &&
None.gif          (
% 2 .InventBatchId      ==   % 3 .InventBatchId          ||   !   % 4 .InventBatchIdFlag)       &&
None.gif          (
% 2 .WMSLocationId      ==   % 3 .WMSLocationId          ||   !   % 4 .WMSLocationIdFlag)       &&
None.gif          (
% 2 .WMSPalletId        ==   % 3 .WMSPalletId            ||   !   % 4 .WMSPalletIdFlag)         &&
None.gif          (
% 2 .InventSerialId     ==   % 3 .InventSerialId         ||   !   % 4 .InventSerialIdFlag)
None.gif
None.gif#InventDimDevelop
调用代码,以InventSumPhysical类中的setValueQty为例:
None.gif select sum(physicalValue),sum(received),sum(deducted),sum(registered),sum(picked) from inventSum
None.gif            where inventSum.itemId      
==  itemId        &&
None.gif                  inventSum.closed      
==  NoYes::No
None.gif        #inventDimJoin(inventSum.InventDimId,inventDim,inventDimCriteria,inventDimParm);
类方法中的代码跟宏#inventDimJoin拼凑成了一段代码,还真想不出除了宏还有什么其他办法可以这样玩,当然可以把这些宏直接硬编码到各个类方法中,但是这样的结果是灾难性的,正是这里采用了宏,才使得增加物料维组有了可能,要不然每增加一个物料维组,修改这些代码就要累死人.

转载于:https://www.cnblogs.com/Farseer1215/archive/2006/10/25/539256.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值