二开-自定义BOS单据表头下推老单表体选单关系设计

案例:自定义bos下推产品入库单,并实现勾稽
自定义bos单如下

下面将分解开发过程:
创建选单关系:请不要再bos设计器里添加新单推老单的选单关系,该工具对老单支持不够;只能通过再数据库中插入数据来实现功能;
查找下游单据(老单)的模板ID;select FID,FTemplateID,* from ICTransactionType where FName = '产品入库',

FID=2,FTemplateID='A02'
再ictemplateentry中查找表体字段

查找上游单据bos单据的单据类型:
FID=200000013,表头物理表FTableName='t_bos200000013',主键FPrimaryKey ='FID'

bos单的模型Fkey字段标记,ffieldname字段物理表字段名

第一步:创建选单关系:
INSERT INTO ICClassLink(FSourClassTypeID,FDestClassTypeID,FSourBillShowIndex,FAllowCopy,FAllowCheck,FAllowForceCheck,FFlowControl,FDeCondition,FCondition,FDeHCondition,FDeBCondition,FSourBillFID,FSourBillFEntryID,FSourBillFBillNo,FObjectName,FObjectType,FObjectID,FIsUsed,FUsePage,FDefaultPage,FSRCIDKey,FSRCEntryIDKey,FSRCBillNoKey,FSRCClassIDKey,FISUserDefine,FDestTranTypeID,FSourTranTypeID,FSelectListID,FMustSelected,FSystemReserved,FROB,FFieldName,FRemark,FUseSpec,FSrcDestPage,FSrcPage,FToRed,FSourTypeID,FDestTypeID,FLookUpConditionUp,FLookUpConditionDown,FDefault,FUnControl,FParaValue) VALUES (200000013,-2,0,0,1,0,0,'','FQTY>FQTY1','','','FID','','FBillNo','',0,0,2,',1,',',1,','FSourceInterID','FSourceEntryID','FSourceBillNo','FSourceTranType',1,2,200000013,200000013,0,0,0,'200000013','<FAction=,CanMultiSelBill;/>',-1,0,0,0,0,0,'','',0,6,0)
GO


FSourClassTypeID 填写上游bos单据的类型200000013
FDestClassTypeID 填写下游老单的类型ID -2;老单需要再FID前加上负号(-)
FAllowcopy:复制关系
FAllowCheck:勾稽
FAllowForceCheck:强制勾稽
开发时使用勾稽即可;FAllowCheck=1,其它=0
FCondition:FQty>FQty1(bos单中FQty,FQty1分别对应生产数量、累计入库数量);指必须符合这个条件时才可以下推;
FSourBillFID:FID 上游单据主键
FSourbillFEntryID:空 (表头推表体,这里可以不用填)
FSourcBillFBillNo:FBillNo 上游单据的单据编号字段
--可以通过脚本select FKey,* from ICClassTableInfo where FClassTypeID = 200000013来查询字段的Key
FISused:2启用
FUsePage:,1, 仅表头
FDefualtPage:,1, 仅表头
FSrcIDKey:下游单据的物理表字段用于存上游单据内码
FSRCEntryIDKey:'FSourceEntryID',下游单据的物理表字段用于存上游单据分录ID
FSRCBillNoKey:'FSourceBillNo'下游单据的物理表字段用于存上游单据编号
FSRCClassIDKey:'FSourceTranType'下游单据的物理表字段用于存上游单据类型
FDestTranTypeID:产品入库的FID(查产品入库单模板时查出来的FID值)
FSourTranTypeID:上游bos单单据类型id
FSelectListID:上游bos单单据类型id
FFieldName:icclasslink中定义的ffieldname,建议使用200000013与bos单的单据类一致
FRemark:'<FAction=,CanMultiSelBill;/>'固定值,表示可同时选多个单一起下推
当你完成上面的操作后,再200000013序时簿上就会出现 下推-产品入库 这个菜单了;

第二步:添加下推的值映射关系:
比如将bos单表头的物料携带到产品入库表体的物料字段上:
当下游单据是老单时,在下游单据加载上游数据的数据包时,拼接Sql时需要用到ICTableRelation,ICSelbills;
ICTableRelation用于拼接这个sql的from部分
ICSelbills用于拼接这个sql的select部分
insert into ICTableRelation(FTypeID,FInterID,FTableName,FTableNameAlias,FFieldName,FTableName11,FTableNameAlias11,FFieldName11,FLogic,FBillID,FFieldID,FMode,FIndex,FCondition,FLeftParentheses,FRightParentheses,FLogicOperator,FISConst,FConstType,FSubFilter)
values(0,0,'t_BOS200000013','v1','FBASE','t_ICItem','t4','FItemID','*=','A02','200000013',0,0,'','','','=',0,0,'')

