* copyright (C) 1984-2019 merrill consultants dallas texas usa



Yüklə 28,67 Mb.
səhifə148/383
tarix17.01.2019
ölçüsü28,67 Mb.
#98988
1   ...   144   145   146   147   148   149   150   151   ...   383

it's size, but that turns out fortunate, as the default

sort order defined in MACRO _BDB2ACC in VMACDB2:

SYSTEM QWHSSSID QWHCPLAN QWHCAID QWHSLOCN QWHCCV

QLACLOCN QWHCCN QWACBSC QWHSSTCK,

is just fine for duplicate removal, so it's not "wrong",

but it is NOT the correct order to group all DB2ACCT obs

into their "ACE Group". Instead, the new report uses

uses this sort order (MACRO _XDB2ACC):

SYSTEM QWHSSSID QWHSLOCN QLACLOCN QWHCCV QWHCCN ACE

QWACBSC QWHSSTCK QWHCPLAN QWHCAID

that does correctly sort DB2ACCT into each "ACE Group".


This iteration defines old-style MACROs _Q, _X, _Y, _X

which are used by the MACRO _RDB2ACC that you execute:

// EXEC MXGSASV9

//PDB DD DSN=YOUR.DB2ACCT.PDB,DISP=SHR

//SYSIN DD *

%INCLUDE SOURCLIB(VMACDB2);

_RDB2ACC

This report was used for diagnostic understanding of the

events in DB2 Parallel, and thus is not likely to be used

by many MXG users, but it's there if needed. Also, the

structure of selecting all of a group that has one of

something (DB2 Parallel Transaction, in this case) could

easily be extended to select by some other criteria.
Change 25.168 Using %ANALDB2R(PDB=PDB,PMSTA02=YES); caused VMXGSUM to

VMXGSUM fail with ERROR: VARIABLE STRTTIME NOT FOUND. In this

Aug 17, 2007 one place in ANALDB2R, VMXGSUM was invoked with variable

STRTTIME used in the INCODE's internal DATA/PROC steps,

and it was in the KEEPIN= list, but STRTTIME was NOT in

any of the VMXGSUM output parameters. Now, variables in

the KEEPIN= list are added to the generated KEEP list to

protect for this unique VMXGSUM invocation.

The problem was introduced in MXG 25.04 VMXGSUM changes.

Thanks to Richard Haynes, Blue Cross Blue Shield of Kansas, USA.


Change 25.167 Variable FCUSERID='LOGIN*USER ID*OR NAME' is INPUT and

VMAC119 kept in the TYP11903 dataset.

Aug 16, 2007

Thanks to Jim Kovarik, Aegon, USA.


Change 25.166 Trending example for DB2ACCTP dataset.

TRNDDB2P


Aug 16, 2007

Thanks to Chuck Hopf, Bank of America, USA.


Change 25.165 The IMF FB Program Record is updated with new variables:

VMACCIMS PGMSAD56='SADFLAG5*AND*SADFLAG6'

Aug 14, 2007 FLGSPCHR='PROGRAM*SUBTYPE'

The $MGIMFCS format decodes FLGSPCHR, which is OUTPUT

in both CIMSTRAN and CIMSPROG, but only the first

three values of J, K, or O exist in CICSPROG:

VALUE $MGIMFCS

'O'='O:ODBA'

'J'='J:JMP'

'K'='K:JBP'

'Q'='Q:PSEUDO WFI'

'W'='W:WFI(WAIT FOR INPUT)'

;

SAPEXIT ='SAP*PGM*USING*SAPEXIT?'



OTMATRAN='OTMA*TRAN?'

The offset to SRVCLASS was also corrected.

Thanks to Doug Johnson, Blue Cross Blue Shield of Kansas, USA.
Change 25.164 The _VNDMRJ macro token was missing in the _WNDMRJ part

VMACNDM of the _VARNDM macro definition, so the NDMRJ datasets

Aug 14, 2007 kept ALL MXG VARIABLES IN THE DATA STEP, 7062 variables

to be exact, when NDM code was added to BUILDPDB in ITRM

tests!

Thanks to Chris Weston, SAS Institute, USA.


Change 25.163 Support for Capacity Group analysis. z/OS 1.8 added the

VMAC7072 SMF70GNM='CAPACITY GROUP NAME'

