Monday, November 15, 2010

Monedas

Campo WAERS generalmente se encuentra en la cabecera
la descripcion de este campo esta en la tabla tCURC

TX Explorador del servidor

AL11

Leer en el servidor

*-------------------------------------------------------------*
PARA LEER EN EL SERVIDOR
*-------------------------------------------------------------*


REPORT zdataset04 MESSAGE-ID zbc420_04.

TYPES: BEGIN OF gty_data,
texto(100) TYPE c,
END OF gty_data.

DATA: gti_data TYPE TABLE OF gty_data WITH HEADER LINE.

DATA: infile2 LIKE epsf-epsdirnam.
DATA: infile1 LIKE epsf-epsdirnam.

infile1 = '/tmp/prueba1.txt'.
infile2 = '/tmp/prueba_04_otra2.txt'.

OPEN DATASET infile1 FOR INPUT IN TEXT MODE ENCODING DEFAULT.

IF sy-subrc EQ 0.

DO.
READ DATASET infile1 INTO gti_data.
CASE sy-subrc.
WHEN '0'.
APPEND gti_data.
WHEN '4'.
EXIT.
WHEN '8'.
MESSAGE e000 WITH 'No se puede'.
ENDCASE.
ENDDO.

ELSE.

MESSAGE e000 WITH 'No se puede leer archivo ' infile1.

ENDIF.
CLOSE DATASET infile1.

Escribir en el servidor

FORM write_server .
  DATA: ls_root        TYPE char100,
        ls_dir         TYPE char100,
        ls_num_file(8) TYPE n,
        ls_rango       TYPE inri-nrrangenr VALUE '01',
        ls_mensaje     TYPE char50.
  field-symbols:  TYPE gty_archivo.
  "ls_dir = '/interface/400/pos/salida'.
  ls_dir = '/interface/'.
* Obtner numero correlativo de archivo
  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      nr_range_nr = ls_rango
      object      = 'ZTABDM'
    IMPORTING
      number      = ls_num_file.
  CONCATENATE ls_dir 'ZTABDM' ls_num_file '.txt' INTO ls_root.

  OPEN DATASET ls_root FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
  IF sy-subrc EQ 0.
    CATCH SYSTEM-EXCEPTIONS dataset_read_error = 11
    OTHERS = 12.
      LOOP AT gtd_archivo ASSIGNING .
        TRANSFER -linea TO ls_root.
      ENDLOOP.
      ls_mensaje = 'Archivo creado'.
      CLOSE DATASET ls_root.
    ENDCATCH.
  ELSE.
    ls_mensaje = 'No se pudo crear el archivo'.
  ENDIF.
ENDFORM. 

programa y crear tx

Con la tx se93 se mira que programa esta ligado a una tx.
Para crear la transacción se crea con la 2da opción delos radio buttons.

Implementar badi

Se usa la transaccion se19 y se18 (nombre badi, interfaz nombre badi)

Diferencia entre screen exit, field exit user exit badi

http://www.sap-basis-abap.com/abap/difference-between-user-exits-screen-exits-field-exits.html

Difference Between User Exits, Screen Exits and Field Exits
What are the differences between user, screen and field exits?

Let me answer this question for you:

The basic rule in SAP as far as ABAP workbench developments are concerned is "Do not modify the source code of the program"

Since needs and requirements keep on changing from client to client and for various business scenarios, there is a need to customise the programs as per client requirement.

For this purpose, SAP has provided numerous list of user-exits also known as enhancements, which is nothing but a program which will deal with the client additional requirement, without modifying the source code of the program. These exits are already provided by SAP. You can see the list of user-exits provided by using the transaction code SMOD. If you cannot find an user exit which match with client requirements, then you can tell SAP to create a new user exit.

On the other hand, field exit is nothing but where you write a small program, to control the properties of an existing field in a particular screen. Hence creation of a field exit is controlled by Program name, screen no. and the field name.

To give you an example, if you want to prevent a particular payment method to be executed via transaction FBZ5 or F-58, such that if the user enter a particular payment method while executing the transaction FBZ5 or F-58, the system should restrict the user from proceeding further, u can write a field exit for field RZAWE (payment method).

The program which controls the creation of field exit is RSMODORF

As far as screen exit is concerned, as per the client requirement if the user wants a separate screen to appear on execution of a particular task, which deviates from the standard sap provided flow of transactions, you write a screen exit. In such case you first prepare the screen using the screen painter and define it as to after which sap screen you want this screen to appear for processing the transaction further.

Tips by : Rakesh Jain

Encontrar transacciones - User exit

http://www.sap-img.com/ab038.htm

report zuserexit no standard page heading.
tables : tstc, tadir, modsapt, modact, trdir, tfdir, enlfdir.
         tables : tstct.
data : jtab like tadir occurs 0 with header line.
data : field1(30).
data : v_devclass like tadir-devclass.
parameters : p_tcode like tstc-tcode obligatory.

select single * from tstc where tcode eq p_tcode.
if sy-subrc eq 0.
   select single * from tadir where pgmid = 'R3TR'
                    and object = 'PROG'
                    and obj_name = tstc-pgmna.
   move : tadir-devclass to v_devclass.
      if sy-subrc ne 0.
         select single * from trdir where name = tstc-pgmna.
         if trdir-subc eq 'F'.
            select single * from tfdir where pname = tstc-pgmna.
            select single * from enlfdir where funcname =
            tfdir-funcname.
            select single * from tadir where pgmid = 'R3TR'
                               and object = 'FUGR'
                               and obj_name eq enlfdir-area.

            move : tadir-devclass to v_devclass.
          endif.
       endif.
       select * from tadir into table jtab
                     where pgmid = 'R3TR'
                       and object = 'SMOD'
                       and devclass = v_devclass.
        select single * from tstct where sprsl eq sy-langu and
                                         tcode eq p_tcode.
        format color col_positive intensified off.
        write:/(19) 'Transaction Code - ',
             20(20) p_tcode,
             45(50) tstct-ttext.
                    skip.
        if not jtab[] is initial.
           write:/(95) sy-uline.
           format color col_heading intensified on.
           write:/1 sy-vline,
                  2 'Exit Name',
                 21 sy-vline ,
                 22 'Description',
                 95 sy-vline.
           write:/(95) sy-uline.
           loop at jtab.
              select single * from modsapt
                     where sprsl = sy-langu and
                            name = jtab-obj_name.
                   format color col_normal intensified off.
                   write:/1 sy-vline,
                          2 jtab-obj_name hotspot on,
                         21 sy-vline ,
                         22 modsapt-modtext,
                         95 sy-vline.
           endloop.
           write:/(95) sy-uline.
           describe table jtab.
           skip.
           format color col_total intensified on.
           write:/ 'No of Exits:' , sy-tfill.
        else.
           format color col_negative intensified on.
           write:/(95) 'No User Exit exists'.
        endif.
      else.
          format color col_negative intensified on.
          write:/(95) 'Transaction Code Does Not Exist'.
      endif.

at line-selection.
   get cursor field field1.
   check field1(4) eq 'JTAB'.
   set parameter id 'MON' field sy-lisel+1(10).
   call transaction 'SMOD' and skip first   screen.

Usuarios auditoria

TYPES: BEGIN OF lty_t001w,
werks TYPE t001w-werks,
bwkey TYPE t001w-bwkey,
END OF lty_t001w.
DATA: lth_t001w TYPE HASHED TABLE OF lty_t001w
WITH UNIQUE KEY werks.

SELECT werks bwkey INTO TABLE lth_t001w
FROM t001w
FOR ALL ENTRIES IN gtd_aufk_afpo
WHERE werks = gtd_aufk_afpo-werks.

LOOP AT gtd_aufk_afpo INTO lwa_aufk_afpo.
* Auditoría
lwa_ztbdatcmvprd-cpuus = sy-uname.
lwa_ztbdatcmvprd-cputm = sy-uzeit.
lwa_ztbdatcmvprd-cpudt = sy-datum.
ENDLOOP.

Llamar a una funcion de otro programa

PERFORM nombre_funcion(Nombre_programa).

Eliminar multiple botones de status GUI

