ALTER FUNCTION "dba"."get_doknr_kp"(in ai_years integer,in ai_objnr integer,in ai_sisse smallint)
returns char(20)
begin
  declare li_doknr integer;
  declare ls_doknr char(20);
  declare li_skoop integer;
  set ls_doknr='';
  select if ai_sisse=1 then kp_obj.mindoknrs else kp_obj.mindoknrv endif,kp_obj.skoop into li_doknr,li_skoop from kp_obj where kp_obj.objnr = ai_objnr;
  if li_doknr = 0 then
    set ai_objnr=0;
    select if ai_sisse=1 then kp_konfm.mindoknrs else kp_konfm.mindoknrv endif, if kp_konfm.dok_auku=1 then 0 else li_skoop endif into li_doknr,li_skoop from kp_konfm where kp_konfm.id =1;
    if li_doknr is null or li_doknr <= 0 then
      set li_doknr=1
    end if;
  end if;
  if li_doknr > 0 then
    select first if kp_kanne_dok.doknr is null or li_doknr>kp_kanne_dok.doknr then li_doknr else kp_kanne_dok.doknr endif into li_doknr from kp_kanne_dok where kp_kanne_dok.aasta=ai_years and kp_kanne_dok.skoop=li_skoop and kp_kanne_dok.objnr=ai_objnr and kp_kanne_dok.sisse=ai_sisse;
    while exists(select 1 from kp_kanne left outer join kp_obj on kp_kanne.objnr = kp_obj.objnr where(kp_kanne.aasta = ai_years) and(kp_kanne.sisse = ai_sisse) and(kp_kanne.doknr = trim(str(li_doknr,20))) and((kp_kanne.objnr = ai_objnr) or (((ai_objnr = 0) and (kp_obj.skoop=li_skoop or li_skoop=0)) and kp_obj.doknr = 1 and (if ai_sisse=1 then kp_obj.mindoknrs else kp_obj.mindoknrv endif) = 0 )) ) loop
      set li_doknr=li_doknr+1;
    end loop;
    if exists(select 1 from kp_kanne_dok where kp_kanne_dok.aasta=ai_years and kp_kanne_dok.skoop=li_skoop and kp_kanne_dok.objnr=ai_objnr and kp_kanne_dok.sisse=ai_sisse) then
      update kp_kanne_dok set doknr=li_doknr where kp_kanne_dok.aasta=ai_years and kp_kanne_dok.skoop=li_skoop and kp_kanne_dok.objnr=ai_objnr and kp_kanne_dok.sisse=ai_sisse
    else
      insert into kp_kanne_dok (aasta,skoop,objnr,sisse,doknr) values (ai_years,li_skoop,ai_objnr,ai_sisse,li_doknr)
    end if;
    set ls_doknr=trim(str(li_doknr,20))
  end if;
  return(ls_doknr)
end