Clave foránea compuesta con constante

Si necesitamos crear una clave foránea compuesta porque el campo que deseamos validar no tiene una tabla de maestro y un valor es constante.

Debemos setearlo de la siguiente manera:

image

Info completa de un Sapscript

Para ver toda la información de un Sapscript, es muy útil cuando queremos buscar algún campo en particular y no sabemos en que ventana se encuentra.

 

image

Costos de PS

Es algo bastante típico que te pidan reportes de PS usando costos, reales, comprometidos, etc.

Resumiendo todo dato real, comprometido y presupuesto esta en la COSP y RPSCO (resumen de COSP)

A estas tablas hay que acceder por el OBJNR del elemento imputado:

Si es un grafo -> AUFK-OBJNR

Si es una operación -> AFVC-OBJNR (se ingresa por hoja de ruta que la podemos tomar de la CAUFV con el Número de grafo)

Textos en inglés que me ayudaron a resolver el tema:

The actual,budget and commitment values are stored in the one table COSP.
The values differentiate with field VRGNG - "CO Business Transaction".
If the record has in this field text 'COIN' it means that values are "actual".
For example:
OBJNR PR00000101
GJAHR 2005
KSTAR 101101
VRGNG COIN
TWEAR USD
WTG001 100,00
WTG002 200,00
...
It means that the element PR0000101 has the 'actual' operations refering
the cost element 101101, with values: 100,00 USD in january 2005 and
200,00 USD in february 2005.
The next row in the table COSP, clould look like this:
OBJNR PR00000101
GJAHR 2005
KSTAR 101101
VRGNG RMBA
TWEAR USD
WTG001 100,00
WTG002 0,00
...
This means that there was a 'Purchase requisition' in january 2005
with decretation on object PR0000101.
And the next row, could be:
OBJNR PR00000101
GJAHR 2005
KSTAR 101101
VRGNG RMBE
TWEAR USD
WTG001 0,00
WTG002 150,00
And that means that in february 2005 there was a 'Purchase order'
with value 150,00 USD decretated on this object.

------------------------------------------------------------------------------

RMBA is the "Purchase Requisition" (created in transaction ME51n)
RMBE is the "Purchase Order" (created in transaction ME21n).
But both of these operations sum into commitment.
RKP1 stands for "Plan", but depending on configuration,
one of plan's versions can be the budget.
For example you can say, that plan in version 0 is the budget.
The best it would be, if you perform the check on your system:
1. Choose one order that you know it has represetaives data in your raport s_alr...
2. Open table AUFK, and write down the 'object number'- field OBJNR.
3. Open table COSP, and select data for OBJNR, that you recived in previous step.
4. Check what values do you have in the field VRGNG.

------------------------------------------------------------------------------

Status bar Standard

Si deseamos tener la status bar standard debemos setearla de la siguiente forma:


MODULE status_0100 OUTPUT.
SET PF-STATUS space.
SET PF-STATUS space.
ENDMODULE.

Tomar valores de un Pop Up

A veces en la impresión de algun documento u alguna otra cosa, necesitamos un corte de control para ingresar un valor y usarlo para algo.

En este ejemplo se muestra como haces para realizar esto:

report zjacprueba.
data: V_NUMERO like sval OCCURS 0 WITH HEADER LINE..

V_NUMERO-TABNAME = 'MARA'. "Tabla de donde queremos coger el campo
V_NUMERO-fieldname = 'MATNR'. "Campo que queremos pedir por pantalla
APPEND V_NUMERO.
V_NUMERO-TABNAME = 'MARA'.
V_NUMERO-FIELDNAME = 'MTART'.
APPEND V_NUMERO.

CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
* NO_VALUE_CHECK = ' '
POPUP_TITLE = 'Complete los campos'
START_COLUMN = '5'
START_ROW = '5'
* IMPORTING
* RETURNCODE =
TABLES
FIELDS = V_NUMERO.
* EXCEPTIONS
* ERROR_IN_FIELDS = 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.

LOOP AT V_NUMERO.
WRITE :/ V_NUMERO-VALUE. "Valor dado por pantalla.
ENDLOOP.

Buscador de User Exit por TCODE

*&---------------------------------------------------------------------*
*& Report ZBUSCO_EXIT *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*

REPORT ZBUSCO_EXIT 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

SAP NETWEAVER 2007s Trial

Despues de instalar el trial y de hacerlo funcionar.

El siguiente reporte nos genera la data del caso de vuelo SFLIGHT.
SAPBC_DATA_GENERATOR

PACKAGE del trial:

SAP_ABAPWD
SWDP_DEMO_TUTORIALS Demo Tutorials for Web Dynpro ABAP
Z_ABAP_BOOK Training and Demo Programs - ABAP Book
Z_FLIGHTMODEL_WS Web services for flight model
Z_NSPPOSTINST NSP Post Installation Steps

SPELL_AMOUNT - Texto de importes

CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
AMOUNT = L_ENTRADA "Indicar importe
CURRENCY = 'EUR' "Indicar moneda
LANGUAGE = SY-LANGU "Indicar idioma texto
IMPORTING
IN_WORDS = L_RESULTADO
EXCEPTIONS
NOT_FOUND = 1
TOO_LARGE = 2
OTHERS = 3

L_entrada es el importe que quieras traducir a letras. El resultado lo tendras en L_RESULTADO. Más detallado:
L_RESULTADO-WORD = parte entera
L_RESULTADO-IN_WORDS = parte decimal.

ALV - Catalogo

ALV – Catálogo

ROW_POS:
Solo se informará este campo en el caso en el que el report de salida sea multilínea. Valores: 0, 1, 2 y 3.

COL_POS:
Solo es relevante en el caso que se quiera que la salida en el listado tenga un orden distinto a su posición en la tabla interna de datos.

TABNAME:
Nombre de la tabla interna que contiene los datos a mostrar en el listado.

REF_FIELDNAME:
Nombre del campo de la tabla del diccionario de datos al cual está referenciado el campo de la tabla interna (en el caso en el que lo esté).

CFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la moneda para el campo importe.

CTABNAME:
Este dato sólo es relevante informarlo para listados con más de una cabecera.

QFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la unidad de medida para el campo cantidad.

QTABNAME:
Este dato solo es relevante informarlo para listados con más de una cabecera.

OUTPUTLEN:
Siempre que el campo a mostrar en el listado de salida no esté referenciado a ningún campo de tabla del diccionario, se especificará aquí la longitud de salida del campo.

KEY:
El campo del registro actual se tomará como clave si se marca este campo. No podrá ocultarse en el listado de salida este campo.

KEY_SEL:
El campo será clave, pero podrá no salir en el listado de salida.

NO_OUT:
El campo no será mostrado en el listado de salida.

TECH:
Si se marca este campo, el campo actual no puede nunca salir en el listado de salida.

EMPHASIZE:
Para mostrar el campo de algún color.

HOTSPOT:
El campo aparece como hotspot.

FIX_COLUMN:
Si se marca, este campo aparecería como columna fija.

DO_SUM:
Se calculará la suma de este campo.

NO_SUM:
No se calculará la suma de este campo.

ICON:
El campo será mostrado como un icono.

SYMBOL:
El campo será mostrado como un símbolo.

JUST:
Justificación del campo. R= justificado a la derecha, L= justificado a la izquierda, C= centrado.

