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 Training: Just a Click Away

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

Browse our catalog!

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