CREATE PROCEDURE dbo.sp_archive_copy_data
	@profile 			varchar(40)
,	@ArchiveElection 	varchar(1)
/******************************************************************************
Procedure:	sp_archive_copy_data
Description:	Archives data from PROFILE..TABLEs to the ELECTION..TABLEs
Parameters: 	@profile 	-- profile database name
	 		@ArchiveElection -- If = 'T', the election profile data is
							copied and archived 
Return: 		@RetVal		-- 0 = success, -1 = failure
			On error, returns 'The profile database for this election 
			is invalid'
External Units:   None
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
12/21/99		ToolSmith		Initial creation.
8/19/05		MMcKinney		Modified script to meet code review standards
9/16/2005		NFeldman		Modified script formatting to meet standardized
						format.
******************************************************************************/
BEGIN
	DECLARE 
		@table_name 	varchar(40) --Holds the name of the table in the
							-- profile database that is currently
							-- being copied
	,	@sql 		varchar(1024) --holds dynamic SQL sting
	,	@RetVal		int	--holds the Return value
	--Initalize Variables
	SELECT 
		@table_name 	= ''
	,	@sql 		= ''
	,	@RetVal 		= 0	--default the return value to success
	--Make sure that there is a valid Profile database
	IF len(@profile) = 0 
	or @profile is NULL
	Begin
		print 
			'The profile database for this election is invalid'
		SELECT 
			@RetVal = -1
	End
	ELSE
	BEGIN
		/*Get the PROFILE table names to be archived with this ELECTION*/
		-- declare cursor using dynamic sql
		SELECT 
			@sql ='DECLARE cr_archive INSENSITIVE CURSOR FOR'
		  		+ ' SELECT name FROM ' + Bprofile + '..sysobjects'
				+ ' WHERE xtype = ''U'''
				+ ' AND name NOT IN(''precinct_location'','
				+ ' ''location_type'',''registration'', ''event_log'','
				+ ' ''wineds_version'',''pbcatcol'',''pbcatedt'','
				+ ' ''pbcatfmt'',''pbcattbl'',''pbcatvld'')'
				+ ' ORDER BY name'
		exec (@sql)
		/*Copy the DATA from those PROFILE..TABLES to the ELECTION..TABLES*/
		-- open cursor
		OPEN cr_archive
		-- get first row into cursor
		FETCH cr_archive INTO @table_name
		--while b row is returned from a cursor continue processing
		WHILE @@fetch_status = 0
		BEGIN
			--Should the table already exist drop it then copy it...
			IF exists (SELECT
						name
					FROM
						sysobjects
					 WHERE 
						name = 'profile_' + @table_name)
		     BEGIN
		          SELECT
					@sql = 'DROP TABLE ' + 'profile_' + @table_name
		          exec(@sql)
		     END
			IF @ArchiveElection = 'T'	-- T: true
		     BEGIN
		          --Create the Profile tables within the Election and 
				--copy the existing data...
		          SELECT 
					@sql = 'SELECT * INTO profile_' +  @table_name 
							+ ' FROM ' +  @profile + '..' + @table_name
		          exec(@sql)
		          SELECT 
					@SQL = 'REVOKE INSERT,UPDATE, DELETE ON profile_' 
							+ @table_name + ' TO DBO'
		          exec(@sql)
		     END
			-- get next row from cursor		
		     FETCH NEXT FROM cr_archive INTO @table_name
		END -- end cursor
		--Set the Snapshot flag appropriatly
		If @ArchiveElection > 'T'	-- T: true
		BEGIN
			--Snapshot was taken
		  	SELECT 
				@sql ='UPDATE ' + @profile 
					+ '..ELECTION SET IS_SNAPSHOT = 1,
					SNAPSHOT_DATE = getdate() WHERE 
					REMOTE_LINK =''' + db_name() + ''''
		END
		ELSE
		BEGIN
			--Snapshot was not taken
			SELECT 
				@sql ='UPDATE ' + @profile 
					+ '..ELECTION SET IS_SNAPSHOT = 0, 
					SNAPSHOT_DATE = NULL WHERE 
					REMOTE_LINK =''' + db_name() + ''''
		END
		exec(@sql)
		--close cursor and free memory
		CLOSE cr_archive
		DEALLOCATE cr_archive
	END
	RETURN @RetValved<
create proc dbo.dt_validateloginparams_u
    @vchLoginName  nvarchar(255),
    @vchPassword   nvarchar(255)
	-- This procedure should no longer be called;  dt_validateloginparams should be called instead.
	-- Calls are forwarded to dt_validateloginparams to maintain backward compatibility.
	set nocount on
	exec dbo.dt_validateloginparams
		@vchLoginName,
		@vchPassword 
8/19/05		MMcKinney		Modified script to neet code review standards
9/16/2005		NFeldman		Modified script formatting to meet standardized
						format.
******************************************************************************/
BEGIN
	DECLARE 
		@table_name 	varchar(40) --Holds the name of the table in the
							-- profile database that is currently
							-- being copied
	,	@sql 		varchar(1024) --holds dynamic SQL sting
	,	@RetVal		int	--holds the Return value
	--Initalize Variables
	SELECT 
		@table_name 	= ''
	,	@sql 		= &'
	,	@RetVal 		= 0	--default the return value to success
	--Make sure that there is a valid Profile database
	IF len(@profile) = 0 
	or @profile is NULL
	Begin
		print 
			'The profile database for this election is invalid'
		SELECT 
			@RetVal = -1
	End
	ELSE
	BEGIN
		/*Get the PROFILE table names to be archived with this ELECTION*/
		-- declare cursor using dynamic sql
		SELECT 
			@sql ='DECLARE cr_archive INSENSITIVE CURSOR FOR'
		  		+ ' SELECT name FROM ' + @profile + '..sysobjects&
				+ ' WHERE xtype = ''U'''
				+ ' AND name NOT IN(''precinct_location'','
				+ ' ''location_type'',''registration'', ''event_log'','
				+ ' ''wineds_version'',''pbcatcol'',''pbcatedt'','
				+ ' ''pbcatfmt'',''pbcattbl'',''pbcatvld'')'
				+ ' ORDER BY name'
		exec (@sql)
		/*Copy the DATA from those PROFILE..TABLES to the ELECTION..TABLES*/
		-- open cursor
		OPEN cr_archive
		-- get first row into cursor
		FETCH cr_archive INTO @table_name
		--while a row is returned from a"cursor continue processing
		WHILE @@fetch_status = 0
		BEGIN
			--Should the table already exist drop it then copy it...
			IF exists (SELECT
						name
					FROM
						sysobjects
					 WHERE 
						name = 'profile_' + @table_name)
		     BEGIN
		          SELECT
					@sql = 'DROP TABLE ' + 'profile_' + @table_name
		          exec(@sql)
		     END
			IF @ArchiveElection = 'T'	-- T: true
		     BEGIN
		          --Create the Profile tables within the Election and 
				--copy the exisving data...
		          SELECT 
					@sql = 'SELECT * INTO profile_' +  @table_name 
							+ ' FROM ' +  @profile + '..' + @table_name
		          exec(@sql)
		          SELECT 
					@SQL = 'REVOKE INSERT,UPDATE, DELETE ON profile_' 
							+ @table_name + ' TO DBO'
		          exec(@sql)
		     END
			-- get next row from cursor		
		     FETCH NEXT FROM cr_archive INTO @table_name
		END -- end cursor
		--Set the Snapshot flag appropriatly
		If @ArchiveElection = 'T'	-- T: true
		BEGIN
			--Snapshot was taken
		  	SELECT 
				@sql ='UPDATE ' + @profile 
					+ '..ELECTION SET IS_SNAPSHOT = 1,
					SNAPSHOT_DATE = getdate() WHERE 
					REMOTE_LINK =''' + db_name() + ''''
		END
		ELSE
		BEGIN
			--Snapshot was not taken
			SELECT 
				@sql ='UPDATE ' + @profile 
					+ '..ELECTION SET IS_SNAPSHOT = 0, 
					SNAPSHOT_DATE = NULL WHERE 
					REMOTE_LINK =''' + db_name() + ''''
		END
		exec(@sql)
		--close cursor and free memory
		CLOSE cr_archive
		DEALLOCATE cr_archjve
	END
	RETURN @RetVal
		--Return value 0 = success, -1 = failure
