IFS前台资料检查写法

来源:互联网 发布:matlab 优化算子 编辑:程序博客网 时间:2024/05/13 19:08

源代码文件: SplitReservedLot.apl
相关窗口: frmSplitReservedLot2

问题描述: 批号拆分时,可任意拆分批号,会导致拆分后批号资料不正确
例子: 批号(1900-1) 有5道工序(10/20../50) 数量为20
若批号1900-1未做到20工序,就在20工序拆分会导致资料不正确;

PS: 目前2K4/SP4版本未能做到在工序上拆分,这是我们后来客户化的地方
也就是在RESERVED_LOT_BATCH_TAB表里增加一新FIELD:
Parent_Operation_No表示此子批号从父批号的某道工序开始拆分的资料
后续会讲WIP的部分,基本上来说按批号管理的IFS'S WIP资料都不准确;

解决方法:
在拆分批号APPLY时检查此批号在此道工序上的WIP是否够用?
接上例,假设拆分前资料
 OPERATION_NO  LOT_NO        OUTPUT WIP
10                             1900-1              20              0       =>表示第10工序已经完工
20                             1900-1              15                 5       =>表示第20工序上有WIP数量为5
30                             1900-1               0                 15      =>表示第30工序上有WIP数量为15
此时在此10工序应该不允许拆分批号,
20工序至多只能拆分5个数量;
30工序至多只能拆分15个数量;

具体实现:
1) 写一CheckQty函数:检查WIP数量是否够,不通过nCheck=1;否则nCheck=0;
Function: CheckQty
 Description:
 Returns
 Parameters
 Static Variables
 Local variables
  Number: nRowI
  Number: nRowJ
  Number: nSum
  Number: nOpNoI
  Number: nOpNoJ
  Number: nWip
 Actions
  Set nSum= 0
  Set nRowI = TBL_MinRow
  --两层LOOP,此处为外LOOP
  While SalTblFindNextRow(hWndTbl, nRowI, 0, ROW_MarkDeleted)
   Call SalTblSetContext(hWndTbl, nRowI)
   Set nSum= 0
   Set nOpNoI = hWndTbl.colnParentOperationNo
   Set nWip = hWndTbl.colnWipQty
   Set nRowJ = TBL_MinRow
 --此处为内LOOP
   While SalTblFindNextRow(hWndTbl, nRowJ, 0, ROW_MarkDeleted)
    Call SalTblSetContext(hWndTbl, nRowJ)
    Set nOpNoJ = hWndTbl.colnParentOperationNo
 --相同OPERATION_NO,统计拆分数量
    If nOpNoI = nOpNoJ
     Set nSum = nSum  + hWndTbl.colnReservedQty
 --拆分数量超过WIP数量,返回1
   If nSum > nWip
    Set nCheck  = 1
    Return TRUE
  Set nCheck  = 0
  Return FALSE
2)修改PM_DataSourceSave
On PM_DataSourceSave
 If wParam =METHOD_Execute
  If dfnQtySplit > nOrigReservedQty
   Call AlertBox(TranslateConstant(TEXT_SplitResLot_QtySplit) , CAPTION_Error, INFO_Ok )
   Return FALSE
 --增加此处调用
  Call CheckQty()
 --检查不通过,错误对话框
  If nCheck = 1
   Call AlertBox(TranslateConstant(TEXT_SplitResLot_QtyWip) , CAPTION_Error, INFO_Ok )
   Return FALSE
 ..以下省略