LZERO:
Mostrará los campos de tipo NUMC justificados a la derecha y sin ceros a la izquierda.

NO_SIGN:
Mostrará el campo sin signos.

NO_ZERO:
Suprime los 0’s.

EDIT_MASK:
Mostrará el campo con una máscara.

SELTEXT_L:
Se mostrará en la cabecera de la columna el texto largo de la definición del campo en la tabla del diccinario de datos.

SELTEXT_M:
Se mostrará en la cabecera de la columna el texto medio de la definición del campo en la tabla del diccinario de datos.

SELTEXT_S:
Se mostrará en la cabecera de la columna el texto corto de la definición del campo en la tabla del diccinario de datos.

DDICTXT:
Especificará mediante L, M y S el texto largo, medio o corto que se utilizará en los títulos de las cabeceras.

DATATYPE:
Se especificará cuando el campo de la tabla interna de datos no esté referenciado a ningún campo de tabla del diccionario de datos.

DDIC_OUTPUTLEN:
Especifica la longitud de salida. Para campos no referenciados al diccionario de datos.

SP_GROUP:
Si se marca este campo, el campo actual pertenecerá a un grupo que se especificará después en el parámetro IT_SPECIAL_GROUPS.

REPREP:
El campo será tomado como un criterio de selección

Campo password (oculto) en reporte

Si se desea mostrar un como de entrada como texto oculto, o como un campo de password (ej. carácteres '****') debe insertar un código similar al siguiente ejemplo:

PARAMETERS: P_PASSWD(8) MODIF ID MiTexto. <--- "MiTexto" es un ID de grupo
...
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'MiTexto'. "Comprueba si el ID es = al que queremos que se oculteSCREEN-INVISIBLE = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
END-OF-SELECTION.

Wildcard

Wildcard para busquedas.

z* Que comienzan con z
*sale* Que contienen el string sale, tal como rvsale07
*f+ Que contienen una f como el carácter penúltimo, tal como rmlogifa
rp+++sch Que comienzan con rp, terminan en sch y contienen tres caracteres
cualesquiera entre medio, tal como rp012sch o rpinvsch

Llamar aplicación externa de SAP

WS_EXECUTE permite ejecutar el programa externo de SAP, permite pasar parámetros.

CALL FUNCTION 'WS_EXECUTE'
EXPORTING
* DOCUMENT = ' '
* CD = ' '
COMMANDLINE = ' -min -a c:destino.zip c:1.txt c:2.txt'
* INFORM = ' '
PROGRAM = 'winzip32.exe'
* STAT = ' '
* WINID = ' '
* OSMAC_SCRIPT = ' '
* OSMAC_CREATOR = ' '
* WIN16_EXT = ' '
* EXEC_RC = ' '
* IMPORTING
* RBUFF =
* EXCEPTIONS
* FRONTEND_ERROR = 1
* NO_BATCH = 2
* PROG_NOT_FOUND = 3
* ILLEGAL_OPTION = 4
* GUI_REFUSE_EXECUTE = 5
* OTHERS = 6
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

System values

Para cuando no se tenga acceso a la se11

SY-INDEX Number of loop passes
SY-PAGNO Runtime: Current page in list
SY-TABIX Runtime: Current line of an internal table
SY-TFILL Current number of entries in internal table
SY-TLOPC Internal use
SY-TMAXL Maximum number of entries in internal table
SY-TOCCU OCCURS parameter with internal tables
SY-TTABC Number of line last read in an internal table
SY-TSTIS Internal use
SY-TTABI Offset of internal table in roll area
SY-DBCNT Number of elements in edited dataset with DB operations
SY-FDPOS Location of a string
SY-COLNO Current column during list creation
SY-LINCT Number of list lines
SY-LINNO Current line for list creation
SY-LINSZ Line size of list
SY-PAGCT Page size of list from REPORT statement
SY-MACOL Number of columns from SET MARGIN
SY-MAROW No. of lines from SET MARGIN statement
SY-TLENG Line width of an internal table
SY-SFOFF Internal use
SY-WILLI Number of current window line
SY-LILLI Number of current list line
SY-SUBRC Return value after specific ABAP/4 statements
SY-FLENG Internal use (field length)
SY-CUCOL Cursor position (column)
SY-CUROW Cursor position (line)
SY-LSIND Number of secondary list
SY-LISTI Number of current list line
SY-STEPL Number of LOOP line at screen step
SY-TPAGI Flag indicating roll-out of internal table to paging area
SY-WINX1 Window coordinate (column left)
SY-WINY1 Window coordinate (line left)
SY-WINX2 Window coordinate (column right)
SY-WINY2 Window coordinate (line right)
SY-WINCO Cursor position in window (column)
SY-WINRO Cursor position in window (line)
SY-WINDI Index of current window line
SY-SROWS Lines on screen
SY-SCOLS Columns on screen
SY-LOOPC Number of LOOP lines at screen step loop
SY-FOLEN Internal use (field output length)
SY-FODEC Internal use (field decimal places)
SY-TZONE Time difference from 'Greenwich Mean Time' (UTC) in seconds
SY-DAYST Summertime active ? ('daylight saving time')
SY-FTYPE Internal use (field type)
SY-APPLI SAP applications
SY-FDAYW Factory calendar weekday
SY-CCURS Rate specification/result field (CURRENCY CONVERT)
SY-CCURT Table rate from currency conversion
SY-DEBUG Internal use
SY-CTYPE Exchange rate type 'M','B','G' from CURRENCY CONVERSION
SY-INPUT Internal use
SY-LANGU SAP logon language key
SY-MODNO Number of alternative modi
SY-BATCH Background active (X)
SY-BINPT Batch input active (X)
SY-CALLD CALL mode active (X)
SY-DYNNR Number of current screen
SY-DYNGR Screen group of current screen
SY-NEWPA Internal use
SY-PRI40 Internal use
SY-RSTRT Internal use
SY-WTITL Standard page header indicator
SY-CPAGE Current page number
SY-DBNAM Logical database for ABAP/4 program
SY-MANDT Client number from SAP logon
SY-PREFX ABAP/4 prefix for background jobs
SY-FMKEY Current function code menu
SY-PEXPI Print: Spool retention period
SY-PRINI Internal use
SY-PRIMM Print: Print immediately
SY-PRREL Print: Delete after printing
SY-PLAYO Internal use
SY-PRBIG Print: Selection cover sheet
SY-PLAYP Internal use
SY-PRNEW Print: New spool request (list)
SY-PRLOG Internal use
SY-PDEST Print: Output device
SY-PLIST Print: Name of spool request (list name)
SY-PAUTH Internal use
SY-PRDSN Print: Name of spool dataset
SY-PNWPA Internal use
SY-CALLR Print: ID for print dialog function
SY-REPI2 Internal use
SY-RTITL Print: Report title of program to be printed
SY-PRREC Print: Recipient
SY-PRTXT Print: Text for cover sheet
SY-PRABT Print: Department on cover sheet
SY-LPASS Internal use
SY-NRPAG Internal use
SY-PAART Print: Format
SY-PRCOP Print: Number of copies
SY-BATZS Background SUBMIT: Immediately
SY-BSPLD Background SUBMIT: List output to spool
SY-BREP4 Background SUBMIT: Root name of request report
SY-BATZO Background SUBMIT: Once
SY-BATZD Background SUBMIT: Daily
SY-BATZW Background SUBMIT: Weekly
SY-BATZM Background SUBMIT: Monthly
SY-CTABL Exchange rate table from currency conversion
SY-DBSY-S System: Database system
SY-DCSY-S System: Dialog system
SY-MACDB Program: Name of file for matchcode access
SY-SY-SID System: SAP system ID
SY-OPSY-S System: Operating system
SY-PFKEY Runtime: Current F key status
SY-SAPRL System: SAP Release
SY-TCODE Session: Current transaction code
SY-UCOMM Interact.: Command field function entry
SY-CFWAE Internal use
SY-CHWAE Internal use
SY-SPONO Runtime: Spool number for list output
SY-SPONR Runtime: Spool number from TRANSFER statement
SY-WAERS T001: Company code currency after reading B segment
SY-CDATE Date of rate from currency conversion
SY-DATUM system: Date
SY-SLSET Name of selection set
SY-SUBTY ABAP/4: Call type for SUBMIT
SY-SUBCS Internal: CALL status of program
SY-GROUP Internal: Bundling
SY-FFILE Internal: Flat file (USING/GENERATING DATASET)
SY-UZEIT system: Time
SY-DSNAM Runtime: Name of dataset for spool output
SY-REPID Program: Name of ABAP/4 program
SY-TABID Internal use
SY-TFDSN Runtime: Dataset for data extracts
SY-UNAME Session: SAP user from SAP logon
SY-LSTAT Interact.: Status information for each list level
SY-ABCDE Constant: Alphabet (A,B,C,...)
SY-MARKY Current line character for MARK
SY-SFNAM No longer used
SY-TNAME Name of internal table after an access
SY-MSGLI Interact.: Message line (line 23)
SY-TITLE Title of ABAP/4 program
SY-ENTRY Internal use
SY-LISEL Interact.: Selected line
SY-ULINE Constant: Underline (---------...)
SY-XCODE Extended command field
SY-CPROG Runtime: Main program
SY-XPROG Internal use (system-EXIT program)
SY-XFORM Internal use (system-EXIT form)
SY-LDBPG Program: ABAP/4 database program for SY--DBNAM
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-TVAR Runtime: Text variable for ABAP/4 text elements
SY-MSGID Message ID
SY-MSGTY Message type (E,I.W,...)
SY-MSGNO Message number
SY-MSGV Message variable
SY-MSGV Message variable
SY-MSGV Message variable
SY-MSGV Message variable
SY-ONCOM Internal: ON COMMIT flag
SY-VLINE Constant: Vertical bar
SY-WINSL Interact.: Selected window line
SY-STACO Interact.: List displayed from column
SY-STARO Interact.: Page displayd from line
SY-DATAR Flag: Data received
SY-HOST Host
SY-STLOCDB Local database exists
SY-STLOCOP Local database operation
SY-STDATLO Local date for user
SY-STTIMLO Local time for user
SY-STTSTLO Timestamp (date and time) for user
SY-STZONLO Time zone of user
SY-STDATUT Global date related to UTC (GMT)
SY-STTIMUT Global time related to UTC (GMT)
SY-STTSTUT Timestamp (date and time) related to UTC (GMT)

