jump to navigation

Como cambiar el Encoding de un mensaje en SAP PI UTF-8 a ISO-8859-1 octubre 10, 2011

Posted by gstortoni in SAP PI, Uncategorized.
Tags: , , , , ,
add a comment

El modo correcto y recomendado por SAP. (comprobado)

Abrir el canal de comunicación:

Entrar a la pestaña Modules. y agregar un nuevo módulo..

OJO: Hay que observar BIEN ya que al agregar un nuevo módulo, éste pasará a ser el segundo en ejecutarse, estos se ejecutan en secuencia.. por lo que el primero que aparece es el: CallSapAdapter lo que hace este módulo es como su nombre lo dice, llamar al adaptador… con esto no se ejecutará el siguiente módulo. Lo que nosotros estamos buscando es que antes de llamar al adaptador, se realice la modificación del encoding por lo tanto, moveremos el CallSapAdapter a la segunda posicion, y reemplazaremos su MODULE KEY de 0 a 1.

El modulo a agergar es el: AF_Modules/XMLAnonymizerBean
Type: Local Enterprise Bean
Module Key: 0

Abajo, hay una opción que dice: Module Configuration.
Aquí se agregan los parámetros con los que se ejecutará el nuevo módulo

Parámetros:
Module Key: 0
Parameter Name: anonymizer.encoding
Parameter Value: ISO-8859-1

Module Key: 0
Parameter Name: anonymizer.quote
Parameter Value: ‘

Y listo, grabar activar, y verán que en el mensaje que llega al adaptador, se ha modificado el Encoding de:
<?xml version=”1.0″ encoding=”UTF-8″?> a
<?xml version=”1.0″ encoding=”ISO-8859-1″?>

Nota SAP para que puedan amplir un poco mas esta información:
880173

Adjuntar archivos a una Orden de Compra julio 26, 2011

Posted by gstortoni in Uncategorized.
add a comment

El siguiente código permite seleccionar un archivo y adjuntarlo a una orden de compra.

report zmmadjuntar_documentos .

parameter p_mandt like sy-mandt default sy-mandt .
parameter p_ebeln type ebeln .
parameter p_path like ibipparms-path memory id ad_local_path .
parameter p_name(30) default ’Prueba Adjunto’ lower case .

data w_prog like sy-repid .
data w_dynnr like sy-dynnr .

data w_attachement type borident .

initialization .
w_prog = sy-repid .
w_dynnr = sy-dynnr .
data lo_container type ref to cl_gui_container .

at selection-screen on value-request for p_path .
call function ’F4_FILENAME’
exporting
program_name  = w_prog
dynpro_number = w_dynnr
field_name    = ’P_PATH’
importing
file_name     = p_path.

start-of-selection .

data ws_borident like borident .
ws_borident-objkey = p_ebeln.
ws_borident-objtype = ’BUS2012′.

data w_document like sood4 .
data : begin of wt_files occurs 0 .
data fname(128) .
data end of wt_files.

wt_files-fname = p_path .
append wt_files .

data folder_id like soodk .
call function ’SO_FOLDER_ROOT_ID_GET’
exporting
region    = ’B’
importing
folder_id = folder_id
exceptions
others    = 1.

w_document-foltp = folder_id-objtp .
w_document-folyr = folder_id-objyr .
w_document-folno = folder_id-objno .
w_document-objdes = p_name .
w_document-objnam = p_name .

data w_h_data like sood2 ..
data w_fol_data like sofm2.
data w_rec_data like soos6 .

w_h_data-objdes = p_name .

call function ’SO_DOCUMENT_REPOSITORY_MANAGER’
exporting
method       = ’IMPORTFROMPC’
ref_document = w_document
tables
files        = wt_files
changing
document     = w_document
header_data  = w_h_data
folmem_data  = w_fol_data
receive_data = w_rec_data.
.

if w_document-okcode = ’CREA’ or w_document-okcode = ’CHNG’.
w_attachement-objtype = ’MESSAGE’.
w_attachement-objkey = w_document(34).

