noviembre 27, 2002

Funciones de fecha - Recuperar el ultimo dia del mes o la cantidad del dias del mes.

* RP_LAST_DAY_OF_MONTHS: Ingresas una fecha y te devuelve otra que es el ultimo dia del mes.
* NUMBER_OF_DAYS_PER_MONTH_GET: Ingresas el mes y el año y te devuelve la cantidad de dias del mes.

noviembre 25, 2002

- INSERTAR DATOS EN TABLAS SIN TENER PERMISOS


Cuando queremos insertar datos en una tabla y nos da un mensaje
diciendo que no tenemos autorización, hay una forma de inserta
datos.


COMO HAY QUE HACER?
A continuación se muestran los pasos a seguir, junto con un ejemplo.

--Identificar la tabla donde se quiere insertar el registro.
En este caso es la USR05 (Maestro de usuarios ID de parámetros)

Esta tabla tiene 4 campos:

MANDT FORMA PARTE DE LA CLAVE
BNAME FORMA PARTE DE LA CLAVE
PARID FORMA PARTE DE LA CLAVE
PARVA


--logearse a SAP con un usuario que permite hacer debugging


--Acceder a la transacción SE16, la cual permite visualizar
contenidos de tablas.

--Acceder a la tabla deseada y visualizar los datos.
(En nuestro caso es la USR05)


--Hacer DOBLE CLICK en algun registro para ir a la vista que muestra
un solo registro en detalle.
ESTE PASO ES MUY IMPORTANTE.

--En el campo de comandos de SAP, tipear /H.
De esta forma se entra en el modo debugging.
(Con campo de comandos me refiero al textbox que aparece en la
parte superior izquierda de la pantalla)

Aparecerá un mensaje que dice = "Se ha activado en modo debugging."


--Presionar ENTER (o el botón que el tilde de ejecutar)

De esta forma se comenzará a debuggear el codigo del programa
que permite visualizar los datos de una tabla.


--Dónde está el truco?

El truco consiste en lo siguiente:
Al estar en modo debugging, se pueden modificar datos del programa
a medida que el mismo se ejecuta.

El código fuente que se debería ver es el siguiente:

refresh exclude_tab.
>>>> if code = 'SHOW'.
set titlebar 'TAB' with name 'anzeigen'(100).
elseif code = 'EDIT'.
set titlebar 'TAB' with name 'ändern'(101).
elseif code = 'INSR'.
set titlebar 'TAB' with name 'einfügen'(102).

El puntero de ejecución se encuentra en la linea marcada con >>>>.
El valor actual de la variable CODE es SHOW.

POR LO TANTO, LO QUE HAY QUE HACER ES CAMBIAR EL VALOR A
INSR SI SE QUIEREN INSERTAR DATOS
EDIT SI SE QUIEREN MODIFICAR DATOS


--Cambiar el valor del campo CODE a INSR y presionar el botón
Modificar Contenido Campo.

--Presionar F8 (o continuar)

--De esta forma aparecerá una vista para ingresar un nuevo registro.

--Insertar el registro que se desee

--Presionar grabar y LISTO!
- Buscar en una subcadena. (En VB es instr).


SEARCH text for 'californ1'.

if sy-subrc ne 0.
write 'not found.'.
else.
write 'se encontro'.
endif.
- Acceder a una subcadena. (En VB es Mid).


utilizando offsets y lenght.
ejemplo= cadena+2(4)
"tomar 4 caracteres sin considerar los dos primeros"
- Sacar los espacios sobrantes. (En Visual Basic es trim()).

shift nombrecadena left deleting leading space.
- Obtener los días hábiles o los de vacaciones?


SE INVOCA A UNA FUNCION, PASANDOLE UN RANGO DE FECHAS.
SE LE PUEDE PASAR UN DIA SOLO, PONIENDO EN FECHA DESDE
Y FECHA HASTA EL MISMO DIA

DEVUELVE LA CANTIDAD DE DIAS QUE SON NO HABILES,
YA SEA FIN DE SEMANA O FERIADOS.