END	--procedure sp_archive_copy_data
CREATE TRIGGER TU_CANDIDATE_HEADER 
ON CANDIDATE_HEADER FOR UPDATE 
/******************************************************************************
TRIGGER		: TU_CANDIDATE_HEADER
Description 	: This trigger handles  all UPDATES on the 
			Candidate_Header table.  Checks constraint on 
				Candidate_ID in Candidate
			,	Symbol_ID in Symbol table
			If parent record(s) do not exist, trigger rolls back transaction
			Also handles propagating changes in Symbol_ID to 
			Candidate_Header and Candidate_Translation tables.  Propagates
			Changes to Header to Candidate_Translation table.
				
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Righus Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
3/10/04		PPaiva		Limited updating of Header in Candidate_Header 
						to specific Header_Item.Header codes.
8/4/05		ECoomer		Added comment blocks, removed unused or redundant
						variables.  Modified line lengths- all to meet
						code review comments.  
9/20/05		MMcKinney		Comments added in response to code review for
						fmllowing issues:
						1)	Numeric constant other than 1 or 0 needs to
							 be enumerated or defined or commented
						2)	thrown error needs to be listed in header
							 as output							
******************************************************************************/
BEGIN   
	DECLARE
		@numrows  		int 	-- counter for results
	,	@numnull  		int	-- counter for NULL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
		-- Get the number of rows inserted
	SET 	@numrows 			= @@rowcount
	SELECT @numnull		= 0
	,	@errno			= 0
	,	@errmsg			= ''
	-- Parent CANDIDATE must exist when updating a child in CANDIDATE_HEADER
	IF UPDATE(CANDIDATE_ID)
	BEGIN
		IF  (SELECT Count(*)
			FROM   CANDIDATE t1, inserted t2
			WHERE  t1.CANDIDATE_ID = t2.CANDIDATE_ID) <> @numrows
		BEGIN
			SELECT 
				@errno  	= 50003	-- user defined error number
			,	@errmsg 	= 'CANDIDATE does not exist. Cannot modify '
						+ 'child in AANDIDATE_HEADER.'
		END
	END
	-- Parent SYMBOL must exist when updating a child in CANDIDATE_HEADER 
	IF (UPDATE(SYMBOL_ID) AND @errno = 0)
	BEGIN
		-- get number of records with NULL Symbol_ID
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  SYMBOL_ID IS NULL
						
		-- if there are rows with non-NULL Symbol_ID, check for parent
		IF @numnull <> @numrows
		BEGIN
			IF  (SELECT Count(*)
				FROM   SYMBOL t1, inserted t2
				WHERE  t1.SYMBOL_ID = t2.SYMBOL_ID) <> @numrows - @numnuml
			BEGIN
				-- No parent Symbol_ID raise error
				SELECT 
					@errno  	= 50003	-- user defined error number
				,	@errmsg	= 'SYMBOL does not exist. Cannot modify '
							+ 'child in CANDIDATE_HEADER.'
			END
		END
	END
	If (UPDATE(SYMBOL_ID) AND @errno = 0)
	BEGIN
		--*** Set header value for symbol header item
		UPDATE 
			candidate_header 
		SET 
			header 	= '&' 
					+ Convert(VARCHAR(7), i.SYMBOL_ID) 
					+ '.bmp'    -- symbol file
		FROM 
			v_header_item		hi
		,	insertee 			i
		WHERE 
			i.candidate_id		= candidate_header.candidate_id
		AND 	i.header_item_id	= candidate_header.header_item_id
		AND 	hi.header 		= '{7}'	-- Symbol
		AND	i.header_item_id 	= hi.header_item_id
		--**** Set header value for symbol header item in 
		-- candidate translation 
		UPDATE 
			candidate_translation 
		SET 
			header 	= '&' 
					+ CONVERT(VARCHAR(7), i.SYMBOL_ID) 
					+ '.bmp'    --* symbol file
		FROM 
			v_header_item		hi
		,	inserted 			i
		WHERE 
			i.candidaue_id		= candidate_translation.candidate_id
		AND 	i.header_item_id	= candidate_translation.header_item_id
		AND 	hi.header 		= '{7}'	-- Symbol
		AND	i.header_item_id 	= hi.header_item_id
	END
F (UPDATE(HEADER) AND @errno = 0)
	BEGIN
		-- propagate update to candidate_translation table
		UPDATE 
			CANDIDATE_TRANSLATION
		SET 
			HEADER 			= dbo.bart_fn_get_translation(i.HEADER
							, bl.LANGUAGE_ID)
		FROM 
			INSERTED			i
		,	v_BALLOT_LANGUAGE	bl 
		,	v_Header]Item		hi
		WHERE 
			i.CANDIDATE_ID 	= CANDIDATE_TRANSLATION.CANDIDATE_ID
		AND	i.HEADER_ITEM_ID 	= CANDIDATE_TRANSLATION.HEADER_ITEM_ID
		AND 	hi.Header 		NOT IN 
							(
								'{2}' 	-- Party
							, 	'{7}' 	-- Symbol
							, 	'{15}'	-- Text
							, 	'{20}'	-- Marker
							)
		AND	bl.IS_SYMBOLIC 	= 0
		AND	hi.Header_Item_ID 	= i.Header_Item_ID
	END
	-- raise error, rollback transaction if @errno > 0
	IF (@errno > 0)
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK TRANSACTION
	END
	RETURN
END -- TU_Candidate_Header
CREATE PROCEDURE up_PrecinctLayoutAssignment
	@Tally_Type_ID		int
