关于abap:关于-ABAP-单例设计模式的一个冷门知识点

February 29, 2024 · 0 min · jiezi

关于abap:Google-Gemini-对于-CLABAPCONVINCE-类中的-UCCP-方法解释完全不能看

<font color='red' size="3pt">Google Gemini 的回复是在胡言乱语:</font> CL_ABAP_CONV_IN_CE 类中的 UCCP 办法详解简介 CL_ABAP_CONV_IN_CE 类是 ABAP 编程中用于数据转换的重要类之一。该类提供了一系列办法,用于将数据从一种格局转换为另一种格局。其中,UCCP 办法是用于将 Unicode 字符串转换为代码页字符串的办法。 办法签名 public section. class-method uccp importing value type string codepage type abap_codepage changing result type string.endclass.参数阐明 VALUE:要转换的 Unicode 字符串。CODEPAGE:要转换到的代码页。RESULT:转换后的代码页字符串。<font color='red' size="3pt">笔者:下图才是 UCCP 办法在零碎里的参数列表,Gemini 的回复齐全是谬误的。</font> 办法作用 UCCP 办法的作用是将 Unicode 字符串转换为指定的代码页字符串。Unicode 字符串是应用 Unicode 编码表示的字符串,而代码页字符串是应用指定的代码页编码表示的字符串。不同代码页应用不同的字符集,因而在将 Unicode 字符串转换为代码页字符串时,可能会产生字符失落或替换的状况。 办法示例 以下示例演示了如何应用 UCCP 办法将 Unicode 字符串转换为代码页字符串: data: l_unicode type string.data: l_codepage type abap_codepage.data: l_result type string.l_unicode = '你好,世界!'.l_codepage = 'utf-8'.cl_abap_conv_in_ce=>ucp( value = l_unicode codepage = l_codepage changing result = l_result ).write: / l_result.<font color='red' size="3pt">笔者:下面给的代码,办法名都谬误了,不是 ucp,应该是 uccp!</font>示例阐明 ...

February 28, 2024 · 1 min · jiezi

关于abap:关于-ABAP-异常-CXSYCONVERSIONNONUMBER

在 SAP ABAP 编程中,CX_SY_CONVERSION_NO_NUMBER 异样是一个十分具体的谬误类型,它产生在尝试将一个字符串转换为数字时,然而这个字符串无奈被解释为一个无效的数字。这个异样属于零碎异样类 CX_SY_CONVERSION_ERROR 的一个子类,专门解决与数字转换相干的谬误。解决这类异样对于确保程序的健壯性和可靠性至关重要,尤其是在解决用户输出或者不确定的数据源时。 异样 CX_SY_CONVERSION_NO_NUMBER 通常产生在应用 CONVERT 语句或相干函数(如 TO_NUMBER,STR_TO_INT 等)进行数据类型转换时。如果输出字符串含有非数字字符(除了可能的正负号或小数点),ABAP 运行时环境就会抛出这个异样。 让咱们通过一个例子来深刻了解这个异样的产生过程和解决形式。 假如有一个场景,咱们须要从用户那里接管一个字符串,这个字符串代表用户的年龄,而后将这个字符串转换为整数进行后续解决。代码如下: DATA: lv_age TYPE i, lv_age_string TYPE string.lv_age_string = '三十五'. " 假如这是用户输出的年龄,用户谬误地应用了中文数字TRY. lv_age = CONV i( lv_age_string ). CATCH cx_sy_conversion_no_number INTO DATA(lv_conversion_error). WRITE: / `无奈将输出转换为数字: `, lv_conversion_error->get_text( ).ENDTRY.在上述代码中,咱们尝试将一个含有中文数字的字符串 三十五 转换为整型 i。因为 ABAP 无奈将中文数字间接转换为整型,因而在执行 CONV i( lv_age_string ) 时,将触发 CX_SY_CONVERSION_NO_NUMBER 异样。在 CATCH 块中,咱们捕捉这个异样,并通过 lv_conversion_error->get_text() 办法获取异样的详细信息,而后将错误信息输入。这样,咱们就能够优雅地解决转换谬误,而不是让程序解体。 异样解决是编程中的一个重要方面,特地是在进行类型转换时。在 ABAP 中,通过应用 TRY...CATCH 语句,咱们能够无效地捕捉并解决 CX_SY_CONVERSION_NO_NUMBER 异样,从而进步程序的健壮性和用户体验。 在解决这种类型的异样时,重要的是要对用户输出进行严格的验证和预处理,以缩小异样产生的可能性。例如,能够在尝试转换之前,先用正则表达式查看字符串是否仅蕴含数字和可能的分隔符。此外,为用户提供明确的输出批示和即时反馈也能够大大减少输出谬误,进一步提高应用程序的稳定性和可用性。

February 26, 2024 · 1 min · jiezi

关于abap:XSL-转换与-ABAP-数据的关系

对于应用 ABAP 数据作为源的转换,ABAP 数据首先被序列化为具备 SAP 规范 transformation ID 的标准 XML 示意模式 (canonical XML representation,简称 asXML)。 而后,该两头后果将用作 XSL 转换的理论源。 如果在 CALL TRANSFORMATION 中调用转换 ID 自身,则两头后果将会蕴含在间接输入中。 SAP的规范transformation ID在SAP零碎中,transformation是一种基于XML的描述语言,用于定义如何将数据从一种格局转换为另一种格局。每个transformation都有一个惟一的ID,即transformation ID,它标识了一个特定的转换规则。SAP提供了一系列规范的transformation ID,用于反对常见的数据序列化和反序列化操作。 asXML的概念asXML是指将ABAP数据序列化为标准的XML示意模式。这种示意模式使得ABAP数据可能以标准化的形式被替换和解决,减少了数据交互的灵活性和互操作性。通过将ABAP数据转换为asXML,能够利用XML的扩大样式表语言转换(XSLT)技术,进行简单的数据转换和解决。 XSL转换与ABAP数据XSL转换是一种基于XML的语言,用于转换XML文档。它容许开发者定义如何将一个XML文档转换为XML、HTML或其余格局的文档。在ABAP环境中,通过将数据序列化为asXML,而后应用XSL转换,能够灵便地实现数据的格式化和转换,满足不同的业务需要。 在CALL TRANSFORMATION中应用转换IDCALL TRANSFORMATION是ABAP中用于执行transformation的语句。通过指定transformation ID,能够调用预约义的或自定义的转换规则来解决数据。当在CALL TRANSFORMATION中调用转换ID时,ABAP数据首先被序列化为asXML,而后依据指定的XSL转换规则进行解决。这个过程能够间接生成最终的输入后果,也能够生成两头的XML后果,供进一步的解决或转换应用。 理论案例剖析假如有一个业务需要,须要将SAP零碎中的销售订单数据导出为XML格局,以便与内部零碎替换。首先,能够定义一个transformation,其中蕴含将ABAP数据结构(如销售订单的表和相干字段)序列化为XML格局的规定。而后,通过调用CALL TRANSFORMATION语句,并指定相应的transformation ID,实现数据的序列化和导出。如果须要对导出的XML数据进行进一步的格式化或转换(例如,转换为HTML报表),还能够定义一个XSL转换规则,并在序列化过程中利用这个规定。 论断ABAP数据的序列化和转换是SAP零碎中一个重要的性能,它反对数据的标准化示意和灵便替换。通过了解SAP的transformation机制、asXML的概念,以及XSL转换的利用,开发者能够无效地实现数据的序列化、转换和集成。在理论开发过程中,通过正当利用这些技术,能够进步数据处理的效率和品质,满足简单的业务需要。

February 20, 2024 · 1 min · jiezi

关于abap:如何使用动态-ABAP-程序生成技术对-ABAP-系统标准的报表行为进行微调试读版

<article class=“article fmt article-content”><p>本教程后面有一篇文章,咱们介绍了如何应用内部传入的字符串,动静生成 ABAP 报表实例,并执行的办法:</p><ul><li>120. SAP ABAP 动静生成 ABAP 程序并动静调用的例子代码</li></ul><p></p><p>咱们能够看到在第 120 个例子里,咱们应用硬编码拼接起来的字符串,来模仿内部传入的 ABAP 程序的代码源头。</p><p>笔者的常识星球里,有敌人发问,能不能从本地 ABAP 零碎,提取某个规范 ABAP 程序的代码源,而后基于这些代码源进行微调,动静生成新的 ABAP 报表并执行呢?</p><p>这个需要实践上可行。</p><p><font color=‘red’ size=“3pt”>留神:理论应用时,确保对规范代码源的替换,肯定要处于可控状态,免得给零碎留下安全隐患。</font></p><p>上面是本解决方案具体的步骤。</p><p></p><p>咱们先编写一个简略的 ABAP 报表,用于模仿 SAP 零碎里规范的 ABAP 报表。</p><p>这个报表的内容,依然围绕本教程之前介绍过的 ABAP 零碎的注册表 TADIR 来开展:</p><ul><li>131. 聊聊 SAP ABAP 零碎的 ABAP 对象注册表 TADIR</li></ul><p>源代码如下:</p><pre><code class=“sql”>REPORT z.DATA: lt_tadir TYPE TABLE OF tadir, ls_tadir TYPE tadir.SELECT * INTO TABLE lt_tadir FROM tadir UP TO 3 ROWS WHERE pgmid = ‘R3TR’ AND object = ‘PROG’ AND author = sy-uname.LOOP AT lt_tadir INTO ls_tadir. WRITE:/ ls_tadir-obj_name.ENDLOOP.</code></pre><p>这个报表的作用是,从注册表里,查问出以后执行报表用户创立的三个 ABAP 报表的名称。<br/>报表在 SE38 里的名称为 <code>ZST</code>.<br/></p><p>执行之后,打印三条输入记录:</p><p></p><p>假如我的需要是,执行报表后,打印的记录条目数,改成<code>10条</code>。</p><p>上面)是如何应用 ABAP 动静程序生成技术,实现的这个需要。</p></article> ...

February 12, 2024 · 1 min · jiezi

关于abap:关于-ABAP-Flight-Reference-Scenario

ABAP Flight Scenario 蕴含演示内容,咱们能够将其导入到您的开发环境中。 ABAP Flight 参考场景可帮忙咱们在 ABAP RESTful 应用程序编程模型的上下文中开始开发。它蕴含演示内容,开发人员能够在此基础上,用来构建本人的示例应用程序。 示例数据首先,这些参考场景(即 reference scenario)蕴含数据。咱们能够应用填充有旅行数据的数据库表,包含客户、航班、机场或预订附加项等 master data. 这套残缺的数据模型的构造,容许咱们构建简略或者简单的服务。 所有可用的数据库表,位于包 /DMO/FLIGHT_LEGACY 中。该包还包含一个数据生成器的报表,能够应用它来填充数据库表。 示例服务ABAP RESTful 应用程序编程模型的开发指南基于 ABAP Flight 参考场景的示例数据。这意味着您能够将文档与用于构建文档场景的生产代码进行比拟。此外,ABAP Flight 参考场景还包含一个演示包,其中蕴含在开发指南的开发对象,即整个演示场景可供下载和测试。所以咱们能够取得由遵循常规和最佳实际构建的残缺演示服务,能够应用和重复使用交付的对象进行开发。 以下演示场景可供使用: 在包 /DMO/FLIGHT_READONLY 中开发只读列表报告应用程序在包 /DMO/FLIGHT_UNMANAGED 中开发未受管的事务应用程序在包 /DMO/FLIGHT_MANAGED 中开发托管事务应用程序在包 /DMO/FLIGHT_DRAFT 中开发具备草稿性能的事务应用程序在包 /DMO/FLIGHT_REUSE_SUPPLEMENT 中开发具备多行内联编辑性能的事务应用程序传统编码参考场景还包含传统编码。这种传统编码基于 Function Module,演示了能够蕴含在新的 ABAP 代码中的传统应用程序。特地是,传统编码与开发指南相干,该指南阐明了如何在现有应用程序的根底上构建新服务。它演示了如何应用无治理的实现类型构建应用程序。在此场景中应用的传统编码位于包 /DMO/FLIGHT_LEGACY 中。 从 GitHub 下载 ABAP Flight 参考场景您能够从 GitHub 下载残缺的 ABAP Flight 参考场景,用于 ABAP RESTful 应用程序编程模型。https://github.com/SAP-samples/abap-platform-refscen-flightInformation (公布在非 SAP 网站上) 无关导入所有相干开发对象的步骤,请参阅各个分支的 README.md 文件。 留神命名空间 /DMO/ 用于演示内容。除了下载的 ABAP Flight 场景外,请不要应用命名空间 /DMO/ 并且不要在已下载的包中创立任何开发对象。当然咱们能够从本人的命名空间中拜访 /DMO/ 中的开发对象。 ...

September 9, 2023 · 1 min · jiezi

关于abap:什么是-SAP-ABAP-System-Fields

在笔者上面这套 ABAP 教程里: 零根底疾速学习 ABAP 对 ABAP System Fields 有具体介绍: 10. ABAP 编程语言中的零碎字段(System Fields)System Fields 在 ABAP 中用于拜访运行时数据,比方以后日期、工夫,以及正在执行的程序的名称等。上面是一些常见的 System Fields 的示例以及如何在 ABAP 中应用它们: SY-SUBRC: SY-SUBRC 是一个用于示意上一个执行的函数模块的返回代码的 System Field。如果函数模块执行胜利,SY-SUBRC 的值将为 0。非零值示意函数模块执行失败。 CALL FUNCTION 'SOME_FUNCTION' EXPORTING some_parameter = some_value IMPORTING some_result = result.IF SY-SUBRC = 0. WRITE 'Function executed successfully'.ELSE. WRITE 'Function execution failed'.ENDIF.SY-TCODE: SY-TCODE 用于获取以后正在执行的 SAP 事务码的代码。 DATA: lv_tcode TYPE sy-tcode.lv_tcode = SY-TCODE.WRITE: 'Current transaction code is', lv_tcode.SY-DATUM 和 SY-UZEIT: ...

September 8, 2023 · 1 min · jiezi

关于abap:SAP-ABAP-系统中的-Lock-Object

作为一个 SAP 资深技术专家,很快乐为您解释 SAP ABAP 零碎中的 Lock Object 概念。Lock Object 是在 SAP 中用于治理并发性(Concurrency)和数据一致性(Consistency)的机制,确保在多用户同时拜访数据时不会发生冲突。 Lock Object 概念:在 SAP ABAP 中,Lock Object 是一种机制,用于管制和协调不同用户对雷同数据的拜访。当多个用户试图同时拜访同一份数据时,可能会呈现数据不一致性和抵触的问题。Lock Object 提供了一种形式来确保一次只有一个用户能够对特定数据进行写操作,从而保护数据的一致性和完整性。 Lock Object 的类型:SAP ABAP 中有两种类型的 Lock Object:共享锁(Shared Lock)和排他锁(Exclusive Lock)。 共享锁:多个用户能够同时获取共享锁,用于读取数据。当一个用户取得共享锁时,其余用户能够持续取得共享锁,但无奈取得排他锁。排他锁:一次只有一个用户能够获取排他锁,用于写入数据。当一个用户取得排他锁时,其余用户无奈取得任何锁,包含共享锁。Lock Object 的应用场景和举例:Lock Object 在 SAP 零碎中的利用十分宽泛,特地是在多用户同时拜访同一份数据的状况下。以下是一些应用 Lock Object 的场景和相应的示例: 订单解决: 假如有多个用户同时解决销售订单,如果不应用 Lock Object,可能会导致订单数量谬误或数据不统一。通过在订单数据上应用排他锁,一次只容许一个用户批改订单信息,确保数据的正确性和一致性。库存治理: 在库存治理中,多个用户可能同时更新库存数量。如果没有适当的锁机制,可能会导致库存数量不精确。通过在库存记录上应用共享锁,多个用户能够同时读取库存数量,但在更新库存时必须应用排他锁,以避免并发写入问题。人员治理: 在人力资源管理中,多个用户可能同时编辑员工的个人信息。通过在员工记录上应用排他锁,确保一次只有一个用户能够批改员工信息,防止数据抵触和谬误。财务交易: 在财务模块中,多个用户可能同时进行交易,如付款、收款等。通过在交易记录上应用排他锁,确保每笔交易只能由一个用户进行,防止反复的交易或数据谬误。Lock Object 的实现:在 SAP ABAP 中,Lock Object 是通过应用 Function Module(函数模块)和 ENQUEUE/DEQUEUE 机制来实现的。函数模块用于申请和开释锁,ENQUEUE/DEQUEUE 则用于理论的锁治理。开发人员能够通过在代码中调用相应的函数模块来实现锁机制。 总结: Lock Object 是 SAP ABAP 中用于保护并发性和数据一致性的重要机制。它容许多个用户在共享数据时放弃一致性,并在写入数据时避免抵触。通过示例,咱们能够看到 Lock Object 在订单解决、库存治理、人员治理和财务交易等场景中的重要作用,确保数据的准确性和完整性,进步了零碎的可靠性和稳定性。 ...

August 16, 2023 · 1 min · jiezi

关于abap:什么是-SAP-ABAP-Enqueue-Server

Enqueue Server(也称为 Lock 服务器)是治理锁表的 SAP 零碎组件。 即便是分布式部署的 SAP 零碎,零碎中也只有一台 Enqueue 服务器。 该服务器有多种装置选项: 配置为 ABAP 应用服务器实例中的 Enqueue Work Process. 该实例被称为 Central instance.此装置选项次要用于较旧的仅蕴含 ABAP 技术栈的 SAP 零碎和仅蕴含繁多实例的 ABAP 应用服务器。 作为独自实例的一部分装置。这种部署模式,Enqueue 服务器作为独自的物理服务器来装置。该服务器与音讯服务器一起成为 SCS 实例(SAP、地方服务 - AS Java)或 ASCS 实例(ABAP 地方服务 - AS ABAP)。这意味着无论 SCS 还是 ASCS 都是单点故障,必须具备高可用性才行。 Enqueu 服务器接管锁申请,并查看锁表以确定锁申请是否与现有锁抵触。 如果是,Enqueue 服务器将回绝它。如果没有抵触,Enqueu 服务器会设置锁并在锁表中创立条目。 当 Enqueu 服务器重新启动时,如果锁没有保留在硬盘上的备份文件上,锁就会失落。 在 CALL FUNCTION .. IN UPDATE TASK 之后的 COMMIT WORK 期间,传递给更新工作的那些锁存储在此文件中。 备份文件在更新申请无效时(在 COMMIT WORK 中)保留。 每次重新启动排队服务器时,保留的锁条目都会从新加载到锁表中。 如果 Enqueue Replication Service 用作高可用性解决方案的一部分,则即便 Enqueu 服务器呈现故障或重新启动,锁也不会失落。 ...

August 16, 2023 · 1 min · jiezi

关于abap:使用-ABAP-调用-Adobe-Document-Service-生成-PDF-文档

我以前在 SAP 成都研究院 BYD Form 开发团队工作过5年,负责 BYD BO 输入成 PDF 的性能开发。 Adobe Document Service(ADS)是SAP NetWeaver AS Java堆栈的一部分,提供了用于创立和解决PDF文件的性能。在ABAP零碎中,能够通过调用ADS服务来生成和解决PDF文档。这种集成使得ABAP开发人员可能轻松地将PDF性能嵌入到他们的应用程序中,而无需理解底层的PDF技术。本文将具体介绍ABAP中调用ADS创立PDF的技术架构。 一、ADS服务的组件 1.1 ADS架构 ADS服务基于Java技术堆栈构建,应用了一些外围组件来反对其性能。这些组件包含: PDF对象库:用于创立、解决和渲染PDF文档。XML数据处理库:用于解决基于XML的数据和模板,如XDP(XML Data Package)和XFA(XML Forms Architecture)。SOAP解决库:用于解决基于SOAP(简略对象拜访协定)的Web服务调用。JCA(Java Connector Architecture)适配器:用于将Java环境与ABAP系统集成。1.2 ADS与ABAP零碎的集成 要在ABAP零碎中应用ADS服务,须要将ADS与ABAP系统集成。这次要波及以下几个步骤: 配置SAP NetWeaver AS Java堆栈,以便在ABAP零碎中启用ADS服务。在ABAP零碎中创立一个逻辑端口,用于与ADS服务进行通信。应用ABAP中的SAP连接器(如HTTP_CONNECTION类)来调用ADS服务。二、ABAP调用ADS创立PDF的过程 2.1 筹备工作 在ABAP中调用ADS创立PDF之前,须要实现以下筹备工作: 创立一个动态PDF模板,能够应用Adobe LiveCycle Designer工具进行设计。这个模板将用于生成动静PDF文档。将动态PDF模板上传到SAP MIME存储库,并为其调配一个惟一的名称。这个名称将用于在ABAP代码中援用模板。筹备一个基于XML的数据源,用于填充PDF模板。这个数据源能够是一个ABAP内表,也能够是一个内部XML文件。在ABAP零碎中创立一个逻辑端口,用于与ADS服务进行通信。2.2 调用ADS服务 在ABAP代码中调用ADS服务的过程能够分为以下几个步骤: 创立一个HTTP_CONNECTION对象,用于与ADS服务进行通信。设置HTTP_CONNECTION对象的属性,如指标URL、认证信息和SOAP操作。应用HTTP_CONNECTION对象发送SOAP申请,包含以下信息: a. PDF模板的名称 b. XML数据源 c. 操作类型,如“合并”或“提取” 解析ADS服务返回的SOAP响应,获取生成的PDF文档。

July 2, 2023 · 1 min · jiezi

关于abap:使用纯-ABAP-开发-SAP-UI5-应用一abap2UI5-开发环境搭建介绍

我从 SAP 社区博客上理解到一个开源我的项目,名叫 abap2UI5, 作者是 Oblomov Dev,这是 Github 我的项目地址: https://github.com/abap2UI5/abap2UI5 这个我的项目最吸引 ABAP 开发人员之处在于: 传统的 ABAP 搞定所有:仅仅依附最根底的传统 ABAP 编程语言,就能够开发并运行 SAP UI5 利用。不须要学习 JavaScript 和 CDS view 等开发技术。通过 abap2UI5 生成的 SAP UI5 利用,运行时不须要 BSP,CDS,BOPF 或者 RAP 这些框架的反对。实际上,abap2UI5 只须要 ABAP 零碎 SAP_BASIS 模块的 ICF(Internet Communication Framework) 框架即可运行。反对 ABAP On-Premises 零碎和云端的 SAP BTP ABAP 编程环境。反对所有常见的 ABAP 零碎版本,从 Netweaver 7.02 到 ABAP 2305.装置不便:应用 abapGit 即可轻松搭建开发环境,将本地开发所需的所有 ABAP 资源,从 Github 同步到本地 ABAP 零碎。实际上,当我首次得悉该我的项目时,脑子里全是问号:为什么?为什么要用 ABAP 开发 SAP UI5 这种 Web 利用?谈到 Web 利用,咱们会条件反射地将其同 JavaScript 和 HTML 分割在一起。只管 ABAP 联合 BSP/WebClient UI/ABAP Webdynpro 这些 SAP 自研的工具和框架,也能胜任 Web 利用开发工作,然而 ABAP 的强项不在于此,而在于后盾业务逻辑和服务的开发。 ...

July 1, 2023 · 2 min · jiezi

关于abap:使用-ABAP-正则表达式提高字符串解析的执行效率

在 ABAP(Advanced Business Application Programming)中,正则表达式(Regular Expressions)是一种弱小的工具,可用于解决字符串和文本数据。正则表达式能够帮忙您执行各种工作,如查找和替换文本、验证输出格局或拆分字符串。本文将介绍在 ABAP 中应用正则表达式的几种办法。 应用 CL_ABAP_REGEX 类ABAP 提供了一个名为 CL_ABAP_REGEX 的类,用于解决正则表达式。此类提供了许多实用办法,如创立正则表达式对象、查找匹配项、替换文本等。以下是应用 CL_ABAP_REGEX 类的一些示例。 1.1 创立正则表达式对象 要应用正则表达式,首先须要创立一个正则表达式对象。能够应用 CL_ABAP_REGEX 类的构造函数 CREATE 建设一个新的对象。 DATA(regex) = CL_ABAP_REGEX=>CREATE( pattern = `your_regex_pattern` ).1.2 查找匹配项 要查找与正则表达式匹配的文本,能够应用 CL_ABAP_REGEX 类的 FIND 办法。此办法会返回一个布尔值,批示是否找到了匹配项。 DATA: lv_pattern TYPE string VALUE `your_regex_pattern`, lv_subject TYPE string VALUE `your_text`.DATA: lo_regex TYPE REF TO cl_abap_regex, lo_matcher TYPE REF TO cl_abap_matcher.lo_regex = cl_abap_regex=>create( pattern = lv_pattern ).lo_matcher = lo_regex->create_matcher( text = lv_subject ).IF lo_matcher->find( ). "匹配胜利ELSE. "匹配失败ENDIF.1.3 获取匹配的文本 ...

July 1, 2023 · 1 min · jiezi

关于abap:什么是-ABAP-的-Message-ClassMessage-Number-和-Message-Text-试读版

ABAP 编程语言里的 Message(音讯)是 SAP 产品里及其重要的一个概念,因为 Message 是 SAP 利用在运行过程中,向终端用户提供运行反馈的最重要的交互渠道之一。 当用户应用 SAP 产品过程中,如果遇到各种谬误或者提醒音讯,会依据这些音讯,查问文档或者征询 SAP 反对人员,以取得下一步的操作倡议。当 SAP 从业者遇到这些音讯时,也会将音讯文本粘贴下来,复制到搜索引擎里查看网络是是否曾经存在解决方案了。 笔者的知乎征询和常识星球也常常收到此类问题的征询,就是给我提供一个蕴含谬误音讯的截图,而后询问下一步应该如何解决: 因而每个 ABAP 开发人员都有必要深刻理解 ABAP Message 的设计理念和应用办法。 上面是本文的具体内容。

June 22, 2023 · 1 min · jiezi

关于abap:ChatGPT-勘误SAP-ABAP-系统里数据库表-dlvsystc-的用途