DATA: BEGIN OF TAB OCCURS 10,
FCODE(4),
END OF TAB.
REFRESH TAB.
MOVE '&ACTU' TO TAB-FCODE.
APPEND TAB.
SET PF-STATUS 'STATUS_000' EXCLUDING TAB.

Proceso en batch

IF sy-batch EQ 'X'.
endif.

Rangos en vez de “SELECT ... for all entries”

DATA: lr_objnr TYPE RANGE OF coep-objnr,
lwa_objnr LIKE LINE OF lr_objnr.
LOOP AT gts_aufk_afpo ASSIGNING .
CLEAR lwa_objnr.
lwa_objnr-sign = 'I'.
lwa_objnr-option = 'EQ'.
lwa_objnr-low = -objnr.
append lwa_objnr TO lr_objnr.
ENDLOOP.
IF NOT lr_objnr IS INITIAL.
SELECT objnr beknz SUM( mbgbtr ) AS canti SUM( wtgbtr ) AS monto
FROM coep
INTO TABLE ltd_temp
WHERE kokrs = p_kokrs AND
objnr IN lr_objnr AND
perio = p_perio AND
gjahr = p_gjahr AND
lednr = p_lednr AND
beknz IN ('L','S','H')
GROUP BY OBJNR beknz.
* HAVING canti <> 0 AND monto <> 0.
ENDIF.

Parameters y select options

PARAMETERS: p_perio TYPE coep-perio OBLIGATORY,
p_gjhar TYPE coep-gjahr OBLIGATORY,
p_budat TYPE date OBLIGATORY,
p_kokrs TYPE coas-kokrs default 'GWNG',
p_lednr TYPE coep-lednr default '0'.
SELECT-OPTIONS: s_autyp FOR coas-autyp DEFAULT '05',
s_bukrs FOR coas-bukrs,
s_werks FOR coas-werks OBLIGATORY,
s_auart FOR coas-auart OBLIGATORY default 'RM01',
s_aufnr FOR coas-aufnr,
s_prctr FOR coas-prctr.

Maintenance view with custom F4

1.While executing the maintenance view using the sm30 transaction, go to the menu System, status and get the program name then go to the transaction se38 and edit it, generally this name has SAPL at the beginning an the view's name after that.
2.Add to the screen flow logic .
PROCESS ON VALUE-REQUEST. "F4
  FIELD ZVA_ZTASPIRANTE-PNACI MODULE matchcode_estad.
3.Function
MODULE matchcode_estad INPUT.
  DATA: BEGIN OF help_item OCCURS 0,
          carrid TYPE s_carr_id,
          connid TYPE s_conn_id,
        END OF help_item.
  SELECT carrid  connid
  INTO TABLE help_item
  FROM spfli.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield    = 'CARRID'
      dynprofield = 'CONNID'
      dynpprog    = sy-cprog
      dynpnr      = sy-dynnr
      value_org   = 'S'
    TABLES
      value_tab   = help_item.
ENDMODULE.
4.    Whether you need to validate the input, uncheck the field foreign .. in the screen layout for the modified field and go back to the screen flow logic and within the loop add the module
PROCESS AFTER INPUT.
  MODULE liste_exit_command AT EXIT-COMMAND.
  MODULE liste_before_loop.
  LOOP AT extract.
...
    FIELD zva_ztaspirante-pnaci MODULE validar_pais ON REQUEST.
  ENDLOOP.
  MODULE liste_after_loop. .
5.MODULE validar_pais INPUT.
  DATA ls_carrid TYPE s_carr_id.
  SELECT SINGLE carrid INTO ls_carrid  FROM spfli
         WHERE carrid = zva_ztaspirante-pnaci.
  IF sy-subrc <> 0.
    MESSAGE: 'No existe el valor ingresado' TYPE 'E'.
  ENDIF.
ENDMODULE.     

Agregar Botones a ALV OO

TOP
CLASS gcl_alvoo_event_handler DEFINITION.
* toolbar
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object,
* user command
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.

ENDCLASS.
CLA
CLASS gcl_alvoo_event_handler IMPLEMENTATION.
*toolbar
METHOD handle_toolbar.
PERFORM handle_toolbar_alvoo CHANGING e_object.
ENDMETHOD.
*User command
METHOD handle_user_command.
CASE e_ucomm.
WHEN 'REG'.
PERFORM registrar_aspirante.
WHEN 'ELI'.
PERFORM eliminar_aspirante.
ENDCASE.
CLEAR e_ucomm.
ENDMETHOD.
ENDCLASS.
F02
FORM handle_toolbar_alvoo CHANGING pe_object TYPE REF TO cl_alv_event_toolbar_set.
DATA is_boton TYPE stb_button.
MOVE : 'SOLEMI' TO is_boton-function,
'@B1@' TO is_boton-icon,
'Solicitar emision' TO is_boton-text,
'Solicitar emision' TO is_boton-quickinfo.
APPEND is_boton TO pe_object->mt_toolbar.
CLEAR is_boton.
ENDFORM. " handle_alv_toolbar

ALV OO

Preliminares
crear screen 0100
crear custom control en el dynpro 0100 nombre CC_0100
crear 'STATUS_100'.
Crear 'TITULO_100'.
TOP
* Tabla global para el manejo al alv.
DATA: gtd_alv TYPE STANDARD TABLE OF gty_alv.
* Variables para construir layout y fieldcat el alvOO.
DATA: gwa_alvoo_layout TYPE lvc_s_layo.
* Tabla con los datos del layout del alvOO.
DATA: gtd_alvoo_fieldcat TYPE lvc_t_fcat.
*Clase usada en el manejo del alv
CLASS gcl_alvoo_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object,
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS.
* Objetos para el ALV
DATA: go_custom_container TYPE REF TO cl_gui_custom_container,
go_alvoo TYPE REF TO cl_gui_alv_grid,
go_alvoo_event_handler TYPE REF TO gcl_alvoo_event_handler.
* Comando de eventos
DATA gs_okcode_0100 TYPE sy-ucomm.
CLA
* Clase usada en el manejo del alv
CLASS gcl_alvoo_event_handler IMPLEMENTATION.
METHOD handle_toolbar.
ENDMETHOD.
METHOD handle_user_command.
ENDMETHOD.
ENDCLASS.
MAI
START-OF-SELECTION.
PERFORM cargar_data.
IF gtd_alv[] IS NOT INITIAL.
PERFORM construir_alvoo.
call screen 100.
ENDIF.
F01
cargar data
F02
FORM construir_layout_alvoo CHANGING pwa_layout_alvoo TYPE lvc_s_layo.
pwa_layout_alvoo-zebra = 'X'.
pwa_layout_alvoo-sel_mode = 'A'.
ENDFORM.
--------------------------------------------
FORM construir_layout_alvoo CHANGING pwa_layout_alvoo type lvc_s_layo.
pwa_layout_alvoo-zebra = 'X'.
pwa_layout_alvoo-sel_mode = 'A'.
ENDFORM. " construir_layout_alvoo
------------------------------------------
FORM contruir_catalogo_alvoo CHANGING ptd_alvoo_fieldcat TYPE lvc_t_fcat.
* Sociedad
PERFORM llenar_fieldcat_alvoo USING 'BUKRS' 'GTD_ALV' '' 'X' ''
text-c01 text-c02 'T001' 'BUKRS'
CHANGING ptd_alvoo_fieldcat.
* Fecha de Emision
PERFORM llenar_fieldcat_alvoo USING 'FEMIS' 'GTD_ALV' '' '' ''
text-c03 text-c04 'T001' 'FMHRDATE'
CHANGING ptd_alvoo_fieldcat.
* Numero de carta fianza
PERFORM llenar_fieldcat_alvoo USING 'NCFIA' 'GTD_ALV' '' '' ''
text-c05 text-c06 '' ''
CHANGING ptd_alvoo_fieldcat.
ENDFORM.
--------------------------------------------
FORM llenar_fieldcat_alvoo USING pi_campo TYPE lvc_fname
pi_tabla TYPE lvc_tname
pi_ccampo TYPE lvc_cfname
pi_key TYPE lvc_key
pi_enfatizar TYPE lvc_emphsz
pi_textl
pi_textm
pi_rtabla TYPE lvc_rtname
pi_rcampo TYPE lvc_rfname
CHANGING ptd_fieldcat_alvoo TYPE lvc_t_fcat.
DATA: lwa_fieldcat TYPE lvc_s_fcat.
lwa_fieldcat-fieldname = pi_campo.
lwa_fieldcat-tabname = pi_tabla.
lwa_fieldcat-key = pi_key.
lwa_fieldcat-cfieldname = pi_ccampo.
lwa_fieldcat-emphasize = pi_enfatizar.
lwa_fieldcat-scrtext_l = pi_textl.
lwa_fieldcat-scrtext_m = pi_textm.
lwa_fieldcat-ref_table = pi_rtabla.
lwa_fieldcat-ref_field = pi_rcampo.
APPEND lwa_fieldcat TO ptd_fieldcat_alvoo.
CLEAR lwa_fieldcat.
ENDFORM. " llenar_fieldcat_alvoo
SCREEN 100
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE contenedor_0100.
PROCESS AFTER INPUT.
MODULE user_command_0100.
MODULE exit_0100 AT EXIT-COMMAND.
I01
MODULE exit_0100 INPUT.
gs_okcode_0100 = sy-ucomm.
CASE gs_okcode_0100.
WHEN 'BACK' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
WHEN 'EXIT'.
PERFORM salir_programa.
ENDCASE.
CLEAR gs_okcode_0100.
ENDMODULE.
O01
-----
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITULO_0100'.
ENDMODULE. " status_0100 OUTPUT
-----
MODULE contenedor_0100 OUTPUT.
IF go_custom_container IS INITIAL.
CREATE OBJECT go_custom_container
EXPORTING
container_name = 'CC_0100'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
IF sy-subrc NE 0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = sy-repid
txt2 = sy-subrc
txt1 = text-001.
ENDIF.
CREATE OBJECT go_alvoo
EXPORTING
i_parent = go_custom_container.
CREATE OBJECT go_alvoo_event_handler.
SET HANDLER go_alvoo_event_handler->handle_toolbar FOR go_alvoo.
CALL METHOD go_alvoo->set_table_for_first_display
EXPORTING
i_structure_name = 'GTD_ALV'
is_layout = gwa_alvoo_layout
i_default = 'A'
CHANGING
it_fieldcatalog = gtd_alvoo_fieldcat
it_outtab = gtd_alv.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_alvoo.
ELSE.
CALL METHOD go_alvoo->refresh_table_display.
ENDIF.
ENDMODULE. " contenedor_0100 OUTPUT

