Production Ready Macros for SAS Application Developers
https://github.com/sasjs/core
mp_updatevarlength.sas
Go to the documentation of this file.
1 /**
2  @file mp_updatevarlength.sas
3  @brief Change the length of a variable
4  @details The library is assumed to be assigned. Simple character updates
5  currently supported, numerics are more complicated and will follow.
6 
7  data example;
8  a='1';
9  b='12';
10  c='123';
11  run;
12  %mp_updatevarlength(example,a,3)
13  %mp_updatevarlength(example,c,1)
14  proc sql;
15  describe table example;
16 
17  @param libds the library.dataset to be modified
18  @param var The variable to modify
19  @param len The new length to apply
20 
21  <h4> Dependencies </h4>
22  @li mf_existds.sas
23  @li mp_abort.sas
24  @li mf_existvar.sas
25  @li mf_getvarlen.sas
26  @li mf_getvartype.sas
27  @li mf_getnobs.sas
28  @li mp_createconstraints.sas
29  @li mp_getconstraints.sas
30  @li mp_deleteconstraints.sas
31 
32  @version 9.2
33  @author Allan Bowe
34 
35 **/
36 
37 %macro mp_updatevarlength(libds,var,len
38 )/*/STORE SOURCE*/;
39 
40 %if %index(&libds,.)=0 %then %let libds=WORK.&libds;
41 
42 %mp_abort(iftrue=(%mf_existds(&libds)=0)
43  ,mac=&sysmacroname
44  ,msg=%str(Table &libds not found!)
45 )
46 
47 %mp_abort(iftrue=(%mf_existvar(&libds,&var)=0)
48  ,mac=&sysmacroname
49  ,msg=%str(Variable &var not found on &libds!)
50 )
51 
52 /* not possible to in-place modify a numeric length, to add later */
53 %mp_abort(iftrue=(%mf_getvartype(&libds,&var)=0)
54  ,mac=&sysmacroname
55  ,msg=%str(Only character resizings are currently supported)
56 )
57 
58 %local oldlen;
59 %let oldlen=%mf_getvarlen(&libds,&var);
60 %if &oldlen=&len %then %do;
61  %put &sysmacroname: Old and new lengths (&len) match!;
62  %return;
63 %end;
64 
65 %let libds=%upcase(&libds);
66 
67 
68 data;run;
69 %local dsconst; %let dsconst=&syslast;
70 %mp_getconstraints(lib=%scan(&libds,1,.),ds=%scan(&libds,2,.),outds=&dsconst)
71 
72 %mp_abort(iftrue=(&syscc ne 0)
73  ,mac=&sysmacroname
74  ,msg=%str(syscc=&syscc)
75 )
76 
77 %if %mf_getnobs(&dscont)=0 %then %do;
78  /* must use SQL as proc datasets does not support length changes */
79  proc sql;
80  alter table &libds modify &var char(&len);
81  %return;
82 %end;
83 
84 /* we have constraints! */
85 
86 %mp_deleteconstraints(inds=&dsconst,outds=&dsconst._dropd,execute=YES)
87 
88 proc sql;
89 alter table &libds modify &var char(&len);
90 
91 %mp_createconstraints(inds=&dsconst,outds=&dsconst._addd,execute=YES)
92 
93 %mend;