viernes, 9 de noviembre de 2012

BADI ME51N Informar elemento PEP (Imputación) automaticamente de una solicitud de compras


Implementamos por la SE18-SE19 la BADI ME_PROCESS_REQ_CUST (Transacción ME51N)

BADI: ME_PROCESS_REQ_CUST    -> se18 -->Nre.BADI

***************************
* IF_EX_ME_PROCESS_REQ_CUST~PROCESS_ACCOUNT
***************************
METHOD if_ex_me_process_req_cust~process_account.
*Al realizar una solicitud de pedido la cual el tipo de imputación se “A” (Activo) [EBAN-KNTTP] y en la cual se
*indique un código de activo, si este activo tiene asociado un elemento PEP se rellenerá automáticamente en el campo de la solicitud de pedido.
*En caso que el activo no tenga asociado un elemento PEP, el campo de la solicitud referente al
*elemento PEP quedara vacio. Permitiendo continuar con la solicitud
  DATA: re_data TYPE exkn.
  CHECK im_count <= 1.
* obtenemos los datos de imputacion
  CALL METHOD im_account_ref->get_data
    RECEIVING
      re_data = re_data.
* si viene el nº de activo y no ha informado el elemento PEP, nosotros le informamos
* el del maestro de activos
  IF re_data-ps_psp_pnr IS INITIAL AND
     re_data-anln1      IS NOT INITIAL.
    SELECT SINGLE posnr INTO re_data-ps_psp_pnr
     FROM  anla CLIENT SPECIFIED
           WHERE  mandt  = sy-mandt
           AND    anln1  = re_data-anln1.
    IF sy-subrc IS INITIAL AND
       re_data-ps_psp_pnr IS NOT INITIAL.
      CALL METHOD im_account->set_exkn( re_data ).
    ENDIF.
  ENDIF.
ENDMETHOD.

martes, 6 de noviembre de 2012

!No tengo interlocutores en la posición 20 de la factura de ventas SD!

Es la segunda vez que me pasa, pero esta vez vamos a escribirlo aquí. Hago un report Z que tiene que sacar los interlocutores  (VBPA) por posición de las facturas y vemos que sólo me salen para la primera. Investigamos y hemos visto que sólo guarda los interlocutores para la primera posición y a la hora de mostrar en las transacciones estándares estos interlocutores nos lo muestran para todos.
Así que para buscar los interlocutores de la posición 20, por ejemplo hay que ir a la VBPA por factura y que el campo posición no sea 0, las 0 serían para la cabecera. Me suena raro, pero SAP sabrá porque si van a ser iguales para todas las posiciones no las guarda como cabecera.

sábado, 27 de octubre de 2012

Factura de un pedido de compras.


Problema: Tengo un pedido de compras (transacciones ME21N, ME22N, ME23N) y me piden el importe de la factura. De hecho en el caso del cliente para el que me lo piden tenemos facturas por compras (MIR4) “normales” y facturas con compras de costes indirectos de adquisición (transportista).

Resolución:  Hablando con mi consultor de guardia para SD me ha explicado que esto se ve yendo a las ME23N, en posición, pestaña Historial de Pedido.
En nuestro caso tenemos 2 facturas, las de costes de adquisición lo tenemos en la EKBZ, por pedido posición podemos ver y comparando podemos saber por qué campos también cribar (vgabe y bewtp), ya que sigue todo el “flujo” de documentos. Tendremos la factura en BELNR y el importe en moneda local en DMBTR.
Análogamente para EKBE tendremos las facturas normales.
En nuestro caso como sólo necesitamos importe lo hemos sumado usando la siguiente subrutina. Quizás tenga que depurarla un poco más, pero todo se andará.

FORM f_imp_factura      USING    p_ebeln TYPE ebeln
                                 p_ebelp 
TYPE ebelp
                        
CHANGING p_imp_factura TYPE DMBTR.

  DATAw_dmbtr TYPE dmbtr,
        w_shkzg 
TYPE shkzg.
  
CLEARp_imp_factura .

* 1.- Activ. Cost.ind.ad.log.fac.
  
SELECT dmbtr FROM  ekbz CLIENT SPECIFIED
    
INTO w_dmbtr
         
WHERE  mandt  sy-mandt
         
AND    ebeln  p_ebeln
         
AND    ebelp  p_ebelp
         
AND    vgabe  2
         
AND    bewtp  'M' OR bewtp  'P' ).
    
IF w_shkzg 'H'.
      
SUBTRACT w_dmbtr FROM p_imp_factura.
    
ELSE." 'S'
      
ADD w_dmbtr TO p_imp_factura.
    
ENDIF.
  
ENDSELECT.
*
* 2.- Activ. Recepción facturas
  
CLEARw_dmbtr.
  
SELECT dmbtr shkzg FROM  ekbe CLIENT SPECIFIED
    
INTO (w_dmbtrw_shkzg)
         
WHERE  mandt  sy-mandt
         
AND    ebeln  p_ebeln
         
AND    ebelp  p_ebelp
         
AND    vgabe  2
         
AND    bewtp  'Q' OR bewtp  'N' ).
    
IF w_shkzg 'H'.
      