ALV OO Custom F4

http://blog.chinaunix.net/u1/40813/showart_347924.html
http://sapprograms.blogspot.com/2008/11/how-to-implement-f4-search-help-in-oo.html
http://ddolgey.tistory.com/10
1.TOP
 CLASS gcl_event_receiver DEFINITION.
   PUBLIC SECTION.
     METHODS:
     on_f4               FOR EVENT onf4 OF cl_gui_alv_grid
                         IMPORTING e_fieldname
                         es_row_no
                         er_event_data
                         et_bad_cells
                         e_display.
 ENDCLASS.  

2.CLA
CLASS gcl_event_receiver IMPLEMENTATION.
  METHOD on_f4.
     PERFORM on_f4 USING e_fieldname
                        es_row_no
                        er_event_data
                        et_bad_cells.
  ENDMETHOD.                                                "on_f4
ENDCLASS. 




3.PBO
SET HANDLER go_event_receiver->on_f4                FOR go_alv.
PERFORM registrar_campos_f4.
4.F01
FORM registrar_campos_f4.
  DATA: ltd_f4 TYPE lvc_t_f4 WITH HEADER LINE,
        lwa_f4 TYPE lvc_s_f4.
  lwa_f4-fieldname  = 'TRATA'.
  lwa_f4-register   = 'X'.
  lwa_f4-getbefore  = 'X' .
  lwa_f4-chngeafter = 'X'.
  lwa_f4-internal   = ''.
  INSERT lwa_f4 INTO TABLE ltd_f4.
  CALL METHOD go_alv->register_f4_for_fields
    EXPORTING
      it_f4 = ltd_f4[].
ENDFORM. 
.............................................
FORM on_f4  USING    p_e_fieldname TYPE lvc_fname
                     p_es_row_no TYPE lvc_s_roid
                     p_er_event_data TYPE REF TO cl_alv_event_data
                     p_et_bad_cells TYPE lvc_t_modi.
  CHECK p_e_fieldname = 'TRATA'.
  FIELD-SYMBOLS:  LIKE LINE OF gtd_dom_tratamiento.
  TYPES: BEGIN OF lty_f4,
            domvalue_l TYPE dd07v-domvalue_l,
            ddtext     TYPE dd07v-ddtext,
         END OF lty_f4.
  DATA: ltd_f4      TYPE TABLE OF lty_f4,
        lwa_f4      TYPE lty_f4,
        lwa_dominio TYPE dd07v.
  DATA: ltd_return  TYPE TABLE OF ddshretval,
        lwa_return  TYPE ddshretval.
  FIELD-SYMBOLS:  TYPE lvc_t_modi.
  DATA: ls_f4 TYPE lvc_s_modi.
* Cargar dominio en tabla.
  LOOP AT gtd_dom_tratamiento ASSIGNING .
    MOVE-CORRESPONDING  TO lwa_f4.
    APPEND lwa_f4 TO ltd_f4.
  ENDLOOP.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = p_e_fieldname
      value_org       = 'S'
    TABLES
      value_tab       = ltd_f4
      return_tab      = ltd_return
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 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.
  ELSE.
    READ TABLE ltd_return INTO lwa_return INDEX 1.
    CHECK lwa_return-fieldval <> ''.
    ASSIGN p_er_event_data->m_data->* TO .
    ls_f4-fieldname = p_e_fieldname.
    ls_f4-row_id = p_es_row_no-row_id.
    ls_f4-value = lwa_return-fieldval .
    APPEND ls_f4 TO .
    DATA lwa_aspirante TYPE gty_aspirante_alv.
    READ TABLE gtd_aspirante_alv INTO lwa_aspirante INDEX p_es_row_no-row_id.
    READ TABLE gtd_dom_tratamiento INTO lwa_dominio
         WITH KEY ddtext = lwa_return-fieldval.
    IF sy-subrc = 0.
      lwa_aspirante-trata = lwa_dominio-domvalue_l.
    ELSE.
      lwa_aspirante-trata = ''.
    ENDIF.
    UPDATE ztaspirante_10 SET   trata = lwa_aspirante-trata
                          WHERE numas = lwa_aspirante-numas.
    p_er_event_data->m_event_handled = 'X'.
  ENDIF.

table control

http://www.sapmaterial.com/tablecontrol_sap.html

Exportal Excel - XML

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/13092
http://wiki.sdn.sap.com/wiki/display/Snippets/XML+TAGS+simplifies+Excel+Download

1.En la transaccin STRANS crear un archivo llamado ZTEST_NP_XLS
- cambiar ExpandedColumnCount= numero de columnas a motrar.
- campos a mostrar









npatel
npatel
2009-01-01T22:27:09Z

11.8132


12660
19980
480
120
False
False







Material No Material Desc




3
4
1


False
False




False
False




False
False








2.En el codigo F01
FORM exportar_excel_xml.
  DATA: ls_xml    TYPE string,
        xml_table TYPE STANDARD TABLE OF string,
        ls_path   TYPE string,
        lc_rpta   TYPE c.
  CALL TRANSFORMATION ztest_np_xls
    SOURCE table = gtd_aspirante_alv
    RESULT XML ls_xml.
  APPEND ls_xml TO xml_table.
  PERFORM obtener_ruta_guardar_archivo USING  'Lista de Aspirantes'
                                              '.xls'
                                              'XLS files (*.XLS)|*.XLS'
                                     CHANGING ls_path
                                              lc_rpta.
  CHECK lc_rpta = 'T'.
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = ls_path
      filetype                = 'ASC'
    TABLES
      data_tab                = xml_table
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

Exporta excel OLE

http://saplab.org/2009/03/abap-to-excel/
http://saplab.org/wp-content/ZHCM_ABAP_TO_EXCEL.txt

