Adaptador REST parámetros dinámicos en las cabeceras HTTP febrero 13, 2018
Posted by gstortoni in SAP PI.Tags: Dynamic Headers, REST
add a comment
En este caso, me tocó un servicio REST donde como parámetro de cabecera pide un TOKEN que varía cada cierto tiempo, por lo que el valor finalmente se transforma en variable.
Primero generar en una UDF el seteo de los valores de las variables que se desean agregar:
DynamicConfiguration conf = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
DynamicConfigurationKey key_token = DynamicConfigurationKey.create(«http://sap.com/xi/XI/System/REST”, «XHeaderName1»);
conf.put(key_token, token); //->token es un argumento de entrada a la UDF
return «»;
Finalizada la UDF hay que configurar el adaptador REST.
En mi caso se trata de un method PUT ya que subo un archivo en base64.
Finalmente se debe realizar el seteo campo a campo:
Con eso se logra agregar dinámicamente valores a los campos Header en el adaptador REST.
Consumo de Servicio HTTP con POST desde ABAP diciembre 6, 2015
Posted by gstortoni in Uncategorized.add a comment
Bueno, esto es algo súper básico, pero quiero dejarlo por acá que no requiere mucho código.
La meta, consumir el clima desde un servicio HTTP, pasando los parámetros de ciudad y país por POST también se puede hacer muy facilmente por GET.
REPORT ygs_test LINE-SIZE 1023.
DATA:client TYPE REF TO if_http_client,
path TYPE string,
schemetype TYPE i,
off TYPE i,
hosttype TYPE string,
porttype TYPE string,
contenttype TYPE string.
DATA ld_request TYPE REF TO if_http_request.
selection-screen begin of block bck1 with frame title text-001.
parameters: pais type char20 default ‘CHILE’,
ciudad type char20 default ‘SANTIAGO’.
selection-screen end of block bck1.
path = ‘/globalweather.asmx/GetWeather’.
schemetype = 1.
CALL METHOD cl_http_client=>create(
EXPORTING
host = ‘173.201.44.188’
scheme = 1 » 1 = HTTP, 2 = HTTPS
IMPORTING
client = client ).
client->request->set_header_field( name = ‘~request_uri’ value = path ).
client->request->set_header_field( name = ‘~request_method’ value = ‘POST’ ).
client->request->set_header_field( name = ‘Content-Type’ value = ‘application/x-www-form-urlencoded’ ).
* send andreceive
ld_request = client->request.
CALL METHOD client->request->set_method(
if_http_request=>co_request_method_post ).
data: l_val type string.
clear l_val.
l_val = ciudad.
call METHOD ld_request->SET_FORM_FIELD
EXPORTING
NAME = ‘cityName’
VALUE = l_val.
clear l_val.
l_val = pais.
call METHOD ld_request->SET_FORM_FIELD
EXPORTING
NAME = ‘countryName’
VALUE = l_val.
client->send( ).
client->receive( ).
DATA: content TYPE string.
DATA: lt_itab TYPE TABLE OF string,
ls_itab TYPE string.
content = client->response->get_cdata( ).
SPLIT content AT cl_abap_char_utilities=>cr_lf INTO TABLE lt_itab .
LOOP AT lt_itab INTO ls_itab.
replace all occurrences of ‘<’ in ls_itab with ‘<‘.
replace all occurrences of ‘>’ in ls_itab with ‘>’.
WRITE:/ ls_itab.
ENDLOOP .
client->close( ).
Resultado:
Eso es todo.
PI – Enviar parametros via HTTP usando POST octubre 3, 2014
Posted by gstortoni in Uncategorized.add a comment
Nueva entrada ayuda memoria.
Tuvimos un problema en la empresa, donde debimos integrarnos con un proveedor que supuestamente nos daría un WebService, sin embargo al momento de iniciar el proyecto nos estrega un Formulario Web a llamarse via POST, al cual hay que setearle 4 parámetros. La respuesta de dicha llamada, es un texto, sin formato XML
Con el adaptador HTTP tradicional de PI (no el HTTP_AAE) no se pueden setear parámetros (o hasta donde yo sé, no se puede), por lo que tuvimos que hacer un poco de magia.
Los pasos realizados:
Utilizamos ABAP Mapping tanto para el request como para el response. (con esto se pierde la posibilidad de utilizar Integrated Configuration, si se quiere poder ejecutar mediante esta opción, es necesario realizarlo con JavaMapping).
ABAP MApping:
method IF_MAPPING~EXECUTE.
data: l_param1 type string,
l_param2 type string,
l_param3 type string,
l_param4 type string,
salida type string.
l_param1 = ‘PARAM1=Valor parametro 1’.
l_param2 = ‘PARAM2=Valor parametro 2’.
l_param3 = ‘PARAM3=Valor parametro 3’.
l_param4 = ‘PARAM4=Valor parametro 4’.
concatenate l_param1 l_param2 l_param3 l_param4 into salida separated by ‘&’.
CALL FUNCTION ‘SCMS_STRING_TO_XSTRING’
EXPORTING
text = salida
IMPORTING
BUFFER = result.
endmethod.
En el campo result, quedará la salida del Abap Mapping request en XSTRING.
Una llamada POST se compone del Header y parámetros.
Un ejemplo de post:
CABECERA
POST /bin/login HTTP/1.1
Host: 127.0.0.1:8000
Accept: image/gif, image/jpeg, */*
Referer: http://127.0.0.1:8000/login.html
Accept-Language: en-us
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Content-Length: 37
Connection: Keep-Alive
Cache-Control: no-cache
PARAMETROS
User=Usuario&pw=123456&action=login
El adaptador HTTP por si solo, genera la cabecera. Con las configuraciones dinámicas, podemos alterar en tiempo de ejecución los datos de la cabecera, o bien agregarle parámetros a la llamada URL. Sin embargo no pude agregar parámetros como campos al POST.
Luego, configuré el adaptador HTTP -> Content Type = application/x-www-form-urlencoded, por defecto viene : text/xml
El resultado de lo anterior, visto en http://www.posttestserver.com/
Time: Fri, 03 Oct 14 15:33:40 -0700 Source ip: 190.216.144.170 Headers (Some may be inserted by server) REQUEST_URI = /post.php QUERY_STRING = REQUEST_METHOD = POST GATEWAY_INTERFACE = CGI/1.1 REMOTE_PORT = 65299 REMOTE_ADDR = 190.216.144.170 HTTP_ACCEPT_ENCODING = gzip HTTP_HOST = www.posttestserver.com HTTP_USER_AGENT = SAP NetWeaver Application Server (1.0;730) HTTP_ACCEPT = */* HTTP_CONNECTION = close CONTENT_LENGTH = 99 CONTENT_TYPE = application/x-www-form-urlencoded UNIQUE_ID = VC8kRNBx6hIAAEGhqYcAAAAL REQUEST_TIME_FLOAT = 1412375620.4351 REQUEST_TIME = 1412375620 Post Params: key: 'PARAM1' value: 'Valor parametro 1' key: 'PARAM2' value: 'Valor parametro 2' key: 'PARAM3' value: 'Valor parametro 3' key: 'PARAM4' value: 'Valor parametro 4' Empty post body. Upload contains PUT data: PARAM1=Valor parametro 1&PARAM2=Valor parametro 2&PARAM3=Valor parametro 3&PARAM4=Valor parametro 4
http://www.posttestserver.com/data/2014/10/03/15.33.40719642992
Eso es todo!
Leer contenido de un documento adjunto – Documento de Venta febrero 25, 2013
Posted by gstortoni in Uncategorized.add a comment
Hola a todos…
Siglos sin escribir una entrada… sobre todo de ABAP… hace tiempo que estoy alejado de las canchas… pero ahora que me independicé y abrí mi propia consultora (starconsulting.cl) he tenido que volver a las raíces y hacer de todo entre ello volver a mi querido ABAP.
Hace un buen tiempo, escribí una entrada donde explico como adjuntar un documento a una orden de compra.
Ahora vamos a hacer la lectura del contenido de un archivo adjunto. Lo único que va cambiando es el Objeto (BUS2032 – Sales Order, BUS2012 – Purchase Order, etc).
En mi caso, la lectura que necesité realizar, fue la del contenido del documento para poder transmitirlo por una interfaz SAP PI y que en un sistema WEB se despliegue el documento.
Pero para realizar la demostración, lo que vamos a hacer en este ejemplo, es tomar el archivo y luego guardarlo en una carpeta local.
Demás está decir que si revisan la tabla: ti_content, verán el contenido del archivo.
Menos bla bla y mas trabajo.
report ZGS_LEE_ADJUNTOS.
parameters:
p_botype like tojtb-name default ‘BUS2032’, » e.g. ‘BUS2012’
p_bo_id like borident-objkey default ‘0002240352’.
data:
is_object type sibflporb,
et_links type obl_t_link,
et_links_s type obl_s_link,
icx_obl_parameter_error type ref to cx_obl_parameter_error,
icx_obl_internal_error type ref to cx_obl_internal_error,
icx_obl_model_error type ref to cx_obl_model_error.
data: l_doc_data type sofolenti1,
wa_content type solisti1,
ti_content type table of solisti1,
wa_hex type solix,
ti_hex type table of solix,
l_filename type string,
l_doc_id type SOFOLENTI1-DOC_ID,
l_separator,
l_append.
start-of-selection.
is_object-instid = p_bo_id.
is_object-typeid = p_botype.
is_object-catid = ‘BO’.
perform lee_adjunto.
end-of-selection.
form lee_adjunto.
refresh et_links.
try.
call method cl_binary_relation=>read_links_of_binrel
exporting
is_object = is_object
ip_relation = ‘ATTA’
importing
et_links = et_links.
endtry.
loop at et_links into et_links_s.
l_doc_id = et_links_s-instid_b.
call function ‘SO_DOCUMENT_READ_API1’
exporting
document_id = l_doc_id
importing
document_data = l_doc_data
tables
object_content = ti_content
contents_hex = ti_hex.
concatenate ‘c:\adjuntos\’ l_doc_data-OBJ_DESCR ‘.’ l_doc_data-OBJ_TYPE into l_filename.
if ti_content[] is not initial.
l_append = ‘X’.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = l_filename
filetype = ‘BIN’
write_field_separator = l_separator
append = l_append
CHANGING
data_tab = ti_content[]
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
if sy-subrc = 0.
message ‘Archivo creado correctamente, en carpeta c:\adjunto’ type ‘S’.
endif.
endif.
endloop.
endform.
Todos los adjuntos se descargan en la ruta: C:\ADJUNTO.
En mi caso, como podrán ver subí 4 archivos de distinto tipo: PNG, PDF, RAR y DOC para probar todas las alternativas.
Así está en SAP:
y así es descargado a mi computador:
Y acá la parte entretenida de todo esto… el contenido de los archivos:
Como dato adicional,
vale mencionar unas Notas que me ayudaron a dar esta solución tan sencilla:
927407 – Esta es la mejor de todas
804497
604603
904711
1080170
Saludos y espero que los pueda sacar de apuros.
Como firmar una app Android que usa Google MAPS para que se vea el mapa mayo 28, 2012
Posted by gstortoni in Android.Tags: android, Android Map, emulador, genkey, Google Maps, java jdk1
add a comment
Bueno,
Cuando generamos nuestro mapa y lo compilamos desde nuestro PC al emulador, o bien a nuestro dispositivo (Celular – Tablet), si seguimos los pasos correctos, el mapa se podrá ver.
Pero a mi me pasó, que decidí exportar la APP y enviársela a un amigo por mail para que le revisara.
Lo primero que me dijo, es que el mapa no se le veía.. acto seguido, desinstalé la APP de mi celular, y la instalé desde el archivo que envié por correo…. Sorpresa… a mi tampoco se me veía.
Me rompí un poco la cabeza y finalmente encontré la solución y a decir verdad es bastante lógica.
(ojo no soy un experto en esto… simplemente leí muchos Post y la documentación de Google y llegué a la solución).
Primero que todo… necesitamos generar nuestra PROPIA Clave… s
Si fueron capaces de llegar hasta la página: https://developers.google.com/android/maps-api-signup y obtuvieron su .KEYSTORE podrán ver que lo que en realidad obtuvieron fue la llave para uso en DEBUG, no para distribución, tal como dice el ejemplo de google:
$ keytool -list -keystore ~/.android/debug.keystore
Ahí dice clarito: «debug.keystore», es por esto que no se me ve el mapa… bueno, volvamos a obtener nuestra propia keystore privada.
El comando a ejecutar por DOS es:
C:\Program Files\Java\jdk1.7.0_01\bin>keytool -genkey -v -keystore c:\Guille\my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 40000
Entendamos un poco… primero que todo… el comando es el KEYTOOL que se encuentra en la carpeda JDK. Segundo, verán que le doy una ruta donde almacenar mi .keystore, la cual está en mi disco C, carpeta Guille finalmente hay que darle una validez… en mi caso 40000 dias lo que corresponde a 109 años… (un poco exagerado).
Una vez que tengamos nuestra llave privada… lo que debemos obtener es el MD5 de esta clave para ir nuevamente a la página de google y obtener la API Key del Mapa…
Pero esta vez en vez de decir que use el «debug.keystore» le vamos a decir que use nuestra llave privada:
C:\Program Files\Java\jdk1.7.0_01\bin>keytool -list -keystore c:\Guille\my-release-key.keystore -keypass Mi_Contraseña -v
Con este comando obtendremos el MD5 lo demás es tema conocido… ir a google y colocarlo, obtener la API KEY y reemplazar ahora en nuestra APP por la del MAPA.
Una vez que hayamos terminado este paso… es hora de volver a exportar la applicación, pero esta vez…, la vamos a exportar como una app sin firmar. Si no saben como hacerlo, en el AndroidManifest, está la opción en la primera pestaña (Manifest) sección Exporting:
Export an unsigned APK and sign it manually
Exportan el APK, ojalá en la misma ruta donde guardaron su keystore y ahora lo único que falta es finalmente FIRMARLO con nuestra llave publica.
para ello se ejecuta el siguiente comando:
C:\Program Files\Java\jdk1.7.0_01\bin>jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore c:\Guille\my-release-key.keystore c:\Guille\mi_app.apk alias_name
Con esto ESTA listo… ya tendrán su APP firmada con su llave privada y el mapa funcionando!!!
Hasta la próxima.
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: 880173, Encoding, ISO-8859-1, PI, SAP PI, UTF-8
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.1 comment so far
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.3 comments
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 ‘-‘.