LoginSignup
6
3

More than 3 years have passed since last update.

InterSystems IRIS ObjectScriptのプログラミング文法リスト

Last updated at Posted at 2018-11-26

この文章の目的

InterSystems IRIS Platformの中で使用される、オブジェクト指向データベース言語であるObjectScriptの文法書(リンク集)として役立つことを目的としています。C++、Java、VB.NETなど、オブジェクト指向言語に親しまれた方が「このように翻訳すればいいのか」と理解する助けになれば幸いです。

ObjectScript スタートアップ:(手早くコードを試す方法)

※テスト的に打ち込む画面:コンソール
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GTER_intro

素早くできる、ターミナルを使ったコマンドの基本的な試し方:

ターミナルにコマンドを直接打ち込む例 WRITE "Hello, IRIS! From Terminal",!
,!は、文字列の後ろで改行する、の意味(\nやvbCrLfと同じ)
image.png

ルーチンファイルの作り方:Studio->新規作成->ObjectScriptルーチンから(下図参照)
※コマンド行先頭は、必ずスペースを1文字以上入れる
ルーチンを名前を付けて保存(ここではHelloCache.MACとした)
ネームスペースの変更 ZNSPACE、文字列は""で囲む 例:ZNSPACE "MYUSER"(デフォルトではUSERになっている)
ルーチンの実行はDOコマンド、ルーチン名に^をつける例:DO ^HelloCache(.MACは不要)
image.png
実行画面
image.png

ルーチン(関数)として記述する方法
関数名は、スペースを「空けず」に(赤文字)記述する
ターミナルからは、関数名^ルーチン名と記述する 例:DO HelloCache^HelloCache2
image.png
image.png

ObjectScriptクラスの作成方法はこれをご覧ください

Classを作成した場合(ビルド→コンパイルをしてから使う)
image.png

ターミナルからUser.HelloCacheTestクラス内の関数を呼び出した例
DO ##class(User.HelloCacheTest).HelloCache()
image.png

OODBの根幹である基礎概念:Table:Field = Class:Property

image.png

(私がOODB概念全体を通じて最も重要であると考えているモデル説明の箇所)

参考:
IRIS Data Platform 2018.2 Japaneseドキュメントポータルの位置
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls

インターシステムズ・プログラミング・ツールの索引
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF

Hello, IRIS!(プロシージャ型)

HelloIRIS() Public
{
 WRITE "Hello, IRIS!"
}

Hello, IRIS!(ClassMethod型)

Class User.Main.ClassA Extends %Persistent 
ClassMethod HelloIRIS() PUBLIC
{
 WRITE "Hello, IRIS!"
}
}

オブジェクト指向言語としての文法解説

3.1.変数記述の基本

宣言(#dim)、大文字小文字の区別(ないものとあるものがあるが、基本的にはあるように記述すべき)

ClassA.cls

Class User.Main.ClassA Extends %Persistent
{
//%Persistentはデータベースへの永続的な保存ができるクラス
Property fielda As %Numeric;  //テーブルにfielda列が生成される、という意味でもある
Property fieldb As %String;

ClassMethod Func1() As %Integer
{
    #dim i As %Integer //変数とデータ型の記載の仕方
    i = 3
    QUIT i  //戻り値、Rerutn i;と同じ
}
}

スペース記法(先頭を1文字空ける、字下げ記法)

データ型

「一般的なデータ型クラス」

(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_proplit_available_cls
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_proplit#GOBJ_proplit_available_cls

数字型(%Numericなど)

整数型 %Integer
固定小数点型 %Decimal
固定小数点型 %Numeric
浮動小数点型(単精度) %Float
浮動小数点型(倍精度) %Double
小さい整数値 %SmallInt

データ型の変換

image.png

文字型(%String, "")

文字列 %String
検索可能な文字列 %Text
ODBCクエリ用文字列 %EnumString
EXACTの照合が行える文字列 %ExactString

LIST型($LIST(list,position, end))
 #dim lst
 #dim sublist
 Set lst = $LISTBUILD("ao","aka","ki","midori")
 Set subList = $LIST(lst,2,4) //"aka","ki","midori"が引き継がれる
 Write $LIST(sublist,2)  //表示に"ki"が出る

文字列操作演算(文字列結合(_)、代入、抽出、比較、切り出し、フィルタリング)リスト型(%List)

https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_strings
$LENGTH(str as %String) 文字列の長さを返す
$JUSTIFY(str as %String, num as %Integer) numだけ左にスペースを入れたstrを返す
$ZCONVERT(str as %String,convertType as %String) strをconvertTypeの形式へ変換
$FIND(str as %String, findstr as %String) str中にfindstrが含まれるか調べ、findstrの次の文字の位置を返す

Variant型(特に宣言をしない場合)
 #dim vari
定数(Const)
Parameter MYPARAMETER = "ABC" ; //コンパイルで確定、変更不能
四則演算子(+-*/、代入、AND OR、剰余、べき乗、計算規則、桁指定)

※「必ず左から右に演算される」ことに注意(乗除が加減よりも優先されない)
. オブジェクトのプロパティあるいはメソッドへのアクセス
() 配列インデックスあるいは関数の引数呼び出し
+ 加算 (2項)、正値 (単項)
減算 (2項)、負値 (単項)
* 乗算
/ 除算
\ 整数除算
** べき乗
# 剰余
_ 連結
' 論理補数 (NOT)
= 等価テスト、代入
'= 非等価テスト
> より大きい
'>
<= より大きくない (より小さい、あるいは等しい)
< より小さい
'<
>= より小さくない (より大きい、あるいは等しい)
[ 包含
] 追従
]] 前後関係
&
&& 論理 AND (&& は AND の“簡易版”)
!
|| 論理 OR (|| は OR の“簡易版”)
@ 間接演算
? パターン・マッチ
「演算子と式」
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_operators
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_intro#GCOS_intro_expressions
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_intro#GCOS_intro_expressions

