闲人闲谈PS之四十三——标准程序的陷阱

news2024/11/27 13:32:02

惯例闲话:7月,闲人家乡的水蜜桃成熟了,闲人很喜欢吃桃子,可惜经常出门在外,经常错过了水果最好的季节,这次委托家人邮寄了几箱,果然还是家乡的桃子好吃。回顾这几年,错过了不仅仅是水果,孩子的教育、成长,都是有很大的缺位。
做顾问到了这个年纪,也确实是要考虑家庭和事业均衡的时候了。PLM项目还有2-3个月,是差不多该做出决定了。

闲话到此为止,这次聊聊标准报表的陷阱!

项目生产工单成本和入库统计

项目制生产常见需求,统计某个项目在某个区间内投入和产出。
索引条件通常有
1、项目
2、WBS
3、科目
4、日期区间
财务报表带上时间区间的,往往就意味着 附带效率问题。而在项目型业务中,这种效率问题更为突出,通常会按整个项目全生命周期来查询累计,这种必然会引起报表效率问题。
在这里插入图片描述
在这里插入图片描述

解决效率问题,无外乎以下几种方法:
1、存表法
1)明确数据的汇总级别,存在项目制业务的,通常按项目、WBS作为汇总级别,常规业务则颗粒度细一点,按工单。可作为项目报表的下级钻取;
2)期末数据保存自定义表中,作为下一期期初数据,累加;
3)下一期数据仅查询期间内,通常为一个自然月为期间。
2、BW,本质也是存表;
3、调用标准程序法,这是近些年,闲人在项目上遇到的某个财务顾问的创新,直接调用KOB1N,CJI3N等。

前台选择条件如下
在这里插入图片描述

代码样例如下:

"获取ALV内容并且不显示ALV
CL_SALV_BS_RUNTIME_INFO=>SET( EXPORTING DISPLAY = ABAP_FALSE
METADATA = ABAP_FALSE
DATA = ABAP_TRUE ).

IF RT_AUFNR IS NOT INITIAL.
SET PARAMETER ID ‘CAC’ FIELD ‘CSCE’.
SUBMIT RKAEP000 WITH P_KOKRS = ‘CSCE’
WITH AUFNR IN RT_AUFNR "订单号
WITH R_BUDAT IN RT_BUDAT "过账日期
WITH P_HANA = ‘X’ "加速选择
WITH P_TREE = ‘’ "层次显示
WITH P_IMOUT = ‘’ "从完成清单开始
WITH P_GROBJ = ‘’ "组对象
WITH P_TCODE = ‘KOB1’
EXPORTING LIST TO MEMORY AND RETURN.
TRY.
"从内存中获取ALV内表数据
CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = LR_KOB1N_DATA ).
ASSIGN LR_KOB1N_DATA->TO <LT_KOB1N_DATA>.

   IF <LT_KOB1N_DATA> IS ASSIGNED.
     "处理数据
     LOOP AT <LT_KOB1N_DATA> ASSIGNING FIELD-SYMBOL(<LFS_KOB1N_DATA>).
       CLEAR:LS_KOB1N_DATA.
       MOVE-CORRESPONDING <LFS_KOB1N_DATA> TO LS_KOB1N_DATA.
       COLLECT LS_KOB1N_DATA INTO LT_KOB1N_DATA.
     ENDLOOP.
     "以订单为维度汇总
     "以成本要素KSTAR 为条件获取:累计入库金额、当期入库金额、累计生产成本
     WITH +KOB1N_SUM AS (
          SELECT
                 DATA~AUFNR,     "订单
                 DATA~RWAER,     "报表货币
            CASE WHEN DATA~KSTAR = '5011999910'
                  AND DATA~GJAHR = @P_GJAHR
                  AND SUBSTRING( DATA~PERIO,2,2 ) = @P_MONAT
                 THEN SUM( DATA~WRGBTR )
                 END AS ZXXX2,   "累计入库金额
            CASE WHEN DATA~KSTAR = '5011999910'
                  AND DATA~GJAHR = @P_GJAHR
                  AND SUBSTRING( DATA~PERIO,2,2 ) = @P_MONAT
                 THEN SUM( DATA~WRGBTR )
                 END AS ZXXX3,   "当期入库金额
            CASE WHEN DATA~KSTAR <> '5011999910'
                  AND SUBSTRING( DATA~KSTAR,1,3 ) <> '998'
                  AND DATA~GJAHR = @P_GJAHR
                  AND SUBSTRING( DATA~PERIO,2,2 ) = @P_MONAT
                 THEN SUM( DATA~WRGBTR )
                 END AS ZXXX1    "累计生产成本
            FROM @LT_KOB1N_DATA AS DATA
            GROUP BY DATA~BUKRS,DATA~AUFNR,DATA~RWAER,DATA~KSTAR,DATA~GJAHR,DATA~PERIO )
     SELECT
            DATA~AUFNR,     "订单
            DATA~RWAER,     "报表货币
            SUM( DATA~ZXXX1 ) AS ZXXX1,   "累计生产成本
            SUM( DATA~ZXXX2 ) AS ZXXX2,   "累计入库金额
            SUM( DATA~ZXXX3 ) AS ZXXX3    "当期入库金额
       FROM +KOB1N_SUM AS DATA
       GROUP BY DATA~AUFNR,DATA~RWAER
     INTO TABLE @DATA(LT_KOB1N_SUM).
     SORT LT_KOB1N_SUM BY AUFNR.
   ENDIF.
 CATCH CX_SALV_BS_SC_RUNTIME_INFO.
   MESSAGE `无法获取事务码:KOB1N 的数据` TYPE 'E'.