if not xbsid-nfechvto is initial.
perform averiguar_dia_habil.
if not dia_habil is initial.
set cursor field 'XBSID-NFECHVTO' line sy_tabix.
message id '00' type 'E' number '208'
with 'Fecha nueva de vencimiento no hábil'.
endif.
endif.


data: begin of xthol occurs 0.
include structure iscal_day.
data: end of xthol.

hcalid like scal-hcalid value '01'," Id de calendario
fcalid like scal-fcalid value 'CO'," Calendario de fábrica


form averiguar_dia_habil.
refresh xthol.
clear: dia_habil, xthol.


call function 'HOLIDAY_GET'
exporting
holiday_calendar = hcalid
factory_calendar = fcalid
date_from = xbsid-nfechvto
date_to = xbsid-nfechvto
tables
holidays = xthol
exceptions
factory_calendar_not_found = 1
holiday_calendar_not_found = 2
date_has_invalid_format = 3
date_inconsistency = 4
others = 5.

describe table xthol lines dia_habil.

endform. " AVERIGUAR_DIA_HABIL
- Como hacer una búsqueda en una tabla interna sin perder el puntero?

O sea, si estoy parado en un registro de una tabla interna, o estoy
completando los campos para generar un registro y tengo que hacer
una búsqueda, lo que no querría es que los datos que estoy cargando
se pierdan.


Lo que hay que hacer es utilizar el comando READ TABLE con
la opcion TRANSPORTING NO FIELDS

Ejemplo:

data: begin of it_tabla occurs 0,
campo1 type i,
campo2 type i,
end of it_tabla.

* INSERTA LOS DATOS EN LA TABLA
perform cargar_datos.

* EMPIEZA A GENERAR UN NUEVO REGISTRO PARA INSERTAR
it_tabla-campo1 = '910'.

* HACE UNA BUSQUEDA EN LA TABLA PARA VER SI EXISTE UN REGISTRO
* LO MAS IMPORTANTE DE ESTA BUSQUEDA ES QUE NO SE SOBRESCRIBE
* EL HEADER LINE YA QUE SE UTILIZA LA OPCION :
* transporting no fields

read table it_tabla with key campo1 = 1 campo2 = 1
transporting no fields.

if sy-subrc eq 0.
write: / 'Encontro el registro'.
endif.

it_tabla-campo2 = '910'.
append it_tabla.
- Cómo reemplazar un COLLECT?


El collect sumariza los campos numéricos.
Hay veces que no se quiere sumarizar un determinado
campo, por lo tanto el COLLECT no parece ser lo mas
adecuado.
En caso de tener que reemplazar un collect porque
se descubre este inconveniente, se lo puede
reemplazar por Append y modify.

Si no se encuentra el registro, se hace un APPEND.
Si se encuentra, se hace un append.

Ejemplo:

-ASI ERA CON COLLECT

SELECT XBLNR WRBTR DMBTR
INTO (AUX_BS-XBLNR3, AUX_BS-WRBTR3, AUX_BS-DMBTR3) FROM BSIK
WHERE BUKRS = TMP_BSIK-BUKRS
AND LIFNR = TMP_BSIK-LIFNR
AND REBZG = TMP_BSIK-BELNR
AND REBZJ = TMP_BSIK-GJAHR
AND REBZZ = TMP_BSIK-BUZEI. "corregido
COLLECT AUX_BS.
ENDSELECT.

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

-ASI QUEDO SIN LOS COLLECT


select *
* select xblnr wrbtr dmbtr
* into (aux_bs-xblnr3, aux_bs-wrbtr3, aux_bs-dmbtr3) from bsik
where bukrs = tmp_bsik-bukrs
and lifnr = tmp_bsik-lifnr
and rebzg = tmp_bsik-belnr and rebzj = tmp_bsik-gjahr and rebzz = tmp_bsik-buzei. "corregido
* collect aux_bs.

* En vez de hacer un collect, lo hace en forma manual con
* updates y append.
* Verifica si ya existe el registro en la tabla interna.
* Hace una búsqueda con la opcion TRANSPORTING NO FIELDS para
* no perder el registro actual.

collect aux_bs.

