商务合作请加微信:DingtalkCSM
简单来说,我有一张商品表:
其中包含了商品ID、商品名以及价格
我还有一张销售表:
其中包含了销售记录ID、商品ID、商品名、销售数量以及销售总金额。
其中销售表的商品ID与商品表建立了一个查找关系,可以理解为商品ID和商品表是关联起来的。
现在我要实现在销售表中选择商品后,系统自动获取到对应商品的价格,然后拿价格和销售表中的销售数量字段算出销售总金额,并把值填到销售总金额字段中。
其实这个功能不难实现,首先我们来实现一个关联表单的效果。
首先我们要进入字段所在的表单,我这里是要在销售表中通过商品ID关联商品表的信息,所以我要在销售表中new一个Relation。
这个Relation1就是我们刚new的Relation。
之后选中我们刚刚new好的Relation,设置我们要关联哪个表单,这里我是要关联商品表。
然后右键我们刚刚new好的Relation,new一个普通的对应关系。
就是在Relation1下边new好的这个。
然后设置字段间的对应关系,两个相互对应的字段最好拥有同样的数据类型和长度,当然最方便的还是让这两个字段都属于同一个扩展数据类型(EDT)。
这样我们销售表中的商品ID字段就和商品表产生了关联。
然后我们需要为商品表准备一个find方法,这个方法可以通过传一个唯一标识作为参数来返回一个表中对应的数据。
我们可以找一个已经存在的表,上这个表里边复制一个find方法出来,我这里就选择CustTable这张表。
找到find方法。
直接复制。
回到我们的商品表中,查看代码。
然后把代码复制到表中,再把那些表和字段什么的改成我们自己表里的东西。
static GoodsPrice find(GoodsID _goodsID,
boolean _forUpdate = false)
{
GoodsPrice goodsPrice;
if (_goodsID)
{
if (_forUpdate)
{
goodsPrice.selectForUpdate(_forUpdate);
}
select firstonly goodsPrice
index hint GoodsIDIndex // 这一行可以直接删掉,问题不大
where goodsPrice.GoodsID == _goodsID;
}
return goodsPrice;
}
可以看到find方法是个静态方法,即可以使用类名来调用的方法。
这样商品表的find方法就建好了,该方法可以通过商品ID这个唯一标识来查询商品表中对应的数据。
然后我们要重写销售表中的modifiedField方法,这个方法会在表中字段被编辑时触发调用,所以我们可以用这个方法来实现当销售表中的商品ID字段或销售数量字段被编辑后,调用find方法根据商品ID从商品表中拿到价格,然后算出销售总金额的效果。
首先我们进入销售表,然后选择重写modifiedField方法。
然后我们向其中加上我们的功能即可。
public void modifiedField(FieldId _fieldId)
{
super(_fieldId);
switch(_fieldId)
{
case fieldNum(SalesRecord, GoodsID): // 当修改的字段是商品ID字段时
int price1 = GoodsPrice::find(this.GoodsId).Price; // 调用find方法,传入当前行的商品ID字段,拿到对应商品的价格
this.TortalPrice = price1 * this.Sales; // 将当前行的总销售金额字段赋值为商品价格乘销售数量的值
break;
case fieldNum(SalesRecord, Sales): // 当修改的字段是销售数量字段时
// 下边操作都是一样的了
int price2 = GoodsPrice::find(this.GoodsId).Price;
this.TortalPrice = price2 * this.Sales;
break;
}
}
ps:X++使用双冒号(::)来调用静态方法。
之后就可以实现我们要的效果了。