ENDTRY.
ENDIF.

本文也是着重解构第三种方案的陷阱。

KOB1N的效率陷阱

从一般的思维角度,标准程序确实比自开发程序效率要高很多,这也是闲人的惯性思维,在多数情况,这个也是成立的。
已本案例为例,
在集成测试环节,前台测试了KOB1N和写逻辑从AUFM表中获取项目工单的投入和产出财务凭证数据。注意,闲人这里用前台测试,这个关键字眼,也恰恰这一点,被闲人和项目组同事忽略了,导致买下了一个效率的巨坑。
刚开始测试结果喜人:KOB1N的效率在15秒之内就可以读出数,而语句取AUFM时间大概在2分钟左右。项目组也毫不犹豫选择了这个“创新的方法”。

上线后1年多,财务反馈说报表出来数据异常
部分项目有入库数量没有入库金额。经过DEBUG发现

在这里插入图片描述原来在最大获取数据条目数据限制了5000,这也是为啥之前很长时间没有发现效率问题所在的直接原因,系统每次最大获取5000条数据,自然不会有“问题”。

在这里插入图片描述对标准代码做隐式增强,默认最大数

在这里插入图片描述当然结果可想而知,大概率dump

在这里插入图片描述然后按常规手法,用存表法来做,结果还是dump——很显然,每个月的生产量不一样,高峰期月数据量大,但个月也显然会内存溢出。所以,到这里,基本上就宣判了这个创新方法的“死刑”。

但是闲人不甘心,想不明白,为啥前台可以把当月的数据读出来,后台引用却不行。
直到前台操作,放出全量字段,就出现了一样的效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

再回到程序调用,果然不出所料,默认全量字段244个字段,内存够才怪!!!根本原因应该就在这个地方——内存接收数据必须全字段,不能指定若干字段。

在这里插入图片描述

回归原始方法

最后结论还是用原始的办法,从AUFM表中获取数据+存表
效果立竿见影
基本上10秒之内出结果

在这里插入图片描述
ZTFICO_PRDORDER表为历史数据表,作为本期计算的期初数据。
SELECT DISTINCT
ZTFICO_PRDORDER~PROJN,
ZTFICO_PRDORDER~GJAHR,
ZTFICO_PRDORDER~PERIO,
ZTFICO_PRDORDER~PSMNG,
ZTFICO_PRDORDER~ZXXX1,
ZTFICO_PRDORDER~LJRKSJ,
ZTFICO_PRDORDER~ZXXX2,
ZTFICO_PRDORDER~DQRKSJ,
ZTFICO_PRDORDER~ZXXX3,
ZTFICO_PRDORDER~MEINS,
ZTFICO_PRDORDER~RWAER,
ZTFICO_PRDORDER~ZZT,
ZTFICO_PRDORDER~ZCPJSFS,
ZTFICO_PRDORDER~PRCTR
FROM ZTFICO_PRDORDER INNER JOIN @GT_ALV AS A1 ON A1~PROJN = ZTFICO_PRDORDER~PROJN
WHERE ZTFICO_PRDORDER~GJAHR <= @LV_LASTDAY+0(4)
AND ZTFICO_PRDORDER~PERIO <= @LV_LASTDAY+4(2)
INTO CORRESPONDING FIELDS OF TABLE @LT_ZTFICO_PRDORDER.

