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.
... View more