BookmarkSubscribeRSS Feed
gulyaspetermark
Calcite | Level 5

Dear Forum Users,

 
I would like to ask, that is it possible to implement my idead using SAS Viya, because I am struggling to make it work, and I would love to get some help on this topic. I am using SAS Viya for Learners.
 
So here is my idea: I would like to make a Job Definition in SAS Viya -> SAS Studio, and using a parameter and an HTML form, I would like to make a user parameterizable data generating program. Like the user should see a slider which sets a ratio at which the data would generate into a data table, or something like this.
 
I would really appreciate the help from you guys, because this would be my final thesis.
 
Here are my codes:
Job definition Program:
cas;  
libname mycas cas caslib="CASUSER(h260198@stud.u-szeged.hu)";
 
%macro generate_data(p_hitel=0.7);
 
%if %length(&p_hitel)=0 %then %let p_hitel=0.7;
 
data SZAMLA (keep = LEJARAT_DATUM EGYENLEG_OSSZEG DEVIZANEM_KOD TORLESZTESEK_SZAMA
                       TORLESZTES_OSSZEG UGYFEL_KOD TIPUS ALTIPUS SZAMLASZAM THM
                       SZERZODES_OSSZEG INDULAS_DATUM KAMAT
                       index=(SZAMLASZAM));
  length SZAMLASZAM $26 UGYFEL_KOD $12 TIPUS $1 ALTIPUS $3 DEVIZANEM_KOD $3;
  length INDULAS_DATUM LEJARAT_DATUM EGYENLEG_OSSZEG TORLESZTESEK_SZAMA
         TORLESZTES_OSSZEG THM KAMAT SZERZODES_OSSZEG 8;
  format LEJARAT_DATUM INDULAS_DATUM yymmdd10.;
 
  do i=1 to 500;
 
    /* initialize */
    INDULAS_DATUM=.; LEJARAT_DATUM=.; EGYENLEG_OSSZEG=.;
    TORLESZTESEK_SZAMA=.; TORLESZTES_OSSZEG=.; THM=.; KAMAT=.; SZERZODES_OSSZEG=.;
 
    SZAMLASZAM = "12345678-12345678-" || substr(trim(left(100000000+i)),2,8);
 
    RND = int(ranuni(1)*10000 + 6);
    UGYFEL_KOD = substr(trim(left(100000000+RND)),2,8);
 
    if ranuni(1) < &p_hitel then TIPUS="H"; else TIPUS="B";
 
    if TIPUS="H" then do;
      RND = ranuni(1);
      select;
        when (RND GT 0.4) ALTIPUS="LAK";
        when (RND GT 0.1) ALTIPUS="SZM";
        when (RND GT 0)   ALTIPUS="ARU";
        otherwise ALTIPUS="";
      end;
    end;
    else do;
      RND = ranuni(1);
      select;
        when (RND GT 0.4) ALTIPUS="FSZ";
        when (RND GT 0)   ALTIPUS="LKB";
        otherwise ALTIPUS="";
      end;
    end;
 
    /* devizanem */
    RND = ranuni(1);
    select;
      when (RND GT 0.4) DEVIZANEM_KOD="HUF";
      when (RND GT 0.1) DEVIZANEM_KOD="EUR";
      when (RND GT 0)   DEVIZANEM_KOD="USD";
      otherwise DEVIZANEM_KOD="HUF";
    end;
 
    RND = ranuni(1)*1000;
    INDULAS_DATUM = date() - RND;
 
    if TIPUS="H" or ALTIPUS="LKB" then do;
      RND = ranuni(1)*1000 + 30;
      LEJARAT_DATUM = date() + RND;
      LEJARAT_DATUM = mdy(month(LEJARAT_DATUM),1,year(LEJARAT_DATUM));
      if ALTIPUS="LAK" then LEJARAT_DATUM = mdy(month(INDULAS_DATUM),1,year(INDULAS_DATUM)+20);
    end;
 
    if TIPUS="B" then do;
      RND = ranuni(1)*10000000;
      if ALTIPUS="LKB" then do;
        KAMAT = 0.08;
        SZERZODES_OSSZEG = int(RND/10000)*10000;
        /* egyszerűbb határidő-számítás (nem tökéletes pénzügyi képlet, de működik) */
        EGYENLEG_OSSZEG = SZERZODES_OSSZEG * (1 + KAMAT/12) ** int((date()-INDULAS_DATUM)/30);
      end;
      else do;
        KAMAT = 0.04;
        RND = ranuni(1)*10000000;
        EGYENLEG_OSSZEG = RND;
      end;
    end;
 
    if TIPUS="H" then do;
      RND = round((ranuni(1)*1000 + 500),100) * 10000;
      select;
        when (ALTIPUS="LAK") do; THM = 0.06; end;
        when (ALTIPUS="SZM") do; THM = 0.20; RND = RND/10; end;
        when (ALTIPUS="ARU") do; THM = 0.30; RND = RND/100; end;
        otherwise THM = .;
      end;
      SZERZODES_OSSZEG = RND;
      if not missing(LEJARAT_DATUM) and not missing(INDULAS_DATUM) then do;
        TORLESZTESEK_SZAMA = INT((LEJARAT_DATUM - INDULAS_DATUM)/30) + 1;
        /* egyszerűsített törlesztési képlet: havi kamatláb r = THM/12 */
        if TORLESZTESEK_SZAMA > 0 and THM > 0 then do;
          r = THM/12;
          TORLESZTES_OSSZEG = SZERZODES_OSSZEG * (r / (1 - (1 + r) ** (-TORLESZTESEK_SZAMA)));
          drop r;
        end;
        else TORLESZTES_OSSZEG = .;
      end;
    end;
 
    output;
  end; /* do i */
