From f2991cfd63ef7ed8759b7d4ab39befd582538576 Mon Sep 17 00:00:00 2001 From: munja Date: Thu, 23 Dec 2021 10:56:01 +0000 Subject: [PATCH] fix: enabling makedata support for charvars > and tables without primary keys. Also added tests. --- all.sas | 8 +++- base/mp_makedata.sas | 8 +++- tests/crossplatform/mp_makedata.test.sas | 59 ++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 tests/crossplatform/mp_makedata.test.sas diff --git a/all.sas b/all.sas index 9de7022..de94822 100644 --- a/all.sas +++ b/all.sas @@ -7702,11 +7702,15 @@ lock &libds clear;

SAS Macros

@li mf_getuniquename.sas @li mf_getvarlen.sas + @li mf_getvarlist.sas @li mf_islibds.sas @li mf_nobs.sas @li mp_getcols.sas @li mp_getpk.sas +

Related Macros

+ @li mp_makedata.test.sas + @version 9.2 @author Allan Bowe @@ -7738,7 +7742,7 @@ lock &libds clear; %mp_getpk(&lib,ds=&ds,outds=&ds1) proc sql noprint; -select pk_fields into: pk_fields from &ds1; +select coalescec(pk_fields,'_all_') into: pk_fields from &ds1; data &ds2; if 0 then set &libds; @@ -7747,7 +7751,7 @@ data &ds2; %if &charvars ^= %then %do i=1 %to %sysfunc(countw(&charvars)); %let col=%scan(&charvars,&i); /* create random value based on observation number and colum length */ - &col=substr(put(md5(_n_),$hex32.),1,%mf_getvarlen(&libds,&col)); + &col=repeat(put(md5(cats(_n_)),$hex32.),%mf_getvarlen(&libds,&col)/32); %end; %let numvars=%mf_getvarlist(&libds,typefilter=N); diff --git a/base/mp_makedata.sas b/base/mp_makedata.sas index a5a1fac..0b583d3 100644 --- a/base/mp_makedata.sas +++ b/base/mp_makedata.sas @@ -33,11 +33,15 @@

SAS Macros

@li mf_getuniquename.sas @li mf_getvarlen.sas + @li mf_getvarlist.sas @li mf_islibds.sas @li mf_nobs.sas @li mp_getcols.sas @li mp_getpk.sas +

Related Macros

+ @li mp_makedata.test.sas + @version 9.2 @author Allan Bowe @@ -69,7 +73,7 @@ %mp_getpk(&lib,ds=&ds,outds=&ds1) proc sql noprint; -select pk_fields into: pk_fields from &ds1; +select coalescec(pk_fields,'_all_') into: pk_fields from &ds1; data &ds2; if 0 then set &libds; @@ -78,7 +82,7 @@ data &ds2; %if &charvars ^= %then %do i=1 %to %sysfunc(countw(&charvars)); %let col=%scan(&charvars,&i); /* create random value based on observation number and colum length */ - &col=substr(put(md5(_n_),$hex32.),1,%mf_getvarlen(&libds,&col)); + &col=repeat(put(md5(cats(_n_)),$hex32.),%mf_getvarlen(&libds,&col)/32); %end; %let numvars=%mf_getvarlist(&libds,typefilter=N); diff --git a/tests/crossplatform/mp_makedata.test.sas b/tests/crossplatform/mp_makedata.test.sas new file mode 100644 index 0000000..62b260d --- /dev/null +++ b/tests/crossplatform/mp_makedata.test.sas @@ -0,0 +1,59 @@ +/** + @file + @brief Testing mp_makedata.sas macro + +

SAS Macros

+ @li mf_nobs.sas + @li mp_makedata.sas + @li mp_assert.sas + +**/ + +/** + * Test 1 - Regular makedata call + */ + +proc sql; +create table work.example( + TX_FROM float format=datetime19., + DD_TYPE char(16), + DD_SOURCE char(2048), + DD_SHORTDESC char(256), + constraint pk primary key(tx_from, dd_type,dd_source), + constraint nnn not null(DD_SHORTDESC) +); +%mp_makedata(work.example,obs=500) + +%mp_assert( + iftrue=("%mf_nobs(work.example)"="500"), + desc=Check that 500 rows were created, + outds=work.test_results +) + +data _null_; + set work.example; + call symputx('lenvar',length(dd_source)); + stop; +run; +%mp_assert( + iftrue=("&lenvar"="2048"), + desc=Check that entire length of variable is populated, + outds=work.test_results +) + + +proc sql; +create table work.example2( + TX_FROM float format=datetime19., + DD_TYPE char(16), + DD_SOURCE char(2048), + DD_SHORTDESC char(256), + some_num num +); +%mp_makedata(work.example2) + +%mp_assert( + iftrue=(&syscc=0), + desc=Ensure tables without keys still generate, + outds=work.test_results +) \ No newline at end of file