VMXG70PR SMF70GMU='MAXIMUM LICENSE UNITS OF GROUP;

VMXGINIT variables, but Change 24.092 output them in TYPE70, when

Aug 20, 2007 they should have been output in PDB.TYPE70PR dataset, as

they are LPAR-level capacity limits.

-ASUM70PR now creates two new Group Capacity datasets

PDB.ASUM70GC - CEC Totals for each Capacity Group

PDB.ASUM70GL - LPAR Detail within each Capacity Group

Dataset ASUM70GL matches the RMF Group Capacity Report,

while dataset SUM70GC provides the total MSU usage for

each Group, and the percent of Group capacity limit used.

Both new datasets are created with fixed INTERVAL=HOUR,

to match SMF70GMU capacity units of MSU per hour.

Thanks to Jim Dammeyer, State Farm Insurance, USA.
Change 25.162 The final example in comments was missing a close-paren.

UTILBLDP


Aug 12, 2007

Thanks to Trevor Holland, ANZ, AUSTRALIA


====== Changes thru 25.161 were in MXG 25.07 dated Aug 10, 2007=========
Change 25.161 Support for new z/OS 1.9 RMF III and APAR OA17070 fields.

VMACRMFV New variables INPUT from the CFIG3 Header Section are

Aug 9, 2007 added to the ZRBCFI dataset:

CFIRANGE='REPORTING*RANGE*SECONDS'

CFIPONAM='POLICY*NAME'

CFIPOACT='POLICY*ACTIVATION*TIME'

CFIPREQS='NOT ALL*STRUCTURES*CONTAINED'

CFIPREQC='NOT ALL*CONNECTIONS*CONTAINED'

New variables INPUT from the CFIG3 Entry Section are

added to the ZRBCFI dataset:

CFIENSCN='CONNECTED*MVS*SYSTEM*COUNT'

CFIENSTI='STRUCTURE*COUNT*IN*POLICY'

CFIENSTO='STRUCTURE*COUNT*OUT*POLICY'

CFIENTCS='TOTAL*CONTROL*SPACE'

CFIENFCS='FREE*CONTROL*SPACE'

CFIENTDS='TOTAL*DUMP*SPACE'

CFIENFDS='FREE*DUMP*SPACE'

CFIENSCT='SUM WAIT*FREE FOR*SYNCH IMMED'

CFIENFOC='COUNT*OF TIMES*FOR UNSUCCESSFUL'

CFIENFOT='SUM OF*SERVICE*FOR*UNSUCCESSFUL'

CFIENPDE='DEDICATED*PROCESSORS'

CFIENPSH='SHARED*PROCESSORS'

CFIENPWG='SHARED*PROCESSOR*AVERAGE*WEIGHT'

New variables INPUT from the CFIG3 Table Entry Section

are added to the ZRBCFI dataset:

CFISTCOM='MAX*CONNECTIONS*ALLOWED'

CFISTCOT='TOTAL*CONNECTIONS*TO*STRUCTURE*

CFISTCOP='CONNECTIONS*WITH*PROBLEMS'

CFISTQTM='SERVICETM*SUM FOR*QUEUED*REQUESTS.

CFISTFLE='STATUS*FLAGS*EXTENDED'

CFISTRBP='REBUILDPERCENT*IN ACTIVE*CFRM'

CFISTPL ='CF*PREFERENCE*LIST'

CFISTXL ='STRUCTURE*EXCLUSION*LIST'

CFISTETM='STRUCURE*EXECUTION*TIME*SUM'


Change 25.160 Sample reports for Velocity Software data.

ANALXAMR


Aug 9, 2007

Thanks to Robert Obee, IMS Health(R), USA.


Change 25.159 Support for APAR OA12865 for RMF 79 Subtype 9 Device

VMAC79 Activity added variable R799PSM='SUCCESSFUL*PAV*SAMPLES'

Aug 9, 2007 and relabeled variable R799PCT='UNSUCCESSFUL*PAV*SAMPLES'

and now INPUTs R799NDA as 4 bytes instead of 2, so that

variables R799NDA,R799DPB,R799CMR,R799PCT,R799PSM now are

correct, and variable R799CNX6='HYPERPAV*BASE*DEVICE?' is

created.

-RMF II 79 subtype 9 records written at 1 minute intervals

have the accumulated values reset when RMF Monitor I pops

