viernes, 13 de diciembre de 2013

Recoger los campos en pantalla de un REUSE_ALV_GRID_DISPLAY

Me han pedido de solventar un problema que ocurría al imprimir un alv en excel.
Alguien creó el ALV con la función  REUSE_ALV_GRID_DISPLAY y el botón estándar de imprimir en XLS no funcionaba correctamente porqué el .xls se imprimía con los campos visualizados y con los no mostrados mediante el fieldcat, así que este alguien, borró la barra de botones y creó una nueva con un botón para imprimir el .xls mediante la función  SAP_CONVERT_TO_XLS_FORMAT, pero esta función, tampoco funciona correctamente si el alv tiene el layout modificado por el usuario.

Con lo cual, la opción que he encontrado más rápida y elegante, es buscar que campos se imprimen por pantalla mediante la función
GET_GLOBALS_FROM_SLVC_FULLSCR

Un vez tenemos el alv y a la que el usuario pulsa el botón de excel (uno que añadimos nosotros en la barra de botones)

DATAref_grid TYPE REF TO cl_gui_alv_grid,
      et_fieldcatalog  TYPE lvc_t_fcat,
      es_fieldcatalog LIKE LINE OF et_fieldcatalog, 
      xfc TYPE lvc_s_fcat,
      ifc TYPE lvc_t_fcat.

IF ref_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid ref_grid.
  ENDIF.
  IF NOT ref_grid IS INITIAL.
    CALL METHOD ref_grid->check_changed_data.
    CALL METHOD ref_grid->get_frontend_fieldcatalog
      IMPORTING
        et_fieldcatalog et_fieldcatalog.
 







* En ET_FIELDCATALOG-NO_OUT recibimos los campos que se muestran o no por pantalla
* Y así en IFC colocamos los nombres tipo y tamaño de los campos visualizados como si de un fieldcat se tratara. 
    LOOP AT et_fieldcatalog INTO es_fieldcatalog WHERE no_out IS INITIAL.
      CLEAR xfc.
      xfc-fieldname es_fieldcatalog-fieldname .
      xfc-datatype  es_fieldcatalog-datatype.
      xfc-outputlen es_fieldcatalog-outputlen.
      APPEND xfc TO ifc.
    ENDLOOP.


Así, siguiendo y adaptando a nuestro caso los pasos que nos detalla el bueno de rodrigo en

a partir de la linea: 
* Create dynamic internal table and assign to FS
  CALL METHOD cl_alv_table_create=>create_dynamic_table ...
  
podremos solventar el problemilla que nos incumbe.

Saludos!


Simbolo de escape en ABAP

Buenas, después de dos post "chorra style", ahora viene uno "serio".

