BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
mkeintz
PROC Star

The NEXT method is not a hash object method, it is a hash iterator method.  So the following fails:

 

declare hash h;

   h.definekey('key');

   h.definedata('data');

  h.definedone();

 

rc=h.next();         ==> this will fila

 

You have to create an iterator for hash object H, i.e. you need this

 

dechare hiter hi  ('h');

 

Then use the next method via the statement

 

    rc=hi.next();

 

regards,

Mark

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
CP2
Pyrite | Level 9 CP2
Pyrite | Level 9

thanks Mark. it is  accessing a hash interator and still fails. I think I tried using next() months ago and gave up on it. 

 

   if 0 then _color=color;
      format _date date9.; call missing(_date);
      dcl hash h1_colors(multidata:'n', ordered:'y', hashexp:4);
      dcl hiter hh1_colors('h1_colors');
      h1_colors.defineKey('id','color');
      h1_colors.defineData('_color','_date');
      h1_colors.defineDone();

 

Patrick
Opal | Level 21

@CP2

Try the last code version I've posted. I believe that's what you're after.

The code works totally fine in my environment using the data you've posted.

 

Here all together:

data have ;
informat date mmddyy10.;
input id $ date color $ expectedCombo $;
format date mmddyy10.;
datalines;
1321 07/10/2015 blue blue
1321 07/11/2015 blue blue
1321 07/12/2015 blue blue
1321 07/13/2015 blue blue
1321 08/18/2015 red blue-red
1321 08/19/2015 blue blue-red
1321 08/20/2015 blue blue-red
1321 08/21/2015 blue blue-red
1321 08/22/2015 blue blue-red
1321 09/15/2015 red blue-red
1321 09/16/2015 blue blue-red
1321 09/17/2015 blue blue-red
1321 09/18/2015 blue blue-red
1321 01/12/2016 red blue-red
1321 01/12/2016 blue blue-red
1321 01/13/2016 blue blue-red
1321 01/14/2016 blue blue-red
1321 01/15/2016 blue blue-red
1321 01/16/2016 blue blue-red
1321 01/17/2016 blue blue-red
1321 01/18/2016 blue blue-red
1321 01/19/2016 green blue-red-green
1321 01/19/2016 blue blue-red-green
1321 01/20/2016 blue blue-red-green
1321 01/21/2016 blue blue-red-green
1321 01/22/2016 blue blue-red-green
1321 01/23/2016 blue blue-red-green
1321 01/24/2016 blue blue-red-green
1321 01/25/2016 blue blue-red-green
1325 01/16/2016 blue blue-red
1325 01/17/2016 blue blue-red
1325 01/18/2016 blue blue-red
1325 01/19/2016 green blue-red-green
1325 01/19/2016 blue blue-red-green
1325 01/20/2016 blue blue-red-green
1325 01/21/2016 blue blue-red-green
1325 01/22/2016 blue blue-red-green
1325 01/23/2016 blue blue-red-green
1325 01/24/2016 blue blue-red-green
1325 01/25/2016 blue blue-red-green
;
run;


proc format;
  invalue color_interval (just upcase)
    'RED' = 45
    other = 30
  ;
quit;

data want(drop=_:);
  set have;
  by id date;
  length Combo $ 400;

  if _n_=1 then
    do;

      if 0 then _color=color;
      format _date date9.; call missing(_date);
      dcl hash h1_colors(multidata:'n', ordered:'y', hashexp:4);
      dcl hiter hh1_colors('h1_colors');
      h1_colors.defineKey('id','color');
      h1_colors.defineData('_color','_date');
      h1_colors.defineDone();

      dcl hash h1_rowsSameDate(multidata:'y', dataset:'have(obs=0)', hashexp:2);
      dcl hiter hh1_rowsSameDate('h1_rowsSameDate');
      h1_rowsSameDate.defineKey('id','date');
      h1_rowsSameDate.defineData(all:'y');
      h1_rowsSameDate.defineDone();

    end;

  /* new id: clear hash h1_colors() */
  if first.id then
    h1_colors.clear();

  /* new date: clear hash h1_rowsSameDate() */
  if first.date then
    h1_rowsSameDate.clear();

  /* keep hashes up to date if required */
  h1_colors.replace(key:id, key:color, data:color, data:date);
  if not first.date or not last.date then h1_rowsSameDate.add();

  /* populate combo */
  if last.date then
    do;
      _rc = hh1_colors.first();
      do while (_rc = 0);
        if intck('day',_date,date)<=input(color,color_interval.) then combo=catx('-',combo,_color);
        else h1_colors.delete();
        _rc = hh1_colors.next();
      end;
    end;

  if first.date and last.date then
    /* only 1 color for the date */
    do;
      output;
    end;
  else if last.date then
    do;
      /* multiple colors for the date */
      _rc = hh1_rowsSameDate.first();
      do while (_rc = 0);
        output;
        _rc = hh1_rowsSameDate.next();
      end;
    end;

run;

Capture.PNG

CP2
Pyrite | Level 9 CP2
Pyrite | Level 9

yes! that works. Sorry , i must have copied the old code. Thank you !!

CP2
Pyrite | Level 9 CP2
Pyrite | Level 9

any reason why I would get a mismatch data type error for the _date field when converting code to my real drug dataset? My drug data is in date9. format (16NOV2016) for a field named administrationdate. I changed all the 'date' to 'administrationdate' but left the _date field the same. 

mkeintz
PROC Star
Very weird! After all what is the iterator object without a working next method?

Regards,
Markk
--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
Patrick
Opal | Level 21

@mkeintz

Look again. Both do while loops call the iterator next() method within the loop.

mkeintz
PROC Star
Paatrack:

I believe CP2 was saying saying that the next method wasn't working on his machine, My comment was meant to be a sympathetic response, not to suggest that sas actually published an iterator without a next method.

not that your program doesn't work.
--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 37 replies
  • 2755 views
  • 5 likes
  • 4 in conversation