Uruchamianie procesu gotowego SAS w .NET

Zadanie: uruchomić proces gotowy SAS w ramach własnego programu w C#. Z dokumentacji wynika, że możemy wykorzystać StoredProcessService (patrz plik sas.chm w katalogu z instalacją SAS Integration Technologies*). Mamy dostępne dwie metody: Execute i ExecuteWithResults (która zwraca także wynik działania procesu). Parametrami wywołania są nazwa procesu gotowego w ramach repozytorium oraz oddzielana spacjami lista parametrów procesu z ich wartościami.

Tylko co to jest to repozytorium i jak je znaleźć?

Repozytorium to miejsce na serwerze SAS, w którym przechowywane są kody procesów gotowych. Kiedy uruchamiamy proces gotowy z poziomu Enterprise Guide lub Excela pokazujemy po prostu element w katalogu metadanych nie wiemy jak to się przekłada na mechanizmy wewnętrzne. Podglądając właściwości procesu w EG też za wiele się nie dowiemy. Jeśli nie mamy kogo zapytać o położenie repozytorium mamy poniższe możliwości.

Odczytanie z poziomu menedżera procesów gotowych

Najciemniej jest pod latarnią. W EG przeciągnij proces gotowy na Przebieg procesu, kliknij na nim prawym przyciskiem myszy i wybierz „Modyfikuj”. Nie przejmuj się komunikatem o braku uprawnień jeśli taki się pojawi, po prostu kliknij OK. Kiedy otworzy się okno Menedżera procesów gotowych wybierz sekcję „Opcje wykonywania”.

Repozytorium to wartość w polu „Ścieżka pliku źródłowego”, a nazwa pliku, którą musimy podać w wywołaniu StoredProcessService.Execute() to „nazwa pliku źródłowego”.

Dodatkowo w sekcji „Podpowiedzi” jest lista dostępnych parametrów procesu. W ramach wywołania procesu w kodzie używamy wartości z kolumny „Nazwa”.

Samodzielne wyszukanie w metadanych

