1
/**/
/*
2
建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。
3
请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。
4
为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。
5
*/
6
USE
test
7
GO
8![None.gif](/Images/OutliningIndicators/None.gif)
9
IF
EXISTS
(
SELECT
NAME
FROM
SYSOBJECTS
WHERE
XTYPE
=
'
U
'
AND
NAME
=
'
卷烟库存表
'
)
10
DROP
TABLE
卷烟库存表
11
GO
12
IF
EXISTS
(
SELECT
NAME
FROM
SYSOBJECTS
WHERE
XTYPE
=
'
U
'
AND
NAME
=
'
卷烟销售表
'
)
13
DROP
TABLE
卷烟销售表
14
GO
15![None.gif](/Images/OutliningIndicators/None.gif)
16
--
业务规则:销售金额 = 销售数量 * 销售单价 业务规则。
17
18
CREATE
TABLE
卷烟销售表
19
(
20
卷烟品牌
VARCHAR
(
40
)
PRIMARY
KEY
NOT
NULL
,
21
购货商
VARCHAR
(
40
)
NULL
,
22
销售数量
INT
NULL
,
23
销售单价
MONEY
NULL
,
24
销售金额
MONEY
NULL
25
)
26
GO
27![None.gif](/Images/OutliningIndicators/None.gif)
28
--
业务规则:库存金额 = 库存数量 * 库存单价 业务规则。
29
30
CREATE
TABLE
卷烟库存表
31
(
32
卷烟品牌
VARCHAR
(
40
)
PRIMARY
KEY
NOT
NULL
,
33
库存数量
INT
NULL
,
34
库存单价
MONEY
NULL
,
35
库存金额
MONEY
NULL
36
)
37
GO
38![None.gif](/Images/OutliningIndicators/None.gif)
39
--
创建触发器,示例1
40
41![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
42
创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。
43
说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
44
触发器功能: 强制执行业务规则,保证插入的数据中,库存金额 = 库存数量 * 库存单价。
45
注意: [INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。
46
重要: 这两个系统表的结构同插入数据的表的结构。
47
*/
48
IF
EXISTS
(
SELECT
NAME
FROM
SYSOBJECTS
WHERE
XTYPE
=
'
TR
'
AND
NAME
=
'
T_INSERT_卷烟库存表
'
)
49
DROP
TRIGGER
T_INSERT_卷烟库存表
50
GO
51![None.gif](/Images/OutliningIndicators/None.gif)
52
CREATE
TRIGGER
T_INSERT_卷烟库存表
53
ON
卷烟库存表
54
FOR
INSERT
55
AS
56
--
提交事务处理
57
BEGIN
TRANSACTION
58
--
强制执行下列语句,保证业务规则
59
UPDATE
卷烟库存表
60
SET
库存金额
=
库存数量
*
库存单价
61
WHERE
卷烟品牌
IN
(
SELECT
卷烟品牌
from
INSERTED)
62
COMMIT
TRANSACTION
63
GO
64![None.gif](/Images/OutliningIndicators/None.gif)
65![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
66
针对[卷烟库存表],插入测试数据:
67
注意,第一条数据(红塔山新势力)中的数据符合业务规则,
68
第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,
69
第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。
70
第四条数据库存数量为0。
71
请注意在插入数据后,检查[卷烟库存表]中的数据是否 库存金额 = 库存数量 * 库存单价。
72
*/
73![None.gif](/Images/OutliningIndicators/None.gif)
74
INSERT
INTO
卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)
75
SELECT
'
红塔山新势力
'
,
100
,
12
,
1200
UNION
ALL
76
SELECT
'
红塔山人为峰
'
,
100
,
22
,
NULL
UNION
ALL
77
SELECT
'
云南映像
'
,
100
,
60
,
500
UNION
ALL
78
SELECT
'
玉溪
'
,
0
,
30
,
0
79
GO
80![None.gif](/Images/OutliningIndicators/None.gif)
81
--
查询数据
82
83
SELECT
*
FROM
卷烟库存表
84
GO
85![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
86![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
87
结果集
88![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
89
RecordId 卷烟品牌 库存数量 库存单价 库存金额
90
-------- ------------ -------- ------- ---------
91
1 红塔山新势力 100 12.0000 1200.0000
92
2 红塔山人为峰 100 22.0000 2200.0000
93
3 云南映像 100 60.0000 6000.0000
94
4 玉溪 0 30.0000 .0000
95![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
96
(所影响的行数为 4 行)
97![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
98
*/
99![None.gif](/Images/OutliningIndicators/None.gif)
100
--
触发器示例2
101
102![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
103
创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。
104
说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
105
触发器功能: 实现业务规则。
106
业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。
107
否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。
108
*/
109
IF
EXISTS
(
SELECT
NAME
FROM
SYSOBJECTS
WHERE
XTYPE
=
'
TR
'
AND
NAME
=
'
T_INSERT_卷烟销售表
'
)
110
DROP
TRIGGER
T_INSERT_卷烟销售表
111
GO
112![None.gif](/Images/OutliningIndicators/None.gif)
113
CREATE
TRIGGER
T_INSERT_卷烟销售表
114
ON
卷烟销售表
115
FOR
INSERT
116
AS
117
BEGIN
TRANSACTION
118
--
检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
119
IF
NOT
EXISTS
(
120
SELECT
库存数量
121
FROM
卷烟库存表
122
WHERE
卷烟品牌
IN
(
SELECT
卷烟品牌
FROM
INSERTED)
123
)
124
BEGIN
125
--
返回错误提示
126
RAISERROR
(
'
错误!该卷烟不存在库存,不能销售。
'
,
16
,
1
)
127
--
回滚事务
128
ROLLBACK
129
RETURN
130
END
131![None.gif](/Images/OutliningIndicators/None.gif)
132
IF
EXISTS
(
133
SELECT
库存数量
134
FROM
卷烟库存表
135
WHERE
卷烟品牌
IN
(
SELECT
卷烟品牌
FROM
INSERTED)
AND
136
库存数量
<=
0
137
)
138
BEGIN
139
--
返回错误提示
140
RAISERROR
(
'
错误!该卷烟库存小于等于0,不能销售。
'
,
16
,
1
)
141
--
回滚事务
142
ROLLBACK
143
RETURN
144
END
145![None.gif](/Images/OutliningIndicators/None.gif)
146
--
对合法的数据进行处理
147
148
--
强制执行下列语句,保证业务规则
149
UPDATE
卷烟销售表
150
SET
销售金额
=
销售数量
*
销售单价
151
WHERE
卷烟品牌
IN
(
SELECT
卷烟品牌
FROM
INSERTED)
152![None.gif](/Images/OutliningIndicators/None.gif)
153
DECLARE
@卷烟品牌
VARCHAR
(
40
)
154
SET
@卷烟品牌
=
(
SELECT
卷烟品牌
FROM
INSERTED)
155![None.gif](/Images/OutliningIndicators/None.gif)
156
DECLARE
@销售数量
MONEY
157
SET
@销售数量
=
(
SELECT
销售数量
FROM
INSERTED)
158![None.gif](/Images/OutliningIndicators/None.gif)
159
UPDATE
卷烟库存表
160
SET
库存数量
=
库存数量
-
@销售数量
,
161
库存金额
=
(库存数量
-
@销售数量
)
*
库存单价
162
WHERE
卷烟品牌
=
@卷烟品牌
163
COMMIT
TRANSACTION
164
GO
165![None.gif](/Images/OutliningIndicators/None.gif)
166
--
请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。
167
--
针对[卷烟销售表],插入第一条测试数据,该数据是正常的。
168
169
INSERT
INTO
卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
170
SELECT
'
红塔山新势力
'
,
'
某购货商
'
,
10
,
12
,
1200
171
GO
172![None.gif](/Images/OutliningIndicators/None.gif)
173
--
针对[卷烟销售表],插入第二条测试数据,该数据 销售金额 不等于 销售单价 * 销售数量。
174
--
触发器将自动更正数据,使 销售金额 等于 销售单价 * 销售数量。
175
176
INSERT
INTO
卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
177
SELECT
'
红塔山人为峰
'
,
'
某购货商
'
,
10
,
22
,
2000
178
GO
179![None.gif](/Images/OutliningIndicators/None.gif)
180
--
针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在 卷烟库存表中找不到对应。
181
--
触发器将报错。
182
183
INSERT
INTO
卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
184
SELECT
'
红河V8
'
,
'
某购货商
'
,
10
,
60
,
600
185
GO
186![None.gif](/Images/OutliningIndicators/None.gif)
187![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
188
结果集
189
服务器: 消息 50000,级别 16,状态 1,过程 T_INSERT_卷烟销售表,行 15
190
错误!该卷烟不存在库存,不能销售。
191
*/
192![None.gif](/Images/OutliningIndicators/None.gif)
193
--
针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在 卷烟库存表中库存为0。
194
--
触发器将报错。
195
196
INSERT
INTO
卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
197
SELECT
'
玉溪
'
,
'
某购货商
'
,
10
,
30
,
300
198
GO
199![None.gif](/Images/OutliningIndicators/None.gif)
200![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
201
结果集
202
服务器: 消息 50000,级别 16,状态 1,过程 T_INSERT_卷烟销售表,行 29
203
错误!该卷烟库存小于等于0,不能销售。
204
*/
205
--
查询数据
206
SELECT
*
FROM
卷烟库存表
207![None.gif](/Images/OutliningIndicators/None.gif)
208
SELECT
*
FROM
卷烟销售表
209
GO
210![None.gif](/Images/OutliningIndicators/None.gif)
211![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/*
212
补充:
213
1、本示例主要通过一个简单的业务规则实现来进行触发器使用的说明,具体的要根据需要灵活处理;
214
2、关于触发器要理解并运用好 INSERTED ,DELETED 两个系统表;
215
3、本示例创建的触发器都是 FOR INSERT ,具体的语法可参考:
216![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
217
Trigger语法
218![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
219
CREATE TRIGGER trigger_name
220
ON { table | view }
221
[ WITH ENCRYPTION ] --用于加密触发器
222
{
223
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
224
[ WITH APPEND ]
225
[ NOT FOR REPLICATION ]
226
AS
227
[ { IF UPDATE ( column )
228
[ { AND | OR } UPDATE ( column ) ]
229
[
n ]
230
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
231
{ comparison_operator } column_bitmask [
n ]
232
} ]
233
sql_statement [
n ]
234
}
235
}
236![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
237
4、关于触发器,还应该注意
238
(1)、DELETE 触发器不能捕获 TRUNCATE TABLE 语句。
239
(2)、触发器中不允许以下 Transact-SQL 语句:
240
ALTER DATABASE CREATE DATABASE DISK INIT
241
DISK RESIZE DROP DATABASE LOAD DATABASE
242
LOAD LOG RECONFIGURE RESTORE DATABASE
243
RESTORE LOG
244
(3)、触发器最多可以嵌套 32 层。
245![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
246
*/
247![None.gif](/Images/OutliningIndicators/None.gif)
248
--
修改触发器
249
--
实质上,是将 CREATE TRIGGER
修改为 ALTER TRIGGER
即可。
250
251
--
删除触发器
252
DROP
TRIGGER
xxx
253
GO
254![None.gif](/Images/OutliningIndicators/None.gif)
255
--
删除测试环境
256
DROP
TABLE
卷烟库存表
257
GO
258
DROP
TABLE
卷烟销售表
259
GO
260
DROP
TRIGGER
T_INSERT_卷烟库存表
261
GO
262
DROP
TRIGGER
T_INSERT_卷烟销售表
263
GO
264![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/**----------------------------------------------------------------------
265
##################################################################
266
触发器的基础知识和例子
267
:create trigger tr_name
268
on table/view
269
{for | after | instead of } [update][,][insert][,][delete]
270
[with encryption]
271
as {batch | if update (col_name) [{and|or} update (col_name)] }
272![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
273
说明:
274
1 tr_name :触发器名称
275
2 on table/view :触发器所作用的表。一个触发器只能作用于一个表
276
3 for 和after :同义
277
4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别
278
After
279
在触发事件发生以后才被激活,只可以建立在表上
280
Instead of
281
代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上
282
5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一
283
6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响,
284
所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。
285
7 触发器执行时用到的两个特殊表:deleted ,inserted
286
deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一
287
样的,只是存放 的数据有差异。
288![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
289
续
290
下面表格说明deleted 与inserted 数据的差异
291
deleted 与inserted 数据的差异
292
Inserted
293
存放进行insert和update 操作后的数据
294
Deleted
295
存放进行delete 和update操作前的数据
296
注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后
297
的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中
298
---------------------------------------------------------------------------*/
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
2
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
3
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
4
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
5
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
6
![None.gif](/Images/OutliningIndicators/None.gif)
7
![None.gif](/Images/OutliningIndicators/None.gif)
8
![None.gif](/Images/OutliningIndicators/None.gif)
9
![None.gif](/Images/OutliningIndicators/None.gif)
10
![None.gif](/Images/OutliningIndicators/None.gif)
11
![None.gif](/Images/OutliningIndicators/None.gif)
12
![None.gif](/Images/OutliningIndicators/None.gif)
13
![None.gif](/Images/OutliningIndicators/None.gif)
14
![None.gif](/Images/OutliningIndicators/None.gif)
15
![None.gif](/Images/OutliningIndicators/None.gif)
16
![None.gif](/Images/OutliningIndicators/None.gif)
17
![None.gif](/Images/OutliningIndicators/None.gif)
18
![None.gif](/Images/OutliningIndicators/None.gif)
19
![None.gif](/Images/OutliningIndicators/None.gif)
20
![None.gif](/Images/OutliningIndicators/None.gif)
21
![None.gif](/Images/OutliningIndicators/None.gif)
22
![None.gif](/Images/OutliningIndicators/None.gif)
23
![None.gif](/Images/OutliningIndicators/None.gif)
24
![None.gif](/Images/OutliningIndicators/None.gif)
25
![None.gif](/Images/OutliningIndicators/None.gif)
26
![None.gif](/Images/OutliningIndicators/None.gif)
27
![None.gif](/Images/OutliningIndicators/None.gif)
28
![None.gif](/Images/OutliningIndicators/None.gif)
29
![None.gif](/Images/OutliningIndicators/None.gif)
30
![None.gif](/Images/OutliningIndicators/None.gif)
31
![None.gif](/Images/OutliningIndicators/None.gif)
32
![None.gif](/Images/OutliningIndicators/None.gif)
33
![None.gif](/Images/OutliningIndicators/None.gif)
34
![None.gif](/Images/OutliningIndicators/None.gif)
35
![None.gif](/Images/OutliningIndicators/None.gif)
36
![None.gif](/Images/OutliningIndicators/None.gif)
37
![None.gif](/Images/OutliningIndicators/None.gif)
38
![None.gif](/Images/OutliningIndicators/None.gif)
39
![None.gif](/Images/OutliningIndicators/None.gif)
40
![None.gif](/Images/OutliningIndicators/None.gif)
41
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
42
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
43
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
44
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
46
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
47
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
48
![None.gif](/Images/OutliningIndicators/None.gif)
49
![None.gif](/Images/OutliningIndicators/None.gif)
50
![None.gif](/Images/OutliningIndicators/None.gif)
51
![None.gif](/Images/OutliningIndicators/None.gif)
52
![None.gif](/Images/OutliningIndicators/None.gif)
53
![None.gif](/Images/OutliningIndicators/None.gif)
54
![None.gif](/Images/OutliningIndicators/None.gif)
55
![None.gif](/Images/OutliningIndicators/None.gif)
56
![None.gif](/Images/OutliningIndicators/None.gif)
57
![None.gif](/Images/OutliningIndicators/None.gif)
58
![None.gif](/Images/OutliningIndicators/None.gif)
59
![None.gif](/Images/OutliningIndicators/None.gif)
60
![None.gif](/Images/OutliningIndicators/None.gif)
61
![None.gif](/Images/OutliningIndicators/None.gif)
62
![None.gif](/Images/OutliningIndicators/None.gif)
63
![None.gif](/Images/OutliningIndicators/None.gif)
64
![None.gif](/Images/OutliningIndicators/None.gif)
65
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
66
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
67
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
68
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
69
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
70
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
71
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
72
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
73
![None.gif](/Images/OutliningIndicators/None.gif)
74
![None.gif](/Images/OutliningIndicators/None.gif)
75
![None.gif](/Images/OutliningIndicators/None.gif)
76
![None.gif](/Images/OutliningIndicators/None.gif)
77
![None.gif](/Images/OutliningIndicators/None.gif)
78
![None.gif](/Images/OutliningIndicators/None.gif)
79
![None.gif](/Images/OutliningIndicators/None.gif)
80
![None.gif](/Images/OutliningIndicators/None.gif)
81
![None.gif](/Images/OutliningIndicators/None.gif)
82
![None.gif](/Images/OutliningIndicators/None.gif)
83
![None.gif](/Images/OutliningIndicators/None.gif)
84
![None.gif](/Images/OutliningIndicators/None.gif)
85
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
86
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
87
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
88
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
89
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
90
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
91
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
92
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
93
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
94
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
95
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
96
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
97
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
98
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
99
![None.gif](/Images/OutliningIndicators/None.gif)
100
![None.gif](/Images/OutliningIndicators/None.gif)
101
![None.gif](/Images/OutliningIndicators/None.gif)
102
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
103
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
104
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
105
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
106
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
107
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
108
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
109
![None.gif](/Images/OutliningIndicators/None.gif)
110
![None.gif](/Images/OutliningIndicators/None.gif)
111
![None.gif](/Images/OutliningIndicators/None.gif)
112
![None.gif](/Images/OutliningIndicators/None.gif)
113
![None.gif](/Images/OutliningIndicators/None.gif)
114
![None.gif](/Images/OutliningIndicators/None.gif)
115
![None.gif](/Images/OutliningIndicators/None.gif)
116
![None.gif](/Images/OutliningIndicators/None.gif)
117
![None.gif](/Images/OutliningIndicators/None.gif)
118
![None.gif](/Images/OutliningIndicators/None.gif)
119
![None.gif](/Images/OutliningIndicators/None.gif)
120
![None.gif](/Images/OutliningIndicators/None.gif)
121
![None.gif](/Images/OutliningIndicators/None.gif)
122
![None.gif](/Images/OutliningIndicators/None.gif)
123
![None.gif](/Images/OutliningIndicators/None.gif)
124
![None.gif](/Images/OutliningIndicators/None.gif)
125
![None.gif](/Images/OutliningIndicators/None.gif)
126
![None.gif](/Images/OutliningIndicators/None.gif)
127
![None.gif](/Images/OutliningIndicators/None.gif)
128
![None.gif](/Images/OutliningIndicators/None.gif)
129
![None.gif](/Images/OutliningIndicators/None.gif)
130
![None.gif](/Images/OutliningIndicators/None.gif)
131
![None.gif](/Images/OutliningIndicators/None.gif)
132
![None.gif](/Images/OutliningIndicators/None.gif)
133
![None.gif](/Images/OutliningIndicators/None.gif)
134
![None.gif](/Images/OutliningIndicators/None.gif)
135
![None.gif](/Images/OutliningIndicators/None.gif)
136
![None.gif](/Images/OutliningIndicators/None.gif)
137
![None.gif](/Images/OutliningIndicators/None.gif)
138
![None.gif](/Images/OutliningIndicators/None.gif)
139
![None.gif](/Images/OutliningIndicators/None.gif)
140
![None.gif](/Images/OutliningIndicators/None.gif)
141
![None.gif](/Images/OutliningIndicators/None.gif)
142
![None.gif](/Images/OutliningIndicators/None.gif)
143
![None.gif](/Images/OutliningIndicators/None.gif)
144
![None.gif](/Images/OutliningIndicators/None.gif)
145
![None.gif](/Images/OutliningIndicators/None.gif)
146
![None.gif](/Images/OutliningIndicators/None.gif)
147
![None.gif](/Images/OutliningIndicators/None.gif)
148
![None.gif](/Images/OutliningIndicators/None.gif)
149
![None.gif](/Images/OutliningIndicators/None.gif)
150
![None.gif](/Images/OutliningIndicators/None.gif)
151
![None.gif](/Images/OutliningIndicators/None.gif)
152
![None.gif](/Images/OutliningIndicators/None.gif)
153
![None.gif](/Images/OutliningIndicators/None.gif)
154
![None.gif](/Images/OutliningIndicators/None.gif)
155
![None.gif](/Images/OutliningIndicators/None.gif)
156
![None.gif](/Images/OutliningIndicators/None.gif)
157
![None.gif](/Images/OutliningIndicators/None.gif)
158
![None.gif](/Images/OutliningIndicators/None.gif)
159
![None.gif](/Images/OutliningIndicators/None.gif)
160
![None.gif](/Images/OutliningIndicators/None.gif)
161
![None.gif](/Images/OutliningIndicators/None.gif)
162
![None.gif](/Images/OutliningIndicators/None.gif)
163
![None.gif](/Images/OutliningIndicators/None.gif)
164
![None.gif](/Images/OutliningIndicators/None.gif)
165
![None.gif](/Images/OutliningIndicators/None.gif)
166
![None.gif](/Images/OutliningIndicators/None.gif)
167
![None.gif](/Images/OutliningIndicators/None.gif)
168
![None.gif](/Images/OutliningIndicators/None.gif)
169
![None.gif](/Images/OutliningIndicators/None.gif)
170
![None.gif](/Images/OutliningIndicators/None.gif)
171
![None.gif](/Images/OutliningIndicators/None.gif)
172
![None.gif](/Images/OutliningIndicators/None.gif)
173
![None.gif](/Images/OutliningIndicators/None.gif)
174
![None.gif](/Images/OutliningIndicators/None.gif)
175
![None.gif](/Images/OutliningIndicators/None.gif)
176
![None.gif](/Images/OutliningIndicators/None.gif)
177
![None.gif](/Images/OutliningIndicators/None.gif)
178
![None.gif](/Images/OutliningIndicators/None.gif)
179
![None.gif](/Images/OutliningIndicators/None.gif)
180
![None.gif](/Images/OutliningIndicators/None.gif)
181
![None.gif](/Images/OutliningIndicators/None.gif)
182
![None.gif](/Images/OutliningIndicators/None.gif)
183
![None.gif](/Images/OutliningIndicators/None.gif)
184
![None.gif](/Images/OutliningIndicators/None.gif)
185
![None.gif](/Images/OutliningIndicators/None.gif)
186
![None.gif](/Images/OutliningIndicators/None.gif)
187
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
188
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
189
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
190
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
191
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
192
![None.gif](/Images/OutliningIndicators/None.gif)
193
![None.gif](/Images/OutliningIndicators/None.gif)
194
![None.gif](/Images/OutliningIndicators/None.gif)
195
![None.gif](/Images/OutliningIndicators/None.gif)
196
![None.gif](/Images/OutliningIndicators/None.gif)
197
![None.gif](/Images/OutliningIndicators/None.gif)
198
![None.gif](/Images/OutliningIndicators/None.gif)
199
![None.gif](/Images/OutliningIndicators/None.gif)
200
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
201
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
202
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
203
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
204
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
205
![None.gif](/Images/OutliningIndicators/None.gif)
206
![None.gif](/Images/OutliningIndicators/None.gif)
207
![None.gif](/Images/OutliningIndicators/None.gif)
208
![None.gif](/Images/OutliningIndicators/None.gif)
209
![None.gif](/Images/OutliningIndicators/None.gif)
210
![None.gif](/Images/OutliningIndicators/None.gif)
211
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
212
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
213
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
214
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
215
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
216
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
217
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
218
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
219
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
220
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
221
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
222
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
223
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
224
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
225
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
226
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
227
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
228
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
229
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![dot.gif](/Images/dot.gif)
230
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
231
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![dot.gif](/Images/dot.gif)
232
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
233
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![dot.gif](/Images/dot.gif)
234
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
235
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
236
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
237
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
238
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
239
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
240
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
241
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
242
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
243
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
244
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
245
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
246
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
247
![None.gif](/Images/OutliningIndicators/None.gif)
248
![None.gif](/Images/OutliningIndicators/None.gif)
249
![None.gif](/Images/OutliningIndicators/None.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
250
![None.gif](/Images/OutliningIndicators/None.gif)
251
![None.gif](/Images/OutliningIndicators/None.gif)
252
![None.gif](/Images/OutliningIndicators/None.gif)
253
![None.gif](/Images/OutliningIndicators/None.gif)
254
![None.gif](/Images/OutliningIndicators/None.gif)
255
![None.gif](/Images/OutliningIndicators/None.gif)
256
![None.gif](/Images/OutliningIndicators/None.gif)
257
![None.gif](/Images/OutliningIndicators/None.gif)
258
![None.gif](/Images/OutliningIndicators/None.gif)
259
![None.gif](/Images/OutliningIndicators/None.gif)
260
![None.gif](/Images/OutliningIndicators/None.gif)
261
![None.gif](/Images/OutliningIndicators/None.gif)
262
![None.gif](/Images/OutliningIndicators/None.gif)
263
![None.gif](/Images/OutliningIndicators/None.gif)
264
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
265
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
266
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
267
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
268
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
269
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
270
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
271
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
272
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
273
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
274
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
275
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
276
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
277
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
278
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
279
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
280
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
281
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
282
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
283
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
284
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
285
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
286
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
287
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
288
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
289
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
290
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
291
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
292
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
293
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
294
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
295
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
296
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
297
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
298
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)