SAS Macro Libraryの開発/管理/運用
田村 洋介
臨床統計･プログラミング部
アストラゼネカ株式会社

2006/12/1

はじめに

SAS Macro好き

SAS言語以外の経験
2006/12/1

本日の内容…の前に…

2

本日の目的

事例紹介...….懇親会で問題点の解決策を教えてもらう..….

新機能の提案...…一人だと心細いので皆さんの反応をうかがう..….

2006/12/1

では、本日の内容…

3

本日の内容

報告 / Report
目標 / Goal したこと / Done
 できなかったこと / Homework

言い訳、泣き言、責任転嫁 / Garbage 提案、お願い、まる投げ / Request
 まとめ / Conclusion

2006/12/1

では、早速…その前に…

4

環境/前提条件
環境Windows 2000
 SAS 8.2
 Office 2000


前提条件
SASでのMacro作成経験
 SASで他人が作ったMacroの使用経験

2006/12/1

成果物としては…

5成果物

汎用SAS Macro集=SAS Macro Library
2006/12/1

では、最初は5W2Hから…

6

報告 / Report 5W2H








Word出力用のMacroの取り扱いを、部門内で明確にするため。

SAS Programmerとして、仕事ができないので、合法的に人のProgram Codeを頂こうと思い立ち

How(どのように)


私が管理者として
SAS Macro Libraryの開発/管理/運用を
2004/08頃から部門ファイルサーバでWho(誰が)What(何を)When(いつ)Where(どこで)Why(なぜ)SASの上級者/部門ファイルサーバの管理者に相談しながら、

How Much(いくらで)

2006/12/1

特に、新規のインフラ等はなく、その時あるもので掛かった時間は….プライスレス ?

目標設定から確認…

7

目標 / Goal どんなSAS Macro Library?
ISO9126
ソフトウェアの品質

http://www.ogisri.co.jp/otc/hiroba/technical/JavaPress_I
SO9126/index.html

2006/12/1

重すぎるのでもっと軽めに…

8

目標 / Goal どんなSAS Macro Library?

簡単に！
安心して！
楽しく！
2006/12/1

誰にとって? …

9

目標 / Goal 簡単に!
Macroの開発者

Macroの利用者



事前の準備/作業なしで使用方法/使用するべき個所/範囲がすぐ判る



明確で有用な開発/標準化
手法がある
面倒な規則や冗長な手続きがない

Libraryの管理者


管理作業が簡単にできる利用者/作成者が規則にしたがっているか、簡単に確認できる

2006/12/1

じゃあ安心は? …

10

目標 / Goal 安心して!
Macroの開発者

Macroの利用者


Fool-Proofにできている副作用がすぐわかる
サポート

追跡性の確保
 有限責任 他 の Macro を 使 用 し た
場合の正確性

Libraryの管理者

追跡性の確保 Fool-Proofにできているサポート
 有限責任

2006/12/1

楽しく???…

11

目標 / Goal 楽しく!
Macroの開発者

Macroの利用者


煩雑な作業/嫌な作業を軽減してくれるおもしろい機能/動作が実装されている

使われているかが判る Feedbackが受けやすい

インセンティブが明示的に存在する

Libraryの管理者

使われているかが判る
 利用者/開発者からFeedbackが受けやすい

2006/12/1

インセンティブが明示的に存在するで、実際は…

12

したこと / Done 方針

規則少なめで!
覚えるのが大変 チェックするのが大変

スコープは小さく!
2006/12/1

問題を発生させない< < <発生したら影響する範囲を特定できる

管理者が作成したものは…

13

したこと / Done 生成物
Macroの利用/作成/Validation手法に関する規則


readme.doc

MacroのValidation用テンプレート
ValidationTemplateforSASMacro CIMNo6

保管場所/Access権の設定
 Macroの命名に関するガイドラインNamingRule.txt

副産物は後ほど

2006/12/1

まず、規則から…

14

Macroの登録/公開方法♪♪♪

要望

使用フォルダMacro
登録

登録/開発用フォルダ

公開用フォルダOK!

2006/12/1

OK!

Macroの作り方は…

15

Macroの作成方法


マクロ名:C̲*********(任意)01(Version番号)
1Macro/1ファイル
ヘッダーに、Macroの仕様をすべて記述するMacroHeader.sas


管理情報


作成日付、作成者、更新日、更新者、SASVersion

仕様
機能、目的、パラメタの説明、Macroの履歴、参照先
 制限事項、必要事項、事前準備、禁則事項
 パラメタ以外で、そのMacroによって設定/作成される以下を記述




2006/12/1