call function ’BINARY_RELATION_CREATE_COMMIT’
exporting
obj_rolea      = ws_borident
obj_roleb      = w_attachement
relationtype   = ’ATTA’
exceptions
no_model       = 1
internal_error = 2
unknown        = 3
others         = 4.

if sy-subrc = 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
commit work.
endif.

endif .

Transacción: ME23N

 

Suerte y que les Sirva ;)

ALV 00 sin tener que crear estructura en el diccionario mayo 28, 2010

Posted by gstortoni in ALV OO.
add a comment

Hola gente,
He visto cosas buenas en SAP y esto que les dejo a continuación, quizas algunos ya lo conozcan, pero no creo que lo hayan visto de la forma en que yo lo modifiqué.

El otro día tenía que sacar un ALV, y me acordé de un manualcillo que me prestó un compañero un día en el trabajo…
Lo bueno que tiene este ALV OO, es que no necesita utilizar DYNPROS… es espectacular para cuando necesitamos sacar un reporte rapidísimo y sin muchas lineas… entre dejar una salida con WRITE y dejarla en un ALV, prefiero el ALV no?

desde aca pueden descargarse el manual :
ALV Object Model – Simple 2D Table – The Basics (esta parte explica el manejo básico de esta clase)
Manual ALV – Lo Básico para empezar

ALV Object Model – Simple 2D Table – Event Handling (esta es la parte del manual que explica como usar los eventos)
Manual ALV – EVENTOS

Bueno, si ven los PDF, se entuciasmarán y comenzarán a copiar y pegar, activar y fuaa el F8 a volar… y quedarán fascinados…

Pero la Fascinación llega hasta que tratan de dar salida en ALV a una tabla interna, que no tiene necesariamente una estructura estandar asociada…
entonces dirán… bueno… este desgraciado en su Blog decía que era algo maravilloso, mejor que el otro que tenían que crear una Dynpro, pero igual me está obligando a crear una estructura en el diccionario…
y si yo les digo que no es necesario crear esa estructura? esa es la gracia de este POST.. me cabecié un rato y logré hacer que el uso de esa estructura no fuese necesario, todo gracias a los tan poco usados Field-Symbols (que en realidad son la 8va maravilla).

Les dejo mi código mas abajo… como siempre: copiar y pegar.

data: begin of ti_salida OCCURS 0,
bukrs type bkpf-bukrs,
belnr type bkpf-belnr,
gjahr type bkpf-gjahr,
end of ti_salida.

ti_salida-bukrs = ’1001′.
ti_salida-belnr = ’0000111111′.
ti_salida-gjahr = ’2009′.
append ti_salida.
ti_salida-gjahr = ’2010′.
ti_salida-belnr = ’0000222222′.
append ti_salida.
ti_salida-gjahr = ’2011′.
ti_salida-belnr = ’0000333333′.
append ti_salida.

FIELD-SYMBOLS <tabla> type ANY TABLE .
data: gr_table type ref to cl_salv_table.

assign ti_salida[] to <tabla>[].

cl_salv_table=>factory( importing r_salv_table = gr_table
changing t_table = <tabla>[] ).
gr_table->display( ).

Ya no tienen que estar matandose, dando salidas con Write que para ser sinceros son bastántes feas…

Que lo disfruten!!!!!!!!

Crear un Matchcode en tiempo de Ejecución en un Report común (SIN DYNPRO) enero 6, 2010

Posted by gstortoni in Uncategorized.
add a comment

Estimados,

he tenido el blog más que despreocupado… pero bueno ahora ya no estoy en abap me cambié a PI por lo que tiempo tengo muy poco…

de todas formas una compañera de trabajo que me preguntó si tenia algún codigo para generar un matchcode en tiempo de ejecución pero que fuera para reportes simples es decir sin el uso de Dynpros. La salvedad que tenía que tener este código es que además permitiera extraer todos los valores del matchcode…

Algunas imagenes:

Aqui les dejo el código… copiar, pegar y probar!!!!!
Disculpen si no pongo los colores como dios manda, pero no tengo tiempo.!!!

Saludos a tod@s

