Purchase Document Open Interface PDOI

本文详细介绍了Oracle EBS中PO模块的接口表及其应用,包括PO_HEADERS_INTERFACE、PO_LINES_INTERFACE和PO_DISTRIBUTIONS_INTERFACE等关键表的使用方法,以及如何通过运行Concurrent Program: Import Standard Purchase Orders将接口表数据导入采购订单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               
PO模块也有自己的接口表,多用于把其他业务系统在Oracle EBS系统生成采购订单记录。


Table NameDescriptionType
PO_HEADERS_INTERFACEThis is the table where to insert PO headers data in interface table.Interface table
PO_LINES_INTERFACEThis is where we insert PO lines information to be imported ( it is used also for Shipments details )Interface table
PO_DISTRIBUTIONS_INTERFACEThis is where we insert PO distribution details before importInterface table
PO_INTERFACE_ERRORSStores all errors resulted from import process.Errors table
PO_HEADERS_ALLStores document headers for purchase orders, purchase agreements,quotations, and RFQsPO Base table
PO_LINES_ALLStores purchase document lines for purchase orders, purchase agreements, quotations, and RFQsPO Base table
PO_LINE_LOCATIONS_ALLStores document shipment schedules for purchase orders, purchase agreements, quotations, and RFQsPO Base table
PO_DISTRIBUTIONS_ALLStores purchase order distributionsPO Base table
下边是主要的三张PO接口表,用于记录订单头,行,Shipments以及Distributions信息
  •     PO_HEADERS_INTERFACE
  •     PO_LINES_INTERFACE
  •     PO_DISTRIBUTIONS_INTERFACE
接口表的查询语句
  • Select * from PO_HEADERS_INTERFACE where INTERFACE_HEADER_ID=&headerid;
  • Select * from PO_LINES_INTERFACE where INTERFACE_HEADER_ID=&headerid;
  • Select * from PO_DISTRIBUTIONS_INTERFACE where INTERFACE_HEADER_ID=&headerid;
R12还引入了另外一张Interface表,PO_LINE_LOCATIONS_INTERFACE,这张表其实暂时还用不到,还只是Oracle标准产品内部使用,但因为名称上很容易让人误解,所以这里提一下。

Table Name

Feature Area

PO_LINE_LOCATIONS_INTERFACE

This table is intended for internal use only.
This is the interface table for price breaks and standard PO shipments. You should not populate these tables rather PO_LINES_INTERFACE as before. PDOI internally pushes records to this interface table for processing.


数据插入到接口表后,需要运行Concurrent Program:Import Standard Purchase Orders,用于把接口表导入到采购订单相关表。

Concurrent Program参数:
Default Buyer(Optional):
Enter the default buyer name to be associated with the incoming documents that are not assigned to a buyer..
If a default buyer is not specified and the imported purchase order also does not have buyer information, the program will use the normal Purchasing defaulting mechanism to generate buyer information. If the buyer name provided in the interface is not valid, then the record will error out and the default buyer name will not be supplemented.

Create or Update Item (Required)
The valid response is Yes or No. If Yes, the program will also create items in the item master from those buyer part numbers in the interface data where there is no corresponding item master entry. If No, the program will not create new item master entries.

Approval Status
有三个可选值,APPROVED,INCOMPLETE,INITIATE APPROVAL.

关于这个字段Purchasing User Guide中有清楚的说明,接口表中Status字段 + 这个Concurrent Program的Approval Status共同决定最终PO的状态。
Document Status in Interface TableConcurrent Program Approval Status ParameterResulting Document Status
NullINCOMPLETEINCOMPLETE
NullAPPROVEDAPPROVED
NullINITIATE APPROVALINITIATE APPROVAL
INCOMPLETEINCOMPLETEINCOMPLETE
INCOMPLETEAPPROVEDINCOMPLETE
INCOMPLETEINITIATE APPROVALINITIATE APPROVAL
APPROVEDINCOMPLETEAPPROVED
APPROVEDAPPROVEDAPPROVED
APPROVEDINITIATE APPROVALAPPROVED

You can import Standard purchase orders with an INCOMPLETE status and then automatically initiate the PO Approval Workflow for these imported documents. Specifying a status of Incomplete or leaving the status Null in the interface data, and specifying a value of Initiate Approval for the Approval Status runtime parameter can achieve this.

Standard purchase orders can also be imported with an APPROVED status. Specifying a status of Approved in the interface data or leaving the status Null in the interface data, and specifying a value of Approved for the Approval Status runtime parameter can achieve this. The PO Approval Workflow is not initiated.

Batch ID (Optional)
Enter a valid batch ID, that is a unique identifier for the group of documents in this submission. If you don't enter a Batch ID, one is generated for you when the process runs.

Import Standard Purchase Orders对应的后台程序为SQL*Plus类型的POXPDOI


订单Import Program的后台逻辑
1.首先从PO_HEADERS_INTERFACE处理一条记录
2.根据INTERFACE_HEADER_ID,再处理行接口记录PO_LINES_INTERFACE,以及 PO_DISTRIBUTIONS_INTERFACE。都处理完之后,又从PO_HEADERS_INTERFACE表中Pick下一个订单头数据。
  • In between , If the program gets an error while processing a record, the program writes the error details to the PO_INTERFACE_ERRORS table and increments the record's error counter.
  • Therefore, the Purchasing Documents Open Interface saves or errors out on a line-byline basis.
  • This means that if an error is found in a document line, only that line is rolled back (not submitted to Purchasing), and we will be able to find the error in the PO_INTERFACE_ERRORS table.
  • You should be aware , because the Purchasing Documents Open Interface can accept partial documents as it saves or errors out line by line.
  • If an error is found in a header, none of its lines are processed.
  • The Purchasing Documents Open Interface rolls back the header, does not process its lines, and does the following:
    • Sets the PROCESS_CODE column value to REJECTED in the PO_HEADERS_INTERFACE table.
    • Writes out the record identification number and the details of the error to the PO_INTERFACE_ERRORS table.
    • Begins processing the next header record.
  • If no processing errors are found during processing, the header record and all successfully submitted child records are loaded into Purchasing, and then flagged as processed by setting the PROCESS_CODE column to ACCEPTED.

As mention earlier, To check for records in error, the Purchasing Interface Errors Report can be run to provide information as to the cause of the error.

Diagnose Problems With Importing Standard Purchase Orders
如果Import Standard Purchase Orders运行后报错,可使用Purchasing Interface Errors Report来查错,这个Report实际上就是PO_INTERFACE_ERRORS里的内容。

如果订单没有导入成功,可以使用下边的SQL查看错误信息,
Select * from PO_INTERFACE_ERRORS where interface_type = 'PO_DOCS_OPEN_INTERFACE' order by creation_date desc;

TRACING
To trace the Import Standard Purchase Orders program from 11.5.10 onwards, do the following :
1 - Navigate to System Administrator responsibility
2 - Navigate to Profiles->System
3 - Query the Profile Option Concurrent: Allow Debugging and set it to Yes at User level
4 - Navigate to Purchasing responsibility
5 - From the Requests form, choose the Import Standard Purchase Orders program and set the required Parameters
6 - Click the Debug button
7 - Check the SQL Trace checkbox and specify Trace with Binds and Waits
8 - Submit the Concurrent program
9 - Retrieve the trace file created.

LOGGING
In order to create a FND Debug Log for the Import Standard Purchase Orders program, the following steps need to be followed :
1 - Using a SQL client run the following query and Note down this log_seq. :
select max(log_sequence) from fnd_log_messages;
2 - Set the following profiles at the user level:
FND: Debug Log Enabled = YES
FND: Debug Log Filename = NULL
FND: Debug Log Level = STATEMENT
FND: Debug Log Module = %
3 - Run Import Standard Purchase Orders program
4. Using a SQL client run the following query :
    Select * from fnd_log_messages
    where log_sequence > &log_seq_noted_above
    order by log_sequence
The output of this query can indicate errors that were encountered during the Import Standard Purchase Orders program.
 
