jump to navigation

Adaptador REST parámetros dinámicos en las cabeceras HTTP febrero 13, 2018

Posted by gstortoni in SAP PI.
Tags: ,
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 = 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 ‘&lt;’ in ls_itab with ‘<‘.
replace all occurrences of ‘&gt;’ in ls_itab with ‘>’.
WRITE:/ ls_itab.
ENDLOOP .
client->close( ).

 

Resultado:

Selección_002

Selección_003

Eso es todo.

 

 

Como acceder al contenido del Payload de un ABAP PROXY síncrono septiembre 3, 2015

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

Mi necesidad era leer el Payload que retornaba la excepción de un WebService.

Para obtener la Excepción primero hay que generar el FaultMessage en el Repository.

Selección_089

Posteriormente se deben generar los Service interfaces correspondientes con el FaultMessage y la excepción de la respuesta:

Outbound e Inbound:

Selección_091

Luego se debe generar el Mapping entre la excepción retornada por el WebService y la estructura de nuestro FaultMessage:

Selección_090

Para finalmente incorporar todo lo realizado en el Operation Mapping correspondiente en la pestaña FAULT:

Selección_093

Asi se ve la SXI_MONITOR cuando ejecutamos una interfaz con FaultMessage:

Selección_094

Y este es el PayLoad a cual quiero acceder, ya que por no ser el Payload del RESPONSE sino que un payload de la excepción, no lo puedo sacar desde la llamada al PROXY:

Selección_095

Me interesa rescatar el TAG: faultText.

Por el lado ABAP, una vez que gatillemos la interfaz, y se produzca la Excepción, podremos capturarla de la siguiente manera:

 DATA: lo_payload_handler TYPE REF TO if_ws_payload_handler,
 lo_payload TYPE REF TO if_ws_payload,
 lt_response_data TYPE ref to IF_WS_PAYLOAD,
 lo_pointer TYPE string,

 l_node TYPE REF TO if_ixml_node,
 l_xml TYPE REF TO cl_xml_document,
 retcode TYPE sysubrc,
 id_error type string.

TRY.
 CREATE OBJECT lo_proxy.
CALL METHOD lo_proxy->os_blueexpress
 EXPORTING
 output = ls_output
 IMPORTING
 input = ls_input.
CATCH cx_ai_system_fault INTO lo_system_ex.


CATCH zcx_application_error INTO lo_fault_ex. "<<<------- Mi excepción


CATCH cx_ai_application_fault INTO lo_app_ex. 
 

ENDTRY.

IF lo_fault_ex IS NOT INITIAL.

 lo_payload_handler = cl_proxy_access=>get_payload_handler(
 proxy_name = 'ZCO_OS_XXXX' "El nombre del Proxy
 proxy_method = 'EXECUTE_SYNCHRONOUS' ).

 CREATE OBJECT l_xml.
 lo_payload = lo_payload_handler->get_payload_from_exception( exception = lo_fault_ex ).
 lo_pointer = lo_payload->get_xml_text( ).
 retcode = l_xml->parse_string( lo_pointer ).


 l_node = l_xml->find_node( name = 'faultText'). "<<<<------ TAG de mi interés
 id_error = l_node->get_value( ).

 msglong = id_error.

 message id_error type 'S'.

ENDIF.

Selección_096

Eso es todo!

Cabe destacar, que la Interface: if_ws_payload_handler no solo sirve para rescatar el Payload de una excepción, sino que para el Request y el Response.

Selección_097

Bueno, eso es todo por esta vez!

Suerte!

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.

datal_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:

img_1

 

 

y así es descargado a mi computador:

img_2

 

 

Y acá la parte entretenida de todo esto… el contenido de los archivos:img_3

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 May 28, 2012

Posted by gstortoni in Android.
Tags: , , , , ,
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: , , , , ,
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 May 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 ‘-‘.