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