【ABAP SAP】开发-BUG修补记录_采购申请打印时品名规格品牌为空

项目场景:

TCODE:自开发程序ZMMF004
采购申请打印
在这里插入图片描述


问题描述

ZMMF004打印的时候,有的采购申请的品名、规格、品牌为空
在这里插入图片描述


原因分析:

1、首先我通过写SQL语句查底表来看这几条采购申请本身有无品名、规格、品牌
SQL语句如下,只需修改where条件即可测试各条数据
eban底表:采购申请

测试1:采购申请号:2500000122

SELECT ZPM,ZGGXH,ZPP
FROM EBAN
WHERE BANFN = '2500000122';

执行结果:
在这里插入图片描述
可看出该条采购申请是本身就没有品名、规格、品牌的值的

测试2:采购申请号:2500000134

SELECT ZPM,ZGGXH,ZPP
FROM EBAN
WHERE BANFN = '2500000134';

执行结果:
在这里插入图片描述
可看出该条采购申请是本身就有品名的值,但没有规格、品牌的值

测试3:采购申请号:2500000136

SELECT ZPM,ZGGXH,ZPP
FROM EBAN
WHERE BANFN = '2500000136';

执行结果:
在这里插入图片描述
可看出该条采购申请对应两个物料号,其中一个物料有品名值,无规格、品牌的值;另一个物料这三个字段都没有值

从上面的测试结果我可以得出,并不是由于程序取数逻辑错误而导致带不出品名、规格、品牌等字段值,而是因为一些采购申请本身就没有填相应的字段值

2、我的首先的思路是,loop循环ALV最终要显现出来的取到数据的内表,一条一条查哪些采购申请的品名、规格、品牌为空,若为空,则再从物料主数据中取然后放到内表中,但这样loop会非常耗费时间,代码实现也要相对注意,所以这个思路out

3、与其loop已取出来数的内表,不如直接从源头select改变取值方式,直接去物料主数据里取


解决方案:

通过上面的原因分析,可采用如下解决方案:也就是原因分析中的第三条
直接取物料对应的物料主数据上的需要的字段信息,并使其显示出来,若采购申请有这三个字段的值也没关系,从物料主数据中取出来的三字段的值会直接覆盖(因为采购申请中的三字段值和物料主数据中的应该是一致的)
所以解决办法也很简单,直接在原先select语句基础上,连一个表mara物料主数据,让直接从mara表中取品名,规格,品牌(前提是mara表中得有这些字段)

mara表:
在这里插入图片描述

修改的语句如下:

SELECT a~banfn,
         a~bnfpo,
         a~badat,
         a~bsart,
         a~matkl,
         a~ernam,
         a~knttp,
         a~werks,
         d~name1,
         a~ekgrp,
         b~eknam,
         a~matnr,
         a~txz01,
         i~zpm,
         i~zggxh,
         i~zpp,
         a~menge,
         a~meins,
         a~lfdat,
         a~lgort,
         c~lgobe,
         a~afnam,
         a~zjjcd,
         a~zjhjh,
         f~maktx,
         g~wgbez,
         h~knttx
   INTO CORRESPONDING FIELDS OF TABLE @gt_alv
    FROM eban AS a
    LEFT  OUTER JOIN t024    AS b ON a~ekgrp = b~ekgrp
    LEFT  OUTER JOIN t023T   AS g ON a~matkl = g~matkl
    LEFT  OUTER JOIN t001L   AS c ON a~werks = c~werks AND a~lgort = c~lgort
    LEFT  OUTER JOIN t001w   AS d ON a~werks = d~werks
    LEFT  OUTER JOIN makt    AS f ON a~matnr = f~matnr
    LEFT  OUTER JOIN zmmt021 AS e ON a~banfn = e~banfn
    LEFT  OUTER JOIN t163i   AS h ON a~knttp = h~knttp AND h~spras = @sy-langu
    LEFT  OUTER JOIN MARA    AS i on i~matnr = a~matnr
   WHERE a~bsart IN @s_bsart
     AND a~werks IN @s_werks
     AND a~banfn IN @s_banfn
     AND a~badat IN @s_badat
     AND a~ernam IN @s_ernam
     AND a~loekz NE 'X'
     AND (lv_str)
     AND (lv_str2).

红框中为修改并添加的语句
在这里插入图片描述
再执行 ZMMF004,效果如下:
在这里插入图片描述


2024/12/12 13:57
承接上文,需要做个纠正,由于采购申请中的那三个字段的值可能和物料主数据中的不一样,所以其实并不能简单的让直接取物料主数据里的值,而忽略过采购申请,所以,还是需要判断:若采购申请中的三个字段的值不为空,则就取采购申请里的,若采购申请里的为空或为初始值,则取物料主数据里的

