<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Thema "Aufruf von Java aus SAS/SCL und SAS Macro geht nicht? Geht doch!" in CoDe SAS German</title>
    <link>https://communities.sas.com/t5/CoDe-SAS-German/Aufruf-von-Java-aus-SAS-SCL-und-SAS-Macro-geht-nicht-Geht-doch/m-p/234031#M1804</link>
    <description>&lt;P&gt;Hallo,&lt;/P&gt;
&lt;P&gt;bei Xing entdeckt:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.xing.com/communities/posts/aufruf-von-java-aus-sas-strich-scl-und-sas-macro-geht-nicht-geht-doch-1010444908" target="_blank"&gt;https://www.xing.com/communities/posts/aufruf-von-java-aus-sas-strich-scl-und-sas-macro-geht-nicht-geht-doch-1010444908&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Der Xing-Beitrag enthält aber auch nur diesen Link:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.bde-gmbh.de/tipps-tricks/sas/call-java-methods-from-sasscl-sasmacro-and-of-course-from-a-sas-data-step/" target="_blank"&gt;https://www.bde-gmbh.de/tipps-tricks/sas/call-java-methods-from-sasscl-sasmacro-and-of-course-from-a-sas-data-step/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Es sah interessant aus, vielleicht ist es für den ein oder die andere nützlich.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße&lt;/P&gt;
&lt;P&gt;Hans&lt;/P&gt;</description>
    <pubDate>Tue, 10 Nov 2015 15:28:00 GMT</pubDate>
    <dc:creator>basefan</dc:creator>
    <dc:date>2015-11-10T15:28:00Z</dc:date>
    <item>
      <title>Aufruf von Java aus SAS/SCL und SAS Macro geht nicht? Geht doch!</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Aufruf-von-Java-aus-SAS-SCL-und-SAS-Macro-geht-nicht-Geht-doch/m-p/234031#M1804</link>
      <description>&lt;P&gt;Hallo,&lt;/P&gt;
&lt;P&gt;bei Xing entdeckt:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.xing.com/communities/posts/aufruf-von-java-aus-sas-strich-scl-und-sas-macro-geht-nicht-geht-doch-1010444908" target="_blank"&gt;https://www.xing.com/communities/posts/aufruf-von-java-aus-sas-strich-scl-und-sas-macro-geht-nicht-geht-doch-1010444908&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Der Xing-Beitrag enthält aber auch nur diesen Link:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.bde-gmbh.de/tipps-tricks/sas/call-java-methods-from-sasscl-sasmacro-and-of-course-from-a-sas-data-step/" target="_blank"&gt;https://www.bde-gmbh.de/tipps-tricks/sas/call-java-methods-from-sasscl-sasmacro-and-of-course-from-a-sas-data-step/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Es sah interessant aus, vielleicht ist es für den ein oder die andere nützlich.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße&lt;/P&gt;
&lt;P&gt;Hans&lt;/P&gt;</description>
      <pubDate>Tue, 10 Nov 2015 15:28:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Aufruf-von-Java-aus-SAS-SCL-und-SAS-Macro-geht-nicht-Geht-doch/m-p/234031#M1804</guid>
      <dc:creator>basefan</dc:creator>
      <dc:date>2015-11-10T15:28:00Z</dc:date>
    </item>
    <item>
      <title>Re: Aufruf von Java aus SAS/SCL und SAS Macro geht nicht? Geht doch!</title>
      <link>https://communities.sas.com/t5/CoDe-SAS-German/Aufruf-von-Java-aus-SAS-SCL-und-SAS-Macro-geht-nicht-Geht-doch/m-p/234158#M1805</link>
      <description>&lt;P&gt;Hallo Hans,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;in SAS 9.4 gibt es die Funktion dusobul(), die es ermöglicht, SAS Base-Code in einem zweiten Thread auszuführen. Mit dieser Methode können Makro-Methoden (als Wrapper) geschrieben werden, die einerseits Base-Code abschicken, andererseits aber einen Rückgabewert haben. So kann sowohl aus der Makro-Sprache als auch aus der SCL indirekt auf Java-Objekte zugegriffen werden.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hier ein Beispiel mit einer ganz einfachen Java-Klasse:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;public class Test001 {

  public String lastName = "#no lastname given#";
  public String firstName = "#no firstname given#";
  public int    age = 0;

  public String toString() {
    return ("this is " + firstName + " " + lastName + ", age of " + age);
  }

  public static void main (String[] args) {
    Test001 obj = new Test001();
    obj.lastName  = "TestLastName";
    obj.firstName = "TestFirstName";
    obj.age       = 999;
    System.out.println(obj);
  }
}&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Die Klasse muss kompiliert und der CLASSPATH entsprechend gesetzt werden, damit SAS die Klasse finden kann.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Im folgenden Makro wird ein String mit dem eigentlichen Data Step gebildet: Das Java Objekt wird instantiiert und die Methode aufgerufen. Der Rückgabewert der Methode wird in eine lokale Makro-Variable geschrieben. Dann wird das Programm mit %Sysfunc(dosubl()) ausgeführt und das Ergebnis wird als Rückgabewert der Makro-Funktion in den Input-Stack zurückgeschrieben.&lt;/P&gt;
&lt;P&gt;Der Aufruf erfolgt dann direkt im %Put-Statement, so dass der Rückgabewert in das LOG geschrieben wird.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%Macro java(class,method,type=String);&lt;BR /&gt;&amp;nbsp; %Local pgm rc result;&lt;BR /&gt;&amp;nbsp; %Let pgm=%Str(&lt;BR /&gt;&amp;nbsp; Data _Null_;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Length string $256;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Declare javaObj obj1("Test001");&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = obj1.call&amp;amp;type.Method("&amp;amp;method",string);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj1.delete();&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call Symput("result",string);&lt;BR /&gt;&amp;nbsp; Run;&lt;BR /&gt;&amp;nbsp; );&lt;BR /&gt;&amp;nbsp; %Let rc = %Sysfunc(dosubl(&amp;amp;pgm));&lt;BR /&gt;&amp;nbsp; &amp;amp;result&lt;BR /&gt;%Mend;
%Put NOTE: Using java in a macro: %java(Test001,toString,type=String);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Ergebnis ist:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;479  %Put NOTE: Using java in a macro: %java(Test001,toString,type=String);
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


