@echo off TITLE Quick copy from all As400 source file members into namesake directory and into rebuilding stream cd \ echo ALLMBR.bat echo Quick copy from all As400 source file members echo into namesake directory and into rebuilding stream. echo . echo Copia veloce da tutti i membri di un file sorgente As400 echo in un indirizzario PC omonimo del file echo e in una stringa //BATCH di ricostruzione del file echo da eseguire su un altro As400. echo . echo Claudio Neroni 21-01-2015 Creato. echo . rem <...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....> echo ATTENZIONE: l'estensione del presente file DEVE ESSERE ".bat". echo Si crea un file vuoto con nome uguale al file source As400 echo che si vuole copiare su PC e con estensione uguale al nome echo della libreria contenente il file source As400. echo Il nome del file PC di tipo txt ricevente il contenuto del file sorgente echo viene acquisito nel primo parametro di chiamata %%1 tramite trascinamento. echo Si ottiene un indirizzario radicato come il file trascinato echo e omonimo dello stesso con l'aggiunta del prefisso "A-". echo Il contenuto del file trascinato viene inoltre sostituito echo con un flusso Control Language che, portato su un altro As400 echo in un membro source con lunghezza record 112 ed eseguito echo con un SBMDBJOB (Submit Database Job), ricostruisce un doppione echo del file originale sul nuovo As400. echo . echo I parametri di accesso all'As400 echo "ASSYSTEM", "MYUSER" e "MYPASSWORD" echo si possono cablare per chiarezza e semplicita' echo ma per impostarli e' consigliabile fare uso di un altro ".bat" echo (ad esempio ACCESSO400.bat), contenente le specifiche di settaggio. echo . set msg=Perche' funzioni, occorre trascinare il file scatenante sul presente bat! @if .%1==. @echo ERRORE! && @echo %msg% && @pause && GOTO ENDPGM rem Annota Parametri utente. rem set assystem=ASSYSTEM rem set myuser=MYUSER rem set mypassword=MYPASSWORD rem Chiama batch alternativo alle precedenti specifiche di settaggio. call J:\ACCESSO400.bat rem Imposta l'indirizzario di lavoro. set work=WORK rem Imposta un nome di lavoro. Non esistano file con queste iniziali nella libreria del file da elaborare. set workname=ALLMBR rem Imposta un prefisso per l'indirizzario di destinazione. set prefix=A- rem Accantona il nome completo del file di trascinamento per poterlo poi usare come file di flusso da riempire. set stream=%1 rem Compone le variabile per riempire il file di flusso. set streamrpl=^>%stream% set streamadd=^>^>%stream% rem Crea l'indirizzario di lavoro sul disco di lavoro. mkdir C:\%WORK% rem Ricava in filename il nome del file senza percorso e senza estensione. set filename=%~n1 rem Ricava in filedrive il drive del file trascinato. set filedrive=%~d1 rem Ricava in filepath l'indirizzario del file trascinato. set filepath=%~p1 rem Toglie i caratteri di testa e di coda (barre). set filepath=%filepath:~1,-1% rem Ricava in fileextension l'estensione del file trascinato. set fileextension=%~x1 rem Toglie il carattere di testa (il punto). set fileextension=%fileextension:~1,100% rem Crea un indirizzario col nome del file trascinato, prefissato per non creare omonimie. set mbrdir=%filedrive%\%filepath%\%prefix%%filename%.%fileextension% mkdir %mbrdir% rem Compone i nomi dei work file che conterranno le istruzioni ftp da eseguire. set workftp1=C:\%WORK%\%workname%1.ftp set workftp2=C:\%WORK%\%workname%2.ftp rem Compone il nome del work file che conterra' le istruzioni sql da eseguire. set worksql=C:\%WORK%\%workname%.sql rem Compone il nome del work file di ritorno con l'elenco membri. set worktxt1=C:\%WORK%\%workname%1.txt rem Compone il nome del work file di ritorno con il testo del file. set worktxt2=C:\%WORK%\%workname%2.txt rem Compone il nome del file batch per il trattamento del none del file. set workbat1=C:\%WORK%\%workname%1.bat rem Compone il nome del file batch per il trattamento dell'elenco membri. set workbat2=C:\%WORK%\%workname%2.bat rem set rem pause debug1 rem BEG Scrive le istruzioni da eseguire con sql. rem <...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....> echo DROP TABLE %fileextension%/%workname%2;>%WORKSQL% echo CREATE TABLE %fileextension%/%workname%2 AS>>%WORKSQL% echo (SELECT MLFILE, MLLIB, MLNAME, MLSEU2, MLMTXT, MLRCEN>>%WORKSQL% echo FROM %fileextension%/%workname%1)>>%WORKSQL% echo WITH DATA;>>%WORKSQL% echo DROP TABLE %fileextension%/%workname%9;>>%WORKSQL% echo CREATE TABLE %fileextension%/%workname%9 AS>>%WORKSQL% echo (SELECT ATTXT, ATRCEN>>%WORKSQL% echo FROM %fileextension%/%workname%8)>>%WORKSQL% echo WITH DATA;>>%WORKSQL% rem END Scrive le istruzioni da eseguire con sql. rem echo on rem BEG Scrive le istruzioni nel file batch di trattamento dell'unico record col testo del file. echo set as=%%1>%WORKBAT1% echo set ftx=%%as:~01,50%%>>%WORKBAT1% echo set ftx=%%ftx:~0,50%%>>%WORKBAT1% echo echo ft--"%%ftx%%">>%WORKBAT1% rem echo pause debug2>>%WORKBAT1% rem END Scrive le istruzioni nel file batch di trattamento dell'unico record col testo del file. rem BEG Scrive le istruzioni nel file batch di trattamento di ogni membro. echo @set as=%%1>%WORKBAT2% echo @set fil=%%as:~01,10%%>>%WORKBAT2% echo @set fil=%%fil:~0,10%%>>%WORKBAT2% echo @set lib=%%as:~11,10%%>>%WORKBAT2% echo @set lib=%%lib:~0,10%%>>%WORKBAT2% echo @set mbr=%%as:~21,10%%>>%WORKBAT2% echo @set mbr=%%mbr:~0,10%%>>%WORKBAT2% echo CALL :TRIM %%mbr%% mbr>>%WORKBAT2% echo @set seu=%%as:~31,10%%>>%WORKBAT2% echo @set seu=%%seu:~0,10%%>>%WORKBAT2% echo @set txt=%%as:~41,50%%>>%WORKBAT2% echo @set txt=%%txt:~0,50%%>>%WORKBAT2% echo @echo --"%%fil%%">>%WORKBAT2% echo @echo -"%%lib%%">>%WORKBAT2% echo @echo -"%%mbr%%">>%WORKBAT2% echo @echo -"%%seu%%">>%WORKBAT2% echo @echo -"%%txt%%">>%WORKBAT2% echo @echo /* Copia il sorgente dalla stringa al membro del file sorgente. */%%streamadd%%>>%WORKBAT2% echo @echo CPYF FROMFILE(%%mbr%%) TOFILE((%%lib%%)/%%fil%%) + %%streamadd%%>>%WORKBAT2% echo @echo TOMBR(%%mbr%%) MBROPT(*REPLACE) SRCOPT(*SEQNBR) %%streamadd%%>>%WORKBAT2% echo @echo /* Modifica testo e tipo seu del sorgente caricato. */%%streamadd%%>>%WORKBAT2% echo @echo CHGPFM FILE((%%lib%%)/%%fil%%) MBR(%%mbr%%) + %%streamadd%%>>%WORKBAT2% echo @echo SRCTYPE(%%seu%%) + %%streamadd%%>>%WORKBAT2% echo @echo TEXT('%%txt%%') %%streamadd%%>>%WORKBAT2% echo @echo /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/%%streamadd%%>>%WORKBAT2% echo @echo //DATA FILE(%%mbr%%) FILETYPE(*SRC) ENDCHAR('//ENDSRC') %%streamadd%%>>%WORKBAT2% echo rem echo on >>%WORKBAT2% echo copy /A /Y %stream%+%mbrdir%\%%mbr%%.mbr %stream% >>%WORKBAT2% echo @echo //ENDSRC %%streamadd%%>>%WORKBAT2% echo @echo /*---------------------------------------------------------------------*/%%streamadd%%>>%WORKBAT2% echo GOTO :ENDPGM>>%WORKBAT2% echo :TRIM>>%WORKBAT2% echo SET %%2=%%1>>%WORKBAT2% echo :ENDPGM>>%WORKBAT2% rem echo pause debug3>>%WORKBAT2% rem END Scrive le istruzioni nel file batch di trattamento di ogni membro. rem BEG Scrive le istruzioni da eseguire con primo ftp. rem Utente. echo %myuser%>%WORKFTP1% rem Password. echo %mypassword%>>%WORKFTP1% rem Elenca membri. echo quote rcmd DSPFD FILE(%fileextension%/%filename%) TYPE(*MBRLIST) OUTPUT(*OUTFILE) FILEATR(*PF) OUTFILE(%fileextension%/%workname%1)>>%WORKFTP1% rem Elenca file. echo quote rcmd DSPFD FILE(%fileextension%/%filename%) TYPE(*BASATR) OUTPUT(*OUTFILE) FILEATR(*PF) OUTFILE(%fileextension%/%workname%8)>>%WORKFTP1% rem Crea appoggio per sql. echo quote rcmd CRTSRCPF FILE(%fileextension%/%workname%0) MBR(*FILE)>>%WORKFTP1% rem Copia da file PC a membro sorgente As400. echo put %WORKSQL% /qsys.lib/%fileextension%.lib/%workname%0.file/%workname%0.mbr>>%WORKFTP1% rem Eseque sql. echo quote rcmd RUNSQLSTM SRCFILE(%fileextension%/%workname%0) SRCMBR(%workname%0) COMMIT(*NONE) ERRLVL(20)>>%WORKFTP1% rem Copia elenco membri da output di sql su As400 a file PC. echo get /qsys.lib/%fileextension%.lib/%workname%9.file/%workname%9.mbr %WORKTXT1%>>%WORKFTP1% rem Copia testo file da output di sql su As400 a file PC. echo get /qsys.lib/%fileextension%.lib/%workname%2.file/%workname%2.mbr %WORKTXT2%>>%WORKFTP1% rem Abbandona ftp. echo quit>>%WORKFTP1% rem END Scrive le istruzioni da eseguire con primo ftp. rem Documenta le variabili per controllo. rem set rem Chiama primo ftp per eseguire le istruzioni scritte nel primo file ftp. ftp -s:%WORKFTP1% %assystem% rem BEG Scrive le istruzioni da eseguire con secondo ftp. rem Utente. echo %myuser%>%WORKFTP2% rem Password. echo %mypassword%>>%WORKFTP2% rem Imposta indirizzario datore. echo cd /qsys.lib/%fileextension%.lib>>%WORKFTP2% rem Imposta indirizzario ricevente. echo lcd %mbrdir%>>%WORKFTP2% rem Ammazza domande di mget. echo prompt>>%WORKFTP2% rem Copia tutti i membri sorgenti dal file As400 a file PC. echo mget %filename%.file>>%WORKFTP2% rem Abbandona ftp. echo quit>>%WORKFTP2% rem END Scrive le istruzioni da eseguire con secondo ftp. rem Chiama secondo ftp per eseguire le istruzioni scritte nel secondo file ftp. ftp -s:%WORKFTP2% %assystem% rem Percorre l'elenco file trascritto sul pc dal primo ftp e sull'unico record estrae il testo del file. FOR /F "tokens=*" %%a in (%WORKTXT1%) do call %WORKBAT1% "%%a " rem set rem pause debug4 rem Scrive intestazione nel file di flusso. @echo //BCHJOB JOB(%filename%) JOBD(%fileextension%/%fileextension%) + %streamrpl% @echo OUTQ(QPRINT) ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) %streamadd% @echo /* Prima di eseguire il presente flusso */%streamadd% @echo /* con un SMBDBJOB (Submit Database Job), */%streamadd% @echo /* 1) correggi la job description da usare nel //BCHJOB; */%streamadd% @echo /* 2) correggi il nome "%fileextension%" della libreria di destinazione */%streamadd% @echo /* del file source con il nome della libreria desiderata. */%streamadd% @echo /* Nome del flusso sul PC: "%stream%" */ %streamadd% @echo /* Crea la libreria. */%streamadd% @echo MKDIR DIR('/qsys.lib/%fileextension%.lib') %streamadd% @echo CHGLIB LIB(%fileextension%) TEXT('Utility di Claudio Neroni') %streamadd% @echo /* Imposta la lista librerie. */%streamadd% @echo CHGLIBL LIBL(QTEMP %fileextension% QGPL) %streamadd% @echo /* Crea il file sorgente. */%streamadd% @echo DLTF FILE(%fileextension%/%filename%) %streamadd% @echo CRTSRCPF FILE(%fileextension%/%filename%) RCDLEN(112) + %streamadd% @echo TEXT('%ftx%') %streamadd% rem Percorre l'elenco membri trascritto sul pc dal primo ftp e su ciascuno esegue il bat predisposto. rem @echo off FOR /F "tokens=*" %%a in (%WORKTXT2%) do call %WORKBAT2% "%%a " rem @echo on rem Chiude il flusso. @echo //ENDBCHJOB%streamadd% pause Si ferma per permettere l'esame del log prima che si chiuda la finestra comandi. rem Cancella transiti. del %WORKFTP1% del %WORKFTP2% del %WORKSQL% del %WORKTXT1% del %WORKTXT2% del %WORKBAT1% del %WORKBAT2% rem CALL :TRIM %NAME% NAME rem GOTO :ENDPGM rem :TRIM rem SET %2=%1 :ENDPGM