lunes, 22 de agosto de 2011

Sym SMB no jala en Windows XP

si este programa de la noche a la mañana dejo de conectarse para compartir tus archivos via wifi con tu celular es debido a una actualización de windows simplemente con quitarla se vuelve a conectar es desde agregar o quitar programas, marcas mostrar actualizaciones la buscas y la quitas con eso ya funciona de nuevo.

las actualizaciones a quitar son:
Actualización para Windows XP (KB2536276)

Funciona también para unidades de red que no quieren conectar.

lunes, 15 de agosto de 2011

include que genera un alv

Normalmente como mínimo es necesario este código si la tabla es I_TAB
repname = sy-repid.
PERFORM obt_descrip_campos_tabla USING repname 'I_TAB'.
PERFORM carac_gen_listado.
PERFORM visualizar_lista TABLES I_TAB USING 'I_TAB' repname .

si quieres que sea un grid en vez del list simplemente en vez de usar la funcion
REUSE_ALV_LIST_DISPLAY la cambias por REUSE_ALV_GRID_DISPLAY.

*----------------------------------------------------------------------*
* INCLUDE ZALV *
*----------------------------------------------------------------------*

************************************************************************
* Include ZALV: Subrutinas para listado ALV. *
************************************************************************

* Es necesario incluir este include en el inicio del programa.
* El inicio del código tiene que empezar por STAR-OF-SELECTION, o no
* lo reconocerá.
* IMPORTANTISIMO. Es obligatorio incluir la 1ª form, y la última.

* Listado de Forms.
* 1.- OBT_DESCRIP_CAMPOS_TABLA "Esta form es OBLIGATORIA.

* 2.- CAMB_DESCRIP_CAMPOS_TABLA "Cambia la descrip de cabecera
* 3.- ELIM_CAMPOS_DE_VISUALIZACION"No se visualizan los campos seleccio
* 4.- CARAC_GEN_LISTADO "Da formato al listado
* 5.- ASIGNAR_MONEDA_COLUMNA "Asignamos una campo de moneda
* 6.- ASIGNAR_UNIDAD_MEDIDA "Asignamos una unidad de medida
* 7.- ALV_F4 "Match code para varientes
* 8.- CHEQUEO_VARIANTE_EXISTE "Comprueba que exista la variante
* 9.- ASIGNAR_VARIANTE "Asignamos la variante al listado
* 10.- ENCABEZADO "Llamamos a esta función para inserta
* 11.- ASIGN_O_QUITAR_CAMPO_CLAVE "Asigna o quita la prop. de Campo Cla
* 12.- Indicar_campo_checkbox "Definir una columna como checkbox

* 13.- ASIGNAR_USER_COMMAND "Equivalente a AT USER-COMMAND
* 14.- Asignar_TOP_OF_PAGE "Deberemos crear FORM TOP_OF_PAGE2
* 15.- Asignar_PF_STATUS "Asigna un STATUS a un listado

* 16.- VISUALIZAR_LISTA "Visualizar la lista. OBLIGATORIA
* 17.- Asignar END_OF_PAGE "
* 18.- Opciones de Impresión
* 19.- Asignar_edit_campo "Campo editable en alv
* 20.- Asignar_hotspot "Activa o desactiva el hotspot

* Normalmente como mínimo es necesario este código si la tabla es I_TAB
* repname = sy-repid.
* PERFORM obt_descrip_campos_tabla USING repname 'I_TAB'.
* PERFORM carac_gen_listado.
* PERFORM visualizar_lista TABLES I_TAB USING 'I_TAB' repname .


*$*$ Definición de variables para el listado
TYPE-POOLS: slis.
DATA: repname LIKE sy-repid ,
layout TYPE slis_layout_alv,
printer TYPE slis_print_alv,
f2code LIKE sy-ucomm VALUE '&ETA',
fieldtab TYPE slis_t_fieldcat_alv,
heading TYPE slis_listheader OCCURS 0 ,
g_save(1) TYPE c VALUE 'A',
fausti LIKE tbsl-faus1, " string de campos obligatorios
events TYPE slis_alv_event OCCURS 0,
sort TYPE slis_t_sortinfo_alv,
sort_header TYPE slis_sortinfo_alv,
variant LIKE disvariant,
user_command TYPE slis_formname,
status TYPE slis_formname.

CONSTANTS:
formname_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE',
formname_end_of_list TYPE slis_formname VALUE 'END_OF_LIST',
formname_user_command TYPE slis_formname VALUE 'USER_COMMAND',
formname_pf_status_set TYPE slis_formname VALUE 'PF_STATUS'.

FIELD-SYMBOLS TYPE slis_fieldcat_alv.



*$*$ Definición de Forms de listado