* En vez de hacer un collect, lo hace en forma manual con
* updates y append.
* Verifica si ya existe el registro en la tabla interna.
* Hace una búsqueda con la opcion TRANSPORTING NO FIELDS para
* no perder el registro actual.

read table aux_bs with key lifnr = tmp_bsik-lifnr "Nro Prov.
xblnr = tmp_bsik-xblnr "Nro Doc. Ref
nro_nota_pedido = tmp_bsik-zuonr "Nro Asignación
augdt = tmp_bsik-augdt "Fecha Comp
fecha_regul = v_fecha
transporting no fields.

if sy-subrc eq 0.
* Si existe hace un update en vez de hacer collect,
* sumarizando algunos campos.
read table aux_bs with key
lifnr = tmp_bsik-lifnr "Nro Prov.
xblnr = tmp_bsik-xblnr "Nro Doc. Ref
nro_nota_pedido = tmp_bsik-zuonr "Nro Asignació
augdt = tmp_bsik-augdt "Fecha Comp.
fecha_regul = v_fecha.

add bsik-dmbtr to aux_bs-dmbtr3.
add bsik-wrbtr to aux_bs-wrbtr3.
* realiza un update del registro actual.
modify aux_bs.
else.
* Si no existen el registro lo inserta.
* El resto de los campos de aux_bs ya contienen datos.
aux_bs-xblnr3 = bsik-xblnr.
aux_bs-wrbtr3 = bsik-wrbtr.
aux_bs-dmbtr3 = bsik-dmbtr.
append aux_bs.
endif.

- Copiar una los datos de una tabla interna a otra?


report ycb_36 .

tables: t000.

data: t_t000 like t000 occurs 0 with header line.
data: t_t000_2 like t000 occurs 0 with header line.

select * from t000 into table t_t000.

loop at t_t000.
write: / t_t000-mtext.
endloop.

*COPIA UNA TABLA INTERNA A OTRA
t_t000_2[] = t_t000[].

write sy-uline.

loop at t_t000_2.
write: / t_t000_2-mtext.
endloop.
- Seleccionar como mucho un registro de un Select que puede devolver más de uno


select * from bsak up to 1 rows.

En forma generica:
select * from bsak up to n rows.
- Como hacer para que el usuario seleccione de un combo un archivo a importar?


NO LE PONE EL NOMBRE DEL ARCHIVO
DE ESTA FORMA MUESTRA UNA ESPECIO DE COMBO CON VENTANA
PARA QUE EL USUARIO LO SELECCIONE.

CALL FUNCTION 'UPLOAD'
EXPORTING
* CODEPAGE = ' '
FILENAME = ' '
FILETYPE = 'DAT'
* ITEM = ' '
* FILEMASK_MASK = ' '
* FILEMASK_TEXT = ' '
* FILETYPE_NO_CHANGE = ' '
* FILEMASK_ALL = ' '
* FILETYPE_NO_SHOW = ' '
* LINE_EXIT = ' '
* USER_FORM = ' '
* USER_PROG = ' '
* SILENT = 'S'
TABLES
DATA_TAB = FILE_IN
EXCEPTIONS
CONVERSION_ERROR = 1
INVALID_TABLE_WIDTH = 2
INVALID_TYPE = 3
NO_BATCH = 4
UNKNOWN_ERROR = 5
OTHERS = 6.
- Cómo hacer para buscar una cadena de texto en todos o algunos de los programas de un mandante?


Utilizar el programa ygop10 que se encuentra en el
directorio CODIGO SAP de esta base de conocimientos.
- Fijar un breakpoint en el codigo, en forma harcodeada?


Escribir la sentencia:

break-point.
- Activar funciones cuando se producen errores en otras funciones del mismo grupo?


Hasta que todas las funciones no tengan
errores de sintaxis, no se puede activar.

Igualmente, en estos casos se deben activar
TODAS JUNTAS, ya que si se quiere activar
por separado siempre dice que hay otra
función que tiene error. Sería casi un "deadlock".
- Escapar comillas en una cadena?