記号についてのリファレンス(この項目はサンプルコードでの説明が必須)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_symbols
配列記法
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBAS_arrays
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_ch_cos#GORIENT_C82567
数字型と文字列型の相互変換
コメントの書き方(//, ///など)
// これ以降の行末までコメント
; これ以降の行末までコメント
/**/ 複数行にわたるコメント
/// クラス定義の説明に自動登録されるコメント
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_regexp#GCOS_regexp_comments
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_syntax_comments_int

(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_regexp#GCOS_regexp_comments

3.2.関数記述の基本

http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_intro#GCOS_intro_functions
ルーチンファイル記法
「呼び出し可能なユーザ定義コードモジュール」
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS_usercode

Method型

クラスインスタンスを必要とする関数

ClassMethod型

クラスインスタンスを必要としない関数

ストアドプロシージャ

元々「ストアドプロシージャ」という言葉は、データベースの中で特定の処理をまとめて行うために記述される関数を指す用語である
ストアドプロシージャの名前は、各ドメインで一意になるように指定すること
https://ja.wikipedia.org/wiki/ストアドプロシージャ
ClassMethod myfunc(dummy As %String) As %String [ SqlProc ][SqlProc]がポイント

User.Main.MyClassA
Class User.Main.MyClassA Extends %Persistent
{
ClassMethod CallMyName()
{
    Do ..MyName() //自分のクラス内のClassMethodを呼ぶ際には..で"Me"と同じ指定をする
}
ClassMethod MyName()
{
    Write "Called from User.Main.MyClassA",!
}
}
Do記法

$CLASSMETHOD(classname, methodname, Arg1, Arg2, Arg3, ... )methodnameを%Stringで決定できるので、ポリモーフィングに使用できる

 Do $CLASSMETHOD(User.Main.MyClassA,MyName) //戻り値が不要な場合
Set記法
 #dim res //Variant型に相当
 Set res = $CLASSMETHOD(User.Main.MyClassA,MyName) //戻り値が不要な場合

・引数(値渡し、参照渡し、デフォルト)
・戻り値(QUIT)

関数一覧

システム関数(=内部関数)
$name(parameters)宣言なしに使える、デフォルト値のある引数は省略可で、省略する引数の位置で, をつける
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS

3.3.繰り返し記法

Do-While文型
  #dim x
   SET x=1
   DO {
     WRITE !,"Loop Continue",x
     SET x=x+1
   } WHILE x<10
   WRITE !,"Loop Done"

For文型

(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBAS_statements#GBAS_statements_for
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cfor

初期値、増分、終了値での記述の仕方(間を:で区切る)

  #dim a
  #dim b
  #dim c 
  SET a=1,b=1,c=8
  FOR i=a:b:c {
     WRITE !,"count is ",i
    }

条件でBreakする形の記述

 #dim x
 SET x=8
  FOR { WRITE "Running loop x=",x,!
        SET x=x-1
        QUIT:x=3
      }
  WRITE "Next command after FOR code block"

3.4.条件分岐

If文
 #dim y
 IF y=1 { WRITE "y is 1" }
 ELSE { WRITE "y is not 1" }
While文
Case文
 #dim daynum as %Integer
 set daynum = 1
 WRITE $CASE(daynum,
              1:"Monday",2:"Tuesday",3:"Wednesday",
              4:"Thursday",5:"Friday",
              6:"Saturday",0:"Sunday",:"entry error") //Mondayが出力される

(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=GBAS_statements#GBAS_statements_if
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_cif

3.5.入出力関数

ファイル入出力
ObjectScriptルーチン内に記述したイメージ
image.png
(Cache' Local)
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF_file
(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=ITECHREF_file

%Fileクラス、Open、Write、WriteLine
 #dim file
 Set file=##class(%File).%New("C:\data\datafile.txt")
 Write file.Size
 Do file.Open("WSN")
 Do file.WriteLine("This is a line of text")
%Stream.FileCharacterクラス
Read、ReadLine、Write、WriteLine
  #dim stream //%Stream.FileCharacterインスタンスのための宣言
  #dim i
  #dim intId
  #dim extId
  #dim numSentS
  #dim sc //ステータスを戻す際の例文によく使われる変数名 
  Set stream=##class(%Stream.FileCharacter).%New() //ファイルインスタンスを生成
    Set sc=stream.LinkToFile("c:\data\NLPAndSourceIdCompare.txt") //出力用ファイルを指定して開く

  FOR i=srccnt:-1:1 {

   IF $DATA(result(i)) {
     SET intId = $LISTGET(result(i),1)   // sourceid
     SET extId = $LISTGET(result(i),2)
     SET numSentS = ##class(%iKnow.Queries.SentenceAPI).GetCountBySource(domId,result(i))
     Set sc = stream.WriteLine(intId_","_extId_","_numSentS) //ファイルの書き込み
   }
  } 
     Set sc = stream.%Save() //ファイルの保存
%CSVクラス
標準出力(コンソール出力)

3.6.構造体(クラス)

(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_ch_class

クラス記述 Class

##class(MyApp.MyClass)のように記述する

文法(ドット記法)

##class(MyApp.MyClass).PropertyNameのように、ドットで記述する

永続型(%Persistent)

基本となるデータ型には、ディスクストレージにデータを永続的に保存する%Persistentと、%Serial(クラス内にデータを埋め込む)、%Regisitered(通常のプログラムのように、メモリ上にのみ存在し、保存されないもの)の区別がある

ObjectScriptルーチン
ラベル(ルーチン内関数名に相当)

3.7.ObjectScriptクラス文法

上記に記載

Publicキーワード
Privateキーワード
Propertyキーワード(;記法に注意)
Methodキーワード
ClassMethodキーワード
Class Referenceの活用の仕方

3.8.データベース入出力

テキストファイル(csvなど)をIRIS DBにインポートする手法
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_impexp#GSQL_impexp_import

%New関数

(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT_object_object_features

 Set obj = ##class(MyApp.MyClass).%New()
データエントリーの仕方
 Set obj.MyValue = 10 //Propertyをドット記法で呼び出せる
%Save関数

(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persobj_saving

 Set sc = obj.%Save() //データベースの%Persistentに永続的に保存する
データ参照の仕方
%OpenId関数

(IRIS Web)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persobj#GOBJ_C80065

IDを指定して開く方法
 Set person = ##class(Sample.Person).%OpenId(10) //DB上の"1レコード"がpersonに渡されると考える(DBはロックされる)
データを検索して開く方法(SQL文法)

テーブルとクラスの命名変換規則
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_tables
WRITE $SYSTEM.SQL.DefaultSchema() 自分自身のSQLスキーマを取得する方法
※唯一の特殊例として、Userネームスペースの場合、SQLUserに自動変換されてしまう点は必ず言及する

ResultSetの使い方

フィールド数、フィールド名の取得の仕方

4 オブジェクト指向データベースの解説

Management Portalからのテーブル参照の方法
基礎概念:Table:Field = Class:Property

image.png

(私がOODB概念全体を通じて最も重要であると考えているモデル説明の箇所)

イベントードリブン記述

ObjectScriptクラス内に、Triggerサブルーチンを記述することで、そのクラス(テーブル)に変更が生じた際の処理を追加できる

Trigger UpdateTrigger [ Event = UPDATE, Time = AFTER ]
{
//必要な処理を記述する
}

Event =の後ろのキーワード例
DELETE — SQL DELETE 操作の間に起動
INSERT — SQL INSERT 操作の間に起動
UPDATE — SQL UPDATE 操作の間に起動
INSERT/UPDATE — SQL INSERT 操作または SQL UPDATE 操作の間に起動
INSERT/DELETE — SQL の挿入操作または削除操作の間に起動
UPDATE/DELETE — SQL の更新操作または削除操作の間に起動
INSERT/UPDATE/DELETE — SQL INSERT 操作、SQL UPDATE 操作、または SQL DELETE 操作の間に起動

Time =の後ろのキーワード例
BEFORE — イベントの前に起動(デフォルト)
AFTER — イベントの後に起動

トリガ定義について

ビジネスサービスの直接呼出しについて

Set-Get記法
継承

多重継承
複数クラスの継承
オーバーロード(サポートされていない、クラス内で複数の引数記述を可能にする方法、実態としては、Option引数の設定で行っている)
オーバーライド

ポリモーフィズム記法

5 データベースアクセスの方式

※GUIから簡単にSQLコマンドを試してみる方法
IRISアイコン→Management Portal -> ([システム・エクスプローラ] → [SQL])を開き、SQL文を書いて[クエリ実行] を押す

1..NET ObjectBinding形式(クラスライブラリ、クラスオブジェクトとして)

2.ODBC形式(InterSYstems.Data.IRISClientによる、IRISCommand、IRISParameterとIRISDataReaderの組み合わせ、SQL書式として)
Class User.Main.ClassA Extends %Persistent 
{
Property fielda as %Numeric;
Property fielda as %String;

}

これを呼び出すSQLコマンドは

SELECT fielda, fieldb FROM User_Main.ClassA //User.Main -> User_Mainになっていることに注意

.NETから呼び出す場合は

SubA.vb
Sub SubA()
    Public conn As IRISConnection
    Public command As IRISCommand
    Public reader As IRISDataReader
    conn = New IRISConnection
        conn.ConnectionString = "Server=localhost; Port=51773; " + "Namespace = TESTSAMPLES; " + "Password = yourpass; " + "User ID = yourid;"
        conn.Open() 'IRIS DBに接続

        Public iRISConnectStr As String
        str = "SELECT fielda, fieldb FROM User_Main.ClassA"
        command = New IRISCommand(str, conn)
        command.CommandType = CommandType.Text 'テキスト記述でSQLを渡す方法
        reader = command.ExecuteReader()

        reader.Read()
        '以下処理を追加
End Sub

https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=BSQG_prog
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=BSQG_odbc#BSQG_C10219

3.ActiveX形式(←初心者、Excelユーザには最も便利な形式)

http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=BLAX_parts#BLAX_parts_openobj
http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=BLAX_api
https://qiita.com/torisan_/items/226c319249e5d4fdc79e

Dynamic Binding方式
C++バインディング

5 応用編1

1.JSON形式での入出力方法

https://docs.intersystems.com/ens20171j/csp/docbook/DocBook.UI.Page.cls?KEY=GJSON
https://qiita.com/torisan_/items/9725c62d1ae7b3877519

2.REST形式での入出力

3.eXTreme形式での入出力

http://localhost:57772/csp/docbook/DocBook.UI.Page.cls?KEY=BXNT
https://qiita.com/torisan_/items/9725c62d1ae7b3877519

4.FHIRインターフェースの組み方

5.ExcelからActiveXを使ってアクセスする方法(Cache'系のみ)

NLP API

NLP=Natural Language Processing(自然言語解析)
https://docs.intersystems.com/iris20181j/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.iKnow

5.マルチモデル

C++ Binding

C++ -> ObjectScript
ObjectScript -> C++

Java Binding

Java -> ObjectScript
Java ゲートウェイの作成(Javaコードと、ObjectScriptでのプロキシクラスを作成し、接続する方法について)
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_javagateway

ObjectScript -> Java

Python Binding

Python -> ObjectScript
ObjectScript -> Python

.NET Binding

.NET -> ObjectScript
ObjectScript -> .NET
ObjectScript側にプロキシクラスを作成し、プロキシクラスを通じてdllを操作する
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_dotnetgateway
set gwyConn = ##class(%Net.Remote.Gateway).%New()
set status = gwyConn.%AddToCurrentClassPath(classpath)
set status = gwyConn.%Import("Person",,,,1)
set status = gwyConn.%Disconnect()

ADO Binding

ADO.NET は Microsoft .NET Framework によるデータ・アクセス・テクノロジ
https://docs.intersystems.com/iris20181j/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_adonet

6 IRISディベロッパーコミュニティの活用

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3