its interval, which caused MXG to set the DIF()'d

values missing; now, only the first observation for each

device will have missing values for the deaccumlations,

since I don't know the prior value from yesterday!

-R799NUX required special handling as it is accumulated

if the device is HyperPav, and is not otherwise.

Thanks to Mike Romeo, Schwab, USA.


Change 25.158 The %QUOTE function had to be replaced with the %BQUOTE

UTILBLDP function, because %QUOTE does not "mask" percent signs,

Aug 8, 2007 and the user-provided text can contain percent signs

that needed to be masked. When a user sets the text

%LET MACKEEP= MACRO _S110 %; and executes %UTILBLDP(...)

this %LET MACBLDP= %QUOTE(&MACKEEP); created the MACBLDP

with MACRO _S110 ) instead of MACRO _S110 % because the

%QUOTE function saw the end of the text as %) and that

pair of adjacent characters are a "special character"

that is, by design, changed to a single paren by %QUOTE.

The %BQUOTE masks these characters that aren't by %QUOTE:

unmarked percent signs

unmatched, unmarked single and double quotation marks

unmatched, unmarked opening and closing parentheses

This issue comes up most often in the %LET MACKEEP= text,

as its usage can have a wide range of character text.

I have previously suggested that when setting MACKEEP to

text that can contain a semicolon, you must use %QUOTE(),

but for old-style macro redefinitions like _S110, there

was no need for the complexity of the %QUOTE() syntax.

And it appears if there happened to be blanks in the

right places, even percent signs could be passed without

either function. Now, if you have semicolons or percents

depending on the context and state of the macro language,

%BQUOTEs may be required in your %LET statements.

Specifically this is required:

%LET MACKEEP=%BQUOTE( MACRO _S110 %) ;

Thanks to Carmen Vitullo, Acxiom IT Outsourcing, USA.


Change 25.157 Change 24.064 added &MXGNOBY operand to circumvent errors

MONTHDSK NOT SORTED, but the invocation of &MXGNOBY was not added

MONTHWEK the WEEKBLDT and MONTHDSK members, where it didn't work!

WEEKBLDT


Aug 6, 2007

Thanks to Randy Parker, Trustmark National Bank, USA.


Change 25.156 The ARRAY LWAI(33) $ LCPUWAI0-9 + were one-byte lengths,

VMAC7072 but ARRAY LDED(33) $ LCPUDED0-9 + were eight bytes long,

Aug 6, 2007 and I cannot see why they are different, but as they are

one-byte variables, their ARRAY statement now explicitly

sets their length with ARRAY xxxx (33) $1;
Change 25.155 Variables created with the SCAN() function are set by SAS

VMACCLAR to character length of $200, even though the input length

VMACNMON is only $128. While I believe SAS should set the output

Aug 6, 2007 length to $128, as WPS does, adding LENGTH statements did

circumvent this SAS problem. Other character handling

functions, like SUBSTR() do set the new variable's length

from the input variable's length.
Change 25.154 PROC MEANS does not pass variable attributes (LENGTH etc)

VMXG70PR to the output dataset unless / INHERIT is added to the

Aug 6, 2007 OUTPUT statement; MXG normally uses %VMXGSUM, which does

specify INHERIT, but the two new PROC MEANS added for the

new IFA/ZIP variables did not specify INHERIT, causing

wrong or blank LENGTH/LABEL/FORMATs for those variables.


Change 25.153 False ERROR: INVALID TYPE42 SUBTYPE 5 RECORD DELETED

VMAC42 were printed because the tests revised by Change 25.095

Aug 3, 2007 should be OFF+LEN GT LENGTH+1 vice GT LENGTH. The

record was valid, but, as the message stated, it was

deleted.

Thanks to Joachim Mayr, Amadeus, GERMANY.


Change 25.152 The analysis of input queue time for Duplicate JOB HOLD

ANALINIT used LASTEND=LAG(JINTTIME) for the start of the input

Aug 3, 2007 queue delay of the next Duplicate JOB NAME, but JINTTIME

is the Start Time of the last job, and, as documented in

Change 12.274, that LAG() function statement

(which returns the value of that variable from the

prior observation)

should have been LASTEND=LAG(JTRMTIME), so that this

job's delay is calculated from the End of Execution of

the prior job.

Thanks to Larry Riggen, OneAmerica, USA.
Change 25.151 The example JCLVMXA invokes PROC MEANS for all datasets,