Key Fields in Interface Tables
PO_HEADERS_INTERFACE
PROCESS_CODE: Set it to PENDING. After processing it shows as ACCEPTED, REJECTED or NOTIFIED.
如果订单头出错,那么Program不会处理订单行中的内容,订单头接口表中PROCESS_CODE字段会被设置为REJECTED,如果没错则PROCESS_CODE字段为ACCEPTED
For blanket purchase agreements and standard purchase orders only, when the supplier sends an updated price/sales catalog, the Purchasing Documents Open Interface sets the PROCESS_CODE column to NOTIFIED for those lines with prices that exceed your price tolerance. For these price updates only, the Purchasing Documents Open Interface waits for you to accept or reject the price increase in the Exceeded Price Tolerances window before completing or rejecting the price change. 

ACTION: ORIGINAL, REPLACE or UPDATE.
      ORIGINAL: Original is one in which all information is new in your system.
      REPLACE: Replaces already-created blanket purchase agreements or catalog quotations with new documents containing the new information. First, it looks for documents that have same document type
                    (DOCUMENT_TYPE_CODE), supplier (VENDOR_ID)  and supplier document number (VENDOR_DOC_ NUM) with the existing supplier document number (VENDOR_ORDER _NUM) as the replacement document
      UPDATE: Updates Unit Price, Item Description, UOM, Price Breaks, Expiration Date
For More Fields Descrption,Check This Blog

DOCUMENT_TYPE_CODE:  STANDARD, BLANKET , QUOTATION

Interface Scripts Examples
a - PO with a single line :
INSERT INTO po.po_headers_interface(interface_header_id,batch_id,process_code,action,org_id,document_type_code,currency_code,agent_id,vendor_name,vendor_site_code,ship_to_location,bill_to_location,reference_num)VALUES(apps.po_headers_interface_s.NEXTVAL,1,'PENDING','ORIGINAL'--  Indicates this is a new document204, -- Org id for operating unit Vision Operations'STANDARD'-- Indicates a standard PO is being imported'USD', -- The currency to be used in the PO57, -- The ID of the buyer'Office Supplies, Inc.'-- Supplier name'OFFICESUPPLIES'--  Supplier Site'V1- New York City', -- Ship to location name'V1- New York City', -- Bill to location name'TestPO'); -- Reference that can be tied to the imported POINSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location)VALUES(po_lines_interface_s.nextval,po_headers_interface_s.currval,1,1,'Goods','CM96713'-- Item to imported on the PO line'Ea'-- Unit of Measure1,50--  Line price in specified currency'V1'--  Inventory Organization which will receive the shipment'V1- New York City' );  --  Ship to location namecommit;

b - PO with one line and one distribution :
INSERT INTO po.po_headers_interface(interface_header_id,batch_id,process_code,action,org_id,document_type_code,currency_code,agent_id,vendor_name,vendor_site_code,ship_to_location,bill_to_location,reference_num)VALUES(apps.po_headers_interface_s.NEXTVAL,2,'PENDING','ORIGINAL',204,'STANDARD','USD',57, -- Your buyer id'Office Supplies, Inc.','OFFICESUPPLIES','V1- New York City','V1- New York City','TestPO');INSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location)VALUES(po_lines_interface_s.nextval,po_headers_interface_s.currval,1,1,'Goods','CM96713','Ea',1,50,'V1','V1- New York City' );INSERT INTO po.po_distributions_interface(interface_header_id,interface_line_id,interface_distribution_id,distribution_num,quantity_ordered,charge_account_id)VALUES(po_headers_interface_s.currval,po.po_lines_interface_s.CURRVAL,po.po_distributions_interface_s.NEXTVAL,1,1,12975); -- Code Combination ID for the Charge Account to be used on the Distributioncommit;

c - PO with two lines :
INSERT INTO po.po_headers_interface(interface_header_id,batch_id,process_code,action,org_id,document_type_code,currency_code,agent_id,vendor_name,vendor_site_code,ship_to_location,bill_to_location,reference_num)VALUES(apps.po_headers_interface_s.NEXTVAL,3,'PENDING','ORIGINAL',204,'STANDARD','USD',57,'Office Supplies, Inc.','OFFICESUPPLIES','V1- New York City','V1- New York City','TestPO');INSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location)VALUES(po_lines_interface_s.nextval,po_headers_interface_s.currval,1,1,'Goods','CM96713','Ea',1,50,'V1','V1- New York City' );INSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location)VALUES(po_lines_interface_s.nextval,po_headers_interface_s.currval,2,1,'Goods','CM96713','Ea',1,80,'V1','V1- New York City' );commit;

d - PO with one line and two shipments :
INSERT INTO po.po_headers_interface(interface_header_id,batch_id,process_code,action,org_id,document_type_code,currency_code,agent_id,vendor_name,vendor_site_code,ship_to_location,bill_to_location,reference_num)VALUES(apps.po_headers_interface_s.NEXTVAL,4,'PENDING','ORIGINAL',204,'STANDARD','USD',57,'Office Supplies, Inc.','OFFICESUPPLIES','V1- New York City','V1- New York City','TestPO');INSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location,promised_date)VALUES(po_lines_interface_s.nextval,po_headers_interface_s.currval,1,1,'Goods','CM96713','Ea',1,50,'V1','V1- New York City',sysdate+1);INSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location,promised_date)VALUES(apps.po_lines_interface_s.NEXTVAL,apps.po_headers_interface_s.CURRVAL,1,2,'Goods','CM96713','Ea',2,50,'V1','V1- New York City',sysdate+5);commit;

e - PO with one line, one shipment and two distributions :
INSERT INTO po.po_headers_interface(interface_header_id,batch_id,process_code,action,org_id,document_type_code,currency_code,agent_id,vendor_name,vendor_site_code,ship_to_location,bill_to_location,reference_num)VALUES(apps.po_headers_interface_s.NEXTVAL,5,'PENDING','ORIGINAL',204,'STANDARD','USD',57,'Office Supplies, Inc.','OFFICESUPPLIES','V1- New York City','V1- New York City','TestPO');INSERT INTO po.po_lines_interface(interface_line_id,interface_header_id,line_num,shipment_num,line_type,item,uom_code,quantity,unit_price,ship_to_organization_code,ship_to_location,promised_date)VALUES(po_lines_interface_s.nextval,po_headers_interface_s.currval,1,1,'Goods','CM96713','Ea',5,50,'V1','V1- New York City',sysdate+1);INSERT INTO po.po_distributions_interface(interface_header_id,interface_line_id,interface_distribution_id,distribution_num,quantity_ordered,charge_account_id)VALUES(po_headers_interface_s.currval,po.po_lines_interface_s.CURRVAL,po.po_distributions_interface_s.NEXTVAL,1,1,12975);INSERT INTO po.po_distributions_interface(interface_header_id,interface_line_id,interface_distribution_id,distribution_num,quantity_ordered,charge_account_id)VALUES(po_headers_interface_s.currval,po.po_lines_interface_s.CURRVAL,po.po_distributions_interface_s.NEXTVAL,2,4,12976);commit

推荐阅读

转载请注明出处:http://blog.youkuaiyun.com/pan_tian/article/details/12202365
           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