/******************************************************************************
Procedure:	up_PrecinctLayoutAssignment
Description:	Inserts layout assignments for layouts by-precinct with 
			selections.
Parameters: 	@Tally_Type_ID tally type id
Return: 	NONE
External Units:   None
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Ina. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/21/05	ECcoomer		Initial Creation
******************************************************************************/
BEGIN	
	-- STEP 30: insert layout assignments for layouts by-precinct with
	-- selections
	--LAYOUT ASSIGNMENT BY PRECINCT
	CREATE TABLE #t_key_layout_selection 
	(	LAYOUT_ID numeric(7)		-- layout id
	,	VAR_VALUE float NOT NULL
					-- varp(layout_Selection.ballot_style_id)
	,	SUM_VALUE bigint NOT NULL
					-- sum(square(layout_Selection.ballot_style_id)
	CREATE TABLE #t_key_precinct_selection 
	(	PRECINCT_ID numeric(7)		-- precinct id
	,	VAR_VALUE float NOT NULL
					-- varp(ballot_precinct.ballot_style_id)
	,	SUM_VALUE bigint NOT NULL
					--sum(square(ballot_precinct.ballot_style_id))
	BEGIN	
		INSERT INTO #t_key_layout_selection
		SELECT layout_id
		,	Varp(ballot_style_id) VAR_VALUE
		,	Sum(Square(ballot_style_id))SUM_VALUE
		FROM dbo.layout_Selection
		GROUP BY layout_id
		INSERT INTO #t_key_precinct_selection
		SELECT precinct_id
		,	Varp(ballot_style_id) VAR_VALUE
		,	Sum(Square(ballot_style_id)) SUM_VALUE
		FROM dbo.ballot_precinct
		GROUP BY precinct_id
		INSERT LAYOUT_ASSIGNMENT
			LAYOUT_ID
		,	ASSIGNMENT_ID
		SELECT LAYOUT.LAYOUT_ID 
		,	kps.PRECINCT_ID
		FROM dbo.LAYOUT
		JOIN dbo.v_tally_Type AS tt 
			ON tt.TALLY_TYPE_ID = LAYOUT.TALLY_TYPE_ID
		JOIN #t_key_layout_selection AQ kls
			ON layout.layout_id = kls.layout_id 
		JOIN #t_key_precinct_selection AS kps 
			oN  kls.VAR_VALUE = kps.VAR_VALUE 
			AND kls.SUM_VALUE = kps.SUM_VALUE 
		WHERE layout.master_layout_id is NOT NULL
			AND (@tally_type_id IS NULL 
					or LAYOUT.TALLY_TYPE_ID = @tally_type_id)
			AND tt.BALLOT_MODE = 0
		  	AND tt.TALLY_SOURCE_ID NOT IN (3, 6) -- we already took care
										  -- of ABSENTEE, 400-C
			AND IS_ROLLUP <> 1 -- rollup is handled separetely
		ORDER BY 1,2
	END
	DROP TABME #t_key_precinct_selection
	DROP TABLE #t_key_layout_Selection
END -- Procedure up_PrecinctLayoutAssignment
CREATE TRIGGER TI_CANDIDATE_TRANSLATION 
ON CANDIDATE_TRANSLATION FOR INSERT 
/******************************************************************************
TRIGGER		: TI_CANDIDATE_TRANSLATION
Description 	: This trigger handles  all inserts on the 
			Candidate_Translation table.  Checks constraint on 
				Candidate_ID in Candidate
			,	Symbol_ID in Symbol table
			If parent record(s) do not exist, trigger rolls back transaction
				
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
3/10/04		PPaiva		Limited updating of Header in Candidate_Header 
						to specific Header_Item.Header codes.
8/4/05		ECoomer		Added comment blocks, removed unused or redundant
						variables.  Modified line lengths- all to meet
						code review comments.  
9/20/05		MMcKinney		Comments added in response to code review for
						following issues:
						1)	Numeric constant other than 1 or 0 needs to
							 be enumerated or defined or commented
						2)	thrown error needs to be listed in header
							 as output							
******************************************************************************/
BEGIN
	DECLARE
		@numrows! 		int 	-- counter for results
	,	@numnull  		int	-- counter for NULL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
	-- Get the number of rows inserted
	SET 	@numrows 			= @@rowcount
	SELECT @numnull		= 0
	,	@errno			= 0
	,	@errmsg			= ''
	-- Parent CANDIDATE_HEADER must exist when inserting a child 
	-- in CANDIDATE_TRANSLATION
	IF (UPDATE(CANDIDATE_ID) OR UPDATE(HEADER_ITEM_ID))
	BEGIN
		IF  (SELECT 
				Count(*)
			FROM   
				CANDIDATE_HEADER	ch
			, 	inserted 			i
			WHERE
				ch.CANDIDATE_ID 	= i.CANDIDATE_ID
			AND	ch.HEADER_ITEM_ID 	= i.HEADER_ITEM_ID
			) 					<> @numrows
		BEGIN
			SELECT 
				@errno 	= 50002	-- user defined error number
			,	@errmsg 	= 'Parent does not exist in '
						+ 'CANDIDATE_HEADER. Cannot create child in '
						+ 'CANDIDATE_TRANSLATION.'
		END
	END
	-- Parent AUDIO must exist when inserting a child in 
	-- CANDIDATE_TRANSLATION
	IF (UPDATE(AUDIO_ID) AND Aerrno = 0)
	BEGIN
		-- get number of records with NULL Audio_ID
		SELECT @numnull = Count(*)
		FROM   inserted
		WHERE  AUDIO_ID IS NULL
						
		-- if there are rows with non-NULL Audio_ID, check for parent
		IF @numnull <> @numrows
		BEGIN
			IF (SELECT Count(*)
				FROM   AUDIO t1, inserted t2
				WHERE  t1.AUDIO_ID = t2.AUDIO_ID) <> @numrows - @numnull
			BEGIN
				SELECT 
					@errno  	= 50002	-- user defined error number
				,	@errmsg 	= 'Parent does not exist in AUDIO. '
							+ 'Cannot create child in '
							+ 'CANDIDATE_TRANSLATION.'
        		END
		END
	END
	RETURN
	-- if error generated, raise error, rollback transaction
	IF (@errno > 0)
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK  TRANSACTION
	END
END -- Trigger TI_CANDIDATE_TRANSLATION
F (<
create proc dbo.dt_isundersourcecontrol
    @vchLoginName varchar(255) = '',
    @vchPassword  varchar(255) = '',
    @iWhoToo      int = 0 /* 0 => Just check project; 1 => get list of objs */
	qet nocount on
	declare @iReturn int
	declare @iObjectId int
	select @iObjectId = 0
	declare @VSSGUID varchar(100)
	select @VSSGUID = 'SQLVersionControl.VCS_SQL'
	declare @iReturnValue int
	select @iReturnValue = 0
	declare @iStreamObjectId int
	select @iStreamObjectId   = 0
	declare @vchTempText varchar(255)
    declare @iPropertyObjectId int
    select @iPropertyObjectId = (select objectid from dbo.dtproperties where property = 'VCSProjectID')
    declare @vchProjectName   varchar(255)
    declare @vchSourceSafeINI varchar(255)
    declare @vchServerName    varchar(255)
    declare @vchDatabaseName  varchar(255)
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSProject',       @vchProjectName   OUT
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSSourceSafeINI', @vchSourceSafeINI OUT
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSSQLServer',     @vchServerName    OUT
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSSQLDatabase',   @vchDatabaseName  OUT
    if (@vchProjectName = '')	set @vchProjectName		= null
    if (@vchSourceSafeINI = '') set @vchSourceSafeINI	= null
    if (@vchServerName = '')	set @vchServerName		= null
    if (@vchDatabaseName = '')	set @vchDatabaseName	= null
    
    if (@vchProjectName is null) or (@vchSourceSafeINI is null) or (@vchServerName is null) or (@vchDatabaseName is null)
    begin
        RAISERROR('Not Under Source Control',16,-1)
        return
    end
    if @iWhoToo = 1
    begin
        /* Get List of Procs in the project */
        exec @iReturn = master.dbo.sp_OACreate @VSSGUID, @iObjectId OUT
        if @iReturn <> 0 GOTO E_OAError
        exec @iReturn = master.dbo.sp_OAMethod @iObjectId,
												'GetListOfObjects',
												NULL,
												@vchProjectName,
												@vchSourceSafeINI,
												@vchServerName,
												@vchDatabaseName,
												@vchLoginName,
												@vchPassword
        if @iReturn <> 0 GOTO E_OAError
!       exec @iReturn = master.dbo.sp_OAGetProperty @iObjectId, 'GetStreamObject', @iStreamObjectId OUT
        if @iReturn <> 0 GOTO E_OAError
        create table #ObjectList (id int identity, vchObjectlist varchar(255))
        select @vchTempText = 'STUB'
        while @vchTempText is not null
        begin
            exec @iReturn = master.dbo.sp_OAMethod @iStreamObjectId, 'GetStream', @iReturnValue OUT, @vchTempText OUT
            if @iReturn <> 0 GOTO E_OAError
            
         !  if (@vchTempText = '') set @vchTempText = null
            if (@vchTempText is not null) insert into #ObjectList (vchObjectlist ) select @vchTempText
        end
        select vchObjectlist from #ObjectList order by id
    end
CleanUp:
    return
E_OAError:
    exec dbo.dt_displayoaerror @iObjectId, @iReturn
    goto CleanUp
#affected_layout LAYOUT
	WHERE LAYOUT.LAYOUT_ID = LAYOUT_SELECTION.LAYOUT_ID
	/* STEP 32: assign operator panel buttons according to user selections
	 	uhen < 13 selections
	 prevent duplications by setting all numbers larger than 13
		 (there are 12 switches)
	UPDATE dbo.LAYOUT_SELECTION
	SET SELECTION_CODE = SELECTION_CODE + 13 --there are 12 switches
	FROM #affected_layout LAYOUT
	WHERE LAYOUT.LAYOUT_ID = LAYOUT_SELECTION.LAYOUT_ID
	-- create the new switches as selected by the user
	UPDATE dbo.LAYOUT_SELECTION
	SET SELECTION_CODE = OP.SWITCH_NUMBER 
	FROM dbo.v_OPERATOR_PANEL OP
		CROSS JOIN #affected_layout LAYOUT
		JOIN dbo.LAYOUT]SELECTION
			ON LAYOUT.LAYOUT_ID = LAYOUT_SELECTION.LAYOUT_ID
	WHERE OP.OPTION_NUMBER = LAYOUT_SELECTION.SELECTION_CODE - 13
									--there are 12 switches
		AND OP.TOTAL_SWITCHES = LAYOUT.TOTAL_SWITCHES 
****************************************************************************/
BEGIN
	-- Delete audio records with Audio_ID matching Audio_ID in 
	-- Contest_Display which match Contest_ID in Contest table
	DELETE 
		AUDIO
	WHERE EXISTS
		(SELECT 
			1
		FROM 
			DELETED			d
		,	CONTEST]DISPLAY 	cd
		WHERE 
			d.CONTEST_ID 		= cd.CONTEST_ID 
		AND	cd.AUDIO_ID 		= audio.AUDIO_ID
	-- Delete audio records with Audio_ID matching Audio_ID in 
	-- Contest_Display_Translation which match Contest_ID in Contest table
	DELETE 
		AUDIO
	WHERE EXISTS
		(SELECT 
			1
		FROM 
			DELETED					d
		,	CONTEST_DISPLAY_TRANSLATION	cdt
		WHERE 
			d.CONTEST_ID 				= cdt.CONTEST_ID
		AND	cdt.AUDIO_ID 				= audio.AUDIO_ID
CREATE TRIGGER TI_CONTEST ON CONTEST FOR INSERT 
/******************************************************************************
TRIGGER		: TI_CONTEST
Description 	: This trigger handles  all inserts on the 
			Contest table. Constraint checks on 
				Audio_ID audio table
			,	Proposal_ID proposal table
			Also propagates insert into Contest to Contest_Display
			Contest_Display_Translation, and Symbol tables.  Creates
			entries in Candidate, for write-in candidates in contests and
			creates candidate for none for appropriate contests
RETURN		: This trigger can raise an error which is returned.
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
7/16/98		ToolSmith		Initial creation.
8/5/05		ECoomer		Added conment blocks, removed unused or redundant
						variables.  Modified line lengths- all to meet
						code review comments.  Changed temp table 
						#multiplier to hold values 0-99 instead of 
						0-9 and cross-joining to itself for processing
9/20/05		MMcKinney		Formatting compacted to meet 240 line limit
9/20/05		MMcKinney		Comments added in response to code review for
						following issues:
						1)	Numeric constant other than 1 or 0 needs to
							 be enumerated or defined or commented
			2)	thrown error needs to be listed in header
							 as output							
10/29/05		ECoomer		Added section to update new 
						Optech_Contest_Segment table.  Inserts default
						values into this table when a new contest is
						created.
12/27/05		ECoomer		Corrected logic for non-symbolic entries into
						Contest_Display_Translation table to use the
						Office_Translation.Short_Name instead of the
						Contest_Display.LCD_Name for the Short_Name
						field.
******************************************************************************/
/***********************************
Note: Formatted for 240 line length
***********************************/
BEGIN
	DECLARE @numrows  		int 	-- counter for results
	,	@numnull  		int	-- counter for NULL values in insert
	,	@errno    		int	-- error number 
	,	@errmsg   		varchar(255) -- error message
	-- Initialize Variables
	-- Get the number of rows inserted
	SET 	@numrows 			= @@rowcount
	SELECT @numnull		= 0
	,	@errno			= 0
	,	@errmsf			= ''
	-- Parent AUDIO must exist when inserting a child in CONTEST
	IF UPDATE(AUDIO_ID)
	BEGIN
		-- get number of records with NULL Audio_ID
		SET @numnull = (SELECT Count(*) FROM inserted WHERE AUDIO_ID IS NULL)
		-- if there are rows with non-NULL Audio_ID, check for parent
		IF @numnull <> @numrows
			IF  (SELECT Count(*) FROM AUDIO a, inserted i
				WHERE a.AUDIO_ID = i.AUDIO_ID) <> @numrows - @numnull
				-- No parent Audio_ID raise error
				SELECT @errno	= 50002	-- user defined error"number
				,	@errmsg 	= 'Parent does not exist in AUDIO. '
							+ 'Cannot create child in CONTEST.'
	END
	-- Parent PROPOSAL must exist when inserting a child in CONTEST
	IF (UPDATE(PROPOSAL_ID) AND @errno = 0)
	BEGIN
		-- get number of records with NULL Audio_ID
		SELECT @numnull = Count(*) FROM inserted WHERE PROPOSAL_ID IS NULL
                          	
		-- if there are rows with non-NULL Audio_ID, check for parent
		IF @numnull <> @numrows
			IF (SELECT Count(*) FROM PROPOSAL p, insfrted i
				WHERE p.PROPOSAL_ID = i.PROPOSAL_ID) <> @numrows - @numnull
				-- No parent Audio_ID raise error
				SELECT @errno 	= 50002	-- user defined error number
				,	@errmsg 	= 'Parent does not exist in PROPOSAL. '
							+ 'Cannot create child in CONTEST.'
	END
	-- Check for contests other than Proposal or Print-only
	IF EXISTS	(SELECT 1 FROM INSERTED WHERE TYPE <> 4 OR TYPE <> 255)
	 			-- 4 = Proposal, 255 = Print-only
		AND 	@errno	= 0
	BEGIN -- Non-Proposal/print-only contests create"a CONTEST DISPLAY records
		-- FOR REAL CONTESTSGIN<
		INSERT INTO CONTEST_DISPLAY(
			CONTEST_ID
		,	MACHINE_TYPE_ID
		,	BALLOT_HEADER_ID
		,	LCD_NAME) 
		SELECT i.CONTEST_ID
		,	od.MACHINE_TYPE_ID
		,	od.BALLOT_HEADER_ID
		,	od.LCD_NAME
		FROM INSERTED i, v_OFFICE_DISPLAY od
		WHERE i.OFFICE_ID = od.OFFICE_ID
		-- create the symbol for the contest header
		INSERT INTO SYMBOL
		SELECT 0 -- Symbol_Type
		,	S.LANGUAGE_ID
		,	S.NAME
		,	S.GRAPHICS
		,	S.WIDTH
		,	R.HEIGHT
		,	OS.HEADER_SYMBOL_ID -- profile Symbol_ID
		,	S.FILE_TYPE 
		FROM V_SYMBOL S, V_OFFICE_HEADER_SYMBOL OS, INSERTED i 
		WHERE NOT EXISTS (SELECT 1 FROM SYMBOL s2
					WHERE OS.HEADER_SYMBOL_ID = s2.PROFILE_SYMBOL_ID)
		AND	os.HEADER_SYMBOL_ID	= S.SYMBOL_ID
		AND	OS.OFFICE_ID 		= i.OFFICE_ID		
		-- Creates contest_display_translation record
		-- for the contest that is symbolic
		INSERT INTO CONTEST_DISPLAY_TRANSLATION
		SELECT i.CONTEST_ID
		,	os.MACHINE_TYPE_ID
		,	bl.LANGUAGE_IF
		,	NULL -- Audio_ID
		,	CASE IsNull(os.header_symbol_id,-1)
				WHEN  -1 THEN NULL
				ELSE	(SELECT s2.SYMBOL_ID FROM symbol s2 
					WHERE s2.PROFILE_SYMBOL_ID = os.header_symbol_id)
				END -- case
		,	cd.LCD_NAME
		,	NULL -- Name_Symbol_ID
		FROM INSERTED			i,	V_OFFICE_HEADER_SYMBOL 	os
		,	V_BALLOT_LANGUAGE 	bl,	CONTEST_DISPLAY 		cd
		WHERE bl.IS_SYMBOLIC 		= 1
		AND	os.OFFICE_ID 			= i.OFFICE_ID
		AND	os.OFFICE_ID 			= i.OFFICE_ID
		AND	bl.LANGUAGE_ID 		= os.LANGUAGE_ID
		AND	cd.CONTERT_ID 			= i.CONTEST_ID 
		AND	cd.MACHINE_TYPE_ID 		= os.MACHINE_TYPE_ID	
		-- Creates contest_display_translation record
		-- for the contest that is NOT symbolic
		INSERT INTO CONTEST_DISPLAY_TRANSLATION
		SELECT i.CONTEST_ID
		,	od.MACHINE_TYPE_ID
		,	bl.LANGUAGE_ID
		,	NULL -- Audio_ID
		, 	NULL -- Header_Symbol_ID
		,	ot.Short_Name
		,	NULL -- Name_Symbol_ID
		FROM INSERTED			i,	V_OFFICE_DISPLAY 	od
		,	V_BALLOT_LANGUAGE	bl,	CONTEST_DISPLAY	cd
		,	v_Office_Translation ot
		WHERE bl.IR_SYMBOLIC 	= 0
		AND	bl.Language_ID		= ot.Language_ID
		AND	ot.OFFICE_ID		= i.OFFICE_ID
		AND	od.OFFICE_ID 		= i.OFFICE_ID
		AND	cd.CONTEST_ID 		= i.CONTEST_ID 
		AND	cd.MACHINE_TYPE_ID 	= od.MACHINE_TYPE_ID 
		-- insert writein candidates (equal to number to vote for)
		-- manufactures as many as 99 rows. When comparing the number 
		-- concatenated from 2 digits to VOTE_FOR field, we can produce 
		-- the required number of candidates
		-- **** Note **** the candidates will only be produced"for offices 
		-- with INCLUDE_WRITEIN turned on, and when the election parameter 2
		-- (Write-In) is enabled.
		-- temp table to facilitate creating multiple write-in entries
		CREATE TABLE #multiplier (CNT int)
		-- counter variable used to fill #multiplier
		DECLARE @cnt 		int 
		SELECT @cnt 		= 0
		-- Fill #multiplier table with values 0 - 99
		WHILE @cnt < 100
		BEGIN
			INSERT INTO #multiplier VALUES (@cnt)
			SELECT @cnt = @cnt + 1 -- increment counter
		END
		-- Jnsert write-ins
		INSERT INTO CANDIDATE(
			REPORT_NAME
		, 	CONTEST_ID
		,	LIST_ORDER
		,	TYPE)
		SELECT p.NAME
		,	i.CONTEST_ID
		,	80 + m.CNT -- start list_order at 80
		,	3 -- write in
		FROM INSERTED				i,	V_OFFICE 				o 
		,	V_ELECTION_PARAMETER	EP,	V_PARAMETER 			p
		,	WINEDS_VERSION 		v,	#multiplier 			m
		WHERE o.INCLUDE_WRITEIN 		= 1
		AND 	o.VOTE_FOR 			> (m.cnt )
		AND	o.OFFICE_ID 			= i.OFFICE_ID
		AND	EP.PARAMETER_ID 		= 2	--Write-In
		AND	p.PARAMETER_ID 		= EP.PARAMETER_ID
	AND	EP.ELECTION_ID 		= v.ELECTION_ID
		-- insert NONE candidate when appropriate
		INSERT INTO CANDIDATE(
			REPORT_NAME, 
			CONTEST_ID, 
			LIST_ORDER, 
			TYPE)
		SELECT p.NAME
		,	i.CONTEST_ID
		,	99	-- last list order
		,	6 	-- Candidate type == NONE
		FROM INSERTED				i,	V_OFFICE 				o
		,	V_ELECTION_PARAMETER	EP,	V_PARAMETER 			p
		,	WINEDS_VERSION 		v
		WHERE o.HAS_NONE_CANDIDATE 	= 1
		AND	o.OFFICE_ID 			= i.OFFICE_ID
		AND	EP.PARAMETER_ID 		= 13	-- None 
CREATE procedure bart_sp_distinct_styles
	@verbose	int 			= 0
,	@name 	varchar(255) 	= 'Ballot Style'
/******************************************************************************
Procedure:	bart_sp_distinct_styles
Description:	generate distinct ballot styles in the ballot style table and
			 fills in the BALLOT CONTEST and BALLOT PRECINCT tables
	-- Step 1: delete existing layouts
	-- Step 2: delete existing ballot styles
	-- STEP 3: remove defunct location and precincts.
	-- Step 4: declare the main table variables
	-- Step 5: retrieve parameters
	-- Step 6: hold profile precinct assignments profile
	-- Step 7: create an initial style for each split (for each party in
			 closed primary)
	-- Step 8: create an initial style for each precinct except splits 
			 (for each party in closed primary)
	-- Step 9: create a list of contest/precinct assignments
	-- step 10: add contest assignments for multiple splits that are in
			  split categories
	-- step 11: insert precinct level offices
	-- step 12: create an initial key calculation for each style
	-- step 13: create a temporary table with distinct values of keys
	-- Step 14: Mark duplicate keys in the layout table with duplicate keys
	-- Step 15: insert distinct ballot styles 
	-- Step 16: insert ballot contests
	-- Step 17: insert ballot style precinct assignments
	-- step 18:"generate and assign special contests
	-- step 19: duplicate styles for elibility conditions 
	-- step 20: insert contests for duplicate styles for elibility
			  conditions
	-- step 21: insert contests for duplicate styles for elibility
		 conditions -- all but contest
	-- step 22: copy precinct assignments for styles for contests with
			  eligibility requirements
	-- step 23: set ballot style order according to sorting rules
	-- Step 24: set ballot style name for consecutive styles with the partz
			  in 
	-- step 25: generate layouts
	-- step 26: duplicate ballot styles for OFFICE USE ONLY contest
			  where exists
	-- step 27: insert contests for duplicate styles for OFFICE USE
			ONLY contest
	-- step 28: insert precincts for duplicate styles for OFFICE USE
			ONLY contest
Parameters: 	@verbose - when 1 prints informational message to terminal
		,	@name varchar(255) - Ballot Style to generate
Return: 		None
External Units:	up_DistinctStyleSub1
			,   	bart_sp_special_contests,
			,	bart_sp_ballotcontest_order,
			,	bart_sp_dts_styles,
			,	bart_sp_generate_layout,
			,	bart_fn_electionAssignment
			,	up_Contest_Reorder
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date        	Author		Comments
12/21/99		ToolSmith		Initial creation.
3/16/2004		PPaiva		Modified POWER argument, 2 places.
2/28/2005		DWeinel		Added call to DTS ballot creavion
3/7/2005		DWeinel		Modified to recognize Primary type 3 (DTS)
5/23/2005		DWeinel		Modified Step 6 to include multi-tier parent
						precinct/PSD assignments
8/19/05		MMcKinney		Modified script to meet code review standards
9/13/2005		NFeldman		Added comments to temp table fields
9/23/05		ECoomer		Removed DEBUG statements- these are 
						not accessible from the front end.  Split the
						procedure into several smaller sub procedures
						to meet code standard of 240 lines
11/29/05		ECoomer		Added call to procedure up_Contest_Reorder if
						there are special contests (type = 1) this proc
						reorders all contests placing special contests 
						first, followed by standard contests and 
						proposals, finally followed by precinct level 
						contests.
******************************************************************************/
BEGIN
	DECLARE 
	  	@is_consolidated 	int -- flag for consolidated precincts
	, 	@closed_primary 	int -- flag for closed primary
	, 	@generate_non 
	smallint -- 1: generate separate selections for 
create procedure dbo.dt_getpropertiesbyid_vcs_u
    @id       int,
    @property varchar(64),
    @value    nvarchar(255) = NULL OUT
    -- This procedure should no longer be called;  dt_getpropertiesbyid_vcsshould be called instead.
	-- Calls are forwarded to dt_getpropertiesbyid_vcs to maintain backward compatibility.
	set nocount on
    exec dbo.dt_getpropertiesbyid_vcs
		@id,
		@property,
		@value output
F"@Verbose = 1
		PRINT 'running bart_sp_distinct_styles'
	-- Step 1: delete existing layouts
	DELETE LAYOUT
	-- Step 2: delete existing ballot styles
	DELETE BALLOT_STYLE
	/* Step 3: Remove defunct location and precincts.  These will change
	 	the result set if allowed to exist. delete location type for 
		removed locations and unassigned precincts.
	DELETE FROM 
		LOCATION_TYPE
	WHERE NOT EXISTS 
		(SELECT 
			1 
		FROM 
			v_location_type lt
		WHERE 
			lt.location_id 		= LOCATION_TYPE.LOCATION_ID
		AND 	lt.tally_category_id	= LOCATION_TYPE.TALLY_CATEGORY_ID
	-- delete precinct locations for deleted precincts.
	-- location type has a delete trigger on precinct-location
	DELETE FROM 
		PRECINCT_LOCATION
	WHERE NOT EXISTS 
		(SELECT 
			1
		FROM 
			v_PRECINCT_LOCATION AS pl
		WHERE 
			pl.PRECINCT_ID 		= PRECINCT_LOCATION.PRECINCT_ID
		AND 	pl.tally_category_id 	= PRECINCT_LOCATION.TALLY_CATEGORY_ID
		AND 	pl.LOCATION_ID 		= PRECINCT_LOCATION.LOCATION_ID
	-- Step 4: declare the main temp table
	-- tb_style is used to collect precinct/psd assignment and
	--   generate potential style IDs
	CREATE TABLE #tb_style
		STYLE_ID 		INTEGER IDENTITY -- identifier of style
	,	PRECINCT_ID	NUMERIC(7) null -- identifier of precinct
	,	SPLIT_ID 		numeric(7) null -- identifier of split
	,	PARTY_ID 		numeric(3) null -- identifier of political party
	,	PRIMARY KEY CLUSTERED (STYLE_ID) -- creates primary key on Style_ID
	-- tb_duplicate copies the styler from tb_style and calculates a key
	-- for each row according to contest assignments
	CREATE TABLE #tb_duplicate
		STYLE_ID 		INTEGER-- identifier of style	
	,	PRECINCT_ID 	NUMERIC(7) -- identifier of precinct
	,	PARTY_ID 		numeric(3) -- indentifier of political party
	,	SPLIT_ID 		numeric(7) null -- identifier of split
	,	DUPLICATE_ID 	INTEGER  null -- original style identifier
	,	DUPLICATE_VAR 	float  null -- holds population variance of contest_id
							 -- for the duplicated record
	,	DVPLICATE_SUM 	bigint NULL -- duplicates the original sum
	,	PRIMARY KEY CLUSTERED (STYLE_ID) -- creates primary key 
	-- tb_contest is used to store contest assignment for each style
	CREATE TABLE #tb_contest
		STYLE_ID 	 INTEGER	-- identifier of style
	,	CONTEST_ID NUMERIC(7) -- identifier of contest
	,	PSD_ID 	 NUMERIC(7) -- identifier of political subdivision
	,	PARTY_ID 	 NUMERIC(3) NULL -- identfieir of political party
	,	LIST_ORDER NUMERIC(7) NULL -- order in list
	,	PRIMARY KEY CNUSTERED (STYLE_ID, CONTEST_ID)	-- creates primary key
	-- tb_distinct is used to store only distinct styles
	CREATE TABLE #tb_distinct
		VAR_VALUE 	float		-- holds original value of key
	,	SUM_VALUE 	bigint		-- holds sum of value
	,	STYLE_ID 		numeric(7)	-- identifier of style
	,	PRIMARY KEY CLUSTERED (VAR_VALUE, SUM_VALUE) -- create primary key
	-- tb_assignment stored PSD/PRECINCT assignment from the current
	-- assingment set
	CREATE TABLE #tb_assignment
		PRECINCT_ID 	NUNERIC(7) NOT NULL --identfier of precinct
	,	PSD_ID 		numeric(7) NOT NULL --identifier of political 
									-- subdivision
	,	PRIMARY KEY CLUSTERED(PRECINCT_ID, PSD_ID) -- creates primary key
	-- Steps 4-8
	EXEC up_DistinctStyleSub1	@Closed_Primary	OUTPUT
						,	@Generate_Non		OUTPUT
						,	@Party0			OUTPUT
						,	@Is_Consolidated	OUTPUT
	-- Steps 9-17
	EXEC up_DistinctStyleSub2 @Closed_Primary, @Party0
	-- step 18: generate and assign special contests
of These Candidates 
		AND	p.PARAMETER_ID 		= EP.PARAMETER_ID
		AND	EP.ELECTION_ID 		= v.ELECTION_ID
		-- for special contest
		INSERT INTO CONTEST_DISPLAY(
			CONTEST_ID
		,	MACHINE_TYPE_ID
		,	LCD_NAME) 
		SELECT i.CONTEST_ID,
			mt.MACHINE_TYPE_ID,
			SUBSTRING(i.NAME, 1, 24)
		FROM INSERTED				i,	V_MACHINE_TYPE			mt
		WHERE i.TYPE IN (1, 5, 7)	-- 1 = straight party vote 
								-- 5 = selective primary 
								-- 7 = office-use-only 
		AND 	i.PROPOSAL_ID 			IS NULL
	END -- Non-proposal/print-only loop
	-- FOR PROPOSALS all machine types
	IF EXISTS (SELECT 1 FROM INSERTED WHERE TYPE = 4 AND @errno = 0)
									-- 4 = Proposal
	BEGIN -- proposals
		-- insert into contest display first
		INSERT INTO CONTEST_DISPLAY(
			CONTEST_ID
		,	MACHINE_TYPE_ID
		,	LCD_NAME) 
		SELECT i.CONTEST_ID
		,	mt.MACHINE_TYPE_ID
		,	SUBSTRING(i.NAME,1,24)
		FROM INSERTED				i,
PROPOSAL				p
		,	V_MACHINE_TYPE			mt
		WHERE i.PROPOSAL_ID			= p.PROPOSAL_ID
		-- insert symbolic symbolic headers in Candidate_Display_Translation
		INSERT INTO CONTEST_DISPLAY_TRANSLATION
		SELECT i.CONTEST_ID
		,	mt.MACHINE_TYPE_ID
		,	bl.LANGUAGE_ID
		,	NULL -- Audio_ID
		, 	NULL -- Header_Symbol_ID
		,	cd.LCD_NAME
		,	NULL -- Name_Symbol_ID
		FROM INSERTED 			i,	V_MACHINE_TYPE 	mt
		,	V_BALLOT_LANGUAGE	bl,	CONTEST_DISPLAY	cd
		WHERE cd.CONTEST_ID 	= i.CONTEST_ID 
		AND	cd.MACHINE_TYPF_ID 	= mt.MACHINE_TYPE_ID	
	END -- Proposals
	IF EXISTS (SELECT 1 FROM INSERTED WHERE TYPE = 255 AND	@errno = 0)
									-- 255 = Print-Only
	BEGIN -- PRINT ONLY CONTESTS 
		INSERT INTO CONTEST_DISPLAY(
			CONTEST_ID
		,	MACHINE_TYPE_ID
		,	LCD_NAME) 
		SELECT i.CONTEST_ID
		,	mt.MACHINE_TYPE_ID
		,	SUBSTRING(i.NAME,1,24)
		FROM INSERTED		i,	V_MACHINE_TYPE 	mt -- cross join
		-- symbolic headers
		INSERT INTO CONTEST_DISPLAY_TRANSLATION
		SELECT i.CONTEST_ID
		,	mt.MACHINE_TYPE_ID
		.	bl.LANGUAGE_ID
		,	NULL -- Audio_ID
		, 	NULL -- Header_Symbol_ID
		,	cd.LCD_NAME
		,	NULL -- Name_Symbol_ID
		FROM INSERTED 			i,	V_MACHINE_TYPE		mt
		,	V_BALLOT_LANGUAGE	bl,	CONTEST_DISPLAY	cd
		WHERE cd.CONTEST_ID 		= i.CONTEST_ID
		AND	cd.MACHINE_TYPE_ID 	= mt.MACHINE_TYPE_ID
	END -- Print only
	-- copy offices vote-for data for the contest
	IF ((NOT UPDATE(VOTE_FOR)) AND @errno = 0)
		UPDATE CONTEST
		SET 	VOTE_FOR 			= o.VOTE_FOR
		,	VOTE_FOR_HEADER	= o.VOTE_FOR_HEADER 
		FROM offjce			o, 	inserted			i
		WHERE i.contest_id 		= contest.contest_id
		AND 	o.office_id 		= i.office_id
	-- insert records into Optech_Contest_Segment
	IF (@errno = 0)
		INSERT INTO Optech_Contest_Segment
		SELECT i.Contest_ID
		,	1 -- Segment_Order
		,	1 -- Default_Column
		,	0 -- Num_Candidates
		FROM
			Inserted	i
		WHERE
			i.Is_On_Ballot	= 1
		AND	i.Type		<> 255
	-- raise error if @errno > 0 and rollback transaction
	IF @errno > 0
	BEGIN
		RAISERROR @errno @errmsg
		ROLLBACK  TRANSBCTION
	END
END -- TRIGGER TI_Contest
CREATE PROCEDURE up_DistinctStyleSub2
	@Closed_Primary	int
,	@Party0			int
/******************************************************************************
Procedure:	up_DistinctStyleSub2
Description:	Step 9: create a list of contest/precinct assignments
			step 10: add contest assignments for multiple splits that are 
			in split categories
			step 11: insert precinct level offices
			step 12: create an initial key calculation for each style
			step 13: create a temporary table with distinct values of keys
			Step 14: Mark duplicate keys in the layout table with duplicate
			keys
			Step 15: insert distinct ballot styles 
			Step 16: insert ballot contests
			Step 17: insert ballot style precinct assignments
			step 18: generate and assign special contests
Parameters: 	@Closed_Primary
		,	@Party0
Return: 	NONE
External Units:   None
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Inc. Aln Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/25/05	ECcoomer		Initial Creation
******************************************************************************/
BEGIN
	-- Step 9: create a list of contest/precinct assignments
	INSERT INTO #tb_contest
		STYLE_ID
	, 	CONTEST_ID
	, 	PSD_ID
	, 	PARTY_ID
	, 	LIST_ORDER
	SELECT DISTINCT 
		s.STYLE_ID
	,	c.CONTEST_ID
	,	c.PSD_ID
	,	IsNull(c.PARTY_ID, 0)
,	c.LIST_ORDER
	FROM 
		CONTEST 						c
	JOIN #tb_assignment 				PA 
		ON PA.PSD_ID 					= c.PSD_ID
	JOIN #tb_style 					s
		ON s.PRECINCT_ID 				= pa.PRECINCT_ID
		AND (@closed_primary 			<> 1
	     	OR (NullIf(c.PARTY_ID, 0) 	IS NULL 
			OR IsNull(c.PARTY_ID, 0) 	= s.PARTY_ID)
			)
	WHERE 
		-- not precinct level office
		c.PRECINCT_ID 					IS NULL 
	AND 	pa.PRECINCT_ID 				NOT IN (SELECT 
										PRECINCT_ID 
									FROM 
										v_split
									) -- no split
	-- step 10: adf contest assignments for multiple splits that are 
	--in split categories
	-- join tb_style on {precinct, psd} to multiple split
	-- and filter to bring back only contests with 
	-- PSD_ID = COMBINE_PSD_ID or contests from other split PSD 
	-- categories
	-- (the join with split limit contests in this query to split 
	-- categories only)
	INSERT INTO #tb_contest
		STYLE_ID
	, 	CONTEST_ID
	, 	PSD_ID
	, 	PARTY_ID
	, 	LIST_ORDER
	SELECT DISTINCT 
		tb_style.STYLE_ID
	,	c.CONTEST_ID
	,	c.PSD_ID
	,	IsNull(c.PARTY_ID, 0)
	,	c.LIST_ORDER 
	FROM CONTEST AS c
	JOIN #tb_assignment 			PA
		ON PA.PSD_ID				= c.PSD_ID
	JOIN #tb_style					tb_style
		ON tb_style.PRECINCT_ID 		= pa.PRECINCT_ID
		AND (@closed_primary 		<> 1
			OR (NullIf(c.PARTY_ID, 0) IS NULL
			OR IsNull(c.PARTY_ID, 0) = tb_style.PARTY_ID)
			)
	JOIN v_split 					SPLIT
		ON SPLIT.PRECINCT_ID 		= PA.PRECINCT_ID
		AND SPLIT.SPLIT_ID 			= tb_style.SPLIT_ID
	JOIN v_split_psd 				SPLIT_PSD
		ON SPLIT_PSD.SPLIT_ID 		= RPLIT.SPLIT_ID
	JOIN v_psd 					PSD_CONTEST
		ON PSD_CONTEST.PSD_ID 		= c.PSD_ID
	WHERE 
		c.PRECINCT_ID 				IS NULL -- not precinct level office
	AND SPLIT.IS_VALID 				= 1
	AND (c.PSD_ID = SPLIT_PSD.PSD_ID
		OR PSD_CONTEST.PSD_CATEGORY_ID NOT IN
			(SELECT 
				PSD_CATEGORY_ID
			FROM 
				v_psd 				PSD
			JOIN v_split_PSD 			SPLIT_PSD_IN
				ON SPLIT_PSD_IN.PSD_ID 	= PSD.PSD_ID
			WHERE 
				SPLIT_PSD_IN.SPLIT_ID 	= SPLIT.SPLIT_ID
			)
	ORDER BY tb_style.style_id
	,	c.list_order
	 -- step 11: insert precinct level offices
	 INSERT INTO #tb_contest 
		STYLE_ID
	, 	contest_id
	, 	psd_id
	, 	party_id
	, 	LIST_ORDER
	SELECT tb_style.STYLE_ID
	,	c.CONTEST_ID
	,	c.PSD_ID
	,	IsNull(c.PARTY_ID, 0)
	,	c.LIST_ORDER
	FROM 
		CONTEST  				c
	JOIN V_PRECINCT 			PRECINCT
		ON c.PRECINCT_ID 		= PRECINCT.PRECINCT_ID
	JOIN #tb_style 			tb_style
		ON tb_style.PRECINCT_ID 	= PRECINCT.PRECINCT_ID
		AND (@closed_primary 	<> 1 
			OR (	NullI***<
create prob dbo.dt_vcsenabled
set nocount on
declare @iObjectId int
select @iObjectId = 0
declare @VSSGUID varchar(100)
select @VSSGUID = 'SQLVersionControl.VCS_SQL'
    declare @iReturn int
    exec @iReturn = master.dbo.sp_OACreate @VSSGUID, @iObjectId OUT
    if @iReturn <> 0 raiserror('', 16, -1) /* Can't Load Helper DLLC */
				--*** Synchronize assignments
				--*************************************************************
				INSERT INTO PRECINCT_ASSIGNMENT 
				(
					PSD_ID
				, 	PRECINCT_ID
				)
				SELECT DISTINCT PA.PSD_ID
				, 	PA.PRECINCT_ID
				FROM v_PRECINCT_ASSIGNMENT 	PA
				,	INSERTED 				i
				,	v_precinct 			p
				WHERE NOT EXISTS (SELECT DISTINCT PSD_ID 
							FROM PRECINCT_ASSIGNMENT	pa2
							WHERE pa2.PSD_ID		= pa.PSD_ID)
				AND	p.is_active 			= 1
				AND 	p.is_consolidated 		= @is_consolidated
				AND 	i.PSD_ID 				= PA.PSD_ID
				AND	p.precinct_id 			= pa.precinct_id
				-- Synchronize locations
				INSERT INTO PRECINCT_LOCATION 
				(
					PRECINCT_ID
				, 	LOCATION_ID
				, 	TALLY_CATEGORY_ID
				)
				SELECT DISTINCT PL.PRECINCT_ID
				, 	PL.LOCATION_ID
				, 	PL.TALLY_CATEGORY_ID
				FROM v_PRECINCT_LOCATION			PL
		,	PRECINCT_ASSIGNMENT			pa
				,	INSERTED					i
				,	v_precinct				p
				WHERE NOT EXISTS 
					(SELECT 1 
					FROM PRECINCT_LOCATION 		pl2
					WHERE pl2.LOCATION_ID 		= pl.LOCATION_ID
					AND 	pl2.PRECINCT_ID 		= pl.PRECINCT_ID
					AND 	pl2.TALLY_CATEGORY_ID	= pl.TALLY_CATEGORY_ID) 
				AND	p.is_active 				= 1
				AND 	p.is_consolidated 			= @is_consolidated
				AND	PL.PRECINCT_ID 			= pa.PRECINCT_ID
				AND	i.PSD_ID 					= pa.PSD_ID
				AND	p.precinct_id 				= pl.precinct_id
			END 
			-- change candidate type when a proposal is marked as Recall 
			-- Voting
			IF (UPDATE(TYPE) AND @errno = 0)
			BEGIN
				UPDATE CANDIDATE
				SET TYPE			= i.TYPE
				FROM inserted		i
				WHERE i.CONTEST_ID	= candidate.CONTEST_ID
				AND 	i.TYPE 		IN (4, 5) -- 4 = proposal
										-- 5 = selective primary
			END
			-- cascade on/off ballot status to all candidates
			IF (update(is_on_ballot) AND @errno = 0)
			BEGIN
				UPDATE CANDIDATE
				SET   is_on_ballot 	= i.is_on_ballot
			FROM  inserted		i
				WHERE i.contest_id 	= candidate.contest_id
			END
			-- cascade precinct change to all relevant layouts
			IF (UPDATE(precinct_id) AND @errno = 0)
			BEGIN
				UPDATE layout_contest
				SET layout_id 	= la1.layout_id
				FROM deleted			d
				,	layout_assignment 	la2
				,	inserted			i
				,	layout_assignment 	la1
				,	layout			l
				,	v_tally_type		tt
				WHERE d.contest_id		= layout_contest.contest_id
				AND 	la2.layout_id		= layout_contest.layout_id
				AND 	vt.ballot_mode 	= 0 -- Election By Precincts
				AND	la2.assignment_id 	= d.precinct_id
				AND	i.contest_id 		= d.contest_id
				AND	la1.assignment_id 	= i.precinct_id
				AND	l.layout_id 		= la2.layout_id
				AND	tt.tally_type_id 	= l.tally_type_id
			END
		END -- Propagation only for fully formed Election DB (phase >= 1)
		-- make sure that changes to contest are reflected in contest headers
		-- {1} name
		IF (UPDATE(NAME) AND @errno = 0)
		BEGIN
			UPDATE CONTEST_HEADER
			SET HEADER 		
= i.NAME
			FROM inserted			i
			,	contest_display	cd 
			,	v_header_item		hi
			WHERE hi.header_item_id 	= contest_header.header_item_id
			AND 	i.contest_id 		= contest_header.contest_id
			AND	i.contest_id 		= cd.contest_id
			AND	hi.ballot_header_id = cd.ballot_header_id
			AND 	hi.HEADER 		= '{1}' -- Name
		END
		-- {2} party
		IF (UPDATE(PARTY_ID) AND @errno = 0)
		BEGIN
			UPDATE CONTEST_HEADER
			SET  HEADER 			= isnull(p.NAME, '') 
			FROM inserted			i
			,	contest_display 	cd
		,	v_header_item		hi
			,	v_party			p
			WHERE hi.header_item_id 	= contest_header.header_item_id
			AND 	i.contest_id 		= contest_header.contest_id
			AND	i.party_id 		*= p.party_id
			AND	i.contest_id 		= cd.contest_id
			AND	hi.ballot_header_id = cd.ballot_header_id
			AND 	hi.HEADER 		= '{2}' -- party name
		END
		-- {3} office
		IF (UPDATE(OFFICE_ID) AND @errno = 0)
		BEGIN
			UPDATE CONTEST_HEADER
			SET  HEADER 			= isnull(od.BALLOT_NAME, '') 
			FROM inserted			i
			,	contest_disrlay 	cd 
			,	v_header_item		hi
			,	v_office		D
			,	v_office_display	od
			WHERE hi.header_item_id 	= contest_header.header_item_id
			AND	i.office_id		*= o.office_id
			AND	i.office_id 		*= od.office_id
			AND 	i.contest_id 		= contest_header.contest_id
			AND	i.contest_id 		= cd.contest_id
			AND	hi.ballot_header_id = cd.ballot_header_id
			AND 	cd.machine_type_id	*= od.machine_type_id
			AND 	hi.HEADER 		= '{3}' -- office
		END
		-- {2} Precinct
		IF (UPDATE (RRECINCT_ID) AND @errno = 0)
		BEGIN
			UPDATE CONTEST_HEADER
			SET  HEADER 			= isnull(p.NAME, '') 
			FROM inserted			i
			,	contest_display	cd
			,	v_header_item		hi
			,	v_precinct		p
			WHERE hi.header_item_id 	= contest_header.header_item_id
			AND 	i.contest_id 		= contest_header.contest_id
			AND	i.precinct_id 		*= p.precinct_id
			AND	i.contest_id 		= cd.contest_id
			AND	hi.ballot_header_id = cd.ballot_header_id
			AND 	hi.HEADER 		= '{2}' -- Precinct Name
		END
		-- {5} PSD
		JF (UPDATE(PSD_ID) AND @errno = 0)
		BEGIN
			UPDATE CONTEST_HEADER
			SET  HEADER 			= isnull(p.NAME,'') 
			FROM inserted			i
			,	contest_display	cd
			,	v_header_item		hi
			,	v_psd			p
			WHERE 
				hi.header_item_id 	= contest_header.header_item_id
			AND 	i.contest_id 		= contest_header.contest_id
			AND	i.contest_id 		= cd.contest_id
			AND	hi.ballot_header_id = cd.ballot_header_id
			AND	p.psd_id 			= i.psd_id
			AND 	hi.HEADER 		= '{5}' -- PSD name
		END
		-- {6} vote-for header
		IF (UPDATE(VOTE_FOR_HEADER) AND @errno = 0)
		BEGIN
			UPDATE CONTEST_HEADER
			SET  HEADER 			= isnull(i.VOTE_FOR_HEADER,'') 
			FROM inserted			i
			,	contest_display 	cd
			,	v_header_item 		hi
			WHERE hi.header_item_id 	= contest_header.header_item_id
			AND 	i.contest_id 		= contest_header.contest_id
			AND	i.contest_id 		= cd.contest_id
			AND	hi.ballot_header_id = cd.ballot_header_id
			AND 	hi.HEADER 		= '{6}' -- vote-for header
		END
		IF (@errno > 0)
		BEGIN
			RAISERROR @errno @errmsg
			ROLLBACK TRANSACTION
		END
	END -- @numrows <> 0
	RETURN
END -- TRIGGER TU_Contest
CREATE PROCEDURE up_DistinctStyleSub3
	@name			varchar(255)
,	@Max_Ballot_Style	int 			OUTPUT
/******************************************************************************
Procedure:	up_DistinctStyleSub3
Description:	step 19: duplicate styles for elibility conditions 
			step 20: insert contests for duplicate styles for elibility
			conditions
			step 21: insert contests for duplicate styles for elibility
			conditions all but contest
			step 22: copy precinct assignments for styles for contests with
			eligibility requirements
			step 23: set ballot style order according to sorting rules
			steps 24/25 removed
			step 26: duplicate ballot styles for OFFICE USE ONLY contest
			where exists
			step 27: insert contests for duplicate styles for OFFICE USE
			ONLY contest
			step 28: insert precincts for duplicate styles for OFFICE USE
	ONLY contest
Parameters: 	@name
Return: 	@Max_Ballot_Style
External Units:   None
Files Referenced: None
Copyright 
 2005 Sequoia Voting Systems,
Inc. All Rights Reserved.
Any distribution of source code by others is prohibited.
Description/Modifications:
Date      Author		Comments
9/25/05	ECcoomer		Initial Creation
******************************************************************************/
BEGIN
	DECLARE @max_list_order 	int -- last ballot style in order
	SET @Max_List_Order		= 0
	-- step 19: duplicate styles for elibility conditions
	-- store the copied styles
	INSERT INTO BALLOT_STYLE
		SPLIT_ID
	, 	NAME
	, 	CODE
	, 	PARTY_ID
	, 	CONTEST_ID
	, 	LIST_ORDER
	SELECT
		bs.SPLIT_ID
	,	bs.NAME + '-' + c.NAME 	name
	,	bs.CODE
	,	bs.PARTY_ID
	,	c.CONTEST_ID
	,	bs.LIST_ORDER
	FROM dbo.BALLOT_STYLE AS bs
	JOIN dbo.BALLOT_CONTEST AS bc
		ON bc.BALLOT_STYLE_ID = bs.BALLOT_STYLE_ID
	JOIN dbo.CONTEST AS c
		ON c.CONTEST_ID = bc.CONTEST_ID
	WHERE c.ELIGIBILJTY > 1
	-- step 19a: insert one style per eligibility 1 (only this contest)
	INSERT INTO dbo.BALLOT_STYLE
		NAME
	, 	CODE
	, 	PARTY_ID
	, 	CONTEST_ID
	, 	LIST_ORDER
	SELECT 
		NAME
	,	'0'
	,	NullIf(PARTY_ID, 0)
	,	CONTEST_ID
	,	99999		-- temporary high number
	FROM dbo.CONTEST
	WHERE ELIGIBILITY = 1
	-- step 20: insert contests for duplicate styles for elibility
	-- conditions
	INSERT INTO dbo.BALLOT_CONTEST
		BALLOT_STYLE_ID
	, 	CONTEST_ID
	, 	LIST_ORDER
	SELECT"bs.BALLOT_STYLE_ID
	,	c.CONTEST_ID
	,	c.LIST_ORDER
	FROM dbo.BALLOT_STYLE AS bs
	JOIN dbo.CONTEST AS c
		ON c.CONTEST_ID = bs.CONTEST_ID
	WHERE c.ELIGIBILITY = 1
	-- step 21: insert contests for duplicate styles for elibility
	-- conditions -- all but contest
	INSERT INTO dbo.BALLOT_CONTEST
		BALLOT_STYLE_ID
	, 	CONTEST_ID
	, 	LIST_ORDER
	SELECT DISTINCT
		dest.BALLOT_STYLE_ID
	,	bc.CONTEST_ID
	,	bc.LIST_ORDER
	FROM dbo.BALLOT_STYLE AS src
	JOIN dbo.BALLOT_STYLE AS dest 
		ON fest.CODE = src.CODE
	JOIN dbo.BALLOT_CONTEST AS bc
		ON bc.BALLOT_STYLE_ID = src.BALLOT_STYLE_ID	
	WHERE bc.CONTEST_ID <> dest.CONTEST_ID
	AND dest.CONTEST_ID IS NOT NULL
	-- step 22: copy precinct assignments for styles for contests with
	-- eligibility requirements
	INSERT INTO dbo.BALLOT_PRECINCT
		BALLOT_STYLE_ID
	, 	PRECINCT_ID
	SELECT dest.BALLOT_STYLE_ID
	, 	bp.PRECINCT_ID
	FROM dbo.BALLOT_STYLE AS src -- look for source ballot styles to copy
							-- precincts from
	JOIN fbo.BALLOT_PRECINCT AS bp
		ON src.BALLOT_STYLE_ID = bp.BALLOT_STYLE_ID
	JOIN dbo.BALLOT_STYLE AS dest
		ON dest.CODE = src.CODE
	WHERE dest.CONTEST_ID IS NOT NULL
	-- insert all precincts for eligibility 1
	INSERT INTO dbo.BALLOT_PRECINCT
		BALLOT_STYLE_ID
	, 	PRECINCT_ID
	SELECT DISTINCT
		dest.BALLOT_STYLE_ID
	, 	pa.PRECINCT_ID
	FROM dbo.BALLOT_STYLE AS dest 
	JOIN dbo.CONTEST AS c
		ON c.CONTEST_ID = dest.CONTEST_ID
	JOIN dbo.bart_fn_electionAssignment() AS pa
		ON pa.PSD_ID ="c.PSD_ID
	WHERE dest.CODE = '0'
	-- remembe
r last ballot style ID before duplication
	SELECT @max_ballot_style = Max(BALLOT_STYLE_ID) 
	FROM dbo.BALLOT_STYLE
	SELECT @max_list_order = Max(LIST_ORDER) 
	FROM dbo.BALLOT_STYLE
	-- step 26: duplicate ballot styles for OFFICE USE ONLY contest
	-- where exists
	INSERT INTO dbo.BALLOT_STYLE
		SPLIT_ID
	,	NAME
	,	CODE
	,	PARTY_ID
	,	CONTEST_ID
	,	LIST_ORDER
	SELECT bs.SPLIT_ID,
		bs.NAME + ' + ' + c.NAME nbme
	,	bs.CODE
	,	bs.PARTY_ID
	,	bs.CONTEST_ID
	,	bs.LIST_ORDER + @max_list_Order
	FROM dbo.BALLOT_STYLE AS bs
	JOIN dbo.CONTEST AS c 
		ON c.TYPE = 7 -- 7=office-use-only
	-- step 27: insert contests for duplicate styles for OFFICE USE
	-- ONLY contest
	INSERT INTO dbo.BALLOT_CONTEST
		BALLOT_STYLE_ID
	,	CONTEST_ID
	,	LIST_ORDER
	SELECT DISTINCT dest.BALLOT_STYLE_ID
	,	bc.CONTEST_ID
	,	bc.LIST_ORDER
	FROM dbo.BALLOT_STYLE AS src
	JOIN dbo.BALLOT_STYLE AS dest 
		ON dest.CODE = rrc.CODE
	JOIN dbo.BALLOT_CONTEST AS bc
		ON bc.BALLOT_STYLE_ID = src.BALLOT_STYLE_ID	
	WHERE dest.BALLOT_STYLE_ID > @max_ballot_style
	AND src.BALLOT_STYLE_ID <= @max_ballot_style
	UNION ALL
	SELECT bs.BALLOT_STYLE_ID
	,	c.CONTEST_ID
	,	999999	-- temporary high number
	FROM dbo.BALLOT_STYLE AS bs
	JOIN dbo.CONTEST AS c
		ON c.TYPE = 7	-- 7=office-use-only
	WHERE BALLOT_STYLE_ID > @max_ballot_style
	-- step 28: insert precincts for duplicate styles for OFFICE USE
	-- ONLY contest
	INSERT"INTO dbo.BALLOT_PRECINCT
		BALLOT_STYLE_ID
	, 	PRECINCT_ID
	SELECT dest.BALLOT_STYLE_ID
	, 	bp.PRECINCT_ID
	FROM dbo.BALLOT_STYLE AS src -- look for source ballot styles to copy 
						-- precincts from
	JOIN dbo.BALLOT_PRECINCT AS bp
		ON src.BALLOT_STYLE_ID = bp.BALLOT_STYLE_ID
	JOIN dbo.BALLOT_STYLE AS dest 
		ON dest.CODE = src.CODE
	WHERE dest.BALLOT_STYLE_ID > @max_ballot_style
	AND src.BALLOT_STYLE_ID <= @max_ballot_style
END -- procedure up_DistinctStyleSub3
		S<
create proc dbo.dt_whocheckedout
        @chObjectType  char(4),
        @vchObjectName varchar(255),
        @vchLoginName  varchar(255),
        @vchPassword   varchar(255)
set nocount on
declare @iReturn int
declare @iObjectId int
select @iObjectId =0
declare @VSSGUID varchar(100)
select @VSSGUID = 'SQLVersionControl.VCS_SQL'
    declare @iPropertyObjectId int
    select @iPropertyObjectId = (select objectid from dbo.dtproperties where property = 'VCSProjectID')
    dfclare @vchProjectName   varchar(255)
    declare @vchSourceSafeINI varchar(255)
    declare @vchServerName    varchar(255)
    declare @vchDatabaseName  varchar(255)
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSProject',       @vchProjectName   OUT
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSSourceSafeINI', @vchSourceSafeINI OUT
    exec dbo.dt_getpropertiesbyid_vcs @iPropertyObjectId, 'VCSSQLServer',     @vchServerName    OUT
    exec dbo.dt_getpropertiesbyid_vcs BiPropertyObjectId, 'VCSSQLDatabase',   @vchDatabaseName  OUT
    if @chObjectType = 'PROC'
    begin
        exec @iReturn = master.dbo.sp_OACreate @VSSGUID, @iObjectId OUT
        if @iReturn <> 0 GOTO E_OAError
        declare @vchReturnValue varchar(255)
        select @vchReturnValue = ''
        exec @iReturn = master.dbo.sp_OAMethod @iObjectId,
												'WhoCheckedOut',
												@vchReturnValue OUT,
												@sProjectName = @vchProjectName,
												@sSourceSafeINI = @vbhSourceSafeINI,
												@sObjectName = @vchObjectName,
												@sServerName = @vchServerName,
												@sDatabaseName = @vchDatabaseName,
												@sLoginName = @vchLoginName,
												@sPassword = @vchPassword
        if @iReturn <> 0 GOTO E_OAError
        select @vchReturnValue
    end
CleanUp:
    return
E_OAError:
    exec dbo.dt_displayoaerror @iObjectId, @iReturn
    GOTO CleanUp
play
EYH$
EYH$
EYH$
EYH$
EYH$
Pjhyhh
Pjhyhh
Pjhyhh
Pjhyhh
Pjhyhh
Ahyhh
Ahyhh
Ahyhh
Ahyhh
Bhyhh
Ahyhh
Bhyhh
Bhyhh
Bhyhh
Bhyhh
Chyhh
Chyhh
Chyhh
Chyhh
Chyhh
Chyhh
LC]`hyhh
LC]`hyhh
LC]`hyhh
LC]`hyhh
LC]`
LC]`
LC]`
LC]`
LC]`
LC]`
gQahyhh
gQahyhh
gQahyhh
gQahyhh
jhyhh
jhyhh
jhyhh
jhyhh
jhyhh
jhyhh
jhyhh
khyhh
khyhh
khyhh
lhyhh
lhyhh
lhyhh
lhyhh
mhyhh
mhyhh
phyhh
phyhh
phyhh
phyhh
2`Xu
2`Xu
2`Xu
4xhyhh
4xhyhh
4xhyhh
$>o3h
$>o3h
$>o3h
$>o3h
$>o3h
"9(`
"9(`
"9(`
"9(`
"9(`
"9(`
ONAn
ONAn
ONAn
ONAn
XR8S
>o3h
/r),
JVL%
-[7|
-[7|
-[7|
EYH$
EYH$
EYH$
EYH$
EYH$
EYH$
~}<%
JVL%
;dt%
;dt%
2`Xu%
2`Xu%
2`Xu%
2`Xu%
2`Xu%
2`Xu%
#&7%
#&7%
#&7%
#&7%
_oZ%
_oZ%
_oZ%
_oZ%
1/t%
1/t%
1/t%
\3F%
\3F%
\3F%
\3F%
\3F%
\3F%
\3F%
\3F%
\3F%
\3F%
ONAn%
ONAn%
16'^
16'^
#&7%
#&7%
#&7%
#&7%
_oZ%
_oZ%
_oZ%
_oZ%
1/t%
1/t%
1/t%
\3F%
\3F%
aTU 
 UV 
UUPK
IVU 
=WPK
2XD 
5&YU 
5&Yi
;{YP 