*__________________________________________Form obt_descrip_campos_tabla
FORM obt_descrip_campos_tabla USING p_repname
p_tablename TYPE slis_tabname.
* Esta es la primera form que se tiene que llamar. Así recogemos
* Los atributos de todos los campos de la tabla interna.
* Importante!!: La tabla interna no se tiene que definir como un data
* referenciado a una estructura type (Si se hace de este modo no
* reconocerá ningún campo). Utilizar siempre:
* Data begin of ..... occurs 0.
* Data end of ......
* No utilizar tampoco: Data: itab type standard table of ...............
REFRESH fieldtab.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = p_repname
i_internal_tabname = p_tablename
i_inclname = p_repname
CHANGING
ct_fieldcat = fieldtab.

ENDFORM.

*_________________________________________FORM Camb_descrip_campos_tabla
FORM camb_descrip_campos_tabla USING p_campo TYPE slis_fieldname
p_descrip.

* Para utilizar esta form previamente tenemos que haber llamado a la
* form obt_descrip_campos_tabla. Tenemos que pasarle el campo de la
* tabla interna y la descripción que queremos que aparezca en la
* cabecera de la columna.

READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-seltext_l = p_descrip.
* -seltext_m = p_descrip.
* -seltext_s = p_descrip.
* -reptext_ddic = p_descrip.
ENDIF.

ENDFORM.

*______________________________________FORM elim_campos_de_visualizacion
FORM elim_campos_de_visualizacion USING p_campo TYPE slis_fieldname.
* Consigue que un campo clave se pueda quitar de la visualización.
* P. Ej. Mandante.
* Tambien elimina de la visualización cualquier campo que no sea clave.
* Desde dentro del listado estos campos se pueden volver a visualizar.

READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-key_sel = 'X'.
-no_out = 'X'.
ENDIF.
ENDFORM.
*_______________________________________________Carac. gen. del listado.
FORM carac_gen_listado.
*Esta Form contiene características generales del listado. Si se quieren
*estas mismas llamar a la Form, en caso contrario implementarlas desde
*el programa. La estructura de características generales es 'LAYOUT'.
*En El campo INFO_FIELDNAME se le indica la columna que contiene el
*color para cada registro. Si dicha columna, no tiene valor para algún
*registro, dicho registro tendrá el color standard que le toque.
* El formato que tiene que tener la columa COLOR es:
* 'Cxy':
* C = color (all codes must start with 'C')
* x = color number ('1'-'9')
* y = bold ('0' = off, '1' = on)

*__Indicamos que queremos el listado cebreado
layout-zebra = 'X'.
*__No afecta porque tenemos user-commmand
layout-detail_popup = 'X'.
*__Indicamos que Al hacer doble click el user-command = 'DOBCLICK'.
* layout-f2code = 'DOBCLICK'.
*__Si queremos que al hacer doble click despliegue la ventana desasteris
* p_layout-f2code = '&ETA'.
layout-info_fieldname = 'COLOR'.
* layout-flexible_key = 'X'. "Permite mover campos clave.
layout-colwidth_optimize = 'X'.
layout-detail_initial_lines = 'X'.
layout-detail_titlebar = 'Información Adicional'. "Titulo popup
layout-totals_only = 'X'.
layout-detail_popup = 'X'.

ENDFORM. " BUILD_LAYOUT

*____________________________________________FORM asignar_moneda_columna
FORM asignar_moneda_columna USING p_columna TYPE slis_fieldname
p_campo_moneda TYPE slis_fieldname.
* En esta form hay que pasar la columna que tiene los importes, y la
* Columna que contiene la moneda para cada registro.
READ TABLE fieldtab WITH KEY fieldname = p_columna ASSIGNING .
IF sy-subrc EQ 0.
-cfieldname = p_campo_moneda.
ENDIF.

ENDFORM.

*_____________________________________________FORM asignar_unidad_medida
FORM asignar_unidad_medida USING p_columna TYPE slis_fieldname
p_campo_moneda TYPE slis_fieldname.
* En esta form hay que pasar la columna que tiene las cantidades, y la
* Columna que contiene la unidad para cada registro.
READ TABLE fieldtab WITH KEY fieldname = p_columna ASSIGNING .
IF sy-subrc EQ 0.
-qfieldname = p_campo_moneda.
ENDIF.

ENDFORM.

*____________________________________________________________Form Alv_F4
FORM alv_f4 USING p_repname LIKE sy-repid
p_variante LIKE disvariant-variant.

* Esta form devuelve un matchcode con las variantes existentes.
* Tan solo se tiene que poner si se quiere cargar una variante de
* visualización.
* Para poner esta form se tiene que poner:

**** at selection-screen on value-request for p_variante. *****
**** perform alv_f4 using (Nombreprograma) (Variable_variante). *****
variant-report = p_repname.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = variant
i_save = 'A'
IMPORTING
es_variant = variant
EXCEPTIONS
not_found = 2.
IF sy-subrc = 2.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
p_variante = variant-variant.
ENDIF.
ENDFORM.

*___________________________________________FORM chequeo_variante_existe
FORM chequeo_variante_existe USING p_repname LIKE sy-repid
p_variante LIKE disvariant-variant.

* Esta form solo se tiene que usar si se quiere cargar una variante de
* visualización al sacar el listado.
* Esta form valida que la variante introducida por pantalla exista, en
* caso contrario da un mensaje de error.

*IMPLEMENTACIÓN.
*****at selection-screen. *****
***** perform alv_check USING (Nombre_prog) (variable_variante). *****

variant-report = p_repname.
variant-variant = p_variante.
IF NOT p_variante IS INITIAL.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
EXPORTING
i_save = 'A'
CHANGING
cs_variant = variant
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE e321(m7) WITH p_variante variant-report.
ENDIF.
ENDIF.

ENDFORM.

*______________________________________________________Asignar variante.
FORM asignar_variante USING p_repname LIKE sy-repid
p_variante LIKE disvariant-variant.
* Si se quiere visualizar una variante es obligatorio llamar a esta form
* No es suficiente con llamar a la función de matchcode, o a la form de
* verificación.
CLEAR variant.
variant-report = p_repname.
variant-variant = p_variante.
ENDFORM.

*_______________________________________________________FORM top_of_page
FORM encabezado USING p_linea TYPE slis_entry .
* TOP-OF-PAGE, Se tiene que pasar línea a línea. Se tiene que rellenar
* una variable TYPE slis_entry, que tiene 60 posiciones, y enviarla a
* la form, para cada nueva línea del top-of-page se tiene que volver a
* llamar a la form enviando la nueva línea.

IF events[] IS INITIAL.
DATA: ls_event TYPE slis_alv_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
*___Indicamos que tiene que tener TOP-OF-PAGE
READ TABLE events WITH KEY name = slis_ev_top_of_page
INTO ls_event.
IF sy-subrc = 0.
MOVE formname_top_of_page TO ls_event-form.
APPEND ls_event TO events.
ENDIF.
DELETE ADJACENT DUPLICATES FROM heading COMPARING ALL FIELDS.
DATA: hline TYPE slis_listheader.
hline-typ = 'H'.
hline-info = p_linea.
APPEND hline TO heading.
CLEAR: hline, p_linea.

ENDFORM.

*________________________________________FORM ASIGN_O_QUITAR_CAMPO_CLAVE
FORM asign_o_quitar_campo_clave USING p_campo TYPE fieldname
p_x TYPE char1.
*Esta form asigna o quita la propiedad de campo clave. Los campos clave
*Aparecen en color azul a la izquierda de la pantalla, y se quedan
*Bloqueados sin que se puedan mover.
TRANSLATE p_campo TO UPPER CASE.
READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-key = p_x.
ENDIF.
ENDFORM.

*____________________________________________form asignar_ancho_columna
FORM asignar_ancho_columna USING p_campo TYPE fieldname
long TYPE i.
* Esta rutina asigna un ancho a la columna. No es necesario indicarlo
* porque por defecto coge la longitud de la variable.
TRANSLATE p_campo TO UPPER CASE.
READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-outputlen = long.
ENDIF.

ENDFORM.

*____________________________________________Form Indicar_campo_checkbox
FORM indicar_campo_checkbox USING p_campo TYPE fieldname.

* Esta rutina asigna a una columna la propiedad de checkbox.
* El parámetro import es el nombre del campo.
layout-box_fieldname = p_campo.
ENDFORM.

*_______________________________________________________FORM top_of_page
FORM top_of_page.
*Esta función es interna, y no se tiene que llamar desde el programa de
* control
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = 'LOGO_SOS'
it_list_commentary = heading.
ENDFORM.

*______________________________________________FORM asignar_user_command
FORM asignar_user_command.
* Se tiene que crear una form dentro del programa de control que tenga
* implementado lo que se quiere hacer en el AT-LINE-SELECTION o
* AT USER COMMAND
* La form que se construya tiene que tener la structura:

*****form user_command using r_ucomm like sy-ucomm *******
***** rs_selfield type slis_selfield. *******

* El campo r_ucomm devuelve el código '&ETA' si es un doble click
* la estructura rs_selfield contiene los siguientes campos.