代码如下:

  SELECT a~banfn,
         a~bnfpo,
         a~badat,
         a~bsart,
         a~matkl,
         a~ernam,
         a~knttp,
         a~werks,
         d~name1,
         a~ekgrp,
         b~eknam,
         a~matnr,
         a~txz01,
*         a~zpm,
*         a~zggxh,
*         a~zpp,
    CASE
    WHEN a~zpm is not null and a~zpm is not initial then a~zpm
    else i~zpm
    end as zpm,

    CASE
    WHEN a~zggxh is not null and a~zggxh is not initial then a~zggxh
    else i~zggxh
    end as zggxh,

      CASE
    WHEN a~zpp is not null and a~zpp is not initial then a~zpp
    else i~zpp
    end as zpp,

         a~menge,
         a~meins,
         a~lfdat,
         a~lgort,
         c~lgobe,
         a~afnam,
         a~zjjcd,
         a~zjhjh,
         f~maktx,
         g~wgbez,
         h~knttx

    FROM eban AS a
    LEFT  OUTER JOIN t024    AS b ON a~ekgrp = b~ekgrp
    LEFT  OUTER JOIN t023T   AS g ON a~matkl = g~matkl
    LEFT  OUTER JOIN t001L   AS c ON a~werks = c~werks AND a~lgort = c~lgort
    LEFT  OUTER JOIN t001w   AS d ON a~werks = d~werks
    LEFT  OUTER JOIN makt    AS f ON a~matnr = f~matnr
    LEFT  OUTER JOIN zmmt021 AS e ON a~banfn = e~banfn
    LEFT  OUTER JOIN t163i   AS h ON a~knttp = h~knttp AND h~spras = @sy-langu
    LEFT  OUTER JOIN MARA    AS i on i~matnr = a~matnr
   WHERE a~bsart IN @s_bsart
     AND a~werks IN @s_werks
     AND a~banfn IN @s_banfn
     AND a~badat IN @s_badat
     AND a~ernam IN @s_ernam
     AND a~loekz NE 'X'
     AND (lv_str)
     AND (lv_str2)
  INTO CORRESPONDING FIELDS OF TABLE @gt_alv.

另外:对null 和initial做个区分
a~zpm is not null检查字段是否有值;a~zpm is not initial检查字段的值是否不是其“初始”状态;
这里的初始状态应该是说数据库表字段在定义时有无指定默认值,如果数据库表字段在定义时指定了默认值,那么在插入数据时如果没有为该字段赋值,数据库会白动使用指定的默认值;如果数据库表字段没有指定默认值,且在插入数据时没有为其赋值,那么该字段的值将取决于数据库系统的默认行为:字符类型字段会被赋值为空字符(”)
那只有在从采购申请中得来的字段不为空且不是初始值的情况下,就用采购申请里的;若是空或是初始值,就用物料主数据里的
null在数据库中表示一个未知或缺失的值。如果一个字段的值为null,这意味着这个字段没有值,或者说它的值是不确定的。
initial用于表示一个字段或变量的初始状态或默认值

注:
在 ABAP 中,往数据库插入数据时,如果字段未被显式赋值,则插入行为取决于以下几个方面:
1、字段的初始值:
对于 ABAP 内部表或者工作区(Work Area)中的字段,如果未赋值,这些字段会有默认的
初始值,具体如下:
字符型(CHAR, STRING):空字符串 ··
数值型(INT, FLOAT, DEC):e。
日期型(DATE):‘00000000’。
时间型(TIME):‘000000’
布尔型 (X, FLAG):8。
插入数据库时,ABAP 会使用这些默认初始值。
2、数据库字段的默认值
如果数据库表字段在定义时指定了默认值(通过字段的 Defaut 属性设置),即使 ABAP 程序
没有赋值,该默认值也会被插入。
3、数据库字段是否允许空值:
如果字段在数据库中被定义为允许 NULL值,那么 ABAP 中使用 CLEAR 或未赋值的字段可
能会被视为 NULL,具体取决于数据库接口的设置。
如果字段不允许 NULL值,未赋值字段会使用其默认的初始值插入到数据库中,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车租赁系统数据库 E-R 图设计

文章目录 汽车租赁系统数据库 E-R 图设计一、实体(Entities)二、实体间关系(Relationships)三、数据表(Tables) 汽车租赁系统数据库 E-R 图设计 一、实体(Entities) 用户&#xff0…

【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut、QT)第三期

🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(456:OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(456:OpenGL、glfw、glut)第二期3【小沐…

Vizcom:AI驱动的草图到3D设计革命

Vizcom是一家领先的AI技术公司,专注于为工业设计师提供工具,将手绘草图快速转化为可制造的3D模型,从而加速产品迭代和创新。 公司背景与愿景 成立于2021年的Vizcom由前Nvidia工业设计师Jordan Taylor创立。Taylor凭借其深厚的创意设计背景和技术敏锐度,看到了生成对抗网络…

【开源免费】基于SpringBoot+Vue.JS课程智能组卷系统(JAVA毕业设计)

本文项目编号 T 009 ,文末自助获取源码 \color{red}{T009,文末自助获取源码} T009,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 老…

Linux常用指令-----下

Linux常用指令------上 Linux常用指令------中 Linux系列 文章目录 Linux系列前言一、more指令二、less指令三、head指令和tail指令四、grep指令五、zip指令和unzip指令六、tar指令1、打包压缩2. 预览3. 解压解包 前言 在上一篇博客中,我給大家介绍了cat指令&#…

【安全研究】某黑产网站后台滲透与逆向分析

文章目录 x01. 前言x02. 分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与…

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本,旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版,能够扫描并生成详细的报告,涵盖用户管理、权限配置…

JaxaFx学习(一)

目录: (1)基本结构 (2)Application (3)Stage窗口显示 (4)Scene场景切换 (5)UI控件通用属性 (6)UI控件属性绑定很属性…

悬赏任务源码(悬赏发布web+APP+小程序)开发附源码

悬赏任务源码是指一个软件或网站的源代码,用于实现悬赏任务的功能。悬赏任务是指发布方提供一定的奖励,希望能够找到解决特定问题或完成特定任务的人。悬赏任务源码通常包括任务发布、任务接受、任务完成和奖励发放等功能的实现。搭建悬赏任务源码是一个…

Java集合操作中的包含性判断:深入探讨List.contains()方法

文章目录 Java集合操作中的包含性判断:深入探讨List.contains()方法问题分析与解答1. 为什么list.contains(filterValueList)返回false?2. 正确的实现方法方法一:使用containsAll()方法二:Stream流操作方法三:传统循环…

帆软的无数据展示方案

文章目录 需求描述第一步、设置控件第二步、设置数据集优化改进 在日常工作中,使用到帆软报表工具,以下记录日常使用的过程, 需求描述 用帆软报表展示销量的信息,选择不同的订单状态,展示其订单数和总金额。 第一步、…

ubuntu20.04安装qt creator

以上三种,选择其一安装即可 回答1: 您可以按照以下步骤在ubuntu 20.04上安装Qt Creator: 打开终端并输入以下命令以更新软件包列表: sudo apt update 安装Qt Creator和Qt库: sudo apt install qtcreator qt5-def…

MySQL系列之数据类型(String)

导览 前言一、字符串类型知多少1. 类型说明2. 字符和字节的转换 二、字符串类型的异同1. CHAR & VARCHAR2. BINARY & VARBINARY3. BLOB & TEXT4. ENUM & SET 结语精彩回放 前言 MySQL数据类型第三弹闪亮登场,欢迎关注O。 本篇博主开始谈谈MySQL是如…

linux网络编程 | c | select实现多路IO转接服务器

poll实现多路IO转接服务器 基于该视频完成 04-poll函数实现服务器_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 要求:能看懂看,看不懂也没啥大事,现在基本都用epoll代替了 大家看视频思路吧,代码就是从讲义里面copy了一份…

数组专题leetcode

链表适合插入、删除,时间复杂度 O(1) 数组是适合查找操作,但是查找的时间复杂度并不为 O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是 O(logn) 数组:内存连续的存储相同类型 【数组插入】: 如果在数组的末…

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中,私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性,从多个维度为私域流量运营提供了强有力的支持与推动,以下将详细阐述其在各个方面的…

nginx中的root和alias的区别

alias 在E:\\test\\目录下创建一个index.html文件 在nginx.conf文件配置alias,路径填写为绝对路径,但是要注意,这里结尾是文件夹的名字 然后下面的/aa/ 是随便起的名字,也不是文件夹的名字,在浏览器访问的使用的 在浏览器使用 …

MySQL之数据库三大范式

一、什么是范式? 范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。 (范式是具有最小冗余的表结构) 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式(1NF/2NF/3NF…

【昇腾】NPU ID:物理ID、逻辑ID、芯片映射关系

起因: https://www.hiascend.com/document/detail/zh/Atlas%20200I%20A2/23.0.0/re/npu/npusmi_013.html npu-smi info -l查询所有NPU设备: [naienotebook-npu-bd130045-55bbffd786-lr6t8 DCNN]$ npu-smi info -lTotal Count : 1NPU…

TcpServer 服务器优化之后,加了多线程,对心跳包进行优化

TcpServer 服务器优化之后&#xff0c;加了多线程&#xff0c;对心跳包进行优化 TcpServer.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <vector> #include <map> #…