If you are asking the missing values be replaced by the previous value from the same ID then you can use the UPDATE statement to handle this.
The UPDATE statement is intended to apply transactions to the current data, so missing values leave the current value unchanged.
But by using an empty version of the dataset as the base dataset and using all of the values as transactions you can implement Last Observation Carried Forward. Just add an OUTPUT statement to force the data step to write all of the observations instead of just the last per BY group.
data want;
update have(obs=0) have;
by id;
output;
run;
If there are other variables you did not want to have the missing values replaced then you can read them in again by adding a SET statement using the KEEP= (or DROP=) dataset option. For example if you only want the EVENT and DATE variables to have the LOCF applied then you could do this:
data want;
update have(obs=0) have;
by id;
set have(drop=event date);
output;
run;