PopUp de texto a Usuario

CALL FUNCTION 'TH_POPUP'
EXPORTING
CLIENT = SY-MANDT
USER = USR_TABL-BNAME
MESSAGE = MESSAGE
EXCEPTIONS
USER_NOT_FOUND = 1.

Buscar un string en todos los programas

RSRSCAN1 - Search a String in all programs, and the list of hits in the program.

Condición lógica de Strings

CO Contiene sólo.
CN No contiene sólo.
CA Contiene algún.
NA No contiene algún.
CS Contiene el string.
NS No contiene el string.
CP Contiene el pattern.
‘*’ cualquier número de caracteres.
‘+’ cualquier carácter.
‘#’
NP No contiene el pattern.
‘*’ cualquier número de caracteres.
‘+’ cualquier carácter.
‘#’

Download programa a un directorio

*----------------------------------------------------------------------*
* Report: ZKBPROGS *
*----------------------------------------------------------------------*
* Function : Up/Download ABAP reports complete with texts *
*----------------------------------------------------------------------*
* Change Log : *
* July 5, 1999 *
* - Combined existing programs that did the upload and download into*
* - one program. *
* - Changed format that the reports are saved in to be compatible *
* with Wolfgang Morgenthaler's upload/download program(YSTRASN00 *
* at www.antarcon.de). Major differences between this program and*
* Wolfgang's are:
* - this program does not update TRDIR with the *
* TRDIR entries that are in the program uploaded. Instead, *
* current users stats are used. *
* - this program allows selection of reports from a list or *
* a single report can be tuped in and uploaded *
* - this program also updates TADIR so that a development class*
* is assigned to the program *
* - this program checks to see if the program already has a *
* TRDIR entry, and if it does, warns the user *
* - this program will save/restore the program documenation too*
* *
* *
* *
*----------------------------------------------------------------------*
REPORT ZKBPROGS
NO STANDARD PAGE HEADING
LINE-SIZE 255.
*----------------------------------------------------------------------*
* Declare Database Objects *
*----------------------------------------------------------------------*
tables:
DOKIL,
TRDIR.
*----------------------------------------------------------------------*
* Constants*
CONSTANTS:
MC_TRDIR_IDENTIFIER(72) TYPE C VALUE '%&%& RDIR',
MC_REPORT_IDENTIFIER(72) TYPE C VALUE '%&%& REPO',
MC_TEXT_IDENTIFIER(72) TYPE C VALUE '%&%& TEXP',
MC_THEAD_IDENTIFIER(72) TYPE C VALUE '%&%& HEAD',
MC_DOC_IDENTIFIER(72) TYPE C VALUE '%&%& DOKL',
MC_TRDIR_SHORT(4) TYPE C VALUE 'RDIR',
MC_REPORT_SHORT(4) TYPE C VALUE 'REPO',
MC_TEXT_SHORT(4) TYPE C VALUE 'TEXP',
MC_THEAD_SHORT(4) TYPE C VALUE 'HEAD',
MC_DOC_SHORT(4) TYPE C VALUE 'DOKP'.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Declare Module level data structures *
*----------------------------------------------------------------------*
DATA: BEGIN OF MTAB_PROGRAM_SOURCE OCCURS 0,
LINE(72) TYPE C,
END OF MTAB_PROGRAM_SOURCE.
DATA: MTAB_PROGRAM_TRDIR LIKE TRDIR OCCURS 0 WITH HEADER LINE.
DATA: MTAB_PROGRAM_TEXTS LIKE TEXTPOOL OCCURS 0 WITH HEADER LINE.
DATA: MSTR_THEAD LIKE THEAD.
DATA: BEGIN OF MTAB_PROGRAM_FILE OCCURS 0,
LINE(275) TYPE C,
END OF MTAB_PROGRAM_FILE.
DATA: BEGIN OF MTAB_DIRECTORY OCCURS 0,
NAME LIKE TRDIR-NAME,
DESC(72) TYPE C,
SAVENAME LIKE RLGRAP-FILENAME,
END OF MTAB_DIRECTORY.
DATA: BEGIN OF MTAB_PROGRAM_DOCUMENTATION OCCURS 0,
LINE(255) TYPE C,
END OF MTAB_PROGRAM_DOCUMENTATION.
*----------------------------------------------------------------------*
* Selection Screen *
*----------------------------------------------------------------------*
*-- Options for upload/download of programs
SELECTION-SCREEN BEGIN OF BLOCK FRM_OPTIONS WITH FRAME TITLE TEXT-UDL.
PARAMETERS:
RB_DOWN RADIOBUTTON GROUP UDL DEFAULT 'X'. " Download reports
SELECTION-SCREEN BEGIN OF BLOCK FRM_TRDIR WITH FRAME TITLE TEXT-DIR.
SELECT-OPTIONS:
S_NAME FOR TRDIR-NAME, " Program Name
S_SUBC FOR TRDIR-SUBC " Program Type
DEFAULT 'F' OPTION EQ SIGN E," Exclude Functions by default
S_CNAM FOR TRDIR-CNAM " Created by
DEFAULT SY-UNAME,
S_UNAM FOR TRDIR-UNAM, " Last Changed by
S_CDAT FOR TRDIR-CDAT, " Creation date
S_UDAT FOR TRDIR-UDAT. " Last update date
SELECTION-SCREEN END OF BLOCK FRM_TRDIR.
*-- Options for uploading programs
PARAMETERS:
RB_UP RADIOBUTTON GROUP UDL. " Upload reports
SELECTION-SCREEN BEGIN OF BLOCK FRM_UPLOAD WITH FRAME TITLE TEXT-UPL.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(29) TEXT-SNG.
PARAMETERS:
RB_FILE RADIOBUTTON GROUP HOW DEFAULT 'X'.
SELECTION-SCREEN COMMENT 33(42) TEXT-FNA.
SELECTION-SCREEN END OF LINE.
PARAMETERS:
RB_LIST RADIOBUTTON GROUP HOW.
SELECTION-SCREEN END OF BLOCK FRM_UPLOAD.
SELECTION-SCREEN END OF BLOCK FRM_OPTIONS.
*-- Options for up/downloading programs
SELECTION-SCREEN BEGIN OF BLOCK FRM_FILEN WITH FRAME TITLE TEXT-FIL.
PARAMETERS:
RB_DOS RADIOBUTTON GROUP FIL DEFAULT 'X', " Save to local
RB_UNIX RADIOBUTTON GROUP FIL, " Save to UNIX
P_PATH LIKE RLGRAP-FILENAME " Path to save files to
DEFAULT 'c:\temp\'.
SELECTION-SCREEN END OF BLOCK FRM_FILEN.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NAME-LOW.
CALL FUNCTION 'F4_PROGRAM'
EXPORTING
OBJECT = S_NAME-LOW
SUPPRESS_SELECTION = 'X'
IMPORTING
RESULT = S_NAME-LOW
EXCEPTIONS
OTHERS = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NAME-HIGH.
CALL FUNCTION 'F4_PROGRAM'
EXPORTING
OBJECT = S_NAME-HIGH
SUPPRESS_SELECTION = 'X'
IMPORTING
RESULT = S_NAME-HIGH
EXCEPTIONS
OTHERS = 1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_UNAM-LOW.
PERFORM GET_NAME USING 'S_UNAM-LOW'
CHANGING S_UNAM-LOW.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_UNAM-HIGH.
PERFORM GET_NAME USING 'S_UNAM-HIGH'
CHANGING S_UNAM-HIGH.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CNAM-LOW.
PERFORM GET_NAME USING 'S_CNAM-LOW'
CHANGING S_CNAM-LOW.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CNAM-HIGH.
PERFORM GET_NAME USING 'S_CNAM-HIGH'
CHANGING S_CNAM-HIGH.
TOP-OF-PAGE.
IF RB_LIST = 'X'.
FORMAT COLOR COL_HEADING.
NEW-LINE.
WRITE: AT 3 TEXT-H01,
AT 15 TEXT-H03.
FORMAT COLOR OFF.
ENDIF.
AT LINE-SELECTION.
CHECK RB_LIST = 'X'. " only do in list mode
READ LINE SY-CUROW FIELD VALUE MTAB_DIRECTORY-SAVENAME.
*-- Read file into an internal table
PERFORM READ_REPORT_FROM_DISK TABLES MTAB_PROGRAM_FILE
USING MTAB_DIRECTORY-SAVENAME.
*-- Split table into TADIR entry, report lines, and report text
PERFORM SPLIT_INCOMING_FILE TABLES MTAB_PROGRAM_FILE
MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
CHANGING TRDIR
MSTR_THEAD.
*-- Save all of the data
PERFORM INSERT_NEW_REPORT TABLES MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
USING TRDIR
MSTR_THEAD.
*----------------------------------------------------------------------*
* Start of processing *
*----------------------------------------------------------------------*
START-OF-SELECTION.
FORMAT COLOR COL_NORMAL.
IF RB_DOWN = 'X'.
PERFORM DOWNLOAD_REPORTS.
ELSEIF RB_UP = 'X'.
PERFORM UPLOAD_REPORTS.
ENDIF.
END-OF-SELECTION.
IF RB_DOWN = 'X'.
CONCATENATE P_PATH
'directory.txt'
INTO P_PATH.
PERFORM SAVE_TABLE_TO_FILE TABLES MTAB_DIRECTORY
USING P_PATH.
ENDIF.
*---------------------------------------------------------------------*
* FORM UPLOAD_REPORTS *
*---------------------------------------------------------------------*
FORM UPLOAD_REPORTS.
*-- Can upload a reports entered in selection criteria or
*-- select from a list. List can be from index.txt in same directory
*-- (created by the download) or by reading the first line of each file
*-- in the directory.
IF RB_FILE = 'X'. " Upload single program from a file
*-- Read file into an internal table
PERFORM READ_REPORT_FROM_DISK TABLES MTAB_PROGRAM_FILE
USING P_PATH.
*-- Split table into TADIR entry, report lines, and report text
PERFORM SPLIT_INCOMING_FILE TABLES MTAB_PROGRAM_FILE
MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
CHANGING TRDIR
MSTR_THEAD.
*-- Save all of the data
PERFORM INSERT_NEW_REPORT TABLES MTAB_PROGRAM_SOURCE
MTAB_PROGRAM_TEXTS
MTAB_PROGRAM_DOCUMENTATION
USING TRDIR
MSTR_THEAD.
ELSEIF RB_LIST = 'X'. " Show list for user to choose from
*-- get list of report names/descriptions from directory text
CONCATENATE P_PATH
'directory.txt'
INTO P_PATH.
PERFORM READ_REPORT_FROM_DISK TABLES MTAB_DIRECTORY
USING P_PATH.
SORT MTAB_DIRECTORY.
*-- Write out list of report names/descriptions
LOOP AT MTAB_DIRECTORY.
WRITE:
/ MTAB_DIRECTORY-NAME UNDER TEXT-H01,
MTAB_DIRECTORY-DESC UNDER TEXT-H03,
MTAB_DIRECTORY-SAVENAME.
ENDLOOP.
*-- Process user selections for reports to upload.
ENDIF.
ENDFORM. " upload_reports
*---------------------------------------------------------------------*
* FORM DOWNLOAD_REPORTS *
*---------------------------------------------------------------------*
* From the user selections, get all programs that meet the *
* criteria, and save them in ftab_program_directory. *
* Also save the report to disk. *
*---------------------------------------------------------------------*
FORM DOWNLOAD_REPORTS.
DATA:
LC_FULL_FILENAME LIKE RLGRAP-FILENAME.
*-- The table is put into an internal table because the program will
*-- abend if multiple transfers to a dataset occur within a SELECT/
*-- ENDSELCT (tested on 3.1H)
SELECT * FROM TRDIR
INTO TABLE MTAB_PROGRAM_TRDIR
WHERE NAME IN S_NAME
AND SUBC IN S_SUBC
AND CNAM IN S_CNAM
AND UNAM IN S_UNAM
AND CDAT IN S_CDAT
AND UDAT IN S_UDAT.
LOOP AT MTAB_PROGRAM_TRDIR.
*-- Clear out text and source code tables
CLEAR:
MTAB_PROGRAM_FILE,
MTAB_PROGRAM_SOURCE,
MTAB_PROGRAM_TEXTS,
MTAB_PROGRAM_DOCUMENTATION.
REFRESH:
MTAB_PROGRAM_FILE,
MTAB_PROGRAM_SOURCE,
MTAB_PROGRAM_TEXTS,
MTAB_PROGRAM_DOCUMENTATION.
*-- Get the report
READ REPORT MTAB_PROGRAM_TRDIR-NAME INTO MTAB_PROGRAM_SOURCE.
*-- Get the text for the report
READ TEXTPOOL MTAB_PROGRAM_TRDIR-NAME INTO MTAB_PROGRAM_TEXTS.
*-- Get the documentation for the report
CLEAR DOKIL.
SELECT * UP TO 1 ROWS FROM DOKIL
WHERE ID = 'RE'
AND OBJECT = MTAB_PROGRAM_TRDIR-NAME
AND LANGU = SY-LANGU
AND TYP = 'E'
ORDER BY VERSION DESCENDING.
ENDSELECT.
*-- Documentation exists for this object
IF SY-SUBRC = 0.
CALL FUNCTION 'DOCU_READ'
EXPORTING
ID = DOKIL-ID
LANGU = DOKIL-LANGU
OBJECT = DOKIL-OBJECT
TYP = DOKIL-TYP
VERSION = DOKIL-VERSION
IMPORTING
HEAD = MSTR_THEAD
TABLES
LINE = MTAB_PROGRAM_DOCUMENTATION
EXCEPTIONS
OTHERS = 1.
ENDIF.
*-- Put the report code and texts into a single file
*-- Put the identifier line in so that the start of the TRDIR line
*-- is marked
CONCATENATE MC_TRDIR_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the TRDIR line
MTAB_PROGRAM_FILE-LINE = MTAB_PROGRAM_TRDIR.
APPEND MTAB_PROGRAM_FILE.
*-- Put the identifier line in so that the start of the report code
*-- is marked
CONCATENATE MC_REPORT_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the report code
LOOP AT MTAB_PROGRAM_SOURCE.
MTAB_PROGRAM_FILE = MTAB_PROGRAM_SOURCE.
APPEND MTAB_PROGRAM_FILE.
ENDLOOP.
*-- Put the identifier line in so that the start of the report text
*-- is marked
CONCATENATE MC_TEXT_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the report texts
LOOP AT MTAB_PROGRAM_TEXTS.
MTAB_PROGRAM_FILE = MTAB_PROGRAM_TEXTS.
APPEND MTAB_PROGRAM_FILE.
ENDLOOP.
*-- Put the identifier line in so that the start of the THEAD record
*-- is marked
CONCATENATE MC_THEAD_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
MTAB_PROGRAM_FILE = MSTR_THEAD.
APPEND MTAB_PROGRAM_FILE.
*-- Put the identifier line in so that the start of the report
*-- documentation is marked
CONCATENATE MC_DOC_IDENTIFIER
MTAB_PROGRAM_TRDIR-NAME
INTO MTAB_PROGRAM_FILE-LINE.
APPEND MTAB_PROGRAM_FILE.
*-- Add the report documentation
LOOP AT MTAB_PROGRAM_DOCUMENTATION.
MTAB_PROGRAM_FILE = MTAB_PROGRAM_DOCUMENTATION.
APPEND MTAB_PROGRAM_FILE.
ENDLOOP.
*-- Make the fully pathed filename that report will be saved to
CONCATENATE P_PATH
MTAB_PROGRAM_TRDIR-NAME
'.txt'
INTO LC_FULL_FILENAME.
PERFORM SAVE_TABLE_TO_FILE TABLES MTAB_PROGRAM_FILE
USING LC_FULL_FILENAME.
*-- Write out message with Program Name/Description
READ TABLE MTAB_PROGRAM_TEXTS WITH KEY ID = 'R'.
IF SY-SUBRC = 0.
MTAB_DIRECTORY-NAME = MTAB_PROGRAM_TRDIR-NAME.
MTAB_DIRECTORY-DESC = MTAB_PROGRAM_TEXTS-ENTRY.
MTAB_DIRECTORY-SAVENAME = LC_FULL_FILENAME.
APPEND MTAB_DIRECTORY.
WRITE: / MTAB_PROGRAM_TRDIR-NAME,
MTAB_PROGRAM_TEXTS-ENTRY(65) COLOR COL_HEADING.
ELSE.
MTAB_DIRECTORY-NAME = MTAB_PROGRAM_TRDIR-NAME.
MTAB_DIRECTORY-DESC = 'No description available'.
MTAB_DIRECTORY-SAVENAME = LC_FULL_FILENAME.
APPEND MTAB_DIRECTORY.
WRITE: / MTAB_PROGRAM_TRDIR-NAME.
ENDIF.
ENDLOOP.
ENDFORM. " BUILD_PROGRAM_DIRECTORY
*---------------------------------------------------------------------*
* FORM SAVE_TABLE_TO_FILE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> FTAB_TABLE *
* --> F_FILENAME *
*---------------------------------------------------------------------*
FORM SAVE_TABLE_TO_FILE TABLES FTAB_TABLE
USING F_FILENAME.
IF RB_DOS = 'X'. " Save file to presentation server
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = F_FILENAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = FTAB_TABLE
EXCEPTIONS
OTHERS = 4.
IF SY-SUBRC NE 0.
WRITE: / 'Error opening dataset' COLOR COL_NEGATIVE,
F_FILENAME COLOR COL_NEGATIVE.
ENDIF.
ELSE. " Save file to application server
OPEN DATASET F_FILENAME FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC = 0.
LOOP AT FTAB_TABLE.
TRANSFER FTAB_TABLE TO F_FILENAME.
IF SY-SUBRC NE 0.
WRITE: / 'Error writing record to file;' COLOR COL_NEGATIVE,
F_FILENAME COLOR COL_NEGATIVE.
ENDIF.
ENDLOOP.
ELSE.
WRITE: / 'Error opening dataset' COLOR COL_NEGATIVE,
F_FILENAME COLOR COL_NEGATIVE.
ENDIF.
ENDIF. " End RB_DOS
ENDFORM. " SAVE_PROGRAM
*---------------------------------------------------------------------*
* FORM READ_REPORT_FROM_DISK *
*---------------------------------------------------------------------*
* Read report into internal table. Can read from local or *
* remote computer *
*---------------------------------------------------------------------*
FORM READ_REPORT_FROM_DISK TABLES FTAB_TABLE
USING F_FILENAME.
DATA:
LC_MESSAGE(128) TYPE C.
CLEAR FTAB_TABLE.
REFRESH FTAB_TABLE.
IF RB_DOS = 'X'.
TRANSLATE F_FILENAME USING '/\'. " correct slash for Dos PC file
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = F_FILENAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = FTAB_TABLE
EXCEPTIONS
CONVERSION_ERROR = 1
FILE_OPEN_ERROR = 2
FILE_READ_ERROR = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
IF SY-SUBRC >< 0.
WRITE: / 'Error reading file from local PC' COLOR COL_NEGATIVE.
ENDIF.
ELSEIF RB_UNIX = 'X'.
TRANSLATE F_FILENAME USING '\/'. " correct slash for unix
OPEN DATASET F_FILENAME FOR INPUT MESSAGE LC_MESSAGE IN TEXT MODE.
IF SY-SUBRC = 0.
DO.
READ DATASET F_FILENAME INTO FTAB_TABLE.
IF SY-SUBRC = 0.
APPEND FTAB_TABLE.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET F_FILENAME.
ELSE.
WRITE: / 'Error reading file from remote computer'
COLOR COL_NEGATIVE,
/ LC_MESSAGE,
/ F_FILENAME.
SY-SUBRC = 4.
ENDIF.
ENDIF.