* tabname : Nombre de la tabla interna
* tabindex : Indice de la tabla interna
* fieldname: Campo en el que estaba posicionado el cursor
* sel_tab_field: Nombre de la celda donde estaba posicionado el cursor
* endsum : El cursor está sobre la linea de suma final
* sumindex : Si es mayor que cero, indica que es una linea de subtotal
* value : valor del campo de la lista
* refresh : (exporting) Se refresca la lista, la lista act. desaparece.
* col_stable:(exporting) keep column positions in refresh
DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
*___Indicamos que tiene el evento User-command: At-line-selection
READ TABLE events WITH KEY name = slis_ev_user_command
ASSIGNING .
CHECK sy-subrc = 0.
MOVE formname_user_command TO -form.
ENDFORM.

*_______________________________________________Form asignar_TOP_OF_PAGE
FORM asignar_top_of_page.
* Para el TOP-OF-PAGE, tendremos que crear una rutina que se llame
* ALV_TOP_OF_PAGE. Dentro de esta rutina podremos escribir la cabecera
* que queramos al modo tradicional (Con Writes).

DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
READ TABLE events WITH KEY name = slis_ev_top_of_page
ASSIGNING .
CHECK sy-subrc = 0.
-form = 'ALV_TOP_OF_PAGE'.
ENDFORM.

*_____________________________________________Form asignar_SET_PF_STATUS
FORM asignar_set_pf_status USING p_status.
* Tenemos que pasar como variable el STATUS que queremos asignar al
* listado.

DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
READ TABLE events WITH KEY name = slis_ev_pf_status_set
ASSIGNING .
CHECK sy-subrc = 0.
-form = p_status.
SET PF-STATUS p_status.
ENDFORM.

*__________________________________________________FORM visualizar_lista
FORM visualizar_lista TABLES p_itab
USING p_tablename TYPE slis_tabname
p_repname LIKE sy-repid.
* valores del g_save.
* ' ' = No se pueden salvar las variantes de visualización
* 'X' = Solo se pueden salvar las variantes standard
* 'U' = Solo se pueden salvar las variantes de usuario
* 'A' = Se pueden guardar todas las variantes.

DATA: e_exit_caused_by_caller.


CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = p_repname
i_callback_pf_status_set = status
i_structure_name = p_tablename
is_layout = layout
it_fieldcat = fieldtab
i_default = 'A'
i_save = g_save
it_sort = sort
it_events = events[]
is_variant = variant
is_print = printer
i_callback_user_command = 'USER_COMMAND'
IMPORTING
e_exit_caused_by_caller = e_exit_caused_by_caller
TABLES
t_outtab = p_itab.

ENDFORM.
*_______________________________________________Form asignar_END_OF_LIST
FORM asignar_end_of_list.
* Para el END-OF-LIST, tendremos que crear una rutina que se llame
* ALV_END_OF_LIST. Dentro de esta rutina podremos escribir un párrafo
* al final que queramos al modo tradicional (Con Writes).

DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
READ TABLE events WITH KEY name = slis_ev_end_of_list
ASSIGNING .
CHECK sy-subrc = 0.
-form = 'ALV_END_OF_LIST'.
ENDFORM.
*_______________________________________________Form opciones_impresora
FORM opciones_impresora.
*Esta Form contiene características para la impresora.

*__Indicamos que no salga la página de selección.
printer-no_print_selinfos = 'X'.
printer-no_print_listinfos = 'X'.

ENDFORM. " OPCIONES_IMPRESORA
*_______________________________________________Form asignar_edit_campo
*esta form permite hacer un campo de la alv que sea editable

FORM asignar_edit_campo USING p_campo TYPE slis_fieldname
char1.

READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-input = char1.
* -seltext_m = p_descrip.
* -seltext_s = p_descrip.
* -reptext_ddic = p_descrip.
ENDIF.
ENDFORM. " asignar_edit_campo

*&---------------------------------------------------------------------*
*& Form activar_hotspot
*&---------------------------------------------------------------------*
FORM activar_hotspot USING p1 TYPE slis_fieldname
p2.

READ TABLE fieldtab WITH KEY fieldname = p1 ASSIGNING .
IF sy-subrc = 0.
-hotspot = p2.
ENDIF.

ENDFORM. " activar_hotspot

include que genera un alv

Normalmente como mínimo es necesario este código si la tabla es I_TAB
repname = sy-repid.
PERFORM obt_descrip_campos_tabla USING repname 'I_TAB'.
PERFORM carac_gen_listado.
PERFORM visualizar_lista TABLES I_TAB USING 'I_TAB' repname .

si quieres que sea un grid en vez del list simplemente en vez de usar la funcion
REUSE_ALV_LIST_DISPLAY la cambias por REUSE_ALV_GRID_DISPLAY.

*----------------------------------------------------------------------*
* INCLUDE ZALV *
*----------------------------------------------------------------------*

************************************************************************
* Include ZALV: Subrutinas para listado ALV. *
************************************************************************