SAP ABAP 零碎里数据库表 dlv_systc 的用处? ChatGPT 的回复: 在 SAP ABAP 零碎中,数据库表 dlv_systc 是用于存储交货单零碎条件查看的相干数据的。交货单是指在销售和分销过程中,将产品或服务从供应商转移到客户的文件。在交货单创立和处理过程中,零碎须要进行一系列的条件查看,以确保交货单数据的正确性和完整性。dlv_systc 表蕴含了用于交货单零碎条件查看的各种规定和设置。它存储了与条件查看相干的信息,如查看的编号、查看的名称、查看的类型、查看的后果等。这些数据能够用于在交货单创立和处理过程中进行自动化的条件查看,并在须要时主动触发相干的操作和告诉。 因为 dlv_systc 表存储了波及到交货单创立和解决的重要信息,因而只有通过受权的用户能力对其进行更改和保护。开发人员能够应用 ABAP 语言拜访和操作该表,以满足特定的业务需要。 这个回复不正确。笔者猜想 ChatGPT 将缩写 dlv 了解成了 SAP S/4HANA(SCM) 供应链治理模块里的交货单 - Delivery Note? 实际上,dlv_systc 这张表,形容信息 System Change Option for Software Components,存储的是每个 ABAP software component 的可修改性(changeability): 这里的 DLVUNIT,公布单元,指的就是一个个的 ABAP Software Component. 这张表里的内容如下: ABAP 里的对象(比方 ABAP 类,ABAP Function Module,ABAP DDIC 对象) 都存储在 ABAP 开发包(package) 里。 双击这些 ABAP 开发包,就能查问到期所属的 Software Component 了: ...

February 23, 2023 · 1 min · jiezi

关于abap:ABAP-方法调用的参数传递里通过引用传递的方式能修改原始参数值吗

本教程前一篇文章,咱们曾经介绍了 ABAP 办法调用里,参数传递 Pass Value 这个 checkbox 勾上与否的行为差别。简略温习一下,勾上 Pass Value 阐明开发人员冀望调用函数时传递参数值采取值拷贝的形式进行;如果不勾上,将输出参数的援用传递到函数内定义的形式参数。 咱们指定参数时,零碎开发工具的默认行为是不勾上 Pass Value. 87. SAP ABAP 办法调用里传值(Pass Value)和传援用(Pass Reference)的区别 教程开端咱们提出了一个问题: 比方我调用一个函数计算 3+2 的和,是否在函数体内,当加法计算结束后,把传递进来的第一个参数,从 3 改成其余值呢?答案是看具体情况而定。 本文咱们就来具体探讨这个问题。 总结本文介绍的关键点: (1) ABAP 办法传递默认采纳 Pass by Reference 即援用传递。 (2) 对于 ABAP 类的办法调用和 ABAP Function Module 调用,输出参数即便采纳援用传递,也无奈在办法和函数实现体内对输出参数的值进行批改。 (3) ABAP subroutine 通过 USING 关键字指定的参数,也是通过援用传递传值,然而能够在 subroutine 实现体内被批改。如果想防止这种状况产生,能够采纳 VALUE 关键字来润饰该参数。

February 18, 2023 · 1 min · jiezi

关于abap:ABAP-数据库表-Size-Category-字段的准确含义

有敌人在我这篇教程文章里留言: 14. 如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)这位敌人的问题是想征询 ABAP 数据库表 Technical Settings 里这个 Size Category,如果开发人员过后设置了一个比拟小的值,比方抉择的 0, 对应的记录数是 0 到 1000. 那么随着利用的继续运行,一旦存储到这张数据库表的记录数超过了 1000,会呈现什么状况? 要答复这个问题,首先要深刻了解上图 Technical Settings 里 Size Category 的精确含意。 常见的误区是,把这个字段值了解成一张数据库表最大容许存储的记录数目,这是不正确的。 实际上,这个字段值定义了数据库中 ABAP 数据库表所需的预期空间(expected space required)。 笔者这篇文章,会依据下图来具体论述这个字段的精确含意。

February 18, 2023 · 1 min · jiezi

关于abap:ABAP-创建数据类型的三种方式各自的使用场合和优缺点辨析试读版

本教程之前的步骤,介绍了 ABAP 数据字典即 SE11 这个事务码里可能创立三种不同的数据类型: Data ElementStructureTable Type以及这三种数据类型各自的应用场合: 84. ABAP 数据字典里数据元素(Data Element),构造(Structure)和表类型(Table Type)三者的应用辨析想必大家在学习上一篇教程的时候,曾经留神到了一点:咱们既能够在 SE11 事务码里创立数据类型,也能够在 ABAP 代码里创立数据类型。 那么这些不同渠道创立的数据类型,在应用上有什么差异吗?ABAP 里除了 SE11 和 ABAP 代码里创立数据类型之外,是否还有其余的创立形式? 这篇文章进行了具体的解答。 文章目录在 SE11 事务码里创立的全局数据类型全局类型的可重用性(Reusability)全局类型的可传输性全局类型的命名唯一性在 ABAP 报表里创立的部分数据类型介于 DDIC 全局类型和 ABAP 报表部分类型之间的第三种数据类型总结

January 30, 2023 · 1 min · jiezi

关于abap:使用-Excel-cdata-addmin-连接-SAP-ABAP-系统时需要填写的参数定义解释

这个链接 蕴含了一个可能间接在 Excel 里连贯 SAP ABAP 零碎的 Excel addin,装置之后,在 Excel 里看到一个新的名叫 cdata 的标签页,保护指标 ABAP 零碎的明细后,能够间接在 Excel 里连贯 ABAP 零碎。 须要保护指标 ABAP 零碎的下列信息,我用图例1,2,3,4 来代表。本文余下局部别离介绍这四个字段的含意和填写形式。 咱们能够在 SAPGUI 里右键单击指标零碎,在右键菜单里抉择 Properties 查看须要填写的字段内容: 1. Message Servercdata 须要填写的 Message Server 字段值,来自下图黄色区域的字段值。这是目标 ABAP 零碎音讯服务器的地址。 2. Group零碎属性菜单里看到 Group 字段是什么值,就在 CData 对应的 Group 字段里保护对应的值。例如下图 Group 值为 PUBLIC, 照样在 cdata 里将 Group 保护成 PUBLIC 即可。 3. System ID如上图,System ID 显示成 AG3,在 cdata 里保护成 AG3 即可。 ...

January 16, 2023 · 1 min · jiezi

关于abap:如何使用-ST05-事物码快速找到访问指定数据库表的-ABAP-代码试读版

在理论我的项目开发过程中,ABAP 参谋可能会常常接到这类需要: 调研 SAP 规范产品某个性能的具体实现地位,在此基础上做加强开发。 比方下图是 SAP CRM 产品主数据管理利用的搜寻页面。 点击 Search 按钮之后,咱们可能看到依据指定的搜寻条件,在 ABAP 后盾数据库表里搜寻之后失去的后果: 当初咱们曾经从组里其余共事那里得悉产品搜寻时须要拜访数据库表 COMM_PRODUCT, 然而没有通知咱们具体在哪一段 ABAP 代码里拜访的这张表,须要咱们本人找到答案。 本文介绍如何应用 ST05 这个工具,疾速找到精确的 ABAP 代码地位。 ST05 同本教程之前介绍的 SAT 工具有一些共同点:二者都是一种性能记录和剖析工具,都须要使用者启动工具,开启跟踪模式,而后在跟踪模式下运行利用,运行结束之后,工具会将记录的性能执行数据和剖析后果展示给用户。 SAT 侧重点在记录 ABAP 代码的执行效率,包含 ABAP 类,ABAP Function Module,ABAP Subroutine 和 Open SQL 语句的执行性能,而 ST05 则侧重于数据库层面的执行性能剖析。 对于 SAT 工具的应用办法,本教程之前曾经具体介绍过。 26. 如何应用事物码 SAT 查找某个 SAPGUI 屏幕字段对应的后盾存储数据库表的名称65. 应用事物码 SAT 查找某个 SAPGUI 事物码操作调用的 Function Module 列表上面通过一个理论例子来介绍 ST05 的应用办法。 咱们先把前台须要运行的利用筹备好。在关上 ST05 的跟踪模式之后,就不要运行除了须要监控的这个利用之外的其余利用了。否则的话,其余利用时拜访的数据库表的性能数据也会一起被 ST05 记录下来,会烦扰咱们的后果剖析。 ...

January 16, 2023 · 1 min · jiezi

关于abap:SAP-ABAP-Application-Log-的使用方法

SAP ABAP Application Log 的应用场景: (1) 当你想记录应用程序的执行进度,以便当前在须要时重建它;(2) 当开发人员不确定/无奈调试代码(前台/后盾)并且想深刻理解谬误起因时,能够通过查看应用程序日志来确定问题所在的确切地位。 应用事物码 SLG0 创立一个对象,该对象用于辨认开发人员在 ABAP 代码里应用的 Application log. 这里创立一个名叫 ZHR_ENC 的应用程序日志对象。 再创立一个子对象 ZHRENC_SUB。 这里的场景是,为 COUNTRY 治理创立一个应用程序日志。Country 能够蕴含不同的 State,这些 State 的执行状况,通过子对象 ZHRENC_SUB 来记录。 测试代码: type-pools: abap.data: l_log_handle type balloghndl,l_timestamp type tzntstmps,l_timezone type timezone value ‘UTC’,l_str_log type bal_s_log,l_str_balmsg type bal_s_msg,l_str_message type bapiret2,l_msg_logged type boolean,l_tab_messages type bapiret2_t.*-Building messages*–Use your own message which you want to Display in the logdo 1 times.call function ‘BALW_BAPIRETURN_GET2’exportingtype = ‘E’cl = ‘BPFS’number = ‘006’importingreturn = l_str_message.append l_str_message to l_tab_messages.clear l_str_message.enddo.*-Logging messagesconvert date sy–datum time sy–uzeitinto time stamp l_timestamp time zone l_timezone.l_str_log–extnumber = l_timestamp.condense l_str_log–extnumber.l_str_log–object = ‘ZHR_ENC’.l_str_log–subobject = ‘ZHRENC_SUB’.l_str_log–aldate_del = sy–datum + 5.call function ‘BAL_LOG_CREATE’exportingi_s_log = l_str_logimportinge_log_handle = l_log_handleexceptionslog_header_inconsistent = 1others = 2.if sy–subrc <> 0.message id sy–msgid type sy–msgty number sy–msgnowith sy–msgv1 sy–msgv2 sy–msgv3 sy–msgv4 into l_str_message–message.write: ‘Type’,sy–msgty, ‘Message’,l_str_message–message.else.loop at l_tab_messages into l_str_message.move: l_str_message–type to l_str_balmsg–msgty,l_str_message–id to l_str_balmsg–msgid,l_str_message–number to l_str_balmsg–msgno,l_str_message–message_v1 to l_str_balmsg–msgv1,l_str_message–message_v2 to l_str_balmsg–msgv2,l_str_message–message_v3 to l_str_balmsg–msgv3,l_str_message–message_v4 to l_str_balmsg–msgv4.call function ‘BAL_LOG_MSG_ADD’exportingi_log_handle = l_log_handlei_s_msg = l_str_balmsgimportinge_msg_was_logged = l_msg_loggedexceptionslog_not_found = 1msg_inconsistent = 2log_is_full = 3others = 4.if sy–subrc <> 0.message id sy–msgid type sy–msgty number sy–msgnowith sy–msgv1 sy–msgv2 sy–msgv3 sy–msgv4 into l_str_message–message.write: ‘Type’,sy–msgty, ‘Message’,l_str_message–message.endif.endloop.if sy–subrc eq 0.call function ‘BAL_DB_SAVE’exportingi_save_all = abap_trueexceptionslog_not_found = 1save_not_allowed = 2numbering_error = 3others = 4.if sy–subrc <> 0.message id sy–msgid type sy–msgty number sy–msgnowith sy–msgv1 sy–msgv2 sy–msgv3 sy–msgv4 into l_str_message–message.write: ‘Type’,sy–msgty, ‘Message’,l_str_message–message.else.write: ‘Messages Saved in the log’.endif.endif.endif.write : ‘done with log number’,l_str_log–extnumber.在下面的代码中: ...

January 10, 2023 · 2 min · jiezi

关于abap:如何手动通过增强的方式给-SAP-ABAP-数据库表增添新的字段

有个敌人向我征询对于 SAP 产品加强字段扩大(Field Extensibility) 的问题: Jerry,你好。看过你写的SAP产品加强Field Extensibility文章,对扩大字段在物理数据库的构造还不是很分明,创立一个扩大字段后,物理数据库中是在SAP标品的表中加列,还是有一个关联表?或者说这是不是有多种可选的策略?想问一下这一块细节。 这位敌人应该看的是笔者这篇文章:SAP产品的Field Extensibility。 本文就通过一个理论的例子,解说如何手动给 SAP ABAP 数据库表,通过加强的形式,削减新的字段。 所谓加强(enhancement),是一种降级平安的扩大形式,这种形式不会对 SAP 规范产品公布的数据库表造成间接批改,这意味着客户能够在本人的零碎上,通过这种加强形式给 SAP 规范数据库表削减新的字段。其后如果 SAP 数据库表产生了版本更新,比方削减了新的规范字段,或者对已有字段进行重命名,客户加强的这些字段都不会受到影响。 客户加强字段存储在一个客户创立的名叫 append structure 的 ABAP DDIC 构造上,这个构造是独立于 SAP 规范数据库表,存储在客户本人的命名空间下的开发包里。 下图是 SAP CRM 产品主数据的明细页面,其中产品的形容信息,寄存在数据库表 COMM_PRSHTEXT 里。 COMM_PRSHTEXT 的主键为 PRODUCT_GUID 和 LANGU,这暗示咱们一个产品能够别离基于不同的语言,别离保护多条形容信息。 SHORT_TEXT 字段寄存产品描述大小写相干的内容,这些形容信息字符,在对应语言里如果能转换成大写,则全副转换成大写模式,而后寄存到另一个字段 SHTEXT_LARGE 里。 这两列的内容的一些例子,如下图所示: 本文咱们介绍如何在这张数据库表里通过加强的形式,增加一个额定的自定义字段。假如咱们增加的新字段数据类型为整数类型,用来存储一个产品描述信息的字符个数(通过 ABAP 规范函数 strlen 取得)。 最初增加的扩大字段成果如下图所示: 具体的步骤如下)。

January 10, 2023 · 1 min · jiezi

关于abap:ABAP-include-structure-的一个具体用法

在客户零碎中应用 append structure 加强 SAP 构造或 SAP 表,这种行为并不形成批改(modification)。这一点在 SAP 官网 失去确认。 为客户零碎中的 SAP 对象创立的附加构造,位于客户命名空间(或非凡开发我的项目合作伙伴的命名空间)中,因而不会被降级笼罩。 SAP 倡议客户的加强开发,也应用来自客户名称空间的名称创立这种类型的追加构造的组件,以防止命名抵触。降级后,关联的附加构造将再次附加到 SAP 批改的表中。 构造的组件能够通过在 ABAP 字典中蕴含其余构造的组件来定义,包含数据库表或视图。 这些被蕴含的构造被称为include构造(或简称includes)。 从技术角度看,include构造被include的构造援用了被include的构造,每当这个构造发生变化时,都会相应地批改。 蕴含构造自身能够蕴含蕴含构造,最大嵌套深度为九个蕴含。 下图的 CRMT_ORDERADM_H_EXT 就是一个 include structure: 这个 include structure 里又蕴含了两层嵌套的 include structure,如下图黄色区域所示: CRMT_ORDER_EDIT_INFOINCL_EEW_ORDERADM_H当一个 include structure 被蕴含到一个已有构造时,并没有创立子结构,这意味着 include structure 里的组件字段被插入,就如同它们是在这个地位独自指定的一样,并且它们像间接定义的组件一样被解决。 能够依据须要组合惯例组件和蕴含构造。 当一个构造作为蕴含构造被蕴含时,它能够被调配一个组名和一个三字符后缀。 在 ABAP 程序中,组的名称是援用构造申明的数据对象的附加寻址选项。 所蕴含构造的所有组件都能够应用此名称一起寻址,或者能够应用名称后的结构组件选择器 (-) 寻址单个组件。在组件名称后附加一个后缀以重命名每个组件并防止组件之间的命名抵触。 蕴含在带有后缀的构造中的蕴含构造的组件的原始名称不能超过 27 个字符。ABAP 零碎里的 demo structure DEMO_WEEK, 演示了组名和三字符后缀的一个例子: 在这个构造里,它反复蕴含了五次 include structure DEMO_DAY. 在 DEMO_DAY 里,蕴含两个字段 work 和 free,然而这两个字段通过 DEMO_DAY 这个 include structure 被蕴含到 DEMO_WEEK 之后,通过三字符后缀, ...

January 10, 2023 · 1 min · jiezi

关于abap:sap-ie浏览器被禁止后-打不开浏览器了

解决办法关上类se24 cl_wdy_wb_config_editor 找到办法 call_browser 点击隐士加强按钮, 展现隐士加强 在第一行的地位 写上一句代码if m_sso_active is not initial.clear:m_sso_active.endif. 保留激活就能够了 还有一个中央 cl_gui_html_viewerdetach_url_in_browser 这里得加一个隐士加强

November 1, 2022 · 1 min · jiezi

关于abap:odata-服务传输-assign-sap-system-aliases-to-odata-service

orsm30 /IWFND/C_MGDEAM is a client dependent table.须要把这个表的数据包到申请号码外面。肯定要确认这条数据在申请外面 能力传输过来

September 27, 2022 · 1 min · jiezi

关于abap:SAP-ABAP-标准表和其字段的命名规则讲解

本专栏打算的文章数在 150 篇左右,到 2022年9月12日为止,目前曾经更新了 51 篇,专栏完成度为 34%零根底 ABAP 学习教程系列文章的目录1. ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍2. ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别3. ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素4. ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型5. ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识6. 通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧7. ABAP function module 的应用8. ABAP subroutine 的定义和应用9. ABAP 中的变量和常量10. ABAP 编程语言中的零碎字段(System Fields)11. 什么是 ABAP Field Symbol12. ABAP 援用类型介绍13. 最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍14. 如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)15. 如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)16. 用 ABAP 读取本地文本文件内容17. 26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据18. ABAP 如何解析 JSON 数据19. 如何从本地文件里拷贝某个 ABAP 类到 SAP 零碎20. 面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 办法21. SAP ABAP 报表的用户输出性能22. 应用 ABAP 事物码 SM59 创立 Destination 来读取外网的数据23. 通过一个具体的例子,解说 SAP BDC 技术的应用步骤24. 从解读 BDC 主动生成的代码谈起,解说 SAPGUI 的程序组成部分25. 如何查问 SAPGUI 屏幕上某个字段对应的数据库表存储26. 如何应用事物码 SAT 查找某个 SAPGUI 屏幕字段对应的后盾存储数据库表的名称27. 一步步创立蕴含自定义 Screen 的 ABAP 程序的具体步骤28. SAP ABAP 字符串变量容易忽略和混同的一些知识点SAP ABAP 解决 Excel 的规范函数 TEXT_CONVERT_XLS_TO_SAP 介绍29. 授人以渔-在 SAP MM 物料显示界面上看到一个字段,如何查找哪张数据库表的哪个字段进行的存储30. SAP ABAP 零碎进行数据库表查问的几种罕用办法31. 如何让 ABAP 服务器可能响应通过浏览器发动的自定义 HTTP 申请32. 一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧33. 如何应用 saplink 装置其余网站上提供的 ABAP 程序34. ABAP 报表中如何给报表的输出参数削减 F4 Value Help35. ABAP 报表中如何以二进制形式上传本地文件36. ABAP 里文件操作波及到中文字符集的问题和解决方案37. 如何对 ABAP 数据库表通过 ABAP 代码进行更新和删除操作38. 如何让 ABAP 报表在后台作业的模式下运行39. 如何应用 ABAP 代码解析 XML 文件40. 如何应用 ABAP 代码发送邮件到指定邮箱41. 如何应用 ABAP 代码发送带有 PDF 附件的电子邮件50. 如何在 SAPGUI 里显示上传到 ABAP 服务器的 PDF 文件51. 如何在 SAP ABAP 零碎中应用 Adobe Form52. 应用 SAP ABAP 代码生成 PDF 文件,填充以业务数据并显示在 SAPGUI 里53. 如何把 SAP ABAP 零碎里一张数据库表的内容,显示在 Adobe PDF Form 里54. 应用 ABAP 代码制作手机可能扫描的二维码(QRCode)55. ABAP 是一门反对面向过程和面向对象的混合型编程语言,理论开发中用哪种?更多文章正在写作中Office 专题42. 用 ABAP 新建本地 Excel 文件并写入数据43. 如何应用 ABAP 创立蕴含不同字体大小的 Word 文档更多文章正在写作中ALV 开发专题44. 27 行代码开发一个最简略的 SAP ALV 报表45. 48 行代码给 ABAP ALV 报表的数据行削减色彩成果46. 77 行代码实现ABAP ALV 中的双击事件处理47. SAP ABAP ALV 档次程序表如何应用双表头(Multiple Headers)进行数据输入48. 如何在 SAP ABAP ALV 报表里以交通灯的形式显示某一列的值49. 在弹出对话框窗口里显示 SAP ABAP ALV 列表更多文章正在写作中笔者本教程这篇文章: ...

September 24, 2022 · 2 min · jiezi

关于abap:如何对-ABAP-数据库表通过-ABAP-代码进行更新和删除操作试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据ABAP 如何解析 JSON 数据如何从本地文件里拷贝某个 ABAP 类到 SAP 零碎面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 办法SAP ABAP 报表的用户输出性能应用 ABAP 事物码 SM59 创立 Destination 来读取外网的数据通过一个具体的例子,解说 SAP BDC 技术的应用步骤从解读 BDC 主动生成的代码谈起,解说 SAPGUI 的程序组成部分如何查问 SAPGUI 屏幕上某个字段对应的数据库表存储如何应用事物码 SAT 查找某个 SAPGUI 屏幕字段对应的后盾存储数据库表的名称一步步创立蕴含自定义 Screen 的 ABAP 程序的具体步骤SAP ABAP 字符串变量容易忽略和混同的一些知识点SAP ABAP 解决 Excel 的规范函数 TEXT_CONVERT_XLS_TO_SAP 介绍授人以渔-在 SAP MM 物料显示界面上看到一个字段,如何查找哪张数据库表的哪个字段进行的存储SAP ABAP 零碎进行数据库表查问的几种罕用办法如何让 ABAP 服务器可能响应通过浏览器发动的自定义 HTTP 申请一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧如何应用 saplink 装置其余网站上提供的 ABAP 程序ABAP 报表中如何给报表的输出参数削减 F4 Value HelpABAP 报表中如何以二进制形式上传本地文件ABAP 里文件操作波及到中文字符集的问题和解决方案更多文章正在写作中Office 专题用 ABAP 新建本地 Excel 文件并写入数据如何应用 ABAP 创立蕴含不同字体大小的 Word 文档更多文章正在写作中ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理SAP ABAP ALV 档次程序表如何应用双表头(Multiple Headers)进行数据输入更多文章正在写作中本教程后面的步骤,咱们曾经介绍了 ABAP 数据库表的创立和读取操作: ...

September 4, 2022 · 1 min · jiezi

关于abap:SAP-ABAP-ALV-层次顺序表如何使用双表头Multiple-Headers进行数据输出试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据ABAP 如何解析 JSON 数据如何从本地文件里拷贝某个 ABAP 类到 SAP 零碎面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 办法SAP ABAP 报表的用户输出性能应用 ABAP 事物码 SM59 创立 Destination 来读取外网的数据通过一个具体的例子,解说 SAP BDC 技术的应用步骤从解读 BDC 主动生成的代码谈起,解说 SAPGUI 的程序组成部分如何查问 SAPGUI 屏幕上某个字段对应的数据库表存储如何应用事物码 SAT 查找某个 SAPGUI 屏幕字段对应的后盾存储数据库表的名称一步步创立蕴含自定义 Screen 的 ABAP 程序的具体步骤SAP ABAP 字符串变量容易忽略和混同的一些知识点SAP ABAP 解决 Excel 的规范函数 TEXT_CONVERT_XLS_TO_SAP 介绍授人以渔-在 SAP MM 物料显示界面上看到一个字段,如何查找哪张数据库表的哪个字段进行的存储SAP ABAP 零碎进行数据库表查问的几种罕用办法如何让 ABAP 服务器可能响应通过浏览器发动的自定义 HTTP 申请一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧如何应用 saplink 装置其余网站上提供的 ABAP 程序ABAP 报表中如何给报表的输出参数削减 F4 Value HelpABAP 报表中如何以二进制形式上传本地文件ABAP 里文件操作波及到中文字符集的问题和解决方案更多文章正在写作中Office 专题用 ABAP 新建本地 Excel 文件并写入数据如何应用 ABAP 创立蕴含不同字体大小的 Word 文档更多文章正在写作中ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理SAP ABAP ALV 档次程序表如何应用双表头(Multiple Headers)进行数据输入更多文章正在写作中在理论我的项目中,ABAP 开发人员常常遇到一些须要带有层级构造的数据显示。 ...

August 20, 2022 · 2 min · jiezi

关于abap:SAP-ABAP-OData-服务里-EntityType-和-EntitySet-的区别试读版

