04-17-2006 4:45 AM
Dear Gurus,
I am creating an interface program and I have problem in attaching the serial number data to the corresponding material code for a certain delivery order document in R/3 4.6C SP22 system.
The serial number can be attached either during the creation of the Delivery Order itself or in the subsequent step after creating the Delivery Order (i.e.: create the D/O document first, and then update the D/O data).
The BAPI_OUTB_DELIVERY_CONFIRM_DEC FM does not provide any input parameter to let me put the serial number in this R/3 version.
By tracing in SE30 the standard program VL02N --> Menu --> Extras --> Serial Number --> Continue (Enter) --> Save (Ctrl+S), I found out that the serial attachment 'might' be done during sub-routine SERIAL_LISTE_POST_LS in program SAPLIPW1. It will in turn executes FM SERIAL_LISTE_POST_LS. The commit to database table will be done in update task by FM OBJK_POST_UPDATE_N and SERIAL_POST_UPDATE_LS.
<b>My question:</b>
============
1. Is FM SERNR_ADD_TO_LS can be used to attach the serial number to D/O?
If yes, how to do it please because I already tried it I can not see the serial information in VL02N after that. There is no any insert or update to database in this function module. Should I call other FM after this? I want to try to call FM OBJK_POST_UPDATE_N and SERIAL_POST_UPDATE_LS but I do not know how I can retrieve the global object such as XOBJK_ALL that is necessary for the input parameter.
2. If SERNR_ADD_TO_LS can not be used, what other FM can I use? Can I call SERIAL_LISTE_POST_LS instead? Is there any reliable way to generate the import parameter for this FM, such as XSER00, XSER01, XOBJK_ALL and XEQUI?
Thank you in advanced for your kind assistance.
Best Regards,
Hiroshi
04-17-2006 5:51 AM
Hiroshi,
Are you sure you have tried putting the serial numbers in the ITEM_SERIAL_NO of the BAPI that you are using ?.If you are sure that it is not possible in your system then why dont you try the standard FM GN_DELIVERY_CREATE to create the delivery.This also provides an option for you to input serial numbers.
Cheers
Nishanth
04-17-2006 5:51 AM
Hiroshi,
Are you sure you have tried putting the serial numbers in the ITEM_SERIAL_NO of the BAPI that you are using ?.If you are sure that it is not possible in your system then why dont you try the standard FM GN_DELIVERY_CREATE to create the delivery.This also provides an option for you to input serial numbers.
Cheers
Nishanth
04-17-2006 7:16 AM
Thank you for your reply Nishanth.
Eventually our customer using R/3 version 46C and in this version there is no ITEM_SERIAL_NO import parameter. I aware that 47C has this..
And the D/O that we want to create is the Outbound Delivery Order, and I think GN_DELIVERY_CREATE is for inbound D/O, if I am not mistaken.
Btw, my colleague seems to just solved the problem by calling SERNR_ADD_TO_LS FM and right after manually call sub-routine SERIAL_LISTE_POST_LS as stated below:
*================== start ================ *
CALL FUNCTION 'SERNR_ADD_TO_LS'
EXPORTING
profile = lips-serail
material = lips-matnr
m_charge = lips-charg
quantity = lf_anzsn
j_vorgang = lf_status
cuobj = lips-cuobj
document = lips-vbeln
item = lips-posnr
debitor = likp-kunnr
vbtyp = likp-vbtyp
bwart = lips-bwart
IMPORTING
anzsn = lips-anzsn
zeilen_id = lf_line_id
TABLES
sernos = lt_sernos
EXCEPTIONS
serialnumber_errors = 1
serialnumber_warnings = 2.
PERFORM serial_liste_post_ls IN PROGRAM saplipw1.
*================== end ================ *
We will check further whether this method is safe enough or not.
Thanks anyway for your help.
rgs,
Hiroshi
08-03-2006 9:19 PM
Hello Hiroshi,
I have this same problem. I'm in a 46C SAP system and I need update serial numbers in a delivery, except my serial numbers are coming from DELVRY03 IDoc's (the IDoc process code DELS does not post serials in 46C). I have an application to pull the serials from the IDocs however I'm struggling with 'SERNR_ADD_TO_LS'. Did you end up using this? If so can you post sample code? If not, what did you do?
Many Thanks!!
03-15-2007 1:53 PM
Try something similar to this below...
Afterwards you should do a call transaction to VL02N and immediately SAVE. This is sufficient to ensure the status on the serial numbers is updated correctly.
FUNCTION z_mob_serialnr_update_ls.
*"----
""Local interface:
*" IMPORTING
*" VALUE(VBELN_I) LIKE LIKP-VBELN
*" TABLES
*" SERNO_TAB STRUCTURE RISERLS
*" YSER00 STRUCTURE SER00 OPTIONAL
*" YSER01 STRUCTURE RSERXX OPTIONAL
*" YOBJK_ALL STRUCTURE RIPW0 OPTIONAL
*" YEQUI STRUCTURE RIEQUI OPTIONAL
*" YMASE STRUCTURE MASE OPTIONAL
*" EXCEPTIONS
*" NO_EQUIPMENT_FOUND
*"----
The modified/confirmed table of serial numbers is supplied in
SERNO_TAB.
These are updated in the SAP tables
YSER00 - General Header Table for Serial Number Management
YSER01 - Document Header for Serial Numbers for Delivery
YOBJK_ALL - Internal Table for Object List Editing/Serial Numbers
YEQUI - Internal Structure for IEQUI
*"----
local data
DATA: BEGIN OF del_wa,
vbeln LIKE likp-vbeln,
posnr LIKE lips-posnr,
matnr LIKE lips-matnr,
lfimg LIKE lips-lfimg.
DATA: END OF del_wa.
DATA: del_tab LIKE del_wa OCCURS 0.
DATA: _ct TYPE i.
DATA: lastobknr LIKE objk-obknr.
DATA: _debug.
******
CLEAR: yser00, yser01, yobjk_all, yequi, ymase.
REFRESH: yser00, yser01, yobjk_all, yequi, ymase.
GET PARAMETER ID 'ZEDI_DEBUG' FIELD _debug.
*"----
OBJECT KEYS
*"----
read the delivery items with serial numbers to be processed
SELECT * INTO CORRESPONDING FIELDS OF TABLE del_tab
FROM lips
WHERE vbeln = vbeln_i
AND serail NE space.
if nothing is relevant for serial numbers bailout
DESCRIBE TABLE del_tab LINES _ct.
IF _ct IS INITIAL.
EXIT.
ENDIF.
==== read the existing object keys for delivery items
SELECT * INTO CORRESPONDING FIELDS OF TABLE yser01
FROM ser01
WHERE lief_nr = vbeln_i.
IF sy-subrc = 0.
yser01-dbknz = 'X'. "entry exists in db
MODIFY yser01 TRANSPORTING dbknz WHERE dbknz = space.
ENDIF.
== check if there is a header entry for the delivery item
LOOP AT del_tab INTO del_wa.
READ TABLE yser01 WITH KEY lief_nr = del_wa-vbeln
posnr = del_wa-posnr.
IF sy-subrc NE 0.
create one
CALL FUNCTION 'OBJECTLIST_NUMBER'
IMPORTING
obknr = yser01-obknr.
yser00-mandt = sy-mandt.
yser00-obknr = yser01-obknr.
APPEND yser00.
SELECT SINGLE kunnr INTO (yser01-kunde)
FROM likp
WHERE vbeln = vbeln_i.
yser01-mandt = sy-mandt.
yser01-lief_nr = del_wa-vbeln.
yser01-posnr = del_wa-posnr.
yser01-vorgang = 'SDLS'.
yser01-vbtyp = 'J'.
yser01-bwart = '601'.
yser01-dbknz = space. "not in db
yser01-loknz = space. "do not delete
APPEND yser01.
ENDIF.
ENDLOOP.
check if any entries should be deleted
LOOP AT yser01.
READ TABLE serno_tab WITH KEY vbeln = yser01-lief_nr
posnr = yser01-posnr.
IF sy-subrc NE 0.
yser01-loknz = 'X'. "mark for delete
MODIFY yser01.
ENDIF.
ENDLOOP.
*"----
collect all the object keys for the delivery item with s/n's
*"----
LOOP AT yser01.
READ TABLE serno_tab WITH KEY vbeln = yser01-lief_nr
posnr = yser01-posnr.
IF sy-subrc = 0.
READ TABLE yser00 WITH KEY obknr = yser01-obknr.
IF sy-subrc NE 0.
yser00-mandt = yser01-mandt.
yser00-obknr = yser01-obknr.
APPEND yser00.
ENDIF.
ENDIF.
ENDLOOP.
IF NOT _debug IS INITIAL. BREAK-POINT. ENDIF.
*"----
SERIAL NO OBJECTS
*"----
==== read the existing serial numbers from the database
via object number into YOBJK_ALL
LOOP AT yser00.
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE yobjk_all
FROM objk
WHERE obknr = yser00-obknr.
ENDLOOP.
yobjk_all-dbknz = 'X'.
MODIFY yobjk_all TRANSPORTING dbknz WHERE dbknz = space.
=== add any new serial numbers
LOOP AT serno_tab.
READ TABLE yser01 WITH KEY lief_nr = serno_tab-vbeln
posnr = serno_tab-posnr.
READ TABLE yobjk_all WITH KEY sernr = serno_tab-sernr
matnr = del_wa-matnr.
IF sy-subrc NE 0.
this is a new serial number
yobjk_all-mandt = sy-mandt.
yobjk_all-obknr = yser01-obknr.
yobjk_all-obzae = 0.
yobjk_all-equnr = yequi-equnr.
yobjk_all-objvw = 'S'.
yobjk_all-sernr = serno_tab-sernr.
yobjk_all-matnr = del_wa-matnr.
yobjk_all-datum = sy-datum.
yobjk_all-taser = 'SER01'.
yobjk_all-equpd = 'X'.
yobjk_all-objnr = yequi-objnr.
yobjk_all-dbknz = space.
yobjk_all-loknz = space.
APPEND yobjk_all.
ENDIF.
ENDLOOP.
=== mark any which are no longer confirmed as deleted
LOOP AT yobjk_all.
READ TABLE yser01 WITH KEY obknr = yobjk_all-obknr.
READ TABLE serno_tab WITH KEY vbeln = yser01-lief_nr
posnr = yser01-posnr
sernr = yobjk_all-sernr.
IF sy-subrc NE 0.
yobjk_all-loknz = 'X'.
MODIFY yobjk_all TRANSPORTING loknz.
ENDIF.
ENDLOOP.
*"----
EQUIPMENT RECORDS
*"----
== get the equipment records
LOOP AT yobjk_all.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF yequi
FROM equi
WHERE sernr = yobjk_all-sernr
AND matnr = yobjk_all-matnr.
IF sy-subrc NE 0.
CONTINUE.
ENDIF.
IF yobjk_all-dbknz = space AND
yobjk_all-loknz = space.
yequi-dbknz = 'X'.
yequi-obknr = yobjk_all-obknr.
yequi-j_vorgang = 'PMS3'. "add to delivery
yequi-matnr_old = yequi-matnr.
APPEND yequi.
yobjk_all-equnr = yequi-equnr.
MODIFY yobjk_all TRANSPORTING equnr.
CONTINUE.
ENDIF.
IF yobjk_all-dbknz = 'X' AND
yobjk_all-loknz = 'X'.
yequi-dbknz = 'X'.
yequi-j_vorgang = 'PMSA'. "delete from delivery
yequi-matnr_old = yequi-matnr.
APPEND yequi.
CONTINUE.
ENDIF.
ENDLOOP.
remove any Equipment records that do not need to be processed
DELETE yequi WHERE j_vorgang IS initial.
IF NOT _debug IS INITIAL. BREAK-POINT. ENDIF.
fill the object counter
LOOP AT del_tab INTO del_wa.
READ TABLE yser01 WITH KEY lief_nr = del_wa-vbeln
posnr = del_wa-posnr.
DO del_wa-lfimg TIMES.
READ TABLE yobjk_all WITH KEY obknr = yser01-obknr
obzae = sy-index.
IF sy-subrc NE 0.
READ TABLE yobjk_all WITH KEY obknr = yser01-obknr
obzae = 0.
IF sy-subrc = 0.
yobjk_all-obzae = sy-index.
MODIFY yobjk_all INDEX sy-tabix TRANSPORTING obzae.
ENDIF.
ENDIF.
ENDDO.
ENDLOOP.
IF NOT _debug IS INITIAL. BREAK-POINT. ENDIF.
===========================================
update the delivery
===========================================
CALL FUNCTION 'SERIAL_LISTE_POST_LS'
TABLES
xser00 = yser00
xser01 = yser01
xobjk_all = yobjk_all
xequi = yequi
xmase = ymase.
TAB_CUOBJ =
XSER03 =
CALL FUNCTION 'STATUS_BUFFER_EXPORT_TO_MEMORY'
EXPORTING
i_memory_id = memid_status.
COMMIT WORK AND WAIT.
CALL FUNCTION 'Z_MOB_SERIALNR_REFRESH_LS'
EXPORTING
ctu = 'X'
mode = 'N'
UPDATE = 'L'
GROUP =
USER =
KEEP =
HOLDDATE =
NODATA = '/'
vbeln_i = vbeln_i.
IMPORTING
SUBRC =
TABLES
MESSTAB =
ENDFUNCTION.
FUNCTION z_mob_serialnr_refresh_ls.
*"----
""Local interface:
*" IMPORTING
*" VALUE(CTU) LIKE APQI-PUTACTIVE DEFAULT 'X'
*" VALUE(MODE) LIKE APQI-PUTACTIVE DEFAULT 'N'
*" VALUE(UPDATE) LIKE APQI-PUTACTIVE DEFAULT 'L'
*" VALUE(GROUP) LIKE APQI-GROUPID OPTIONAL
*" VALUE(USER) LIKE APQI-USERID OPTIONAL
*" VALUE(KEEP) LIKE APQI-QERASE OPTIONAL
*" VALUE(HOLDDATE) LIKE APQI-STARTDATE OPTIONAL
*" VALUE(NODATA) LIKE APQI-PUTACTIVE DEFAULT '/'
*" VALUE(VBELN_I) LIKE LIKP-VBELN
*" EXPORTING
*" VALUE(SUBRC) LIKE SYST-SUBRC
*" TABLES
*" MESSTAB STRUCTURE BDCMSGCOLL OPTIONAL
*"----
DATA: vbeln_001 LIKE bdcdata-fval.
vbeln_001 = vbeln_i.
subrc = 0.
PERFORM bdc_nodata USING nodata.
PERFORM open_group USING group user keep holddate ctu.
PERFORM bdc_dynpro USING 'SAPMV50A' '4004'.
PERFORM bdc_field USING 'BDC_CURSOR'
'LIKP-VBELN'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'LIKP-VBELN'
vbeln_001.
PERFORM bdc_dynpro USING 'SAPMV50A' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=PSER_T'.
PERFORM bdc_field USING 'BDC_CURSOR'
'LIPS-POSNR(01)'.
PERFORM bdc_dynpro USING 'SAPLIPW1' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RIPW0-SERNR(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=RWS'.
PERFORM bdc_dynpro USING 'SAPMV50A' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SICH_T'.
PERFORM bdc_field USING 'BDC_CURSOR'
'LIPS-MATNR(02)'.
PERFORM bdc_transaction TABLES messtab
USING 'VL02N'
ctu
mode
update.
IF sy-subrc <> 0.
subrc = sy-subrc.
EXIT.
ENDIF.
PERFORM close_group USING ctu.
ENDFUNCTION.
INCLUDE bdcrecxy.