2005 May 24 9:02 AM
Hi all.
I have a problem i hope someone can help me with.
I am reading a flatfile from a server-library. After the file has been read and the information have been processed, it has to be moved to a backup folder. This is the code im using:
CONCATENATE p_dirnam '' file_list-name INTO l_fil1.
CONCATENATE p_dirnam '' c_arkivdir
file_list-name INTO l_fil2.
OPEN DATASET l_fil1 FOR INPUT IN TEXT MODE.
IF sy-subrc = 0. "should always be OK
OPEN DATASET l_fil2 FOR OUTPUT IN TEXT MODE.
IF sy-subrc = 0.
DO.
READ DATASET l_fil1 INTO l_rec.
IF sy-subrc NE 0.
EXIT.
ENDIF.
TRANSFER l_rec TO l_fil2.
ENDDO.
CLOSE DATASET l_fil2.
CLOSE DATASET l_fil1.
* Slet input-fil
DELETE DATASET l_fil1.
Now the problem is that the file is and has to be read only, and this apparently interferes with the copying. What can i do, is there another way of copying a flatfile i can use??
Regards
Liselotte
2005 May 24 9:20 AM
Hi Liselotte,
if it's read-only, then deleting is prohibited. This is also end of 'MOVE', because move is build with copy and delete (from authority point of view).
Either you get more rights, or you just can copy.
Regards,
Christian
2005 May 24 9:41 AM
2005 May 24 9:42 AM
Hi Liselotte,
you may want to try a "move" OS-command (like "mv" in Unix, or "ren" in VMS), instead of programming the write-and-delete by yourself in ABAP.
In order to do so, you may use
CALL 'SYSTEM'
ID 'COMMAND' FIELD l_command
ID 'TAB' FIELD lt_outp-*sys*.
Best regards,
Alvaro
2005 May 25 7:53 AM
Hi Alvaro.
The approach you have suggested, can i use that even if the file is read-only? If yes can you elaborate on how to use it
Regards
Liselotte
2005 May 25 8:16 AM
Hi Liselotte,
I'm using Unix as OS for my application server. Here, the command for moving/renaming files is "mv".
If this is your case, you should use something like this:
DATA: l_path_name1(150) TYPE c.
DATA: l_path_name2(150) TYPE c.
DATA: l_command(1000) TYPE c.
DATA: BEGIN OF lt_outp OCCURS 0,
line(255) TYPE c,
END OF lt_outp.
CLEAR: lt_outp.
REFRESH: lt_outp.
*** here you should populate the complete paths of the
*** source and the target files
CONCATENATE 'mv' l_path_name1 l_path_name2
INTO l_command SEPARATED BY space.
CALL 'SYSTEM'
ID 'COMMAND' FIELD l_command
ID 'TAB' FIELD lt_outp-*sys*.
IF NOT lt_outp[] IS INITIAL.
*** then there's been an error in the command
LOOP AT lt_outp.
*** error processing
ENDLOOP.
ENDIF.
If you were using (for example) Windows NT as application server, you should replace "mv" by "ren" at your command definition.
I hope it helps. BR,
Alvaro
2005 May 26 8:28 AM
Hi Alvaro.
I tried to use the code you suggested, but nothing happens, what am i doing wrong?
Here is my code:
CLEAR: lt_outp.
REFRESH: lt_outp.
CONCATENATE 'ren' g_file1 g_file2 INTO l_command SEPARATED BY
space.
CALL 'SYSTEM'
ID 'COMMAND' FIELD l_command
ID 'TAB' FIELD lt_outp-*sys*.
IF NOT lt_outp[] IS INITIAL.
LOOP AT lt_outp.
WRITE:/ lt_outp-line.
ENDLOOP.
ENDIF.
Many thanks
Liselotte
2005 May 26 8:33 AM
Hi Liselotte,
what's the operating system of your application server? (watch it! NOT your presentation server)
Alvaro
2005 May 26 8:40 AM
Hi Alvaro.
I am not sure, but i have tried using both 'mv' and 'ren'.
Thanks
Liselotte
2005 May 26 8:55 AM
Hi Liselotte,
don't spend your time on several coding solutions - you are facing a authority problem (which you can only solve by coding, when you use operation system bugs).
When your file is read-only, then no matter if you try operation system or sap system commands - you can't delete or move it. That's the fact. If it's required to move this file after processing, then you need more rights to access this file - it's simply that.
Regards,
Christian