http://www.richardsantos.net/2009/08/28/sap-export-alv-to-excel-file/

1.TOP
TYPE-POOLS ole2.
DATA: v_excel   TYPE ole2_object.
2.F01
FORM exportar_xls.
  DATA: v_wrkbkl  TYPE ole2_object,
        v_wrkbk   TYPE ole2_object,
        v_row  TYPE i.
  DATA: ls_path TYPE string,
        lc_rpta TYPE c.
  PERFORM obtener_ruta_guardar_archivo USING  'Lista de Aspirantes'
                                              'xls'
                                     CHANGING ls_path
                                              lc_rpta.
  CHECK lc_rpta = 'T'.
  DATA lwa_aspirante_alv TYPE gty_aspirante_alv.
  CREATE OBJECT v_excel 'EXCEL.APPLICATION'.
  PERFORM manejar_error_excel.
  SET PROPERTY OF v_excel  'Visible' = 1.
  CALL METHOD OF v_excel 'Workbooks' = v_wrkbkl.
  PERFORM manejar_error_excel.
  CALL METHOD OF v_wrkbkl 'Add' = v_wrkbk.
  PERFORM manejar_error_excel .
* Insertar cabecera
  PERFORM insertar_datos_excel USING 1 1 1 'Num. Asp.'.
  PERFORM insertar_datos_excel USING 1 2 1 'Ape. Paterno'.
  PERFORM insertar_datos_excel USING 1 3 1 'Ape. Materno'.
  PERFORM insertar_datos_excel USING 1 4 1 'Nombre'.
  PERFORM insertar_datos_excel USING 1 5 1 'Estado'.
  PERFORM insertar_datos_excel USING 1 6 1 'Fec. Nac.'.
  PERFORM insertar_datos_excel USING 1 7 1 'Lugar. Nac.'.
  PERFORM insertar_datos_excel USING 1 8 1 'Pais. Nac.'.
  PERFORM insertar_datos_excel USING 1 9 1 'Est. Civ.'.
  PERFORM insertar_datos_excel USING 1 10 1 'Posicion Per.'.
  PERFORM insertar_datos_excel USING 1 11 1 'Division Per.'.
  PERFORM insertar_datos_excel USING 1 12 1 'Grupo Per.'.
  PERFORM insertar_datos_excel USING 1 13 1 'Fec. Reg'.
* Insertar detalle
  LOOP AT gtd_aspirante_alv INTO lwa_aspirante_alv.
    v_row = sy-tabix + 1.
    PERFORM insertar_datos_excel USING v_row 1 0 lwa_aspirante_alv-numas.
    PERFORM insertar_datos_excel USING v_row 2 0 lwa_aspirante_alv-appat.
    PERFORM insertar_datos_excel USING v_row 3 0 lwa_aspirante_alv-apmat.
    PERFORM insertar_datos_excel USING v_row 4 0 lwa_aspirante_alv-nombr.
    PERFORM insertar_datos_excel USING v_row 5 0 lwa_aspirante_alv-estad.
    PERFORM insertar_datos_excel USING v_row 6 0 lwa_aspirante_alv-fnaci.
    PERFORM insertar_datos_excel USING v_row 7 0 lwa_aspirante_alv-lnaci.
    PERFORM insertar_datos_excel USING v_row 8 0 lwa_aspirante_alv-pnaci.
    PERFORM insertar_datos_excel USING v_row 9 0 lwa_aspirante_alv-estci.
    PERFORM insertar_datos_excel USING v_row 10 0 lwa_aspirante_alv-poper.
    PERFORM insertar_datos_excel USING v_row 11 0 lwa_aspirante_alv-diper.
    PERFORM insertar_datos_excel USING v_row 12 0 lwa_aspirante_alv-grper.
    PERFORM insertar_datos_excel USING v_row 13 0 lwa_aspirante_alv-fereg.
  ENDLOOP.
  CALL METHOD OF v_wrkbk 'SAVEAS'
    EXPORTING
      #1 = ls_path.
  CALL METHOD OF v_wrkbk 'CLOSE'.
  CALL METHOD OF v_excel 'QUIT'.
  FREE OBJECT v_excel.
  PERFORM manejar_error_excel.
ENDFORM.         "exportar_xls

*&---------------------------------------------------------------------*
*&      Form  insertar_datos_excel
*&---------------------------------------------------------------------*
*   PERFORM insertar_datos_excel USING rows columns boldfont valor
*----------------------------------------------------------------------*
*      -->X          text
*      -->Y          text
*      -->Z          text
*      -->VAL        text
*----------------------------------------------------------------------*
FORM insertar_datos_excel USING x y z val.
  DATA: v_cell    TYPE ole2_object,
        v_font    TYPE ole2_object.
  CALL METHOD OF v_excel 'Cells' = v_cell
    EXPORTING
    #1 = x
    #2 = y.
  PERFORM manejar_error_excel.
  SET PROPERTY OF v_cell 'Value' = val.
  PERFORM manejar_error_excel .
  GET PROPERTY OF v_cell 'Font' = v_font.
  PERFORM manejar_error_excel.
  SET PROPERTY OF v_font 'Bold' = z .
  PERFORM manejar_error_excel.
ENDFORM.                    "insertar_datos_excel

*&---------------------------------------------------------------------*
*&      Form  manejar_error_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM manejar_error_excel.
  IF sy-subrc <> 0.
    CALL METHOD OF v_excel 'QUIT'.
    FREE OBJECT v_excel.
    v_excel-handle = -1.
    MESSAGE: 'No se pudieron exportar los datos.' TYPE 'E'.
    EXIT.
  ENDIF.
ENDFORM.                    "manejar_error_excel

Agregar icono a ALV

1.TOP
Agregar campo a icon(30), estructura alv.
INCLUDE .

2.construir_catalogo
PERFORM llenar_fieldcat USING 'ICON' 'GTD_ASPIRANTE_ALV' '' 'X'
                               '' text-r03 text-r04 '' ''
                               '11' CHANGING po_gtd_fieldcat.
3.Llenar_fieldcat
IF pi_campo = 'ICON'.
    lwa_fieldcat-icon = 'X'.
  ENDIF.
4.cargar_data
*   cargar icono dependiendo del estado del aspirante
    CASE -estad.
      WHEN 'Registrado'.
        -icon = icon_checked.
      WHEN 'Aprobado'.
        -icon = icon_positive.
      WHEN 'Desaprobado'.
        -icon = icon_negative.
      WHEN 'Cargado'.
        -icon = icon_complete.
    ENDCASE.
6.actualiazar_tabla_alv
CASE lwa_aspirante_alv-estad.
      WHEN 'Registrado'.
        lwa_aspirante_alv-icon = icon_checked.
      WHEN 'Aprobado'.
        lwa_aspirante_alv-icon = icon_positive.
      WHEN 'Desaprobado'.
        lwa_aspirante_alv-icon = icon_negative.
      WHEN 'Cargado'.
        lwa_aspirante_alv-icon = icon_complete.
    ENDCASE.

Field symbols assign

    PERFORM existe_dominio USING    'gtd_dom_tratamiento'
                                    lwa_aspirante-trata
                           CHANGING p_lc_rpta.
    ls_error = 'No existe el tratamiento ingresado.'.
    CHECK p_lc_rpta = 'T'.

FORM existe_dominio USING    ps_tabla   TYPE c
                             pa_clave   TYPE any
                    CHANGING pc_rpta    TYPE c.
  FIELD-SYMBOLS:  LIKE gtd_dom_tratamiento.
  ASSIGN (ps_tabla) TO .
  READ TABLE  TRANSPORTING NO FIELDS
       WITH KEY domvalue_l = pa_clave.
  IF sy-subrc EQ 0.
    pc_rpta = 'T'.
  ELSE.
    pc_rpta = 'F'.
  ENDIF.
ENDFORM.                    "funcion

Convertir fecha en letras

