折扣率=实收金额/应收金额
将主表的 “实收金额”/ “应收金额”的值自动填写到从表的“折扣率”字段中;
典型的主表值更改从表值,而且更改从表当前的多行记录。
具体实现:
脚本如下:
<script>
var
m:double;
begin
if (DataMdl_Tabledoc.fieldbyname('应收金额').isnull) or (DataMdl_Tabledoc.fieldbyname('应收金额').value=0) then exit;
m:=DataMdl_Tabledoc.fieldbyname('实收金额').value/DataMdl_Tabledoc.fieldbyname('应收金额').value;
DataMdl_DetailTableTADODataSet0.close;
DataMdl_ADOQueryTemp.Sql_text:='UPDATE 销售明细 SET 折扣率=' + floattostr(m) + ' WHERE 销售单号="' + DataMdl_Tabledoc.fieldbyname('销售单号').asstring +'"';
DataMdl_ADOQueryTemp.ExecSQL;
DataMdl_ADOQueryTemp.Sql_text:='SELECT * FROM 销售明细';
DataMdl_ADOQueryTemp.OPEN;
DataMdl_ADOQueryTemp.CLOSE;
DataMdl_DetailTableTADODataSet0.OPEN;
end.
</script>
脚本解析:
一、脚本可以在使用SQL的地方出现
二、脚本必须使用<script>....</script>包围起来
三、脚本使用pascal语言
具体语句解释:
<script>
var //定义变量开始标示
m:double; //定义变量M
begin //执行代码开始
if (DataMdl_Tabledoc.fieldbyname('应收金额').isnull) or (DataMdl_Tabledoc.fieldbyname('应收金额').value=0) then exit;
//DataMdl_Tabledoc是主表对应的内部数据对象
//DataMdl_Tabledoc.fieldbyname('应收金额').isnull 是应收金额为空
//DataMdl_Tabledoc.fieldbyname('应收金额').value=0 是应收金额为0
If()or()then exit; 当应收金额为空或0时,退出
m:=DataMdl_Tabledoc.fieldbyname('实收金额').value/DataMdl_Tabledoc.fieldbyname('应收金额').value;
//变量赋值要用:=
//DataMdl_Tabledoc是主表对应的内部数据对象
//DataMdl_Tabledoc.fieldbyname('实收金额').value是获得实收金额的值
DataMdl_DetailTableTADODataSet0.close;
//DataMdl_DetailTableTADODataSet0是第一个从表的内部对象,这个语句关闭从表,避免下面执行处理时冲突
DataMdl_ADOQueryTemp.Sql_text:='UPDATE 销售明细 SET 折扣率=' + floattostr(m) + ' WHERE 销售单号="' + DataMdl_Tabledoc.fieldbyname('销售单号').asstring +'"';
//DataMdl_ADOQueryTemp是SQL语句命令执行对象,这个语句制定执行的SQL语句
DataMdl_ADOQueryTemp.ExecSQL;
//执行指定的语句
DataMdl_ADOQueryTemp.Sql_text:='SELECT * FROM 销售明细';
DataMdl_ADOQueryTemp.OPEN;
DataMdl_ADOQueryTemp.CLOSE;
//其实这三行可以不用,这次用来缓冲,确保修改数据已经存到硬盘上
DataMdl_DetailTableTADODataSet0.OPEN;
//重新打开从表
end.//执行代码结束
</script>
说明:上面的DataMdl_Tabledoc、DataMdl_DetailTableTADODataSet0、DataMdl_ADOQueryTemp都可以在编写代码时通过ctrl+O获得
代码编辑器会列出当前可用的对象