NOTE: Using java in a macro: this is #no firstname given# #no lastname given#, age of 0
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In der SCL kann der Data Step natürlich in einem Submit-Block direkt aufgerufen werden, hier ist aber auch dosubl() möglich oder der Zugriff auf das schon vorhandene Makro mit Hilfe von resolve(). Hier Beispiele für die beiden letzteren Varianten:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;Init:                                                                                                                                   
  Dcl char(1024) pgm string, num rc;                                                                                                    
                                                                                                                                        
  pgm = '%java(Test001,toString,type=String)';                                                                                           
                                                                                                                                        
  string = resolve(pgm);                                                                                                                 
                                                                                                                                        
  put "NOTE: SCL Aufruf des Makros mit resolve() " string;                                                                                                                                                                                                          
                                                                                                                                        
  pgm = cats("Data _Null_;",                                                                                                            
             "Length string $256;",                                                                                                     
             "Declare javaObj obj1(""Test001"");",                                                                                      
             "rc = obj1.callStringMethod(""toString"",string);",                                                                        
             "obj1.delete();",                                                                                                          
             "Call Symput(""result"",string);",                                                                                         
             "Run;");                                                                                                                   
                                                                                                                                        
  Call Symput("result","-1");                                                                                                           
  rc = dosubl(pgm);                                                                                                                     
                                                                                                                                        
  string = symget("result");                                                                                                            
                                                                                                                                        
  Put "NOTE: SCL direkter Aufruf von dosubl() " string;                                                                                 
                                                                                                                                        
  Call Symdel("result");                                                                                                                
                                                                                                                                        
Return;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Auch hier die Ergebnise:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;NOTE: Compiling TEST.SCL.
NOTE: Code generated for TEST.SCL. Code size=1440.

NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


NOTE: SCL Aufruf des Makros mit resolve()  this is #no firstname given# #no lastname given#, age of 0
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


NOTE: SCL direkter Aufruf von dosubl()  this is #no firstname given# #no lastname given#, age of
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Eine andere Frage ist allerdings, ob das ganze performant ist, denn für jeden Methodenaufruf muss die Java-Klasse neu instantiiert werden, und für Methoden mit Parametern muss dann auch entsprechender Aufwand betrieben werden.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Vielleicht ist an dieser Stelle die ebenfalls neue Prozedur Proc Lua interessant, die eine direkte Schnittstelle zu der hochperformanten Programmiersprache LUA anbietet (&lt;A href="https://de.wikipedia.org/wiki/Lua" target="_self"&gt;Wikipedia&lt;/A&gt;, &lt;A href="http://support.sas.com/resources/papers/proceedings15/SAS1561-2015.pdf" target="_self"&gt;SGF 2015 Paper&lt;/A&gt;). hier geht SAS den umgekehrten Weg und stellt in Proc Lua die SAS-Funktionen direkt zur Verfügung.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Wie immer bietet SAS also eine Vielzahl von Möglichkeiten - und mit jeder neuen (Sub-) Version kommen neue hinzu&amp;nbsp; &lt;span class="lia-unicode-emoji" title=":zwinkerndes_Gesicht:"&gt;😉&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Viele Grüße,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Grischa&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 11 Nov 2015 09:00:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/CoDe-SAS-German/Aufruf-von-Java-aus-SAS-SCL-und-SAS-Macro-geht-nicht-Geht-doch/m-p/234158#M1805</guid>
      <dc:creator>GrischaPfister</dc:creator>
      <dc:date>2015-11-11T09:00:53Z</dc:date>
    </item>
  </channel>
</rss>