VMACVMXA that would not normally be executed except for the first

Aug 3, 2007 test, but it failed be cause _MPRCAPC and _MPRCAPM were

not defined (those macro names in lines 20396,20397 were

misspelled). The MONWRITE datasets were correctly built;

Also, MXG 25.06 had a DEBUG=1; statement left from tests

that printed a lot of messages on the SAS log, but with

no impact on the SAS datasets that MXG created.

Thanks to Yaohua Hu, ISO, USA.
Change 25.150 The ASUM70PR summarization could (still!) create PCTCPUBY

VMXG70PR over 100%, if adjacent intervals being summarized had the

Aug 3, 2007 exact same value of STARTIME SMF70GIE and DURATM after

the INTERVAL= operand had reset STARTIME and SMF70GIE.

These DURATM was also incorrect (too small) in these bad

observations, but ALL OTHER VARIABLES ARE CORRECT.

It was the heuristic use of DURATM that seemed to work,

but is now recognized as the culprit, as it failed when

two adjacent DURATMs were identical. Now, by instead

using the OLDSTART, the original unmodified interval

start, and inserting it in internal sorts in place of

DURATM, and testing IF FIRST.OLDSTART vice FIRST.DURATM

there's a clean algorithm for new intervals and this old

recurring problem should be fixed for good.

-Summarization with INTERVAL=SHIFT did not work, because

MXG can not know the duration of each of your shifts, and

message VARIABLE MXGDURTM UNINITIALIZED was printed.

However, if you will add a statement in your IMACSHFT

tailoring member for each shift, that sets then variable

MXGDURTM=nnnnn;, where nnnnn is the duration in seconds

(e.g., MXGDURTM=28800; for an 8-hour shift), then you can

INTERVAL=SHIFT to summarize PDB.ASUM70PR & PDB.ASUM70LP

to your shift definitions.

-Summarization with CECINTRV=SHIFT is also now supported,

proved you tailor IMACSHFT to set MXGDURTM, as above.

The MXG note that SHIFT could not be used is removed.

Thanks to Debby Blackey, HCA HealthCare, USA.
Change 25.149 The SAS/ITRM product (formerly SAS/ITSV) executes MXG to

ADOCITRM create its SAS datasets, but the MXG dataset names are

Aug 2, 2007 changed by ITRM. This member's table maps the ITRM names

to the original MXG dataset name.


Change 25.148 A tutorial on how MXG normally creates SORTed datasets,

ADOCDB2 two exceptions, and an MXG tailoring example that writes

Aug 1, 2007 the DB2ACCTB and DB2ACCTP datasets to separate DDNAMES,

also bypassing their SORTs.


MXG normally builds datasets that are PROC SORTed, and

the sort order can be exploited in subsequent programs

to avoid unneeded sorts. MXG's SORTs specify the NODUP

SAS option, which removes any duplicate SMF records.


However, two datasets, DB2ACCT and CICSTRAN have never

been SORTed by default, as they were always known to be

very large. So their "dataset sort _Sdddddd" tokens,

_SDB2ACC and _SCICTRN, were NOT in the default list of

datasets to be sorted in VMACDB2 and VMAC110 defaults.
With hindsight, I should also have NOT included SORTs of

the DB2 per-buffer (DB2ACCTB) and per-package (DB2ACCTP)

datasets, which now can be as large or larger than, their

DB2ACCT counterpart!


But now that MXG has sorted those datasets by default,

I can not safely remove those SORTs, without high risk

of causing a user program to unnecessarily fail. But,

you can use this MXG tailoring example to write them

to separate DDnames, and bypass their dataset sorts:
// EXEC MXGSASV9

//SMF DD DSN=YOUR.SMF,DISP=SHR

//DB2ACCT DD DSN=YOUR.DB2ACCT,DISP=(,CATLG),...

//DB2ACCTB DD DSN=YOUR.DB2ACCTB,DISP=(,CATLG),...

//DB2ACCTP DD DSN=YOUR.DB2ACCTP,DISP=(,CATLG),...

//PDB DD DSN=YOUR.OTHER.DB2.STUFF,DISP=(,CATLG),..

//SYSIN DD *

%LET WDB2ACC=DB2ACCT; /*DDNAME for DB2ACCT */