* Es necesario incluir este include en el inicio del programa.
* El inicio del código tiene que empezar por STAR-OF-SELECTION, o no
* lo reconocerá.
* IMPORTANTISIMO. Es obligatorio incluir la 1ª form, y la última.

* Listado de Forms.
* 1.- OBT_DESCRIP_CAMPOS_TABLA "Esta form es OBLIGATORIA.

* 2.- CAMB_DESCRIP_CAMPOS_TABLA "Cambia la descrip de cabecera
* 3.- ELIM_CAMPOS_DE_VISUALIZACION"No se visualizan los campos seleccio
* 4.- CARAC_GEN_LISTADO "Da formato al listado
* 5.- ASIGNAR_MONEDA_COLUMNA "Asignamos una campo de moneda
* 6.- ASIGNAR_UNIDAD_MEDIDA "Asignamos una unidad de medida
* 7.- ALV_F4 "Match code para varientes
* 8.- CHEQUEO_VARIANTE_EXISTE "Comprueba que exista la variante
* 9.- ASIGNAR_VARIANTE "Asignamos la variante al listado
* 10.- ENCABEZADO "Llamamos a esta función para inserta
* 11.- ASIGN_O_QUITAR_CAMPO_CLAVE "Asigna o quita la prop. de Campo Cla
* 12.- Indicar_campo_checkbox "Definir una columna como checkbox

* 13.- ASIGNAR_USER_COMMAND "Equivalente a AT USER-COMMAND
* 14.- Asignar_TOP_OF_PAGE "Deberemos crear FORM TOP_OF_PAGE2
* 15.- Asignar_PF_STATUS "Asigna un STATUS a un listado

* 16.- VISUALIZAR_LISTA "Visualizar la lista. OBLIGATORIA
* 17.- Asignar END_OF_PAGE "
* 18.- Opciones de Impresión
* 19.- Asignar_edit_campo "Campo editable en alv
* 20.- Asignar_hotspot "Activa o desactiva el hotspot

* Normalmente como mínimo es necesario este código si la tabla es I_TAB
* repname = sy-repid.
* PERFORM obt_descrip_campos_tabla USING repname 'I_TAB'.
* PERFORM carac_gen_listado.
* PERFORM visualizar_lista TABLES I_TAB USING 'I_TAB' repname .


*$*$ Definición de variables para el listado
TYPE-POOLS: slis.
DATA: repname LIKE sy-repid ,
layout TYPE slis_layout_alv,
printer TYPE slis_print_alv,
f2code LIKE sy-ucomm VALUE '&ETA',
fieldtab TYPE slis_t_fieldcat_alv,
heading TYPE slis_listheader OCCURS 0 ,
g_save(1) TYPE c VALUE 'A',
fausti LIKE tbsl-faus1, " string de campos obligatorios
events TYPE slis_alv_event OCCURS 0,
sort TYPE slis_t_sortinfo_alv,
sort_header TYPE slis_sortinfo_alv,
variant LIKE disvariant,
user_command TYPE slis_formname,
status TYPE slis_formname.

CONSTANTS:
formname_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE',
formname_end_of_list TYPE slis_formname VALUE 'END_OF_LIST',
formname_user_command TYPE slis_formname VALUE 'USER_COMMAND',
formname_pf_status_set TYPE slis_formname VALUE 'PF_STATUS'.

FIELD-SYMBOLS TYPE slis_fieldcat_alv.



*$*$ Definición de Forms de listado

*__________________________________________Form obt_descrip_campos_tabla
FORM obt_descrip_campos_tabla USING p_repname
p_tablename TYPE slis_tabname.
* Esta es la primera form que se tiene que llamar. Así recogemos
* Los atributos de todos los campos de la tabla interna.
* Importante!!: La tabla interna no se tiene que definir como un data
* referenciado a una estructura type (Si se hace de este modo no
* reconocerá ningún campo). Utilizar siempre:
* Data begin of ..... occurs 0.
* Data end of ......
* No utilizar tampoco: Data: itab type standard table of ...............
REFRESH fieldtab.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = p_repname
i_internal_tabname = p_tablename
i_inclname = p_repname
CHANGING
ct_fieldcat = fieldtab.

ENDFORM.

*_________________________________________FORM Camb_descrip_campos_tabla
FORM camb_descrip_campos_tabla USING p_campo TYPE slis_fieldname
p_descrip.

* Para utilizar esta form previamente tenemos que haber llamado a la
* form obt_descrip_campos_tabla. Tenemos que pasarle el campo de la
* tabla interna y la descripción que queremos que aparezca en la
* cabecera de la columna.

READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-seltext_l = p_descrip.
* -seltext_m = p_descrip.
* -seltext_s = p_descrip.
* -reptext_ddic = p_descrip.
ENDIF.