正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到进步(蕴含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,能够分为三大类。因而本教程也分为三大部分,别离进行介绍。本文是本教程的文章目录。 作者简介Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后退出 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 规范产品开发生涯里,Jerry 已经先后参加 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等规范产品的研发工作。 Jerry 对 SAP OData 服务的开发,测试,公布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和应用场合,均有着深刻的钻研。 基于 SEGW - Gateway Service Builder 的开发教程1. 在 SAP ABAP 事物码 SEGW 里创立 SAP OData 我的项目2. 在 SAP ABAP 系统对事物码 SEGW 创立的 OData 服务进行配置并测试3. SAP ABAP OData 服务诊断工具 /IWFND/ERROR_LOG 的应用办法4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 办法实现指南5. SAP ABAP OData 服务如何反对 $filter (过滤)操作6. 应用 Postman 工具高效治理和测试 SAP ABAP OData 服务7. SAP ABAP OData 服务如何反对 $orderby (排序)操作8. SAP ABAP OData 服务如何反对创立(Create)操作9. SAP ABAP OData 服务如何反对删除(Delete)操作10. SAP ABAP OData 服务如何反对批改(Update)操作11. 应用 HTTP PUT, PATCH 以及 MERGE 申请生产 SAP ABAP OData 服务批改操作的实现及其区别12. SAP ABAP OData 服务如何反对 $select 有选择性地仅读取局部模型字段值13. SAP ABAP OData 服务的分页加载数据集的实现(Paging)14. 几种 SAP ABAP OData 服务的性能评估和测试工具介绍15. SAP ABAP OData 服务里 EntityType 和 EntitySet 的区别更多文章正在写作中,敬请期待应用 Restful ABAP Programming 编程模型(简称 RAP) 开发 OData 服务正在写作中,敬请期待应用 SAP Cloud Application Programming 编程模型开发 OData 服务正在写作中,敬请期待笔者刚刚学习 SAP ABAP OData 服务开发时,对 EntityType 和 EntitySet 这两个概念的区别,始终了解得似是而非,于是专门写一篇文章来强调。 ...

August 18, 2022 · 2 min · jiezi

关于abap:SAP-ABAP-OData-服务如何支持-filter-过滤操作试读版

正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到进步(蕴含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,能够分为三大类。因而本教程也分为三大部分,别离进行介绍。本文是本教程的文章目录。 作者简介Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后退出 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 规范产品开发生涯里,Jerry 已经先后参加 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等规范产品的研发工作。 Jerry 对 SAP OData 服务的开发,测试,公布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和应用场合,均有着深刻的钻研。 基于 SEGW - Gateway Service Builder 的开发教程1. 在 SAP ABAP 事物码 SEGW 里创立 SAP OData 我的项目2. 在 SAP ABAP 系统对事物码 SEGW 创立的 OData 服务进行配置并测试3. SAP ABAP OData 服务诊断工具 /IWFND/ERROR_LOG 的应用办法4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 办法实现指南5. SAP ABAP OData 服务如何反对 $filter (过滤)操作更多文章正在写作中,敬请期待应用 Restful ABAP Programming 编程模型(简称 RAP) 开发 OData 服务正在写作中,敬请期待应用 SAP Cloud Application Programming 编程模型开发 OData 服务正在写作中,敬请期待本教程的前四篇文章,咱们曾经应用事物码 SEGW,开发了一个用于图书治理的 OData 服务,胜利将其配置并部署到了 ABAP 零碎上,能够通过下列两个链接,在 SAP ABAP Gateway Client 里,别离返回 OData 服务的元数据和硬编码的一条图书数据。 ...

August 12, 2022 · 1 min · jiezi

关于abap:使用-ABAP-编程语言的-System-CALL-接口直接执行-ABAP-服务器所在操作系统的-shell-命令

假如咱们想查看装置了 ABAP 应用服务器的 Linux 零碎某个文件目录下的明细,如果间接登录 Linux Shell,应用 ls -l 命令即可。 比方:ls -l //bas/CGC5/src/krn/abap/runt 其实咱们能够应用 ABAP 提供的 CALL 关键字,间接在 ABAP 应用层,发动对操作系统 shell 命令行的调用。后者的执行后果,返回给 ABAP 层,这样 ABAP 利用开发人员就能在此基础上进行一些解决,开发一些工具。 我写了一个简略的 ABAP 报表来包装这个 CALL 关键字的调用: REPORT zlinux.PARAMETERS: command TYPE string LOWER CASE DEFAULT 'ls -l //bas/CGC5/src/krn/abap/runt'.DATA: commtext(120) , itab(255) OCCURS 10 WITH HEADER LINE, lv_folder TYPE string.START-OF-SELECTION. PERFORM init. CALL 'SYSTEM' ID 'COMMAND' FIELD commtext ID 'TAB' FIELD itab[]. LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>). FIND REGEX '^.*\.c|^.*\.cpp|^.*\.h' IN <line>. IF sy-subrc = 0. WRITE: / <line> COLOR COL_NEGATIVE. DATA(lv_line) = CONV char255( <line> ). HIDE lv_line. ELSE. WRITE: / <line>. ENDIF. ENDLOOP.AT LINE-SELECTION. PERFORM display_source.FORM display_source. SPLIT lv_line AT space INTO TABLE DATA(lt_file). DATA(index) = lines( lt_file ). DATA(lv_file_name) = lv_folder && '/' && lt_file[ index ]. DATA(lv_op) = |cat { lv_file_name } |. SUBMIT zlinux WITH command EQ lv_op.ENDFORM.FORM init. commtext = command. SPLIT commtext AT space INTO TABLE DATA(lt_table). CHECK lines( lt_table ) = 3. lv_folder = lt_table[ 3 ].ENDFORM.执行之后,能够指定待执行的 Linux 命令,比方 pwd,这是 Linux 里打印当前工作门路的命令行,即 Print Working Directory 的含意。 ...

August 12, 2022 · 1 min · jiezi

关于abap:ABAP-报表中如何以二进制方式上传本地文件试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据ABAP 如何解析 JSON 数据如何从本地文件里拷贝某个 ABAP 类到 SAP 零碎面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 办法SAP ABAP 报表的用户输出性能应用 ABAP 事物码 SM59 创立 Destination 来读取外网的数据通过一个具体的例子,解说 SAP BDC 技术的应用步骤从解读 BDC 主动生成的代码谈起,解说 SAPGUI 的程序组成部分如何查问 SAPGUI 屏幕上某个字段对应的数据库表存储如何应用事物码 SAT 查找某个 SAPGUI 屏幕字段对应的后盾存储数据库表的名称一步步创立蕴含自定义 Screen 的 ABAP 程序的具体步骤SAP ABAP 字符串变量容易忽略和混同的一些知识点SAP ABAP 解决 Excel 的规范函数 TEXT_CONVERT_XLS_TO_SAP 介绍授人以渔-在 SAP MM 物料显示界面上看到一个字段,如何查找哪张数据库表的哪个字段进行的存储SAP ABAP 零碎进行数据库表查问的几种罕用办法如何让 ABAP 服务器可能响应通过浏览器发动的自定义 HTTP 申请一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧如何应用 saplink 装置其余网站上提供的 ABAP 程序ABAP 报表中如何给报表的输出参数削减 F4 Value HelpABAP 报表中如何以二进制形式上传本地文件更多文章正在写作中Office 专题用 ABAP 新建本地 Excel 文件并写入数据如何应用 ABAP 创立蕴含不同字体大小的 Word 文档更多文章正在写作中ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理更多文章正在写作中更多文章正在写作中本教程的这个步骤,用 ABAP 读取本地文本文件内容,咱们介绍了应用 Function Module GUI_UPLOAD 来上传文本文件,整个报表不过 18 行代码。 ...

August 12, 2022 · 2 min · jiezi

关于abap:SAP-ABAP-Gateway-Client-里-OData-测试的-PUT-PATCH-MERGE-请求有什么区别

置信不少敌人在应用 SAP ABAP Gateway Client 测试 OData 服务时,都看到过这三个类似的 HTTP 申请类型:PUT, MERGE 和 PATCH. 这三种类型有什么区别呢? PUT:将 HTTP 申请(payload)作为输出,这个输出将被传入 OData 模型的 DPC Class 的 UPDATE_ENTITY 办法中。例如咱们通过 PUT 传入如下的数据: { “Vbkur” : “170” }则只有 Vbkur 在 update_entity 办法中可见。 总之,如果将 OData 模型的 属性子集(attribute subset)作为 PUT 办法的输出,则雷同的属性子集将会被传入 UPDATE_ENTITY 办法进行解决。 PATCH & MERGE: 如果在无效负载(HTTP 申请)中传递属性的子集,这两个办法会主动获取其余属性。 Patch 和 Merge 的行为形式雷同,但根本区别在于 PATCH 反对 OData 3.0 协定,而 MERGE 反对 OData 1.0 和 2.0 协定。 因而咱们应该优先应用 PATCH,而不是 MERGE.举个例子,下列是订单的低头属性字段汇合: ...

August 4, 2022 · 1 min · jiezi

关于abap:关于缺少编程基础的朋友想转行-ABAP-开发岗提出的一些咨询问题和解答

最近接到一位敌人的征询,对于非编程业余背景想转行 ABAP 开发岗的可行性和具体的致力方向,我感觉问题有肯定的代表性,因为以前也接管到相似的征询。所以独自写一篇短文分享。本文仅代表作者个人观点,和 SAP 官网无关。 1. ABAP 开发岗的职业倒退大抵是什么样的?是不是真的“越老越吃香”?目前的市场需求如何?咱们以本地部署(On-Premises)的基于 ABAP 的 SAP 产品为例,比方 SAP CRM,SAP ERP,SAP S/4HANA,在这些产品里,ABAP 既是开发语言,也是 SAP 利用的运行环境和平台。同时,ABAP 开发进去的利用都是面向企业级用户的利用,因而 ABAP 开发人员,不仅仅须要理解和把握 ABAP 这门编程语言自身的开发技术,也要对本人工作畛域的业务知识(即业内通常说的模块常识)有所理解。 集体认为,如果走纯正的 ABAP 开发路线,即只满足于交付他人调配的开发工作,那么倒退的天花板绝对较低。集体认为 SAP 参谋的真正价值还是在于帮忙客户梳理和整合其企业业务流程,使其可能完满运行在 SAP 零碎上。而 ABAP 开发人员如果在工作过程中,可能充分利用工作劣势一直空虚本人相干模块的业务知识,这样倒退控件就会更加广大。实际上不少胜利的 SAP 从业者,都是走 技术+业务,或者 技术+治理的综合倒退路线。业务和治理常识,绝对于纯正的开发技术自身,才是不随工夫的推移而升值,值得长期去投资和耕耘把握的,当然技术也是进入 SAP 行业的一块敲门砖。 至于 ABAP 开发参谋的市场需求,因为 Jerry 是 SAP 研究院的开发人员,对这一块也不分明。欢送其余业内人士评论和分享。 2. 如果零根底的话,大略须要学习多久能力入行呢?ABAP 开发环境的搭建,相对来说不像其余编程语言比方 Java,JavaScript 这些容易搭建:须要在本人本地装一台 ABAP 服务器,或者通过其余渠道寻找一些装置好的专门用于学习的 ABAP 服务器。ABAP 开发技术自身同其余风行的编程语言相比不算太难,只是相对来说中文材料要少一些,使用者的相对数目也要小一些。零根底的话,学习 ABAP 相对来说我感觉要比学习 Java 和 JavaScript 要艰难一些,因为 Java 和 JavaScript 的学习教程,无论是文字的还是视频的,网络上曾经十分多了,而且这两门编程语言,依照教程能够短时间内疾速写出一些能够运行和应用的利用进去,学习者很容易失去踊跃的正反馈。而 ABAP 这方面的学习材料绝对较少。 ...

July 23, 2022 · 2 min · jiezi

关于abap:一个15年ABAP老兵的建议了解这些基础知识对ABAP开发有百利而无一害

在笔者之前的文章里,已经提到了 SAP社区上这样一篇博客:Proof of Concept: Deploying ABAP in Kubernetes 外面介绍了SAP Linux实验室的工程师们将ABAP应用服务器各组件进行容器化并部署到Kubernetes上的尝试。 本文简略回顾ABAP Netweaver应用服务器的次要组件。尽管即便不理解这些常识,也不影响ABAP开发人员实现日常工作,然而很多ABAP编程的最佳实际都和这些常识有着千头万绪的分割,知其然知其所以然,能帮忙大家写出更强壮更高效的ABAP利用。 什么是ABAP Netweaver应用服务器?SAP Netweaver应用服务器是SAP ABAP利用开发和运行平台,ABAP开发人员在下面能够专一于具体业务逻辑的开发,凡波及到更底层的基础设施相干工作,比方申请的负载平衡,过程的派生,同步和调度,内存治理,服务器多实例间缓存同步等等,通通交由Netweaver平台自身解决。如此一来,一个ABAP开发人员,即便不具备精湛的计算机组成原理,操作系统,计算机网络等畛域常识,也能胜任SAP利用的开发工作。 ABAP Netweaver应用服务器和SAP解决方案的关系?本文探讨的SAP解决方案,仅限于那些基于ABAP技术栈的SAP产品。Google里依据关键字"SAP ABAP three layer"搜寻,能找到很多基于ABAP技术的SAP解决方案的三层经典架构图: 轻易点开一张查看: SAP客户位于图中最下面的展示层(Presentation Layer),通过SAP GUI这个客户端软件或者浏览器拜访SAP零碎; SAP零碎的软件,装置在ABAP Netweaver服务器上,响应用户申请,实现对应的业务逻辑。ABAP Netweaver服务器位于上图两头的应用层。最底层是数据库层,很多SAP产品都反对不同类型的数据库,比方SAP HANA,Oracle数据库,SQL Server等。 局部ABAP开发人员感觉,咱们既然可能间接在ABAP Netweaver里用OPEN SQL对数据库表进行读写操作,那么Netweaver应用服务器自身就蕴含了数据库层。这样了解其实不正确。咱们在Netweaver SE38里编写的OPEN SQL代码,会通过Netweaver外部的数据库接口,转换成数据库提供商相干的原生SQL语句在数据库里执行,并且从最底层的数据库层,到应用层里的ABAP程序之间的数据传输,也是通过数据库接口实现的。 本文探讨的ABAP Netweaver服务器的组成部分,位于三层架构中的应用层。 ABAP Netweaver服务器实例运行在物理机器上的ABAP应用服务器,依照其用处的不同,又可分为两种实例:应用服务器实例和ABAP SAP地方服务实例(ABAP SAP Central Services instances, 缩写为ASCS instances), 也就是下图两个灰色矩形框代表的实例。 一个典型的SAP零碎个别由一到多个应用服务器实例和一个ASCS实例组成。从上图右边的矩形框里,能察看到ABAP应用服务器实例蕴含的次要组件有: (1) Internet Communication Manager (ICM)(2) ABAP dispatcher(3) 工作过程(4) RFC Gateway(5) Start Service 上面是对这些组件的简要介绍。 Internet Communication Manager (ICM)ICM是Netweaver服务器里一个独自的过程,由ABAP Dispatcher启动并监控,负责SAP零碎和内部的网络通信。基于收到申请URL的解析,ICM会将申请分发给具体的handler进行解决。 ...

July 22, 2022 · 1 min · jiezi

关于abap:SAP-OData-开发教程-从入门到提高包含-SEGW-RAP-和-CDP

笔者之前的文章 SAP OData 编程指南 已经提到过,OData(Open Data) 是 SAP 旗舰级产品 S/4HANA 里宽泛应用的一种前台 Fiori 利用(SAP UI5 前端框架开发而成)同后盾 S/4HANA ABAP 服务器通信的协定。通过这种交互方式,实现了 SAP Fiori 利用的前后端拆散。 OData(Open Data Protocol)协定是一个凋谢的工业规范,用于 RESTFul API 的设计和应用。目前支流的编程语言,均提供了各自的软件开发工具包(SDK),对底层的 OData API 开发提供了封装,进步了开发人员编写 OData 服务的效率和代码品质。 在 SAP 产品里,也存在多种 OData 服务的开发方式,其中最典型的三类,就是笔者在本教程里会为大家分享和解说的内容。 同笔者的另一个 SAP UI5 教程 SAP UI5 利用开发教程的学习目录 - 循序渐进,由浅入深,适宜不同程度的 SAP UI5 开发人员一样,本教程笔者打算通过 300 篇以上的文章篇幅,别离介绍这三类 SAP 支流的 OData 服务开发技术。 SEGW - Gateway Service BuilderSEGW 是咱们在 SAP ABAP 零碎里开发 OData 服务的事物码。在这个事物码里,开发人员对 OData 服务的模型进行建模,应用 Builder 主动生成 OData 服务模型元数据类(Metadata Provider Class,简称 MPC),以及 OData 服务的业务数据提供类(Data Provider Class,简称 DPC). ...

June 30, 2022 · 2 min · jiezi

关于abap:SAP-ABAP-解析-excel-文件的函数-TEXTCONVERTXLSTOSAP-单步执行分析

本文是这篇文章SAP ABAP 解决 Excel 的规范函数 TEXT_CONVERT_XLS_TO_SAP 介绍的后续。 在本地新建一个 excel 文件,内容如下: 应用上面的 ABAP 代码进行解析: REPORT z.TYPES: BEGIN OF ty_data, field1 TYPE string, field2 TYPE string, END OF ty_data.TYPES: tt_data TYPE TABLE OF ty_data.DATA: lt_data TYPE tt_data, lt_raw TYPE truxs_t_text_data.CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' EXPORTING i_line_header = abap_false i_tab_raw_data = lt_raw i_filename = 'C:\temp\1.xlsx' TABLES i_tab_converted_data = lt_data EXCEPTIONS conversion_failed = 1 OTHERS = 2.WRITE:/ sy-subrc.执行之后,excel 的数据,存储到 ABAP 变量 lt_data 里。 单步调试:调用 get_spreadsheet_interface, 输出参数为字符串 Excel.Sheet, 其余 changing 参数都是 initial,这些参数都是在该 subroutine 外部初始化: ...

June 21, 2022 · 1 min · jiezi

关于abap:SAP-ABAP-系统同微软-Office-套件进行-Desktop-Integration-的工作原理

SAP 集成技术容许开发人员将与 OLE 兼容的桌面应用程序(例如 Microsoft Office、Lotus SmartSuite 或 Visio)集成到 SAP 零碎中。 通信和数据传输工作原理如下: SAP GUI( Presentation 服务器)和 SAP 应用程序服务器之间的通信在 4.0 版中失去了扩大。这使得在 SAP GUI(管制框架)中蕴含 ActiveX 控件成为可能。 以 Office Excel 为例,在 Options -> Customize Ribbon 里将 Developer 标签配置进去: Desktop Office 集成将此接口用于非凡控件(SAP Document Container Control 和 SAP Data Provider),它们是 SAP 零碎和 Desktop Office 应用程序之间的通信通道。 SAP Document Container Control 应用办法和属性与应用 OLE2 接口的桌面应用程序进行通信。 SAP Data Provider 是不同格局数据的容器和转换器。开发人员导入应用程序的数据将转换为基于 Internet 规范 MIME 的可读格局。 SAP 数据提供者缓冲在 SAP 零碎中治理的文档数据。它还缓冲 SAP 数据,这些数据能够应用 R/3 链接插入到文档中。 ...

June 19, 2022 · 2 min · jiezi

关于abap:ABAP-development-for-Status-Management-in-SAP

Below you will find some objects which is useful when you are performing ABAP development for status management in SAP. Function ModulesSTATUS_READ: With this function, you can get the system status and user status internal codes, such as I0001, E0001.STATUS_TEXT_EDIT: With this function, you can get the external status code REL APPR for one object. In an update transaction, if you set the input parameter BYPASS_BUFFER to X, it will get the old status code from database. If you set the input parameter BYPASS_BUFFER to blank, it will get the new status code after the change.STATUS_CHANGE_INTERN: With this function, you can update the system status.STATUS_CHANGE_EXTERN: With this function, you can update the user status.STATUS_CHANGES_GET: With this function, you can get the status changes in the current update transaction.TablesJSTO: Status object information. It contains the status profile and object category for one object.JEST: Individual Object Status. It contains the object status information. Field INACT indicates whether the status is active or not.TJ02T: System status texts. It contains the external status code and description for one system status, which is INNNN.TJ30T: Texts for User Status. It contains the external status code and description for one user status, which is ENNNN.JCDS: Change Documents for system/user status. It contains the change documents for status management.T-codesBS23: Display system statusBS03: Display status profile (user status)TipsYou can use Authorization key to control the authorization to update user status. If the auth key is assigned to one user status in status profile, the authorization with auth object B_USERSTAT and auth key should be assigned to the user, so that one is able to update the user status.

June 7, 2022 · 2 min · jiezi

关于abap:使用-Prometheus-监控-SAP-ABAP-应用程序

Prometheus是由SoundCloud开发的监控零碎的开源版本,logo是一个焚烧的红色火炬,这应该是有情怀的工程师们向泰坦巨神的后辈,偷偷盗走天火,传给人类的普罗米修斯示意的敬意。 2016年,由Google发动的Linux基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源我的项目,在开源社区非常沉闷,SAP Kyma也应用了Prometheus作为其监控组件。 Prometheus采纳Pull形式获取监控信息,并提供了多维度的数据模型和灵便的数据查问和聚合接口。 那么Prometheus是云原生利用和微服务架构的专属工具么?当然不是。上面,笔者就用SAP CRM On-Premises为例,介绍ABAP技术栈如何借助Prometheus来实现自定义的日志监控性能。 在接触 SAP CRM 利用之前,让咱们先来热热身,相熟一下 Prometheus 的应用办法。 应用 Prometheus 监控Linux零碎各项指标首先在Linux零碎上装置一个探测器node explorer, 下载地址https://prometheus.io/docs/gu...这个探测器会定期将linux零碎的各项硬件指标和内核参数通过9100端口和url metrics裸露给内部。 启动node explorer,显示在9100端口上监听: 浏览器里输出hostname:9100/metrics就能够拜访到node explorer收集到的各项参数: 一些例子:CPU在不同工作模式下的应用工夫:node_cpu_seconds_total 文件系统可用字节数:node_filesystem_avail_bytes 网卡收到的字节数:node_network_receive_bytes_total 上面用Prometheus来收集和展现通过node explorer裸露进去的数据。在Prometheus装置目录的prometheus.yml文件里定义一个job,指向Linux零碎上运行的node explorer: 本地启动Prometheus,关上上面的url:http://localhost:9090/输出node_cpu_seconds_total{mode="system"},查问该服务器上所有CPU工作在零碎态耗费的工夫: 还能够指定工夫窗口,只查问过来1分钟之内的CPU运行数据:rate(node_cpu_seconds_total{mode="system"}[1m]) 如何应用Prometheus 针对本人的服务器采集自定义的参数。用一个简略的例子来阐明。 我用express和http搭了一个最简略的服务器,监听在8081端口上。 在metrics endpoint上,我会打印出这个服务器从启动至今,服务了多少次申请。这里我只是简略应用一个保护在memory中的计数器来模仿服务申请个数。每次metrics被申请,计数器加一。 localhost:8081/metrics测试一下: 关上Prometheus服务器的配置文件prometheus.yml: 增加一条作业,static_configs的target配置成我本人的服务器 localhost:8081.localhost:9090拜访Prometheus的web UI: 切换到图形界面,即可看到随时间推移,我的服务器响应了服务申请的趋势图。横轴为工夫点,纵轴为Prometheus服务器从我的测试服务器每隔默认的15秒收集到的服务响应申请。 SAP CRM 有个 Fiori 利用叫做My Opportunity,是SAP成都研究院笔者所在的CRM Fiori团队开发保护的。假如咱们有这样一个需要,须要监控在指定时间段内,该利用收到的读申请。 ...

June 6, 2022 · 1 min · jiezi

关于abap:有哪些ABAP关键字和语法到了ABAP云环境上就没办法用了

SAP BTP ABAP 环境是用于 ABAP 开发的 SAP 平台即服务 (PaaS) 产品,使开发人员可能利用其传统的本地 ABAP 专业知识,在 SAP 业务技术平台中开发和运行 ABAP 应用程序,或者作为 SAP 软件的扩大或作为独立应用程序。 在咱们进入 云端 ABAP 技术细节的探讨之前,不晓得大家是否思考过一个问题:为什么 SAP 要把 ABAP 编程环境引入 SAP Cloud Platform? SAP 装置的客户群将其现有的外部部署 SAP Business Suite 和 SAP NetWeaver 等产品,部署迁徙到 SAP S/4HANA,包含 On-Premises 和云部署。客户将利用这个机会从根本上简化其在过来几十年中倒退起来的零碎 landscape. 现有的商务套件零碎将尽可能整合到繁多的 S/4HANA 实例中。客户心愿将其外围业务流程的复杂性放大到一个智能的数字外围(Intelligent Digital Core),从而造成智能企业的支柱。 在传统的商务套件零碎中,客户定制话内容无疑是复杂度极高的模块。通过企业的多年应用,自定义代码堆积如山。对 SAP 规范 ABAP 代码的间接批改,会给客户转向更高级别的版本或加强包的施行,带来极大的阻碍。在这种状况下,当客户试图施行新的加强包到零碎时,不得不投入大量的工夫和精力破费在确保自定义代码在加强包施行后依然可能失常工作。 如果客户的 ABAP 解决方案,部署在云端后,那么这些定制化代码又何去何从呢? 通过将 ABAP 开发和执行转移到 SAP Cloud Platform,客户和合作伙伴能够将所有基础架构、生命周期治理和零碎经营工作委托给 SAP 的 DevOps 团队。 客户和合作伙伴能够立刻受害于并采纳由 SAP HANA 提供反对的 ABAP 堆栈的最新翻新,从而能够在云中更快地应用翻新,因为每个季度都会交付新的翻新。 ...

June 6, 2022 · 1 min · jiezi

关于abap:通过一个具体的例子讲解-SAP-BDC-技术的使用步骤试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容用 ABAP 新建本地 Excel 文件并写入数据26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据ABAP 如何解析 JSON 数据如何从本地文件里拷贝某个 ABAP 类到 SAP 零碎面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 办法SAP ABAP 报表的用户输出性能应用 ABAP 事物码 SM59 创立 Destination 来读取外网的数据ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理BDC 是 Batch Data Communication,批处理数据交互的英文缩写。 ...

June 6, 2022 · 1 min · jiezi

关于abap:SAP-云平台-ABAP-编程环境的前世今生

SAP Cloud Platform公布后很长一段时间,在SAP各大技术社区里,能感觉到ABAP从业者们心田一丝隐隐的失落:只管SAP和其余IT公司一道,大步迈开了向云端转型的步调,在SAP云平台上通过BYOL(Bring Your Own Language)的架构,实现了对业界风行编程语言的反对,这使得领有Java,nodejs,PHP,Python,Ruby,Go等编程技能的开发人员们,也能退出SAP生态圈这个小家庭。 不过ABAP从业者们“被云时代摈弃”的这份难堪,随着SAP云平台 ABAP编程环境的公布一扫而光。SAP Cloud Platform编程环境和运行时,曾经呈现了ABAP的身影: ABAP退出SAP Cloud Platform编程环境的小家庭,益处是不言而喻的: (1) 宽广的ABAP从业者们终于上车了,大家以前在Netweaver On-Premises里的ABAP编程技能能够持续在云上发光发热——只管SAP云平台上的ABAP编程环境里呈现了许多新的关键字,新的编程模型,然而ABAP毕竟还是ABAP,这些新常识对于ABAP从业者来说,学习和把握的速度比非ABAP编程人员要快得多。 (2) 为基于ABAP技术栈的SAP产品的扩大,提供了一种新的开发方式。这一点稍后会开展细说。 (3) 为以前大量存在于ABAP On-Premises环境的二次开发代码提供了迁徙到云上的可能性。 (4) SAP Cloud Platform上提供的品种丰盛的企业级微服务,机器学习等弱小性能,现在也能够被同在SAP云平台上的ABAP编程环境生产了。 现在SAP Cloud Platform上可供选择的编程语言又削减了ABAP,那么咱们接到开发工作时,依据什么样的根据从工具库里筛选应用的编程语言呢? SAP给出的倡议就是:具体问题具体分析。 企业开发人员具备的技能,企业现有的零碎和软件资产,以及待开发的用户需要和波及到的业务场景,都会影响编程语言的抉择。一般来说,ABAP和非ABAP编程语言各具劣势,各有各的实用场合:Java,JavaScript和Python等语言的开发生态圈十分凋敝,Github各种开源的组件,工具库,能够说但凡你能想到的点子,生态圈简直都早已有人做进去了,因而抉择这些编程语言开发,咱们能够防止反复造很多轮子;而SAP云平台上的ABAP环境,借助CDS view,Restful ABAP Programming模型等ABAP语言提供的原生个性,在扩大基于ABAP技术栈的SAP产品时劣势显得特地突出。 SAP云平台 ABAP 编程环境的一种典型的应用场景,就是以Side-by-side形式对S/4HANA Cloud进行扩大。 首先须要解释何谓side-by-side Extensibility. 传统的SAP产品的二次开发形式是,ABAP开发者们通过SAP GUI登录到ABAP On-Premises零碎,间接在被扩大的零碎上通过Netweaver提供的各种加强技术进行二次开发。 S/4HANA Cloud,SAP Marketing Cloud,SAP Cloud for Customer等后盾基于Netweaver ABAP的云端解决方案,还提供了基于浏览器的面向Key User的扩大工具,使用者在浏览器里通过简略的向导步骤,也能实现对所在的云产品进行加强的需要。 这种加强形式,应用的开发工具由被加强利用自身提供,生成的资源和被加强的SAP产品都位于同一服务器上,因而称为In-App加强形式。这种形式简略易用,须要的技术门槛绝对较低。 与此绝对应的则是SAP Cloud Platform ABAP编程环境提供的side-by-side加强形式。这种加强形式通常的步骤是首先在本地开发环境实现开发,而后再部署到SAP云平台,SAP Kyma等平台上,因而二次开发内容最终部署和运行的环境,和被加强的SAP产品从物理上看是松耦合的,不在同一服务器上。 上图即SAP S/4HANA Cloud通过side-by-side形式进行扩大的示意图。位于SAP云平台上的ABAP加强通过云平台提供的Connectivity服务(能够了解成ABAP On-Premises里的Destination), 生产SAP S/4HANA Cloud的OData服务,实现对后者零碎数据的增删改查和Action操作。 ...

June 6, 2022 · 1 min · jiezi

关于abap:abap-新badi解析

保留激活 所有没有激活的 都激活下 退出 再进来 *&---------------------------------------------------------------------*REPORT zrep_cls_52.PARAMETERS p_mty TYPE mara-mtart.DATA:gv_material_type TYPE string.gv_material_type = p_mty.DATA:go_badi_handler TYPE REF TO zbadi_def_001.GET BADI go_badi_handler FILTERS mater_type = gv_material_type.IF sy-subrc = 0. CALL BADI go_badi_handler->get_prod_order_info.ENDIF.运行后果

June 5, 2022 · 1 min · jiezi

关于abap:abap-badi的原理是什么

se18进行class badi创立 class baid 通过上述步骤会主动产生接口。咱们给接口撸一个办法接口的办法设定好参数 激活 咱们的badi就创立好了 接下来到se19咱们施行这个badi 到这里class badi的创立和施行曾经实现接下来咱们来通过debug全面解析下这个货色施行啥玩意 REPORT zrep_cls_51.PARAMETERS p_ctry TYPE land1.DATA:gv_str TYPE string VALUE 'Input:'.DATA:go_ref TYPE REF TO zif_ex_badi_test_001.CALL METHOD cl_exithandler=>get_instance EXPORTING exit_name = 'ZBADI_TEST_001' null_instance_accepted = 'X'* IMPORTING* act_imp_existing = CHANGING instance = go_ref EXCEPTIONS no_reference = 1 no_interface_reference = 2 no_exit_interface = 3 class_not_implement_interface = 4 single_exit_multiply_active = 5 cast_error = 6 exit_not_existing = 7 data_incons_in_exit_managem = 8 OTHERS = 9.IF sy-subrc <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.IF sy-subrc IS INITIAL. CALL METHOD go_ref->get_value EXPORTING iv_input = gv_str flt_val = p_ctry.ENDIF. ...

June 5, 2022 · 1 min · jiezi

关于abap:abap-类中多态是什么意思

向上转型前提 第一个必须有继承关系 曾父类->父亲->我能够了解为子类 new一个而后赋值给了父类,子类转型到了父类。 向下转型是父类转型到子类三种模式 第一种:?=采纳的是 lo_baba ?= lo_top_baba第二种:move ?=move lo_top_baba move ?= lo_baba第三种:castcast lo_baba( lo_top_baba ) 向下转型之前 父类对象须要要先向上转型啥意思?父类 = new 子类( ). 有了这个操作才能够向下转型

June 4, 2022 · 1 min · jiezi

关于abap:如何了解ABAP-类的继承

上面是实例代码 首先定义一个父类zcl_super_class_mat记住不能让他final,final 根本完犊子了,继承不了,能够了解为爸爸变成太监了。那么咱们看看继承代码zcl_sub_class_mat_raw 继承自zcl_super_class_mat 咱们能够从新定义 zcl_super_class_mat 的办法,这是什么意思?就是说我尽管来源于你,然而我能够在我的办法里干别的事件。我还能够干别的事件(本人的办法),当然zcl_sub_class_mat_raw 如果不定义成final 我感觉还能够继承上来始终继承到脑瓜子嗡嗡的。 还有一个知识点就是父亲的公有办法是不能继承的。子类继承父类后从新实现父类的办法,写的是在子类办法结尾加上 REDEFINITION(重定义),从新定义方法时,办法的参数是不能扭转的,如果肯定要扭转设定新的输入输出参数,能够思考减少子类的新的属性,而后用从新定义的办法拜访这些新的属性作为参数。继承父类的结构器是不能从新定义的。 子类是能够拜访父类的 例如父类有个办法 method01.在重定义的子类办法 method01外面采纳call method super->method01 这个还必须是 在子类的method01外面 不能在子类的method02外面。可能集体了解的不对,请多多指教。 CLASS zcl_super_class_mat DEFINITION PUBLIC CREATE PUBLIC . PUBLIC SECTION. DATA:mv_material_id TYPE mara-matnr. METHODS set_material_id IMPORTING !iv_material_id TYPE mara-matnr. PROTECTED SECTION. DATA mv_material_name TYPE makt-maktx. METHODS get_material_name RETURNING VALUE(rv_material_name) TYPE makt-maktx. PRIVATE SECTION. DATA mv_material_desc TYPE string. METHODS get_material_desc RETURNING VALUE(rv_material_desc) TYPE string.ENDCLASS.CLASS zcl_super_class_mat IMPLEMENTATION. METHOD get_material_desc. rv_material_desc = mv_material_desc. ENDMETHOD. METHOD get_material_name. rv_material_name = mv_material_desc. ENDMETHOD. METHOD set_material_id. mv_material_id = iv_material_id. WRITE: / 'Material:',mv_material_id. ENDMETHOD.ENDCLASS.CLASS zcl_sub_class_mat_raw DEFINITION PUBLIC INHERITING FROM zcl_super_class_mat FINAL CREATE PUBLIC . PUBLIC SECTION. METHODS get_material_type IMPORTING !iv_material_id TYPE mara-matnr RETURNING VALUE(rv_material_type) TYPE mara-mtart. METHODS set_material_id REDEFINITION . PROTECTED SECTION. METHODS get_material_name REDEFINITION . PRIVATE SECTION. DATA mv_material_type TYPE mara-mtart.ENDCLASS.CLASS zcl_sub_class_mat_raw IMPLEMENTATION. METHOD get_material_name.*CALL METHOD SUPER->GET_MATERIAL_NAME* RECEIVING* RV_MATERIAL_NAME =* .* mv_material_id = iv_material_id. WRITE: / 'RAW Material:',mv_material_id. ENDMETHOD. METHOD get_material_type.* mv_material_id = iv_material_id.* WRITE: / 'RAW material:',mv_material_id. DATA:ls_mara TYPE mara. SELECT SINGLE mtart FROM mara INTO ( ls_mara-mtart ) WHERE matnr = iv_material_id. IF sy-subrc = 0. rv_material_type = ls_mara-mtart. ELSE. rv_material_type = ''. ENDIF. WRITE:/ 'material_type:',rv_material_type. ENDMETHOD. METHOD set_material_id.*CALL METHOD SUPER->SET_MATERIAL_ID* EXPORTING* IV_MATERIAL_ID =* . mv_material_id = iv_material_id. WRITE: / 'Raw Material: ', mv_material_id. ENDMETHOD.ENDCLASS.

June 4, 2022 · 1 min · jiezi

关于abap:abap-类简单复习1

*&---------------------------------------------------------------------**& Report zlcl_class_local*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zlcl_class_local.CLASS zlcl_class_local DEFINITION. PUBLIC SECTION. DATA: mv_value TYPE string. CLASS-DATA: gv_cl_value TYPE string. METHODS: set_value IMPORTING iv_value TYPE string, display_value.ENDCLASS.CLASS zlcl_class_local IMPLEMENTATION. METHOD display_value. WRITE:/ 'Class Instance Attribute:', mv_value. WRITE:/ 'Class Static Attribute:', gv_cl_value. ENDMETHOD. METHOD set_value. mv_value = iv_value. ENDMETHOD.ENDCLASS.START-OF-SELECTION. DATA(lo_class_local) = NEW zlcl_class_local( ). CALL METHOD lo_class_local->set_value EXPORTING iv_value = '<sap abap oop>'. zlcl_class_local=>gv_cl_value = 'IT Book Press'. CALL METHOD lo_class_local->display_value.

June 3, 2022 · 1 min · jiezi

关于abap:ABAP简单的adbc测试代码

*&---------------------------------------------------------------------**& Report ztest_adbc_demo*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT ztest_adbc_demo.TYPES:*”设定内表和工作区构造体的类型 BEGIN OF ty_airline, airline_id TYPE scarr-carrid, airline_name TYPE scarr-carrname, airline_currency TYPE scarr-currcode, url TYPE scarr-url, url2 TYPE string, END OF ty_airline.*”设定承载SQL语句的变量,返回后果变量、条件变量DATA: lv_statement TYPE string, lt_airline TYPE TABLE OF ty_airline, lr_result TYPE REF TO data, lv_currency TYPE scarr-currcode,**”设定ADBC相干类的连贯对象、SQL对象、后果对象、异样对象的变量 lo_conn TYPE REF TO cl_sql_connection, lo_statement TYPE REF TO cl_sql_statement, lo_result_set TYPE REF TO cl_sql_result_set, lx_sql TYPE REF TO cx_sql_exception.*”关联内表到后果对象变量中GET REFERENCE OF lt_airline INTO lr_result.*”设定条件变量的值lv_currency = 'EUR'.*”拼接HANA Native SQL,该语法是HANA的SQL Script所反对的语法*”也能够调用SQL Script的函数如SUBSTRINGlv_statement = | SELECT CARRID, CARRNAME, CURRCODE, URL, |&& | SUBSTRING (URL,8,LENGTH(URL)) AS URL2 |&& | FROM scarr WHERE currcode = '{ lv_currency }' and |&& | CARRID <> 'CA' | .TRY.**n调用SQL-Connection办法,连贯到数据库 lo_conn = cl_sql_connection=>get_connection( ).**n調用SQL-Statement办法,创立SQL对毎 lo_statement = lo_conn->create_statement( ).*"調用SQL-query方还,执行SQL语句 lo_result_set = lo_statement->execute_query( lv_statement ). "调用SQL-set_param_table办法,指定用哪个内表来记录返回后果 lo_result_set->set_param_table( lr_result ).*往取数据集的下一组薮龍到内表 lo_result_set->next_package( ).*”褥到后果后,敞开数据棄 lo_result_set->close( ).*”打印内表 cl_demo_output=>display_data( lt_airline ).*”错误处理,如SQL有误,则在此处报出log,而不会导致系统解体(short dump ) CATCH cx_sql_exception INTO lx_sql. WRITE: lx_sql->get_text( ).ENDTRY. ...

June 3, 2022 · 1 min · jiezi

关于abap:AMDP-过程-–-访问-ABAP-数据类型

CLASS zcl_demo_008_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. TYPES: BEGIN OF ty_spfli, mandt TYPE mandt, carrid TYPE s_carr_id, connid TYPE s_conn_id, countryfr TYPE land1, countryto TYPE land1, END OF ty_spfli. TYPES: tt_spfli TYPE TABLE OF ty_spfli. INTERFACES: if_amdp_marker_hdb. METHODS: get_spfli_details IMPORTING VALUE(iv_mandt) TYPE mandt EXPORTING VALUE(et_spfli) TYPE tt_spfli. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS zcl_demo_008_amdp IMPLEMENTATION. METHOD get_spfli_details BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY. DECLARE lt_spfli TABLE ( mandt "$ABAP.type( SY-MANDT )", carrid "$ABAP.type( S_CARR_ID )", connid "$ABAP.type( S_CONN_ID )", countryfr "$ABAP.type( LAND1 )", countryto "$ABAP.type( LAND1 )" ); lt_spfli.mandt[1] := '100'; lt_spfli.carrid[1] := 'AA'; lt_spfli.connid[1] := '1000'; lt_spfli.countryfr[1] := 'DE'; lt_spfli.countryto[1] := 'US'; et_spfli = select * from :lt_spfli; ENDMETHOD.ENDCLASS.*&---------------------------------------------------------------------**& Report ztest_amdp5*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT ztest_amdp5.CLASS lcl_test_amdp DEFINITION. PUBLIC SECTION. CLASS-METHODS: run.ENDCLASS.CLASS lcl_test_amdp IMPLEMENTATION. METHOD run.* AMDP Method call TRY. IF cl_abap_dbfeatures=>use_features( requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method ) ) ) = abap_true. NEW zcl_demo_008_amdp( )->get_spfli_details( EXPORTING iv_mandt = sy-mandt IMPORTING et_spfli = DATA(lt_spfli) ). BREAK-POINT. ENDIF. CATCH cx_abap_invalid_param_value. ENDTRY. ENDMETHOD.ENDCLASS.START-OF-SELECTION. lcl_test_amdp=>run( ).

