研究開発

はじめてのVectorScript

第7章 データベース

ここでいうデータベースとは、レコードを図形に付加し、条件を元に検索したりデータを集計するVectorworksの機能のことです。
普段手動でやっている、レコードフォーマットの作成や、図形へのレコードの付加、データの入力などをスクリプトでやってみましょう。

・新規レコードの作成

PROCEDURE Example701;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );
END;
Run( Example701 );

リソースパレットをダブルクリックしてレコードフォーマットを作る作業は

NewField(recName, fieldName : STRING; fieldValue : DYNARRAY of CHAR; fType, fFlag : INTEGER);

を使います。
すでにレコードが存在する場合には、フィールドが追加されます。


・図形にレコードを連結する

PROCEDURE Example702;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );
END;
Run( Example702 );

図形にレコードを連結するには、

SetRecord(h : HANDLE; record : STRING);

を使います。

・レコードフィールドにデータを入力する

PROCEDURE Example703;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );

	SetRField( LNewObj, 'フォーマット-1', '型番', 'C-3PO' );
	SetRField( LNewObj, 'フォーマット-1', '価格', '29800' );
	SetRField( LNewObj, 'フォーマット-1', '付属品', 'FALSE' );
END;
Run( Example703 );

レコードフィールドにデータを入力するには、

SetRField(h : HANDLE; record, field : STRING; value : DYNARRAY of CHAR);

を使います。

・レコードフィールドのデータを取得する
PROCEDURE Example704;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );

	SetRField( LNewObj, 'フォーマット-1', '型番', 'C-3PO' );
	SetRField( LNewObj, 'フォーマット-1', '価格', '29800' );
	SetRField( LNewObj, 'フォーマット-1', '付属品', 'FALSE' );

	Message( GetRField( LNewObj, 'フォーマット-1', '型番' ) );
END;
Run( Example704 );

レコードフィールドのデータを取得するには、

GetRField(h : HANDLE; record, field : STRING):DYNARRAY of CHAR;

を使います。


・図形のレコードを削除する
PROCEDURE Example705;
BEGIN
	NewField( 'フォーマット-1', '型番', 'R2-D2', 4, 0 );
	NewField( 'フォーマット-1', '価格', '39800', 1, 0 );
	NewField( 'フォーマット-1', '付属品', 'TRUE', 2, 1 );

	Rect( 0, 0, 10, 10 );
	SetRecord( LNewObj, 'フォーマット-1' );

	SetRField( LNewObj, 'フォーマット-1', '型番', 'C-3PO' );
	SetRField( LNewObj, 'フォーマット-1', '価格', '29800' );
	SetRField( LNewObj, 'フォーマット-1', '付属品', 'FALSE' );

	DelRecord( LNewObj, 'フォーマット-1' );
END;
Run( Example705 );

図形のレコードを削除するには、

DelRecord(h : HANDLE; name : STRING);

を使います。

・ワークシートのデータベース機能と連動させる

PROCEDURE Example706;
VAR
	fieldNum, ii : INTEGER;
	WSHandle : HANDLE;
	theStr, fieldNameStr : STRING;
BEGIN
	fieldNum := NumFields( GetObject( 'フォーマット-1' ) );
	WSHandle := CreateWS( 'WSフォーマット-1', 2, fieldNum );

	theStr := '=DATABASE((R IN [''フォーマット-1'']))';
	SetWSCellFormulaN( WSHandle, 2, 0, 2, 0, theStr );

	FOR ii := 1 TO fieldNum DO
	BEGIN
		fieldNameStr := GetFldName( GetObject( 'フォーマット-1' ), ii );
		SetWSCellFormulaN( WSHandle, 1, ii, 1, ii, fieldNameStr );
		theStr := Concat( '=''フォーマット-1''.''', fieldNameStr, '''' );
		SetWSCellFormulaN( WSHandle, 2, ii, 2, ii, theStr );
	END;

	RecalculateWS( WSHandle );
	ShowWS( WSHandle, TRUE );

END;
Run( Example706 );

レコードを作ったあとは、集計用のワークシートを作りましょう。
手動でデータベース用ワークシートを作る手順と似ていますが、レコードフィールドの登録は同じことの繰り返しなのでFOR文で行います。

まず、ワークシートをデータベース化するには、手動の場合に一番左の列で右ボタンを押して「データベース」を選びますよね?アレをします。
SetWSCellFormulaNを使って、0列目に検索条件を入れます。そのためには、ワークシート関数DATABASEを使います。
=DATABASE()のかっこの中に、レコードの名前を指す(R IN ['レコード名'])を入れるとデータベースとしての検索機能が働きます。
1行目にはレコード内のレコードフィールド名を列ごとに入れますが、

NumFields(h : HANDLE):INTEGER;

を使ってレコード内のフィールドレコード数を数えておきます。そして、FOR文にてfieldNum回繰り返します。
レコード名は、

GetFldName(h : HANDLE; index : INTEGER):STRING;

を使ってレコードに付いているフィールド名をとってきて、ii列目に入れます。
データベース行には、='フォーマット-1'.'フィールド名'を列ごとに入れます。
最後にワークシートの再計算をするために、

RecalculateWS(worksheet : HANDLE);

を使います。