FORM fecha_en_letras  CHANGING p_ls_fecha.
  DATA: mes LENGTH 2 TYPE c,
        anio LENGTH 4 TYPE c,
        dia LENGTH 2 TYPE c,
        mes_letra LENGTH 50 TYPE c.
  anio = gwa_ztaspirante_10-fereg(4).
  mes = gwa_ztaspirante_10-fereg+4(2).
  dia = gwa_ztaspirante_10-fereg+6(2).
  CASE mes.
    WHEN '01'.
      mes_letra = 'Enero'.
    WHEN '02'.
      mes_letra = 'Febrero'.
    WHEN '03'.
      mes_letra = 'Marzo'.
    WHEN '04'.
      mes_letra = 'Abril'.
    WHEN '05'.
      mes_letra = 'Mayo'.
    WHEN '06'.
      mes_letra = 'Junio'.
    WHEN '07'.
      mes_letra = 'Julio'.
    WHEN '08'.
      mes_letra = 'Agosto'.
    WHEN '09'.
      mes_letra = 'Septiembre'.
    WHEN '10'.
      mes_letra = 'Octubre'.
    WHEN '11'.
      mes_letra = 'Noviembre'.
    WHEN '12'.
      mes_letra = 'Diciembre'.
  ENDCASE.
  CONCATENATE dia 'de' mes_letra 'del' anio INTO p_ls_fecha SEPARATED BY ' '.
ENDFORM.                    " fecha_en_letras

Cargar tabla desde archivo II

FORM cargar_tabla_desde_archivo
      USING    p_ls_path       TYPE string
      CHANGING p_ltd_aspirante TYPE STANDARD TABLE
               p_lc_rpta       TYPE c.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_ls_path
      filetype                = 'ASC'
      has_field_separator     = 'X'
    TABLES
      data_tab                = p_ltd_aspirante
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.
  IF sy-subrc <> 0.
    p_lc_rpta = 'F'.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    p_lc_rpta = 'T'.
  ENDIF.
ENDFORM.  

Mostrar ventana archivo

FORM obtener_ruta_abrir_archivo  CHANGING p_ls_path TYPE string
                                          p_lc_rpta TYPE c.
  DATA: li_subrc       LIKE sy-subrc,
        ltd_filetable  TYPE filetable,
        lwa_filetable  TYPE file_table,
        li_user_action TYPE i.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Seleccionar archivo de texto'
      default_filename        = '*.txt'
      multiselection          = ' '
    CHANGING
      file_table              = ltd_filetable
      rc                      = li_subrc
      user_action             = li_user_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    p_lc_rpta = 'F'.
  ELSE.
    IF li_user_action = 0.
      READ TABLE ltd_filetable INTO lwa_filetable INDEX 1.
      p_ls_path = lwa_filetable-filename.
      p_lc_rpta = 'T'.
    ELSE.
      MESSAGE w184 WITH 'No se selecciono un archivo'.
       p_lc_rpta = 'F'.
    ENDIF.
  ENDIF.
ENDFORM.                    " obtener_ruta_abrir_archivo

Mostrar ventana guardar archivo

1.llamda a la funcion
PERFORM obtener_ruta_guardar_archivo USING  'Lista de Aspirantes'
                                              '.xls'
                                              'XLS files (*.XLS)|*.XLS'
                                     CHANGING ls_path
                                              lc_rpta.
CHECK lc_rpta = 'T'.
2.funcion
FORM obtener_ruta_guardar_archivo USING    ps_titulo    TYPE string
                                           ps_extension TYPE string
                                           ps_filtro    TYPE string
                                  CHANGING p_ls_path    TYPE string
                                           p_lc_rpta    TYPE c.
  DATA: ls_filename    TYPE string,
        ls_path        TYPE string,
        li_user_action TYPE i.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = ps_titulo
      default_extension    = ps_extension
      file_filter          = ps_filtro
*      default_file_name    = 'hoja_vida'
      initial_directory    = 'C:'
      prompt_on_overwrite  = 'X'
    CHANGING
      filename             = ls_filename
      path                 = ls_path
      fullpath             = p_ls_path
      user_action          = li_user_action
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 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.
    p_lc_rpta = 'F'.
  ELSE.
    CASE li_user_action.
      WHEN 0.
        p_lc_rpta = 'T'.
      WHEN OTHERS.
        MESSAGE w184 WITH 'Usuario cancelo la accion.'.
        p_lc_rpta = 'F'.
    ENDCASE.
  ENDIF.
ENDFORM.                    " obtener_ruta_guardar_archivo

Manejar mensajes

REPORT  zoperador_10 MESSAGE-ID 00.
REPORT  zoperador_10 MESSAGE-ID sabapdocu.
Enviar directamente MESSAGE: 'No se pudieron exportar los datos.' TYPE 'E'.
raise message with,
message e type I.

PARA WONG
REPORT YREPROCESAR_RC message-id zmm.

Convertir smartform a pdf

FORM convertir_smartform_pdf .
  DATA: lf_fm_name      TYPE rs38l_fnam,   "Nombre smartforms Generado
        lwa_outopt      TYPE ssfcompop,    "propiedades de visualizac
        lwa_ctrlop      TYPE ssfctrlop,    "Controles
        t_otfdata       TYPE ssfcrescl,
        t_pdf_tab       LIKE tline OCCURS 0 WITH HEADER LINE,
        t_otf           TYPE itcoo OCCURS 0 WITH HEADER LINE,
        li_filesize     TYPE i,
        ls_path         TYPE string,
        lc_rpta         TYPE c,
        li_bin_filesize TYPE i.
  DATA: ls_fecha TYPE string,
        ls_error TYPE string.
  PERFORM fecha_en_letras CHANGING ls_fecha.
* Opciones de control
  lwa_ctrlop-no_dialog = 'X'.
  lwa_ctrlop-getotf    = 'X'.
* Opciones de salida
  lwa_outopt-tdnoprev      = 'X'.
  lwa_outopt-xdf2outdev    = 'LP01'.
  lwa_outopt-tddest        = 'LP01'. "Impresora
  lwa_outopt-tdimmed       = 'X'.    "Imprimir Inmediatamente
  lwa_outopt-tddelete      = 'X'.    "Borrar despues de Impresion
  lwa_outopt-tdnewid       = 'X'.    "Crear una nueva orden spool
* Cargar smartform
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'ZSF_HOJAVIDA_10'
    IMPORTING
      fm_name            = lf_fm_name
    EXCEPTIONS
      no_form            = 1
      no_function_module = 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.
* Mostrar smatrform
  TRY .
      ls_error = 'No se pudo cargar la hoja de vida.'.
      CALL FUNCTION lf_fm_name
        EXPORTING
          control_parameters = lwa_ctrlop
          output_options     = lwa_outopt
          user_settings      = ' '
          ps_user            = sy-uname
          ps_fecha           = ls_fecha
        IMPORTING
          job_output_info    = t_otfdata
        TABLES
          ptd_ztaspirante_10 = gtd_cabecera_asp
          ptd_educacion      = gtd_educacion
          ptd_titulos        = gtd_titulos
          ptd_laboral        = gtd_laboral
          ptd_conocimientos  = gtd_conocimientos
        EXCEPTIONS
          formatting_error   = 1
          internal_error     = 2
          send_error         = 3
          user_canceled      = 4
          OTHERS             = 5.
      CASE sy-subrc .
        WHEN 1.
          MESSAGE e888 WITH ls_error 'Error de formato.'.
          RETURN.
        WHEN 2.
          MESSAGE e888 WITH ls_error 'Error interno.'.
          RETURN.
        WHEN 3.
          MESSAGE e888 WITH ls_error 'Error en el envio de datos.'.
          RETURN.
        WHEN 4.
          MESSAGE e888 WITH ls_error 'Usuario cancelo la accion.'.
          RETURN.
        WHEN 5.
          MESSAGE e888 WITH ls_error 'Error no contemplado.'.
          RETURN.
      ENDCASE.
    CATCH cx_sy_dyn_call_illegal_type.
      MESSAGE e888 WITH ls_error 'Excepcion lanzada'.
      RETURN.
  ENDTRY.
  t_otf[] = t_otfdata-otfdata[].
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = 'PDF'
      max_linewidth         = 132
    IMPORTING
      bin_filesize          = li_bin_filesize
    TABLES
      otf                   = t_otf
      lines                 = t_pdf_tab
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 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.
  ENDIF.