ENDFORM.

*______________________________________FORM elim_campos_de_visualizacion
FORM elim_campos_de_visualizacion USING p_campo TYPE slis_fieldname.
* Consigue que un campo clave se pueda quitar de la visualización.
* P. Ej. Mandante.
* Tambien elimina de la visualización cualquier campo que no sea clave.
* Desde dentro del listado estos campos se pueden volver a visualizar.

READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-key_sel = 'X'.
-no_out = 'X'.
ENDIF.
ENDFORM.
*_______________________________________________Carac. gen. del listado.
FORM carac_gen_listado.
*Esta Form contiene características generales del listado. Si se quieren
*estas mismas llamar a la Form, en caso contrario implementarlas desde
*el programa. La estructura de características generales es 'LAYOUT'.
*En El campo INFO_FIELDNAME se le indica la columna que contiene el
*color para cada registro. Si dicha columna, no tiene valor para algún
*registro, dicho registro tendrá el color standard que le toque.
* El formato que tiene que tener la columa COLOR es:
* 'Cxy':
* C = color (all codes must start with 'C')
* x = color number ('1'-'9')
* y = bold ('0' = off, '1' = on)

*__Indicamos que queremos el listado cebreado
layout-zebra = 'X'.
*__No afecta porque tenemos user-commmand
layout-detail_popup = 'X'.
*__Indicamos que Al hacer doble click el user-command = 'DOBCLICK'.
* layout-f2code = 'DOBCLICK'.
*__Si queremos que al hacer doble click despliegue la ventana desasteris
* p_layout-f2code = '&ETA'.
layout-info_fieldname = 'COLOR'.
* layout-flexible_key = 'X'. "Permite mover campos clave.
layout-colwidth_optimize = 'X'.
layout-detail_initial_lines = 'X'.
layout-detail_titlebar = 'Información Adicional'. "Titulo popup
layout-totals_only = 'X'.
layout-detail_popup = 'X'.

ENDFORM. " BUILD_LAYOUT

*____________________________________________FORM asignar_moneda_columna
FORM asignar_moneda_columna USING p_columna TYPE slis_fieldname
p_campo_moneda TYPE slis_fieldname.
* En esta form hay que pasar la columna que tiene los importes, y la
* Columna que contiene la moneda para cada registro.
READ TABLE fieldtab WITH KEY fieldname = p_columna ASSIGNING .
IF sy-subrc EQ 0.
-cfieldname = p_campo_moneda.
ENDIF.

ENDFORM.

*_____________________________________________FORM asignar_unidad_medida
FORM asignar_unidad_medida USING p_columna TYPE slis_fieldname
p_campo_moneda TYPE slis_fieldname.
* En esta form hay que pasar la columna que tiene las cantidades, y la
* Columna que contiene la unidad para cada registro.
READ TABLE fieldtab WITH KEY fieldname = p_columna ASSIGNING .
IF sy-subrc EQ 0.
-qfieldname = p_campo_moneda.
ENDIF.

ENDFORM.

*____________________________________________________________Form Alv_F4
FORM alv_f4 USING p_repname LIKE sy-repid
p_variante LIKE disvariant-variant.

* Esta form devuelve un matchcode con las variantes existentes.
* Tan solo se tiene que poner si se quiere cargar una variante de
* visualización.
* Para poner esta form se tiene que poner:

**** at selection-screen on value-request for p_variante. *****
**** perform alv_f4 using (Nombreprograma) (Variable_variante). *****
variant-report = p_repname.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = variant
i_save = 'A'
IMPORTING
es_variant = variant
EXCEPTIONS
not_found = 2.
IF sy-subrc = 2.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
p_variante = variant-variant.
ENDIF.
ENDFORM.

*___________________________________________FORM chequeo_variante_existe
FORM chequeo_variante_existe USING p_repname LIKE sy-repid
p_variante LIKE disvariant-variant.

* Esta form solo se tiene que usar si se quiere cargar una variante de
* visualización al sacar el listado.
* Esta form valida que la variante introducida por pantalla exista, en
* caso contrario da un mensaje de error.

*IMPLEMENTACIÓN.
*****at selection-screen. *****
***** perform alv_check USING (Nombre_prog) (variable_variante). *****

variant-report = p_repname.
variant-variant = p_variante.
IF NOT p_variante IS INITIAL.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
EXPORTING
i_save = 'A'
CHANGING
cs_variant = variant
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE e321(m7) WITH p_variante variant-report.
ENDIF.
ENDIF.

ENDFORM.