SUBTRACT w_dmbtr FROM p_imp_factura.
    
ELSE." 'S'
      
ADD w_dmbtr TO p_imp_factura.
    
ENDIF.
  
ENDSELECT.

ENDFORM.  

miércoles, 24 de octubre de 2012

Error al añadir nuevo tipo de pedido en BAPI.


Problema: Heredo un programa que para crear pedidos desde un fichero usa BAPI_SALESORDER_CREATEFROMDAT2. Hasta este momento son pedidos con tipo de documento de ventas TA (VBAK-AUART) y funciona bien. Al añadir dos tipos nuevos me da el mensaje de error V1 761, como estoy en un cliente en inglés es algo así como "Unpermitted combination of business object &1 and sales doc. category &2". Y en &2 me va diciendo K o L según el nuevo tipo.
Solución: Leyendo la mejor respuesta en SCN llego a la conclusión que lo mejor es usar SD_SALESORDER_CREATE usando los parametros tal como los tenía llenos en la BAPI. 
Porque el problema está ahí, la BAPI sólo vale para el BUS BUS2032 con el que llama a SD_SALESORDER_CREATE. De hecho no he probado a no poner el BUS con la nueva función porque no parece obligatorio. El BUS depende del VBTYP de la TVAK, es la K y la L que me daba en el error.
Para saber el BUS que hay que poner uso la siguiente subrutina.

FORM f_obtain_bus USING p_auart TYPE auart
                  CHANGING p_bus TYPE nast-objtype.
*
  DATA: w_vbtyp LIKE  vbak-vbtyp.
*
  SELECT SINGLE vbtyp FROM  tvak CLIENT SPECIFIED
    INTO w_vbtyp
         WHERE  mandt  = sy-mandt
         AND    auart  = p_auart.

*
  CALL FUNCTION 'SD_OBJECT_TYPE_DETERMINE'
    EXPORTING
      i_document_type   = w_vbtyp
    IMPORTING
      e_business_object = p_bus.
*
ENDFORM. 



viernes, 19 de octubre de 2012

Errores y mensajes en móviles.

Problema: Estoy con transacciones de SAP por móviles (pistolas) tipo LM01, LM05, etc. Tengo unos mensajes de error que no acabo de detectar de dónde me vienen.
Solución: Para saber cuales son hay que poner un break-point en la función CALL_MESSAGE_SCREEN (Call message screen) del grupo de funciones LMOB (Mobile Computing in Warehousing). Evidentemente con esta función podemos sacar mensajes por pantalla.

viernes, 7 de septiembre de 2012

Error en Smartform por no existir imagen de la SE78.


Problema: tengo un smartform y en ella una imagen. La imagen las subo con la SE78, son BMAP, BCOL. El problema lo tengo en que el nombre es dinámico w_milogo y si no hemos subido la imagen con la SE78 el formulario no sale y da error. ¿Cómo evitarlo?
Buscando por internet he visto que la tabla donde se guardan los atributos  básicos de la imagen es en stxbitmaps, por lo tanto es tan sencillo como ver si existe el valor en esta tabla.

SELECT SINGLE tdname FROM  stxbitmaps
  INTO (w_milogo)
       WHERE  tdobject  = 'GRAPHICS'
       AND    tdname    = w_milogo
       AND    tdid      = 'BMAP'
       AND    tdbtype   = 'BCOL'.
*
IF sy-subrc IS NOT INITIAL.
  CLEAR w_milogo.
ENDIF.
Finalmente  en las condiciones de la imagen del Smartform ponemos que w_milogo no es igual a INITIAL, y evitamos el error.

jueves, 26 de julio de 2012

Transacción COR6N en Batch Input (BDC) no para en error.

Situación:

Cambio de versión, de la 500 a la 605.

Problema:

Teníamos un programa Z que realizaba una serie de impresiones y finalmente llamaba con un
    CALL TRANSACTION ‘COR6N’    USING bdcdata
                     
MODE     ‘E’
                     
MESSAGES INTO errortab
                     
UPDATE   ‘S’.
En el caso de existir un error la COR6N se para tanto en la versión 5 como en la 6:
[01]
Pero en la versión 6 al ejecutar por Batch Input en el programa Z en modo prueba de errores no se quedaba parado en la pantalla que lista los errores y nos permite solventarlos.
No sólo eso si no que nos insertaba valores que podíamos ver en la COGI.  Después de buscar notas oss, que se aplicaban para este tipo de errores pero que no eran necesarias porque ya son recogidas por la versión estábamos algo desesperados, porque el problema no tenia sentido.
Finalmente gracias a la sugerencia de JM Renedo, hemos jugado con las opciones del call transaction aunque no habíamos cambiado nada, la solución:

DATAw_ctu_params LIKE ctu_params.
    w_ctu_params-updmode 'S'.     w_ctu_params-dismode 'E'.     w_ctu_params-nobinpt 'X'.
CALL TRANSACTION tcode    USING bdcdata OPTIONS FROM _ctu_paramsMESSAGES INTO errortab.
De esta forma si que se nos para en el error y permite al usuario solventarlo. Es como si le dijésemos que no es batch input.