* Mostrar dialogo guadar archivo
  PERFORM obtener_ruta_guardar_archivo CHANGING ls_path
                                                lc_rpta.
  CHECK lc_rpta = 'T'.
* Descargar archivo
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize = li_bin_filesize
      filename     = ls_path
      filetype     = 'BIN'
    IMPORTING
      filelength   = li_filesize
    TABLES
      data_tab     = t_pdf_tab
    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 ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.
    MESSAGE s184 WITH 'Descarga Satisfactoria.'.
  ENDIF.
ENDFORM.  

Crear smartform

Crear el smartform
cargar los datos en tablas internas para enviarlas al SF.
form llamar_smartform .
    data: lf_formname          type tdsfname,     "Nombre Smartforms
        lf_fm_name           type rs38l_fnam,   "Nombre smartforms Generado
        p_output_options     type ssfcompop,    "propiedades de visualizac
        p_control_parameters type ssfctrlop.    "Controles
  lf_formname = 'ZSF_HOJAVIDA_10'.
* Propiedades de impresion:
  p_output_options-xdf2outdev    = 'LP01'.
  p_output_options-tddest        = 'LP01'. "Impresora
  p_output_options-tdimmed       = 'X'.    "Imprimir Inmediatamente
  p_output_options-tddelete      = 'X'.    "Borrar despues de Impresion
  p_output_options-tdnewid       = 'X'.    "Crear una nueva orden spool
*  p_output_options-tdcopies      = '12'.   "Nro de Copias de impresion
  p_control_parameters-preview   = 'X'.    "Vista de previsualizacion
  p_control_parameters-device    = 'PRINTER'.
  p_control_parameters-no_dialog = 'X'.    "Sin Cuadro de dialogo
  call function 'SSF_FUNCTION_MODULE_NAME'
    exporting
      formname           = lf_formname
    importing
      fm_name            = lf_fm_name
    exceptions
      no_form            = 1
      no_function_module = 2
      others             = 3.
  case sy-subrc .
    when 1.
      message i398 with 'No se pudo cargar el formulario.'.
      return.
    when 2.
      message i398 with 'No se pudo ejecutar el modulo de funcion.'.
      return.
    when 3.
      message i398 with 'No se pudo cargar la hoja de vida. Error no especificado.'.
      return.
  endcase.
  condense lf_fm_name.
* Obtener fecha en letras
  data ls_fecha type string.
  perform fecha_en_letras changing ls_fecha.
* Funcion que invoca al smartform
  try .
      call function lf_fm_name
        exporting
          control_parameters = p_control_parameters
          output_options     = p_output_options
          user_settings      = ' '
          ps_user            = sy-uname
          ps_fecha           = ls_fecha
        tables
          ptd_ztaspirante_10 = gtd_cabecera_asp
          ptd_educacion      = gtd_educacion
          ptd_titulos        = gtd_titulos
          ptd_laboral        = gtd_laboral
          ptd_conocimientos  = gtd_conocimientos
        exceptions
          formatting_error   = 1
          internal_error     = 2
          send_error         = 3
          user_canceled      = 4
          others             = 5.
      case sy-subrc .
        when 1.
          message i398 with 'No se pudo cargar la hoja de vida. Error de formato.'.
        when 2.
          message i398 with 'No se pudo cargar la hoja de vida. Error interno.'.
        when 3.
          message i398 with 'No se pudo cargar la hoja de vida. Error en el envio de datos.'.
        when 4.
          message i398 with 'No se pudo cargar la hoja de vida. Usuario cancelo la accion.'.
        when 5.
          message i398 with 'No se pudo cargar la hoja de vida. Error no contemplado.'.
      endcase.
    catch cx_sy_dyn_call_illegal_type.
      message i398 with 'No se pudo cargar la hoja de vida. Excepcion ejecutada'.
      return.
  endtry.

endform.                    " llamar_hoja_vida

1.Alv FUNCIONES (TOP_OF_Page) Impresion BATCH

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = ls_repid
i_structure_name = 'GTD_AUFK_AFPO'
i_callback_pf_status_set = 'SET_STATUS'
i_callback_user_command = 'USER_COMMAND_000'
i_callback_top_of_page = 'TOP_OF_PAGE'
is_layout = gwa_layout
it_fieldcat = gtd_fieldcat[]
TABLES
t_outtab = gtd_aufk_afpo
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*---------------------------------------------------------------------*
* FORM top_of_page *
*---------------------------------------------------------------------*
* Utilizado en el proceso en batch
*---------------------------------------------------------------------*
FORM top_of_page.
DATA: ls_text TYPE string,
ls_date(10) TYPE c,
ls_hora(10) TYPE c,
ls_util TYPE string.
* Titulo y subtitulo
ls_text = text-c01.
WRITE: 30 ls_text.
IF p_test EQ 'X'.
ls_text = text-c02.
ELSE.
ls_text = text-c03.
ENDIF.
WRITE /45 ls_text.
* Fecha
WRITE p_budat TO ls_date.
CONCATENATE text-c04 ls_date INTO ls_text SEPARATED BY space.
WRITE: / ls_text.
* Usuario
ls_util = sy-uname.
CONCATENATE text-c05 ls_util INTO ls_text SEPARATED BY space.
WRITE: 80 ls_text.
* Año y periodo
CONCATENATE p_gjahr '/' p_perio INTO ls_util.
CONCATENATE text-c06 ls_util INTO ls_text SEPARATED BY space.
WRITE / ls_text.
* Hora
WRITE: sy-datum TO ls_date,
sy-uzeit TO ls_hora.
CONCATENATE ls_date '/' ls_hora INTO ls_util.
CONCATENATE text-c07 ls_util INTO ls_text SEPARATED BY space.
WRITE 80 ls_text.
ENDFORM.

ALV FUNCIONES (TOP_OF_Page_HTML) Impresion pantalla

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = ls_repid
i_structure_name = 'GTD_AUFK_AFPO'
i_callback_pf_status_set = 'SET_STATUS'
i_callback_user_command = 'USER_COMMAND_000'
i_callback_html_top_of_page = 'TOP_OF_PAGE_HTML'
is_layout = gwa_layout
it_fieldcat = gtd_fieldcat[]
TABLES
t_outtab = gtd_aufk_afpo
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno.
ENDIF.
*---------------------------------------------------------------------*
* FORM top_of_page_HTML *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> R_TOP *
*---------------------------------------------------------------------*
FORM top_of_page_html USING r_top TYPE REF TO cl_dd_document.
DATA: s_tab TYPE sdydo_text_table,
c_area TYPE REF TO cl_dd_area,
ls_text TYPE sdydo_text_element.
CALL METHOD r_top->initialize_document.
* titulo y subtitulo
CALL METHOD r_top->add_gap
EXPORTING
width = 60.
ls_text = text-c01.
CALL METHOD r_top->add_text
EXPORTING
text = ls_text
sap_fontsize = cl_dd_document=>large
sap_emphasis = cl_dd_document=>strong.
CALL METHOD r_top->new_line.
IF p_test EQ 'X'.
ls_text = text-c02.
ELSE.
ls_text = text-c03.
ENDIF.
CALL METHOD r_top->add_gap
EXPORTING
width = 90.
CALL METHOD r_top->add_text
EXPORTING
text = ls_text
sap_fontsize = cl_dd_document=>large
sap_emphasis = cl_dd_document=>strong.
CALL METHOD r_top->new_line.
*Fecha
DATA: ls_date(10) TYPE c,
ls_util TYPE string.
WRITE p_budat TO ls_date.
CONCATENATE text-c04 ls_date INTO ls_text SEPARATED BY space.
CALL METHOD r_top->add_text
EXPORTING
text = ls_text
sap_fontsize = cl_dd_document=>medium.
* Usuario
ls_util = sy-uname.
CALL METHOD r_top->add_gap
EXPORTING
width = 160.
CONCATENATE text-c05 ls_util INTO ls_text SEPARATED BY space.
CALL METHOD r_top->add_text
EXPORTING
text = ls_text
sap_fontsize = cl_dd_document=>medium.
CALL METHOD r_top->new_line.
CONCATENATE p_gjahr '/' p_perio INTO ls_util.

