Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Add Serial Numbers to Outbound Delivery (customer order)

Former Member
0 Kudos

Hello there!

I'm looking to pull serial numbers for serialized inventory from a table then populate them into picked/packed customer outbound deliveries via a function module or BAPI. I have been experiementing with a couple of FM's and was hoping someone could recommend a FM a provide some sample code.

Some the the FM's ..

SERNR_ADD_TO_LS

SERNR_ADD_TO_DOCUMENT

SERNR_MAINTAIN_IN_DOCUMENT

Thanks!

3 REPLIES 3

Former Member
0 Kudos

I probably don't fully understand, but...

if configuration is set properly and the materials are serialized, the user should get prompted to enter the serial number during the delivery process.

The standard print program and SAPscript will also print the serial numbers on the output.

0 Kudos

The system is configured to do as you stated however these deliveries are being pick/pack by a third party. We are using a DELVRY03/WHSCON IDOc to pick and pack the delivery however it will not update serial numbers. So I'm writing an application to pull the serials from the IDoc tables and update the delivery and PGI. I unfamilar as which FM/BAPI to use and under a bit of time constraint...

Former Member
0 Kudos

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.