cancel
Turn on suggestions
Showing results for
Search instead for
Did you mean:
BookmarkSubscribeRSS Feed
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.
0 Likes

sasinnovate.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

Call for Content EXTENDED

Still thinking about your presentation idea? The submission deadline has been extended to Friday, Nov. 14, at 11:59 p.m. ET.

Submit your proposal!

SAS Training: Just a Click Away

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

Browse our catalog!

Discussion stats
[フレーム]

AltStyle によって変換されたページ (->オリジナル) /