FTableName,上游单据的表头物理表字段
FTableNameAlias : v1 上游单据物理表别称,一般使用v1
FFieldName,FBASE上游单据物料字段的物理表字段名称
FTableName11 : t_icitem 关联表(物料基础资料)物理表
FTableName11:t_icitem 别称 t4 ,可以随意命名
FFieldName11:fitemid 物料的主键
flogic:*= 表示left join
FBillID:产品入库单的模板ID
FFieldID:icclasslink中定义的ffieldname,建议使用200000013与bos单的单据类一致
FLogicOperator:=
这种配置再拼sql的where部分会是这样
from t_BOS200000013 v1
left join t_icitem t4 on v1.FBASE = t4.fitemid
接下来是select部分:
不管选单时要携带任意字段,这2条记录是必须插入的
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited)
values('A02',200000013,'',-200,-1,'FInterID','FID','t_BOS200000013','v1','',0,0)
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited)
values('A02',200000013,'',-1,-1,'FBillNo','FBillNo','t_BOS200000013','v1','',0,0)
FID, 产品入库单的模板ID
FFieldName:icclasslink中定义的ffieldname,建议使用200000013与bos单的单据类一致
这2条记录比较特殊需要单据说明
第一条记录 标记选单关系中上游单据的主键
FSelType:-200 bos单的主键定义
FDK:-1 固定-1
FColName:数据包的字段别名必须是FInterID
FName:bos单主键物理表字段
FTableName:t_BOS200000013字段来源物理表
FTableAlias:v1 与ICTableRelation定义的别名要保持一致
第二条记录 标记选单关系上游单据的单据编号字段
FSelType -1 固定
FDK:-1 固定-1
FColName:数据包的字段别名必须是FBillNo
FName:bos单单据编号物理表字段
FTableName:t_BOS200000013字段来源物理表
FTableAlias:v1 与ICTableRelation定义的别名要保持一致
接下来配置物料携带:
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited)
values('A02',200000013,'FItemID',0,0,'FItemID','FITEMID','t_ICItem','t4','',0,0)
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited)
values('A02',200000013,'FItemID',0,0,'FItemNUMBER','FNUMBER','t_ICItem','t4','',0,0)
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited)
values('A02',200000013,'FItemID',0,0,'FItemNAME','FNAME','t_ICItem','t4','',0,0)
FDstCtlField:FItemID 下游单据物料字段,因为物料是基础资料类型字段,所以不能只携带内码到下游,还需要再数据包中配置名称和编码来
FDK 1 编码 2名称
FTableName:字段来源t_ICItem
FTableAlias : t4 与ICTableRelation定义的别名要保持一致
再拼凑select脚本时就会是这样
v1.FID as FInterID,v1.FbillNo as fbillno,t4.FITEMID as FItemID ,t4.FNUMBERas FItemNUMBER,t4.FNAME as FItemNAME
执行完上述脚本之后,点击下推看看效果;
打开sqlserver跟踪器,会看到这样一条脚本

t4.FUnitGroupID这个是系统自动添加的,只要转换关系中存在t_icitem,就会自动创建这个字段的输出,供携带单位使用
下推后的效果

已同样的方法我们把单位插入进来(开发可以先自己配置一次,再往下看,检验一下是否已经掌握携带关系配置)
...
...
确定单位物理表select * from t_ItemClass 查询结果t_MeasureUnit
insert into ICTableRelation(FTypeID,FInterID,FTableName,FTableNameAlias,FFieldName,FTableName11,FTableNameAlias11,FFieldName11,FLogic,FBillID,FFieldID,FMode,FIndex,FCondition,FLeftParentheses,FRightParentheses,FLogicOperator,FISConst,FConstType,FSubFilter) values(0,1,'t_BOS200000013','v1','FBase1','t_MeasureUnit','t7','FMeasureUnitID','*=','A02','200000013',0,0,'','','','=',0,0,'')
--单位也是基础资料因此也需要插3条记录
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'FUnitID',0,0,'FUnitID','FMeasureUnitID','t_MeasureUnit','t7','',0,0) Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'FUnitID',0,0,'FUnitNUMBER','FNUMBER','t_MeasureUnit','t7','',0,0) Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'FUnitID',0,0,'FUnitNAME','FNAME','t_MeasureUnit','t7','',0,0)
接下来是把应收数量、实收数量携带下来,这2个字段直接来源于bos单表头物理表字段,所以只需要各插入一行记录即可,也不需要额外再ICTableRelation添加记录,只需要插入ICSelbills记录即可;
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'FAuxQtyMust',0,0,'FAuxQtyMust','FQty','t_BOS200000013','v1','',0,0) Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'FAuxQty',0,0,'FAuxQty','FQty','t_BOS200000013','v1','',0,0)
先不考虑勾稽这种场景,仅考虑把值携带下去,后面会讲如何扣减;
下推单据,后保存一下数据;

看看后台的记录,下游单据是否记录了上游单据的内码ID

发现并没有把上游单据ID记录下来;如果没有这些记录是无法做到反写勾稽扣减的;
删掉单据,改进选单关系,把上游的单据内码,单据类型,单据编号携带下来;脚本与数量类似;
Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'fsourcetrantype',0,0,'fsourcetrantype','FClassTypeID','t_BOS200000013','v1','',0,0) Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,FDK,FColName,FName,FTableName,FTableAlias,FAction,FROB,FAllowEdited) values('A02',200000013,'fsourceinterid',0,0,'fsourceinterid','FID','t_BOS200000013','v1','',0,0) Insert into ICSelbills(FID,FFieldName,FDstCtlField,FSelType,F
二开-自定义BOS单据表头下推老单表体选单关系设计
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



