9 Marzo 2010

enviar mails desde R/3

Archivado en: ABAP/IV — voet

Hola sufridos programadores de ABAP:

Enviar correos electrónicos desde R/3 es una tarea sencilla… si sabes cómo. Si no, puede ser algo muy lioso.

El requisito básico es configurar, en la transacción SCOT, un servidor SMTP. Debemos añadir al árbol INT (internet) un objeto SMTP y posteriormente configurarlo: basta con darle un nombre, activar la casilla “Nodo en operación” y especificar en Host y Puerta el nombre o IP del servidor SMTP y el puerto (normalmente el 25).

Pon también, en los tipos de dirección soportados, un * dentro del botón adyacente a la casilla “Internet”. Nada de esto servirá si en el menú de la SCOT > Opciones > Dominio por defecto no ponemos el nombre del dominio desde donde queremos que figure el remitente.

El servidor de correo, por otra parte, deberá estar correctamente configurado y con una adecuada política de permisos, que en ocasiones, dentro de las empresas, es muy restrictivo. De hecho, no me detengo mucho en esto porque esto es responsabilidad de Sistemas y no nuestra, meros picacódigos.

El proceso de enviar el mail en sí admite un montón de parámetros: pero, en aras de la simplicidad, he creado una función que debería funcionar en prácticamente cualquier sistema y que tiene sólo 3 parámetros: destinatario, título y contenido. Control de errores y demás están reducidos al mínimo, pero se pueden añadir a voluntad del programador.

He aquí el código de la función:

FUNCTION z_send_text_mail.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     VALUE(EMAIL) TYPE  STRING
*"     VALUE(SUBJECT) TYPE  STRING
*"     VALUE(TEXT) TYPE  STRING
*"----------------------------------------------------------------------
  "as seen on http://glob.cranf.net

  DATA it_packing_list TYPE TABLE OF sopcklsti1 WITH HEADER LINE.
  DATA it_receivers TYPE TABLE OF somlreci1 WITH HEADER LINE.
  DATA it_contents_txt TYPE TABLE OF solisti1 WITH HEADER LINE.
  DATA document_data TYPE sodocchgi1.
  DATA sent_to_all.

  "pasamos el string a tabla
  PERFORM string2table TABLES it_contents_txt USING text.

  "atributos del mensaje
  document_data-obj_langu = sy-langu.
  document_data-obj_name = 'SAPRPT'.
  document_data-obj_descr = subject.
  document_data-sensitivty = 'S'.
  document_data-no_change = space.

  " descripción del body
  CLEAR it_packing_list.
  REFRESH it_packing_list.
  it_packing_list-transf_bin = space.
  it_packing_list-head_start = 1.
  it_packing_list-head_num = 0.
  it_packing_list-body_start = 1.
  DESCRIBE TABLE it_contents_txt LINES it_packing_list-body_num.
  it_packing_list-doc_type = 'TXT'.
  APPEND it_packing_list.

  " destinatario
  CLEAR it_receivers.
  REFRESH it_receivers.
  it_receivers-receiver = email.
  it_receivers-rec_type = 'U'.
  it_receivers-com_type = 'INT'.
  APPEND it_receivers.

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = document_data
      put_in_outbox              = 'X'
      commit_work                = 'X'
    IMPORTING
      sent_to_all                = sent_to_all
    TABLES
      packing_list               = it_packing_list
      contents_txt               = it_contents_txt
      receivers                  = it_receivers
    EXCEPTIONS
      too_many_receivers         = 1
      document_not_sent          = 2
      document_type_not_exist    = 3
      operation_no_authorization = 4
      parameter_error            = 5
      x_error                    = 6
      enqueue_error              = 7
      OTHERS                     = 8.

ENDFUNCTION.

*     _        _             ____  _        _     _
* ___| |_ _ __(_)_ __   __ _|___ \| |_ __ _| |__ | | ___
*/ __| __| '__| | '_ \ / _` | __) | __| _` | '_ \| |/ _ \
*\__ \ |_| |  | | | | | (_| |/ __/| |_ (_| | |_) | |  __/
*|___/\__|_|  |_|_| |_|\__, |_____|\__|__,_|_.__/|_|\___|
*       ASCII Art made |___/ at http://ascii.cranf.net
FORM string2table TABLES ptable USING pstring TYPE string.
  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.                    "string2table

El texto puede incluir saltos de línea siempre que se haga uso de saltos de línea adecuados.

Es importante tener en cuenta que la función por sí sola no manda el mail. Debemos invocar un report estándar que se encarga de liberar la cola de correo. En principio esto está, o debería estar configurado, como job periódico. Pero podemos dar un empujoncito creando la siguiente función, que no tiene parámetros, para que los mails se hagan efectivos.

FUNCTION z_mail_launch.

  SUBMIT rsconn01 WITH mode = 'INT' WITH output = '' AND RETURN.

ENDFUNCTION.

Archivado en: ABAP/IV

síndrome de gilipolleces en el guión

Archivado en: Análisis, Cine, Denuncia — voet

No he visto la película que ha ganado los Oscar este año; que tampoco son unos premios que respete ya que son claramente autopremios de la industria cinematográfica para sí misma y siempre compiten un puñao de películas escogidas con criterios un tanto, ejem, confusos. Eso sí, me hubiera hecho ilusión que hubiera habido otro óscar para Gwyneth Paltrow: ¿Te imaginas en los telediarios? “Katzlerlrlin Biglglelou y Gwainnetz Palztrlrou, oscarizadas“.

Bromas aparte: a la vista de las críticas y observaciones que han hecho los profesionales retratados en la película, se deduce que la película sufre el Síndrome de Gilipolleces en el Guión.

Por algún motivo los guionistas, especialmente los de Hollywood, se recrean creando situaciones estúpidas de tensión y suspense en las películas. Desde la típica amenaza de muerte inminente para el prota al principio de la peli, en la que SABES que no va a pasarle nada al héroe porque si no se acaba la peli, hasta las situaciones completamente astúpidas e incoherentes con el personaje.

En el caso de la peli de Bigelow, las críticas están dirigidas a hechos retratados que en la vida real sencillamente no se consentirían y que son simplemente temerarios e inadmisibles en la profesión: como rechazar portar la protección antiexplosivos. Objetivo: crear (falsa) tensión fílmica.

Recuerdo que viví como ofensa una situación algo parecida en Cadena Perpetua. Si no la has visto no leas el párrafo siguiente.

La cuestión es que hay un momento en la película en que el prota aborda al cabrón de su carcelero, que está preocupado por un asunto fiscal, en lo alto de un tejado. En contra de todo lo que se asume que es el personaje de Tim Robbins (inteligente, reservado, cauteloso), a este no se le ocurre otra cosa que decirle a la bestia parda: ¿Confía en su mujer? en vez de Yo era contable y puedo ayudarle a cambio de unas cervezas. Así, el guardia agarra al prota amenazando con tirarlo desde lo alto lo que genera unos maravillosos segundos de tensión boba, provocando que finalmente vuestro globero favorito, que soy yo, se levante de la sala y se marche ante lo que promete ser otra bobada hollywoodiense.

Debo reconocer que años más tarde la vi entera y me gustó a grandes rasgos. Pero detalles como el que acabo de mencionar pueden arruinar una película.

Por favor, si eres guionista… no sacrifiques la totalidad de la historia a cambio de unos instantes insostenibles.

Hala, que agusto me he quedao.

Archivado en: Análisis, Cine, Denuncia
índice   cranf.net   wordnadapress
1