REPORT ygs_prueba.

DATA : BEGIN OF list_of_fields OCCURS 10,
fieldname LIKE dd03l-fieldname,
END OF list_of_fields.

DATA : indice LIKE sy-tabix,
fieldname LIKE dd03l-fieldname,
fields LIKE help_value OCCURS 10 WITH HEADER LINE,
shrinkfields LIKE dynpread OCCURS 0 WITH HEADER LINE,
dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE.

DATA: BEGIN OF ti_almacen OCCURS 0,
lgort LIKE t001l-lgort,
lgobe LIKE t001l-lgobe,
END OF ti_almacen.

TABLES vbap.

SELECTION-SCREEN BEGIN OF BLOCK blq1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS: s_matnr FOR vbap-matnr NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN END OF BLOCK blq1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_matnr-low.
REFRESH: ti_almacen, list_of_fields, fields, shrinkfields.
CLEAR: ti_almacen, list_of_fields, fields, shrinkfields.
*select lgort lgobe
*into corresponding fields of table ti_almacen
*from t001l
*.
ti_almacen-lgort = ’C001′.
ti_almacen-lgobe = ’XXXX’.
APPEND ti_almacen.

ti_almacen-lgort = ’C001′.
ti_almacen-lgobe = ’OOOO’.
APPEND ti_almacen.

ti_almacen-lgort = ’C001′.
ti_almacen-lgobe = ’AAAAA’.
APPEND ti_almacen.

list_of_fields-fieldname = ’T001L-LGORT’.
APPEND list_of_fields.

list_of_fields-fieldname = ’T001L-LGOBE’.
APPEND list_of_fields.

fieldname = ’S_MATNR’.

CALL FUNCTION ’TRANSFER_NAMES_TO_FIELDS’
EXPORTING
selectfield        = fieldname
TABLES
fields             = fields
namelist           = list_of_fields
EXCEPTIONS
wrong_format_given = 01.

CALL FUNCTION ’HELP_VALUES_GET_NO_DD_NAME’
EXPORTING
selectfield                  = fieldname
titel                        = ’Almacen de destino’
use_user_selections          = ’S’
IMPORTING
ind                          = indice
TABLES
fields                       = fields
full_table                   = ti_almacen
user_sel_fields              = shrinkfields
EXCEPTIONS
full_table_empty             = 01
no_tablestructure_given      = 02
no_tablefields_in_dictionary = 03
more_than_one_selectfield    = 04
no_electfield                = 05.

READ TABLE ti_almacen INDEX indice.

CONCATENATE ti_almacen-lgort ti_almacen-lgobe
INTO s_matnr-low SEPARATED BY ’-’.

Interacción entre ALV OO y Dynpro julio 25, 2008

Posted by gstortoni in Dynpro.
Tags: , , , ,
1 comment so far

Ayer, medio aburrido en el trabajo, decidí retomar un poco la programación orientada a objetos, ya que en mis últimos proyectos, no me fue necesaria.
Por lo que decidí hacer una especie de Agenda, en la que al agregar a un personaje, inmediatamente se vería reflejado en mi ALV OO,

Hasta ahi todo bien, ingresaba los datos, y luego apretaba el boton para guardar, y gracias al queridicimo PAI, agregaba a mi tabla interna la persona creada…

Luego se me ocurrió que el usuario hiciera doble click sobre cualquier persona ingresada (ALV) y que en unos campos de la dynpro destinados para modificación aparecieran sus datos, y aqui empezó mi pelea :D , manejando el evento de Doble Clic, recogí los datos, y debuggeando verifiqué que las variables de los campos, se estaban seteando correctamente, Pero (maldito pero) no se estaban colocando en los campos de la dynpro…

Coloqué un brakpoint tanto en el PAI como en el PBO, y para mi sorpresa, cuando hacía el doble click, ninguno de estos 2 se ejecutaba…. entonces, me dije a mi mismo: “Mismo, estamos en problemas”… empecé a buscar, y postié en la SDN, luego de unos pocos minutos, obtuve

mi respuesta… es tan simple como hacer lo siguiente:

Cuando declaramos el objeto para crear la “grilla” hay que pasarle el siguiente parámetro: ” i_appl_events = ‘X’ “, ejemplo:

CREATE OBJECT grid
EXPORTING
i_parent      = g_custom_container
i_appl_events = ‘X’.

Con esto, el ALV, sabe que al momento que se regitre un evento tendra que pasar nuevamente por el PBO.

por lo que mi problema quedo totalmente solucionado

:D

un pantallazo de la aplicación…

Mini Agenda OO

Saludos….

Leer Campo de una Dynpro cuando es inaccesible. julio 17, 2008

Posted by gstortoni in Funciones.
Tags: , , , , ,
3 comments

Sucede a veces, que uno necesita leer un campo de una Dynpro, pero ese campo es inaccesible por ejemplo, cuando se esta usando un USER EXIT y el campo lo vemos en la pantalla, pero el import del exit, o las tablas, no lo traen, bueno entonces que hacemos??? NO señor llorar no es la solución :D

existe una Fantástica función que nos permite resolver nuestro dilema, tal vez no sea la forma mas ortodoxa, pero en fin, nos saca del entuerto.
La Dichosa Función es como su nombre lo dice : UA_READ_FIELD_FROM_DYNPRO

manos a la obra.

Ingredientes:
DATA: program TYPE progname,
dynpro  TYPE sydynnr,
field_value TYPE dynfieldvalue.

program = sy-cprog. “Aca ingreso el nombre del programa
dynpro = sy-dynnr. “y aca va el numero de la dynpro donde esta mi campo

En mi caso deseo leer el campo FLD_CENTRO al cual no puedo acceder en tiempo de ejecución

CALL FUNCTION ‘UA_READ_FIELD_FROM_DYNPRO’
EXPORTING
id_program     = program
id_dynpro      = dynpro
id_field_name  = ‘FLD_CENTRO’
IMPORTING
ed_field_value = field_value
EXCEPTIONS
failed         = 1
OTHERS         = 2.

El valor del campo, es retornado en la variable field_value.

Ojo, la verdad no se si sea malo el uso o abuso de esta función, a mi me ha sacado de apuros, pero siempre trato de agotar las instancias para poder sacar de manera “Natural” el valor de los campos.

Saludo2

Crear Match Code en tiempo de ejecucion para una Dynpro julio 17, 2008

Posted by gstortoni in Match Code.
Tags: , , , , ,
1 comment so far

Esta es una forma bastante util e interesante para crear ayudas de busquedas en tiempo de ejecucion, en mi caso lo he usado en una Dynpro, ustedes veran que uso le dan.

En una Dynpro:
Primero que todo, hay que agregar dentro de la logica de proceso, luego del PAI, lo siguiente:

process on value-request.
field campo_que_necesitamos module module_match.

Una vez que tengamos escrito esto en la logica de proceso de la Dynpro, tenemos que crear el Module, hacemos doble click y ustedes deciden donde crearlo, por mi parte lo cree en el programa control.

Primero necesitamos los ingredientes:

databegin of list_of_fields occurs 10,
fieldname like dd03l-fieldname,
end of list_of_fields.

dataindice like sy-tabix,
fieldname like dd03l-fieldname,
fields like help_value occurs 10 with header line,
shrinkfields like dynpread occurs 0 with header line,
dynpfields like dynpread occurs 0 with header line.

databegin of ti_almacen occurs 0,
lgort like t001l-lgort,
lgobe like t001l-lgobe,
end of ti_almacen_dest.

En mi caso quiero mostrar los almacenes y su descripcion para un Centro dado.
Para ello, manualmente recojo los campos de la tabla y los almaceno en una TI.

select lgort lgobe
into
corresponding fields of table ti_almacen
from t001l
where werks eq
’2000′
.


Luego Hay que definir la estructura de la ayuda de busqueda.

list_of_fields-fieldname = ‘T001L-LGORT’.
append list_of_fields.

list_of_fields-fieldname = ‘T001L-LGOBE’.
append list_of_fields.