SORT LT_ZTFICO_PRDORDER BY PROJN GJAHR PERIO DESCENDING.
DELETE ADJACENT DUPLICATES FROM LT_ZTFICO_PRDORDER COMPARING PROJN.

LOOP AT GT_ALV INTO GS_ALV.
READ TABLE LT_ZTFICO_PRDORDER INTO LS_ZTFICO_PRDORDER WITH KEY PROJN = GS_ALV-PROJN.
IF SY-SUBRC = 0.
GS_ALV-ZXXX1 = GS_ALV-ZXXX1 + LS_ZTFICO_PRDORDER-ZXXX1.
GS_ALV-LJRKSJ = GS_ALV-LJRKSJ + LS_ZTFICO_PRDORDER-LJRKSJ.
GS_ALV-ZXXX2 = GS_ALV-ZXXX2 + LS_ZTFICO_PRDORDER-ZXXX2.
ENDIF.
MODIFY GT_ALV FROM GS_ALV.
CLEAR:LS_ZTFICO_PRDORDER.
ENDLOOP.

小结

闲人在上几篇文章有提到过关于项目财务报表设计的一些技巧,其实这些技巧并不新鲜,恰恰很多项目遇到的问题老方法,有点成熟有效,缺点需要花费额外的精力写逻辑和设计历史数据表。

这期文章主要想表达,作为一个顾问,对于开发功能的验证,必须建立在实际业务数据的考验,集成测试明显是不够的,特别是财务报表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库sql 根据身份证计算年龄段mysql、oracle

