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.