INIT:
   length mode val cmd $ 8 row 8 string $ 200 keyfield $ 8 ftype $ 8
         fform $ 32;
   call notify('.','_get_widget_','TABLE',tableid);
   dsid=open('sasuser.class');
   call set(dsid);
   control always;
   row=1;
   txtflds=0;
   foundit=0;
return;


MAIN:
   cmd=word(1,'u');
   val=word(2);
   select(cmd);
      when('KEYFIELD')
         mode='KEYFIELD';
         link keyfield;
         call nextcmd();
      when('FIND')
         mode ='FIND';
         link find;
         call nextcmd();
      when('FORWARD')
         call send(tableid,'_vscroll_','page',1);
         call nextcmd();
      when('BACKWARD')
         call send(tableid,'_vscroll_','page',-1);
         call nextcmd();
      when('TOP')
         call send(tableid,'_vscroll_','max',-1);
         call nextcmd();
      when('BOTTOM')
         call send(tableid,'_vscroll_','max',1);
         call nextcmd();
      otherwise;
      end;
return;


TERM:
   rc=close(dsid);
   rc=dellist(txtflds,'y');
return;


GET1:
   if fetchobs(dsid,_currow_)=-1 then
      do;
         mode='';
         call send(tableid,'_endtable_');
      end;
   if txtflds=0 then
      do;
         txtflds=makelist();
         call send(tableid,'_get_widgets_',listid);
         do i=2 to listlen(listid);
            sublist=getiteml(listid,i);
            call send(sublist,'_IS_A_',
                              'SASHELP.FSP.EFIELD',istextentry);
            if istextentry then
               rc=insertc(txtflds,getnitemc(sublist,'FTYPE')||':'
                         ||getnitemc(sublist,'FORMAT'),-1,
                         getnitemc(sublist,'NAME') );
         end;
      end;
   if mode='FIND' then
      do;
         call notify('.','_get_widget_',keyfield,id);
         ftype=getnitemc(id,'FTYPE',1);
         if ftype='CHAR' then
            do;
               call notify(keyfield,'_get_text_',string);
               string=trim(left(putc(string,fform)));
            end;
         else if ftype in ('NUM','SHORT','FIXED') then
            do;
               call notify(keyfield,'_get_value_',number);
               string=trim(left(putn(number,fform)));
            end;
         foundit=(string=val);
         if foundit then
            do;
              row=_currow_;
              mode='';
            end;
      end;
return;


KEYFIELD:
   if val ne ' ' then
      do;
         ftype=getnitemc(txtflds,val,1,1,' ');
         if ftype ne ' ' then
            do;
               fform=scan(ftype,2,':');
               ftype=scan(ftype,1,':');
               keyfield=val;
               if fform=' ' then
                  do;
                     if ftype='CHAR' then fform='$200.';
                     else fform='best12.';
                     end;
              _msg_='NOTE: The current keyfield is '||upcase(keyfield);
           end;
           else _msg_='ERROR: Unknown alias (name) for current screen.';
      end;

   else
      do;
         if keyfield=' ' then
            _msg_='ERROR: Invalid field name, '||
                  'please enter KEYFIELD command again.';
         else
            _msg_='NOTE: The current keyfield is '||upcase(keyfield);
      end;
return;


STOPIT:
   mode='';
   _msg_='Attention was issued.  The FIND command ceased execution.';
return;


FIND:
   control break stopit;
   if keyfield=' ' then
      do;
         _msg_='ERROR: You must first issue KEYFIELD FIELDNAME.';
         mode='';
         return;
      end;
   If ^foundit then
      do;
         call send(tableid,'_set_toprow_',1);
         call send(tableid,'_get_toprow_',toprow);
         mode='FIND';
         foundit=0;
         call send(tableid,'_refresh_');
         do while(mode='FIND');
            call send(tableid,'_vscroll_','page',1);
            call send(tableid,'_refresh_');
         end;
      end;
      call send(tableid,'_set_toprow_',row);
      if ^foundit then
         _msg_='WARNING: No occurrences of "'||val||'" found.';
      foundit=0;
return;