FUNCTION Z_ESCAPAR_COMILLA_SIMPLE.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(V_INPUT) TYPE C
*" EXPORTING
*" REFERENCE(V_OUTPUT) TYPE C
*"----------------------------------------------------------------------
* Autor: Cristian Berri (Accenture)
* Fecha: 08/04/2002
* Desc: Por cada comilla simple que encuentra, inserta otra.
*"----------------------------------------------------------------------

data: v_len type i.
data: v_cont type i value 0.
data: v_salida(100) type c.

* Obtiene la longitud de la cadena de entrada
v_len = strlen( v_input ).

* Verifica si la cadena de entrada contiene el caracter comilla simple.
search v_input for ''''.

* Si no encontró la comilla simple, devuelve la misma cadena recibida.
if sy-subrc ne 0.
v_output = v_input.
else.

* Reemplaza cada comilla simple por DOS comillas simples.
* El resto de los caracteres los deja igual
while v_cont < v_len.

* Si el caracter es comilla simple.
if v_input+v_cont(1) eq ''''.
* Agrega DOS comillas simples a la cadena de salida.
concatenate v_salida '''''' into v_salida.
else.
* Copia el mismo caracter de la cadena de entrada a la de salida.
concatenate v_salida v_input+v_cont(1) into v_salida.
endif.

add 1 to v_cont.

endwhile.

* Copia la nueva cadena generada a la cadena pasada por parámetro
v_output = v_salida.

endif. " sy-subrc ne 0.

ENDFUNCTION.
- Utilizar memoria compartida:


ENVIO DE DATOS
--------------

DATA: V_ERROR_DESC(200) type c.

EXPORT V_ERROR_DESC from V_ERROR_DESC
to memory id 'ZBCS_FICUPL90_ERROR_DESC'.

* Borra la memoria
free memory.


RECEPCION DE DATOS
------------------

DATA: V_ERROR_DESC(200) type c.


* Importa posibles mensajes de error.
IMPORT V_ERROR_DESC FROM MEMORY ID 'ZBCS_FICUPL90_ERROR_DESC'.

- Mostrar una barra horizontal con el porcentaje realizado de una tarea?
- Mostrar una Progress Bar?


Ejemplo1:

call function 'SAPGUI_PROGRESS_INDICATOR'
exporting
percentage = i_cont
text = 'Ejecutando'
exceptions
others = 1.


Ejemplo2: mostrando el porcentaje

REPORT Z0000001.
DATA: A LIKE SY-UCOMM.

DO 100 TIMES.
DO 100 TIMES.
GET TIME.
ENDDO.
A(3) = SY-INDEX.
A+3(1) = '%'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = SY-INDEX
TEXT = A.
ENDDO.
- Dejar ceros a la izquierda de un numero


DATA: i_cont (2) type n.

Ahora i_cont tiene el formato 00.
Se se hace
i_cont = 1.

i_cont contendrá

01

El subindice indica el tamaño del campo.

También se pueden hacer operaciones aritmeticas sencillas
con estos campos de tipo N.

Por ejemplo,
Add 1 to i_cont

Ahora i_cont contendrá

02
- Comparar contra una fecha que tiene formato en complemento a 9999 o la cantidad de 9 nueves igual a la cantidad de digitos de la fecha.


Hacer la resta.
Por ejemplo:

7997 se refiere al año 2002, porque

9999-7997 = 2002.

También podría darse el caso que la fecha entera se encuentre en complemento.
Por ejemplo:

79979469

Este caso es análogo, solo hay que partir la fecha
en sus tres partes:

7997
94
69

y hacer la resta

9999-7997 = 2002
99-94 = 5
99-69 = 30

lo que daría 2002.05.30


También se podría hacer sin partir la fecha:


data: cadena(8) type c.
data: cadena_n(8) type n.

start-of-selection.

cadena = '79979469'.
cadena_n = '99999999'.

cadena = cadena_n - cadena.

write: / cadena.

lo que mostraría:

20020530
- Seleccionar todo el codigo de un programa si no se puede hacer un download?


RESPUESTA
1-Presionar F9 en la primera linea
2-Presionar F9 nuevamente en la ultima linea a seleccionar
3-ir al menu Bloque/Archivo y seleccionar copiar al Portapapeles y listo. Después se puede pegar.
-Configurar un perfil en SAP para que reciba mails?