Macro中で使用しているMacroRead/Write/UpdateされるLocal/Global macro変数
Global option/Goption
一時的なデータセット/変数
Libname指定、 Filename指定
外部ファイル

実行例

Validationってどうするの?…

16MacroのValidation方法/テンプレート
Validation Plan
Macroの想定される使用状況、重要性に基づき、Validation方法を選択
 レビュー/ロジカルチェック/出力のチェック/ダブルプログラミング

Test Script Document
具体的なチェック方法と期待される結果をプランとして記述
 Macroを実行して、結果を記録し、期待される結果と比較して、問題ないか検討する

User Report
Macroを実行して、結果を記録する
 問題/要望があれば、記録しておく

関連文書や、実行結果も保管

Validation Report
上記のファイルを元に、最終的なValidation結果を記録する
 今後、予想される機能拡張や問題点も記録しておく

2006/12/1

めんどくさいけど、慣れました…あとは…

17

保管場所/Access権の設定/その他
保管場所


Access権の設定


部門ファイルサーバにSAS Macro Libraryを作成
Library 管理者のみ、すべてにRead/Write
Library 管理者以外は、登録/開発用フォルダのみRead/Write、それ以外はRead

その他




SAS Macro Library中のMacroをすべて一括で指定したフォルダにCopyするScript
MacroがVersionUpした場合、古いMacroを、Copyしているか、管理者が一括でチェックしるためのScript
SAS Macro Libraryへの要望を出すための
MailForm Excelファイル

2006/12/1

Namingは大事なんだけど…

18

Macroの命名に関するガイドラインあくまで提案、強制でなく現在もメンテナンス中…(一番難しい)
以下の為の命名規則







Macro名/ Macro パラメタ名
Write/UpdateされるLocal/Global macro変数
一時的なデータセット/変数
Libname指定、 Filename指定
外部ファイル中間生成物か最終成果物か

2006/12/1

使用しても良い省略形
名前の統一
Prefix/Suffix
処理の範囲を明示

で、現在に至ります…

19現在
Macro数

使用中:34個 in 25機能
開発中:8機能

Programmer：9人



作成者
3人/9人
Validation経験者 5人/9人
利用者
11人?/9人(解析担当者も2人使用しているため)

副産物




SAS Macro Library以外の部門ファイルサーバのフォルダ構造の標準化
コーディングガイドライン
SAS Macro 以外の為のValidation用
プロセス定義 テンプレート

2006/12/1

個人的には…

Skill Up!!!が一番の副産物ですが…

20

できなかったこと / Homework○
Macroの 事前の準備/作業なしで利用者サポート△
副作用がすぐわかる
おもしろい機能/動作が実装されている

煩雑な作業/嫌な作業を軽減してくれる
Macroの 面倒な規則や冗長な手続 明確で有用な開発/標準
開発者 きがない化手法がある
追跡性の確保
有限責任×
使用方法/使用するべき個所/範囲がすぐ判る
Fool-Proofにできている

他のMacroを使用した場
合の正確性
インセンティブが明示的に存在する
使われているかが判る

利用者/開発者からFeedbackが受けやすい
Library 管理作業が簡単にできる 利用者/作成者が規則に インセンティブが明示的の管理者
したがっているか、簡単 に存在するに確認できる
追跡性の確保有限責任
使われているかが判る
利用者/開発者からFeedbackが受けやすい

2006/12/1

で、一応対策検討中です…

21

今後の対策

副作用がすぐわかる

使用方法/使用するべき個所/範囲がすぐ判る



サポート担当者にValidation担当者も加える

使われているかが判る
インセンティブが明示的に存在する


Newsletter等を発行する?

有限責任




命名ガイドラインに取り込む

おもしろい機能/動作が実装されている

仕様書の書き方に追加する/危険度を評価する

Macro呼び出しが記述されているProgramを検索して、ランキングする
ランキングに基づき、上司に報告する/お菓子をやり取りする

明確で有用なMacro開発/標準化手法


2006/12/1

定期的に見直すことをプロセスに組み込む?

積み残しが…

22

言い訳、泣き言、責任転嫁 / Garbage


明確で有用なMacroの開発/標準化手法


そもそもSAS Program用の開発/標準化手法がない全員に対して“明確で有用な開発/標準化手法”は難しい






SAS言語の教育から始めるべき?

利用者/作成者が規則にしたがっているか他のMacroを使用した場合の正確性
Fool-Proofにできている

問題があったら実行を止める/元の状態に戻せる

Programを読んで、実行して、Logと結果を詳細に見ないと判らない
MacroのパラメタやDataに基づいて作成/指定される値のチェック 特定の条件下で問題があるのに、エラーがなく実行できる