run;
 
/* UGYFEL adat */
data UGYFEL (keep= UGYFEL_KOD UGYFEL_SZEGMENS UGYFEL_NEV UGYFEL_LAKHELY UGYFEL_DEFAULT
                    UGYFEL_JOVEDELEM NETTO_ARBEVETEL UGYFEL_MINOSITES);
 length UGYFEL_KOD $12 UGYFEL_SZEGMENS $1 UGYFEL_NEV $50 UGYFEL_LAKHELY $15 UGYFEL_DEFAULT $1
        UGYFEL_JOVEDELEM 8 NETTO_ARBEVETEL 8 UGYFEL_MINOSITES $1;
 do i=1 to 500;
   UGYFEL_JOVEDELEM=.; NETTO_ARBEVETEL=.; UGYFEL_MINOSITES="";
 
   UGYFEL_KOD = substr(trim(left(100000000+i)),2,8);
   RND = ranuni(1);
  select;
  when (i=1) do; UGYFEL_SZEGMENS="A"; end;
  when (i LE 5) do; UGYFEL_SZEGMENS="B"; end;
  when (RND GT 0.6) do; UGYFEL_SZEGMENS="L"; end;
  otherwise do; UGYFEL_SZEGMENS="V"; end;
end;
 
   RND = ranuni(1);
   select;
     when (RND GT 0.6) UGYFEL_LAKHELY="Budapest";
     when (RND GT 0.3) UGYFEL_LAKHELY="Megyeszekhely";
     when (RND GT 0.2) UGYFEL_LAKHELY="Varos";
     otherwise         UGYFEL_LAKHELY="Egyeb";
   end;
 
   if UGYFEL_SZEGMENS in ("A","B") then UGYFEL_LAKHELY="Budapest";
 
   RND = ranuni(1);
   if UGYFEL_SZEGMENS in ("L","V") then do;
     select;
       when (RND GT 0.6) UGYFEL_NEV="Kovacs";
       when (RND GT 0.3) UGYFEL_NEV="Szabo";
       when (RND GT 0.2) UGYFEL_NEV="Kiss";
       otherwise         UGYFEL_NEV="Nagy";
     end;
     if UGYFEL_SZEGMENS="V" then UGYFEL_NEV = catx(' ', UGYFEL_NEV, put(i,8. -L), "Kft");
   end;
 
   /* speciális nevek az első 5-re */
   if i=1 then UGYFEL_NEV="Magyar Allam";
   else if i=2 then UGYFEL_NEV="OTP";
   else if i=3 then UGYFEL_NEV="ERSTE";
   else if i=4 then UGYFEL_NEV="BB";
   else if i=5 then UGYFEL_NEV="KH";
 
   RND = ranuni(1);
   if UGYFEL_SZEGMENS="V" and RND<0.2 then UGYFEL_DEFAULT="Y"; else UGYFEL_DEFAULT="N";
 
   RND = round((ranuni(1)*1000 + 1000),100)*10000;
   if UGYFEL_SZEGMENS="V" then NETTO_ARBEVETEL=RND;
   if UGYFEL_SZEGMENS="L" then UGYFEL_JOVEDELEM=RND/10;
 
   UGYFEL_MINOSITES="1";
   if UGYFEL_SZEGMENS in ("V","L") then do;
     RND = ranuni(1);
     select;
       when (RND GT 0.6) UGYFEL_MINOSITES="2";
       when (RND GT 0.3) UGYFEL_MINOSITES="3";
       when (RND GT 0.2) UGYFEL_MINOSITES="4";
       otherwise         UGYFEL_MINOSITES="5";
     end;
   end;
 
   output;
 end;
