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.

viernes, 29 de junio de 2012

Repetir etiquetas o impresión en un Smartform.


En un par de clientes he tenido que imprimir etiquetas y que se repitiesen varias. Si uso el campo para copias del smartform lo envía varias veces y si estamos usando la impresora de Windows es un rollo porque le pedirá varias veces la confirmación al usuario, tantas veces como copias.
Al final lo he resuelto con un loop dentro de la ventana main, con una estructura con el tamaño de la etiqueta. Para hacer el loop me he creado una tabla por que no he sabido hacer un loop sin tabla, igual otro me dice como hacerlo, pero yo lo he resuelto así:

1     Atributos formulario.

En salida ponemos DINA3 aunque usemos etiquetas más pequeñas, parece que si no hace el salto de página y va rescribiendo encima.

2     Interfase formulario.

COPIAS                  TYPE   TDSFCOPIES, con valor propuesta 1.

3     Definiciones Globales.

3.1   Tipos


TYPES: BEGIN OF ty_copia,
       num TYPE tdsfcopies,
END OF ty_copia.

TYPES: ty_tabla_copia TYPE TABLE OF ty_copia.

3.2   Datos Glob.

WA_T_BULTOS         TYPE   TY_BULTO

3.3   Rutinas Form.

FORM copias_t_set TABLES pt_copias TYPE ty_tabla_copia
                  USING p_copias TYPE ty_copia-num.

  DATA: w_contador TYPE ty_copia-num,
      wa_copias LIKE LINE OF pt_copias.

  WHILE w_contador < p_copias.
    w_contador = w_contador + 1.
    wa_copias-num = w_contador.
    APPEND wa_copias TO pt_copias.
  ENDWHILE.
*BREAK-POINT.
ENDFORM.

3.4   Inicialización.

* Tabla copias.
perform copias_t_set
                  tables g_t_copias
                     using copias.

4     Páginas y ventanas.

Definimos la ventana, y dentro hacemos el loop a la tabla g_t_copias. Dentro definimos la estructura de la etiqueta. 

jueves, 28 de junio de 2012