代码开发 1)先调用smartform函数获取OTF格式数据 2)后调用函数CONVERT_OTF转换成PDF格式数据 3)再调用GUI_DOWNLOAD函数下载并邮件发送给采购员 ,涉及表 *&---------------------------------------------------------------------* *& 包含 ZNMMX037FA *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_GET_DATA . *modify by songjiaru 20200519 SQL 性能优化 及 更改收件人邮箱取数逻辑 这里默认的是一个PO 只会存在一个工厂的数据 *不然没办法按照采购部的供应商+采购组织+工厂取ZNMMT037A来取数了 SELECT EKKO~EBELN , EKKO~BEDAT , EKKO~EKGRP , EKKO~LIFNR , EKKO~BUKRS , NAST~SPRAS , EKKO~EKORG , EKPO~WERKS INTO CORRESPONDING FIELDS OF TABLE @GT_DATA FROM EKKO INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN JOIN NAST ON NAST~OBJKY = EKKO~EBELN WHERE EKKO~EBELN IN @S_EBELN AND EKKO~LIFNR IN @S_LIFNR AND EKKO~EKORG IN @S_EKORG AND EKKO~EKGRP IN @S_EKGRP AND EKKO~BSART IN @S_BSART AND EKKO~BEDAT IN @S_BEDAT AND EKPO~WERKS IN @S_WERKS1 AND EKKO~FRGKE = '7' AND NAST~SPRAS IN @S_SPRAS. SORT GT_DATA BY EBELN. DELETE ADJACENT DUPLICATES FROM GT_DATA COMPARING EBELN. * LOOP AT GT_DATA INTO GS_DATA . * SELECT SINGLE * FROM ZNMMT037 * WHERE EBELN = GS_DATA-EBELN. * IF SY-SUBRC = 0. * IF CK_WFS = 'X'. * DELETE GT_DATA. * CONTINUE. * ENDIF. * GS_DATA-ICON = '@08@'. * GS_DATA-MESSAGE = '已有发送记录'. * GS_DATA-ERDAT = ZNMMT037-ERDAT. * ENDIF. * * SELECT SINGLE NAME1 MCOD1 ADRNR * INTO (GS_DATA-NAME1,GS_DATA-MCOD1,GS_DATA-ADRNR) * FROM LFA1 * WHERE LIFNR = GS_DATA-LIFNR. * * READ TABLE GT_MAIL INTO GS_MAIL WITH KEY ADRNR = GS_DATA-ADRNR BINARY SEARCH. * IF SY-SUBRC NE 0. * SELECT ADDRNUMBER SMTP_ADDR APPENDING TABLE GT_MAIL * FROM ADR6 * WHERE ADDRNUMBER = GS_DATA-ADRNR. * SORT GT_MAIL BY ADRNR. * ENDIF. * * LOOP AT GT_MAIL INTO GS_MAIL WHERE ADRNR = GS_DATA-ADRNR. * IF GS_DATA-SMTP_ADDR IS INITIAL. * GS_DATA-SMTP_ADDR = GS_MAIL-SMTP_ADDR. * ELSE. * GS_DATA-SMTP_ADDR = GS_DATA-SMTP_ADDR && ';' && GS_MAIL-SMTP_ADDR. * ENDIF. * ENDLOOP. * * MODIFY GT_DATA FROM GS_DATA. * ENDLOOP. DATA : LV_TABIX LIKE SY-TABIX. IF GT_DATA IS INITIAL. MESSAGE S322(ZMM) DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. SELECT * FROM ZNMMT037 FOR ALL ENTRIES IN @GT_DATA WHERE ZNMMT037~EBELN = @GT_DATA-EBELN INTO TABLE @DATA(LT_ZNMMT037). SORT LT_ZNMMT037 BY EBELN. DATA : LS_ZNMMT037 LIKE LINE OF LT_ZNMMT037. SELECT LFA1~LIFNR , LFA1~NAME1 , LFA1~MCOD1 FROM LFA1 WHERE LFA1~LIFNR IN @S_LIFNR INTO TABLE @DATA(LT_LFA1). SORT LT_LFA1 BY LIFNR. DATA : LS_LFA1 LIKE LINE OF LT_LFA1. SELECT ZNMMT037A~LIFNR , ZNMMT037A~EKORG , ZNMMT037A~WERKS ,ZNMMT037A~EKGRP,ZNMMT037A~EMAIL FROM ZNMMT037A FOR ALL ENTRIES IN @GT_DATA WHERE ZNMMT037A~LIFNR = @GT_DATA-LIFNR AND ZNMMT037A~EKORG = @GT_DATA-EKORG INTO TABLE @DATA(LT_ZNMMT037A) . SORT LT_ZNMMT037A BY LIFNR EKORG WERKS EKGRP . DATA : LS_ZNMMT037A LIKE LINE OF LT_ZNMMT037A. LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<LFS_DATA>). *------------填充发送记录---------------* CLEAR LS_ZNMMT037. READ TABLE LT_ZNMMT037 INTO LS_ZNMMT037 WITH KEY EBELN = <LFS_DATA>-EBELN BINARY SEARCH. IF SY-SUBRC = 0. IF CK_WFS = 'X'. <LFS_DATA>-FLAG = 'X'. CONTINUE. ENDIF. <LFS_DATA>-ICON = '@08@'. <LFS_DATA>-MESSAGE = TEXT-002. <LFS_DATA>-ERDAT = LS_ZNMMT037-ERDAT. ENDIF. *-----------填充供应商信息名字等等--------* CLEAR LS_LFA1. READ TABLE LT_LFA1 INTO LS_LFA1 WITH KEY LIFNR = <LFS_DATA>-LIFNR BINARY SEARCH. IF SY-SUBRC = 0. <LFS_DATA>-NAME1 = LS_LFA1-NAME1. <LFS_DATA>-MCOD1 = LS_LFA1-MCOD1. ENDIF. *--------填充供应商对应的邮件地址---------* *先根据供应商采购组织工厂采购员找,再根据供应商采购组织工厂找,如果找不到,就根据供应商采购组织找 CLEAR LS_ZNMMT037A. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = <LFS_DATA>-WERKS EKGRP = <LFS_DATA>-EKGRP BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = <LFS_DATA>-WERKS AND LS_ZNMMT037A-EKGRP = <LFS_DATA>-EKGRP. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ELSE. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = <LFS_DATA>-WERKS BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = <LFS_DATA>-WERKS. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ELSE. CLEAR LS_ZNMMT037A. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = '' BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = ''. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ENDIF. ENDIF. ENDIF. ENDLOOP. *end modify ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_OUTPUT_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_OUTPUT_DATA . DEFINE MAC_FCAT. CLEAR gs_fcat. gs_fcat-fieldname = &1. gs_fcat-coltext = &2. gs_fcat-key = &3. gs_fcat-ref_field = &4. gs_fcat-ref_table = &5. gs_fcat-just = &6. * IF &6 = 'R'. * gs_fcat-no_zero = 'X'. * ENDIF. if &1 = 'ICON'. gs_fcat-icon = 'X'. endif. APPEND gs_fcat TO gt_fcat. END-OF-DEFINITION. CLEAR GT_FCAT. IF SY-LANGU EQ '1'. MAC_FCAT 'EBELN' '采购订单号' '' 'EBELN' 'EKKO' ''. MAC_FCAT 'LIFNR' '供应商' '' 'LIFNR' 'LFA1' ''.. MAC_FCAT 'NAME1' '供应商名称' '' '' '' ''.. MAC_FCAT 'BEDAT' '凭证日期' ' ' '' '' ''. MAC_FCAT 'EKGRP' '采购组' ' ' '' '' ''. MAC_FCAT 'MCOD1' '简称' ' ' '' '' ''. MAC_FCAT 'SPRAS' '语言' ' ' 'SPRAS' 'NAST' ''. MAC_FCAT 'SMTP_ADDR' '供应商邮件' ' ' '' '' ''. MAC_FCAT 'ICON' '发送状态' ' ' '' '' ''. MAC_FCAT 'ERDAT' '发送日期' ' ' '' '' ''. MAC_FCAT 'MESSAGE' '消息' ' ' '' '' ''. ELSE. MAC_FCAT 'EBELN' 'PO' '' 'EBELN' 'EKKO' ''. MAC_FCAT 'LIFNR' 'Supplier' '' 'LIFNR' 'LFA1' ''.. MAC_FCAT 'NAME1' 'Supplier Name' '' '' '' ''.. MAC_FCAT 'BEDAT' 'Date' ' ' '' '' ''. MAC_FCAT 'EKGRP' 'Purchase Group' ' ' '' '' ''. MAC_FCAT 'MCOD1' 'Name For Short' ' ' '' '' ''. MAC_FCAT 'SPRAS' 'Language' ' ' 'SPRAS' 'NAST' ''. MAC_FCAT 'SMTP_ADDR' 'Email' ' ' '' '' ''. MAC_FCAT 'ICON' 'Status' ' ' '' '' ''. MAC_FCAT 'ERDAT' 'Send Date' ' ' '' '' ''. MAC_FCAT 'MESSAGE' 'Message' ' ' '' '' ''. ENDIF. GS_LAYOUT-ZEBRA = 'X'. GS_LAYOUT-CWIDTH_OPT = 'X'. GS_LAYOUT-BOX_FNAME = 'BOX'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = SY-REPID IS_LAYOUT_LVC = GS_LAYOUT IT_FIELDCAT_LVC = GT_FCAT I_SAVE = 'U' I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' TABLES T_OUTTAB = GT_DATA EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. DATA:LV_ANSWER TYPE C. DATA LR_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA : LV_CLSS TYPE C . "X 代表发送给供应商和采购员 ''代表发送给采购员 CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' " IMPORTING E_GRID = LR_GRID. CALL METHOD LR_GRID->CHECK_CHANGED_DATA. CASE R_UCOMM. WHEN 'EMAIL'. "保存事件 LV_CLSS = 'X'. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X' AND ICON NE '@08@'. IF GS_DATA-SMTP_ADDR IS NOT INITIAL. PERFORM FRM_SEND_MAIL USING GS_DATA-EBELN GS_DATA-SPRAS GS_DATA-EKGRP GS_DATA-MCOD1 GS_DATA-BUKRS GS_DATA-SMTP_ADDR LV_CLSS CHANGING GS_DATA-ICON GS_DATA-MESSAGE GS_DATA-ERDAT. ELSE. GS_DATA-ICON = '@0A@'. GS_DATA-MESSAGE = TEXT-003 ." ENDIF. MODIFY GT_DATA FROM GS_DATA. ENDLOOP. *ADD BY SONGJIARU 20200519 增加只发送给采购员 WHEN 'EMAIL1'. LV_CLSS = ''. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X' AND ICON NE '@08@'. * IF GS_DATA-SMTP_ADDR IS NOT INITIAL. PERFORM FRM_SEND_MAIL USING GS_DATA-EBELN GS_DATA-SPRAS GS_DATA-EKGRP GS_DATA-MCOD1 * GS_DATA-ADRNR GS_DATA-BUKRS GS_DATA-SMTP_ADDR LV_CLSS CHANGING GS_DATA-ICON GS_DATA-MESSAGE GS_DATA-ERDAT. * ELSE. * GS_DATA-ICON = '@0A@'. * GS_DATA-MESSAGE = '邮件为空,不能发送' ." * ENDIF. MODIFY GT_DATA FROM GS_DATA. ENDLOOP. WHEN 'DOWN'. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X'. PERFORM FRM_DOWN_PDF USING GS_DATA-EBELN GS_DATA-SPRAS. ENDLOOP. WHEN '&IC1'. IF RS_SELFIELD-FIELDNAME = 'EBELN'. READ TABLE GT_DATA INTO GS_DATA INDEX RS_SELFIELD-TABINDEX. IF SY-SUBRC = 0. SET PARAMETER ID 'BES' FIELD GS_DATA-EBELN. CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN. ENDIF. ENDIF. WHEN OTHERS. ENDCASE. RS_SELFIELD-REFRESH = 'X'."刷新ALV报表 RS_SELFIELD-COL_STABLE = 'X'. RS_SELFIELD-ROW_STABLE = 'X'. ENDFORM. "FRM_USER_COMMAND *&---------------------------------------------------------------------* *& Form frm_set_pf_status2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->RT_EXTAB text *----------------------------------------------------------------------* FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'PF_STATUS'. ENDFORM. "FRM_SET_PF_STATUS *&---------------------------------------------------------------------* *& Form FRM_SEND_MAIL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> GS_DATA_EBELN *& --> GS_DATA_SPRAS *& <-- GS_DATA_ICON *& <-- GS_DATA_MESSAGE *& <-- ELSE *&---------------------------------------------------------------------* FORM FRM_SEND_MAIL USING P_EBELN P_SPRAS P_EKGRP P_MCOD1 P_BUKRS P_EMAIL P_CLSS CHANGING P_ICON P_MESSAGE P_ERDAT. DATA:LS_ZT37 LIKE ZNMMT037. DATA:LV_BUTXT LIKE T001-BUTXT. DATA:LT_CONTENT_BIN TYPE SOLIX_TAB. DATA: CL_SEND_REQUEST TYPE REF TO CL_BCS, CL_DOCUMENT TYPE REF TO CL_DOCUMENT_BCS, CL_BCS_EXCEPTION TYPE REF TO CX_BCS, CL_SENDER TYPE REF TO IF_SENDER_BCS, CL_RECIPIENT TYPE REF TO IF_RECIPIENT_BCS. DATA: LT_MAIN_TEXT TYPE BCSY_TEXT, LS_MAIN_TEXT LIKE LINE OF LT_MAIN_TEXT, LV_TITLE TYPE SO_OBJ_DES, LV_BOOL TYPE OS_BOOLEAN. DATA:LV_PATH TYPE STRING. DATA:LT_BIN TYPE TABLE OF TBL1024. DATA LV_CONTENT TYPE XSTRING. DATA LV_VLINE TYPE I. DATA : BEGIN OF LS_RECIEVE, EMAIL TYPE AD_SMTPADR, END OF LS_RECIEVE. DATA : LT_RECIEVE LIKE TABLE OF LS_RECIEVE. DATA : LV_INDEX1 TYPE I. DATA : LV_INDEX2 TYPE I. DATA : LV_INDEX3 TYPE I. LV_PATH = 'C:\PO\' && P_EBELN && '_' && SY-UZEIT && '.PDF'. PERFORM FRM_GET_PDF USING P_EBELN P_SPRAS LV_PATH CHANGING P_ICON P_MESSAGE. IF P_ICON IS INITIAL. CALL FUNCTION 'GUI_UPLOAD' EXPORTING FILENAME = LV_PATH FILETYPE = 'BIN' IMPORTING FILELENGTH = LV_VLINE TABLES DATA_TAB = LT_BIN[]. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING INPUT_LENGTH = LV_VLINE IMPORTING BUFFER = LV_CONTENT TABLES BINARY_TAB = LT_BIN EXCEPTIONS FAILED = 1 OTHERS = 2. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING BUFFER = LV_CONTENT IMPORTING OUTPUT_LENGTH = LV_VLINE TABLES BINARY_TAB = LT_CONTENT_BIN. TRY. * 创建发送请求 CL_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ). SELECT SINGLE BUTXT INTO LV_BUTXT FROM T001 WHERE BUKRS = P_BUKRS. **处理标题头内容 CONCATENATE LV_BUTXT P_EBELN P_MCOD1 P_EKGRP INTO LV_TITLE SEPARATED BY SPACE. **处理邮件内容 *DG01 要求加上客制化描述 * IF P_BUKRS EQ 'DG01'. * IF SY-LANGU EQ '1'. * LS_MAIN_TEXT = * '附件是东莞长城开发新订单,请收到订单后邮件回复确认给采购员,并于3个工作日内在供应商平台上确认订单交期。供应商平台网址:https://sp.kaifa.cn '. * ELSE. * DATA(LV_STR) = 'The attachment is the new PO of Dongguan Kaifa Technology Co.,Ltd,' * && 'Please reply to the buyer after receiving the PO, and confirm the order delivery date on the supplier portal within 3 working days.' * && 'Supplier portal website(URL): https://sp.kaifa.cn '. * LS_MAIN_TEXT = LV_STR. * ENDIF. * APPEND LS_MAIN_TEXT TO LT_MAIN_TEXT. * ENDIF. * 创建整理发送内容 CL_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT( I_TYPE = 'RAW' I_TEXT = LT_MAIN_TEXT I_SUBJECT = LV_TITLE ). * 添加附件 DATA:L_OBJTP TYPE SOODK-OBJTP. DATA:L_OBJDES TYPE SOOD-OBJDES. L_OBJTP = 'PDF'. * l_objdes = p_ebeln && p_mcod1. CONCATENATE LV_BUTXT P_EBELN P_MCOD1 P_EKGRP INTO L_OBJDES SEPARATED BY SPACE. CALL METHOD CL_DOCUMENT->ADD_ATTACHMENT EXPORTING I_ATTACHMENT_TYPE = L_OBJTP I_ATTACHMENT_SUBJECT = L_OBJDES I_ATT_CONTENT_HEX = LT_CONTENT_BIN. * 添加邮件内容到发送请求 CL_SEND_REQUEST->SET_DOCUMENT( CL_DOCUMENT ). * 指定邮件发件人为采购员邮箱 * data:lv_sendtype type SX_ADDRTYP value '*', * lv_address_string type string value 'yuli@kaifa.cn', * lv_address_name type string value 'Yuli'. * cl_sender->ADDRESS_TYPE( lv_sendtype ). * cl_sender->ADDRESS_STRING( EXPORTING result = lv_address_string ). * cl_sender->ADDRESS_NAME( EXPORTING result = lv_address_name ). * cl_send_request->set_sender( cl_sender ). * data: sender type ref to cl_sapuser_bcs, * lv_uname type sy-uname value 'DTANG.IS'. * sender = cl_sapuser_bcs=>create( lv_uname ). * call method cl_send_request->set_sender * exporting * i_sender = sender. *modify by songjiaru 20200519 *----------------指定发件人----------------------------* CLEAR GS_MAIL-SMTP_ADDR. SELECT SINGLE SMTP_ADDR INTO GS_MAIL-SMTP_ADDR FROM T024 WHERE EKGRP = P_EKGRP. DATA(LO_SENDER) = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS_STRING = GS_MAIL-SMTP_ADDR I_ADDRESS_NAME = GS_MAIL-SMTP_ADDR ). CALL METHOD CL_SEND_REQUEST->SET_SENDER EXPORTING I_SENDER = LO_SENDER. * "指定邮件接收人 * LOOP AT GT_MAIL INTO GS_MAIL WHERE ADRNR = P_ADRNR. * CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( GS_MAIL-SMTP_ADDR ). * CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). * ENDLOOP. IF GS_MAIL-SMTP_ADDR IS NOT INITIAL. CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( GS_MAIL-SMTP_ADDR ). CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). ENDIF. IF P_CLSS = 'X'. * CLEAR GS_MAIL-SMTP_ADDR. * SELECT SINGLE SMTP_ADDR INTO GS_MAIL-SMTP_ADDR * FROM T024 * WHERE EKGRP = P_EKGRP. LV_INDEX1 = 0. LV_INDEX2 = 0. LV_INDEX3 = 1. CLEAR LT_RECIEVE. WHILE ( LV_INDEX3 <= STRLEN( P_EMAIL ) ). LV_INDEX2 = LV_INDEX2 + 1. LV_INDEX3 = LV_INDEX3 + 1. IF P_EMAIL+LV_INDEX1(LV_INDEX2) CA '/'. LV_INDEX2 = LV_INDEX2 - 1 . LS_RECIEVE-EMAIL = P_EMAIL+LV_INDEX1(LV_INDEX2). APPEND LS_RECIEVE TO LT_RECIEVE. CLEAR LS_RECIEVE. LV_INDEX1 = LV_INDEX3 - 1. LV_INDEX2 = 0. ENDIF. ENDWHILE. LOOP AT LT_RECIEVE INTO LS_RECIEVE. CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_RECIEVE-EMAIL ). CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). ENDLOOP. ENDIF. ** 正式发送并提交作业 CLEAR LV_BOOL. "将邮件置于发件箱,可以在工作台outbox查看邮件的发送状态及内容 CL_SEND_REQUEST->SEND_REQUEST->SET_LINK_TO_OUTBOX( 'X' ). CALL METHOD CL_SEND_REQUEST->SEND_REQUEST->SETU_REQUESTED_STATUS EXPORTING I_REQUESTED_STATUS = 'N'. CALL METHOD CL_SEND_REQUEST->SEND_REQUEST->SETU_STATUS_MAIL EXPORTING I_STATUS_MAIL = 'A'. CL_SEND_REQUEST->SET_SEND_IMMEDIATELY( 'X' ). LV_BOOL = CL_SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X'). IF LV_BOOL = 'X'. COMMIT WORK. * submit rsconn01 with mode = 'INT' and return. IF LT_CONTENT_BIN IS INITIAL. P_ICON = '@0A@'. P_MESSAGE = TEXT-004. "默认导入成功 ELSE. P_ICON = '@08@'. P_MESSAGE = TEXT-005. "默认导入成功 P_ERDAT = SY-DATUM. CLEAR LS_ZT37. LS_ZT37-EBELN = P_EBELN. LS_ZT37-ERDAT = SY-DATUM. LS_ZT37-ERTIM = SY-UZEIT. LS_ZT37-ERNAM = SY-UNAME. MODIFY ZNMMT037 FROM LS_ZT37. ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-006. "默认导入成功 ROLLBACK WORK. ENDIF. CATCH CX_BCS INTO CL_BCS_EXCEPTION. P_ICON = '@0A@'. P_MESSAGE = TEXT-006 && CL_BCS_EXCEPTION->ERROR_TYPE.. "默认导入成功 ENDTRY. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOWN_PDF *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> GS_DATA_EBELN *& --> GS_DATA_SPRAS *& --> GS_DATA_TDSPOOLID *&---------------------------------------------------------------------* FORM FRM_DOWN_PDF USING P_EBELN P_SPRAS. DATA:LV_ICON TYPE ICON-NAME, LV_MESSAGE TYPE C LENGTH 120. PERFORM FRM_GET_PDF USING P_EBELN P_SPRAS '' CHANGING LV_ICON LV_MESSAGE. IF LV_ICON NE ''. LV_MESSAGE = P_EBELN && LV_MESSAGE. MESSAGE LV_MESSAGE TYPE 'E' . ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_PDF *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_EBELN *& --> P_SPRAS *& <-- P_ICON *& <-- P_MESSAGE *&---------------------------------------------------------------------* FORM FRM_GET_PDF USING P_EBELN P_SPRAS P_PATH CHANGING P_ICON P_MESSAGE. DATA:LT_PDF LIKE TLINE OCCURS 0 WITH HEADER LINE, LS_PDF LIKE TLINE. DATA:LS_NAST LIKE NAST, LV_SUBRC TYPE SY-SUBRC, LV_VLINE TYPE I, LV_SMARTFORM_NAME TYPE RS38L_FNAM VALUE 'ZPO_FORM', " 请替换为实际的Smart Form名称 LV_TEMPLATE TYPE STXH-TDNAME VALUE 'ZPO_FORM'. " 请替换为实际的模板名称 FIELD-SYMBOLS <FS_VALUE> TYPE ITCPP. SELECT SINGLE * INTO LS_NAST FROM NAST WHERE OBJKY = P_EBELN AND SPRAS = P_SPRAS. CALL FUNCTION 'WFMC_MESSAGE_SINGLE' EXPORTING PI_NAST = LS_NAST IMPORTING PE_RCODE = LV_SUBRC. IF LV_SUBRC = 0. ASSIGN ('(SAPLMEDRUCK)RESULT') TO <FS_VALUE>. IF <FS_VALUE>-TDSPOOLID IS NOT INITIAL. CLEAR LT_PDF. " 使用Smart Forms函数替代原函数 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING FORMNAME = ZPO_FORM IMPORTING FM_NAME = LV_FM_NAME EXCEPTIONS NO_FORM = 1 NO_FUNCTION_MODULE = 2 OTHERS = 3. IF SY-SUBRC <> 0. P_ICON = '@0A@'. P_MESSAGE = '获取Smart Forms函数失败'. EXIT. ENDIF. " 动态调用Smart Forms函数 CALL FUNCTION LV_FM_NAME EXPORTING EXPORTING = 'X' TEMPLATE = LV_TEMPLATE OUTPUT_OPTIONS = LS_OUTPUT_OPTIONS IMPORTING JOB_OUTPUT_INFO = LS_JOB_OUTPUT_INFO TABLES LINES = LT_PDF EXCEPTIONS FORMATTING_ERROR = 1 INTERNAL_ERROR = 2 SEND_ERROR = 3 USER_CANCELED = 4 OTHERS = 5. IF SY-SUBRC <> 0. P_ICON = '@0A@'. P_MESSAGE = '执行ZPO_FORM函数失败'. EXIT. ENDIF. " 计算PDF字节数 LV_VLINE = LINES( LT_PDF ). IF LT_PDF[] IS NOT INITIAL. "先下载到本地,再上载做为附件 IF P_PATH IS NOT INITIAL. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING BIN_FILESIZE = LV_VLINE FILENAME = P_PATH FILETYPE = 'BIN' TABLES DATA_TAB = LT_PDF EXCEPTIONS FILE_WRITE_ERROR = 1 NO_BATCH = 2 GUI_REFUSE_FILETRANSFER = 3 INVALID_TYPE = 4 NO_AUTHORITY = 5 UNKNOWN_ERROR = 6. ELSE. DATA:LV_FILE TYPE STRING. PERFORM FRM_GET_PATH USING LV_FILE. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING BIN_FILESIZE = LV_VLINE FILENAME = LV_FILE FILETYPE = 'BIN' TABLES DATA_TAB = LT_PDF EXCEPTIONS FILE_WRITE_ERROR = 1 NO_BATCH = 2 GUI_REFUSE_FILETRANSFER = 3 INVALID_TYPE = 4 NO_AUTHORITY = 5 UNKNOWN_ERROR = 6. ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-007. "默认导入成功 ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-008. "默认导入成功 ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-009. "默认导入成功 ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_PATH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> LV_PATH *&---------------------------------------------------------------------* FORM FRM_GET_PATH USING P_FILE. DATA: L_V_FILE_FILTER TYPE STRING. DATA: L_V_FILETABLE TYPE FILE_TABLE, L_T_FILETABLE TYPE FILETABLE. DATA: L_V_RC TYPE I. DATA: L_V_USER_ACTION TYPE I. * l_v_file_filter = '(*.xlsx;*.xls)|*.xlsx;*.xls|'. L_V_FILE_FILTER = '(*.PDF)|*.PDF|'. CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG( EXPORTING WINDOW_TITLE = '选择文件' FILE_FILTER = L_V_FILE_FILTER CHANGING FILE_TABLE = L_T_FILETABLE RC = L_V_RC USER_ACTION = L_V_USER_ACTION ). CHECK L_V_USER_ACTION EQ 0. CHECK L_T_FILETABLE[] IS NOT INITIAL. READ TABLE L_T_FILETABLE INTO L_V_FILETABLE INDEX 1. P_FILE = L_V_FILETABLE-FILENAME. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_MOD_SCREEN *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_MOD_SCREEN . LOOP AT SCREEN. IF SCREEN-GROUP1 = 'M1'. IF R1 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. IF SCREEN-GROUP1 = 'M2'. IF R2 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. IF SCREEN-GROUP1 = 'M3'. IF R3 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. MODIFY SCREEN. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOWN_TEMPLATE *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DOWN_TEMPLATE . CREATE OBJECT V_EXCEL 'EXCEL.APPLICATION'. SET PROPERTY OF V_EXCEL 'VISIBLE' = 1. CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_BOOK . CALL METHOD OF V_BOOK 'ADD'. IF SY-LANGU EQ '1'. PERFORM FRM_FILL_CELL USING: 1 1 '供应商代码(必填)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 2 '采购组织(必填)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 3 '工厂(选填)' 40 0 10, 1 4 '采购员(选填)' 40 0 10, 1 5 '订单发送邮箱(必填)' 40 0 10. ELSE. PERFORM FRM_FILL_CELL USING: 1 1 'Vendor Code(Required)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 2 'Purchase Organization(Required)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 3 'Plant' 40 0 10, 1 4 'Buyer.Code' 40 0 10, " add buyer code 20210413 wahkenlee 1 5 'Email' 40 0 10. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_1 *& --> P_1 *& --> P_ *& --> P_40 *& --> P_0 *& --> P_10 *&---------------------------------------------------------------------* FORM FRM_FILL_CELL USING FU_ROW FU_COLUMN FU_VALUE FU_COLOR FU_BOLD FU_SIZE. DATA: L_CELL TYPE OLE2_OBJECT, L_COLOR TYPE OLE2_OBJECT, L_BOLD TYPE OLE2_OBJECT, L_COLUMN TYPE OLE2_OBJECT. CALL METHOD OF V_EXCEL 'CELLS' = L_CELL EXPORTING #1 = FU_ROW #2 = FU_COLUMN. SET PROPERTY OF L_CELL 'Value' = FU_VALUE. "赋值。" * call method of L_CELL 'INTERIOR' = int. GET PROPERTY OF L_CELL 'Interior' = L_COLOR. SET PROPERTY OF L_COLOR 'ColorIndex' = FU_COLOR. "根据值 显示对应的颜色。 GET PROPERTY OF L_CELL 'Font' = L_BOLD. SET PROPERTY OF L_BOLD 'Bold' = FU_BOLD. "1是加粗,0是不加粗" SET PROPERTY OF L_BOLD 'SIZE' = FU_SIZE. "设置字体大小。" CALL METHOD OF V_EXCEL 'Columns' = L_COLUMN " 选定列 EXPORTING #1 = FU_COLUMN . SET PROPERTY OF L_COLUMN 'ColumnWidth' = 20. " 定义列宽 SET PROPERTY OF L_COLUMN 'rowheight' = 24. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_MAINTAIN_EMAIL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_MAINTAIN_EMAIL . PERFORM FRM_CHECK_AUTH. PERFORM FRM_UPLOAD_DATA. PERFORM FRM_CHECK_DATA. PERFORM FRM_UPDATE_DATA. PERFORM FRM_ALV. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_UPLOAD_DATA . CLEAR : GS_ITEM ,GT_ITEM. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = GV_FILE I_BEGIN_COL = 1 I_BEGIN_ROW = 2 I_END_COL = 5 I_END_ROW = 65535 TABLES INTERN = GT_ALSM EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE S000(ZMM) WITH TEXT-010 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. * 转换数据 LOOP AT GT_ALSM. ASSIGN COMPONENT GT_ALSM-COL OF STRUCTURE GS_ITEM TO <GFS_DATA>. TRANSLATE GT_ALSM-VALUE TO UPPER CASE. <GFS_DATA> = GT_ALSM-VALUE. AT END OF ROW. APPEND GS_ITEM TO GT_ITEM. CLEAR GS_ITEM. ENDAT. ENDLOOP. LOOP AT GT_ITEM ASSIGNING FIELD-SYMBOL(<LFS_ITEM>). CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = <LFS_ITEM>-LIFNR IMPORTING OUTPUT = <LFS_ITEM>-LIFNR. ENDLOOP. IF GT_ITEM IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-011 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK_DATA . DATA LV_NAME TYPE STRING . data:ls_email_stru type SX_ADDRESS, ls_email_stru_out type SX_ADDRESS. *前面已经判断过gt_item 不为空 SELECT LFA1~LIFNR , LFA1~NAME1 INTO TABLE @GT_LFA1 FROM LFA1 FOR ALL ENTRIES IN @GT_ITEM WHERE LFA1~LIFNR = @GT_ITEM-LIFNR. SORT GT_LFA1 BY LIFNR . SELECT T024E~EKORG , T001K~BWKEY FROM T024E INNER JOIN T001K ON T024E~BUKRS = T001K~BUKRS FOR ALL ENTRIES IN @GT_ITEM WHERE T024E~EKORG = @GT_ITEM-EKORG INTO TABLE @DATA(LT_T024E). SELECT T024~EKGRP FROM T024 FOR ALL ENTRIES IN @GT_ITEM WHERE T024~EKGRP = @GT_ITEM-EKGRP INTO TABLE @DATA(LT_T024). SORT LT_T024E BY EKORG BWKEY. SORT LT_T024 BY EKGRP. DATA LS_T024E LIKE LINE OF LT_T024E. DATA LS_T024 LIKE LINE OF LT_T024. LOOP AT GT_ITEM INTO GS_ITEM. MOVE-CORRESPONDING GS_ITEM TO GS_MESSAGE. CLEAR GS_LFA1. READ TABLE GT_LFA1 INTO GS_LFA1 WITH KEY LIFNR = GS_ITEM-LIFNR BINARY SEARCH . IF SY-SUBRC <> 0. GS_MESSAGE-MESSAGE = TEXT-012. GS_MESSAGE-FLAG = 'X'. ELSE. GS_MESSAGE-NAME1 = GS_LFA1-NAME1. ENDIF. IF GS_ITEM-EKORG IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-013 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. IF GS_ITEM-WERKS IS NOT INITIAL AND GS_ITEM-EKORG IS NOT INITIAL. CLEAR LS_T024E. READ TABLE LT_T024E INTO LS_T024E WITH KEY EKORG = GS_ITEM-EKORG BWKEY = GS_ITEM-WERKS BINARY SEARCH. IF SY-SUBRC <> 0. CONCATENATE GS_MESSAGE-MESSAGE TEXT-014 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. ENDIF. IF GS_ITEM-EMAIL IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE '' INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ELSE. "校验导入邮箱的格式 ls_email_stru-type = 'INT'. ls_email_stru-address = gs_item-email. CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL' EXPORTING ADDRESS_UNSTRUCT = ls_email_stru IMPORTING ADDRESS_NORMAL = ls_email_stru_out EXCEPTIONS ERROR_ADDRESS_TYPE = 1 ERROR_ADDRESS = 2 ERROR_GROUP_ADDRESS = 3 OTHERS = 4. if ls_email_stru is INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-025 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. endif. ENDIF. CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. IF LV_NAME IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-016 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ELSE. GS_MESSAGE-UNAME = LV_NAME. ENDIF. IF GS_ITEM-EKGRP IS NOT INITIAL. CLEAR:LS_T024. READ TABLE LT_T024 INTO LS_T024 WITH KEY EKGRP = GS_ITEM-EKGRP. IF SY-SUBRC <> 0. CONCATENATE GS_MESSAGE-MESSAGE TEXT-024 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. ENDIF. IF GS_MESSAGE-FLAG <> 'X'. CONCATENATE TEXT-017 SY-DATUM+0(4) '/' SY-DATUM+4(2) '/' SY-DATUM+6(2) TEXT-018 SYST-UZEIT+0(2) ':' SYST-UZEIT+2(2) ':' SYST-UZEIT+4(2) INTO GS_MESSAGE-MESSAGE. ENDIF. APPEND GS_MESSAGE TO GT_MESSAGE. CLEAR GS_MESSAGE. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPDATE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_UPDATE_DATA . DATA : LT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : LS_ZNMMT037A LIKE LINE OF LT_ZNMMT037A. LOOP AT GT_MESSAGE INTO GS_MESSAGE WHERE FLAG <> 'X'. MOVE-CORRESPONDING GS_MESSAGE TO LS_ZNMMT037A. APPEND LS_ZNMMT037A TO LT_ZNMMT037A. CLEAR LS_ZNMMT037A. ENDLOOP. IF LT_ZNMMT037A IS NOT INITIAL. MODIFY ZNMMT037A FROM TABLE LT_ZNMMT037A. IF SY-DBCNT <> 0. COMMIT WORK. ENDIF. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_ALV . CLEAR GT_FIELDCAT. CLEAR GS_FIELDCAT. CLEAR GT_EVENTS. CLEAR GS_EVENTS. CLEAR GS_LAYOUT1. MOVE-CORRESPONDING GT_MESSAGE TO GT_EMAIL_ALV. IF SY-LANGU EQ '1'. GMRC_INITIAL_FIELD '供应商代码' 'LIFNR' 'X'. GMRC_INITIAL_FIELD '供应商名称' 'NAME1' 'X'. GMRC_INITIAL_FIELD '采购组织' 'EKORG' 'X'. GMRC_INITIAL_FIELD '工厂' 'WERKS' 'X'. GMRC_INITIAL_FIELD '采购员' 'EKGRP' 'X'. GMRC_INITIAL_FIELD '订单发送邮箱' 'EMAIL' 'X'. GMRC_INITIAL_FIELD '用户域名' 'UNAME' 'X'. GMRC_INITIAL_FIELD '信息' 'MESSAGE' ''. ELSE. GMRC_INITIAL_FIELD 'Supplier Code' 'LIFNR' 'X'. GMRC_INITIAL_FIELD 'Supplier Name' 'NAME1' 'X'. GMRC_INITIAL_FIELD 'Purchase Organization' 'EKORG' 'X'. GMRC_INITIAL_FIELD 'Plant' 'WERKS' 'X'. GMRC_INITIAL_FIELD 'Buyer.Code' 'EKGRP' 'X'. GMRC_INITIAL_FIELD 'Email' 'EMAIL' 'X'. GMRC_INITIAL_FIELD 'Domain' 'UNAME' 'X'. GMRC_INITIAL_FIELD 'Message' 'MESSAGE' ''. ENDIF. GS_LAYOUT1-COLWIDTH_OPTIMIZE = 'X'. GS_LAYOUT1-ZEBRA = 'X'. MOVE 'PF_STATUS_SET' TO GS_EVENTS-NAME. MOVE 'FRM_SET_PF_STATUS1' TO GS_EVENTS-FORM. APPEND GS_EVENTS TO GT_EVENTS. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = SY-REPID * I_CALLBACK_PF_STATUS_SET = '' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND2' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = IS_LAYOUT = GS_LAYOUT1 IT_FIELDCAT = GT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = I_DEFAULT = 'X' * I_SAVE = 'A ' * IS_VARIANT = IT_EVENTS = GT_EVENTS * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * O_PREVIOUS_SRAL_HANDLER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = GT_EMAIL_ALV EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. FORM FRM_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS'0100' . ENDFORM. FORM FRM_SET_PF_STATUS1 USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS'0200' . ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_QUERY *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_QUERY . CLEAR : GT_QUERY_ALV. CLEAR : GS_QUERY_ALV. CLEAR GT_FIELDCAT. CLEAR GS_FIELDCAT. CLEAR GT_EVENTS. CLEAR GS_EVENTS. CLEAR GS_LAYOUT1. SELECT ZNMMT037A~LIFNR , ZNMMT037A~NAME1 , ZNMMT037A~EKORG , ZNMMT037A~WERKS , ZNMMT037A~EMAIL , ZNMMT037A~UNAME , ZNMMT037A~MESSAGE , ZNMMT037A~EKGRP FROM ZNMMT037A WHERE ZNMMT037A~LIFNR IN @S_LIFNR1 AND ZNMMT037A~EKORG IN @S_EKORG1 AND ZNMMT037A~WERKS IN @S_WERKS INTO TABLE @DATA(LT_ZNMMT037A) . MOVE-CORRESPONDING LT_ZNMMT037A TO GT_QUERY_ALV. IF SY-LANGU EQ '1'. GMRC_INITIAL_FIELD '供应商代码' 'LIFNR' 'X'. GMRC_INITIAL_FIELD '供应商名称' 'NAME1' 'X'. GMRC_INITIAL_FIELD '采购组织' 'EKORG' 'X'. GMRC_INITIAL_FIELD '工厂' 'WERKS' 'X'. GMRC_INITIAL_FIELD '采购员' 'EKGRP' 'X'. GMRC_INITIAL_FIELD '订单发送邮箱' 'EMAIL' 'X'. GMRC_INITIAL_FIELD '用户域名' 'UNAME' 'X'. GMRC_INITIAL_FIELD '信息' 'MESSAGE' ''. ELSE. GMRC_INITIAL_FIELD 'Supplier Code' 'LIFNR' 'X'. GMRC_INITIAL_FIELD 'Supplier Name' 'NAME1' 'X'. GMRC_INITIAL_FIELD 'Purchase Organization' 'EKORG' 'X'. GMRC_INITIAL_FIELD 'Plant' 'WERKS' 'X'. GMRC_INITIAL_FIELD 'Buyer.Code' 'EKGRP' 'X'. GMRC_INITIAL_FIELD 'Email' 'EMAIL' 'X'. GMRC_INITIAL_FIELD 'DOMAIN_NAME' 'UNAME' 'X'. GMRC_INITIAL_FIELD 'Message' 'MESSAGE' ''. ENDIF. GS_LAYOUT1-COLWIDTH_OPTIMIZE = 'X'. GS_LAYOUT1-ZEBRA = 'X'. GS_LAYOUT1-BOX_FIELDNAME = 'BOX'. MOVE 'PF_STATUS_SET' TO GS_EVENTS-NAME. MOVE 'FRM_SET_PF_STATUS' TO GS_EVENTS-FORM. APPEND GS_EVENTS TO GT_EVENTS. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = SY-REPID * I_CALLBACK_PF_STATUS_SET = '' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND1' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = IS_LAYOUT = GS_LAYOUT1 IT_FIELDCAT = GT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = I_DEFAULT = 'X' * I_SAVE = 'A ' * IS_VARIANT = IT_EVENTS = GT_EVENTS * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * O_PREVIOUS_SRAL_HANDLER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = GT_QUERY_ALV EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. FORM FRM_USER_COMMAND1 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'BACK' OR 'CANCEL' OR 'EXIT'. DATA : LV_SELTAB TYPE TABLE OF RSPARAMS. CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' "获取当前的选择屏幕元素 EXPORTING CURR_REPORT = SY-REPID * IMPORTING * SP = TABLES SELECTION_TABLE = LV_SELTAB * SELECTION_TABLE_255 = EXCEPTIONS NOT_FOUND = 1 NO_REPORT = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. "使用获取到的屏幕元素跳转初始界面 SUBMIT ZNMMR037 WITH SELECTION-TABLE LV_SELTAB VIA SELECTION-SCREEN. WHEN 'DELETE'. IF R2 = 'X'. PERFORM FRM_DELETE_DATA. ENDIF. WHEN OTHERS. ENDCASE. ENDFORM. FORM FRM_USER_COMMAND2 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'BACK' OR 'CANCEL' OR 'EXIT'. LEAVE TO SCREEN 0. WHEN OTHERS. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DELETE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DELETE_DATA . DATA : LS_COUNT TYPE I VALUE 0."删除记录的条数 DATA : LT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : LS_ZNMMT037A TYPE ZNMMT037A. DATA : LT_ALV LIKE GT_QUERY_ALV. DATA : LS_ALV LIKE LINE OF LT_ALV. CLEAR : LT_ZNMMT037A, LS_ZNMMT037A, LT_ALV, LS_ALV. LOOP AT GT_QUERY_ALV INTO GS_QUERY_ALV. IF GS_QUERY_ALV-BOX EQ 'X'. MOVE-CORRESPONDING GS_QUERY_ALV TO LS_ALV. APPEND LS_ALV TO LT_ALV. CLEAR LS_ALV. LS_ZNMMT037A-LIFNR = GS_QUERY_ALV-LIFNR. LS_ZNMMT037A-EKORG = GS_QUERY_ALV-EKORG. LS_ZNMMT037A-WERKS = GS_QUERY_ALV-WERKS. LS_ZNMMT037A-EMAIL = GS_QUERY_ALV-EMAIL. LS_ZNMMT037A-EKGRP = GS_QUERY_ALV-EKGRP. APPEND LS_ZNMMT037A TO LT_ZNMMT037A. CLEAR LS_ZNMMT037A. ENDIF. ENDLOOP. IF LT_ZNMMT037A IS INITIAL. MESSAGE E322(ZMM) DISPLAY LIKE 'W'. ENDIF. DELETE ZNMMT037A FROM TABLE LT_ZNMMT037A. IF SY-SUBRC EQ 0. COMMIT WORK AND WAIT. LOOP AT LT_ALV INTO LS_ALV. DELETE TABLE GT_QUERY_ALV FROM LS_ALV. LS_COUNT = LS_COUNT + 1. ENDLOOP. MESSAGE S104(ZMM) WITH LS_COUNT. DATA: LV_REF_GRID TYPE REF TO CL_GUI_ALV_GRID, LV_VALID TYPE C. IF LV_REF_GRID IS INITIAL. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING E_GRID = LV_REF_GRID. ENDIF. IF NOT LV_REF_GRID IS INITIAL. LV_REF_GRID->CHECK_CHANGED_DATA( IMPORTING E_VALID = LV_VALID ). ENDIF. IF LV_VALID IS NOT INITIAL. LV_REF_GRID->REFRESH_TABLE_DISPLAY( ) . ENDIF. ELSE. ROLLBACK WORK. MESSAGE E105(ZMM). ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK_AUTH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK_AUTH . DATA LV_NAME TYPE STRING . CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. SELECT SINGLE ZNMMT037B~DOMAIN_USER INTO @DATA(LV_DOMAIN) FROM ZNMMT037B WHERE ZPROGRAM = 'ZNMMR037' AND DOMAIN_USER = @LV_NAME. SELECT SINGLE ZNMMT037B~UNAME INTO @DATA(LV_UNAME) FROM ZNMMT037B WHERE ZPROGRAM = 'ZNMMR037' AND UNAME = @SY-UNAME. IF LV_DOMAIN IS INITIAL AND LV_UNAME IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-019 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK . DATA: LV_STRING TYPE STRING. DATA : LV_NAME TYPE STRING. FIELD-SYMBOLS : <LFS_WERKS> LIKE GS_WERKS. CLEAR GT_WERKS. CLEAR GS_WERKS. IF S_WERKS1[] IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-023. LEAVE LIST-PROCESSING. ELSE. CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. SELECT ZME2M_PLANT~UNAME , ZME2M_PLANT~USER_DOMAIN ,ZME2M_PLANT~WERKS_LIST FROM ZME2M_PLANT WHERE ZME2M_PLANT~USER_DOMAIN = @LV_NAME INTO TABLE @DATA(LT_PLANT). SORT LT_PLANT BY WERKS_LIST. SELECT T001W~WERKS FROM T001W WHERE T001W~WERKS IN @S_WERKS1 INTO CORRESPONDING FIELDS OF TABLE @GT_WERKS. SORT GT_WERKS BY WERKS. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-022 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. IF LT_PLANT IS NOT INITIAL."在单点登录权限里面的用户在需要检查,不在里面的不需要检查 LOOP AT LT_PLANT INTO DATA(LS_PLANT). READ TABLE GT_WERKS WITH KEY WERKS = LS_PLANT-WERKS_LIST TRANSPORTING NO FIELDS BINARY SEARCH. IF SY-SUBRC <> 0. DELETE GT_WERKS WHERE WERKS = LS_PLANT-WERKS_LIST. ENDIF. ENDLOOP. ENDIF. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-021. LEAVE LIST-PROCESSING . ENDIF. LOOP AT GT_WERKS ASSIGNING <LFS_WERKS> . AUTHORITY-CHECK OBJECT 'M_BEST_WRK' ID 'ACTVT' FIELD '03' ID 'WERKS' FIELD <LFS_WERKS>-WERKS. IF SY-SUBRC <> 0. <LFS_WERKS>-FLAG = 'X'. ENDIF. ENDLOOP. DELETE GT_WERKS WHERE FLAG = 'X'. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-020 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING . ENDIF. ENDIF. CLEAR S_WERKS1[]. CLEAR S_WERKS1. LOOP AT GT_WERKS INTO GS_WERKS. S_WERKS1-SIGN = 'I'. S_WERKS1-OPTION = 'EQ'. S_WERKS1-LOW = GS_WERKS-WERKS. APPEND S_WERKS1. CLEAR S_WERKS1. ENDLOOP. ENDFORM.
最新发布
05-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值