HP OpenVMS Systems

ask the wizard
Content starts here

DCL error handling, COPY errors?

» close window

The Question is:

 
I am doing a copy using a pattern match with a /exclude switch and a single
 destination file.
A file that fits the exclude pattern is locked and generates a copy-e-openin
 error which triggers our error handling.
 
We want to keep the error handling intact in case any of our target files are
 locked or have another problem. Why does the Copy command care if an excluded
 file is locked? More to the point how can I stop it causing the copy to be
 reported as an error (ev
en though the copy actually successfully completes).
 
 


The Answer is :

  DCL file selection and exclusion is fairly complex as it can involve the
  file name, any of the dates and/or the owner. The code is common to a large
  number of DCL commands.
 
  DCL first OPENs the file in case it needs to test any of the information
  in the header. Granted, in your specific case, this is not necessary, but
  nevertheless, this is how it is implemented. There are obviously other
  possible implementations which may behave better in some circumstances,
  but there are significant benefits in commonality and generality.
 
  The status of a DCL command is returned as a single longword. By convention,
  this is the "worst" condition that was encountered by the command or utility.
  In your case the -RMS-E-FLK condition obscures the %COPY-S-COPIED conditions.
 
  There are a any number of ways you could deal with this. For example, if
  your objective is to ensure that SOME files were created you could use the
  PIPE and SEARCH commands to verify some successes. For example:
 
	$ PIPE COPY/LOG 'source'/EXCLUDE='exclude' 'target' | -
		SEARCH SYS$PIPE "$COPY-S-COPIED" ; -
		DEFINE/JOB/NOLOG STATUS &$STATUS
 
  Another possibility is to use the DIRECTORY command to select the files
  and pipe the output into a DCL loop that performs the COPY. For example:
 
$ !
$ ! P1=input filespec
$ ! P2=exclude filespec
$ ! P3=output filespec
$ ! P4=flag (internal use)
$ !
$ SET NOON
$ IF P4.NES."" THEN GOTO 'P4'
$ self=F$ENVIRONMENT("PROCEDURE")
$ PIPE DIRECTORY/NOHEAD/NOTRAIL/COLUMN=1 'p1'/EXCLUDE='p2' | -
        @'self' "''p1'" "''p2'" "''p3'" "DOCOPY"
$ EXIT
$ DOCOPY:
$   READ/END=Finish SYS$PIPE file
$   COPY/LOG 'file' 'p3'
$ GOTO DOCOPY
$ Finish: EXIT
 
  Provision of error detection/accumulation is left as an exercise.

answer written or last revised on ( 20-JUN-2001 )

» close window