Join Now

Juletip #5 (2) – Makro til simpel brug af parametre/styredata/forretningsregler

by SAS Employee jbk_sas on ‎12-04-2014 08:49 AM (322 Views)

Ho, Ho, Ho - Her kommer yderligere et juletip, så I ikke skal snydes for en god gang SAS makro kode denne fredag :-)

Makroen er meget simpel, men kan være yderst anvendelig.

Jeg lavede for et stykke tid siden en ganske simpel lille macro som jeg siden hen har haft stor glæde af. Makroen hjælper med nemt at hente parametre til brug i f.eks. DI-jobs og STP'er fra en generel parametertabel.

I forbindelse med nogle nøgletals-projekter havde vi brug for et sted at samle diverse parametre, der dels skulle bruges i DI-jobs og dels i rapporteringen (STP).

Disse parametre var forholdsvis statiske, men der skulle alligevel være mulighed for at en systemadministrator let kunne tilrette dem.

Samtidig var der tale om mange forskelligartede parametre, så det gav ikke mening at oprette særskilte styretabeller. Desuden skulle det være nemt i udviklingsfasen at tilføje nye parametre.

Alle parameterværdier samles i en (eller flere) parametertabeller. Nedenfor er vist et udsnit af en af disse parametertabeller.

Makroen (her med det mundrette navn: hentGenerelVaerdi) kaldes, når der skal bruges en parameterværdi. Et kald kan f.eks. se således ud:

   where upcase(type) = %hentGenerelVaerdi(HR,FORSIDE_OPDAT_DATO_TYPE);

Her ønsker vi for området "HR" (dvs. HR's styretabel) at hente parameteren "FORSIDE_OPDAT_DATO_TYPE".

Makroen kan kaldes fra f.eks. DI-jobs og STP'er (så længe den er placeret i et fælles autocall library). Bemærk at makroen udelukkende indeholder ren makro-kode, og kan således kaldes fra f.eks. en where-betingelse.

Det skal bemærkes at vi i projekterne desuden opererer med en række specifikke styretabeller, mens makroen er en måde at samle alle de parametre som vi ikke ville oprette en separate tabeller for.

Makroen:

/***********************************************************************************/

/* Hent værdi fra generel styretabel                                               */

/*                                                                                 */

/* Parametre:                                                                      */

/*           omr: område (f.eks. VAADM)                                            */

/*           key: nøgle der skal hentes værdi for                                  */

/*                                                                                 */

/* Bemærk: Hvert område har egen tabel hardcoded):                                 */

/*                                                                                 */

/* Dato       Hvem                    Hvad                                         */

/* ---------- ----------------------- -------------------------------------------- */

/* 24.06.2010 Jesper Høgh Bager (SAS) Initialcoding                                */

/***********************************************************************************/

%macro hentGenerelVaerdi(omr,key);
   %if "&omr" EQ "HR" %then
   %do;
      %let rc = %sysfunc( libname( DMHR_GUI, !Projekter\HR_Portal\data\Masterdata\gui ) );
      %let generel_styretabel=DMHR_GUI.HR_generel_styretabel;
   %end;
   %let dsid = %sysfunc( open( &generel_styretabel ( where = ( upcase( key ) EQ %upcase( "&key" ) ) ), i));
   %let rc = %sysfunc( fetch( &dsid ) );
   %let value = %sysfunc( getvarc( &dsid, %sysfunc( varnum( &dsid, VALUE ) ) ) );
   %let rc = %sysfunc( close( &dsid ) );
   &value
%mend;

Udsnit af styretabel:


Nøgle (kolonnenavn: key  length: 200)


Beskrivelse
 
(kolonnenavn: desc  key  length: 1000)


Værdi (karakterværdi) (kolonnenavn: value  length: 2000)


BEHOLD_INST


SD institutioner som skal beholdes på grunddatamart niveau


'ES' 'FK' 'FS' 'GS' 'HA' 'OD' 'OH' 'OL' 'ON' 'OO' 'PS' 'SØ' 'T' 'VB' 'VD' 'VJ' 'VN' 'VR' 'ÅS'


ORGMAP_SD_HR_SOURCECODE_WHR


Wherebetingelse for udvalg af SD sourcekoder til HR's orgmap applikation


INST in ('ON' 'OO' 'VN' 'VR' 'OL') or (INST EQ 'VJ' and afdeling NE '43BA')


LOENART_SYG


Sygdom består af følgende lønarter (fraværsårsager)


'525' '590' '526' '790'


LOENART_BARSEL


Barselsrelateret fravær består af følgende lønarter (fraværsårsager)


'570' '780' '770'


LOENART_BØRNE


Børnerelateret fravær består af følgende lønarter (fraværsårsager)


'910' '771' '772'


ANSAETFORM_GRP_ORD


Ordinært ansattes ansættelsesformer (ansaetform)


'00' '01' '02'


ANSAETFORM_GRP_ELE


Elevers ansættelsesformer (ansaetform)


'06'


ANSAETFORM_GRP_TIL


Ansatte med tilskuds ansættelsesformer (ansaetform)


'07' '11' '62' '68' '69'


SYGEFRAVAER_WHR


Afgrænsning til aggregerede sygefraværsdata (til indikatorer)


ansaetgrp EQ 'ORD' and delt = '0'


FORSIDE_OPDAT_DATO_TYPE


Angiver typer af data der skal styre seneste realiserede periode og dermed perioden (ÅTD) på forsiden (f.eks. FRAVÆR).


'FRAVÆR'


PERSOMS_WHR


Afgrænsning af data til personaleomsætningsrapportering


delt in ( '0', '1' ) and ANSAETFORM in ( '00', '01', '02' )


 

Selve tabellen kan eksempelvis i udviklingsfasen dannes og vedligeholdes som i nedenstående programeksempel (eksempel fra et andet projekt):

   libname ctrl 'D:\sas\data';

   data ctrl.VA_ADM_generel_styretabel;

      length key   $ 200

          value $ 1000

          desc  $ 2000

   ;

   label  key   = 'KEY: nøgle der laves opslag på'

          value = 'VALUE: værdi der returneres'

          desc  = 'Beskrivelse (anvendes ikke i programmerne)'

   ;

   key = 'METADATA_TOPNODES';   value = "'JB' 'JF'";     desc = "URI'er for topnoderne i metadatafolderstrukturen"; output; 

   key = 'LOG_PATH';            value = "D:\SAS\Logs";   desc = "Sti til logfiler dannet i applikationen"; output;

   key = 'DIRECTORY_SEPARATOR'; value = "\";             desc = "Adskillertegn mellem foldere"; output;

   key = 'PACKAGE_ROOT_PATH';   value = "D:\sasfolders"; desc = "Sti til roden, hvor spk-pakkerplaceres"; output;

   run;

Og her endnu et eksempel på to kald til makroen (som i dette projekt er døbt vam_get_value):

   packageFile  = "%vam_get_value(VAADM,PACKAGE_ROOT_PATH)" !! translate( '/' !! strip( path ) , "%vam_get_value(VAADM,DIRECTORY_SEPARATOR)", '/' ) !!

God december :-)

Mvh Jesper