*______________________________________________________Asignar variante.
FORM asignar_variante USING p_repname LIKE sy-repid
p_variante LIKE disvariant-variant.
* Si se quiere visualizar una variante es obligatorio llamar a esta form
* No es suficiente con llamar a la función de matchcode, o a la form de
* verificación.
CLEAR variant.
variant-report = p_repname.
variant-variant = p_variante.
ENDFORM.

*_______________________________________________________FORM top_of_page
FORM encabezado USING p_linea TYPE slis_entry .
* TOP-OF-PAGE, Se tiene que pasar línea a línea. Se tiene que rellenar
* una variable TYPE slis_entry, que tiene 60 posiciones, y enviarla a
* la form, para cada nueva línea del top-of-page se tiene que volver a
* llamar a la form enviando la nueva línea.

IF events[] IS INITIAL.
DATA: ls_event TYPE slis_alv_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
*___Indicamos que tiene que tener TOP-OF-PAGE
READ TABLE events WITH KEY name = slis_ev_top_of_page
INTO ls_event.
IF sy-subrc = 0.
MOVE formname_top_of_page TO ls_event-form.
APPEND ls_event TO events.
ENDIF.
DELETE ADJACENT DUPLICATES FROM heading COMPARING ALL FIELDS.
DATA: hline TYPE slis_listheader.
hline-typ = 'H'.
hline-info = p_linea.
APPEND hline TO heading.
CLEAR: hline, p_linea.

ENDFORM.

*________________________________________FORM ASIGN_O_QUITAR_CAMPO_CLAVE
FORM asign_o_quitar_campo_clave USING p_campo TYPE fieldname
p_x TYPE char1.
*Esta form asigna o quita la propiedad de campo clave. Los campos clave
*Aparecen en color azul a la izquierda de la pantalla, y se quedan
*Bloqueados sin que se puedan mover.
TRANSLATE p_campo TO UPPER CASE.
READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-key = p_x.
ENDIF.
ENDFORM.

*____________________________________________form asignar_ancho_columna
FORM asignar_ancho_columna USING p_campo TYPE fieldname
long TYPE i.
* Esta rutina asigna un ancho a la columna. No es necesario indicarlo
* porque por defecto coge la longitud de la variable.
TRANSLATE p_campo TO UPPER CASE.
READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-outputlen = long.
ENDIF.

ENDFORM.

*____________________________________________Form Indicar_campo_checkbox
FORM indicar_campo_checkbox USING p_campo TYPE fieldname.

* Esta rutina asigna a una columna la propiedad de checkbox.
* El parámetro import es el nombre del campo.
layout-box_fieldname = p_campo.
ENDFORM.

*_______________________________________________________FORM top_of_page
FORM top_of_page.
*Esta función es interna, y no se tiene que llamar desde el programa de
* control
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = 'LOGO_SOS'
it_list_commentary = heading.
ENDFORM.

*______________________________________________FORM asignar_user_command
FORM asignar_user_command.
* Se tiene que crear una form dentro del programa de control que tenga
* implementado lo que se quiere hacer en el AT-LINE-SELECTION o
* AT USER COMMAND
* La form que se construya tiene que tener la structura:

*****form user_command using r_ucomm like sy-ucomm *******
***** rs_selfield type slis_selfield. *******

* El campo r_ucomm devuelve el código '&ETA' si es un doble click
* la estructura rs_selfield contiene los siguientes campos.

* tabname : Nombre de la tabla interna
* tabindex : Indice de la tabla interna
* fieldname: Campo en el que estaba posicionado el cursor
* sel_tab_field: Nombre de la celda donde estaba posicionado el cursor
* endsum : El cursor está sobre la linea de suma final
* sumindex : Si es mayor que cero, indica que es una linea de subtotal
* value : valor del campo de la lista
* refresh : (exporting) Se refresca la lista, la lista act. desaparece.
* col_stable:(exporting) keep column positions in refresh
DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
*___Indicamos que tiene el evento User-command: At-line-selection
READ TABLE events WITH KEY name = slis_ev_user_command
ASSIGNING .
CHECK sy-subrc = 0.
MOVE formname_user_command TO -form.
ENDFORM.

*_______________________________________________Form asignar_TOP_OF_PAGE
FORM asignar_top_of_page.
* Para el TOP-OF-PAGE, tendremos que crear una rutina que se llame
* ALV_TOP_OF_PAGE. Dentro de esta rutina podremos escribir la cabecera
* que queramos al modo tradicional (Con Writes).

DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
READ TABLE events WITH KEY name = slis_ev_top_of_page
ASSIGNING .
CHECK sy-subrc = 0.
-form = 'ALV_TOP_OF_PAGE'.
ENDFORM.

*_____________________________________________Form asignar_SET_PF_STATUS
FORM asignar_set_pf_status USING p_status.
* Tenemos que pasar como variable el STATUS que queremos asignar al
* listado.

DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
READ TABLE events WITH KEY name = slis_ev_pf_status_set
ASSIGNING .
CHECK sy-subrc = 0.
-form = p_status.
SET PF-STATUS p_status.
ENDFORM.

*__________________________________________________FORM visualizar_lista
FORM visualizar_lista TABLES p_itab
USING p_tablename TYPE slis_tabname
p_repname LIKE sy-repid.
* valores del g_save.
* ' ' = No se pueden salvar las variantes de visualización
* 'X' = Solo se pueden salvar las variantes standard
* 'U' = Solo se pueden salvar las variantes de usuario
* 'A' = Se pueden guardar todas las variantes.

DATA: e_exit_caused_by_caller.


CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = p_repname
i_callback_pf_status_set = status
i_structure_name = p_tablename
is_layout = layout
it_fieldcat = fieldtab
i_default = 'A'
i_save = g_save
it_sort = sort
it_events = events[]
is_variant = variant
is_print = printer
i_callback_user_command = 'USER_COMMAND'
IMPORTING
e_exit_caused_by_caller = e_exit_caused_by_caller
TABLES
t_outtab = p_itab.

ENDFORM.
*_______________________________________________Form asignar_END_OF_LIST
FORM asignar_end_of_list.
* Para el END-OF-LIST, tendremos que crear una rutina que se llame
* ALV_END_OF_LIST. Dentro de esta rutina podremos escribir un párrafo
* al final que queramos al modo tradicional (Con Writes).

DATA: ls_event TYPE slis_alv_event.
FIELD-SYMBOLS LIKE ls_event.
IF events[] IS INITIAL.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = events.
ENDIF.
READ TABLE events WITH KEY name = slis_ev_end_of_list
ASSIGNING .
CHECK sy-subrc = 0.
-form = 'ALV_END_OF_LIST'.
ENDFORM.
*_______________________________________________Form opciones_impresora
FORM opciones_impresora.
*Esta Form contiene características para la impresora.

*__Indicamos que no salga la página de selección.
printer-no_print_selinfos = 'X'.
printer-no_print_listinfos = 'X'.

ENDFORM. " OPCIONES_IMPRESORA
*_______________________________________________Form asignar_edit_campo
*esta form permite hacer un campo de la alv que sea editable

FORM asignar_edit_campo USING p_campo TYPE slis_fieldname
char1.

READ TABLE fieldtab WITH KEY fieldname = p_campo ASSIGNING .
IF sy-subrc EQ 0.
-input = char1.
* -seltext_m = p_descrip.
* -seltext_s = p_descrip.
* -reptext_ddic = p_descrip.
ENDIF.
ENDFORM. " asignar_edit_campo

*&---------------------------------------------------------------------*
*& Form activar_hotspot
*&---------------------------------------------------------------------*
FORM activar_hotspot USING p1 TYPE slis_fieldname
p2.

READ TABLE fieldtab WITH KEY fieldname = p1 ASSIGNING .
IF sy-subrc = 0.
-hotspot = p2.
ENDIF.

ENDFORM. " activar_hotspot

viernes, 6 de mayo de 2011

Llama a sapscript

Para saber que programa es el que llama a un sapscript de la mb1b
ir al documento que tenés por la MB03, ir a la posición
correspondiente y mirar que mensaje tiene. Sino en la MB90 ejecutás todos
los mensajes (fijate como modo de proceso 1 2 o 3), y vas a tener la clase
de mensaje.

La filtrás en la tabla TNAPR, y ahí vas a tener programa de control, rutina
entry y que formulario es con su nombre.

Tambien puedes poner un break point en la funcion SSF_FUNCTION_MODULE_NAME si es
smartform o en la funcion OPEN_FORM si es sapscript.

Submit que no muestre los write de otro programa.

split i_upload2-line at p_sep1 into table i_lineas.
read table i_lineas index 2.
v_mapeo = i_lineas-line.
v_cliente = i_lineas-line+35(4).

submit zmapban01
with p_cvban = p_cvban
with p_mapeo = v_mapeo
with p_client = v_cliente
exporting list to memory
and return.

lunes, 25 de abril de 2011

Debuguear Sapscript

Vamos a la se 71 luego damos en el menu Utilities-->Active De-bugger.

martes, 8 de marzo de 2011

Programa para Buscar User Exits

REPORT ZBUSCA_USER_EXIT .
*
* Finding the user-exits of a SAP transaction code
*
* Enter the transaction code in which you are looking for the user-exit
* and it will list you the list of user-exits in the transaction code.
* Also a drill down is possible which will help you to branch to SMOD.
*
* Written by : SAP Basis, ABAP Programming and Other IMG Stuff
* http://www.sap-img.com
*

*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.

*---End of Program=