-Ir a la transacción SU3
(Actualización de propios valores prefijados para el usuario)

-Presionar el botón Otras Comunicaciones
-Cuando se despliegue una lista,
seleccionar

INT SMTP (Mail Internet)

-Completar con la dirección de correo
del dueño del perfil de SAP

-Grabar y salir
-Preguntarle al usuario si desea continuar


Invocar a alguna de las siguientes funciones de SAP:
La diferencia radica en la cantidad de botones
que tiene cada una. Por ejemplo en una solo se puede
seleccionar Si o No, y en la otra Si, No y cancelar.


* (Si, no o cancelar)
call function 'POPUP_TO_CONFIRM_STEP

* (Si o No)
call function 'LC_POPUP_TO_CONFIRM_STEP'

Ejemplo 1:

* Invoca a una función que muestra un popup.
call function 'POPUP_TO_CONFIRM_STEP'
exporting
defaultoption = 'N'
textline1 = 'Se perderán los cambios no grabados.'
textline2 = '¿Está seguro que desea salir?'
titel = 'Salir'
importing
answer = vp_return.


Ejemplo 2:

* Le pregunta al usuario si realmente desea ejecutar el proceso
call function 'LC_POPUP_TO_CONFIRM_STEP'
exporting
textline1 = v_textline
textline2 = v_textline2
titel = 'Modificar liquidación'
importing
answer = v_answer
exceptions
others = 1.
-Copiar una tabla interna a otra?


TABLA1[] = TABLA[2]
-Insertar los datos de una tabla en otra que ya contiene datos


INSERT LINES OF ITAB1 INTO ITAB2.
-Que cambie el formato del cursor del mouse cuando pasa encima de un texto determinado.


write:/ 'Hola' hotspot on.


Hace que cuando el cursor pase encima de la palabra
'Hola', el cursor del mouse pasa a ser una MANO.
-Que cuando se imprimen valores con WRITE no deje espacios entre las distintas cadenas?


write:/ CADENA1 no-gap, CADENA2 no-gap , CADENA3 no-gap.

Imprime tres cadenas distintas sin dejar espacios entre ellas.
-Sacar los espacios en blanco a la izquierda de una cadena


condense CADENA.

quita los espacios a la izquierda.

Sino probar con

consende CADENA no-gaps.
-Mover una cadena un caracter a la derecha


por ejemplo:

CADENA = 'CRISTIAN'

shift CADENA right.


Imprimiría
' CRISTIAN'

(obviamente sin las comillas).


Si la cadena queda corta se trunca el caracter de más
a la derecha.
-Definir tipos de datos?


EJEMPLO1: DEFINIENDO UN TIPO

types: begin of person,
name(20) type c,
age type i,
end of person.

data: s_person type person occurs 0.

EJEMPLO2: DEFINIENDO MAS DE UN TIPO

types: begin of person,
name(20) type c,
age type i,
end of person,

begin of person2,
name(20) type c,
age type i,
end of person2.


data: s_person type person occurs 0.
data: s_person2 type person2 occurs 0.
-Convertir un caracter a TAB?


-Declarar una variable tipo hexa con el valor del TAB.

* Campo hexadecimal con el caracter 09 (punto y coma).
data: v_tab type x value '09'.

-Una forma de reemplazar el caracter es recorrer la cadena
y a medida que se van leyendo caracteres, ir pasandolos
a otra cadena, y cuando el caracter sea el que deseamos
reemplazar, pegar el TAB en vez de ese caracter en la
cadena que estamos armando.

Ejemplo:
concatenate v_salida
v_TAB
into v_salida.
-Hacer un marco alrededor de los campos de una pantalla de selección?


SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE TEXT-001.

PARAMETERS:
P_RYEOLD LIKE TF189-RYEAR, "Año Actual
P_PEROLD LIKE TF189-PERID. "Periodo Actual

SELECTION-SCREEN END OF BLOCK 1.
-Saber el idioma en el que se logeó el usuario?


usar SY_LANGU.

