viernes, 21 de diciembre de 2012

Imagen subida con SE78 ¡se pone el fondo gris!

Frecuentemente los clientes nos remiten logos e imágenes para los formularios (SapScript o Smarform) en formatos que no son los que le gustan a SAP, son jpg, son demasiado grandes,.... Cuando he intentado editarlos o pasarlos a BMP he tenido problemas.
Recomiendo 2 cosas, por una parte usar Paint.Net para editarlas, es gratis y funciona bastante bien. Fácilmente podemos retocar ya sea en píxeles o centímetros. Me lo chivaron hace tiempo los de sistemas.
Por otra parte me pasa que veo la imagen en cualquier editor con fondo blanco pero al subirla a SAP con la SE78 y visualizarla me queda el fondo gris. Para solucionarlo debo abrirla con este editor de imagen, ir a Ajustes -> Autonivel y la vuelvo a subir SAP. Una vez más me ha funcionado.

viernes, 30 de noviembre de 2012

Añadir columna salida en al VA05N.

Después de añadir un par de columnas a a la VA05, mi consultor preferido para SD me ha pedido si se podía hacer para la VA05N, he visto que pasaba por la user donde les daba valor pero luego no mostraba las columnas ni tampoco estaban en los variantes de visualización.
He mirado foros, blogs con "add fields VA05N" y decían que no se podía, pero al final se me ha encendido la luz.
Habría que hacer primero como con la VA05 y luego ir a la SE11, visualizar estructura SERPSLS_GENDOC. Hacemos un clic en Estr.Append y le añadimos un Append con los mismos campos que hemos añadido en VBMTVZ.

Por ahora lo dejo en cuarentena para ver que no tiene otra afectaciones.

Añadir columna salida en al VA05.

Bueno simplemente seguir los pasos de SAPTRICKS de Roberto Espinosa, simplemente hacer notar que en:
2) Inclusión del campo en la estructura VBMTVZ. Al intentar añadir los campos me pide que registre el objeto, lo he resuelto con el botón Estr.Append y me ha permitido poner los campos fácilmente sin registrar.
3) Ajuste del include V05TZZMO donde se llenara el valor del campo. He intentado añadir el código como se hace como con la VA01, VA02 y VA03 en la MV45AFZZ. Pero no me deja insertar código dentro del CASE, sino antes o después. ¿Versiones? ¿Opciones? ¿Lo que hay entre la pantalla y la silla?.

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.

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. 

martes, 5 de junio de 2012

Textos en IDOC ORDER de entrada. E1EDKT1 y E1EDPT1.

Otra vez gracias a Laura. Debía decirle a la empresa que nos envían los IDOC's de ORDERS como nos deben llenar el segmento de textos. Entramos con la VA03 en un pedido. Para cabecera vamos a los textos y hacemos clic sobre el pergamino:

Aquí tenemos la información que tiene que estar en el segmento de cabecera:

Cabecera:
                E1EDKT1
TDID                      0001. Es Cl.txt.
TSSPRAS_ISO      ES.Es el idioma en el que queremos se guarde. Español.
TDOBJECT           VBBK. Es Objeto.
El resto de campos vacíos. Hay otro campo de idioma, pero es mejor dejarlo vacío, SAP ya realizará la conversión.

Análogamente para posición, iríamos al texto de posición. Sólo que no hay objeto.

Posición:
                E1EDPT1
TDID                      0001
TSSPRAS_ISO      ES
El otro campo vacío

viernes, 25 de mayo de 2012

Fichero inicio del SAP GUI 7.20: ini file.

En la versión del SAP GUI 7.20 el fichero de inicio con las rutas de las conexiones y otras opciones de configuración para el SAP Logon está en
C:\Documents and Settings\<USUARIO_WINDOWS>\Datos de programa\SAP\Common el fichero es saplogon.ini.

jueves, 24 de mayo de 2012

Mensaje de error 0034: Se ha presentado el error de tiempo de ejcución MESSAGE_TYPE_X

Después de una copia de la base de datos de productivo a test he ejecutado la entrada de IDOCs de pedido ORDERS, con el siguiente error:

Se ha presentado el error de tiempo de ejcución MESSAGE_TYPE_X .    Nº mensaje: 00341Diagnóstico    Textos de errores para batch input
    Este texto no será visualizado.
    Sólo reserva-espacio
Actividades en el sistema    ninguna
Procedimiento    ninguno

Solución.

Después de algunas vueltas por google e internet y mirar las notas 734364 y 984177, que no he aplicado. He hablado otra vez con Laura, hemos mirado la ST22. Había un problema con la sociedad PA que nuestras consultoras Lidia y Carol lo han solucionado, ya que faltaba regenerar algunos datos de esta sociedad.

miércoles, 16 de mayo de 2012

Dígito de control del SSCC (EAN128) y otros EANs.


Estoy con temas de EDIs-IDOCs de entregas, el mensaje DESADV, en la otra parte esperan que les envíe el código seriado o matrícula del bulto, SSCC que ahora mismo no es una cosa que estemos gestionando desde SAP. Lo tendré que crear y validar el Dígito de control, que ahora mismo es lo que me preocupaba.

SSCC. Serial Shipping Container Code.

Me han explicado que el SSCC es un código seriado o matrícula del bulto. Permite diferenciar dos bultos exactamente iguales. Tiene el formato EPPPPPPPSSSSSSSSSD donde:
  • E (1) es el dígito de empaquetado o de extensión. Es un número del 0 al 9. Habitualmente se utiliza el "3". Parece que en SAP corresponde al elemento de datos EAN128_HU_ART.
  • PPPPPPP (7) es la raíz del punto operacional del proveedor.
  • SSSSSSSSS (9) es un número secuencial que empezaría por "000000001" y continuaría sin repetirse en ningún bulto en al menos 1 año.
  • D (1) es el dígito de control calculado a partir de los anteriores con el algoritmo de cálculo de los códigos EAN.

Cálculo del dígito de control en SAP.

Después de buscar un rato por SAP, he encontrado en el grupo de funciones LE_BARCODE el módulo LE_CHECK_DIGIT_CALCULATION. Le digo en IF_NUMBER_WO_CHECK_DIGIT = ‘CPPPPPPPSSSSSSSSS’, y dejo los valores por defecto para IF_CALC_METHOD = ‘A’ y IF_USER_CALC_METHOD y IF_ONLY_CHECKING los dejo vacíos.
Me devuelve en  EF_NUMBER_W_CHECK_DIGIT todo el SSCC, es decir ‘CPPPPPPPSSSSSSSSSD’.

Otros usos.

Parece que se puede usar para el cálculo del dígito de control de otros EANs, por ejemplo el del punto operacional que guardamos para un cliente en la XD01 (XD02, XD03), es decir concatenaríamos de la KNA1 los campos BBBNR (Núm.ubic.int.1) y BBSNR (Núm.ubic.int.2) y nos devolvería estos unido a BUBKZ (Díg.ctrl.).

Y como seguro que otro día lo busco y no lo encuentro y hoy, anoto el grupo de funciones EAN_GLN_FUNCS que relaciona puntos operacionales y clientes y vendedores. 

lunes, 30 de abril de 2012

La tabla de los usuarios Desarrolladores ABAP en SAP.

Es frecuente que los usuarios de desarrollo, programación o developer, como quieras llamarlos se hereden y se presten durante un proyecto SAP y a que al final no sepamos cuales había. O nos dediquemos todos a usar el mismo cuando tenemos varios.
Para encontrarlos nada mejor que consultar la tabla DEVACCESS con la SE16N o SE16 según el gusto del programador ABAP.

miércoles, 25 de abril de 2012

MIRO, validación ítem. ¿Customer-Function o BADI?

Objetivo:

Realizar una validación propia en los ítems de la MIRO. Primero he probado con una ampliación vía CMOD. Me he creado el proyecto ZMIRO con MM08R002 (Exit de usuario para verificaciones de tolerancia) y he implementado la EXIT_SAPLMR1M_001. Cada vez que he tocado una posición me ha ido pasando, y con un MESSAGE i015(zmsg) WITH i_ydrseg-rblgp w_tarifa w_tarifa_x w_bstme me ha salido el error. Hacer notar que por cada posición pasaba 3 veces.

Validar al grabar con BADI:


Pero al grabar sin tocar no pasaba por la validación. Después de buscar por internet la solución parece ir por aquí.
SE18 para buscar la BADI que nos interesa, en nuestro caso INVOICE_UPDATE.
SE19 para implementarla

Implementamos, y le damos nombre. 








Activamos 












Le damos a nueva (folio) 










Le damos nombre, podemos poner el mismo y el texto corto. El último no campo no hace falta.







Al volver a la selección de enhacements, seleccionamos el nuestro.





Vamos a la pestaña Interface:











Clic en CHAGE_AT_SAVE 




Y podemos implementar en la línea de la solución que habíamos encontrado en snc.sap.com.

method IF_EX_INVOICE_UPDATE~CHANGE_AT_SAVE.
  DATA: lv_name_xblnr(30) TYPE c VALUE '(SAPLMRMP)RBKPV'.
  FIELD-SYMBOLS: <fs_rbkpv> TYPE mrm_rbkpv.

  ASSIGN (lv_name_xblnr) TO <fs_rbkpv>.
  IF <fs_rbkpv> IS ASSIGNED.
    <fs_rbkpv>-xblnr = 'VALUE'.
  ENDIF.
endmethod.

Validar al grabar con Customer-Function.

Gracias a Laura que me ha dado otra posibilidad para no tener que implementar la BADI. Incluyendo en mi proyecto ZMIRO de la CMOD la LMR1M001 (Exit de usuario en la verificación de facturas logística). En EXIT_SAPLMRMP_010. Pasamos por ella cada vez que guardamos.












martes, 20 de marzo de 2012

Debuggar salida de IDOC's. WE15

En el caso de la salida no podemos debuggar desde la WE19. Así que con la ayuda de JBlade y Laura lo hemos resuelto con un ejempo de facturas.

En el caso de INVOIC debemos tener el mensaje creado en la factura.


Y en Datos adicionales la modalidad de envío debe ser 1 o 2.


A partir de este momento podemos poner los break-point donde queramos de la función IDOC_OUTPUT_INVOIC o de los user-exit’s (grupo de funciones XEDF). Para poder debuggar usamos la WE15 – Proc.salida desde NAST. Es el programa RSNAST00.


A partir de la segunda vez, debermos marcar Volver a enviar.