数据库sql根据身份证计算年龄段 mysql: SELECTage,count(*) numFROM(SELECTCASEWHEN TIMESTAMPDIFF(YEAR,DATE(substring(id_card,7,8)),CURDATE())<35 THEN 35岁以下WHEN TIMESTAMPDIFF(YEAR,DATE(substring(id_card,7,8)),CURDATE()) > 35AND TIMESTAMPDIFF(YEAR,DATE…

deque容器语法

文章目录 deque容器deque容器基本概念功能&#xff1a;deque 的实现细节deque与vector底层区别&#xff1a; deque构造函数功能描述&#xff1a;函数原型&#xff1a; deque元素访问deque赋值操作功能描述&#xff1a;函数原型&#xff1a; deque大小操作功能描述&#xff1a;函…

哪些期货公司招居间人,期货居间人的红利期时代已过,该何去何从

2021年9月10日&#xff0c;中国期货业协会发布了关于发布《期货公司居间人管理办法 (试行)》的通知&#xff0c;《期货公司居间人管理办法(试行)》正式出台。 根据通知&#xff0c;期货公司仅能与经有关金融监管部门批准设立的证券公司等金融机构开展居间合作。现在的法人居间绝…

【stable-diffuision-webui】controlnet制作动漫二维码(丐版)

主要参考 原作者的博文&#xff1a;AI生成可扫码图像 — 新 ControlNet 模型展示 光照生成模型C站说明&#xff1a;https://civitai.com/models/80536/lighting-based-picture-control-controlnet 扩展阅读&#xff1a;https://aigc.ioclab.com/sd-showcase/light_controlnet.…

Sentieon | 每周文献-Agrigenomics-第四期

农业系列文章-1 标题&#xff08;英文&#xff09;&#xff1a;Genomic footprints of sorghum domestication and breeding selection for multiple end uses标题&#xff08;中文&#xff09;&#xff1a;高粱驯化的基因组足迹和多种最终用途的育种选择发表期刊&#xff1a;《…

vue3中使用jsx

一、使用vue-cli创建的项目中使用jsx语法 安装Vue 3&#xff1a;使用Vue CLI创建一个新项目或通过npm安装Vue。 配置Vue JSX插件&#xff1a;在创建的项目中&#xff0c;找到 babel.config.js 文件&#xff0c;添加以下插件配置&#xff1a; module.exports {presets: [vue…

CentOS Linux MySQL 数据库 的安装方法

一、简单了解MySQL数据库的体系结构 &#xff08;一&#xff09;MySQL架构图 &#xff08;二&#xff09;MySQL体系结构&#xff1a;连接层、服务层、引擎层、存储层 1、连接层--主要职责&#xff1a;身份认证&#xff0c;连接管理&#xff0c;获取权限信息 &#xff08;1&am…

No11.精选前端面试题,享受每天的挑战和学习

文章目录 JS数组去重的几个方法讲下es6新增symbol 数据类型v-model原理是什么vue响应式原理vue中的data 为什么是个函数&#xff1f;前端有几种缓存方式 JS数组去重的几个方法 在JavaScript中&#xff0c;可以使用几种方法对数组进行去重&#xff1a; 使用Set&#xff1a;Set…

每日汇评:美联储会议纪要是否能确认黄金的看涨楔形?

1、在美国独立日清淡的交易中&#xff0c;黄金价格创下了一周以来的新高&#xff1b; 2、在美联储会议纪要之前&#xff0c;美元利用了对经济衰退的担忧和中美科技之争&#xff1b; 3、黄金需要日线收在1922美元上方才能确认看涨楔形&#xff0c;但看跌的RSI值得谨慎&#xf…

png转svg图片免费

svg免费转换网站 https://vectr.com/design/editor/c232c8cb-5eb8-4bae-b302-25cb94a8f737 操作步骤 1.上传png或者其他格式图片 2.点击导出文件 3.选择导出格式为svg和其他配置参数 4.打开下载好的svg图片 5.在编辑器中看svg图片

短视频矩阵系统源码自研+开发技术文档

一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 目录 一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 二、 短视频矩阵系统需要开发的前提语言框架技巧&#xff1a;NGINX&#xff0c;PHP7.4&#xff0c;MySQL5.7&#xff0…

多个微信号如何管理?

很多公司都在发愁这几个问题&#xff1a; 1、拥有多个微信号&#xff0c;不想管理多台手机&#xff0c;想将所有微信号进行统一管理 2、想用软件来代替传统的营销体系&#xff0c;安全性上也要有保障 3、用人成本太大与公司的效益不成正比 4、多个账号发圈不方便&#xff0…

创作神器:探索ai智能绘画软件的魅力与功能

曾经有一个名叫小艾的年轻画家&#xff0c;她对绘画充满热情&#xff0c;并梦想创作出令人惊叹的艺术作品。然而&#xff0c;她发现自己在技术和创意方面遇到了一些困难。正当她感到沮丧时&#xff0c;她听说了一个关于智能ai绘画软件的故事&#xff0c;这个软件据说能够通过机…

Layui的table数据渲染不显示是怎么回事?

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;推荐系列&#xff1a;点击进入推荐系列…

Pycharm远程设置 DDP简单介绍

前言 最近接到一些改代码或者帮助debug的需求&#xff0c;大多数不是在本地而是autodl这种服务器上&#xff0c;有些人可能不太了解如何设置远程环境。通常在实验室一般都是在本地调好代码然后scp到服务器上去训练&#xff0c;不过这就需要本地有显卡能测试代码是否能跑通&…

【NX】NX二次开发设置对象高亮和颜色模板实现

在NX二次开发当中&#xff0c;我们经常需要高亮一个或者多个对象&#xff0c;或者设置对象的颜色方便实现&#xff0c;直接调用函数稍微显得麻烦&#xff0c;尤其是当我们需要处理的对象是容器的时候&#xff0c;于是我写了几个简单的模板实现&#xff0c;方便调试。 //author&…

Android Studio利用CMake生成.so文件并且可供其他项目引用

1、CMake工具 1.1、CMake是什么 CMake是一个主要用于CPP的构建工具。CMake语言是平台无关的中间编译工具。同一个CMake编译规则在不同系统平台构建出不同的可执行构建文件&#xff0c;所有操作都是通过编译CMakeLists.txt来完成的。在Linux产生MakeFile&#xff0c;在Windows…

5.1ORB-SLAM3之回环检测线程检测是否存在共视区域

1.简介 本质上是计算当前关键帧和关键帧数据库中的关键帧是否存在公共单词&#xff0c;相似性分数是否满足要求。 bool LoopClosing::NewDetectCommonRegions();主要包括以下几个模块&#xff1a; 寻找回环候选关键帧和融合候选关键帧对候选关键帧进行共视几何验证如果共视几…

Android Studio实现内容丰富的安卓校园二手交易平台(带聊天功能)

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号083 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看二手商品…

AndroidStudio设置compileSdk33后xml无提示问题

这个非常蛋疼的问题遇到很多次了&#xff0c;AndroidStudio升级compileSdk33后无xml提示。挺久前写一个调研demo时发现了这个问题&#xff0c;但因为那会任务重&#xff0c;也没有去深入研究&#xff0c;就在写代码时用target32&#xff0c;写完打包demo时修改为33&#xff0c;…