que devuelve en 2 caracteres el idioma actual.

Ejemplo: "ES", "EN".
-Que un parámetro de texto respete las mayúsculas y minúsculas?


campo1(100) type c lower case.

-Preguntar si un parámetro OPTATIVO de una función fue utilizado


RESPUESTA

The expression f IS REQUESTED is true if an actual parameter
was specified for the formal parameter f when the call was
made.


IF TEXT IS REQUESTED.
SELECT SINGLE * FROM ...
TEXT = ...
ENDIF.
-Limitar el ancho y cantidad de filas de un reporte?


PROGRAM zmrsd031
NO STANDARD PAGE HEADING
LINE-COUNT 65
LINE-SIZE 260.
-Declarar una tabla interna con el formato de una tabla sin tener que volver a definir campo por campo?


DATA: BEGIN OF T_BKPF occurs 0.
INCLUDE STRUCTURE BKPF.
DATA: END OF T_BKPF.
-Declarar una tabla interna con el formato de una tabla más otros campos que no pertenezcan a la tabla?


DATA: BEGIN OF T_BKPF OCCURS 0.
INCLUDE STRUCTURE BKPF.
DATA: campo1 type c,
campo(20) type c,
campo3 like bseg-mandt.
DATA: END OF T_BKPF.
-Un JOIN entre tablas?


tables: zfr001, zfr002.

data: begin of t1 occurs 0.
include structure zfr001.
data: xblnr like zfr002-xblnr.
data: end of t1.

select zfr001~z_liq zfr002~xblnr
into corresponding fields of table t1
from zfr001 join zfr002 on zfr001~bukrs = zfr002~bukrs
and zfr001~z_liq = zfr002~z_liq.
*up to 1 rows.


loop at t1.
write:/ t1-z_liq, t1-xblnr.
endloop.
-Saber la versión del cliente, sistema operativo, etc?


DATA: BEGIN OF DATOS.
INCLUDE STRUCTURE RFCSI.
DATA: END OF DATOS.

CALL FUNCTION 'RFC_SYSTEM_INFO' DESTINATION 'SAPGUI'
IMPORTING RFCSI_EXPORT = DATOS.

WRITE: / 'Sistema SAP .............:', DATOS-RFCSYSID,
/ 'Sistema operativo .......:', DATOS-RFCOPSYS,
/ 'VERSION SAPGUI ..........:', DATOS-RFCSAPRL.
-Desplegar un control para seleccionar el nombre de un archivo


DATA: MASK(20) TYPE C VALUE ',*.* ,*.*.'.

************************************************************************
* PARAMETERS *
************************************************************************

PARAMETERS: P_FILE LIKE RLGRAP-FILENAME OBLIGATORY. "Archivo de E/.

************************************************************************
* AT SELECTION-SCREEN *
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.

CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = SPACE
DEF_PATH = P_FILE
MASK = MASK
MODE = 'O'
TITLE = TEXT-016
IMPORTING
FILENAME = P_FILE
EXCEPTIONS
INV_WINSYS = 04
NO_BATCH = 08
SELECTION_CANCEL = 12
SELECTION_ERROR = 16.

IF SY-SUBRC EQ '04'.
MESSAGE I838(29).
ENDIF.


************************************************************************
* START-OF-SELECTION *
************************************************************************
START-OF-SELECTION.

WRITE: / 'Proceso Finalizado'.
-Cambiar la configuración de Usuario?
Cambiar la coma por punto?
Cambiar los valores prefijados para el usuario?


Ir a Sistema-Valores Prefijados-Datos propios
-Cambiar las comas y puntos de un número decimal?


DATA: V_IMPORTE TYPE P DECIMALS 2.
DATA: V_IMPORTE_CONV(20) TYPE C .

V_IMPORTE = '-99999999' / 7.

PERFORM F_FORMATEAR_IMPORTE USING
'.'
V_IMPORTE
CHANGING V_IMPORTE_CONV.

WRITE:/ 'v_importe : ', V_IMPORTE.
WRITE:/ 'v_importe_conv: ', V_IMPORTE_CONV.