CONCATENATE text-c06 ls_util INTO ls_text SEPARATED BY space.
CALL METHOD r_top->add_text
EXPORTING
text = ls_text
sap_fontsize = cl_dd_document=>medium.
DATA: ls_hora(10) TYPE c.
WRITE: sy-datum TO ls_date,
sy-uzeit TO ls_hora.
CONCATENATE ls_date '/' ls_hora INTO ls_util.
CALL METHOD r_top->add_gap
EXPORTING
width = 157.
CONCATENATE text-c07 ls_util INTO ls_text SEPARATED BY space.
CALL METHOD r_top->add_text
EXPORTING
text = ls_text
sap_fontsize = cl_dd_document=>medium.
ENDFORM.

ALV con funciones

Añadir boton
http://www.sap-basis-abap.com/abap/add-button-to-alv-toolbar-with-reuse-alv-list-display.htm
TOP
Añadir campo flag a la estrucdtura definida para el uso de la tabla.
Type-pools: slis.
DATA: gtd_fieldcat TYPE slis_t_fieldcat_alv,
gwa_layout TYPE slis_layout_alv.
MAI
llenar los datos en la tabla interna.
START-OF-SELECTION.
PERFORM cargar_data.
PERFORM construir_alv.

F02
*----------------------------------------------------------------------*
***INCLUDE ZTEMP_CJ_F02 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form construir_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text *----------------------------------------------------------------------* FORM construir_alv. PERFORM construir_catalogo. PERFORM construir_layout . PERFORM mostrar_alv. ENDFORM. " construir_alv *&---------------------------------------------------------------------* *& Form construir_catalogo *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text
* <-- p2 text *----------------------------------------------------------------------* FORM construir_catalogo. DATA: li_idx TYPE i VALUE 0. ADD 1 TO li_idx. PERFORM llenar_fieldcat USING li_idx 'GTS_AUFK_AFPO' 'GJAHR' '' 'Año' '7' '' ''. ADD 1 TO li_idx. PERFORM llenar_fieldcat USING li_idx 'GTS_AUFK_AFPO' 'GJAHR1' '' 'Ejercicio Doc. Contable' '7' '' ''. ADD 1 TO li_idx. PERFORM llenar_fieldcat USING li_idx 'GTS_AUFK_AFPO' 'MENSA' '' 'Mensaje' '7' '' ''. ENDFORM. " construir_catalogo *&---------------------------------------------------------------------* *& Form mostrar_alv *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text
* <-- p2 text *----------------------------------------------------------------------* FORM mostrar_alv. DATA: ls_repid TYPE sy-repid. ls_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = ls_repid i_structure_name = 'GTS_AUFK_AFPO' i_callback_pf_status_set = 'SET_STATUS' i_callback_user_command = 'USER_COMMAND_000' i_callback_html_top_of_page = 'TOP_OF_PAGE_SPLIT' is_layout = gwa_layout it_fieldcat = gtd_fieldcat[] TABLES t_outtab = gts_aufk_afpo EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " mostrar_alv
*&---------------------------------------------------------------------*
*& Form construir_layout
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text *----------------------------------------------------------------------* FORM construir_layout. CLEAR gwa_layout. gwa_layout-zebra = 'X'. gwa_layout-edit_mode = space. gwa_layout-box_fieldname = 'FLAG'. ENDFORM. " construir_layout *&---------------------------------------------------------------------* *& Form llenar_fieldcat *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LI_IDX text
* -->P_0028 text
* -->P_0029 text
* -->P_0030 text
* -->P_0031 text
* -->P_0032 text
* -->P_0033 text
* -->P_0034 text
*----------------------------------------------------------------------*
FORM llenar_fieldcat USING pi_pos LIKE sy-cucol
pi_tabla TYPE slis_tabname
pi_campo TYPE slis_fieldname
pi_key TYPE c
pi_text TYPE dd03p-scrtext_l
pi_len TYPE dd03p-outputlen
pi_ctabla TYPE slis_tabname
pi_ccampo TYPE slis_fieldname.
DATA lwa_fieldcat TYPE slis_fieldcat_alv.
lwa_fieldcat-col_pos = pi_pos.
lwa_fieldcat-tabname = pi_tabla.
lwa_fieldcat-fieldname = pi_campo.
lwa_fieldcat-key = pi_key.
lwa_fieldcat-seltext_l = pi_text.
lwa_fieldcat-outputlen = pi_len.
lwa_fieldcat-ctabname = pi_ctabla.
lwa_fieldcat-cfieldname = pi_ccampo.
APPEND lwa_fieldcat TO gtd_fieldcat.
CLEAR lwa_fieldcat.
ENDFORM. " llenar_fieldcat

*---------------------------------------------------------------------*
* FORM pf_status *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> P_EXTAB *
*---------------------------------------------------------------------*
FORM set_status USING p_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS_000' EXCLUDING p_extab.
ENDFORM. "PF_STATUS
*
*---------------------------------------------------------------------*
* FORM user_command_own *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> L_UCOMM *
* --> RS_SELFIELD *
*---------------------------------------------------------------------*
FORM user_command_000 USING l_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE l_ucomm.
WHEN '&ACTU'.
ENDCASE.
ENDFORM.

RADIO BUTTON mostrar u ocultar datos al seleccionar radio button

TOP
SELECTION-SCREEN : BEGIN OF BLOCK b_03 WITH FRAME TITLE text-t03.
       PARAMETERS : p_rb_fg RADIOBUTTON GROUP RAD2
                            USER-COMMAND radio2
                            DEFAULT 'X'
                            MODIF ID RA,
                    p_rb_fl RADIOBUTTON GROUP RAD2
                            MODIF ID RA.
 SELECTION-SCREEN : END OF BLOCK b_03.
MAI
AT SELECTION-SCREEN OUTPUT.
  IF p_rb_oo = 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'RA'.
        screen-active = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

Radio button simple

TOP
 SELECTION-SCREEN : BEGIN OF BLOCK b_02 WITH FRAME TITLE text-t02.
       PARAMETERS : p_rb_oo RADIOBUTTON GROUP RAD1
                            USER-COMMAND radio
                            DEFAULT 'X',
                    p_rb_fc RADIOBUTTON GROUP RAD1.
 SELECTION-SCREEN : END OF BLOCK b_02.

MAI
AT SELECTION-SCREEN ON RADIOBUTTON GROUP RAD1.
  IF p_rb_oo = 'X'.
    MESSAGE i398 WITH 'orientado objetos.'.
  ELSE.
    MESSAGE i398 WITH 'ALV Funciones'.
  ENDIF.

Copiar work areas

MOVE-CORRESPONDING gwa_screen_200 TO gwa_ztaspirante_10.

Añadir 0s a un codigo

* Anadir 0s al codigo de aspirante
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = gwa_screen_200-numas
    IMPORTING
      output = gwa_screen_200-numas.

Editar campos AVL

Tutoial de arranque
http://www.watto.org/program/abap/download/Z_ALV_TEMPLATE.abap
http://sgstocks.tripod.com/alvgrid_control.htm
http://www.watto.org/program/abap/download/Z_ALV_TEMPLATE.abap
http://www.sapalv.net/2009/08/sap-alv-tutorial-8-handling-data-change/

1. F01
CREATE OBJECT go_event_receiver.    
SET HANDLER go_event_receiver->handle_data_changed FOR go_alv.
CALL METHOD go_alv->register_edit_event
      EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified.
2.
CLASS gcl_event_receiver DEFINITION.
   PUBLIC SECTION.
     METHODS:
     handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid
                         IMPORTING e_object,
     handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
                         IMPORTING e_ucomm,
     handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
                         IMPORTING er_data_changed.

 ENDCLASS.   
3.
 method handle_data_changed.
    data: lv_changed type lvc_s_modi,
          lc_rpta type c,
          lwa_aspirante type gty_aspirante_alv.
    loop at er_data_changed->mt_good_cells into lv_changed
         where fieldname = 'APPAT' or fieldname = 'APMAT'
            or fieldname = 'NOMBR'.
      case lv_changed-fieldname.
        when 'APPT'.
          read table gtd_aspirante_alv into lwa_aspirante index lv_changed-row_id.
          perform validar_nombres using lwa_aspirante-nombr
                                        lv_changed-value
                                        lwa_aspirante-apmat
                                        'T'
                                   changing lc_rpta.
          check lc_rpta = 'T'.
        when 'APMAT'.
        when 'NOMBR'.
      endcase.
