From 3d6b9d0da5d2fbb8211332452b26d1b9a54aa18a Mon Sep 17 00:00:00 2001 From: allan Date: Thu, 25 Jun 2026 14:23:43 +0100 Subject: [PATCH] fix: allow large numerics in mp_retainedkey --- base/mp_retainedkey.sas | 11 ++++---- tests/base/mp_retainedkey.test.sas | 43 ++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/base/mp_retainedkey.sas b/base/mp_retainedkey.sas index bcebada..8032f25 100644 --- a/base/mp_retainedkey.sas +++ b/base/mp_retainedkey.sas @@ -148,7 +148,8 @@ %mp_abort(iftrue=(&iserr=1),mac=mp_retainedkey,msg=%superq(msg)) proc sql noprint; -select sum(max(&retained_key),0) into: maxkey from &base_libds; +select sum(max(&retained_key),0) format=32. into: maxkey trimmed + from &base_libds; /** * get base table RK and bus field values for lookup @@ -217,19 +218,19 @@ quit; insert into &maxkeytable set keytable="&base_libds" ,keycolumn="&retained_key" - ,max_key=%eval(&maxkey+&newkey_cnt) + ,max_key=%sysevalf(&maxkey+&newkey_cnt) ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt; %end; %else %do; update &maxkeytable - set max_key=%eval(&maxkey+&newkey_cnt) + set max_key=%sysevalf(&maxkey+&newkey_cnt) ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt where keytable="&base_libds"; %end; %mp_lockanytable(UNLOCK ,lib=%scan(&maxkeytable,1,.) ,ds=%scan(&maxkeytable,2,.) - ,ref=Updating maxkeyvalues with maxkey=%eval(&maxkey+&newkey_cnt) + ,ref=Updating maxkeyvalues with maxkey=%sysevalf(&maxkey+&newkey_cnt) ,ctl_ds=&locktable ) %end; @@ -237,7 +238,7 @@ quit; /* fill in the missing retained key values */ %let tempvar=%mf_getuniquename(); data &outds(drop=&tempvar); - retain &tempvar %eval(&maxkey+1); + retain &tempvar %sysevalf(&maxkey+1); set &tempds2; if &retained_key =. then &retained_key=&tempvar; &tempvar=&tempvar+1; diff --git a/tests/base/mp_retainedkey.test.sas b/tests/base/mp_retainedkey.test.sas index 5c33bac..2971c80 100644 --- a/tests/base/mp_retainedkey.test.sas +++ b/tests/base/mp_retainedkey.test.sas @@ -114,3 +114,46 @@ run; desc=Checking append records created, outds=work.test_results ) + +/** Test 3 - large numeric RK values (avoid exponential notation issue) **/ +data work.targetds3; + set sashelp.class; + rk_col=_n_+209100000000; +run; + +data work.appendtable3; + set sashelp.class; + if mod(_n_,2)=0 then name=cats('New',_n_); + if _n_<7; +run; + +%mp_retainedkey( + base_lib=X + ,base_dsn=targetds3 + ,append_lib=X + ,append_dsn=APPENDTABLE3 + ,retained_key=rk_col + ,business_key= name + ,check_uniqueness=NO + ,maxkeytable=0 + ,locktable=0 + ,outds=work.APPEND3 + ,filter_str= +) +%mp_assert( + iftrue=(&syscc=0), + desc=Checking errors in test 3 (large numeric RK), + outds=work.test_results +) + +data work.check3; + do val=209100000001,209100000003,209100000005, + 209100000020,209100000021,209100000022; + output; + end; +run; +%mp_assertcolvals(work.append3.rk_col, + checkvals=work.check3.val, + desc=All large numeric values have a match, + test=ALLVALS +)