Archivos Mensuales: febrero 2010

Porcentaje de IVA a partir del indicador

Introducción

Los que estamos curtidos sabemos que, a veces, los caminos de SAP son inescrutables; pero más por retorcidos que porque no se puedan deducir. Es el caso de los porcentajes que corresponden a los tipos de IVA recogidos en campos MWSKZ. En vez de ser almacenados en una tabla al efecto, pues no. Se marea al programador.

La siguiente rutina deduce el porcentaje correspondiente a un indicador de IVA simplemente conociendo este y el país. Si sy-subrc no vale 0, es que no lo ha encontrado; esto se deberá controlar.

Una advertencia: los valores son devueltos como porcentajes literales, de 0 a 100. Cualquier operación que se realice con ellos deberá ser dividida a su vez por 100 para que el resultado sea correcto.

El código

*     _          _                   _  __   _                
*  __| | ___  __| |_   _  ___ ___   (_)/ /  (_)_   ____ _     
* / _` |/ _ \/ _` | | | |/ __| _ \    / /   | | \ / / _` |    
*| (_| |  __/ (_| | |_| | (__  __/   / /_   | |\ V / (_| |    
* \__,_|\___|\__,_|\__,_|\___|___|  /_/(_)  |_| \_/ \__,_|    
* as seen on http://cranf.com
* ASCII art made at http://ascii.cranf.net
*
FORM deduce_porcentaje_iva USING pland1 pmwskz CHANGING pkbetr LIKE konp-kbetr.

  DATA lvakey LIKE konh-vakey.
  DATA lknumh LIKE konh-knumh.
  CLEAR pkbetr.

  CONCATENATE pland1 pmwskz INTO lvakey SEPARATED BY space.

  SELECT SINGLE knumh
    INTO lknumh
    FROM konh
   WHERE vakey = lvakey.

  IF sy-subrc = 0.
    SELECT SINGLE kbetr INTO pkbetr
      FROM konp
     WHERE knumh = lknumh.
    IF sy-subrc = 0.
      pkbetr = pkbetr / 10.
    ELSE.
      sy-subrc = 2.
    ENDIF.
  ELSE.
    sy-subrc = 1.
  ENDIF.
ENDFORM.
Publicado en: SAP Sin comentarios ▼

Macros para mensajes de batch-input y BAPI

Introducción

La gestión de mensajes en Batch-Input y BAPI es bastante horrorosa, teniendo en cuenta además que utilizan dos estructuras muy similares pero con nombres de campos muy parecidos, lo que suele llevar a confusiones frustrantes cuando intentamos analizar el resultado.

Estas macros permiten gestionar los mensajes de ambos tipo de llamadas unificando criterios y simplificando al máximo el código a utilizar.

Las macros

  • vc_messtab2bapiret messtab bapiret2: mueve una estructura bdcmsgcoll a bapiret2.
  • vc_bapiret2messtab bapiret2 messtab: mueve una estructura bapiret2 a bdcmsgcoll.
  • vc_messtab2mensaje messtab cadenadetexto: construye un mensaje como texto a partir de una estructura bdcmsgcoll.
  • vc_bapiret2mensaje bapiret2 cadenadetexto: construye un mensaje como texto a partir de una estructura bapiret2.

El código

* _     _    ___                 _
*| |__ (_)  / / |__   __ _ _ __ (_)   _ __ ___   ___ ___ ___  __ _  __ _  ___ ___
*| '_ \| | / /| '_ \ / _` | '_ \| |  | '_ ` _ \ / _ \ __| __|/ _` |/ _` |/ _ \ __|
*| |_) | |/ / | |_) | (_| | |_) | |  | | | | | |  __/__ \__ \ (_| | (_| |  __/__ \
*|_.__/|_|_/  |_.__/ \__,_| .__/|_|  |_| |_| |_|\___|___/___/\__,_|\__, |\___|___/
*                         |_|                                      |___/
* as seen in http://glob.cranf.net
* ASCII art made using http://ascii.cranf.net
*
***********************************************************************
DEFINE vc_messtab2bapiret."convierte estructura messtab de BI a bapiret2
  "vc_messtab2bapiret messtab bapiret2.
  "lo hace de línea en línea, no usando tablas
  perform vc_messtab2bapiret using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_messtab2bapiret USING pbi TYPE bdcmsgcoll
                      CHANGING pbapi TYPE bapiret2.
  pbapi-type = pbi-msgtyp.
  pbapi-id = pbi-msgid.
  pbapi-number = pbi-msgnr.
  pbapi-message_v1 = pbi-msgv1.
  pbapi-message_v2 = pbi-msgv2.
  pbapi-message_v3 = pbi-msgv3.
  pbapi-message_v4 = pbi-msgv4.
ENDFORM.                    "vc_messtab2bapiret
***********************************************************************
DEFINE vc_bapiret2messtab. "convierte estructura bapiret2 a messtab de BI
  "vc_bapiret2messtab bapiret2 messtab.
  "lo hace de línea en línea, no usando tablas
  perform vc_bapiret2messtab using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_bapiret2messtab USING pbapi TYPE bapiret2
                     CHANGING pbi TYPE bdcmsgcoll.
  pbi-msgtyp = pbapi-type.
  pbi-msgid = pbapi-id.
  pbi-msgnr = pbapi-number.
  pbi-msgv1 = pbapi-message_v1.
  pbi-msgv2 = pbapi-message_v2.
  pbi-msgv3 = pbapi-message_v3.
  pbi-msgv4 = pbapi-message_v4.
ENDFORM.                    "vc_bapiret2messtab
***********************************************************************
DEFINE vc_messtab2mensaje. "convierte estructura messtab en mensaje verbal
  "vc_messtab2mensaje messtab cadenadetexto
  perform vc_messtab2mensaje using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_messtab2mensaje USING pbi TYPE bdcmsgcoll
                     CHANGING pmensaje.

  DATA lmsgid LIKE sy-msgid.
  DATA lmsgnr LIKE sy-msgno.
  DATA lmensaje LIKE sy-lisel.
  DATA lmsgv1 TYPE symsgv.
  DATA lmsgv2 TYPE symsgv.
  DATA lmsgv3 TYPE symsgv.
  DATA lmsgv4 TYPE symsgv.

  lmsgid = pbi-msgid.
  lmsgnr = pbi-msgnr.
  lmsgv1 = pbi-msgv1.
  lmsgv2 = pbi-msgv2.
  lmsgv3 = pbi-msgv3.
  lmsgv4 = pbi-msgv4.

  CALL FUNCTION 'RPY_MESSAGE_COMPOSE'
    EXPORTING
      language          = sy-langu
      message_id        = lmsgid
      message_number    = lmsgnr
      message_var1      = lmsgv1
      message_var2      = lmsgv2
      message_var3      = lmsgv3
      message_var4      = lmsgv4
    IMPORTING
      message_text      = lmensaje
    EXCEPTIONS
      message_not_found = 1
      OTHERS            = 2.
  IF sy-subrc <> 0.
    CLEAR lmensaje.
  ENDIF.
  pmensaje = lmensaje.
ENDFORM.                    "vc_messtab2mensaje
***********************************************************************
DEFINE vc_bapiret2mensaje."convierte estructura bapiret2 en mensaje verbal
  perform vc_bapiret2mensaje using &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_bapiret2mensaje USING pbapi TYPE bapiret2
                     CHANGING pmensaje.
  DATA lbi TYPE bdcmsgcoll.
  vc_bapiret2messtab pbapi lbi.
  vc_messtab2mensaje lbi pmensaje.
ENDFORM.                    "vc_bapiret2mensaje
***********************************************************************

Shameless self-promotion

Tengo unas estupendas macros para hacer Batch-Input en mi compactador de código BI. Échales un vistazo.

Publicado en: SAP Sin comentarios ▼

De string a tabla y viceversa

Introducción

En esta ocasión presento unas macros que permiten convertir strings en tablas internas y viceversa. Hago uso de ellas en mi librería WordWind, pero aquí se recogen como stand-alone en un include para cuando os sea necesario.

Aparte de las obvias funciones de interconversión, tenemos las opciones más sofisticadas de trabajar directamente con tablas tipo TLINE y la opción de hacer wordwrapping, es decir, de no romper las palabras a final de línea, pasándolas a la siguiente.

Las macros

  • vc_tab2str tabla cadena: convierte tabla con texto en string
  • vc_str2tab cadena tabla: convierte string en tabla
  • vc_str2tabwordwrap cadena tabla: esta rompe palabras por espacios o añade guiones
  • vc_str2tline cadena tabla: convierte string a tabla tline de texto estándar haciendo wordwrap
  • vc_tline2str tabla cadena: convierte tabla tline de texto estándar en string

El código

* _        _    ____      _       ____  _        _
*| |_ __ _| |__|___ \ ___| |_ _ _|___ \| |_ __ _| |__
*| __/ _` | '_ \ __) / __| __| '__|__) | __/ _` | '_ \
*| || (_| | |_) / __/\__ \ |_| |  / __/| || (_| | |_) |
* \__\__,_|_.__/_____|___/\__|_| |_____|\__\__,_|_.__/
* as seen in http://cranf.com
* una creación de alberto viñuela miranda
* convierte tablas de texto en cadenas y viceversa
* la tabla ha de tener cabecera.
* ni la cadena ni la tabla se inicializan: se efectua append

*DATA cadena(120) VALUE 'hola amigos como están ustedes'.
*DATA: BEGIN OF tabla OCCURS 0, linea(4), END OF tabla.
*  vc_tab2str tabla cadena.
*    convierte tabla con texto en string
*  vc_str2tab cadena tabla.
*    convierte string en tabla
*  vc_str2tabwordwrap cadena tabla.
*    esta rompe palabras por espacios o añade guiones
*  vc_str2tline cadena tabla
*    convierte string a tabla tline de texto estándar
*    haciendo wordwrap
*  vc_tline2str tabla cadena
*    convierte tabla tline de texto estándar en string.

*tab2str/str2tab
***********************************************************************
DEFINE vc_str2tab."convierte string en tabla de ancho arbitrario
  "vc_str2tab string tablainterna
  perform vc_str2tab tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tab TABLES ptable USING pstring.
  DATA lstring TYPE string.
  DATA loffset TYPE i.
  DATA lofflen TYPE i.
  DATA llimlen TYPE i.
  DATA lchunks TYPE i.
  DATA ltablength TYPE i.
  DATA lstrlength TYPE i.

  lstring = pstring.
  lstrlength = STRLEN( lstring ).

  DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
  lofflen = ltablength.

  lchunks = lstrlength / ltablength.

  WHILE loffset < lstrlength.
    llimlen = ltablength + loffset.
    IF llimlen > lstrlength.
      lofflen = lstrlength - loffset.
    ENDIF.
    ptable = lstring+loffset(lofflen).
    APPEND ptable.
    loffset = loffset + ltablength.
  ENDWHILE.
  CLEAR ptable.

ENDFORM.                                                    "vc_str2tab
***********************************************************************
DEFINE vc_tab2str."convierte contenido tabla interna en string
  "vc_tab2str tablainterna string.
  perform vc_tab2str tables &1 changing &2.
END-OF-DEFINITION.
*
FORM vc_tab2str TABLES ptable CHANGING pstring.
  LOOP AT ptable.
    CONCATENATE pstring ptable INTO pstring
      IN CHARACTER MODE
      RESPECTING BLANKS.
  ENDLOOP.
ENDFORM.                    "vc_tab2str
***********************************************************************
DEFINE vc_str2tabwordwrap. "convierte string en contenido de tabla interna
  "sin romper las palabras
  "vc_str2tabwordwrap string tablainterna.
  perform vc_str2tabwordwrap tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tabwordwrap TABLES ptable
                        USING pstring.

  DATA ltablength TYPE i.
  DATA lauxline TYPE string.
  DATA lauxlinepre TYPE string.
  DATA lauxlen TYPE i.
  DATA lguion.
  DATA: BEGIN OF lit_previas OCCURS 0,
        palabra(72),
        END OF lit_previas.
  DATA: BEGIN OF lit_palabras OCCURS 0,
        palabra(72),
        END OF lit_palabras.

  CLEAR lauxline.
  SPLIT pstring AT space INTO TABLE lit_previas.
  DESCRIBE FIELD ptable LENGTH ltablength IN CHARACTER MODE.
* comprobamos que las palabras quepan SIEMPRE
  lguion = 'X'.
  WHILE lguion = 'X'.
    CLEAR lguion.
    REFRESH lit_palabras.
    LOOP AT lit_previas.
      lauxlen = STRLEN( lit_previas-palabra ).
      IF lauxlen > ltablength.
        ltablength = ltablength - 1.
        CONCATENATE lit_previas-palabra(ltablength)
                    '-'
              INTO lit_palabras-palabra.
        APPEND lit_palabras.
        lauxlen = lauxlen - ltablength.
        lit_palabras-palabra = lit_previas-palabra+ltablength(lauxlen).
        ltablength = ltablength + 1.
        APPEND lit_palabras.
        lguion = 'X'.
      ELSE.
        lit_palabras = lit_previas.
        APPEND lit_palabras.
      ENDIF.
    ENDLOOP.
    lit_previas[] = lit_palabras[].
  ENDWHILE.

* hacemos la carga definitiva
  LOOP AT lit_palabras.
    lauxlinepre = lauxline.
    CONCATENATE lauxline lit_palabras-palabra INTO lauxline
     SEPARATED BY space.
    CONDENSE lauxline.
    lauxlen = STRLEN( lauxline ).

    IF lauxlen > ltablength.
      ptable = lauxlinepre. APPEND ptable.
      lauxline = lit_palabras-palabra.
    ENDIF.
  ENDLOOP.

  APPEND lauxline TO ptable.

ENDFORM.                    "vc_str2tabwordwrap
***********************************************************************
DEFINE vc_str2tline."convierte string en contenido de tabla TLINE (texto sap)
  "sin romper las palabras
  "vc_str2tline string tablainternatipotline.
  perform vc_str2tline tables &2 using &1.
END-OF-DEFINITION.
*
FORM vc_str2tline TABLES ptline
                   USING pstring.
  DATA: lwa_tline LIKE tline.
  DATA: BEGIN OF lit_lines OCCURS 0,
        linea LIKE tline-tdline,
        END OF lit_lines.
  vc_str2tabwordwrap pstring lit_lines.

  LOOP AT lit_lines.
    CLEAR lwa_tline.
    IF sy-tabix = 1.
      lwa_tline-tdformat = '*'.
    ENDIF.
    lwa_tline-tdline = lit_lines-linea.
    APPEND lwa_tline TO ptline.
  ENDLOOP.

ENDFORM.                    "vc_str2tline
***********************************************************************
DEFINE vc_tline2str."convierte contenido tabla TLINE (texto sap) en string
  "vc_tline2str tablainternatline string.
  perform vc_tline2str tables &1 using &2.
END-OF-DEFINITION.
*
FORM vc_tline2str TABLES ptline
                CHANGING pstring.
  DATA: lwa_tline LIKE tline.
  DATA: BEGIN OF lit_lines OCCURS 0,
        linea LIKE tline-tdline,
        END OF lit_lines.
  LOOP AT ptline INTO lwa_tline.
    lit_lines-linea = lwa_tline-tdline.
    APPEND lit_lines.
  ENDLOOP.
  vc_tab2str lit_lines pstring.
ENDFORM.                    "vc_tline2str
Publicado en: SAP Sin comentarios ▼
[c] Alberto Viñuela Miranda / Cranfcom 2013-2014

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.