Opcja ambitniejsza i może się przydać w przyszłości do automatyzacji własnych procesów – należy odpowiednio odpytać metadane SAS. Poniżej przykład kolejnych kroków do wykonania w EG, można też zastosować wywołania metod SAS Integration Technologies do uzyskania tych samych efektów (patrz np. Przeglądanie metadanych SAS używając C#). W metadanych poszukujemy elementu ClassifierMap (patrz np. Usage Scenario: Creating Metadata for a Stored Process). Do wyszukania informacji wykorzystamy trzy razy proc metadata.

Pobierz ID repozytorium

proc metadata
in='<GetRepositories>
    <Type>Repository</Type>
    </GetRepositories>';
run;

Ze zwróconego wyniku interesuje nas Repository[@Name="Foundation"]

<GetRepositories>
    <Type>Repository</Type>
    <Repositories>
        <Repository Id="A0000001.AXXXXXXX" Name="Foundation" Desc="" DefaultNS="SAS"/>
        <Repository Id="A0000001.AYYYYYYY" Name="BILineage" Desc="BILineage" DefaultNS="SAS"/>
    </Repositories>
</GetRepositories>

Pobierz Id elementu

Wykorzystujemy uzyskane wcześniej ID repozytorium i podajemy jako element szukany nazwę naszego procesu gotowego, którą znamy z katalogu metadanych. Stosujemy Flagę OMI_XMLSELECT (128), żeby móc skorzystać z opcji XMLSELECT.

proc metadata
in='<GetMetadataObjects>
    <Reposid>A0000001.AXXXXXXX</Reposid>
    <Type>ClassifierMap</Type>
    <Objects/>
    <NS>SAS</NS>
    <Flags>128</Flags>
    <Options>
        <XMLSELECT search="ClassifierMap[@Name=''TUTAJ NAZWA PROCESU GOTOWEGO Z METADANYCH'']" />
    </Options>
</GetMetadataObjects>';
run;

W wyniku otrzymamy identyfikator naszego elementu. Dzięki niemu możemy wyszukać zestaw interesujących nas danych z nim związanych. Poprzednie operacje były właśnie po to, żeby znaleźć Id elementu – wymaganego przy wyszukiwaniu za pomocą GetMetadata.

<GetMetadataObjects>
    <Reposid>A0000001.AXXXXXXX</Reposid>
    <Type>ClassifierMap</Type>
    <Objects>
        <ClassifierMap Id="AXXXXXXX.BXXXXXXX" Name="TUTAJ NAZWA PROCESU GOTOWEGO Z METADANYCH"/>
    </Objects>
    <NS>SAS</NS>
    <Flags>128</Flags>
    <Options>
        <XMLSELECT search="ClassifierMap[@Name='TUTAJ NAZWA PROCESU GOTOWEGO Z METADANYCH']"/>
    </Options>
</GetMetadataObjects>

Pobierz dane dotyczące repozytorium i nazwy pliku

Do pobrania tylko interesujących nas danych wykorzystamy szablon przeszukiwania. Można zamiast niego wybrać wszystko co się da i po kolei badać interesujące nas elementy zależne za pomocą kolejnych proc metadata, ale tak będzie szybciej. Wykorzystujemy flagi OMI_ALL_SIMPLE (8) – żeby pobrać wszystkie atrybuty elementów oraz OMI_TEMPLATE (4) – wykorzystanie szablonu.

proc metadata
in='<GetMetadata>
    <Metadata>
        <ClassifierMap Id="AXXXXXXX.BXXXXXXX" />
    </Metadata>
    <NS>SAS</NS>
    <Flags>12</Flags>
    <Options>
        <Templates>
            <ClassifierMap>
                <SourceCode />
            </ClassifierMap>

            <SourceCode>
                <File />
            </SourceCode>

            <File>
                <Directories />
            </File>
        </Templates>
    </Options>
</GetMetadata>';
run;

W wyniku otrzymujemy potrzebne informacje – repozytorium to Directory/@DirectoryName a nazwa pliku to File/@FileName.

<GetMetadata>
    <Metadata>
        <ClassifierMap Id="AXXXXXXX.BXXXXXXX" ChangeState="" Desc="" IsActive="1" IsHidden="0" IsUserDefined="0" LockedBy="" MetadataCreated="01Jan2014:10:00:00" MetadataUpdated="01Jan2014:10:00:00" Name="TUTAJ NAZWA PROCESU GOTOWEGO Z METADANYCH" PublicType="StoredProcess" TransformRole="StoredProcess" UsageVersion="1000000">
            <SourceCode>
                <File Id="AXXXXXXX.BXXXXXXY" ChangeState="" Desc="" FileExtension="" FileName="NAZWA_PLIKU_NA_SERWERZE.sas" IsARelativeName="1" IsHidden="0" LockedBy="" MetadataCreated="01Jan2014:10:00:00" MetadataUpdated="01Jan2014:10:00:00" Name="SP Source File" PublicType="" TextRole="" TextType="" UsageVersion="0">
                    <Directories>
<Directory Id="AXXXXXXX.BXXXXXYZ" ChangeState="" Desc="" DirectoryName="/lokalizacja/na/serwerze" DirectoryRole="" IsHidden="0" IsRelative="0" LockedBy="" MetadataCreated="01Jan2014:10:00:00" MetadataUpdated="01Jan2014:10:00:00" Name="SP Source Directory" PublicType="" UsageVersion="0"/>
                    </Directories>
                </File>
            </SourceCode>
        </ClassifierMap>
    </Metadata>
    <NS>SAS</NS>
    <Flags>12</Flags>
    <Options>
        <Templates>
            <ClassifierMap>
                <SourceCode/>
            </ClassifierMap>

            <SourceCode>
                <File/>
            </SourceCode>

           <File>
               <Directories/>
           </File>
       </Templates>
    </Options>
</GetMetadata>

Sprawdzenie właściwości procesu gotowego w DI Studio

Podobnie jak ze sprawdzaniem w EG, tylko że w DI Studio (bo może nie używamy EG). Po rozwinięciu katalogów metadanych naciskamy prawy przycisk myszy na nazwie procesu gotowego, wybieramy „Properties” i zakładkę „Wykonywanie”. Interesujące nas wartości są w polach „Repozytorium kodu źródłowego” i „Plik źródłowy”. Parametry procesu dostępne są (niespodzianka) w zakładce „Parametry”.

Uruchamiamy proces gotowy

Znając repozytorium i rzeczywistą nazwę pliku możemy uruchomić proces gotowy z poziomu .NET. W tym celu wywołujemy przykładowy kod z klasy SASEasyIOM:

//(fragment klasy SASEasyIOM)
public void SubmitStoredProcess(string repository, string storedProcess, string parameter)
{
    SASproc = mySAS.LanguageService.StoredProcessService;
    SASproc.Repository = "file:" + repository;
    SASproc.Execute(storedProcess, parameter);
}

//(wywołanie kodu)
string storedProcessRepository = "/tu/katalog/na/serwerze";
string storedProcessFilename = "nazwa_pliku_z_procesem_gotowym.sas";
string storedProcessParameters = "PARAM1=VALUE1 PARAM2=VALUE2";

mySasCon.SubmitStoredProcess(storedProcessRepository, storedProcessFileName, storedProcessParameters);

* U mnie to: C:\Program Files\SAS\SharedFiles\Integration Technologies

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s