自在猫先生 2023-11-08 16:50 采纳率: 62.9%
浏览 15
已结题

Microsoft Dynamics Ax代码使用x++实现金额分摊的功能

需要实现一个金额分摊的功能,
场景有两个数据表一个汇总表一个是明细表,当我汇总表输入金额保存后,点击分摊按钮把这个金额平均分摊给明细表。
代码如下:
以下代码是固定金额为100的数量分摊为5次每次金额是20元,刚刚好分摊完100元,我需要实现不管输入的金额是多少都可以把金额平均分摊给明细表,实现动态的操作而不是固定死的。

 FWT_ShareSummaryTable curFWT_ShareSummary;
            FWT_ShareDetailsTable curFWT_ShareDetailsTable;

            int acout = 0;
            str shareId;
            real price = 0;
            real Apert=20.00;

            // 获取汇总表中的数量和金额
            select firstonly price  from    curFWT_ShareSummary;
            price = curFWT_ShareSummary.Price;

            // 生成新的 GUID
            shareId = System.Guid::newGuid().toString();

            // 插入一行数据到汇总表
            ttsbegin;
            curFWT_ShareSummary.clear();
            curFWT_ShareSummary.Acout = acout;
            curFWT_ShareSummary.Price = price;
            curFWT_ShareSummary.ShareId = shareId;
            curFWT_ShareSummary.insert();
            ttscommit;

            // 计算需要插入的明细记录数
            int numRecords =(price/Apert);

            // 插入分摊记录到明细表
            ttsbegin;
            for (int i = 1; i <= numRecords; i++)
            {
                curFWT_ShareDetailsTable.clear();
                curFWT_ShareDetailsTable.Acout = acout;
                curFWT_ShareDetailsTable.Price = Apert;
                curFWT_ShareDetailsTable.ShareId = shareId;
                curFWT_ShareDetailsTable.insert();
            }
            ttscommit;

            info(strFmt("Inserted %1 records into ShareDetailsTable", numRecords));
    
            FWT_ShareDetailsTable_ds.executeQuery();
            FWT_ShareSummaryTable_ds.executeQuery();

  • 写回答

1条回答 默认 最新

  • 自在猫先生 2023-11-09 16:17
    关注

    功能已经实现使用了基础的算法

     FWT_ShareSummaryTable curFWT_ShareSummary;
                FWT_ShareDetailsTable curFWT_ShareDetailsTable;
    
                int acout = 0;
                str shareId;
                real price = 0;
                int numRecords=7;//确定循环次数
                int LineCout=8;//确定行数
                int roudNum=0;
                int  RecentlyNum=0;
    
                
    
    
                // 获取汇总表中的数量和金额
                select firstonly price  from    curFWT_ShareSummary;
                price = curFWT_ShareSummary.Price;
    
                ////四舍五入最近的整数值
                //RecentlyNum = round(price, 0);
                //金额除以整数值得到差值
    
                if(price>0)
                {
                    roudNum=price/LineCout;
                }
                
    
                // 生成新的 GUID
                shareId = System.Guid::newGuid().toString();
    
                // 插入一行数据到汇总表
                ttsbegin;
                curFWT_ShareSummary.clear();
                curFWT_ShareSummary.Acout = acout;
                curFWT_ShareSummary.Price = price;
                curFWT_ShareSummary.ShareId = shareId;
                curFWT_ShareSummary.insert();
                ttscommit;
    
                //计算出相差的值
                int  PhaseNum=roudNum*numRecords;
                int  AvgPrice=PhaseNum/numRecords;
                //计算出尾数
                int   Remainder=price-PhaseNum;
    
                // 插入分摊记录到明细表
                ttsbegin;
                for (int i = 1; i <= numRecords; i++)
                {
                    curFWT_ShareDetailsTable.clear();
                    curFWT_ShareDetailsTable.Acout = acout;
                    curFWT_ShareDetailsTable.Price = AvgPrice;
                    curFWT_ShareDetailsTable.ShareId = shareId;
                    curFWT_ShareDetailsTable.insert();
                }
                curFWT_ShareDetailsTable.clear();
                curFWT_ShareDetailsTable.Acout = acout;
                curFWT_ShareDetailsTable.Price = Remainder; // 最后一次的金额
                curFWT_ShareDetailsTable.ShareId = shareId;
                curFWT_ShareDetailsTable.insert();
    
                //最后的结果相加得到金额
                int TotalPrice=PhaseNum+Remainder;
                ttscommit;
    
                info(strFmt("Inserted %1 records into ShareDetailsTable", numRecords));
        
                FWT_ShareDetailsTable_ds.executeQuery();
                FWT_ShareSummaryTable_ds.executeQuery();
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 创建了问题 11月8日