PDA

Ver la Versión Completa : Como NO sobreescribir un fichero


nachosds
08/01/08, 11:13:19
Muy buenas!

Me gustaria saber si hay alguna orden para abrir in fichero en modo escritura pero de manera que no sobreescriba lo que habia ya antes.

Esque, al poner el siguiente codigo, primero lo que hago es leer un fochero ya existente y cargar sus datos en los registros, y luego escribo en otro fichero. Pues bien, si ejecuto el programa 2 veces y cambio los datos del fichero de lectura (fic), luego al pasarlo al fichero de salida (fic2), éstos se me machacan.
¿Habria alguna forma de hacerlo para que no sobreescriba?

El codigo en cuestion es este:


REPORT Z_PFICHERO.

****************************
* creamos variables *
****************************
DATA: BEGIN OF REC,
valor1(5) TYPE c,
valor2(4) TYPE c,
END OF REC.

****************************
* abrimos fichero *
* leemos y rellenamos REG *
****************************
OPEN DATASET 'd:/fic.txt'.

READ DATASET 'd:/fic.txt' INTO REC.
IF SY-SUBRC = 8.
WRITE:/ 'vamonos'.
EXIT.
ENDIF.
WRITE:/ REC-valor1,REC-valor2.
CLOSE DATASET 'd:/fic.txt'.


****************************
* creamos fic2 salida *
****************************
OPEN DATASET 'd:/fic2.txt'
FOR OUTPUT
IN TEXT MODE.
****************************
* escribimos los valores *
* de REG en el nuevo fic2 *
****************************
TRANSFER REC TO 'd:/fic2.txt'.

CLOSE DATASET 'd:/fic2.txt'.

robert_milan
08/01/08, 11:23:38
Muy buenas!

Me gustaria saber si hay alguna orden para abrir in fichero en modo escritura pero de manera que no sobreescriba lo que habia ya antes.

Esque, al poner el siguiente codigo, primero lo que hago es leer un fochero ya existente y cargar sus datos en los registros, y luego escribo en otro fichero. Pues bien, si ejecuto el programa 2 veces y cambio los datos del fichero de lectura (fic), luego al pasarlo al fichero de salida (fic2), éstos se me machacan.
¿Habria alguna forma de hacerlo para que no sobreescriba?

El codigo en cuestion es este:


REPORT Z_PFICHERO.

****************************
* creamos variables *
****************************
DATA: BEGIN OF REC,
valor1(5) TYPE c,
valor2(4) TYPE c,
END OF REC.

****************************
* abrimos fichero *
* leemos y rellenamos REG *
****************************
OPEN DATASET 'd:/fic.txt'.

READ DATASET 'd:/fic.txt' INTO REC.
IF SY-SUBRC = 8.
WRITE:/ 'vamonos'.
EXIT.
ENDIF.
WRITE:/ REC-valor1,REC-valor2.
CLOSE DATASET 'd:/fic.txt'.


****************************
* creamos fic2 salida *
****************************
OPEN DATASET 'd:/fic2.txt'
FOR OUTPUT
IN TEXT MODE.
****************************
* escribimos los valores *
* de REG en el nuevo fic2 *
****************************
TRANSFER REC TO 'd:/fic2.txt'.

CLOSE DATASET 'd:/fic2.txt'.
por que no creas el fichero 2 variable y le agregas la fecha y hora para que distingas los ficheros.

lo puedes hacer con la instruccion concatenate.

Saludos y espero te sirva.

nachosds
08/01/08, 11:24:32
Perdon por el sangrado de los asteriscos, pero no se como hacerlo bien...:p

robert_milan
08/01/08, 11:29:08
facil:
var1 (15) type c,
var2 (15) type c.

concatenate 'd:\fic2\' sy-date sy-uzeit '.txt into var1

y en la instruccion OPEN DATASET VAR1

TRANSFER REC TO var1

CLOSE DATASET var1

asi todo lo enviaras a un fichero fic2con fecha de procesamiento y hora de procesamiento por lo que nunca se sobreescribira.

Mauricio Hidalgo
08/01/08, 11:43:04
Si quieres agregar datos aun fichero sin perder lo que ya existe. Tienes que abrir el archivo con APPENDING.

OPEN DATASET <dsn> FOR APPENDING.....

nachosds
08/01/08, 13:15:20
Si quieres agregar datos aun fichero sin perder lo que ya existe. Tienes que abrir el archivo con APPENDING.

OPEN DATASET <dsn> FOR APPENDING.....
Muchas gracias, eso del apending funciona perfecto!

Otra preguntita...

¿Se podria hacer un menu para pedir datos por teclado, realice una accion y que vuelva al menu?

Por ejemplo:

Menu:
1)Suma
2)Resta

Introduzca opcion: __

Bego86
08/01/08, 13:59:17
hola alguien tiene ejercicios propuestos para poder practicar????

GRACIAS :D

Mauricio Hidalgo
08/01/08, 14:03:28
Eso Lo Puedes Hacer Con Una Pantalla De Seleccion...seria Algo Así Como

Program Ztest3.

Parameters Suma Type C Radiobutton Group Radi.
Parameters Resta Type C Radiobutton Group Radi.

Start-of-selection.
If Suma = 'x'.
Perform Suma.
Endif.

If Resta = 'x'.
Perform Resta.
Endif.

*---------------------------
* R U T I N A S
*---------------------------

Form Suma.
Endform.

Form Resta.
Endform.

nachosds
08/01/08, 14:24:46
OK, pero lo malo que esto solo lo pide una vez... ¿Como se haria para que cuando terminara, te lo volviera a pedir?

Gracias!

Bego86
08/01/08, 14:31:50
Mira intento obtener datos por teclado pero me gustaria q me preguntara mas de una vez.

yo por ejemplo pido dos numeros con
PARAMETERS y realizo una operacion pero quiero q me vuelva a pedir de nuevo otros numeros distintos para hacer otra sucesivamente hasta alguna condicion.

GRACIAS ;)

robert_milan
08/01/08, 16:24:11
Acuerdate que abap es orientado a eventos, necesitas un evento para poder salirte de la impresion y regresar a la selection screen.

es mas facil que lo hagas por medio de un programa GUI O Modulpool

Dhdez
23/10/20, 08:25:54
Hola, pues depende de lo que quieras hacer. Si no quieres salir de la pantalla , dándole solo a enter, una solución sería:

Parameters: P_uno type i,
p_dos type i,
p_result type i.

at SELECTION-SCREEN OUTPUT.

p_result = p_dos + P_uno.

if p_result = 20.
MESSAGE 'Resultado correcto' Type 'I'.
ENDIF.

Si por el contrario quieres ejecutar el programa podría volver a llamar al programa:

PARAMETERS: p_uno TYPE i,
p_dos TYPE i,
p_result TYPE i.


END-OF-SELECTION.
p_result = p_dos + p_uno.

IF p_result NE 10.

SUBMIT zmispruebas with p_uno EQ p_uno
with p_dos EQ p_dos
with p_result EQ p_result
VIA SELECTION-SCREEN.
ELSE.

WRITE ' Resultado correcto'.

ENDIF.

Espero haberte ayudado