Defino el campo que quiero que quede en la pantalla cuando haya hecho doble clic sobre mi Match Code

fieldname = ‘LGORT’.

call function ‘TRANSFER_NAMES_TO_FIELDS’
exporting
selectfield        = fieldname
tables
fieldsfields
namelist           = list_of_fields

exceptions
wrong_format_given = 01.

Esta es la funcion que hace toda la maravilla

call function ‘HELP_VALUES_GET_NO_DD_NAME’
exporting
selectfield  = fieldname
titel  = ‘Almacen de destino’
use_user_selections = ‘S’

importing
ind = indice

tables
fieldsfields
full_table  = ti_almacen
user_sel_fields = shrinkfields

exceptions
full_table_empty  = 01
no_tablestructure_given = 02
no_tablefields_in_dictionary = 03
more_than_one_selectfield = 04
no_electfield = 05.


Ahora solo queda recorrer la tabla e indicar cual fue el indice que el usuario ha seleccionado.
read table ti_almacen index indice.

Con esto, paso el valor de la seleccion en este caso el LGORT a mi campo en pantalla
move ti_almacen-lgort to fld_almacen.

Y eso es todo, queda solo activar y disfrutar de una ayuda de busqueda sencilla. pero Muy efectiva

Grafico de Barras Dinamico con SmartForms julio 14, 2008

Posted by gstortoni in SmartForms.
Tags: , , , , , ,
5 comments

hace algun tiempo atras, me toco la tarea de mostrar un grafico de consumo para una boleta, el tema fue que me pidieron hacerlo en smartforms y que ademas, tenia el detalle de que este grafico, debia ser Dinamico.

Bueno, mi primer idea fue simplemente colocar imagenes dinamicas, pero me pidieron que consumiera recursos del procesador mejor, para generar dicho grafico, y no tener que hacer llamadas a las imagenes

En fin, comence a pensar como podria hacerlo, bueno luego de muchos intentos fallidos, llegue a una solucion muy bonita y muy simple jejeje

ingredientes:
Una ventana y 2 tablas.

Preparacion:
Primero, debemos crear la ventana, luego agregar ambas tablas… con la salvedad que una, debe estar justo encima de la otra. Entonces, la gracia de todo esto, es hacer que las tablas sean inversamente proporcionales al 100%, osea, si la tabla de arriba, crece un 35%, la de abajo, debe crecer un 65%, si la de arriba crece un 80%, la de abajo un 20%.

cosa a tener en mente, es que la tabla en un smartform, siempre crece hacia ABAJO.

Entonces, lo que tenemos que hacer, una vez que se ha entendido la idea (que en realidad es lo mas complejo) es lo siguiente, a la tabla de arriba, la llamaremos transparente y a la tabla de abajo la llamaremos tabla relleno, como se daran cuenta, la tabla de abajo es la que finalmente nos mostrara el grafico de barra, mientras que la de arriba es la que la desplaza siempre hacia abajo la de relleno.

A la tabla de relleno, le pondremos un color de fondo Gris, verde o lo que ustedes necesiten y si quieren un borde tambien.

se preguntaran, ahora como hacemos crecer las tablas, bueno, yo lo hice creandole un texto ( un punto .) color blanco MUY chico y con interlineado tambien muy chico, para que me acomodara en el espacio que tenia para el grafico de barras, la idea es escribir esto en cada tabla:

. \
.   - Tabla Transparente
. /

. \
.
.      Tabla de Relleno
.
. /

entonces, por el medio que a ustedes mas les acomode, definan el porcentaje para cada una de las tablas, osea, si la primer tabla tiene 3 puntos, y se que el total que puedo tener son 8, a la segunda tabla de relleno, le escribo 5 puntos.

Eso ya es tarea de ustedes :)

cuando tenga mas tiempo, agregare imagenes, para que los vean, realmente solo tienen que entender bien la idea de las 2 tablas y el resto sera pan comido

PD: Todos los acentos han sido obviados forzadamente, ya que no se como hacerlos en este maldito teclado en ingles :D

Seguir

Get every new post delivered to your Inbox.