> MAP > エムウェブ9のつくりかた > 2回めまでにやっておきたいこと
すべてをここから始め、ここで終わらせる巨大なワンボディ。 情報を、ここに集め、ここを起点とし、ここで完結する「しくみ」で経営をまわす。 販売、仕入、受発注、精算、在庫、給与計算‥‥等々、 うじゃうじゃと散乱しがちな企業活動の業務処理を、 ひとつのデータベースに一元集約化しようという開発思想にもとづくERPライクなシステム。 それがエムウェブ。D do |
ルーチンを呼び出して実行する。 D IDT^uDT,ODT^uDT のように記述すると複数のルーチンを連続して実行させることができる。 また、 同一ルーチンの中で使った場合には、 D XYZ のようにラベル名 XYZ だけで呼び出して実行することができる。 また、 引数を省略する形式もあり、 その場合は、 I A=5 D . S X=1 . S Y=0 . W "OK" のように記述する。 この意味は、 I A=5 S X=1,Y=0 W "OK"s と記述するのと同じである。 だらだらと横長に記述したくないときに使うと便利なので使用頻度は高い。 |
E else |
IFとセットで使って、条件を満たさないときの処理を指定する。例えば、 I A=5 S B=1 E S B=0 のように記述する。 その意味は、「A の値が 5 なら、B に 1 をセットし、そうでないなら B に 0 をセットする」。 ここで、E のうしろにはスペースを2つ空ける(E には引数がない)ことに注意する。 E を使ううえで危険なのは、 I A=5 D X^RTN E D Y^RTN のような記述である。 一見、上の例と同じように見えるが、A=5 で X^RTN が実行されているあいだに、 その中で別の IF が使われていたりすると E の判定の意味が変わってしまうからである。 この危険は、次のように記述すると避けられることを理屈抜きで知っておこう。 I A=5 D . D X^RTN E D Y^RTN |
F for |
処理を繰り返して実行するときに使う。 F J=1:1:5 S P(J)=0 のように書くと、 「 J が 1 から始め、J に 1 ずつ加え、J が 5 になるまで P(J)=0 をセットする」という意味になる。 F J=1:1 S P(J)=0 Q:J>10 のように書くと、F の引数としては終了条件が与えられていないので、 「 J が 1 から始め、J に 1 ずつ加え、何度でもくりかえして P(J)=0 をセットする」という意味になってしまうが、 Q 命令によって、J>10で止められることになる。 ちなみに F は、引数を省略すると、いつまでも無限にくりかえして処理を実行することになる。 S J=0 F S J=J+1,P(J)=0 Q:J>10 となる。このときFのうしろにはスペースを2つ空けることに注意する。 また、これは F J=1:1 D Q:J>10 . S P(J)=0 のように記述しても同じ意味になるが、 このとき D のうしろにはスペースを2つ空けることに注意する。 |
G go |
指定するルーチンやラベルの位置へジャンプする。 G TOP^sSLIN のように記述すると、別のルーチンの指定するラベルの位置へ処理が移る。 同一ルーチンの中で使った場合には、 G XYZ のようにラベル名 XYZ だけで移動することができる。ローカル変数は、そのまま有効である。 |
I if |
命令を実行する際の条件を指定。 A=1、B=2、C=3 として、 I (A<B)&(B<C) S D=4 のように記述すると、「もし A が B より小さく、かつ、B が C より小さければ、D に 4 をセットする」という意味になる。 しかし、 I A<B,B<C S D=4 のように記述すると、「もし A が B より小さければ、次の条件判定に進み、B が C より小さければ、D に 4 をセットする」という意味になる。 どちらの記述でも結果としては成立して D=4 になるのだが、 後の記述では、条件が左から順に判定されるため A<B が真でなければ、B<C かどうかの評価は行われないということを知っておく。 つまり、 I A<B S:B<C D=4 と記述するのと同じ意味である。「または」の場合は、記述はひとつしかないので、こんなややこしいことは考えなくてよく、次のようにすればよい。 I (A<B)!(B<C) S D=4 |
K kill |
変数を削除する。どんな大きなデータベースも「あっ」というまに削除してしまうので実行には細心の注意が必要である。 ここにグローバル変数として、^DATA(1,1,1)、^DATA(1,1,2)、^DATA(1,1)、^DATA(1,2)、^DATA(1)、の5つがそれぞれ定義されているとして、 K ^DATA(1,1) のように記述すると、グローバル変数 ^DATA(1,1) と、その下位ノードがすべて削除されて、残りの変数は ^DATA(1) と ^DATA(1,2) となる。 K ^DATA(1) と記述すると、全部消えて何も残らないが、はじめに、^DATA=0 という上位ノードの定義があったとすれば、これは消されないことになる。 以上の理屈はグローバル変数でもローカル変数でも同じことであるが、 次のように引数なしでこのコマンドを使うと、 K すべてのローカル変数を削除するという意味になり、 K (A,B,C) のように記述すると、指定したローカル変数以外のすべてのローカル変数を削除するという意味になる。 |
M merge |
変数の構造ごと丸ごとコピーする。例えば、^X(1)=0、^X(1,1)=0、^X(1,2)=0、^X(1,1,1)=0、の4つの変数が定義されているとして、 M ^Y=^X のように記述すると、変数 ^Y の中味は、^Y(1)=0、^Y(1,1)=0、^Y(1,2)=0、^Y(1,1,1)=0 となる。また、 M ^Z(9)=^X のように記述すると、変数 ^Z の中味は、^Z(9,1)=0、^Z(9,1,1)=0、^Z(9,1,2)=0、^Z(9,1,1,1)=0 となり、 指定したノードの以下にそのままの階層がコピーされることがわかる。 また、ローカル変数とグローバル変数のいずれも同じ理屈で扱うことができ、 M W=^X(1) と記述すると、変数 W の中味は、W=0、W(1)=0、W(2)=0、W(1,1)=0、となる。 |
N new |
あるサブルーチンの中でローカル変数に対して使うと、そのサブルーチン内でのみ利用できるローカル変数とすることができる。 例えば、 N DATE とすると、このサブルーチンの実行以前に DATE=20020420 と定義されていたとしても、 このサブルーチン内では、新たなローカル変数として DATE を使うことができ、 このサブルーチンの処理が終わると、DATE の元の値 20020420 はそのまま有効になる。 N (DATE) と記述すると、このサブルーチン内では、DATE 以外のすべてのローカル変数が、このサブルーチンでのみ有効という意味になり、 このルーチンの前のルーチンから DATE 以外のローカル変数を受け取ることができないし、 このルーチンの次のルーチンに DATE 以外のローカル変数を引き渡すことができない。 なお、いずれの記述も、カンマで区切って複数のローカル変数を指定することができる。 |
Q quit |
D コマンドや F コマンドによる処理やルーチンを終了する。 引数のある場合は、外部関数として呼び出したときにその値を返す。 |
R read |
データを読みこむ。 R X:3 と記述すると、制限時間を指定したことになり、データ入力(または返り値など)を3秒待つ。 |
S set |
変数に値をセットする。 |
W write |
データを出力する。 W "Good morning!",!,"How are you?" と記述すると、 Good morning! How are you? という結果が得られる。 2つめの ! は、改行の意味である。 |
' | 否定(でない) |
+ | 足し算 |
- | 引き算 |
* | 掛け算 |
/ | 割り算 |
\ | 整数除算 |
# | 余り |
< | 小なり |
> | 大なり |
= | イコール |
[ | 含む |
? | パターン照合 |
_ | 連結 |
& | かつ |
! | または |
チュートリアル初日──2時間
チュートリアル2日め──2時間