*-----------------------------------------------------------------------
* FORM F_FORMATEAR_IMPORTE
*-----------------------------------------------------------------------
* Mueve el signo adelante del importe y setea el separador
* decimal solicitado.
*-----------------------------------------------------------------------
* INPUT:
* --> vp_separador_decimal : '.' punto
* ',' coma
*
* --> vp_importe_orig : nro. decimal.
* OUTPUT:
* <-- vp_importe_conv : cadena con el valor convertido
*-----------------------------------------------------------------------
FORM F_FORMATEAR_IMPORTE
USING
VP_SEPARADOR_DECIMAL
VP_IMPORTE_ORIG
CHANGING
VP_IMPORTE_CONV.

*-DATA DECLARATION------------------------------------------------------

DATA: V_IMPORTE_AUX(20) TYPE C.

*-MAIN PROCESSING SECTION-----------------------------------------------

* Inicializa variables.
CLEAR: V_IMPORTE_AUX,
VP_IMPORTE_CONV.

* Mueve el importe recibido a una cadena auxiliar.
WRITE VP_IMPORTE_ORIG TO V_IMPORTE_AUX.

* Se pasa el signo para adelante del importe.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
VALUE = V_IMPORTE_AUX
EXCEPTIONS
OTHERS = 1.

* Cuando se copia un nro a una cadena usando el write,
* queda siempre con el siguiente formato: NNN.NNN.NNN,DD.

* Cambia puntos por espacios. Ejemplo 9.888.777,01 --> 9 888 777,01.
TRANSLATE V_IMPORTE_AUX USING '. '.

* Quita los espacios en blanco. Ejemplo 9 888 777,01 --> 9888777,01.
CONDENSE V_IMPORTE_AUX NO-GAPS.

IF VP_SEPARADOR_DECIMAL = '.'.
* Cambia la coma decimal por punto decimal.
TRANSLATE V_IMPORTE_AUX USING ',.'.
ENDIF.

* Justifica el número a derecha.
* Ejemplo '9888777,01 ' --> ' 9888777,01'.
SHIFT V_IMPORTE_AUX RIGHT DELETING TRAILING SPACE.

* Devuelve el número.
VP_IMPORTE_CONV = V_IMPORTE_AUX.

ENDFORM. " F_FORMATEAR_IMPORTE
-Setear en forma dinámica la fecha en una variante, cuando se ejecuta con job.


Desde el programa, poner SAVE AS VARIANT.
Marcar el CheckBox VARIABLE para el campo tipo FECHA
Presionar Selection Variables
Marcar Dynamic Date Calculation
Elegir una VARIABLE NAME
Ejemplo: Current DATE
Presionar Grabar
Presionar Grabar (nuevamente)
- Para reemplazar la coma o punto decimal segun la configuracion del usuario...


PERFORM f_formateo_importe USING i_arch-total_costos
CHANGING i_arch-total_costos.
~~~~

FORM f_formateo_importe USING p_v_importe
CHANGING p_v_importe_formateado.

CLEAR usr01.

SELECT SINGLE * FROM usr01 WHERE bname EQ sy-uname.

IF sy-subrc EQ 0.

IF usr01-dcpfm EQ 'X'.
REPLACE ',' WITH '.' INTO p_v_importe.
ELSE.
REPLACE '.' WITH ',' INTO p_v_importe.
ENDIF.

MOVE p_v_importe TO p_v_importe_formateado.

ENDIF.

ENDFORM. " F_FORMATEO_IMPORTE
- Para guardar una tabla interna en un archivo en unix.


data: v_file LIKE rlgrap-filename.

v_file tiene el path y nombre de archivo de unix.

OPEN DATASET v_file FOR OUTPUT IN TEXT MODE.
LOOP i_tab.
TRANSFER i_tab TO v_file.
ENDLOOP.
CLOSE DATASET v_file.
- Para abrir la ventana para navegar por el disco rigido para levantar un archivo
como parametro de entrada


SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE text-001.
PARAMETERS: p_arch LIKE rlgrap-filename .
SELECTION-SCREEN END OF BLOCK sel.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_arch.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
CHANGING
file_name = p_arch.
Cosas varias de Abap