*      READ TABLE i_alv_data INTO v_alv_data INDEX lv_changed-row_id.
      if sy-subrc = 0.
*        MOVE lv_changed-value TO v_alv_data-cust_name.
*        MODIFY i_alv_data FROM v_alv_data INDEX lv_changed-row_id.
      endif.
    endloop.
  Endmethod.
Mostrar error
CALL METHOD er_data_changed->add_protocol_entry
           EXPORTING
             i_msgid = 'SU'
             i_msgno = '000'
             i_msgty = 'E'
             i_msgv1 = 'Ya existe un registro con los nombres'
             i_msgv2 = ' y apellidos ingresados.'
             i_fieldname = lv_changed-fieldname
             i_row_id = lv_changed-row_id .

MEJORAR PERFORMANCE DE BUSQUEDA USANDO FIELD SYMBOLS, BINARY SEARCH Y READ TABLES

FIELD-SYMBOLS:  LIKE LINE OF gtd_aspirante_alv.

SORT gtd_dom_tratamiento BY domvalue_l.
LOOP AT gtd_aspirante_alv ASSIGNING .
READ TABLE gtd_dom_tratamiento INTO lwa_dominio WITH KEY
      domvalue_l = -trata BINARY SEARCH.
     -trata = lwa_dominio-ddtext.
ENDLOOP.

Cargar datos de dominio con función

DATA gtd_dom_tratamiento TYPE STANDARD TABLE OF dd07v.
PERFORM cargar_datos_dominio TABLES gtd_dom_tratamiento
                               USING 'ZD_TRATAMIENTO_10'
                               CHANGING lc_rpta.
Check lc_RPTA = ‘T’.
FORM cargar_datos_dominio  TABLES p_ltd_dominio LIKE gtd_dom_tratamiento
                           USING    p_ls_dominio
                           CHANGING p_lc_rpta.
  CALL FUNCTION 'DD_DD07V_GET'
    EXPORTING
      domain_name    = p_ls_dominio
      langu          = sy-langu
      withtext       = 'X'
    TABLES
      dd07v_tab      = p_ltd_dominio
    EXCEPTIONS
      access_failure = 1
    OTHERS         = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    p_lc_rpta = 'F'.
  ELSE.
    p_lc_rpta = 'T'.
  ENDIF.
ENDFORM.                    " cargar_datos_dominio

Ventana de diálogo para abrir un archivo

FORM obtener_filepath  CHANGING p_ls_path TYPE string.
  DATA: li_subrc       LIKE sy-subrc,
         ltd_filetable TYPE filetable,
         lwa_filetable TYPE file_table,
         ls_path       TYPE string,
         user_action   TYPE i.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Seleccionar archivo de texto'
      default_filename        = '*.txt'
      multiselection          = ' '
    CHANGING
      file_table              = ltd_filetable
      rc                      = li_subrc
      user_action             = user_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    CASE user_action.
      WHEN 0.
        READ TABLE ltd_filetable INTO lwa_filetable INDEX 1.
        p_ls_path = lwa_filetable-filename.
      WHEN OTHERS.
        MESSAGE i398 WITH 'No se selecciono un archivo'.
    ENDCASE.
  ENDIF.
ENDFORM.

Cargar tabla desde archivo

FORM cargar_tabla_desde_archivo
      USING    p_ls_path TYPE string
      CHANGING p_ltd_aspirante TYPE STANDARD TABLE .
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                      = p_ls_path
      filetype                      = 'ASC'
      has_field_separator           = 'X'
    TABLES
      data_tab                      = p_ltd_aspirante
    EXCEPTIONS
      file_open_error               = 1
      file_read_error               = 2
      no_batch                      = 3
      gui_refuse_filetransfer       = 4
      invalid_type                  = 5
      no_authority                  = 6
      unknown_error                 = 7
      bad_data_format               = 8
      header_not_allowed            = 9
      separator_not_allowed         = 10
      header_too_long               = 11
      unknown_dp_error              = 12
      access_denied                 = 13
      dp_out_of_memory              = 14
      disk_full                     = 15
      dp_timeout                    = 16
      OTHERS                        = 17            .
  IF sy-subrc <> 0.
*    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    MESSAGE ID SY-MSGID TYPE 'I' NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*    RETURN.
  ENDIF.
ENDFORM. 

Obtener datos de dominio

DATA: ltd_dominio TYPE TABLE OF dd07v.
  CALL FUNCTION 'DD_DD07V_GET'
    EXPORTING
      domain_name    = 'ZD_TRATAMIENTO_10'
      langu          = sy-langu
      withtext       = 'X'
    TABLES
      dd07v_tab      = ltd_dominio
    EXCEPTIONS
      access_failure = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

Mensaje de confirmación

DATA: ls_rpta type c.
  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      TITLEBAR = 'Salir Programa'
      TEXT_QUESTION = 'Los cambios no han sido grabados. ¿Desea cancelar el proceso?'
    IMPORTING
      ANSWER = ls_rpta.
  CASE ls_rpta.
    WHEN '1'. "Yes is clicked
    WHEN '2'. "No is clicked
    WHEN '3'. "Cancel is clicked
  ENDCASE.

Crear rangos

Transacción snro

Creación: Warning 10

Dominio ZD_NUMASP_10

Definir intervalos

1.Numeros definidos o inidcados x el user.

Llamar
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '1'
object = 'ZMMSOLESP'
IMPORTING
number = gwa_ztbespsc-idact

Habilitar deshabilitar campos screen

LOOP AT SCREEN.
      IF screen-name = 'GWA_SCREEN_200-FEREG'.
       screen-input = '0'. "deshabilitar texto
        screen-active = '1'. "ocultar texto
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.

MOSTRAR ICONOS. Mostrar código de los iconos a utilizar

SE38 / Showicon

Friday, February 12, 2010

MAINTENANCE VIEW WITH CUSTOM F4

1.While executing the maintenance view using the sm30 transaction, go to the menu System, status and fetch the program name then go to the se38 transaction and edit it.

2.Add to the screen flow logic .
PROCESS ON VALUE-REQUEST. "F4
  FIELD ZVA_ZTASPIRANTE-PNACI MODULE matchcode_estad.

3.Function

MODULE matchcode_estad INPUT.
  DATA: BEGIN OF help_item OCCURS 0,
          carrid TYPE s_carr_id,
          connid TYPE s_conn_id,
        END OF help_item.
  SELECT carrid  connid
  INTO TABLE help_item
  FROM spfli.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield    = 'CARRID'
      dynprofield = 'CONNID'
      dynpprog    = sy-cprog
      dynpnr      = sy-dynnr
      value_org   = 'S'
    TABLES
      value_tab   = help_item.
ENDMODULE.

4.    Whether you need to validate the input, uncheck the field foreign .. in the screen layout for the modified field and go back to the screen flow logic and within the loop add the module

PROCESS AFTER INPUT.
  MODULE liste_exit_command AT EXIT-COMMAND.
  MODULE liste_before_loop.
  LOOP AT extract.
...
    FIELD zva_ztaspirante-pnaci MODULE validar_pais ON REQUEST.
  ENDLOOP.
  MODULE liste_after_loop. .

5. Function validar_pais

MODULE validar_pais INPUT.
  DATA ls_carrid TYPE s_carr_id.
  SELECT SINGLE carrid INTO ls_carrid  FROM spfli
         WHERE carrid = zva_ztaspirante-pnaci.
  IF sy-subrc <> 0.
    MESSAGE: 'No existe el valor ingresado' TYPE 'E'.
  ENDIF.
ENDMODULE.     

Cosas que pasan

- Problemas con el uso de variables de sistema en el llamado de las funciones, pse soluciona usando una variable local previamente dandole el valor que le corresponde.

- AL copiar y pegar pueden existir problemas en los caracteres usados, lo ideal es copiar de un PDF.