ENDFORM. " READ_REPORT_FROM_DISK
*---------------------------------------------------------------------*
* FORM SPLIT_INCOMING_FILE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> FTAB_PROGRAM_FILE *
* --> FTAB_PROGRAM_SOURCE *
* --> ` *
* --> FTAB_PROGRAM_TEXTS *
*---------------------------------------------------------------------*
FORM SPLIT_INCOMING_FILE TABLES FTAB_PROGRAM_FILE
STRUCTURE MTAB_PROGRAM_FILE
FTAB_PROGRAM_SOURCE
STRUCTURE MTAB_PROGRAM_SOURCE
FTAB_PROGRAM_TEXTS
STRUCTURE MTAB_PROGRAM_TEXTS
FTAB_PROGRAM_DOCUMENTATION
STRUCTURE MTAB_PROGRAM_DOCUMENTATION
CHANGING FSTR_TRDIR
FSTR_THEAD.
DATA:
LC_DATATYPE(4) TYPE C, " Type of data, REPO, TEXP, RDIR
LC_PROGRAM_FILE LIKE MTAB_PROGRAM_FILE.
LOOP AT FTAB_PROGRAM_FILE.
LC_PROGRAM_FILE = FTAB_PROGRAM_FILE.
CASE LC_PROGRAM_FILE(9).
WHEN MC_TRDIR_IDENTIFIER.
LC_DATATYPE = MC_TRDIR_SHORT.
WHEN MC_REPORT_IDENTIFIER.
LC_DATATYPE = MC_REPORT_SHORT.
WHEN MC_TEXT_IDENTIFIER.
LC_DATATYPE = MC_TEXT_SHORT.
WHEN MC_DOC_IDENTIFIER.
LC_DATATYPE = MC_DOC_SHORT.
WHEN MC_THEAD_IDENTIFIER.
LC_DATATYPE = MC_THEAD_SHORT.
WHEN OTHERS. " Actual contents of report, trdir, or text
CASE LC_DATATYPE.
WHEN MC_TRDIR_SHORT.
FSTR_TRDIR = FTAB_PROGRAM_FILE.
WHEN MC_REPORT_SHORT.
FTAB_PROGRAM_SOURCE = FTAB_PROGRAM_FILE.
APPEND FTAB_PROGRAM_SOURCE.
WHEN MC_TEXT_SHORT.
FTAB_PROGRAM_TEXTS = FTAB_PROGRAM_FILE.
APPEND FTAB_PROGRAM_TEXTS.
WHEN MC_THEAD_SHORT.
FSTR_THEAD = FTAB_PROGRAM_FILE.
WHEN MC_DOC_SHORT.
FTAB_PROGRAM_DOCUMENTATION = FTAB_PROGRAM_FILE.
APPEND FTAB_PROGRAM_DOCUMENTATION.
ENDCASE.
ENDCASE.
ENDLOOP.
ENDFORM. " SPLIT_INCOMING_FILE
*---------------------------------------------------------------------*
* FORM INSERT_NEW_REPORT*
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> FTAB_PROGRAM_SOURCE *
* --> FTAB_PROGRAM_TEXTS *
* --> F_TRDIR *
*---------------------------------------------------------------------*
FORM INSERT_NEW_REPORT TABLES FTAB_PROGRAM_SOURCE
STRUCTURE MTAB_PROGRAM_SOURCE
FTAB_PROGRAM_TEXTS
STRUCTURE MTAB_PROGRAM_TEXTS
FTAB_PROGRAM_DOCUMENTATION
STRUCTURE MTAB_PROGRAM_DOCUMENTATION
USING FSTR_TRDIR LIKE TRDIR
FSTR_THEAD LIKE MSTR_THEAD.
DATA:
LC_OBJ_NAME LIKE E071-OBJ_NAME,
LC_LINE2(40) TYPE C,
LC_ANSWER(1) TYPE C.
*-- read trdir to see if the report already exists, if it does, prompt
*-- user to overwrite or abort.
SELECT SINGLE * FROM TRDIR WHERE NAME = FSTR_TRDIR-NAME.
IF SY-SUBRC = 0. " Already exists
CONCATENATE 'want to overwrite report'
FSTR_TRDIR-NAME
INTO LC_LINE2 SEPARATED BY SPACE.
CONCATENATE LC_LINE2
'?'
INTO LC_LINE2.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
DEFAULTOPTION = 'N'
TEXTLINE1 = 'The selected report already exists, do you'
TEXTLINE2 = LC_LINE2
TITEL = 'Report already exists'
CANCEL_DISPLAY = SPACE
IMPORTING
ANSWER = LC_ANSWER
EXCEPTIONS
OTHERS = 1.
ELSE.
LC_ANSWER = 'J'.
ENDIF.
IF LC_ANSWER = 'J'.
*-- Create the TADIR entry. (TRDIR entry created by INSERT REPORT)
LC_OBJ_NAME = TRDIR-NAME.
CALL FUNCTION 'TR_TADIR_POPUP_ENTRY_E071'
EXPORTING
WI_E071_PGMID = 'R3TR'
WI_E071_OBJECT = 'PROG'
WI_E071_OBJ_NAME = LC_OBJ_NAME
WI_TADIR_DEVCLASS = '$TMP'
EXCEPTIONS
EXIT = 3
OTHERS = 4.
IF SY-SUBRC = 0.
*-- Create Report
INSERT REPORT FSTR_TRDIR-NAME FROM FTAB_PROGRAM_SOURCE.
*-- Create Texts
INSERT TEXTPOOL FSTR_TRDIR-NAME FROM FTAB_PROGRAM_TEXTS
LANGUAGE SY-LANGU.
*-- Save Documentation
CALL FUNCTION 'DOCU_UPDATE'
EXPORTING
HEAD = FSTR_THEAD
STATE = 'A'
TYP = 'E'
VERSION = '1'
TABLES
LINE = FTAB_PROGRAM_DOCUMENTATION
EXCEPTIONS
OTHERS = 1.
ELSE.
WRITE: / 'Error updating the TADIR entry' COLOR COL_NEGATIVE,
'Program' COLOR COL_NEGATIVE INTENSIFIED OFF,
FSTR_TRDIR-NAME, 'was not loaded into SAP.'
COLOR COL_NEGATIVE INTENSIFIED OFF.
ENDIF.
ELSE.
WRITE: / FSTR_TRDIR-NAME COLOR COL_NEGATIVE,
'was not uploaded into SAP. Action cancelled by user'
COLOR COL_NEGATIVE INTENSIFIED OFF.
ENDIF.
ENDFORM. " INSERT_NEW_REPORT
*---------------------------------------------------------------------*
* FORM GET_NAME *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> VALUE(F_FIELD) *
* --> F_NAME *
*---------------------------------------------------------------------*
FORM GET_NAME USING VALUE(F_FIELD)
CHANGING F_NAME.
DATA: LTAB_FIELDS LIKE DYNPREAD OCCURS 0 WITH HEADER LINE,
LC_PROG LIKE D020S-PROG,
LC_DNUM LIKE D020S-DNUM.
TRANSLATE F_FIELD TO UPPER CASE.
refresh ltab_fields.
LTAB_FIELDS-FIELDNAME = F_FIELD.
append ltab_fields.
LC_PROG = SY-REPID .
LC_DNUM = SY-DYNNR .
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = LC_PROG
DYNUMB = LC_DNUM
TABLES
dynpfields = ltab_fields
EXCEPTIONS
OTHERS = 01.
read table ltab_fields index 1.
IF SY-SUBRC EQ 0.
F_NAME = LTAB_FIELDS-FIELDVALUE.
refresh ltab_fields.
ENDIF.
CALL FUNCTION 'F4_USER'
EXPORTING
OBJECT = F_NAME
IMPORTING
RESULT = F_NAME.
ENDFORM. " GET_NAME


Program Texts

DIR File Download Options (File Selection)
FIL File Options
FNA Enter filename below (under File Options)
H01 Prog Name
H03 Program Description
SNG Upload a single file
UDL Upload to SAP/Download from SAP
UPL File Upload Options
R Backup/Restore program source code with texts
P_PATH Path to save programs to
RB_DOS Files on local computer
RB_DOWN Download Programs
RB_FILE Upload a single file
RB_LIST Select program(s) from a list
RB_UNIX Files on remote computer
RB_UP Upload Programs to SAP
S_CDAT Date Created
S_CNAM Created by UserID
S_NAME Program Name
S_SUBC Program Type
S_UDAT Date Changed
S_UNAM Last Changed by UserID

Pop Up Debug

Crear un text con lo siguiente:

[FUNCTION]

Command=/H

Title=Debugger

Type=SystemCommand


Luego... drag and drop en la ventana que queremos debbuguear.

Si deseamos insertar un texto en un selection screen debemos agregar el siguiente codigo.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(66) TEXT-001 FOR FIELD p_path.
SELECTION-SCREEN END OF LINE.

y mantener el texto en Elementos de textos 001. (66 es el largo del texto introducido)

Browser file en Matchcode

Es común necesitar de este browser cuando tenemos que elejir la ruta para abrir un archivo o para grabar uno.

DATA: p_path_file TYPE STRING.

PARAMETERS: p_path like rlgrap-filename.

at selection-screen on value-request for p_path.
call function 'F4_FILENAME'
exporting
program_name = sy-repid
dynpro_number = sy-dynnr
field_name = 'PATH'
importing
file_name = p_path.

p_path_file = p_path.

la Función GUI_DOWNLOAD pide que el path sea un STRING, por eso le asigno el valor de p_path a p_path_file.

Crear Matchcode (Search Help) con una tabla interna.

En un momento dado me pidieron hacer un reporte donde el matchode del campo lgort, traía todos los lgort (almacenes) de todos los centros y el requerimiento era solamente los de un determinado centro.

Descubrí que se puede realizar un matchode dinamicamente con una tabla interna nuestra directamente desde el código.

Código:

At selection-screen on value-request for s_lgort-low.
Select LGORT LGOBE
from T001L
into table it_lgort
where werks = '2000'.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'LGORT'
WINDOW_TITLE = 'Depósitos'
VALUE_ORG = 'S'
TABLES
VALUE_TAB = it_lgort
RETURN_TAB = it_ret
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.

IF SY-SUBRC = 0.
read table it_ret index 1.
move it_ret-fieldval to S_lgort-low.
ENDIF.

Esto muestra el almacén, la descripción del mismo, y al elejir uno nos lleva al select option la opción elejida.

Problemas con el Filtro en reportes ALV

El problema que tenía era que al querer uhacer el filtro de un campo de 16 caracteres, el filtro solamente me dejaba cargar ingresar 10. Por lo tanto nunca realizaba el filtro correctamente.

Hay varias notas con respecto a este tema, si tenes todas aplicadas, como era mi caso y ya no sabía que inventar.

En un momento se iluminó la lamparita y lo solucioné utilizando lo siguiente:

gt_fieldcat-Outputlen = 16.

Esta propiedad del catalago es la que toma el filtro (ademas de ser la que determina el largo del campo a mostrarse).

TIP: En los Filtros se pueden utilizar wildcards (ejemplo: *004)

Función GET_DYNP_VALUE

Esta función se suele usar en los Field Exits, o en alguna que otra exits.

Con esta función podemos obtener el valor de un campo en la pantalla que estamos parados.

Recibe 3 parametros:
1- Campo
2- Programa
3- Pantalla

y devuelve un STRING con el valor determinado.

Example

DATA: l_vkorg TYPE STRING.

CALL FUNCTION 'GET_DYNP_VALUE'
EXPORTING
I_FIELD = 'RMMG1-VKORG'
I_REPID = 'SAPLMGD1'
I_DYNNR = '1004'
CHANGING
O_VALUE = l_vkorg.

Conectar SAP con DB SQL e insertar registros en el SQL directamente

En ABAP podemos grabar directamente en una DB externa a pedido de algún cliente, en este caso había que conectarse con una DB SQL Server, esto se realiza manteniendo una conexión con la DB y desde abap usando SQL NATIVO.

Pasos a seguir.
1- Establecer la conexión via tx DBCO


Enlace DB: es el nombre que nosotros queramos es el nombre con el cual dsp en el Código usaremos.
SGBD: Es el tipo de Server MSS (SQL Server)
Usuario y Password para acceder a la DB
Info Con.: El string de conexión con la DB.

2- Código Fuente
El SQL Nativo debemos ejecutarlo dentro de sentencias.
EXEC SQL
...
ENDEXEC.

"Primero nos conectamos
EXEC SQL.
CONNECT TO 'MULTINT3R' AS 'R'
ENDEXEC.

EXEC SQL.
SET CONNECTION 'R'
ENDEXEC.

"Loopeamos la tabla interna que deseamos grabar e insertamos los valores
LOOP AT IT_SQL.
EXEC SQL.
INSERT INTO ZRemito
(Remito, RemitoInterno, OT, Modelo, IMEI, ModReemp, IMEIReemp, Garantia, Precio, Moneda, NroFormularioSIC,Operador, TipoReg, codFallaAccionParte, FallaAccionParte, TextoFallaAccionParte, Cantidad, FechaHora,Usuario)
VALUES (:IT_SQL-REMITO, :IT_SQL-remito_sap, :IT_SQL-aufnr,:IT_SQL-Modelo, :IT_SQL-imei, :IT_SQL-modreemp,:IT_SQL-IMEIReemp, :IT_SQL-Garantia, :IT_SQL-Precio, :IT_SQL-Moneda, :IT_SQL-FSIC, :IT_SQL-Operador,:IT_SQL-LETRA, :IT_SQL-COD, :IT_SQL-Falla, :IT_SQL-Falla_t, :IT_SQL-Cantidad, :IT_SQL-Fecha, :IT_SQL-Usuario)
ENDEXEC.
ENDLOOP.

EXEC SQL.
SET CONNECTION DEFAULT
ENDEXEC.

User exit salvar factura

La ampliación que posee la exit al momento de salvar una factura, para poder hacer chequeos y validaciones antes de grabarse:

SDVFX001 -> FUNCTION EXIT_SAPLV60B_001 -> INCLUDE ZXVVFU01

NOTA: Recordar que no solo la VF01 es usada en esta exit, por ej, la tx VF11 (anulación de facturas) tmb llama a esta exit así que debemos restringir el user exit condicionando por el SY-TCODE.

Validación de Número de CAI

A veces tenemos que desarrollar validaciónes en cuanto al número de CAI.La tabla se mantiene por Customizing, se accede con la siguiente ruta.

Componentes Multiaplicaciones -> Funciones de aplicación generales -> Numeración de documentos multiaplicaciones -> Argentina -> Define Print Authorization Codes.

La tabla transparente es la J_1APACD.

Los datos que necesitaremos para realizar el chequeo son:


  • Sociedad

  • Lugar

  • Tipo de document(FI)

  • Letra

  • fecha



Ver tmb: User exit al salvar una factura

Autorizaciones para la visualización de Condiciones

En algunos clientes piden que ciertos usuarios no puedan visualizar las condiciones, de por ejemplo un pedido.

Esto no esta programado por SAP, pero la Nota 105621 que nos permite hacer esto.

La nota crea un objeto de blockeo entonces solamente a los usuarios que nosotros querramos le agregaremos un perfil con permisos para ver todas las condiciones.

Se se desea dividir los permisos. Por ej. Que ciertos usuarios vean los pedidos, pero no los contratos, o presupuestos. Para poder hacer esto cada uno debe tener un esquema de cálculo distinto. Sino no es posible.

NOTA: Los permisos se setean a nivel de Esquema de calculo, no de Transacción.

Debugging ABAP de una Webdynpro

Requisitos:
El JCO connector debe estar seteando en Single Server Connection.

1. Loguearse al sistema destino con el mismo nombre de usuario que esta seteado en el JCO connector.

2. Activar external debugging en ABAP Workbench.
a. Ir a tx SE37, SE38, o SE80.
b. Choose Utilidades-> Opciones en ABAP Editor tab ir a Debugging.
c. Poner el Usuario (JCO connector) Seleccionamos Actv. y Desactivamos IP matching
d. Salvamos.
3. Ponemos breakpoint Externo in the ABAP code, en el código como cualquier otro.

Al correr la Webdynpro for Java, se detendra en el breakpoint puesto y podemos analizar la llamada.

Crear transacción que ejecute directamente una vista de actualización.

Primero debemos tener echa una vista de actualización. Luego, si deseamos que el usuario ingrese una transacción y que le aparezca directamente la vista de actualización (modo update) para ya realizar cambios.

En la SE93 (creación de Transacciones) Creamos una tx y elegimos el tipo Parámetros y la seteamos de la siguiente manera.



Lo que estamos haciendo es llamar a la SM30, salteando la primer pantalla y abajo seteamos el nombre de la vista a actualizar y el modo de Update, si queremos que se visualice solamente hay que modificar ese parametro.

Parametros del servidor

En la tx rz10, podemos administrar los parámetros del servidor.

Al realizar cambios hay que bajar y volver a subir el servidor, para que tome los cambios.

Por ej: para que funcionen los Field Exits el siguiente parametro debe estar seteado.

abap/fieldexit = YES

Creación de Field Exits

Un Field Exit sirve funciona como un exit común, pero tiene ciertas particularidades y ademas el dominio abarca un solo campo (data element) y el dominio puede ser Global o especifico a Programa - Dynpro.

Para Acceder al Menu de Field Exits.

Tx CMOD y en el browser poner PRFB.

Si creamos un Field Exits, debemos primero Crear un grupo de Función, ya que el Field Exits trabaja en una Función con un parametro de import y otro de export, equivalentes al valor que ingresa y al valor que sale.

Luego de su creacion debemos Activarla para que surga efecto.

En un Field exit no podemos usar ninguna de las siguientes instrucciones.


  • BREAK-POINT

  • CALL SCREEN

  • CALL DIALOG

  • CALL TRANSACTION

  • SUBMIT

  • COMMIT WORK

  • ROLLBACK WORK

  • MESSAGE I

  • MESSAGE W



NOTA: Para poder activar los Field Extis debemos tener el parémetro.
abap/fieldexit = YES

Seteado en el servidor. Ver

Traducir un Smartform

Si se desea traducir un smartforms Z de español y a ingles, debemos utilizar la transaccion SE63 para realizar la misma y luego transportarla.

SE63 - Menu Traducción -> R/3 Enterprise -> Otros textos explicativos
Elejimos <> Smart Form SAP

En nombre de objeto ponemos el Smartforms que deseamos traducir. Con su repectivo Idioma origen y destino.
Nos aparecera una Doble ventana en la superior estan los textos y debajo su valor (en el idioma original) con su respectivo tipografia.

Nosotros debemos completar el cuadro de abajo elejiendo el valor que querramos en el idioma destino, o sea traducir nosotros la palabra del español a ingles.

NOTA: tratar de dejar la misma alineación de los textos, asi no tenemos problemos con las posiciones.

Al terminar, grabamos y activamos. Notese que no se genero ninguna orden de transporte.

Para poder transportar la traducción debemos agregar nosotros mismos la traducción a una Orden de transporte (algo similar con los textos creados con la SO10).

Ejecutar programa RS_LXE_RECORD_TORDER
Elejimos Create Transport Request ( )
Ponemos el idioma Destino
En Clase de orden elejimos T para que al liberar no se importen automaticamente en los otros sistemas o K para que siga la ruta especificada.

Grabamos. Esto genera una orden sin objetos. Ahora debemos llenarla.

Ejecutar programa RS_LXE_RECORD_TORDER
Ponemos el Idioma Destino 'EN' (ingles)
El tipo de objeto 'SSF' (Smartform)
Y la fecha y autor para restingir busqueda.

Nos aparecen las encontradas, ahi deberiamos ver la nuestra. La seleccionamos, ejecutamos y nos aparece un log de concluido.

Vamos a la SE10 y vamos a ver nuestra orden creada con el respectivo Objeto de traducción. Listo para ser transportada a QA.