Dal 12.200 persone hanno guardato a questa domanda e non ha ottenuto una risposta:
DFSORT e SyncSort sono Mainframe predominante di smistamento dei prodotti. Le loro carte di controllo hanno molte somiglianze e alcune differenze.
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A)
JOINKEYS FILE=F2,FIELDS=(key2startpos,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200)
SORT FIELDS=COPY
Un "JOINKEYS" è composto da tre attività. Sub-Task 1 è il primo JOINKEYS. Sub-Task 2 è il secondo JOINKEYS. Segue l'attività principale ed è dove vengono elaborati i dati uniti. Nell'esempio sopra riportato è una semplice operazione di COPIA. I dati uniti verranno semplicemente scritti su SORTOUT.
La dichiarazione JOIN definisce che oltre ai record corrispondenti, i record F1 e F2 NON ANNULLATI devono essere presentati all'attività principale.
L'istruzione REFORMAT definisce il record che verrà presentato all'attività principale.Un esempio più efficiente, immaginando che tre campi sono obbligatori F2, è:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100)
Ciascuno dei campi F2 viene definito con una posizione di partenza ed una lunghezza.
Il record che viene quindi elaborato dall'attività principale è lungo 5311 byte e i campi da F2 possono essere referenziati da 5201,10,5211,1,5212,100 con il record F1 di 1,5200.
Un modo migliore per ottenere lo stesso risultato è ridurre la dimensione di F2 con JNF2CNTL.
//JNF2CNTL DD *
INREC BUILD=(207,1,10,30,1,5100,100)
Alcuni impianti di SyncSort non supportano JNF2CNTL, e anche se supportato (da Syncsort MFX per z/OS rilascio 1.4.1.0 in poi), ma non è documentata da SyncSort. Per gli utenti di 1.3.2 o 1.4.0 è disponibile un aggiornamento da SyncSort per fornire il supporto JNFnCNTL.
Va notato che JOINKEYS di default ORDINA i dati, con l'opzione UGUALI. Se i dati per un file JOINKEYS sono già in sequenza, è necessario specificare SORTED. Per DFSORT NOSEQCHK può anche essere specificato se non è richiesto il controllo delle sequenze.
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK
Anche se la richiesta è strano, come il file di origine non sarà in grado di determinare, tutti i record non corrispondenti sono di andare in un file di output separato.
Con DFSORT, è presente un indicatore di corrispondenza, specificato con? nel REFORMAT:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?)
Ciò aumenta la lunghezza del record REFORMAT di un byte. Il ? può essere specificato ovunque sul record REFORMAT e non è necessario specificarlo. Il ? è risolto da DFSORT a: B, i dati provenienti da entrambi i file; 1, record senza paragoni da F1; 2, record senza paragoni da F2.
SyncSort non ha l'indicatore di corrispondenza. L'assenza o la presenza di dati nel record REFORMAT deve essere determinata in base ai valori. Scegli un byte su entrambi i record di input che non possono contenere un valore particolare (ad esempio, all'interno di un numero, decidi su un valore non numerico). Quindi specificare quel valore come carattere FILL sul REFORMAT.
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$'
Se posizione 1 in F1 non può avere naturalmente "$" e la posizione 20 sulla F2 non possono neanche, allora quei due posizioni possono essere utilizzati per determinare il risultato della partita. L'intero record può essere testato se necessario, ma aumenta il tempo di CPU.
Il requisito evidente è che tutti i record non corrispondenti, da F1 o F2, vengano scritti in un file. Ciò richiederà una dichiarazione REFORMAT che comprende entrambi i record nella loro interezza:
DFSORT, uscita record non corrispondenti:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
Syncsort, uscita record non corrispondenti:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
La codifica per SyncSort sarà anche lavorare con DFSORT.
Per ottenere i record corrispondenti scritti è facile.
OUTFIL FNAMES=MATCH,SAVE
SAVE assicura che tutti i record non scritti da un altro OUTFIL verranno scritti qui.
È necessaria una riformattazione per emettere principalmente dati da F1, ma per selezionare alcuni campi da F2. Questo funziona sia per DFSORT o SyncSort:
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
Il tutto, con partenze arbitrarie e lunghezze è:
DFSORT
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
SyncSort
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
non è necessario due passi. Non serve ICETOOL. SORT con JOINKEYS lo farà. Da quanto descritto, comunque. –