June 3, 2022 · 1 min · jiezi

关于abap:带有-sqlscript-的-AMDP-函数方法

CLASS zcl_demo_007_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES: if_amdp_marker_hdb. METHODS: get_spfli_details_dp IMPORTING VALUE(iv_mandt) TYPE mandt VALUE(iv_carrid) TYPE spfli-carrid EXPORTING VALUE(et_spfli) TYPE spfli_tab. METHODS: get_spfli_details_df IMPORTING VALUE(iv_mandt) TYPE mandt VALUE(iv_carrid) TYPE spfli-carrid RETURNING VALUE(rt_spfli) TYPE spfli_tab. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS zcl_demo_007_amdp IMPLEMENTATION. METHOD get_spfli_details_dp BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zcl_demo_007_amdp=>get_spfli_details_df. et_spfli = SELECT * FROM "ZCL_DEMO_007_AMDP=>GET_SPFLI_DETAILS_DF"( IV_MANDT => IV_MANDT, IV_CARRID => IV_CARRID ); ENDMETHOD. METHOD get_spfli_details_df BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. RETURN SELECT * FROM spfli WHERE mandt = :iv_mandt AND carrid = :iv_carrid; ENDMETHOD.ENDCLASS.*&---------------------------------------------------------------------**& Report ztest_amdp4*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT ztest_amdp4.CLASS lcl_test_amdp DEFINITION. PUBLIC SECTION. CLASS-METHODS: run.ENDCLASS.CLASS lcl_test_amdp IMPLEMENTATION. METHOD run.* AMDP Method call TRY. IF cl_abap_dbfeatures=>use_features( requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method ) ( cl_abap_dbfeatures=>amdp_table_function ) ) ) = abap_true. NEW zcl_demo_007_amdp( )->get_spfli_details_dp( EXPORTING iv_mandt = sy-mandt iv_carrid = 'AA' IMPORTING et_spfli = DATA(lt_spfli) ). BREAK-POINT. ENDIF. CATCH cx_abap_invalid_param_value. ENDTRY. ENDMETHOD.ENDCLASS.START-OF-SELECTION. lcl_test_amdp=>run( ).

June 3, 2022 · 1 min · jiezi

关于abap:更改表参数的-AMDP-过程

CLASS zcl_demo_006_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES: if_amdp_marker_hdb. METHODS: get_spfli_details_public CHANGING VALUE(ct_spfli) TYPE spfli_tab. PROTECTED SECTION. PRIVATE SECTION. METHODS: get_spfli_details_private CHANGING VALUE(ct_spfli) TYPE spfli_tab.ENDCLASS.CLASS zcl_demo_006_amdp IMPLEMENTATION. METHOD get_spfli_details_public BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zcl_demo_006_amdp=>get_spfli_details_private. CALL "ZCL_DEMO_006_AMDP=>GET_SPFLI_DETAILS_PRIVATE"( CT_SPFLI__IN__ => :CT_SPFLI, CT_SPFLI => :CT_SPFLI ); ENDMETHOD. METHOD get_spfli_details_private BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. ct_spfli = SELECT s.* FROM spfli AS s INNER JOIN :ct_spfli as i ON s.mandt = i.mandt AND s.carrid = i.carrid; ENDMETHOD.ENDCLASS.*&---------------------------------------------------------------------**& Report ztest_amdp3*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT ztest_amdp3.CLASS lcl_test_amdp DEFINITION. PUBLIC SECTION. CLASS-METHODS: run.ENDCLASS.CLASS lcl_test_amdp IMPLEMENTATION. METHOD run. DATA(lt_spfli) = VALUE spfli_tab( ( mandt = sy-mandt carrid = 'AA' ) ( mandt = sy-mandt carrid = 'AB' ) ). DATA(lt_spfli_temp) = lt_spfli.* AMDP Method call TRY. IF cl_abap_dbfeatures=>use_features( requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method ) ) ) = abap_true. NEW zcl_demo_006_amdp( )->get_spfli_details_public( CHANGING ct_spfli = lt_spfli ). BREAK-POINT. ENDIF. CATCH cx_abap_invalid_param_value. ENDTRY. ENDMETHOD.ENDCLASS.START-OF-SELECTION. lcl_test_amdp=>run( ).

June 3, 2022 · 1 min · jiezi

关于abap:带继承的AMDP过程方法

CLASS zcl_demo_003_amdp DEFINITION PUBLIC CREATE PUBLIC ABSTRACT. PUBLIC SECTION. INTERFACES: if_amdp_marker_hdb. METHODS: get_spfli_details ABSTRACT IMPORTING VALUE(iv_mandt) TYPE mandt EXPORTING VALUE(et_spfli) TYPE spfli_tab. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS zcl_demo_003_amdp IMPLEMENTATION.ENDCLASS.CLASS zcl_demo_004_amdp DEFINITION PUBLICINHERITING FROM zcl_demo_003_amdp FINAL CREATE PUBLIC . PUBLIC SECTION. METHODS: get_spfli_details REDEFINITION. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS zcl_demo_004_amdp IMPLEMENTATION. METHOD get_spfli_details BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. et_spfli = SELECT * FROM spfli WHERE mandt = :iv_mandt; ENDMETHOD.ENDCLASS.CLASS zcl_demo_005_amdp DEFINITION PUBLIC INHERITING FROM zcl_demo_003_amdp FINAL CREATE PUBLIC . PUBLIC SECTION. METHODS get_spfli_details REDEFINITION. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS zcl_demo_005_amdp IMPLEMENTATION. METHOD get_spfli_details . SELECT * FROM spfli INTO TABLE et_spfli. ENDMETHOD.ENDCLASS.*&---------------------------------------------------------------------**& Report ztest_amdp2*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT ztest_amdp2.CLASS lcl_test_amdp DEFINITION. PUBLIC SECTION. CLASS-METHODS: run.ENDCLASS.CLASS lcl_test_amdp IMPLEMENTATION. METHOD run. NEW zcl_demo_005_amdp( )->get_spfli_details( EXPORTING iv_mandt = sy-mandt IMPORTING et_spfli = DATA(lt_spfli) ).* AMDP Method call TRY. IF cl_abap_dbfeatures=>use_features( requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method ) ) ) = abap_true. NEW zcl_demo_004_amdp( )->get_spfli_details( EXPORTING iv_mandt = sy-mandt IMPORTING et_spfli = DATA(lt_spfli_amdp) ). BREAK-POINT. ENDIF. CATCH cx_abap_invalid_param_value. ENDTRY. ENDMETHOD.ENDCLASS.START-OF-SELECTION. lcl_test_amdp=>run( ).

June 3, 2022 · 1 min · jiezi

关于abap:来自另一个-AMDP-过程的所有-AMDP-过程

CLASS zcl_demo_002_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES: if_amdp_marker_hdb. METHODS: get_spfli_details_public IMPORTING VALUE(iv_mandt) TYPE mandt EXPORTING VALUE(et_spfli) TYPE spfli_tab. PROTECTED SECTION. PRIVATE SECTION. CLASS-METHODS: get_spfli_details_private IMPORTING VALUE(iv_mandt) TYPE mandt EXPORTING VALUE(et_spfli) TYPE spfli_tab.ENDCLASS.CLASS zcl_demo_002_amdp IMPLEMENTATION. METHOD get_spfli_details_public BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zcl_demo_002_amdp=>get_spfli_details_private. CALL "ZCL_DEMO_002_AMDP=>GET_SPFLI_DETAILS_PRIVATE"( iv_mandt => iv_mandt, et_spfli => et_spfli ); ENDMETHOD. METHOD get_spfli_details_private BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. et_spfli = SELECT * FROM spfli WHERE mandt = :iv_mandt; ENDMETHOD.ENDCLASS.*&---------------------------------------------------------------------**& Report ztest_amdp1*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT ztest_amdp1.CLASS lcl_test_amdp DEFINITION. PUBLIC SECTION. CLASS-METHODS: run.ENDCLASS.CLASS lcl_test_amdp IMPLEMENTATION. METHOD run.* AMDP Method call TRY. IF cl_abap_dbfeatures=>use_features( requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method ) ) ) = abap_true. NEW zcl_demo_002_amdp( )->get_spfli_details_public( EXPORTING iv_mandt = sy-mandt IMPORTING et_spfli = DATA(lt_spfli_amdp) ). BREAK-POINT. ENDIF. CATCH cx_abap_invalid_param_value. ENDTRY. ENDMETHOD.ENDCLASS.START-OF-SELECTION. lcl_test_amdp=>run( ).

June 3, 2022 · 1 min · jiezi

关于abap:使用-SQLScript-实现-AMDP-过程