run;
 
 
/* FEDEZET */
data FEDEZET (keep = FEDEZET_KOD UGYLET_SZAMLASZAM FEDEZET_TIPUS FEDEZET_OSSZEG
                     FEDEZET_DEVIZANEM KIBOCSATO_KOD FEDEZET_INDULAS_DATUM FEDEZET_LEJARAT_DATUM);
  length FEDEZET_KOD $8 UGYLET_SZAMLASZAM $26 FEDEZET_TIPUS $8 FEDEZET_OSSZEG 8 FEDEZET_DEVIZANEM $3
         KIBOCSATO_KOD $8 FEDEZET_INDULAS_DATUM 8 FEDEZET_LEJARAT_DATUM 8;
  format FEDEZET_LEJARAT_DATUM FEDEZET_INDULAS_DATUM yymmdd10.;
 
  k = 0;
 
  do i = 1 to 500;
    if int(i/3)=i/3 or (i in (2,4,8,10)) then do;
      UGYLET_SZAMLASZAM = "12345678-12345678-" || substr(trim(left(100000000+i)),2,8);
 
      /* a megfelelő SZAMLA rekord beolvasása biztonságosan */
      set SZAMLA point=i nobs=ossz;
      if _N_ > ossz then stop;
 
      RND = int(ranuni(1)*5);
      if ALTIPUS="LAK" then RND = RND + 2;
 
      do j = 1 to RND;
        FEDEZET_TIPUS=""; KIBOCSATO_KOD=""; FEDEZET_OSSZEG=.; FEDEZET_DEVIZANEM="";
        FEDEZET_INDULAS_DATUM=.; FEDEZET_LEJARAT_DATUM=.;
 
        if ALTIPUS="LAK" and j LE 2 then do;
          if j=1 then do;
            FEDEZET_TIPUS="INGATLAN";
            FEDEZET_OSSZEG = SZERZODES_OSSZEG * 1.2;
          end;
          else if j=2 then do;
            FEDEZET_TIPUS="ALL_GAR";
            FEDEZET_OSSZEG = SZERZODES_OSSZEG * 0.1;
            KIBOCSATO_KOD = "00000001";
          end;
        end;
        else do;
          RND2 = ranuni(1);
          select;
            when (RND2 > 0.6) FEDEZET_TIPUS="KEZESSEG";
            when (RND2 > 0.3) FEDEZET_TIPUS="BANK_GAR";
            otherwise FEDEZET_TIPUS="LETET";
          end;
          FEDEZET_OSSZEG = round(SZERZODES_OSSZEG * ranuni(1), 10000);
        end;
 
        if FEDEZET_TIPUS ne "" then do;
          k + 1;
          FEDEZET_KOD = substr(trim(left(100000000+k)),2,8);
          FEDEZET_DEVIZANEM = DEVIZANEM_KOD;
          FEDEZET_INDULAS_DATUM = INDULAS_DATUM;
          FEDEZET_LEJARAT_DATUM = LEJARAT_DATUM;
          output;
        end;
      end;
    end;
  end;
