by Heikki Herva Proc FCMP Itse kirjoitetut funktiot Hash objekti Taulukkotietorakenne Yleismoduuli Yleisosa proc fcmp outlib ltcomufunctionskurssausltl subroutine ID: 802085
Download The PPT/PDF document "Sugif 29.1.2014" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
Sugif 29.1.2014 by Heikki Herva
Proc
FCMP
Itse kirjoitetut funktiot
Hash
objekti
”Taulukkotietorakenne”
Slide2Yleismoduuli(Yleisosa)
Slide3proc fcmp
outlib
=
lt_comu.functions.kurssaus_ltl
;
subroutine
kurssaus_ltl
(
valkd_in
$,
valuutta_rm_in
,
kurssattu_rm,
kurssi_out
,
paluukd
,
sqlkd
);
outargs
kurssattu_rm
,
kurssi_out
,
paluukd
,
sqlkd
;
attrib
kurssattu_rm
format
=
17.2
length
=
8
;
attrib
kurssi_out
format
=
8.4
length
=
8
;
attrib
paluukd
format
=
8.
length
=
8
;
attrib
sqlkd
format
=
8.
length
=
8
;
sqlselect
=
'select curate into :
sqlresults
from
comu.exchrate
where
curncycd
= "'
||trim(
valkd_in
)||
'" order by
enddt
desc
;'
;
rc
=
run_macro
(
'
hae_valuuttakurssi
'
,
sqlselect
, sqlresults,
sqlrc,
sqlobs
);
if
sqlrc
eq
0
and
sqlobs
gt
0
then
paluukd
=
0
;
else
paluukd
=
1
;
sqlkd
=
sqlrc
;
kurssi_out
=
sqlresults
;
kurssattu_rm
=
valuutta_rm_in
*
kurssi_out
;
endsub
;
quit
;
Slide4%macro hae_valuuttakurssi;%let
sqlselect
=
%
sysfunc
(
dequote
(&
sqlselect
));
%let
sqlresults
=;
proc
sql
outobs
=
1
noprint
;
&
sqlselect
;
quit
;
%let
sqlresults
=&
sqlresults
;
%let
sqlrc
=&
sqlrc
;
%let
sqlobs
=&
sqlobs
;
%
mend
hae_valuuttakurssi
;
Slide5data nimi_muutettu_1;set
nimi_muutettu_2;
attrib
valkd_in
format
=
$3.
length
= $
3
informat
=
$3.
;
attrib
valuutta_rm_in
format
=
17.2
length
=
8
informat
=
17.2
;
attrib
kurssi_out
format
=
8.4
length
=
8
informat
=
8.4
;
attrib
kurssattu_rm
format
=
commax17.2
length
=
8
informat
=
commax17.2
;
attrib
paluukd
format
=
8.
length
=
8
informat
=
8.
;
attrib
sqlkd
format
=
8.
length
=
8
informat
=
8.
;
attrib
arvonal_ltl_alle_1v
format
=
commax17.2
length
=
8
informat
=
commax17.2
;
attrib
arvonal_ltl_1_5v
format
=
commax17.2
length
=
8
informat
=
commax17.2
;
.
.
...
Lisää
SAS-
koodia
...
.
.
Slide6/* Jos valuutta ei ole liti, tehdään rahamääräälle valuuttamuunnos. */if valuutta_kdi
ne
'LTL'
then
do
;
valkd_in = valuutta_kdi;
valuutta_rm_in = arvonalent_val;
kurssattu_rm =
.
;
call
kurssaus_ltl
(valkd_in, valuutta_rm_in, kurssattu_rm,
kurssi_out, paluukd, sqlkd)
;
if
paluukd
ne
0
then
put
’VAROITUS: Poikkeus kurssauksessa '
paluukd= sqlkd= ’.’;
end
;
if
lopetus_pvm
eq
.
then
lopetus_pvm
=
0
;
/* Lasketaan laina-aika makrolla. */
%
maturiteetti(lopetus_pvm,avaus_pvm,vk,vv,kk,pp,pv0);
select
(valuutta_kdi);
when
(
'LTL'
)
do
;
select
;
when
(vv
eq
0
)
do
;
arvonal_ltl_alle_1v = arvonalent_val;
end
;
... SAS-koodi jatkuu...
run;
Slide7HASH Objekti”Taulukkotietorakenne”
Slide8data nimi_muutettu_3 nimi_muutettu_4
nimi_muutettu_5
nimi_muutettu_6
;
merge
suoherva.liikevaihto_12kk
(
in
=lv)
suoherva.sopimus_tapahtumat
(
in
=st)
;
by
pankki astun
;
attrib
sarake_55_rm
format
=
commax17.2
length
=
8
;
attrib
sarake_60_rm
format
=
commax17.2
length
=
8
;
if
(_n_ eq
1
)
then
do
;
* Luodaan hash-taulu konttorissa tehdyistä maksuista.;
declare
hash hmaksut(dataset:
”nimi_muutettu_sum"
);
hmaksut.defineKey(
"pankki"
,
"astun"
);
hmaksut.defineData(
"pankki"
,
"astun"
,
"kappalemaara"
,
"rahamaara"
);
hmaksut.defineDone();
* Luodaan hash-taulu omista varoista.; declare hash omatvara(ordered:
"a"
);
omatvara.defineKey(
"oytun"
,
"oyvol_luokitt1
"
);
omatvara.defineData(
"oytun"
,
"oyvol_luokitt1"
,
"oyvol_tietotyyppi"
,
"oyvol_rahamaara"
);
omatvara.defineDone
();
do
until
(eof_toy_vol);
set
kirjasto.toy_volyymit
(
keep
=oytun oyvol_luokitt1
oyvol_tietotyyppi
oyvol_rahamaara
)
end
=eof_toy_vol;
if
oyvol_tietotyyppi =
'CA'
and
oyvol_luokitt1 in(
'40'
,
'01'
)
and
substr(oytun,
7
,
4
) eq
'9000'
then
do
;
omatvara.add
();
end
;
end
;
end
;
Slide10pankki = substr(pankki,1,6);astun = astun;
rc = hmaksut.find();
select
(rc);
when
(
0
)
do
;
/* Asiakkaalle löytyi maksutoimeksiantoja. */
if
kappalemaara ge
12
then
do
;
/* Haetaan hash-taulusta pankkien omat varat. */
oytun = cats(pankki,
'9000'
);
oyvol_luokitt1 =
'40'
;
rc = omatvara.find();
select
(rc);
when
(
0
)
do
;
/* Haku onnistui. */
sarake_55_rm = oyvol_rahamaara;
end
;
when
(
160038
)
do
;
/*
Pankille ei löytynyt omia
varoja. Luokittelu 40.
*/
sarake_55_rm =
.
;
end
;
otherwise
do;
put
'VIRHE: Pankin omien varojen haku
hash-taulusta
epäonnistui
. Luokittelukoodi 40. '
pankki= rc
= ’.’;
put
'VIRHE: Ajo kaadetaan.'
;
abort
;
end
;
end
;
Slide11oyvol_luokitt1 = '01';
rc = omatvara.find();
select
(rc);
when
(
0
)
do
;
/* Haku onnistui. */
sarake_60_rm = oyvol_rahamaara;
end
;
when
(
160038
)
do
;
/* Pankille ei löytynyt omia varoja. Luokittelu 01. */
sarake_60_rm =
.
;
end
;
otherwise
do;
put
'VIRHE: Pankin omien varojen haku
hash-taulusta
epäonnistui
. Luokittelukoodi 01. '
pankki= rc=;
put
'VIRHE: Ajo kaadetaan.'
;
abort
;
end
;
end
;
end
;
else
do
;
output
nimi_muutettu_5;
end
;
end
;
Slide12when (
160038
)
do
;
/*
Asiakkaalle ei löytynyt maksutoimeksiantoja. */
output
nimi_muutettu_6;
end
;
otherwise
do;
/*
Ilmeisesti joku todellinen ongelma. Tehdään virhe. */
put
'VIRHE: Haku maksuliikkeen hash-taulusta epäonnistui. '
rc
=
'.'
;
abort
;
end
;
end
;
run
;