Macroの機構上パラメタの型や、値のチェックが煩雑/難しい Macro間での、Macro変数/データセット/変数の安全な受け渡しが難しい

2006/12/1

煩雑で、且つ効果的でない=開発効率が下がる

残った課題へ挑戦?…

23

規則/Fool-Proof/他のMacro

通常のSAS開発環境単独で対応するのは難しい
パラメタの制限不能Sample1.sas
 Macro変数のスコープの制御が難しいSample2.SAS








%let/Call symputかでも動作が変わる

Macro展開時/実行時Errorのハンドリング

SAS Macroって自由すぎ!
制限すれば?


AF等を使用して、Macroを利用するシステム
Ex) Ph.Clinical / ETL Server / SAS® Drug Development

MacroにParameterを与えるInterfaceを提供する
 ヒューマンエラーは減らせる
 そもそもMacro化する必要がない?
2006/12/1

いや、自由は本来いいものでしょ…

24提案、お願い、まる投げ / Request


SASへのお願い

Global/Local Macro変数の制御の厳密化
再帰処理のサポート
パラメタの制限用の型導入
Macro展開時/実行時Error発生をトリガとする、Error制御用ステートメントの追加…ではなく

SASの得意なところを伸ばして欲しい

もっと自由を!
2006/12/1

で、 SASの得意なところって?…

25SASの得意なところ

SASの得意なところ

Macro変数、オプション等の環境変数の公開


理解しやすいMacro機構


他言語では、メモリ上にのみ存在
他言語では、効率化の為の機能は、精通しないと理解が難しい

互換性
他言語より互換性をかなり重視してくれている 追加される機能は、新しいステートメント、新しい予約語、新関数、新オブジェクトで実行される
V9では
 *****Z関数、 *****X関数(ROUNDZ FLOORZ VVALUEX ) ％Copy Call Symputx / SYMEXIST / SYMGLOBL / SYMLOCAL

2006/12/1

Macro変数のスコープの制御に使える!

改めてSASへのお願いです…

26

提案、お願い、まる投げ / Request

Macro変数に関してMacro変数をGlobal/Local等のどのスコープに作成するか指定できる
Macro変数をGlobal/Local等のどのスコープから読むか指定できる
上記を禁止できる

Macroに関して


新DictionaryTable
Macroのパラメタ情報が格納されたDictionaryTable MacroのProgramが格納されたDictionaryTable

Macroのデバッグに関して

2006/12/1

Mprint / Mlogic / Symbolgen等によるLogでの確認だけでなく、Macroの生成した最終的なProgramが、データセット/カタログに出力される

詳しく説明しますと…

27

Macro変数に関してSample3.sasMacro変数をGlobal/Local等のどのスコープに作成するか指定できる%let ステートメントを拡張する
 あわせてCall Symputxも拡張する

Macro変数をGlobal/Local等のどのスコープから読むか指定できる
Macro中での読み取りのスコープを指定できる
 %Symbol ****;デフォルトはGlobal



上記を禁止できる

前Versionとの互換性を考慮してMacro中で禁止できるステートメント
 禁止するオプション指定


Macro 変 数 の ス コ ー プ の 問 題 一 挙 解決!!!

2006/12/1

続いて…

28

Macroに関してPlan.xls Sample4.sas
 新DictionaryTable


VMPARAM VMPROG

Macroのパラメタ情報が格納されている
MacroのProgramが格納されている

V9で％Copy機能を使えば、 MacroのProgramを呼び出せるので、ありえそう

Macroのパラメタのチェック、Validationに使える
 Macroを動的に生成!
 一部のパラメタを固定して Macro中の特定の部分を置換して

2006/12/1

かなり自由にしてしまったので…

29

Macroのデバッグに関して
Sample5.sas 新オプション/ODSの新機能


Mprint / Mlogic / Symbolgen等によるLogでの確認だけでなく、Macroの生成した最終的なProgramが、データセット/カタログに出力されるMacro関連の新機能を追加して、ますますMacroのデバッグが難しくなるであろうことから

Macroをデバッグが効率的に!
 Macroの学習も効率的に!
2006/12/1ということで皆さんへのお願いです…

30

皆さんへの要望

ご意見あれば是非!
SAS Programの開発/標準化手法
 Macroの開発/標準化手法
 本日の提案に


教えて下さいSASへの要望の挙げ方
Yousuke.Tamura@astrazeneca.com


2006/12/1

結論ですが…

31

まとめ / Conclusion
人の作ったMacroを見ると、勉強になる/各人の違いに気がつく 問題点も、協力して解決 / 解決できなくても共有
 SAS Macro Libraryの開発/管理/運用は


2006/12/1

ご清聴ありがとうございました…

32