run;
 
 
/* HITEL */
data HITEL (drop=i havi);
  set SZAMLA (where=(tipus="H"));
  hatralevo_torlesztes = INT((LEJARAT_DATUM - date())/30) + 1;
  EGYENLEG_OSSZEG = 0;
  do i = 1 to max(hatralevo_torlesztes,1);
    /* egyszerűsített havi összeg hozzáadása */
    if torlesztes_osszeg > . then do;
      havi = torlesztes_osszeg / ((1 + THM/12) ** (i-1));
      EGYENLEG_OSSZEG = sum(egyenleg_osszeg, havi);
    end;
  end;
  output;
run;
 
/* ARFOLYAM */
data ARFOLYAM;
  devizanem_kod = "HUF"; arfolyam = 1; output;
  devizanem_kod = "EUR"; arfolyam = 401; output;
  devizanem_kod = "USD"; arfolyam = 380; output;
run;
 
%mend generate_data;
 
/* Makróhívás */
%generate_data(p_hitel=&p_hitel);
 
/* --- Mentés a CASUSER-be (ha a táblák először a Work-ben készülnek el) --- */
data mycas.SZAMLA;    set SZAMLA;    run;
data mycas.UGYFEL;    set UGYFEL;    run;
data mycas.FEDEZET;   set FEDEZET;   run;
data mycas.HITEL;     set HITEL;     run;
data mycas.ARFOLYAM;  set ARFOLYAM;  run;

HTML Form:

<!DOCTYPE html>
<html lang="hu">
<head>
<meta charset="utf-8">
<title>Adatgenerálás paraméterezése</title>
<style>
body { font-family: Arial, sans-serif; margin: 2rem; }
h2 { color: #003366; }
#status { display: none; margin-top: 10px; color: #0066cc; }
.visible { display: block; }
label { font-weight: bold; }
</style>
</head>
<body>
<h2>Adatgenerálás paraméterezése</h2>

<form id="adatForm" method="post" action="/SASJobExecution/" target="_SASResults"
autocomplete="off" enctype="application/x-www-form-urlencoded">
<!-- SAS Job hivatkozása (Content útvonal) -->
<input type="hidden" name="_program" value="/Users/h260198@stud.u-szeged.hu/My Folder/szakdoga/adatgeneralas_job">
<input type="hidden" name="_action" value="execute">
<input type="hidden" name="_output_type" value="ods_html5">
<input type="hidden" name="_CSRF" value="$CSRF$">

<label for="p_hitel">
Hitelek aránya (p_hitel):
<input type="range" id="p_hitel" name="p_hitel" min="0" max="1" step="0.01" value="0.7"
oninput="document.getElementById('val').innerText=this.value">
<span id="val">0.70</span>
</label>

<br><br>
<button type="submit" id="submitBtn">🔹 Adatgenerálás indítása</button>
</form>

<div id="status">🔄 A job fut, kérem várjon...</div>

<script>
const form = document.getElementById('adatForm');
const status = document.getElementById('status');
const submitBtn = document.getElementById('submitBtn');

form.addEventListener('submit', () => {
submitBtn.disabled = true;
status.classList.add('visible');
});
</script>
</body>
</html>

Thank you in advance.

sas-innovate-2026-white.png



April 27 – 30 | Gaylord Texan | Grapevine, Texas

Registration is open

Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!

Register now

SAS Training: Just a Click Away

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

Browse our catalog!

Discussion stats
  • 0 replies
  • 291 views
  • 0 likes
  • 1 in conversation