Hola amigos,
Soy SD y estoy trabajando con un amigo abappero para hacer un programa que genere ordenes de venta. Estamos usando la BAPI_SALESORDER_CREATEFROMDAT2 y hasta ahora el resultado ha sido bastante bueno... pero tenemos un problema con la unidad de medida.
La entrada de datos la estamos haciendo desde las mismas tablas de ventas. Un pedido de un tipo X genera un pedido de tipo Y...
El problema es que no importa qué unidad de medida le suministremos al programa, las ordenes generadas vienen en la unidad de medida de venta del material y no en la unidad suministrada en la estructura. Les anexo el código por si alguien nos puede ayudar.
*----------------------------------------------------------------------*
***INCLUDE ZSD_ORDEN_AP_RUTINAS .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form LLENADATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM LLENADATOS .
*Buscar los datos de vbak que serviran de base.
data: vbel like zorders-vbeln.
select * from vbak into CORRESPONDING FIELDS OF TABLE it_vbak
where AUART in ('ZAR','ZAC').
*leer ahora lo que tiene zorders.
SELECT * from zorders INTO CORRESPONDING FIELDS OF TABLE it_zorders.
*si hay datos recorrer la tabla interna y borrar las coincidencias
IF sy-subrc = 0.
loop at it_zorders.
delete it_vbak where vbeln = it_zorders-ebeln.
ENDLOOP.
ENDIF.
ENDFORM. " LLENADATOS
*&---------------------------------------------------------------------*
*& Form CREAORDERS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CREAORDERS .
data sub(3) type c.
data it_vbap like STANDARD TABLE OF vbap WITH HEADER LINE.
data prov like zinterco-lifnr.
data reg like LINE OF it_zorders.
data cent like vbap-werks.
*recorrer la tabla interna para ir creando las ordenes
WRITE 'Órdenes creadas'.
LOOP AT it_vbak.
if it_vbak-auart = 'ZAR'.
header-doc_type = 'ZMR1'.
elseif it_vbak-auart = 'ZAC'.
header-doc_type = 'ZMC1'.
ENDIF.
header-sales_org = 'OV02'.
header-distr_chan = 'C1'.
header-division = 'S1'.
sub = it_vbak-vkbur+1(3) .
CONCATENATE 'B' sub INTO header-sales_off.
*guardar el centro para usarlo mas delante
cent = header-sales_off.
*header-sales_off = 'B' + substr(it_VBAK-VKBUR ,2,3).
header-doc_date = sy-datum.
header-purch_date = sy-datum.
header-po_dat_s = sy-datum.
header-req_date_h = sy-datum.
Header-purch_no_c = 'Pedido A en P'.
*hacer un select a vbap.
REFRESH it_vbap.
refresh i_items.
refresh I_SCHDL.
select * from vbap into CORRESPONDING FIELDS OF TABLE it_vbap
WHERE vbeln = it_vbak-vbeln.
LOOP AT it_vbap.
i_items-itm_number = it_VBAP-POSNR.
i_items-material = it_VBAP-MATNR.
sub = it_VBAP-WERKS+1(3) .
CONCATENATE 'B' sub INTO i_items-plant.
* i_items-plant = 'B' + substr(it_VBAP-WERKS,2,3).
i_items-target_qty = it_VBAP-KWMENG.
* I_items-target_qu = it_VBAP-ZIEME.
I_items-target_qu = it_VBAP-vrkme. *****aqui asigna u/m*****
i_items-comp_quant = it_VBAP-KWMENG.
append i_items.
I_SCHDL-itm_number = it_vbap-posnr.
I_SCHDL-req_qty = it_vbap-kwmeng.
append I_SCHDL.
ENDLOOP.
CLEAR i_partners.
i_partners-partn_role = 'AG'.
*buscar de zinterco el lifnr correspondiente.
*preparar una condicion para la busqueda
select single lifnr into prov from ZCLICPD where
werks = cent.
i_partners-partn_numb = prov.
append i_partners.
CLEAR i_partners.
i_partners-partn_role = 'VE'.
i_partners-partn_numb = '0000000620'.
append i_partners.
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
SALESDOCUMENTIN = salesdocument
ORDER_HEADER_IN = header
IMPORTING
SALESDOCUMENT = salesdocument_ex
TABLES
RETURN = i_return
ORDER_ITEMS_IN = i_items
ORDER_SCHEDULES_IN = I_SCHDL
ORDER_PARTNERS = i_partners
.
reg-mandt = sy-mandt.
reg-bsart = it_vbak-AUART.
reg-ebeln = it_vbak-VBELN.
IF it_vbak-AUART = 'ZAC'.
reg-auart = 'ZMC1'.
else.
reg-auart = 'ZRM1'.
ENDIF.
reg-vbeln = salesdocument_ex.
insert into zorders values reg.
COMMIT WORK AND WAIT.
write: / salesdocument_ex.
ENDLOOP.
MESSAGE i398(00) WITH text-i01.
ENDFORM. " CREAORDERS
*---------------------------------------------------------------
Si alguno ha utilizado esta BAPI y sabe en qué estamos fallando con la unidad de medida, desde ya muchas gracias por su ayuda.