Cuando hacemos un select, en las condiciones where le podemos insertar un simbolo de escape o Wildcard en inglés para que nos recoja el siguiente carácter como un literal mediante la almohadilla (#), pero...
¿Y que pasa si en un texto queremos insertar una comilla simple cómo literal?
si hacemos:
data: texto1(4)  VALUE '1234',
         texto2(5) 

CONCATENATE ' ' ' texto1 INTO texto2.
 o
CONCATENATE '#' ' texto1 INTO texto2.
 o
CONCATENATE '#'  texto1 INTO texto2.
no compila en los dos primeros casos y en el tercero nos imprime: texto2 = #1234.
Pero...
si hacemos
CONCATENATE '''' texto1 INTO texto2.
nos imprime '1234 ...Conseguido!
O sea si concatenamos 4 comillas simples y el texto correspondiente, funciona.

- Vale, y esto, ¿Para que c**o sirve? - Preguntareis y no sin razón.
-Pues sirve para que cuando estamos creando un fichero excel para realizar un download, si concatenamos la comilla simple delante de los campos numericos, el excel los interprete como texto en vez de interpretarlos como campo de coma flotante o alguna cosa rara.
Ah, y lo mejor de todo es que el excel, si en un campo de texto, se encuentra en la primera posición una comilla simple, no la muestra!
Ñaroniaroniaro!




lunes, 2 de diciembre de 2013

SOLUCIONES SAP

SAP, siempre se h preocupado de ofrecer soluciones destinadas a las empresas serias con productos como R3, HANA, SAPCloud, Fiori... etc...
A partir de ahora, también dará servicio a las empresas divertidas con SAPClown, la nueva solución horizontal para partir-se de la risa...

El key user que nos acompañará en la migración

(Una nueva entrada de su editor SAPERO favorito: DUMP BOY!)

martes, 6 de marzo de 2012

CODIGOS DE COLORES, ICONOS Y SIMBOLOS

Hay unos programillas en el estándar que nos pueden servir de ayuda a la hora de buscar un código de color o un símbolo especial para un report. Aquí los tenéis:

  • SHOWCOLO: Muestra la lista de colores de ABAP.
  • SHOWICON: Muestra los iconos disponibles con varias opciones de visualización.
  • SHOWLINE: Muestra ejemplos de cómo dibujar líneas, incluyendo esquinas, intersecciones, etc.
  • SHOWLISY: Lista de campos del sistema para reports.
  • SHOWSYMB: Muestra los símbolos especiales que podemos utilizar en reports.

Y colorín colorado enta entrada se ha acabado.

jueves, 1 de diciembre de 2011

Ahora lo entiendo TODO!

Muchas veces me he preguntado como puede ser que tantas veces hacer lo más sencillo en SAP sea tan complicado, se tengan que seguir tantos pasos y muchas veces no sepas porqué las cosas se han de hacer con "logica inversa"...
Pues bien, hoy repasando un manual de OOP, he visto la luz:

"friendship is one-sided:
A class granting friendship is not automatically a friend of its friends. If a class
granting friendship wants to access the non-public components of a friend, this
friend must also explicitly grant friendship to it."

O sea, Yo, como programador de SAP, soy amigo de SAP, pero SAP, pasa de mi cara olimpicamente...

¿Alguien sabe donde està el pincho en la SPRO para que SAP sepa que soy su amigo?
Sniff...

martes, 26 de julio de 2011

Misterios de SAP

Hola de nuevo,
Hoy me he encontrado con una de esas chorradas que tiene SAP un misterio de SAP...
Creando una dynpro a uno de los campos de texto le he puesto el texto de salida: "Real", y al visualizar la dynpro, he visto que los otros campos salían con la fuente arial y este con la fuente courier...
Después de varias pruebas he acabado por probar de escribir "Real_" (osease, con un espacio detrás) y ya me salía bien...
Misterio misterioso!
Alguien sabe de más "palabras reservadas" como por ejemplo "Real" que sea mejor no usar en dynpros para evitarte quejas de los keyusers?

Saludos!

martes, 19 de julio de 2011

Saltarte la falta de permisos en SE16n

en la ultima versión de SAP, aunque tengas los permisos en tipo full como desarollador la SE16n
te la encuentras capada y no puedes meter la zarpa actualizar las tablas de ninguna manera.
La manera de saltarte conseguir estos permisos es la siguiente:
Vamos a la SE16n.
escogemos nuestra tabla y ponemos todos los parametros por los que queremos filtrar.
Le metemos el debuger /h.
Le metemos el &sap_edit.
F8
Se nos abre el debuger.
Vamos a ->Breakpoints -> Crear Breakpoint en -> sentencia.
Le ponemos un breakpoint en "EXIT". aceptamos y le damos al F8
nos saltará el breakpoint y veremos el debuger.
Unas líneas más arriba veremos una senténcia que pone:
if sy-subrc = 0 and not ld_pos is initial.
select single se16n_sap_edit from se16n_edit
into ld_sap_edit
where pos = ld_pos.
if sy-subrc = 0 and ld_sap_edit <> true.
en la primera linea de este código, le hemos de poner un breakpoint manual y darle a gravar.
le damos al f8 y salimos sin poder editar a la pantalla de SE16n.
volvemos a poner el /h y el &SAP_EDIT y volvemos a dar a f8.
cargamos las variables sy-subrc o ld_pos para modificarlas.
en ld_pos (por ejemplo) le ponemos: '0001'.
le damos a F5 dos veces y cuando el programa pasa por el
if sy-subrc = 0 and ld_sap_edit <> true.
cargamos la variable ld_sap_edit para modificar y le cargamos el valor 'X'.
le damos a F8 y voilà! ya tenemos permiso para trastear con los datos de nuestra tabla!

jueves, 30 de junio de 2011

DATOS PARA EJEMPLOS DE SAP

Seguramente todos conocereis algún ejemplo de código de SAP (ver transacción DWDM) que utiliza el conjunto de tablas de ejemplo de vuelos, reservas, compañías aéreas, etc. El problema es que a veces estas tablas no disponen de datos y es difícil probar qué hacen esos ejemplos. Esto tiene una solución muy fácil, con el report SAPBC_DATA_GENERATOR podemos generar un juego de datos automático para las tablas de ejemplo de SAP.

viernes, 18 de marzo de 2011

FUNCION PARA VER UNA FACTURA DE COMPRAS

A falta de BAPIs sencillas e intuitivas (a menos que alguien me diga lo contrario) la función más fácil para ver una factura de compras con la transacción MIRO mediante es la siguiente: MRM_POSITION_TREATM que cómo véis no es nada intuitiva. Lo mejor es copiar el siguiente código y nos quedamos tan anchos.

data: ls_rbkpv type mrm_rbkpv.

ls_rbkpv-belnr = xbelnr.
ls_rbkpv-gjahr = xgjahr.

call function 'MRM_POSITION_TREATM'
exporting
i_tcode = sy-tcode
i_fcode = 'ITEM'
i_akt_typ = 'A'
i_kzverd = '0'
i_aggr_list_version = ''
changing
x_rbkpv = ls_rbkpv
exceptions
rbdrseg_not_found = 1
invoice_locked = 2
others = 3.

if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.


Saludos!

lunes, 24 de enero de 2011

AVERIGUAR LA LETRA (MAYÚSCULA) SIGUIENTE

Saludos nobles saperos,
He estado batallando con el código ascii para conseguir pasar una letra a ascii y después averiguar la letra siguiente sumándole n al ascii y pasando el ascii a char... y caca de la vaca... Además, me he encontrado que si trabajas con la 4.6 hace una cosa y si trabajas en versiones siguientes de SAP, hace otra... Mal!
Al final, he descubierto un campo de sistema que casi que te consigue hacerlo sin programar... sy-abcde!
al final el código me ha quedado tal que así:

letra(1) TYPE c,
letra2(1) TYPE c,

DATA:
letra(1) TYPE c VALUE 'A', "la letra de entrada
letra2(1) TYPE c, "la letra de salida
cont1 TYPE i, "contador
cont2 TYPE i. "contador


cont1 = 0.
cont2 = 1.

DO.
IF sy-subrc NE 0.
EXIT.
ELSE.
IF sy-abcde+cont1(1) EQ letra.
letra2 = sy-abcde+cont2.
EXIT.
ELSE.
cont1 = cont1 + 1.
cont2 = cont2 + 1.
ENDIF.
ENDIF.
ENDDO.


así pues, si igualmente queremos averiguar lo mismo pero con minúsculas (o combinado), podemos crearnos una var que contenga por ejemplo (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)... o cualquier cadena de carácteres que nuestro bienamado consultor tenga a bien mandarnos averiguar...


Venga pues, saludos y tal!
P.D.: como siempre mis posts tipo chorrada, pero bueno, es lo que tiene ser un dumpero! ;)