CLASS zcl_demo_001_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES: if_amdp_marker_hdb. METHODS: get_spfli_details EXPORTING VALUE(et_spfli) TYPE spfli_tab. METHODS: get_spfli_details_amdp IMPORTING VALUE(iv_mandt) TYPE mandt EXPORTING VALUE(et_spfli) TYPE spfli_tab. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS zcl_demo_001_amdp IMPLEMENTATION. METHOD get_spfli_details. SELECT * FROM spfli INTO TABLE et_spfli. ENDMETHOD. METHOD get_spfli_details_amdp BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. et_spfli = SELECT * FROM spfli WHERE mandt = :iv_mandt; ENDMETHOD.ENDCLASS.REPORT ztest_amdp.CLASS lcl_test_amdp DEFINITION. PUBLIC SECTION. CLASS-METHODS: run.ENDCLASS.CLASS lcl_test_amdp IMPLEMENTATION. METHOD run.* Normal Method call NEW zcl_demo_001_amdp( )->get_spfli_details( IMPORTING et_spfli = DATA(lt_spfli) ).* AMDP Method call TRY. IF cl_abap_dbfeatures=>use_features( requested_features = VALUE #( ( cl_abap_dbfeatures=>call_amdp_method ) ) ) = abap_true. NEW zcl_demo_001_amdp( )->get_spfli_details_amdp( EXPORTING iv_mandt = sy-mandt IMPORTING et_spfli = DATA(lt_spfli_amdp) ). BREAK-POINT. ENDIF. CATCH cx_abap_invalid_param_value. ENDTRY. ENDMETHOD.ENDCLASS.START-OF-SELECTION. lcl_test_amdp=>run( ).

June 3, 2022 · 1 min · jiezi

关于abap:从程序调用-AMDP-方法和从另一个-AMDP-方法调用-AMDP-方法

CLASS zcl_flight_calc DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION.* Marker interface with SAP HANA DB as database type INTERFACES: if_amdp_marker_hdb. METHODS: update_flight IMPORTING VALUE(iv_carrid) TYPE spfli-carrid VALUE(iv_occ) TYPE sflight-seatsocc VALUE(iv_max) TYPE sflight-seatsmax. METHODS: get_flight_withdetail IMPORTING VALUE(iv_carrid) TYPE sflight-carrid EXPORTING VALUE(et_flight) TYPE flighttab. METHODS: get_flight_detail IMPORTING VALUE(iv_carrid) TYPE sflight-carrid EXPORTING VALUE(et_flight) TYPE flighttab.ENDCLASS.CLASS zcl_flight_calc IMPLEMENTATION. METHOD update_flight BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING sflight. update sflight set seatsocc = iv_occ, seatsmax = iv_max where mandt = SESSION_context ( 'CLIENT' ) and carrid = iv_carrid; ENDMETHOD. METHOD get_flight_withdetail BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING zcl_flight_calc=>get_flight_detail. CALL "ZCL_FLIGHT_CALC=>GET_FLIGHT_DETAIL"( iv_carrid => iv_carrid, et_flight => et_flight); ENDMETHOD. METHOD get_flight_detail BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING sflight.* Implementation of the procedure in a DB-specific language et_flight = SELECT * FROM sflight WHERE mandt = SESSION_CONtext ('CLIENT') and carrid = iv_carrid; ENDMETHOD.ENDCLASS.

June 3, 2022 · 1 min · jiezi

关于abap:abap-amdp的简单读与写入

CLASS zcl_flight_calc DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION.* Marker interface with SAP HANA DB as database type INTERFACES: if_amdp_marker_hdb. METHODS: get_flight_detail IMPORTING VALUE(iv_carrid) TYPE sflight-carrid EXPORTING VALUE(et_flight) TYPE flighttab. METHODS: update_flight IMPORTING VALUE(iv_carrid) TYPE spfli-carrid VALUE(iv_occ) TYPE sflight-seatsocc VALUE(iv_max) TYPE sflight-seatsmax.ENDCLASS.CLASS zcl_flight_calc IMPLEMENTATION. METHOD get_flight_detail BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING sflight.* Implementation of the procedure in a DB-specific language et_flight = SELECT * FROM sflight WHERE mandt = SESSION_CONtext ('CLIENT') and carrid = iv_carrid; ENDMETHOD. METHOD update_flight BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT USING sflight. update sflight set seatsocc = iv_occ, seatsmax = iv_max where mandt = SESSION_context ( 'CLIENT' ) and carrid = iv_carrid; ENDMETHOD.ENDCLASS.

June 3, 2022 · 1 min · jiezi

关于abap:ABAP两分钟搞定一个基于cds的odata服务

第一步撸一个cds @AbapCatalog.sqlViewName: 'ZSFLIGHTVIEW'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #NOT_REQUIRED@EndUserText.label: 'FLIGHT CDS VIEW'@VDM.viewType: #BASIC@OData.publish: truedefine view ZFLIGHT_VIEW as select from sflight{ key sflight.carrid as Airlinecode, key sflight.connid as ConnectionNumber, key sflight.fldate as FlightDate, sflight.price as Airfare, sflight.currency as FareCurrency, sflight.planetype as PlaneCategory, sflight.seatsmax as MaxAvailableSeats, sflight.seatsocc as OccupiedSeats}接下来去造服务。 记得加本人公司的服务器地址和端口号sap/opu/odata/sap/ZFLIGHT_VIEW_CDS/ZFLIGHT_VIEW 显示成果

June 2, 2022 · 1 min · jiezi

关于abap:做一个比较简单的cds串联amdp

step onestep twostep three code1CLASS zcl_demo_flight_calculation DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES: if_amdp_marker_hdb. CLASS-METHODS: get_details FOR TABLE FUNCTION ZDEMO_FLIGHT_CDS_TF. PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.CLASS ZCL_DEMO_FLIGHT_CALCULATION IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+* | Static Public Method ZCL_DEMO_FLIGHT_CALCULATION=>GET_DETAILS* +-------------------------------------------------------------------------------------------------+* +--------------------------------------------------------------------------------------</SIGNATURE> METHOD get_details BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING spfli. RETURN SELECT mandt, carrid, connid, countryfr, cityfrom, airpfrom, countryto, cityto, airpto FROM spfli WHERE carrid = iv_carrid;ENDMETHOD.ENDCLASS.code1code 2define table function zdemo_flight_cds_tfwith parameters iv_carrid : s_carr_idreturns { mandt: s_mandt; carrid: s_carr_id; connid: s_conn_id; countryfr: land1; cityfrom: s_from_cit; airpfrom: s_fromairp; countryto: land1; cityto: s_to_city; airpto: s_toairp;}implemented by method zcl_demo_flight_calculation=>get_details;code 2code 3*&---------------------------------------------------------------------**& Report zcds_with_if_amdp*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zcds_with_if_amdp.SELECT * FROM zdemo_flight_cds_tf( iv_carrid = 'LH' ) INTO TABLE @DATA(lt_flight) ##db_feature_mode[amdp_table_function].cl_demo_output=>display_data( EXPORTING value = lt_flight ).code 3

June 2, 2022 · 1 min · jiezi

关于abap:使用-ABAP-事物码-SM59-创建-Destination-来读取外网的数据试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容用 ABAP 新建本地 Excel 文件并写入数据26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据ABAP 如何解析 JSON 数据如何从本地文件里拷贝某个 ABAP 类到 SAP 零碎面向对象的 ABAP 编程初探 - 什么是类,实例,和 Public 办法SAP ABAP 报表的用户输出性能应用 ABAP 事物码 SM59 创立 Destination 来读取外网的数据ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理本教程之前的文章26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据,咱们介绍了如何应用 ABAP 函数 HTTP_GET, 下载百度网站首页的 HTML 格局的数据到本地。 ...

May 12, 2022 · 1 min · jiezi

关于abap:SAP-GUI-一些实用技巧分享

SAP GUI 是 SAP 的通用客户端,用于拜访 SAP 应用程序中提供的开发和业务性能,例如 SAP ERP、SAP Business Suite(SAP CRM、SAP SCM 和 SAP PLM)、SAP Business Intelligence 等。 SAP GUI 既是 SAP 利用的开发环境,也是运行环境。它从 SAP 服务器获取信息,例如在其窗口中须要显示的信息,在何时,何处,以及以什么样的形式来显示。 本文给大家分享笔者应用 SAP GUI 进行开发这些年来,积攒的一些实用技巧。 应用 SAP GUI 绘制图形国内 80 后上的编程课应该都学过Logo这门编程语言: Logo 语言是一门专门设计用来进行编程教学的语言,于 1967 年由 Wally Feurzeig, Seymour Papert和Cynthia Solomon创造。 下图是用 Logo 语言画进去的图案。 同样,在 SAP GUI 里内发现有一个十分古老的 ABAP 包,最初一次批改曾经是 22 年前的 1995 年了。这比 SAP 成都研究院很多新共事的年龄都要大。 这个包提供了一个 HPGL 接口。Hewlett-Packard Graphics Language,简称为 HPGL,是一种打印机管制语言,由Hewlett-Packard设计。 上面是我用 ABAP 代码写的一个 HPGL 控制台,能够调用函数 GRAPH_HPGL,像小时候应用Logo 语言那样在屏幕上作图。 ...

May 11, 2022 · 3 min · jiezi

关于abap:ABAP-Workarea工作区-VS-Field-Symbols占位符-性能对比分析

在SAP开发我的项目,这两个概念开发人员根本都晓得。然而没有去比照其性能区别。首先,咱们遍及一下原理。Workarea: 相当于在内存堆栈外面开拓了一块内存。Field Symbols:相当于存了内存的地址。所以实际上是不占用内存的。相当于C语言的曾经被解除援用的指针。所以咱们进行一项性能测试:1.比照单纯Loop的性能,不进行数据批改。 REPORT zloop_performance_test.DATA : v_start_time TYPE timestampl, v_end_time TYPE timestampl, v_diff_w TYPE p DECIMALS 5.TYPES : BEGIN OF ty_vbrp, vbeln TYPE vbrp-vbeln, END OF ty_vbrp.DATA : lt_vbrp TYPE STANDARD TABLE OF ty_vbrp, ls_vbrp TYPE ty_vbrp.FIELD-SYMBOLS : <fs_vbrp> TYPE ty_vbrp.PARAMETERS p_count TYPE n LENGTH 6.* Start of selectionSTART-OF-SELECTION.* Get billing item data SELECT vbeln FROM vbap INTO TABLE lt_vbrp UP TO p_count ROWS.END-OF-SELECTION.* 1 . Loop with work area GET TIME STAMP FIELD v_start_time. LOOP AT lt_vbrp INTO ls_vbrp. ENDLOOP. GET TIME STAMP FIELD v_end_time. v_diff_w = v_end_time - v_start_time. WRITE :/(30) 'Loop with Work area', v_diff_w. CLEAR : v_start_time, v_end_time, v_end_time.* 2 . Loop with work area inline declaration GET TIME STAMP FIELD v_start_time. LOOP AT lt_vbrp INTO DATA(ls_vbrp_inline). ENDLOOP. GET TIME STAMP FIELD v_end_time. v_diff_w = v_end_time - v_start_time. WRITE:/(30) 'Loop with Inline Work area', v_diff_w. CLEAR : v_start_time, v_end_time, v_end_time.* 3 . Loop with Field symbol GET TIME STAMP FIELD v_start_time. LOOP AT lt_vbrp ASSIGNING <fs_vbrp>. ENDLOOP. GET TIME STAMP FIELD v_end_time. v_diff_w = v_end_time - v_start_time. WRITE:/(30) 'Loop with Field Symbol', v_diff_w. CLEAR : v_start_time, v_end_time, v_end_time.* 4 . Loop with Field symbol inline declaration GET TIME STAMP FIELD v_start_time. LOOP AT lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp_inline>). ENDLOOP. GET TIME STAMP FIELD v_end_time. v_diff_w = v_end_time - v_start_time. WRITE:/(30) 'Loop with Inline Field Symbol', v_diff_w. CLEAR : v_start_time, v_end_time, v_end_time. ...

May 9, 2022 · 3 min · jiezi

关于abap:2460020-BAPI-BAPICOSTCENTERCHANGEMULTIPLE

老本核心更改的时候坑有点大 不停的钻研终于发现了新大陆 SymptomYou want to use BAPI_COSTCENTER_CHANGEMULTIPLE to change "lock indicator" for cost center, you find that the locked indicator cannot be unlocked. EnvironmentFinancial Accounting (FI)SAP R/3SAP R/3 Enterprise 4.7SAP ERP Central ComponentSAP ERPSAP enhancement package for SAP ERPSAP enhancement package for SAP ERP, version for SAP HANAReproducing the IssueIn SE37 input BAPI BAPI_COSTCENTER_CHANGEMULTIPLE and input "blank" as value for unlock as below:blank value.JPGAfter run BAPI BAPI_COSTCENTER_CHANGEMULTIPLE, you find the lock indicators aren't changed. ...

May 7, 2022 · 1 min · jiezi

关于abap:eclipse-abap-快捷键操作-持续更新

快捷键 操作。如果是window 电脑 记得把command 变成ctrl 上面举例子是mac电脑 凝视代码command + shift + < 凝视代码command + shift + > 反凝视代码 切换大小写command + shift + Y 把选中的代码变成小写command + shift + X 把选中的代码变成大写 转到行号 command + L 疾速关上概览 command + O (字母 O 不是数字) shift + f1 格局优化代码缩进 command + F1 查看代码command + f3 激活所有代码 command + shift + g 查问 where user list 关上sap gui command + 6 搜寻 ctrl + H

April 24, 2022 · 1 min · jiezi

关于abap:ABAP-eclipse-如何免密码登陆sap

第一步:第二步而后装置 而后肯定要从新建abap project 我的项目而后就能够记住明码了

April 24, 2022 · 1 min · jiezi

关于abap:ABAP-如何解析-JSON-数据试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容用 ABAP 新建本地 Excel 文件并写入数据26 行 ABAP 代码应用 HTTP_GET 函数下载百度网站的首页数据ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理JSON 数据是一种罕用的 SAP 零碎和第三方零碎交互时应用的数据传输格局,因而应用 ABAP 解析 JSON 格局的数据就成为了开发中的一种常见需要。 ...

April 19, 2022 · 1 min · jiezi

关于abap:Continuous-Integration-对-ABAP-技术栈来说意味着什么

咱们首先回顾 Martin Fowler 在 2000 年对于继续集成的定义:继续集成是一种软件开发实际,其中(……)每个开发人员至多每天都在进行集成。 想想咱们的 ABAP 开发,咱们不是在每次激活对象时,都把批改主动集成到 ABAP 中吗? 上面咱们来看看如果 ABAP 须要做到继续集成,须要解决哪些技术挑战: 保护一个繁多的源存储库并非所有 ABAP 开发对象都是版本化和可传输的。测试的后果通常取决于非版本化、不可传输的配置数据。因为仅从源代码复制设置十分艰难,所以 ABAP 零碎通常被视为物化分支(materialized branch)——这是一种十分低廉的版本治理形式,因为只有代码线处于保护状态,咱们就须要让它们放弃活动状态。 这也意味着,咱们不能将 ABAP 基础架构作为代码进行治理。实际上,将基础架构作为代码进行治理(infrastructure as code),恰好是操作云零碎的最佳实际。 自动化构建ABAP 开发对象在激活它们时会主动编译。动态检查和测试等其余构建方面要么必须手动触发,要么能够集成到传输的公布中。这些配置产生在幕后,通常对于一般开发人员来说依然是一个黑盒子。 让构建反对自我测试性能每个人每天都将代码提交到 mainline 即主线上。如果咱们将 ABAP DEV 即开发零碎视为主线,那么这就是惯例的 ABAP 开发流程。如果组件开发散布在多个零碎中,则 TEST/CONS 将是主线,即咱们必须每天 release ABAP Transport Request 到该主线。尽管一些我的项目曾经以这种形式运作,但支流的做法依然是让大型 Transport Request 停留在开发零碎一周或更长时间。 每个提交都应该在集成机器上构建主线如果咱们将 ABAP 主线构建 的规范,视为没有语法错误的激活,那么这里没有问题。然而如果将 TEST/CONS 视为主线,并且 build 应该包含动态代码检查和组件的所有相干测试,那么需另当别论。 立刻修复损坏的构建开发零碎中的语法错误通常没有问题。然而,如果咱们还将 package error、ATC 违规和单元测试谬误视为损坏的构建,针对这种谬误一种态度是偏向于疏忽,直到我的项目截止日期邻近甚至更久。这不仅减少了微小的技术债权,使交付面临危险,而且还使体现良好的开发人员难以验证他们的开发增量是否无心中减少了利用出错的可能性。 放弃疾速构建极限编程 (XP) 实际之一要求在 10 分钟内实现构建(包含测试)。在许多 ABAP 我的项目中,因为不足洁净、分层的包接口的组件化,通常无奈在此工夫范畴内测试更改的影响,因为很难确定正确的受影响测试集。如果咱们有相似 ABAP 中的测试影响剖析之类的货色来仅执行那些更改生产代码可能会产生影响的测试,那将大大提高 ABAP 构建和测试的效率。 ...

April 15, 2022 · 1 min · jiezi

关于abap:在-ABAP-技术栈里实施-Continuous-Integration-的一些挑战

继续集成(Continuous Integration)是一个术语,对于向开发人员提供每次更改的反馈,反馈必须牢靠并及时提供。 无论何时保留开发、提交或其余任何货色,都可能产生更改,这齐全取决于开发环境。开发人员须要这些信息来确定是否能够将更改推送给更宽泛的受众,比方将利用交付给 Quality Engineer 进行更高维度的测试。 同样,如何将开发部署到 CI 零碎也是一个部署主题。 能够应用 ABAP 经典传输零碎设置以下场景。 CI pipeline 可能蕴含下列元素: Code Inspector / ATCCoverage resultsUnit testsIntegration testseCATTUI testsPerformance testsMetrics最根底的传输场景让咱们采纳开发、测试和生产的通用设置。 开发人员在开发零碎中进行开发,测试零碎用于手动测试。 假如:所有组织都须要进行手动探索性测试,即便所有测试都是自动化的,QAS 零碎也不能报废。 对于开发人员所做的每项更改,更改都会部署到 QAS 并运行 CI。 报告后果后,更改将复原。 对于 ABAP 零碎,很难对对象进行适当的回滚。 单元和集成测试可能会更改零碎中的数据(它们不应该),因而须要残缺的数据库回滚能力取得齐全牢靠的后果。 这意味着零碎不能同时用于手动测试,因为开发人员所做的每一次更改都会更改零碎。 或者,为 CI 调配特定的时隙,为手动测试调配其余一些时隙。 总而言之,这最终以突破 QAS 零碎的自动化过程完结,而不是通过自动化来防止谬误。 因而,为了不烦扰 QAS 零碎中的手动测试,CI 运行能够挪动到不同的服务器。 CI在CIS零碎中运行,在QAS中进行手动测试, 要在 ABAP 里施行 CI 不是一件容易的事件,须要在老本、可靠性、速度、复杂性等方面做出理智的抉择。它们对开发过程和基础设施有很大的影响。 齐全反对继续集成不仅仅是让 pipeline 取得一些后果,这情理就像简略地将代码放入 git 进行托管远远不意味着就等于 devops. ABAP 容器化是齐全反对 CI 所必须的,没有它就不可能齐全反对继续集成。

April 15, 2022 · 1 min · jiezi

关于abap:用-ABAP-新建本地-Excel-文件并写入数据试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理在 SAP 报表开发行业中,用 ABAP 操作 Excel 是另一个比拟常见的需要。 ...

April 3, 2022 · 1 min · jiezi

关于abap:用-ABAP-读取本地文本文件内容试读版

零根底 ABAP 学习教程系列文章的目录ABAP 规范培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍ABAP 规范培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别ABAP 规范培训教程 BC400 学习笔记之三:ABAP 编程语言的个性和根本形成因素ABAP 规范培训教程 BC400 学习笔记之四:ABAP 编程语言的数据类型ABAP 规范培训教程 BC400 学习笔记之五:ABAP 编程语言的变量,常量和字面量,以及文本符号ABAP 基础知识通过理论的例子,介绍 SAP ABAP 里的 Repository Information System 的应用技巧ABAP function module 的应用ABAP subroutine 的定义和应用ABAP 中的变量和常量ABAP 编程语言中的零碎字段(System Fields)什么是 ABAP Field SymbolABAP 援用类型介绍最浅显易懂的 SAPGUI 里 ABAP 调试器的应用办法介绍如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (上)如何创立最简略的 ABAP 数据库表,以及编码从数据库表中读取数据 (下)用 ABAP 读取本地文本文件内容ALV 开发专题27 行代码开发一个最简略的 SAP ALV 报表48 行代码给 ABAP ALV 报表的数据行削减色彩成果77 行代码实现ABAP ALV 中的双击事件处理用 ABAP 读取本地文件文本内容是一个常见的需要。假如我有一个文本文件,内容如下: ...

April 3, 2022 · 1 min · jiezi

关于abap:MapReduce-思想在-ABAP-编程中的一个实际应用案例

ABAP 是一门企业级利用编程语言,其 740 版本于 2013 年公布,削减了许多新的语法和关键字: 其中一个亮点就是新引入的 REDUCE 关键字。这个关键字的作用和在大规模数据集并行计算畛域里宽泛应用的 Map-Reduce 编程模型中的 Reduce 操作相似,能够依照字面意思了解为归约 。 什么是 Map-Reduce 思维?Map-Reduce 是一种编程模型和相干实现,用于在集群上应用并行分布式算法,生成和解决大规模数据集。 一个 Map-Reduce 程序由一个 Map 过程和一个 Reduce 办法组成。Map 过程负责执行过滤和排序,例如将学生按名字排序到队列中,每个名称由一个队列保护。 Reduce 办法负责执行汇总操作,例如计算学生的数量。Map-Reduce 零碎通过编排分布式服务器,来并行运行各种工作,管理系统各个局部之间的所有通信和数据传输,以及提供数据冗余,实现容错机制。 下图是 Map Reduce 框架的工作步骤,统计一个海量输出数据集(比方大于 1TB )中的单词呈现次数。工作步骤蕴含 Splitting, Mapping, Shuffling, Reducing 以失去最初的输入后果。 Map-Reduce 编程模型曾经宽泛使用于大数据处理畛域的工具和框架,比方 Hadoop 之中。 Map-Reduce 在 CRM 零碎中的一个理论利用咱们来看一个笔者工作中的理论工作。我须要在某个 CRM 测试零碎上做个统计,列出在数据库表 CRM_JSTO 里,OBTYP(Object Type) 和 STSMA(Status Schema) 这两列领有雷同值的内表行的个数。大家能够把 OBTYP 和 STSMA 两列具备雷同值的内表行 这个形容,类比成上图中反复呈现的单词。 下图是零碎中数据库表 CRM_JSTO 的局部行: 下图是笔者最终实现的统计后果: ...

March 18, 2022 · 3 min · jiezi

关于abap:ABAP-调用第三方-API遇到乱码该怎么办

这是 Jerry 2022 年第二篇原创文章,也是本公众号第 370 篇原创文章。 之前有一个敌人在知乎上向我征询过这个问题,我觉得很有代表性,所以专门用一篇文章来讲述一些相干知识点。 先看这位敌人遇到的具体问题。 用 Postman 调用第三方接口,外面的中文字符可能失常显示。 然而当用 ABAP 的 HTTP 工具类 CL_HTTP_CLIENT 的 response->get_data( ) 读取响应之后,发现外面的中文字符,例如 "拜访胜利" 是乱码: 首先明确一点,既然 Postman 能正确显示响应数据中的中文内容,阐明 API provider 是不存在问题的,这个乱码问题呈现在接管方,即 ABAP 代码的编程实现须要调整。 咱们只有弄清楚呈现乱码的起因,就能对症下药进行修复了。 上个世纪 60 年代,美国制订了一套字符编码,定义了英文字符与二进制位之间的一一映射关系,称为 ASCII 码。将一个符号的图形显示,关联到其二进制存储位的这种行为,就称之为字符编码。ASCII 就是一种最简略的字符集和字符编码方式。 一个字节有 8 位,2 的 8 次方为 256,因而 1 个字节只能示意 256 种符号,而汉字的总数超过了 10 万个,显然无奈用 1 个字节来存储。 除了大家相熟的英文字符和汉字外,还有很多历史更悠久的文字,比方埃及象形文字: 以及周杰伦《爱在西元前》里提到的楔形文字: 有没有这样一种计算机编码方式,可能将这些稀奇古怪的符号都纳入其中呢?有,这就是 Unicode,正如其命名暗示的,Unicode 将世界各种语言的每个字符都调配了一个惟一的编码,以满足跨语言、跨平台的文本信息转换。 咱们依据 Unicode 编码表,就能查到一个字符对应的 Unicode 编码,比方汉字 "汪"对应的 Unicode 编码为 00006C6A. ...

February 14, 2022 · 2 min · jiezi

关于abap:如何从-ABAP-调试器里提取某个内表的内容用于单元测试

假如我想把内表 gt_tstct 里的所有记录,全副提取进去,用于 ABAP 单元测试里: 咱们能够应用 SAP S/4HANA 里自带的 debugger script,把内表的数据以文本的模式提取进去。 点击 Script 面板:Load Script: 抉择规范的 script:RSTPDA_SCRIPT_VALUE_POUND: 点击 start script : IMPORT tabname TO gv_tabname FROM MEMORY ID sy-repid.以后选中的内表的表名会存储到 ABAP 变量 gv_tabname 中。点击 start script: 弹出这个窗口: 当初就能够 ctrl C 来复制粘贴了: gt_tstct = VALUE #(( SPRSL = 'E' TCODE = '/CEERE/19000326' TTEXT = 'IMG activity: /CEERE/MTPZDR' )( SPRSL = 'E' TCODE = '/CEERE/19000327' TTEXT = 'IMG activity: /CEERE/MMAPL' )).更多Jerry的原创文章,尽在:"汪子熙": ...

January 12, 2022 · 1 min · jiezi

关于abap:对于-basis-管理员来说ABAP-Platform-意味着什么

依据 note 2620910 - SAP S/4HANA 1511, 1610, 1709, 1809 and SAP BW/4HANA 1.0, 2.0: Recommended and released Application Server Platforms: 从内核 773(ABAP 平台 1809 + HANA 2.0)开始,ABAP Platform 删除了对某些操作系统的反对。 这些放弃反对的操作系统列表: 依据客户的反馈,咱们看到大多数客户抉择 Linux x86_64 作为他们运行 SAP 零碎的首选平台,只管 Windows 和 AIX 依然受反对并且是齐全无效的选项。 革除过期的 SAP Profile 参数如果您作为 SAP 根底管理员工作了一段时间,您可能晓得 SAP 一直地引入、更改或删除配置文件参数。因为各种 SAP 产品和版本应用雷同的 SAP 内核,因而参数中的这些频繁更改必须尽可能兼容,以防止产生不心愿的附带影响。 然而 SAP ABAP Platform 1809/Kernel 7.7x 不同,它突破了与旧内核和 SAP Netweaver 版本的向下兼容性。这是 SAP 清理所有这些已存在多年的历史和过期参数的绝佳机会。 有 2 个次要区域已被清理和/或优化: ...

December 19, 2021 · 2 min · jiezi

关于abap:ABAP-Netweaver-和-ABAP-Platform-这两个名词的辨析

本文简述 SAP Netweaver 平台的演变。 SAP kernel 是任何基于 ABAP 技术栈的 SAP 零碎的外围组件。它由在服务器上运行以解决与零碎的连贯并执行 SAP 程序的可执行文件组成。 SAP 内核的开发始于 1988 年,只管 SAP R/3 于 1992 年正式推出。SAP kernel 已成为过来 30 年来简直所有基于 ABAP 技术栈的 SAP 产品的根底,比方 SAP Business Suite. 多年来,内核和根底层一直倒退。增加对更多数据库和操作系统的反对,同时增加更多功能。 2002 年,随着 SAP R/3 4.7 和 SAP Web Application Server 的退出,第一个重要的变动实现了。这是 .COM 时代,SAP 内核通过 Internet 通信管理器 (ICM) 和 Internet 事务服务器 (ITS) 进行了扩大,以便可能治理 HTTP 连贯并提供对 XML、BSP 和 JAVA 的反对。 SAP NetWeaver 于 2004 年作为技术堆栈公布,容许组织应用通用技术平台将来自各种起源的数据、业务流程、元素等集成到对立的 SAP 环境中。在过来的 16 年中,SAP NetWeaver 始终是 SAP 应用程序的技术根底。 ...

December 13, 2021 · 3 min · jiezi

关于abap:什么是-SAP-Support-Package-Stack

什么是 Support Package?当 SAP 的最终用户发现 SAP 产品中的谬误时,他会向 SAP 反对人员报告同样的问题。 SAP 程序员查看谬误并开发谬误更正。 此更正称为 SNOTE (SAP Note)。随着工夫的推移,多个最终用户报告 SAP 公布 SNOTE 的谬误。 SAP 在一个中央收集所有这些更正,这个汇合称为反对包。 此反对包还包含对晚期 SAP 版本的加强。 简略来说,SAP NOTES 的汇合被称为 SUPPORT PACKAGE。反对包在 SAP 零碎中应用事务码 SPAM(反对包管理器)施行。 什么是 Support Package Stack?反对包堆栈是 SAP NetWeaver 中蕴含的所有软件组件 (SC) 的 ABAP 和 Java 反对包列表。 它用于将 SAP NetWeaver 的每个软件组件带到定义的反对包 (SP) 级别。 反对包堆栈,通常称为堆栈捆绑所有必须的组件或曾经一起测试的单个补丁,并倡议作为 SPS 利用而不是单个补丁(直到并且除非您遇到一些须要修补某些组件的问题)。 转到 https://service.sap.com/sp-st...,抉择您的 NW 版本以查看以后的 SPS 级别和其余详细信息。 What are Support Pack Stack version numbers?反对包堆栈有一个版本号和一个堆栈号,例如,SAP NetWeaver '04 Support Package Stack 11。 ...

November 17, 2021 · 1 min · jiezi

关于abap:ABAP-代码中哪些特殊字符不能用于变量命名

下列 ABAP 代码,哪些行会引起编译谬误? REPORT z.TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.DATA(lt*) = VALUE t_itab( ( 10 ) ( 20 ) ( 30 ) ).DATA(lt!) = VALUE t_itab( ( 10 ) ( 20 ) ( 30 ) ).DATA(lt$) = VALUE t_itab( ( 10 ) ( 20 ) ( 30 ) ).DATA(lt_) = VALUE t_itab( ( 10 ) ( 20 ) ( 30 ) ).DATA(lt) = VALUE t_itab( ( 10 ) ( 20 ) ( 30 ) ).BREAK-POINT.答案是第7行和第13行。 ...