%LET WDB2ACB=DB2ACCTB; /*DDNAME for DB2ACCTB*/

%LET WDB2ACP=DB2ACCTP; /*DDNAME for DB2ACCTP*/

%LET MACKEEP=

MACRO _SDB2ACB % /*BYPASS DB2ACCTB SORT*/

MACRO _SDB2ACP % /*BYPASS DB2ACCTP SORT*/

;

%INCLUDE SOURCLIB(BUILDPDB);



RUN;
This same tailoring, using a %LET Wdddddd=DDNAME;

statement to name the output DDname for the "Work"

copy of a dataset, and using %LET MACKEEP= as shown to

define MACRO _Sdddddd % (i.e., to a blank value) can be

used for any other large dataset that you want written

to a separate DDNAME, unsorted, as your SMF data is read.


Change 25.147 Almost cosmetic. The IMACxxxx/MACxxxx tokens that were

VMACQACS defined for VMACQACS were the old IMACQAPM/MACQAPM tokens

VMXGINIT from when AS/400 support was in VMACQAPM, and I decided

Aug 1, 2007 to change the VMAC to QACS but still use the QAPM token

so existing AS/400 tailoring wouldn't need to be changed.

However, this is inconsistent for new users, so this

change adds the include of IMACQACS and created MACQACS,

so the expected token names are found, but the old tokens

are still invoked, so existing tailoring still works.

Thanks to Philip Downes, Fortis Bank, BELGIUM.


Change 25.146 Using PDB=SMF could cause ERROR: NO DATASETS TO LOOKUP

ANALRMFR because SPLIT70 changes were not fully implemented.

Aug 1, 2007 A circumvention was to use TYPS7072 first to create the

PDB datasets, and then use PDB=PDB in the %ANALRMFR,

but this change corrects the error.

Thanks to Mike Rounceville, Blue Cross Blue Shield of NC, USA.


Change 25.145 RMF III dataset ZRBLCP might have no observations for

VMACRMFV many LPARs, due to an MXG error in its "SKIP" logic that

Aug 1, 2007 prematurely ended the scan over all LPARs.

The statement SKIP=CPUCPLEN-32-1280; was replaced with

the statement SKIP=CPUCPLEN-LPARPROF-LPARPRLN*LPARPRNR;

Thanks to Erik Torp, IMT Nordic IBM, DENMARK.


Change 25.144 For ASCII execution, the FULLSTIMER option (MXG default)

UPCMEMSZ will print the memory used by each DATA/PROC step. One

Jul 31, 2007 way to determine how much virtual memory is available to

your MXG programs is to execute this new utility

%INCLUDE SOURCLIB(UPCMEMSZ);

which iterates the number of variables allocated in a

temporary array of 32K-length-character-variables so the

array size varies from 150MB up to 3GB. You look on the

log for the last successful step prior to the ERRORs:

FATAL: Insufficient memory to execute data step

program. Aborted during the COMPILATION phase.

NOTE: The SAS System stopped processing this step

because of insufficient memory.

In my Windows/XP system with SAS 9.1.3, that last step

allocated ARRAY TESTMEMSIZE (30000) $32000 _TEMPORARY_;

and used 938,107 kbytes, or 916 MegaBytes


Change 25.143 MXG sets each of the 135 SWAP rate variables in TYPE71 to

VMAC71 a missing value if that field was zero and the field was

VMXGINIT INPUT, but that design is inconsistent with MXG's use of

Jul 29, 2007 missing values. Normally, an MXG variable has a missing

value, a value different from a "zero", when:

- the event didn't happen, like a datetimestamp JSTRTIME

for a JCL error - the job never "started".

- a new variable is not INPUT, because that new product

is not yet installed at your site.

- an old variable that no longer exists (like PERFGRP)

is no longer INPUT because the record segment is no

longer written.

This design is not perfect; if the new variable is INPUT

because it was added to an already-existing-segment, or

if the old variable is still INPUT because it's segment

exists, they will have a zero value instead of a missing

value, but examination of missing values with PROC MEANS

is used in MXG validation and technical support.

Back when these swap rates were added to the TYPE71,

most were zero, but I wanted blanks when PROC PRINTed,

so by setting their zero values to a missing value, and

using an OPTIONS MISSING=' '; statement, SAS printed

blanks instead of a sea of zeros or periods.
Since TYPE71 always been this way, I'm reluctant to make

