愚者の経験

「また今度」はほとんどこない

月別アーカイブ: 4月 2014

[Access][VBA]今更…フォーム側のPrivate Functionはコントロールから直接Call可能だった…

これホントですか…
今まで標準モジュールに書いたPublic Functionしか呼べないと思ってました。
「RelayCommand」とか考えた意味なし…
まあ「見えないから使えない」と思い込んでいた私も悪いのですが…。

1.フォームデザインでコマンドボタン配置
call1

2.フォームのモジュールにPrivate Function記述
call2

3.フォームデザインでコマンドボタンのイベント→クリック時に記述
もちろん候補には出ない(出してほしい笑)
call3
call4

4.クリックすると実行される
call5

これみなさん知ってます?Access5年近く触っているけど気づきませんでした…。
ちなみにPublicにしたところで他のフォームのコントロールから呼べるかというとできないと思います。
イベントプロパティに「=[Forms]![フォーム1].TestCall()」等しても「指定した式の構文が正しくありません。」と怒られてしまいます…

またがる場合は標準モジュールにということだと思うことにします。

[SQL Server]ユーザーソース一覧を作る

バックエンドにSQLServerで開発しているときに
「ストアドとかビューとか関数とか何個あるか数えたい」
「あの列をSelectしてるストアドってどれ?」
「最近に修正したオブジェクトってなんだっけ?」
とか思うときがあります。

そうゆうときにあると非常に便利だと思うのが以下のビューです。
ストアド、ビュー、ユーザー定義関数のCreate文をデータにもってきてますので
Likeとかで検索できます。(definition列)

「それじゃテーブルも取得したいよ」と思ったのが運の尽き…
テーブルのCreate文って簡単に取得できないんですね…
後半はかなりやっつけなのであんまりあてにしないでください笑
PrimaryKey以外のIndex?
sys.indexesから頑張って取得してください…もう疲れました…

たぶんあっている
・列名
・データ型
・identity(seed,increment)
・rowguid
・計算列
・Null許可
・既定値

自信なし
・PrimaryKey

表示なし
・PrimaryKey以外のIndex
・付加列(当然です笑)

	select O.name
		,O.type_desc
		,O.create_date
		,O.modify_date
		,M.definition COLLATE Japanese_Bin as [definition]
	from sys.objects as O
		inner join sys.sql_modules as M on M.object_id=O.object_id
	where O.type_desc in 
			('SQL_STORED_PROCEDURE'
			,'SQL_SCALAR_FUNCTION'
			,'SQL_TABLE_VALUED_FUNCTION'
			,'VIEW')
	union all
	select T.name
		,T.type_desc
		,T.create_date
		,T.modify_date
		,'CREATE TABLE ['+D.TABLE_SCHEMA+'].['+T.name+']'+char(13)+char(10)+'('
			+(
				-- 列情報
				select '['+S.COLUMN_NAME+']'
					+coalesce
						((
							select ' AS '+P.definition+','
							from sys.computed_columns as P
							where P.object_id=C.object_id
								and P.column_id=C.column_id)
						,'['+S.DATA_TYPE+']'+isnull('('+cast(S.CHARACTER_MAXIMUM_LENGTH as varchar)+')','')
							+isnull((
							select ' IDENTITY('+cast(I.seed_value as varchar)
								+','+cast(I.increment_value as varchar)+')'
							from sys.identity_columns as I
							where I.object_id=C.object_id
								and I.column_id=C.column_id),'')
							+case when C.is_rowguidcol=1 then ' ROWGUIDCOL' else '' end
							+case when S.IS_NULLABLE='YES' then ' NULL,' else ' NOT NULL,' end)+char(13)+char(10)
				from information_schema.columns as S
					inner join sys.columns as C on C.name=S.COLUMN_NAME and C.object_id=T.object_id
				where TABLE_NAME=T.name
				order by ORDINAL_POSITION
				for xml path(''),type).value('.','varchar(max)')
			+isnull((
				-- PrimaryKey
				select ' CONSTRAINT ['+X.name+'] PRIMARY KEY '+X.type_desc+'('
					+replace((
						-- キー情報
						select '['+(select name from sys.columns
									where object_id=T.object_id and column_id=XC.column_id)+'] '
							+case when XC.is_descending_key=1 then 'DESC' else 'ASC,' end
						from sys.index_columns as XC
						where XC.object_id=T.object_id
						order by XC.index_column_id
						for xml path(''),type).value('.','varchar(max)')+') WITH ',',)',')')
					+'(PAD_INDEX='			+case when X.is_padded			=0 then 'OFF' else 'ON' end
					+',IGNORE_DUP_KEY='		+case when X.ignore_dup_key		=0 then 'OFF' else 'ON' end
					+',ALLOW_ROW_LOCKS='	+case when X.allow_row_locks	=0 then 'OFF' else 'ON' end
					+',ALLOW_PAGE_LOCKS='	+case when X.allow_page_locks	=0 then 'OFF' else 'ON' end
					+',STATISTICS_NORECOMPUTE=OFF) ON [PRIMARY]) ON [PRIMARY]'
				from sys.indexes as X
				where X.object_id=T.object_id
					and X.is_primary_key=1),'')
			+char(13)+char(10)+'GO'+char(13)+char(10)
			+isnull((
				-- 既定値の設定
				select 'ALTER TABLE ['+D.TABLE_SCHEMA+'].['+T.name+'] ADD CONSTRAINT '
					+'['+F.name+'] DEFAULT '+F.definition+' FOR '
					+'['+(select A.name from sys.columns as A
							where A.object_id=T.object_id and A.column_id=F.parent_column_id)+'] '
					+char(13)+char(10)+'GO'+char(13)+char(10)
				from sys.default_constraints as F
				where F.parent_object_id=T.object_id
				order by F.parent_column_id
				for xml path(''),type).value('.','varchar(max)'),'')
	from sys.tables as T
		inner join information_schema.tables as D on D.TABLE_NAME=T.name