October 18, 2021 · 1 min · jiezi

关于abap:介绍一个使用-clabapcorresponding-进行两个内表不同名称字段赋值的快捷方法

假如咱们有两个 ABAP 内表,每个内表别离蕴含 a, b 和 a', b' 字段。 咱们心愿把内表1 的 a 和 b 字段,别离赋给内表2 的 a' 和 b' 字段。因为字段名称不雷同,所以无奈应用 MOVE-CORRESPONDING. 传统的做法,是写一个 LOOP,在循环体内,手动把表1每一行的字段a,赋给表2每一行的字段a': 其实有一种更简略高效的办法。 应用 cl_abap_corresponding,创立一个映射表,这个映射表,指定如下规定: 将内表的字段值 focus_language ,赋给另一个内表的 focus_area 字段。将内表的字段值 salary,赋给另一个内表的 salary_plus_bonous. create 办法传入这个映射表,返回一个执行器。调用该执行器的 execute 办法,指定须要进行字段赋值的源内表和指标内表,赋值操作就主动实现了,无需开发人员手动应用 LOOP 赋值。 Execute 办法是在 ABAP 内核中实现的,比在 ABAP 利用中应用 LOOP 要高效。 对于该类的更多细节,请参考我的文章:介绍一种在ABAP内核态进行内表高效拷贝的办法,和对应的Java和JavaScript版本的伪实现) 更多Jerry的原创文章,尽在:"汪子熙":

October 18, 2021 · 1 min · jiezi

关于abap:如何找到某个-ABAP-structure-某字段的源头来自哪个数据库表

我的微信群里有敌人发问: 如何找到某个 ABAP structure 里的某个字段,运行时的值是从哪个数据库表的字段里写入的? 以 ABAP structure BAPIAD1VL 为例,假如咱们须要查找 字段 DISTRCT_NO 的起源。 其实没有什么太好太准确的方法。我这里提供一种方法。 选中 DISTRCT_NO, 点击 SE11 工具栏的 Where used list 图标: 有4条后果,一条一条人工查看。如果后果数很多,这种办法就很低效了。 第三条记录里,发现是 ADDR1_VAL 构造的 CITYP_CODE 字段,写入了咱们要查找的指标构造 BAPIAD1VL-DISTRCT_NO 字段。 这个 ADDR1_VAL 依然是一个 ABAP 构造,所以咱们这里有两种抉择。 一是咱们的指标,转而划归为查找构造 ADDR1_VAL 的字段 CITYP_CODE 来自何方。能够递归地用 SE11 的 where used list,查找字段 CITYP_CODE, 直至搜寻后果里,发现真正的数据库表才完结摸索。 第二种抉择是,应用 SE80 的 Repository information system. 关上 SE80, 右边开展 Fields->Table Fields, 左边输出 CITYP_CODE: 在搜寻后果里,发现 ADRCITYPRT 和 ADRSTREET 这两张表的 CITYP_CODE 字段最有可能是咱们要查找的字段。 ...

October 17, 2021 · 1 min · jiezi

关于abap:基于-abapGit-和-abaplint-的-ABAP-持续集成的一个例子

这是 Jerry 2021 年的第 61 篇文章,也是汪子熙公众号总共第 338 篇原创文章。 短歌行曹操 对酒当歌,人生几何! 譬如朝露,去日苦多。 慨当以慷,忧思难忘。 何以解忧?唯有杜康。 青青子衿,悠悠我心。 但为君故,沉吟至今。 呦呦鹿鸣,食野之苹。 我有嘉宾,鼓瑟吹笙。 明明如月,何时可掇? 忧从中来,不可断绝。 越陌度阡,枉用相存。 契阔谈讌,心念旧恩。 月明星稀,乌鹊南飞。 绕树三匝,何枝可依? 山不厌高,海不厌深。 周公吐哺,天下归心。 Jerry 之前写过一篇文章,应用 abapGit 在 ABAP On-Premises 零碎和 SAP 云平台 ABAP 环境之间进行代码传输,介绍了 abapGit 这个开源工具的根本用法。 本文 Jerry 介绍基于 abapGit 和另一个开源工具,abaplint,实现 ABAP 继续集成的一个具体场景:当有新的代码提交到 ABAP 代码仓库时,主动触发 ABAP 代码检测。 当然,继续集成指的是,只有有新的代码提交,就主动运行构建和测试,反馈运行后果。仅当能确保新提交的代码合乎预期,再将新代码集成到骨干。因而本文介绍的例子,只是 ABAP 继续集成中的一个小步骤而已。 咱们首先来简略理解一下 abaplint.应用 SAP UI5 开发的敌人们,想必都接触过 ESLint,一款 JavaScript 代码检测工具。 Jerry 每天用 Angular 开发 SAP Commerce Cloud UI,也借助了 Visual Studio Code 名为 TSLint 的扩大,来对 TypeScript 代码进行检测。 ...

September 15, 2021 · 2 min · jiezi

关于abap:sap-macos-adt-全流程介绍

第一步下载jdk,http://worker.cob.csuchico.ed... 第二步如何弄java 环境变量https://www.jianshu.com/p/a85... 第三步java装置adt 关上 help 中文叫帮忙 找到英文装置软件 在work with 外面输出这个SAP Development Tools for Eclipse 2021-06 - https://tools.hana.ondemand.c... 依照步骤下载实现 就能够了

August 28, 2021 · 1 min · jiezi

关于abap:abap-json-添加转义-去除转义代码

REPORT ztest_xiaoyong_json.DATA: ld_cv_string TYPE string, lv_out TYPE string.ld_cv_string = '{\"model\":{\"PARTNER\":\"ACC202106070002\",\"ZZCRMNO\":\"ACC202106070002\",\"ZZCRSGT\":\"A\",\"ZZCDTFLG\":false,\"ZZCREDT2\":\"A\",\"ZZLMIT2\":\"2000.00\",\"ZCURRENCY\":\"CNY\",\"ZZFRMDAT2\":\"20210101\",\"ZZTODAT2\":\"20220101\"}}'.*如果加\ 间接应用上面代码* REPLACE ALL OCCURRENCES OF `\` IN ld_cv_string WITH `\\`.* REPLACE ALL OCCURRENCES OF `"` IN ld_cv_string WITH `\"`.*如果去掉本义 应用上面代码REPLACE ALL OCCURRENCES OF `\"` IN ld_cv_string WITH `"` .REPLACE ALL OCCURRENCES OF `\\` IN ld_cv_string WITH `\`.IF sy-subrc = 0.ENDIF.

August 25, 2021 · 1 min · jiezi

关于abap:SAP-HR关于双信息类型写入

参考上面代码: * 0021 55555555555555555555555555555BEGIN XIAOYONG 20200429 双信息类型 0021 0528 测试通过 IF is_input-it_p0021[] IS NOT INITIAL. CLEAR:lt_p0021[],lt_newp0021[], lt_fields[]. SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_p0021 FROM pa0021 FOR ALL ENTRIES IN is_input-it_p0021 WHERE pernr = is_input-it_p0021-pernr AND subty = is_input-it_p0021-subty AND begda <= sy-datum AND endda >= sy-datum. SORT lt_p0021 BY pernr subty. CLEAR:lt_p0528[]. SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_p0528 FROM pa0528 FOR ALL ENTRIES IN is_input-it_p0021 WHERE pernr = is_input-it_p0021-pernr AND subty = is_input-it_p0021-subty AND begda <= sy-datum AND endda >= sy-datum. SORT lt_p0528 BY pernr subty. LOOP AT is_input-it_p0021 ASSIGNING FIELD-SYMBOL(<fs_0021>). IF <fs_0021>-begda IS INITIAL. <fs_0021>-begda = sy-datum. ENDIF. IF <fs_0021>-endda IS INITIAL. <fs_0021>-endda = '99991231'. ENDIF. CLEAR:lt_newp0021[]. lo_descr ?= cl_abap_typedescr=>describe_by_data( ls_p0021 ). lt_fields = lo_descr->get_ddic_field_list( p_langu = '1' p_including_substructres = abap_true ). READ TABLE lt_p0021 ASSIGNING FIELD-SYMBOL(<wa_0021>) WITH KEY pernr = <fs_0021>-pernr subty = <fs_0021>-subty BINARY SEARCH. IF sy-subrc = 0. LOOP AT lt_fields ASSIGNING <fs_fields>. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_0021> TO <fs>. IF sy-subrc = 0 AND <fs> IS NOT INITIAL. IF <fs1> IS ASSIGNED . UNASSIGN <fs1>. ENDIF. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <wa_0021> TO <fs1>. IF sy-subrc = 0. <fs1> = <fs>. ENDIF. ENDIF. ENDLOOP. APPEND <wa_0021> TO lt_newp0021. ELSE. APPEND INITIAL LINE TO lt_newp0021 ASSIGNING <wa_0021>. LOOP AT lt_fields ASSIGNING <fs_fields>. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_0021> TO <fs>. IF sy-subrc = 0 AND <fs> IS NOT INITIAL. IF <fs1> IS ASSIGNED . UNASSIGN <fs1>. ENDIF. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <wa_0021> TO <fs1>. IF sy-subrc = 0. <fs1> = <fs>. ENDIF. ENDIF. ENDLOOP. ENDIF. CLEAR:lt_fields[]. lo_descr ?= cl_abap_typedescr=>describe_by_data( ls_p0528 ). lt_fields = lo_descr->get_ddic_field_list( p_langu = '1' p_including_substructres = abap_true ). CLEAR:lt_newp0528[]. READ TABLE lt_p0528 ASSIGNING FIELD-SYMBOL(<wa_0528>) WITH KEY pernr = <fs_0021>-pernr subty = <fs_0021>-subty BINARY SEARCH. IF sy-subrc = 0. LOOP AT lt_fields ASSIGNING <fs_fields>. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_0021> TO <fs>. IF sy-subrc = 0 AND <fs> IS NOT INITIAL. IF <fs1> IS ASSIGNED . UNASSIGN <fs1>. ENDIF. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <wa_0528> TO <fs1>. IF sy-subrc = 0. <fs1> = <fs>. ENDIF. ENDIF. ENDLOOP. ASSIGN COMPONENT 'INFTY' OF STRUCTURE <wa_0528> TO <fs>. IF sy-subrc = 0. <fs> = '0528'. ENDIF. ASSIGN COMPONENT 'LAND1' OF STRUCTURE <wa_0528> TO <fs>. IF sy-subrc = 0. <fs> = 'CN'. ENDIF. APPEND <wa_0528> TO lt_newp0528. ELSE. APPEND INITIAL LINE TO lt_newp0528 ASSIGNING <wa_0528>. LOOP AT lt_fields ASSIGNING <fs_fields>. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_0021> TO <fs>. IF sy-subrc = 0 AND <fs> IS NOT INITIAL. IF <fs1> IS ASSIGNED . UNASSIGN <fs1>. ENDIF. ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <wa_0528> TO <fs1>. IF sy-subrc = 0. <fs1> = <fs>. ENDIF. ENDIF. ENDLOOP. ASSIGN COMPONENT 'INFTY' OF STRUCTURE <wa_0528> TO <fs>. IF sy-subrc = 0. <fs> = '0528'. ENDIF. ASSIGN COMPONENT 'LAND1' OF STRUCTURE <wa_0528> TO <fs>. IF sy-subrc = 0. <fs> = 'CN'. ENDIF. ENDIF. CLEAR:ls_pskey. MOVE-CORRESPONDING <wa_0021> TO ls_pskey. PERFORM frm_lock_per_data USING ls_pskey-pernr 'X' CHANGING es_output-message. IF es_output-message-msgtx = 'E'. EXIT. ENDIF. CALL FUNCTION 'HR_INFOTYPE_OPERATION' EXPORTING infty = '0021' number = ls_pskey-pernr subtype = ls_pskey-subty objectid = ls_pskey-objps lockindicator = ls_pskey-sprps validityend = ls_pskey-endda validitybegin = ls_pskey-begda recordnumber = ls_pskey-seqnr record = <wa_0021> secondary_record = <wa_0528> operation = 'INS' tclas = 'A' nocommit = 'X' view_identifier = '28' dialog_mode = '0' IMPORTING return = ls_return. IF ls_return-type = 'E' OR ls_return-type = 'A' . es_output-message-msgtx = 'E'. MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number INTO es_output-message-msgty WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4. PERFORM frm_lock_per_data USING ls_pskey-pernr '' CHANGING es_output-message. EXIT. ENDIF. PERFORM frm_lock_per_data USING ls_pskey-pernr '' CHANGING es_output-message.* CLEAR:<WA_0528>,<WA_0021>. ENDLOOP. IF es_output-message-msgtx = 'E'. ROLLBACK WORK. CALL FUNCTION 'RHOM_ALL_BUFFER_INIT'. CALL FUNCTION 'HR_PSBUFFER_INITIALIZE'. EXIT. ENDIF. ENDIF.*0021 55555555555555555555end xiaoyong 20200429依照下面代码能写入双信息类型 ...

August 17, 2021 · 3 min · jiezi

关于abap:sap官方note-关于sftp的发送接收源代码

症状a) 您须要将文件从 SAP 应用程序服务器传输到仅反对 SFTP 协定的接管方。然而,SAP 应用程序服务器只能应用 HTTPS 协定发送文件。此外,您可能心愿在发送前对文件进行加密。 b) 您须要通过 HTTPS 将文件从近程服务器传输到 SAP 应用程序服务器。此外,您可能心愿在保留之前解密文件。 目前没有规范的程序或工具可用于文件加密、解密和传输。因而,您须要创立一个自定义程序。本阐明为您提供示例编码以反对您创立本人的程序。 请留神:PGP 加密不是SAP Employee Central Payroll 服务产品的一部分。起因如下: PGP 须要在利用服务器上安装额定的操作级软件,这在云环境中是不可能的 其余条款SAP SuccessFactors Employee Central Payroll、SFTP 服务器、文件传输、加密、解密 起因和先决条件在应用您的自定义程序之前,必须满足以下先决条件: 您有权创立报告程序、从应用程序服务器检索文件以及将它们上传到近程服务器。在本地服务器上启动用于出站解决的程序的用户对本地文件具备 READ 受权:受权对象 S_DATASET、PROGRAM = SAPLSCMS_FILE、ACTVT = 33(读取)、FILENAME = <本地文件名,包含残缺门路>。请留神:这并不一定意味着该用户能够显示文件内容。例如,如果您既未在程序中应用值帮忙,也未授予用户对象 S_TCODE 和 TCD = AL11 的受权,则他们将无奈从 UI 拜访文件内容。在 FILE 事务中,您保护了传出和传入文件的逻辑门路和文件名。在 SM59 事务中,您保护了一个类型为 G =“HTTP 连贯到内部服务器”的 RFC 指标,并将近程服务器作为指标主机。您已在“登录和平安”选项卡上保护了近程服务器的用户名和明码。两个零碎中必要的根本配置都已实现(例如,在零碎中建设可信连贯、受权等)。要创立到内部服务器的 HTTPS 连贯,Employee Central Payroll 零碎必须信赖服务器的证书。要应用 SSL 连贯,您须要通过 STRUST 事务附加内部服务器的 CA 证书。示例报告应用默认客户端 PSE(SSL 客户端规范)连贯到近程服务器。您已胜利执行 RFC 指标的连贯测试。仅相干,如果您想应用加密性能:在 STRUST 事务中,您保护了一个 PSE 并导入了您要发送的文件的最终收件人的证书。无关 STRUST 的更多信息,请参阅https://help.sap.com/viewer/2...解决方案SAP SuccessFactors 为客户提供对 SFTP 服务器的拜访。您能够先通过HTTPS从ABAP应用服务器向这个SFTP服务器发送文件,而后再通过SFTP协定从SFTP服务器传输给接管方。除了应用 SuccessFactors SFTP 服务器,您还能够将文件发送到任何其余通过 HTTPS 协定承受文件的近程服务器。 ...

August 3, 2021 · 23 min · jiezi

关于abap:关于用-ABAP-代码手动触发-SAP-CRM-organization-Model-自动决定的研究

(1) 钻研partner determination的逻辑是否抽出来,以API的行驶被咱们Odata service implementation code里调用? Yes. 我在AG3写了一个小的report ZPARTNER_DETERMINE_VIA_CODE,partner determination的外围是function module CRM_PARTNER_DETERMINATION_OW,对于如何应用这个FM,runtime时须要传递哪些参数,请参考该report的代码。最初determination的output是一个internal table,外面蕴含了每个determine进去的BP id即partner function。在我的这个例子里,determine进去的是employee responsible,如下图: (2)将Partner determination的逻辑抽出来之后,钻研是否在CRM_ORDER_MAINTAIN里suppress住外面内嵌的partner determination call? Technically speaking,咱们的需要是在callstack 28的CRM_ORDER_MAINTAIN的整个sub callstack里,不应该呈现partner determination API的调用。然而当初callstack 36呈现了,从代码发现callstack 35 , line 374动态地调用了这个FM,并没有一个开关,形如上面的语句来选择性地进行调用: IF iv_partner_determination_active = ‘X’.CALL FUNCTION ‘CRM_PARTNER_DETERMINATION_OW’ ENDIF.所以我须要做的research就是,看是否有办法让CRM_ORDER_MAINTAIN里的这个determination call执行但不失效。我曾经有了一些idea,须要写个POC验证。 CRM_ORDER_MAINTAIN里的partner determination也能够disable,办法如下:如上面邮件第二个截图,咱们尽管没法阻止CRM_PARTNER_DETERMINATION_OW 这个FM自身被调用,但咱们能够做到让这个FM被call到了之后,不做任何事件,间接return,从而也就达到了disable determination的目标。 咱们只需在call order maintain时传个switch参数进去:(A代表不执行partner determination, 我试过传B不行,传B的话,partner determination会在CRM_ORDER_MAINTAIN subcallstack的另一处执行) 这样determination API被call到的时候,外面会去查看这个flag,如果为A,则EXIT,这样真正的determination step不会执行。 Last step:写一个report,将partner_determ置为inactive,而后用CRM_ORDER_MAINTAIN创立一个order,hard code一个BP进去,如果最初call CRM_ORDER_SAVE之后order依然可能看到这个BP,阐明这条路没问题。 POC做完了,AG3 report ZDETER_AND_CREATE 这个report实现三件事件: 创立一个新的process type为SC1的service contractcall partner determination的API,实现determination 逻辑(这个例子里determine进去的是employee responsible:Jerry)将step2 失去的partner assign到step1创立的service contract里,同时hard code 另一个Bill to party:Wujicall order save将创立的service contract保留到DB如何应用该report请参考附件的video。 ...

July 22, 2021 · 1 min · jiezi

关于abap:将ABAP-OnPremises系统连接到中央检查系统以进行自定义代码迁移

官网 前置条件在 SAP Cloud Platform ABAP 环境中,您已被调配角色 SAP_CORE_BC_CCM。 此角色容许您应用通信对象连接 SAP Cloud 和本地实例在您的本地零碎中,您已装置以下内容:(1)具备管理员权限的 SAP Cloud Connector。(2)Java 8.所有就绪后,system landscape 如下: Open SAP Cloud Connector在您的浏览器中,登录到您的外部部署零碎的 SAP Cloud Connector。 如果您的外部部署零碎是 SAP AS ABAP Developer Edition, 7.5x,请在您的虚拟机中关上浏览器,例如 VMWare 地址 = 例如 https://localhost:<端口>(默认值 = 8443)用户 = Administrator明码 = 您的明码。 (初始密码= manage) 您的 Cloud Connector 仪表板应如下所示: 至多连贯了一个 Cloud Foundry 子账户 (1)至多一个从云到本地的映射 (2)请留神地位 ID (3) - 此处为 XXX。 稍后您将须要它。 Add resources for Custom Code Migration (CCM) App当初,您将增加 CCM 应用程序所需的资源。 资源是指 CCM 利用查看须要调用的 RFC 或 BAPI。 ...

July 17, 2021 · 2 min · jiezi

关于abap:作为一名-ABAP-资深顾问下一步可以选择哪一门-SAP-技术作为主攻方向

这是 Jerry 2021 年的第 41 篇文章,也是汪子熙公众号总共第 318 篇原创文章。 一位敌人向我发动了知乎征询: 对于这个话题,Jerry 已经写过一篇文章:ABAP开发人员将来应该学些什么。 其英文版公布在 SAP 社区博客上并被管理员置顶,取得了超过一万浏览量。 过后文章里我倡议的四个学习方向是: (1) 相熟一门函数式编程语言(2) 理解 Spring(3) 相熟 JavaScript(4) 理解一种 NoSQL 数据库 起初我补充了第五点,相熟 SAP Cloud Platform (当初更名为 SAP Business Technology Platform)开发技术。 回到这位知乎敌人的征询,作为一位 ABAP 资深参谋,如果想再抉择一门除 ABAP之外的其余 SAP 技术深刻钻研,我当然举荐 SAP UI5 作为下一个主攻方向。理由论述如下。 我是 2013 年开始接触 SAP UI5 的,距今已超过 8 年,亲眼见证其从最后的 beta 版本,演进到当初最新的 1.90.0 版。 在我 2018 年的一篇文章 SAP UI和 Salesforce UI开发漫谈里,已经回顾了 SAP 历代 UI 技术演变史。作为取代 SAP GUI,SAP ABAP Webdynpro 和 SAP WebClient UI 的下一代 UI 技术,SAP UI5 是 SAP 主推的开发 Fiori 利用的首选前端框架。 ...

June 16, 2021 · 2 min · jiezi

关于abap:ABAP-Development-Tool-代码模板和其他一些实用技巧汇总

这是 Jerry 2021 年的第 35 篇文章,也是汪子熙公众号总共第 311 篇原创文章。 Jerry 曾经辞别 ABAP 开发很长一段时间了,最近有敌人问我一个对于 ABAP Development Tool 里代码模板的应用问题。我感觉这个代码模板性能,对 ABAP 开发者来说算是一个比拟实用的性能,所以独自写一篇文章,把我给这位敌人的解答分享进去。 先介绍下问题的上下文:在 SAPGUI 里,咱们能够应用工具栏这个 Pattern 按钮,输出一个函数的名称比方 READ_TEXT: 而后,ABAP 编辑器会帮忙咱们,主动生成调用这个函数的代码模板,如下图所示。当一个 ABAP 函数具备较多的输入输出参数时,这个性能很有用,省去了咱们手动敲入代码的工夫。 这位敌人的困扰是,到了 ABAP Development Tool 环境上面,找不到 Pattern 按钮了,因而不晓得如何持续应用 ABAP 代码模板性能。 实际上,在 ABAP Development Tool (以前咱们称为 ABAP in Eclipse) 里,ABAP 代码模板依然可能持续应用。和 SAPGUI 不同之处在于,其触发形式有所变动,不再是通过点击 IDE 里某按钮触发。 首先,在 Windows -> Preferences 里,批改 ABAP Development Tool 里触发代码主动补全的快捷键。 抉择 Keys -> Content Assist,默认的快捷键是 Ctrl + Space. 这个按键组合,在 Windows 零碎里会触发输入法切换,因而咱们须要将其更改成其余的按键组合。 ...

May 15, 2021 · 2 min · jiezi

关于abap:abap-eclipse-adt快捷键

熟练掌握快捷键才是adt外围之一

May 12, 2021 · 1 min · jiezi

关于abap:abap-发送附件-excel-解决-打开附件提示格式不一致问题

旧语法版本 *&---------------------------------------------------------------------**& Report ZTEST_EMAIL_XLSX*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT ztest_email_xlsx.DATA:lt_spfli TYPE TABLE OF spfli.SELECT * UP TO 100 ROWS FROM spfli INTO TABLE lt_spfli.DATA lr_table TYPE REF TO cl_salv_table.cl_salv_table=>factory( IMPORTING r_salv_table = lr_table CHANGING t_table = lt_spfli ).DATA: lr_xldimension TYPE REF TO if_ixml_node, lr_xlworksheet TYPE REF TO if_ixml_element.DATA:lv_xlsx TYPE xstring.lv_xlsx = lr_table->to_xml( if_salv_bs_xml=>c_type_xlsx ).DATA:lr_zip TYPE REF TO cl_abap_zip.CREATE OBJECT lr_zip.lr_zip->load( lv_xlsx ).DATA:lv_file TYPE xstring.lr_zip->get( EXPORTING name = 'xl/worksheets/sheet1.xml' IMPORTING content = lv_file ).DATA:lr_file TYPE REF TO cl_xml_document.CREATE OBJECT lr_file.lr_file->parse_xstring( lv_file ).DATA:lr_xlnode TYPE REF TO if_ixml_node.lr_xlnode = lr_file->find_node( 'sheetData' ).DATA:lr_xlrows TYPE REF TO if_ixml_node_list.lr_xlrows = lr_xlnode->get_children( ).lr_xlworksheet ?= lr_file->find_node( 'worksheet' ).DATA:lr_xlsheetpr TYPE REF TO if_ixml_element.lr_xlsheetpr = cl_ixml=>create( )->create_document( )->create_element( name = 'sheetPr' ).DATA:lr_xloutlinepr TYPE REF TO if_ixml_element.lr_xloutlinepr = cl_ixml=>create( )->create_document( )->create_element( name = 'outlinePr' ).lr_xlsheetpr->if_ixml_node~append_child( lr_xloutlinepr ).lr_xloutlinepr->set_attribute( name = 'summaryBelow' value = 'false' ).lr_xldimension ?= lr_file->find_node( 'dimension' ).lr_xlworksheet->if_ixml_node~insert_child( new_child = lr_xlsheetpr ref_child = lr_xldimension ).lr_file->render_2_xstring( IMPORTING stream = lv_file ).lr_zip->delete( EXPORTING name = 'xl/worksheets/sheet1.xml' ).lr_zip->add( EXPORTING name = 'xl/worksheets/sheet1.xml' content = lv_file ).lv_xlsx = lr_zip->save( ).DATA lv_size TYPE i.DATA lt_bintab TYPE solix_tab.* Convert to binaryCALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_xlsx IMPORTING output_length = lv_size TABLES binary_tab = lt_bintab.DATA main_text TYPE bcsy_text.DATA:send_request TYPE REF TO cl_bcs.send_request = cl_bcs=>create_persistent( ).DATA:document TYPE REF TO cl_document_bcs.APPEND 'Valid Excel file' TO main_text.document = cl_document_bcs=>create_document( i_type = 'RAW' i_text = main_text i_subject = 'Test Created for stella' ).DATA:lv_objlen TYPE so_obj_len.DATA lt_att_head TYPE soli_tab.APPEND '<(>&< )>SO_FILENAME=MySheet.xlsx' TO lt_att_head.lv_objlen = lv_size.CONDENSE lv_objlen NO-GAPS.* add the spread sheet as attachment to document objectdocument->add_attachment( i_attachment_type = 'xls' i_attachment_subject = 'MySheet' i_attachment_size = lv_objlen i_attachment_header = lt_att_head i_att_content_hex = lt_bintab ).send_request->set_document( document ).DATA:recipient TYPE REF TO cl_cam_address_bcs.recipient = cl_cam_address_bcs=>create_internet_address( '383981024@qq.com' ).send_request->add_recipient( recipient ).DATA:sent_to_all TYPE os_boolean.sent_to_all = send_request->send( i_with_error_screen = 'X' ).COMMIT WORK.新语法版本 ...

May 12, 2021 · 3 min · jiezi

关于abap:ABAP-标准培训教程-BC400-学习教程之二Crossclient-和-Clientspecific-的区别

很多 ABAP 初学者通过各种社交平台向我提出这个问题: ABAP初学者如何系统地学习ABAP编程? 所以我专门写了一篇同名的文章来答复。 文章里提到,我的 ABAP 学习之路,其实并没有浏览过中文的 ABAP 书籍,而是逐个地把 SAP 规范教材里和 ABAP 相干的那些电子版的 PDF 书籍吃透: 而对于 ABAP 初学者来说,最重要的就是 BC400,BC401 和 BC402 三本。 从本文开始,咱们踏上 ABAP 规范教材,BC400 学习之路。 本书共有 541页,分为总共 9 个单元来组织。本文介绍第二单元内容:ABAP 开发工具介绍 ABAP Repository(仓库)的概念顾名思义,ABAP 仓库寄存了 ABAP 服务器上所有的程序,函数,数据库表定义等开发对象。ABAP 仓库里蕴含的内容,如下图所示,是 Cross-Client 的。如何了解这个 Cross-Client 概念呢? 当咱们登录 SAP GUI 时,选中一个 ABAP 零碎后,下一步须要抉择登录该零碎的哪一个 Client. Client 有的时候也称为 Tenant,中文翻译成租户。咱们一次只能登录某个 ABAP 零碎的某一个 client. 如下图所示,这个名为 CRM Infinity Development System 的 ABAP 零碎,有 001,002,100,102,110 等多个 Client,每个 Client 都有不同的 用处,比方 001 用于CRM 715 规范开发,002 用于 CRM_PLUS 规范开发,以此类推。 ...

May 3, 2021 · 1 min · jiezi

关于abap:abap-正则表达式验证EXCEL数据问题

FUNCTION ZTEST_XIAOY_CHECKTF.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" REFERENCE(IV_TABNAME) TYPE TABNAME*" TABLES*" IT_DATA*" ET_MESSAGE STRUCTURE ZSHR_MESSAGE*"----------------------------------------------------------------------DATA: dyn_table TYPE REF TO data, ”gs_display type ref to data, lo_descr type ref to cl_abap_structdescr, lt_fields type ddfields, lv_zz type string, ls_fields like line of lt_fields, ls_message type zshr_message, lv_text type string, lv_line type char20, dyn_wa TYPE REF TO data.FIELD-SYMBOLS: <dyn_table> TYPE table, <dyn_wa> TYPE ANY.*IV_TABNAME 是咱们excel se11定义的构造或者表CREATE DATA dyn_table TYPE TABLE OF (IV_TABNAME).ASSIGN dyn_table->* TO <dyn_table>.CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.ASSIGN dyn_wa->* TO <dyn_wa>.*<dyn_table> = IT_DATA[].ASSIGN IT_DATA[] to <dyn_table>.*上面是获取构造字段属性 当然有个简略的方法,间接从dd03l读取就行lo_descr ?= cl_abap_typedescr=>describe_by_data( <dyn_wa> ).lt_fields = lo_descr->get_ddic_field_list( p_langu = 'E' p_including_substructres = abap_true ).*sort lt_fields by tabname fieldname.loop at <dyn_table> ASSIGNING <dyn_wa>. lv_line = sy-tabix. CONDENSE lv_line. loop at lt_fields into ls_fields. ASSIGN COMPONENT ls_fields-fieldname of STRUCTURE <dyn_wa> to FIELD-SYMBOL(<field>). if <field> is ASSIGNED. case ls_fields-inttype. when 'D'. if <field> is not initial. replace all occurrences of '\' in lv_text with space. replace all occurrences of '-' in lv_text with space. replace all occurrences of '/' in lv_text with space. condense: lv_text no-gaps. lv_text = <field> . lv_zz = '^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:0229))|' && '(?:(?:(?:1[6-9]|[2-9]\d)\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[13-9]|1[0-2])(?:29|30))|(?:(?:0[1-9])|(?:1[0-2]))(' && '?:0[1-9]|1\d|2[0-8]))))$'. if cl_abap_matcher=>matches( pattern = lv_zz text = lv_text ) ne abap_true. ls_message-msgty = 'E'. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据不是日期格局YYYYMMDD' into ls_message-msgtx SEPARATED BY space. append ls_message to ET_MESSAGE. “exit . clear:ls_message. endif. <field> = lv_text. endif. when 'N' or 'I' . if <field> is not initial. lv_text = <field> . replace all occurrences of ',' in lv_text with space. condense: lv_text no-gaps. if cl_abap_matcher=>matches( pattern = '-?[0-9]\d*' text = lv_text ) ne abap_true. ls_MESSAGE-msgty = 'E'.* concatenate ls_fields-fieldname '数据不是整数类型的' into ls_MESSAGE-msgtx. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据不是整数类型的' into ls_message-msgtx SEPARATED BY space. append ls_MESSAGE to ET_MESSAGE. ”exit . clear:ls_MESSAGE. endif. <field> = lv_text. endif. when 'P'. if <field> is not initial. lv_text = <field> . replace all occurrences of ',' in lv_text with space. condense: lv_text no-gaps. if cl_abap_matcher=>matches(* pattern = '^(([1-9]\d*)(\.\d{1,2})?)$|^(0\.0?([1-9]\d?))$' pattern = '^[0-9]+.?[0-9]*$'"肖勇更改正则表达式 20190422 text = lv_text ) ne abap_true. ls_message-msgty = 'E'.* concatenate ls_ztehrdt02-fielc '数据不是数字类型的' into ls_message-msgtx. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据不是数字类型的' into ls_message-msgtx SEPARATED BY space. append ls_message to et_message. “ exit . clear:ls_message. endif. <field> = lv_text. endif. when 'C'.* clear:len. data(len) = strlen( <field> )."先判断长度 if len > ls_fields-leng. ls_message-msgty = 'E'.* concatenate ls_ztehrdt02-fielc '数据长度过长' into ls_message-msgtx. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据长度过长' into ls_message-msgtx SEPARATED BY space. append ls_message to ET_MESSAGE.clear:ls_message. endif. clear:len. endcase. endif. endloop.ENDLOOP.ENDFUNCTION.测试用的小段代码 ...

April 29, 2021 · 2 min · jiezi

关于abap:ABAP正则表达式

正则表达式比较复杂,然而会用正则表达式,秒杀很多程序员,因为他人写了一堆的烂代码,你一句就搞定了。 se24 CL_ABAP_MATCHER 练习1:^[0-9]+abc$^ 为匹配输出字符串的开始地位。 [0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。 abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输出字符串的完结地位。 下面这个正则表达式 翻译进去就是 ^开始搜寻0到9的任何数字,并且还加一个abc结尾的。 用abap语言来测试 DATA: matcher TYPE REF TO cl_abap_matcher, match TYPE match_result, itab TYPE match_result_tab, line LIKE LINE OF itab.matcher = cl_abap_matcher=>create( pattern = '^[0-9]+abc$' text = '123abc' ).itab = matcher->find_all( ).LOOP AT itab INTO line. WRITE: / matcher->text,line-offset,line-length,matcher->text+line-offset(line-length).ENDLOOP.运行后果:123abc 0 6 123abc

April 29, 2021 · 1 min · jiezi

关于abap:ABAP-内表转Email-作为附件发送源代码

*&---------------------------------------------------------------------* *& Report ZJOBY_EMAIL_TEST *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZJOBY_EMAIL_TEST. TYPE-POOLS: IXML. *------------------------------------------------------------------------* * Data Declarations * *------------------------------------------------------------------------* * Structure for Final Internal Table TYPES: BEGIN OF TY_FINAL, SRNO(3) TYPE N, USER_ID TYPE USR02-BNAME, FULL_NAME TYPE BAPIADDR3-FULLNAME, DEPT TYPE BAPIADDR3-DEPARTMENT, LOGIN(3) TYPE C, END OF TY_FINAL. * Structure for USR02 TYPES: BEGIN OF TY_USR02, BNAME TYPE USR02-BNAME, TRDAT TYPE USR02-TRDAT, END OF TY_USR02. * Internal Table & Work Area for Final Internal Table DATA: IT_FINAL TYPE TABLE OF TY_FINAL, WA_FINAL TYPE TY_FINAL. * Internal Table & Work Area for USR02 Internal Table DATA: IT_USR02 TYPE TABLE OF TY_USR02, WA_USR02 TYPE TY_USR02. * Work Area for ADD3_DATA Structre DATA: WA_ADDR TYPE BAPIADDR3. DATA: IT_RETURN TYPE TABLE OF BAPIRET2. DATA: LV_DATE TYPE D. DATA: LV_FILENAME TYPE STRING. TYPES: BEGIN OF XML_LINE, DATA(255) TYPE X, END OF XML_LINE. DATA: L_IXML TYPE REF TO IF_IXML, L_STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY, L_OSTREAM TYPE REF TO IF_IXML_OSTREAM, L_RENDERER TYPE REF TO IF_IXML_RENDERER, L_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT. DATA: L_ELEMENT_ROOT TYPE REF TO IF_IXML_ELEMENT, NS_ATTRIBUTE TYPE REF TO IF_IXML_ATTRIBUTE, R_ELEMENT_PROPERTIES TYPE REF TO IF_IXML_ELEMENT, R_ELEMENT TYPE REF TO IF_IXML_ELEMENT, R_WORKSHEET TYPE REF TO IF_IXML_ELEMENT, R_TABLE TYPE REF TO IF_IXML_ELEMENT, R_COLUMN TYPE REF TO IF_IXML_ELEMENT, R_ROW TYPE REF TO IF_IXML_ELEMENT, R_CELL TYPE REF TO IF_IXML_ELEMENT, R_DATA TYPE REF TO IF_IXML_ELEMENT, L_VALUE TYPE STRING, L_TYPE TYPE STRING, L_TEXT(100) TYPE C, R_STYLES TYPE REF TO IF_IXML_ELEMENT, R_STYLE TYPE REF TO IF_IXML_ELEMENT, R_STYLE1 TYPE REF TO IF_IXML_ELEMENT, R_FORMAT TYPE REF TO IF_IXML_ELEMENT, R_BORDER TYPE REF TO IF_IXML_ELEMENT, NUM_ROWS TYPE I. DATA: L_XML_TABLE TYPE TABLE OF XML_LINE, WA_XML TYPE XML_LINE, L_XML_SIZE TYPE I, L_RC TYPE I. *------------------------------------------------------------------------* * Initialization * *------------------------------------------------------------------------* INITIALIZATION. LV_DATE = SY-DATUM - 1. *------------------------------------------------------------------------* * Start of Selection * *------------------------------------------------------------------------* START-OF-SELECTION. PERFORM GET_USER_DATA. PERFORM PROCESS_XML_DATA. PERFORM SEND_MAIL. *&---------------------------------------------------------------------* *& Form get_user_data *&---------------------------------------------------------------------* * Fetch User details from USR02 *----------------------------------------------------------------------* FORM GET_USER_DATA. REFRESH IT_FINAL. SELECT DISTINCT BNAME TRDAT FROM USR02 INTO TABLE IT_USR02. SORT IT_USR02 BY BNAME. IF NOT IT_USR02[] IS INITIAL. LOOP AT IT_USR02 INTO WA_USR02. CLEAR WA_FINAL. WA_FINAL-SRNO = SY-TABIX. " Serial No. WA_FINAL-USER_ID = WA_USR02-BNAME. " User ID CALL FUNCTION 'BAPI_USER_GET_DETAIL' EXPORTING USERNAME = WA_USR02-BNAME IMPORTING ADDRESS = WA_ADDR TABLES RETURN = IT_RETURN. IF SY-SUBRC EQ 0. WA_FINAL-FULL_NAME = WA_ADDR-FULLNAME. " Full Name WA_FINAL-DEPT = WA_ADDR-DEPARTMENT. " Department ENDIF. IF WA_USR02-TRDAT EQ LV_DATE. WA_FINAL-LOGIN = 'YES'. " Login on Previous Day ELSE. WA_FINAL-LOGIN = 'NO'. ENDIF. APPEND WA_FINAL TO IT_FINAL. ENDLOOP. ENDIF. ENDFORM. " get_user_data *&---------------------------------------------------------------------* *& Form SEND_MAIL *&---------------------------------------------------------------------* * Send Email *----------------------------------------------------------------------* FORM SEND_MAIL. DATA: OBJPACK LIKE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE. DATA: OBJHEAD LIKE SOLISTI1 OCCURS 1 WITH HEADER LINE. DATA: OBJBIN LIKE SOLIX OCCURS 10 WITH HEADER LINE. DATA: OBJTXT LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE. DATA: RECLIST LIKE SOMLRECI1 OCCURS 5 WITH HEADER LINE. DATA: DOC_CHNG LIKE SODOCCHGI1. DATA: TAB_LINES LIKE SY-TABIX. DATA: L_NUM(3). DATA: SUBJ_DATE(10) TYPE C. * Mail Subject CONCATENATE LV_DATE+6(2) '-' LV_DATE+4(2) '-' LV_DATE+0(4) INTO SUBJ_DATE. CONCATENATE 'SAP Application Usage Report ' SUBJ_DATE INTO DOC_CHNG-OBJ_DESCR SEPARATED BY SPACE. * Mail Contents OBJTXT = 'Dear User,'. APPEND OBJTXT. CLEAR OBJTXT. APPEND OBJTXT. CONCATENATE 'Please find the attached SAP Application Usage Report for ' SUBJ_DATE INTO OBJTXT SEPARATED BY SPACE. " Mail Contents APPEND OBJTXT. CLEAR OBJTXT. APPEND OBJTXT. OBJTXT = 'Thanks & Regards,'. APPEND OBJTXT. OBJTXT = 'Himanshu Kanekar'. APPEND OBJTXT. DESCRIBE TABLE OBJTXT LINES TAB_LINES. READ TABLE OBJTXT INDEX TAB_LINES. DOC_CHNG-DOC_SIZE = ( TAB_LINES - 1 ) * 255 + STRLEN( OBJTXT ). * Packing List For the E-mail Body OBJPACK-HEAD_START = 1. OBJPACK-HEAD_NUM = 0. OBJPACK-BODY_START = 1. OBJPACK-BODY_NUM = TAB_LINES. OBJPACK-DOC_TYPE = 'RAW'. APPEND OBJPACK. * Creation of the Document Attachment LOOP AT L_XML_TABLE INTO WA_XML. CLEAR OBJBIN. OBJBIN-LINE = WA_XML-DATA. APPEND OBJBIN. ENDLOOP. DESCRIBE TABLE OBJBIN LINES TAB_LINES. OBJHEAD = 'SAP Login Details'. APPEND OBJHEAD. * Packing List For the E-mail Attachment OBJPACK-TRANSF_BIN = 'X'. OBJPACK-HEAD_START = 1. OBJPACK-HEAD_NUM = 0. OBJPACK-BODY_START = 1. OBJPACK-BODY_NUM = TAB_LINES. CONCATENATE 'SAP_Login_Details' SUBJ_DATE INTO OBJPACK-OBJ_DESCR SEPARATED BY SPACE. OBJPACK-DOC_TYPE = 'XLS'. OBJPACK-DOC_SIZE = TAB_LINES * 255. APPEND OBJPACK. * Target Recipent CLEAR RECLIST. RECLIST-RECEIVER = '家里蹲@qq.com'. RECLIST-REC_TYPE = 'U'. RECLIST-NOTIF_READ = 'X'. RECLIST-COM_TYPE = 'INT'. RECLIST-NOTIF_DEL = 'X'. RECLIST-NOTIF_NDEL = 'X'. APPEND RECLIST. * Sending the document CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1' EXPORTING DOCUMENT_DATA = DOC_CHNG PUT_IN_OUTBOX = 'X' COMMIT_WORK = 'X' TABLES PACKING_LIST = OBJPACK OBJECT_HEADER = OBJHEAD CONTENTS_TXT = OBJTXT CONTENTS_HEX = OBJBIN RECEIVERS = RECLIST EXCEPTIONS TOO_MANY_RECEIVERS = 1 DOCUMENT_NOT_SENT = 2 OPERATION_NO_AUTHORIZATION = 4 OTHERS = 99. IF SY-SUBRC = 0. WAIT UP TO 2 SECONDS. SUBMIT RSCONN01 WITH MODE = 'INT' AND RETURN. ENDIF. ENDFORM. " SEND_MAIL *&---------------------------------------------------------------------* *& Form process_xml_data *&---------------------------------------------------------------------* * Process XML Data *----------------------------------------------------------------------* FORM PROCESS_XML_DATA . * Creating a ixml Factory L_IXML = CL_IXML=>CREATE( ). * Creating the DOM Object Model L_DOCUMENT = L_IXML->CREATE_DOCUMENT( ). * Create Root Node 'Workbook' L_ELEMENT_ROOT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Workbook' PARENT = L_DOCUMENT ). L_ELEMENT_ROOT->SET_ATTRIBUTE( NAME = 'xmlns' VALUE = 'urn:schemas-microsoft-com:office:spreadsheet' ). NS_ATTRIBUTE = L_DOCUMENT->CREATE_NAMESPACE_DECL( NAME = 'ss' PREFIX = 'xmlns' URI = 'urn:schemas-microsoft-com:office:spreadsheet' ). L_ELEMENT_ROOT->SET_ATTRIBUTE_NODE( NS_ATTRIBUTE ). NS_ATTRIBUTE = L_DOCUMENT->CREATE_NAMESPACE_DECL( NAME = 'x' PREFIX = 'xmlns' URI = 'urn:schemas-microsoft-com:office:excel' ). L_ELEMENT_ROOT->SET_ATTRIBUTE_NODE( NS_ATTRIBUTE ). * Create node for document properties. R_ELEMENT_PROPERTIES = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'TEST_REPORT' PARENT = L_ELEMENT_ROOT ). L_VALUE = SY-UNAME. L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Author' VALUE = L_VALUE PARENT = R_ELEMENT_PROPERTIES ). * Styles R_STYLES = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Styles' PARENT = L_ELEMENT_ROOT ). * Style for Header R_STYLE = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Style' PARENT = R_STYLES ). R_STYLE->SET_ATTRIBUTE_NS( NAME = 'ID' PREFIX = 'ss' VALUE = 'Header' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Font' PARENT = R_STYLE ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Bold' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Interior' PARENT = R_STYLE ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Color' PREFIX = 'ss' VALUE = '#92D050' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Pattern' PREFIX = 'ss' VALUE = 'Solid' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Alignment' PARENT = R_STYLE ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Vertical' PREFIX = 'ss' VALUE = 'Center' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'WrapText' PREFIX = 'ss' VALUE = '1' ). R_BORDER = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Borders' PARENT = R_STYLE ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Bottom' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Left' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Top' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Right' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). * Style for Data R_STYLE1 = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Style' PARENT = R_STYLES ). R_STYLE1->SET_ATTRIBUTE_NS( NAME = 'ID' PREFIX = 'ss' VALUE = 'Data' ). R_BORDER = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Borders' PARENT = R_STYLE1 ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Bottom' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Left' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Top' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). R_FORMAT = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Border' PARENT = R_BORDER ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Position' PREFIX = 'ss' VALUE = 'Right' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'LineStyle' PREFIX = 'ss' VALUE = 'Continuous' ). R_FORMAT->SET_ATTRIBUTE_NS( NAME = 'Weight' PREFIX = 'ss' VALUE = '1' ). * Worksheet R_WORKSHEET = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Worksheet' PARENT = L_ELEMENT_ROOT ). R_WORKSHEET->SET_ATTRIBUTE_NS( NAME = 'Name' PREFIX = 'ss' VALUE = 'Sheet1' ). * Table R_TABLE = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Table' PARENT = R_WORKSHEET ). R_TABLE->SET_ATTRIBUTE_NS( NAME = 'FullColumns' PREFIX = 'x' VALUE = '1' ). R_TABLE->SET_ATTRIBUTE_NS( NAME = 'FullRows' PREFIX = 'x' VALUE = '1' ). * Column Formatting R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ). R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '40' ). R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ). R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '90' ). R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ). R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '140' ). R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ). R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '150' ). R_COLUMN = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Column' PARENT = R_TABLE ). R_COLUMN->SET_ATTRIBUTE_NS( NAME = 'Width' PREFIX = 'ss' VALUE = '90' ). * Blank Row * R_ROW = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Row' PARENT = R_TABLE ). * Column Headers Row R_ROW = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Row' PARENT = R_TABLE ). R_ROW->SET_ATTRIBUTE_NS( NAME = 'AutoFitHeight' PREFIX = 'ss' VALUE = '1' ). * Sr. No. R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Header' ). R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = 'Sr. No.' PARENT = R_CELL ). R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). * User Name R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Header' ). R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = 'User Name' PARENT = R_CELL ). R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). * Full Name R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Header' ). R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = 'Full Name' PARENT = R_CELL ). R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). * Department R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Header' ). R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = 'Department' PARENT = R_CELL ). R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). * Login R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Header' ). CONCATENATE 'Login - ' LV_DATE+6(2) '/' LV_DATE+4(2) '/' LV_DATE+0(4) INTO L_VALUE. R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ). R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). * Blank Row after Column Headers * R_ROW = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Row' PARENT = R_TABLE ). * R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). * R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). * * R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). * R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). * * R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). * R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). * * R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). * R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). * * R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). * R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). * Data Table LOOP AT IT_FINAL INTO WA_FINAL. R_ROW = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Row' PARENT = R_TABLE ). * Sr. No. R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). L_VALUE = SY-TABIX. CONDENSE L_VALUE NO-GAPS. R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ). " Data R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'Number' ). " Cell format * User Name R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). L_VALUE = WA_FINAL-USER_ID. R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ). " Data R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). " Cell format * Full Name R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). L_VALUE = WA_FINAL-FULL_NAME. R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ). " Data R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). " Cell format * Department R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). L_VALUE = WA_FINAL-DEPT. R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ). " Data R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). " Cell format * Login R_CELL = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Cell' PARENT = R_ROW ). R_CELL->SET_ATTRIBUTE_NS( NAME = 'StyleID' PREFIX = 'ss' VALUE = 'Data' ). L_VALUE = WA_FINAL-LOGIN. R_DATA = L_DOCUMENT->CREATE_SIMPLE_ELEMENT( NAME = 'Data' VALUE = L_VALUE PARENT = R_CELL ). " Data R_DATA->SET_ATTRIBUTE_NS( NAME = 'Type' PREFIX = 'ss' VALUE = 'String' ). " Cell format ENDLOOP. * Creating a Stream Factory L_STREAMFACTORY = L_IXML->CREATE_STREAM_FACTORY( ). * Connect Internal XML Table to Stream Factory L_OSTREAM = L_STREAMFACTORY->CREATE_OSTREAM_ITABLE( TABLE = L_XML_TABLE ). * Rendering the Document L_RENDERER = L_IXML->CREATE_RENDERER( OSTREAM = L_OSTREAM DOCUMENT = L_DOCUMENT ). L_RC = L_RENDERER->RENDER( ). * Saving the XML Document L_XML_SIZE = L_OSTREAM->GET_NUM_WRITTEN_RAW( ). ENDFORM. " process_xml_data

April 29, 2021 · 11 min · jiezi

关于abap:ABAP-标准培训教程-BC400-学习教程之一ABAP-服务器的架构和一个典型的-ABAP-程序结构介绍

很多 ABAP 初学者通过各种社交平台向我提出这个问题: ABAP初学者如何系统地学习ABAP编程? 所以我专门写了一篇同名的文章来答复。 文章里提到,我的 ABAP 学习之路,其实并没有浏览过中文的 ABAP 书籍,而是逐个地把 SAP 规范教材里和 ABAP 相干的那些电子版的 PDF 书籍吃透: 而对于 ABAP 初学者来说,最重要的就是 BC400,BC401 和 BC402 三本。 从本文开始,咱们踏上 ABAP 规范教材,BC400 学习之路。 本书共有 541页,分为总共 9 个单元来组织。本文介绍第一单元内容:ABAP程序的执行流 - Flow of an ABAP Program. 下图,是 ABAP 程序运行的经典三层架构。 我已经写过一篇文章:一个13年ABAP老兵的倡议:理解这些基础知识,对ABAP开发有百利而无一害 进行过具体论述,不过这篇文章对于 ABAP 初学者来说可能有点过深了,因而本文介绍的是适宜 ABAP 初学者去理解的架构常识。 上图最上层的 Presentation Server 即展示层,就是大家平时装置了 SAP GUI (或者基于 Eclipse 的 ABAP Development Tool ) 的个人电脑或者服务器。Presentation Server 上装置的这些工具,给 ABAP 开发者和 SAP 软件使用者,提供了拜访 ABAP 零碎的路径。 ...

April 27, 2021 · 1 min · jiezi

关于abap:ABAP-搭建中台技术第一步-rfcjson组合能够通用所有接口

我先撸一个最简略的rfc RFC 有 LT_TABLES    TYPE RSFB_PARA,    LT_IMPORT    TYPE RSFB_PARA,    LT_EXPORT    TYPE RSFB_PARA,    LT_CHANGE    TYPE RSFB_PARA, 再加一个异样FUNCTION ZFMALL_SEND_TO_SAP.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" REFERENCE(IS_INPUT) TYPE ZSHALL_0001_INS*" EXPORTING*" VALUE(ES_OUTPUT) TYPE ZSHRALL_OUS*"----------------------------------------------------------------------* [Global data declarations](global-zfmall_send_to_sap.html)  DATA:    LT_PTAB      TYPE ABAP_FUNC_PARMBIND_TAB,    LS_PTAB      LIKE LINE OF LT_PTAB,    LT_ETAB      TYPE ABAP_FUNC_EXCPBIND_TAB,    LS_ETAB      LIKE LINE OF LT_ETAB,    LS_HEADER_GD TYPE HEADER_FB,    LT_TABLES    TYPE RSFB_PARA,    LT_IMPORT    TYPE RSFB_PARA,    LT_EXPORT    TYPE RSFB_PARA,    LT_CHANGE    TYPE RSFB_PARA,    DYN_WA_INS   TYPE REF TO DATA,    DYN_WA_OUS   TYPE REF TO DATA,    LV_STRCRQ    TYPE ZESTRCRQ,    LV_STRCRS    TYPE ZESTRCRS,    LV_STRING    TYPE STRING,    LV_TABNAME   TYPE TABNAME.  DATA: LV_DATE_START LIKE SY-DATUM,        LV_TIME_START LIKE SY-UZEIT,        LV_DATE_END   LIKE SY-DATUM,        LV_TIME_END   LIKE SY-UZEIT,        LV_DAYS       TYPE I,        LV_TIMES      TYPE CVA_TIME,        LV_TSPAN      TYPE ZETSPAN.  CLEAR: LV_DATE_START, LV_TIME_START.  LV_DATE_START = SY-DATUM.  LV_TIME_START = SY-UZEIT.  FIELD-SYMBOLS:<DYN_WA_INS> TYPE ANY,                <DYN_WA_OUS> TYPE ANY.  SELECT SINGLE FUNCNAME INTO @DATA(LV_FUNCNAME)    FROM ZINTFLOG002    WHERE SYSNM = @IS_INPUT-IS_SAPSYS-SYSNM      AND INTNR = @IS_INPUT-IS_SAPSYS-INTNR      AND ACTIV = 'X'.  CHECK SY-SUBRC = 0.  CLEAR: LT_PTAB[].  SELECT SINGLE PNAME INTO @DATA(LV_PNAME) FROM TFDIR WHERE FUNCNAME = @LV_FUNCNAME.  LS_HEADER_GD-NAME = LV_FUNCNAME.  CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'    EXPORTING      PROGRAM   = LV_PNAME    IMPORTING      GROUP     = LS_HEADER_GD-AREA      NAMESPACE = LS_HEADER_GD-NAMESPACE    EXCEPTIONS      OTHE      = 12.  IF SY-SUBRC = 0.    CONCATENATE LS_HEADER_GD-NAMESPACE LS_HEADER_GD-AREA INTO LS_HEADER_GD-AREA.    REFRESH:LT_TABLES,LT_IMPORT,LT_EXPORT,LT_CHANGE.    CALL METHOD CL_FB_PARAMETER_DB=>READ      IMPORTING        TABLES = LT_TABLES        IMPORT = LT_IMPORT        EXPORT = LT_EXPORT        CHANGE = LT_CHANGE      CHANGING        HEADER = LS_HEADER_GD.  ENDIF.****import 操作  IF LT_IMPORT[] IS NOT INITIAL.    READ TABLE LT_IMPORT ASSIGNING FIELD-SYMBOL(<FS_IMPORT>) INDEX 1.    CREATE DATA DYN_WA_INS TYPE (<FS_IMPORT>-STRUCTURE).    ASSIGN DYN_WA_INS->* TO <DYN_WA_INS>.    call function 'ZFM_EHR_JSON_TO_ABAP'      EXPORTING        IV_JSON = IS_INPUT-INPUT      IMPORTING        EV_DATA = <DYN_WA_INS>.    LS_PTAB-NAME = <FS_IMPORT>-PARAMETER.    LS_PTAB-KIND = ABAP_FUNC_EXPORTING.    GET REFERENCE OF <DYN_WA_INS> INTO LS_PTAB-VALUE.    INSERT LS_PTAB INTO TABLE LT_PTAB.    CLEAR:LS_PTAB.  ENDIF.**** export 操作  IF LT_EXPORT[] IS NOT INITIAL.    READ TABLE LT_EXPORT ASSIGNING FIELD-SYMBOL(<FS_EXPORT>) INDEX 1.    CREATE DATA DYN_WA_OUS TYPE (<FS_EXPORT>-STRUCTURE).    ASSIGN DYN_WA_OUS->* TO <DYN_WA_OUS>.    LS_PTAB-NAME = <FS_EXPORT>-PARAMETER.    LS_PTAB-KIND = ABAP_FUNC_IMPORTING.    GET REFERENCE OF <DYN_WA_OUS> INTO LS_PTAB-VALUE.    INSERT LS_PTAB INTO TABLE LT_PTAB.    CLEAR:LS_PTAB.  ENDIF.  "FILL Exceptions  CLEAR: LT_ETAB[].  PERFORM FRM_FILL_EXCP_TAB USING: 'DATA_NOT_FOUND' '1' CHANGING LT_ETAB.  PERFORM FRM_FILL_EXCP_TAB USING: 'OTHERS' '2' CHANGING LT_ETAB.  CALL FUNCTION LV_FUNCNAME    PARAMETER-TABLE    LT_PTAB    EXCEPTION-TABLE    LT_ETAB.  IF SY-SUBRC NE 0.    ES_OUTPUT-MESSAGE-MSGTX = 'E'.    CALL FUNCTION 'MESSAGE_TEXT_BUILD'      EXPORTING        MSGID               = SY-MSGID        MSGNR               = SY-MSGNO        MSGV1               = SY-MSGV1        MSGV2               = SY-MSGV1        MSGV3               = SY-MSGV1        MSGV4               = SY-MSGV1      IMPORTING        MESSAGE_TEXT_OUTPUT = ES_OUTPUT-MESSAGE-MSGTY.  ENDIF.  IF ES_OUTPUT-MESSAGE-MSGTX = 'E'.    EXIT.  ENDIF.  call function 'ZFM_EHR_ABAP_TO_JSON'    EXPORTING      IV_DATA = <DYN_WA_OUS>    IMPORTING      EV_JSON = LV_STRING.  ES_OUTPUT-OUTPUT = LV_STRING.  CLEAR: LV_DATE_END, LV_TIME_END.  LV_DATE_END = SY-DATUM.  LV_TIME_END = SY-UZEIT.  CLEAR: LV_DAYS, LV_TIMES.  CALL FUNCTION 'SCOV_TIME_DIFF'    EXPORTING      IM_DATE1              = LV_DATE_START      IM_DATE2              = LV_DATE_END      IM_TIME1              = LV_TIME_START      IM_TIME2              = LV_TIME_END    IMPORTING      EX_DAYS               = LV_DAYS      EX_TIME               = LV_TIMES    EXCEPTIONS      START_LARGER_THAN_END = 1      OTHERS                = 2.  IF SY-SUBRC = 0.* Implement suitable error handling here    LV_TSPAN = LV_DAYS * 24 * 60 * 60 + LV_TIMES+0(2) * 60 * 60 + LV_TIMES+2(2) * 60 + LV_TIMES+4(2).  ENDIF.  CLEAR:LV_STRCRQ,LV_STRCRS.  LV_STRCRQ = <FS_IMPORT>-STRUCTURE.  LV_STRCRS = <FS_EXPORT>-STRUCTURE.  call function 'ZINTFLOG_SAVE'    EXPORTING      IV_SYSNM    = IS_INPUT-IS_SAPSYS-SYSNM      IV_INTNR    = IS_INPUT-IS_SAPSYS-INTNR      IV_FUNCN    = LV_FUNCNAME      IV_STRCRQ   = LV_STRCRQ      IV_STRCRS   = LV_STRCRS      IV_TYPE     = ES_OUTPUT-MESSAGE-MSGTX      IV_MESSAGE  = ES_OUTPUT-MESSAGE-MSGTY      IV_TSPAN    = LV_TSPAN    CHANGING      CS_REQUEST  = <DYN_WA_INS>      CS_RESPONSE = <DYN_WA_OUS>.ENDFUNCTION.

April 21, 2021 · 1 min · jiezi

关于abap:ABAP-开发程序第一个include-结尾的地方是TOP-导致出现的问题

answer learn Dear all, The include name should not end with 'TOP'. For example The include name should not be ZPQR_TOP. Please change the include name from ZPQR_TOP to ZPQR_DECLN. I think you will not get that error. Next solution is write the REPORT statement inside the ZPQR_TOP. I think it will help you 意思就是不要在第一个include 外面的结尾应用top 我也试了作者说的第二个例子 你能够在top外面把report 撸上

April 14, 2021 · 1 min · jiezi

关于abap:ABAP-REST-API-FORMDATA

FUNCTION zhr_intf_per_pho2cms.*"----------------------------------------------------------------------*"*"本地接口:*"  IMPORTING*"     REFERENCE(IV_PERNR) TYPE  PERNR_D OPTIONAL*"     REFERENCE(IV_GUID) TYPE  ZE_EHR_GUID OPTIONAL*"  EXPORTING*"     REFERENCE(EV_PHOTO) TYPE  STRING*"     REFERENCE(ES_MESSAGE) TYPE  ZSEHR_MESSAGE*"----------------------------------------------------------------------  DATA:lv_objid(50).  DATA: lt_toav0   TYPE toav0   OCCURS 1 WITH HEADER LINE.  DATA: lt_bindata LIKE tbl1024 OCCURS 0 WITH HEADER LINE.  DATA:lt_bin TYPE TABLE OF sdokcntbin.  DATA:lt_info TYPE TABLE OF scms_acinf,       ls_info TYPE scms_acinf.  DATA:l_str TYPE string.  DATA: lv_bindata TYPE xstring.  DATA: lv_count   TYPE sy-index.  DATA: lv_length  TYPE sapb-length.  DATA: ls_toahr     TYPE toahr,        lv_object_id TYPE toahr-object_id.  DATA:host TYPE string.  DATA:client TYPE REF TO if_http_client.  DATA: it_formulario TYPE tihttpnvp,        lv_error_msg  TYPE string,        wa_formulario LIKE LINE OF it_formulario,        len           TYPE i,        part          TYPE REF TO if_http_entity.  CLEAR ev_photo.*  CONCATENATE IV_PERNR '0002' INTO LV_OBJID.  IF iv_pernr IS NOT INITIAL.    lv_objid = iv_pernr.    lv_object_id = iv_pernr .                               "&& '0002'.    SELECT SINGLE * INTO  ls_toahr FROM toahr WHERE sap_object = 'PREL' AND ( object_id = lv_objid OR object_id = lv_object_id  ) AND archiv_id = 'A2'.    IF sy-subrc NE 0.      SELECT SINGLE guid INTO lv_objid FROM zthr0099 WHERE  ztype IN ( 'ZZ01','Z001' ) AND objid = iv_pernr AND zstat NOT IN ( 'D', '7', '3' ).    ELSE.      CLEAR lv_objid.      CONDENSE:ls_toahr-object_id NO-GAPS.      lv_objid = ls_toahr-object_id.    ENDIF.  ELSE.    lv_objid = iv_guid.  ENDIF.  REFRESH lt_toav0.  CALL FUNCTION 'ARCHIV_GET_CONNECTIONS'    EXPORTING      objecttype    = 'PREL'      object_id     = lv_objid      client        = sy-mandt      archiv_id     = 'A2'      documenttype  = 'HRICOLFOTO'    IMPORTING      count         = lv_count    TABLES      connections   = lt_toav0    EXCEPTIONS      nothing_found = 1      OTHERS        = 2.  SORT lt_toav0 BY ar_date DESCENDING.  IF lv_count > 0.    CLEAR lt_toav0.    READ TABLE lt_toav0 INDEX 1.    REFRESH lt_bindata.*    CALL FUNCTION 'ARCHIVOBJECT_GET_TABLE'*      EXPORTING*        archiv_id                = 'A2'*        document_type            = 'HRICOLFOTO'*        archiv_doc_id            = lt_toav0-arc_doc_id*      IMPORTING*        binlength                = lv_length*      TABLES*        binarchivobject          = lt_bindata*      EXCEPTIONS*        error_archiv             = 1*        error_communicationtable = 2*        error_kernel             = 3*        OTHERS                   = 4.    CALL FUNCTION 'SCMS_DOC_READ'      EXPORTING*       MANDT                 = SY-MANDT        stor_cat              = space        crep_id               = lt_toav0-archiv_id        doc_id                = lt_toav0-arc_doc_id      TABLES        access_info           = lt_info        content_bin           = lt_bin      EXCEPTIONS        bad_storage_type      = 1        bad_request           = 2        unauthorized          = 3        comp_not_found        = 4        not_found             = 5        forbidden             = 6        conflict              = 7        internal_server_error = 8        error_http            = 9        error_signature       = 10        error_config          = 11        error_format          = 12        error_parameter       = 13        error                 = 14        OTHERS                = 15.    IF sy-subrc <> 0 AND lt_bin[] IS INITIAL.      EXIT.    ELSE.      DATA:lv_len TYPE i,           lv_lin TYPE i.      CLEAR lv_bindata.      CLEAR lv_len.*      DESCRIBE TABLE lt_bindata LINES lv_lin.*      lv_len = lv_length.*      LOOP AT lt_bindata.*        l_str = lt_bindata-line.*        lv_len = lv_len + strlen( l_str ).*        CONCATENATE lv_bindata lt_bindata-line INTO lv_bindata IN BYTE MODE.*      ENDLOOP.      READ TABLE lt_info INTO ls_info INDEX 1.      lv_len = ls_info-comp_size.      CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'        EXPORTING          input_length = lv_len        IMPORTING          buffer       = lv_bindata        TABLES          binary_tab   = lt_bin[]        EXCEPTIONS          failed       = 1          OTHERS       = 2.*      CLEAR ev_photo.*      CALL FUNCTION 'SSFC_BASE64_ENCODE'*        EXPORTING*          bindata = lv_bindata*        IMPORTING*          b64data = ev_photo.**      REPLACE 'data:image/jpeg;base64,' IN ev_photo WITH space.**      REPLACE 'data:image/jpg;base64,' IN ev_photo WITH space.**      REPLACE*      IF ev_photo IS NOT INITIAL.*        EXIT.*      ENDIF.    ENDIF.    host =   'http://xxxxxxxxxxxxxx/balabala/upload'.    CALL METHOD cl_http_client=>create_by_url      EXPORTING        url                = host      IMPORTING        client             = client      EXCEPTIONS        argument_not_found = 1        plugin_not_active  = 2        internal_error     = 3        OTHERS             = 4.    CALL METHOD client->request->set_method( if_http_request=>co_request_method_post ).    CALL METHOD client->request->set_version( if_http_request=>co_protocol_version_1_0 ).    CALL METHOD client->request->if_http_entity~set_content_type(      EXPORTING        content_type = 'multipart/form-data' ).    CALL METHOD client->request->if_http_entity~set_formfield_encoding      EXPORTING        formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.    part = client->request->if_http_entity~add_multipart( ).    CALL METHOD part->set_header_field      EXPORTING        name  = 'content-disposition'        value = 'form-data; name="content"; filename="god.jpg";'.    CALL METHOD part->set_content_type      EXPORTING        content_type = 'application/x-jpg-compressed'.    len = xstrlen( lv_bindata ).    CALL METHOD part->set_data      EXPORTING        data   = lv_bindata        offset = 0        length = len.    CALL METHOD client->send      EXPORTING        timeout                    = 200      EXCEPTIONS        http_communication_failure = 1        http_invalid_state         = 2        http_processing_failed     = 3        OTHERS                     = 4.    IF sy-subrc NE 0.      client->get_last_error( IMPORTING message = lv_error_msg ).    ENDIF.    CALL METHOD client->receive      EXCEPTIONS        http_communication_failure = 1        http_invalid_state         = 2        http_processing_failed     = 3        OTHERS                     = 4.    IF sy-subrc NE 0.      client->get_last_error( IMPORTING message = lv_error_msg ).    ENDIF.    CLEAR:l_str.    l_str = client->response->get_cdata( ).    IF lv_error_msg IS INITIAL.      es_message = VALUE #( msgtx = 'S' msgty = 'Send is ok').    ENDIF.  ENDIF.ENDFUNCTION.

April 8, 2021 · 1 min · jiezi

关于abap:ABAP-怎么把A转换为B-的搬砖过程

Get Ascii Value A to 65Posted onFeb 07, 2017 at 08:54 AM | 266 Views Follow RSS Feed Data : LV_S type c. DATA : LV_AN TYPE i. FIELD-SYMBOLS: <fc> TYPE x. LV_S = 'A'. ASSIGN LV_S to <fc> CASTING. MOVE <fc> to LV_AN. Now get data in dubugging as , <fc> = 4100 LV_AN = 16640 Now i want lv_an = 65 ... but it is display lv_an = 16640. ...

April 2, 2021 · 1 min · jiezi

关于abap:ABAP-ZIP-压缩文件

*&---------------------------------------------------------------------**& Report ZTEST_XY_ZIP*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT ztest_xy_zip.CLASS: gcl_data_process DEFINITION DEFERRED.DATA: go_data_proc TYPE REF TO gcl_data_process.*----------------------------------------------------------------------** CLASS gcl_data_process DEFINITION*----------------------------------------------------------------------*CLASS gcl_data_process DEFINITION. PUBLIC SECTION. METHODS:* Instance class constructor constructor EXCEPTIONS ex_file_sel_err ex_file_upload,* Zip the files zip_file EXCEPTIONS ex_bin_conv_error ex_zip_error,* Download the Zip file to the PC folder download_file EXPORTING y_filesize TYPE i EXCEPTIONS ex_dwld_error. PRIVATE SECTION. TYPES: BEGIN OF ps_bin_file, name TYPE string, size TYPE i, data TYPE solix_tab, END OF ps_bin_file. DATA: pt_bindata TYPE STANDARD TABLE OF ps_bin_file, pt_filetab TYPE filetable, pv_dest_filepath TYPE string, pt_zip_bin_data TYPE STANDARD TABLE OF raw255, pv_zip_size TYPE i. METHODS:* Select the files to be zipped select_files EXCEPTIONS ex_file_sel_err,* Select the destination file save_file_dialog.ENDCLASS. "gcl_data_process DEFINITION*----------------------------------------------------------------------** CLASS gcl_data_process IMPLEMENTATION*----------------------------------------------------------------------*CLASS gcl_data_process IMPLEMENTATION. METHOD select_files. DATA: lv_ret_code TYPE i, lv_usr_axn TYPE i. cl_gui_frontend_services=>file_open_dialog( EXPORTING window_title = 'Select file' multiselection = 'X' CHANGING file_table = me->pt_filetab rc = lv_ret_code user_action = lv_usr_axn EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5 ). IF sy-subrc <> 0 OR lv_usr_axn = cl_gui_frontend_services=>action_cancel. RAISE ex_file_sel_err. ENDIF. ENDMETHOD. "select_files METHOD constructor. DATA: lwa_file TYPE file_table, lv_filename TYPE string, lwa_bindata TYPE me->ps_bin_file.* Select the files me->select_files( EXCEPTIONS ex_file_sel_err = 1 ). IF sy-subrc <> 0. RAISE ex_file_sel_err. ENDIF.* Loop on the selected files & populate the internal table LOOP AT me->pt_filetab INTO lwa_file. lv_filename = lwa_file-filename.* Upload the PDF data in binary format cl_gui_frontend_services=>gui_upload( EXPORTING filename = lv_filename filetype = 'BIN' IMPORTING filelength = lwa_bindata-size CHANGING data_tab = lwa_bindata-data EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 not_supported_by_gui = 17 error_no_gui = 18 OTHERS = 19 ). IF sy-subrc <> 0. RAISE ex_file_upload. ENDIF.* Get the filename CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH' EXPORTING full_name = lv_filename IMPORTING stripped_name = lwa_bindata-name EXCEPTIONS x_error = 1 OTHERS = 2. IF sy-subrc <> 0.* SUBRC check is not reqd. ENDIF.* Add the PDF data to the internal table APPEND lwa_bindata TO me->pt_bindata. ENDLOOP. ENDMETHOD. "constructor METHOD zip_file. DATA: lo_zip TYPE REF TO cl_abap_zip, lv_xstring TYPE xstring, lv_zip_xstring TYPE xstring. FIELD-SYMBOLS: <lwa_bindata> TYPE me->ps_bin_file. CREATE OBJECT lo_zip. "Create instance of Zip Class LOOP AT me->pt_bindata ASSIGNING <lwa_bindata>.* Convert the data from Binary format to XSTRING CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = <lwa_bindata>-size IMPORTING buffer = lv_xstring TABLES binary_tab = <lwa_bindata>-data EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. RAISE ex_bin_conv_error. ENDIF.* Add file to the zip folder lo_zip->add( name = <lwa_bindata>-name content = lv_xstring ). ENDLOOP.* Get the binary stream for ZIP file lv_zip_xstring = lo_zip->save( ).* Convert the XSTRING to Binary table CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_zip_xstring IMPORTING output_length = me->pv_zip_size TABLES binary_tab = me->pt_zip_bin_data. ENDMETHOD. "zip_file METHOD download_file. DATA: lv_dest_path TYPE string.* Get the Zip filepath me->save_file_dialog( ). CHECK me->pv_dest_filepath IS NOT INITIAL.* Download the Zip file cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = me->pv_zip_size filename = me->pv_dest_filepath filetype = 'BIN' IMPORTING filelength = y_filesize CHANGING data_tab = me->pt_zip_bin_data EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 not_supported_by_gui = 22 error_no_gui = 23 OTHERS = 24 ). IF sy-subrc <> 0. RAISE ex_dwld_error. ENDIF. ENDMETHOD. "download_file METHOD save_file_dialog. DATA: lv_filename TYPE string, lv_path TYPE string. cl_gui_frontend_services=>file_save_dialog( EXPORTING window_title = 'Select the File Save Location' file_filter = '(*.zip)|*.zip|' CHANGING filename = lv_filename path = lv_path fullpath = me->pv_dest_filepath EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4 ). IF sy-subrc <> 0.* SUBRC check is not reqd. ENDIF. ENDMETHOD. "save_file_dialogENDCLASS. "gcl_data_process IMPLEMENTATIONSTART-OF-SELECTION.* Get the local instance of file processing class CREATE OBJECT go_data_proc EXCEPTIONS ex_file_sel_err = 1 ex_file_upload = 2. IF sy-subrc <> 0. MESSAGE 'Error Uploading files' TYPE 'I'. LEAVE LIST-PROCESSING. ENDIF.* Add the selected files to the ZIP folder go_data_proc->zip_file( EXCEPTIONS ex_bin_conv_error = 1 ex_zip_error = 2 ). IF sy-subrc <> 0. MESSAGE 'Error Zipping the files' TYPE 'I'. LEAVE LIST-PROCESSING. ENDIF.END-OF-SELECTION. DATA: gv_filesize TYPE i.* Download the file to the selected folder go_data_proc->download_file( IMPORTING y_filesize = gv_filesize EXCEPTIONS ex_dwld_error = 1 ). IF sy-subrc <> 0. MESSAGE 'Error downloading the Zip file' TYPE 'E'. ELSE. MESSAGE s000(ykg_test) WITH gv_filesize 'bytes downloaded'(001). ENDIF.

April 2, 2021 · 4 min · jiezi

关于abap:ABAP-动态内表实现方式-灵活运用

FORM frm_create_compose_dymic_tab USING ev_error ev_message TYPE bapi_msg. DATA l_line TYPE char10. DATA: lo_elemt TYPE REF TO cl_abap_elemdescr, lt_comp TYPE cl_abap_structdescr=>component_table, ls_comp LIKE LINE OF lt_comp. DATA:lr_dref TYPE REF TO data, lo_descr TYPE REF TO cl_abap_structdescr, l_string TYPE string. DATA: lo_struc TYPE REF TO cl_abap_structdescr, lo_table TYPE REF TO cl_abap_tabledescr, lo_type TYPE REF TO cl_abap_typedescr, lo_line TYPE REF TO data, lo_itab TYPE REF TO data. DATA(lv_tabname) = '/BIC/AZO_BCD1100'. CREATE DATA lr_dref TYPE (lv_tabname). ASSIGN lr_dref->* TO FIELD-SYMBOL(<fs_data>). lo_descr ?= cl_abap_typedescr=>describe_by_data( <fs_data> ). DATA(lt_fields) = lo_descr->get_ddic_field_list( p_langu = sy-langu p_including_substructres = abap_true ). LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fs_fields>). IF <fs_fields>-fieldname = 'FISCYEAR' OR <fs_fields>-fieldname = 'FISCPER3' OR <fs_fields>-fieldname = 'FISCVARNT' OR <fs_fields>-fieldname = '/BIC/ZBPC_GUID' OR <fs_fields>-fieldname = 'RECORDMODE' OR <fs_fields>-fieldname = '/BIC/ZBPC_NO' OR <fs_fields>-fieldname = 'CURRENCY'. CONTINUE. ELSEIF <fs_fields>-fieldname = '/BIC/ZBPC_TK32'. CONCATENATE <fs_fields>-tabname '-' <fs_fields>-fieldname INTO l_string. ls_comp-name = <fs_fields>-fieldname. CALL METHOD cl_abap_datadescr=>describe_by_name EXPORTING p_name = l_string RECEIVING p_descr_ref = lo_type EXCEPTIONS type_not_found = 1 OTHERS = 2. ls_comp-type ?= lo_type. APPEND ls_comp TO lt_comp. CLEAR ls_comp.* ls_comp-name = <fs_fields>-fieldname. CONCATENATE <fs_fields>-fieldname '1' INTO ls_comp-name. ls_comp-type ?= cl_abap_elemdescr=>get_c( p_length = 20 ). APPEND ls_comp TO lt_comp. CLEAR ls_comp. CONTINUE. ENDIF. CONCATENATE <fs_fields>-tabname '-' <fs_fields>-fieldname INTO l_string. ls_comp-name = <fs_fields>-fieldname. CALL METHOD cl_abap_datadescr=>describe_by_name EXPORTING p_name = l_string RECEIVING p_descr_ref = lo_type EXCEPTIONS type_not_found = 1 OTHERS = 2. ls_comp-type ?= lo_type. APPEND ls_comp TO lt_comp. CLEAR ls_comp. ENDLOOP. IF lt_comp[] IS INITIAL. ev_error = 'E'. ev_message = '没有保护请查看输出表头'. ELSE. TRY. lo_struc = cl_abap_structdescr=>create( lt_comp ). CATCH cx_sy_struct_attributes . ENDTRY.**** end*Generate table type dynamically TRY. CALL METHOD cl_abap_tabledescr=>create EXPORTING p_line_type = lo_struc p_table_kind = 'S' p_key_kind = 'D' RECEIVING p_result = lo_table. CATCH cx_sy_table_creation . ENDTRY.*Generate internal table via the dynamic table type CREATE DATA lo_itab TYPE HANDLE lo_table. ASSIGN lo_itab->* TO <fs_itab>.*Generate work area CREATE DATA lo_line TYPE HANDLE lo_struc. ASSIGN lo_line->* TO <fs_wa>. ENDIF.ENDFORM.

April 1, 2021 · 2 min · jiezi