changes to my default, but new &MXGMISS macro variable is

now defined in VMXGINIT:

%LET MXGMISS = GT 0 ;

and it referenced in VMAC71 for each swaprate with logic

IF variable &MXGMISS THEN variable=variable*INTTIME;

ELSE variable=.'

so you can put this statement in your IMACKEEP or SYSIN

%LET MXGMISS = GE 0 ;

and any zero values will no longer be missing values.


Advanced SAS notes:

a. I first defined MACRO _GT0 GT 0 % in VMAC71 member,

so it could be redefined with the MACKEEP, but its

re-execution caused unrelated code with ' GT 0 ' to

be seen as ' GT 0 0 ', causing compiler errors.

b. I tested IF X &MXGMISS THEN ... syntax for the case

when the variable MXGMISS was not defined, which

would happen if your site (unwisely) has a tailored

VMXGINIT member. Although there are UNRESOLVED

MACRO VARIABLE messages and one NOTE: VARIABLE

MXGMISS IS UNINITIALIZED, the end result

I also discovered that the value of &MXGMISS macro

variable, when it is undefined, is the MXGMISS text,

rather than the blank value I had assumed/presumed!

Thanks to Jerry Urbaniak, Acxiom, USA.
Change 25.142 Change 18.211 identified most _xxxxID macro tokens that

IMACIPAC are "reversed" from the normal _IDxxxx syntax, but that

VMACIPAC change only updated member UTILBLDP so it would know of

Jul 29, 2007 those inconsistent _ID macro names. This change defines

new, "correct" _IDxxxx macro names for those products,

and modifies the SMF Record ID test syntax to


IF ID=_IDxxxx OR ID=_xxxxID THEN DO;
so that your old definition in your IMACKEEP tailoring

with MACRO _xxxxID nnn % does NOT need to be changed, but

more importantly, so that new users who use the expected

MACRO _IDxxxx nnn % will never find out about this MXG

inconsistency. These members were identified:

ARB, DLMN, DMON, HBUF, HURN, IPAC, M204, NSPY, PDSM,

RMDS, ROSC, RTE, SYNC, TSOM, VVDS, WYLA, WYLB, X37.

Thus far, this change has only been made to these xxxx:

IPAC

Thanks to Keith McWhorter, Georgia Technology Authority, USA.


Change 25.141 IBM APAR OA21799 corrects invalid values for SMF78HIX,

VMAC78 the offset to the new-with-HYPERPAV (SMF78HPS) segments

Jul 27, 2007 in RMF 78 Subtype 3 records. The value in SMF78HIX:

-sometimes exceeded the physical record length, causing

the MXG job to ABEND with this error message:
INPUT STATEMENT EXCEEDED RECORD LENGTH
-sometimes pointed to the wrong LCUID. MXG compares the

LCUID/R783ID2 from the old SMF78ASS segment with the

R783HLCU from the new SMF78HPS, and printed messages:
***ERROR.VMAC78 LCUID=002E DOES NOT MATCH R783HLCU=002F
HyperPAV support was shipped by IBM with APAR OA12865.
This change prevents the ABEND without the APAR installed

by validating SMF78HIX before the INPUT of the HYPERPAV

variables. Also, these new HyperPav variables:

R783HLCU R783HCU R783HNAI R783HTIO R783HAIU

R783HCAD R783HIOQ

are set missing when LCUID mismatch or beyond-record-HIX

is detected. Only 10 error messages will be printed.
-The actual records that contained invalid SMF78HIX values

happened to also be "SPLIT 78" records, i.e., multiple

records written for an interval when the data won't fit

in one 32K SMF record.


But split 78 records are not new; even before HyperPav,

records are split if there are more than 80 LCUIDs.

Fortunately, MXG has always created observations in the

TYPE78CF (Configuration, from the SMF78DCS segments, and

TYPE78CU (Control Unit, from the SMF78ASS and SMF78HPS

segments), since split records are fully self-contained

for each group of LCUIDs for those three segments that

create those two datasets.


But, UnFortunately, when 78 records are split, the 588

byte I/O Queue Global segment (pointed to SMF78QDS) is

repeated in each split record, causing duplicate,


Yüklə 28,67 Mb.

Dostları ilə paylaş:
1   ...   144   145   146   147   148   149   150   151   ...   383




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin