все что связано с моей работой
Главная » Програмирование » АИСБП версия 13-65. Установка

АИСБП версия 13-65. Установка

Только-только установил поселениям базу на 13-й год, как надо снова АИСБП.

В инструкции к этой версии было следующее пожелание и разъяснение:

УБЕДИТЕЛЬНАЯ ПРОСЬБА!!!!!!

Сохранять в текстовом формате протоколы выполнения скриптов (и в случае успешного выполнения или с ошибками). В случае возникновения вопросов при эксплуатации АИСБП разбираться с проблемами и ошибками будем только при наличии протоколов.

Обращаем Ваше внимание, что скрипты выполняются только один раз. Если в результате выполнения скрипта сообщение в строке состояния: «Запрос завершен с ошибками» и получен протокол ошибок — это означает, что установка версии не выполнена. Если даже сообщение в строке состояния: «Запрос успешно выполнен», следует обращать внимание на содержание протокола выполнения скрипта.

Если в протоколе сообщение:
«Не корректно была выполнена установка версии ….. для БД Budget..K»
или
«Убедитесь, что вы установили предыдущую версию АИСБП .….»
или

!!!!!! ВНИМАНИЕ !!!!!!
Установка ….. ПРЕРВАНА!!! Обратитесь к разработчику !!!!!!!
ВНИМАНИЕ !!!!!!!!

Если с первой частью все в порядке, все равно результаты всех скриптов сохраняются, чтобы самому проверить наличие ошибок, то вот со вторая часть, об ошибках установки … Такое поведение скриптов может сильно осложнить жизнь, т.к. теперь проверка ERRORLEVEL по сути бесполезна.

«Ищущие да обрящут». Рыская по тырнету в поисках возможности прерывания выполнения скриптов и возврата кода ошибки наткнулся RAISERROR, которая вызывает ошибку. В параметрах передается текст, важность и (!) код возврата. Немного изменив скрипт 2012.sql, а именно по вставляв RAISERROR везде перед SET EXEC OFF,  вот так:

------------------------------------------------------------------------------
--  СКРИПТ 1 для БД Budget12K (версия 13.65) ---------------------------------
------------------------------------------------------------------------------
USE [Budget12K]
GO

print GETDATE() 
Declare @VN Money
select @VN=VersionNumber from Budget12K..Apps_Update where VersionNumber in (select max(VersionNumber) from Budget12K..Apps_Update) 
Print 'Текущая версия '+ cast(@VN  as varchar)

SET NOEXEC OFF
GO
IF Exists (select * from Budget12K..Apps_Update where VersionNumber in (select max(VersionNumber) from Budget12K..Apps_Update)and VersionNumber=13.47) 
BEGIN
	if exists (SELECT * FROM sysobjects inner join syscolumns on (sysobjects.id=syscolumns.id) WHERE sysobjects.name = 'ZF_ROF' AND sysobjects.type = 'U' and syscolumns.name='K_TRGID')
	Begin
		PRINT '--------------------------------------------------------'
		PRINT '|                                                      |'
		PRINT '| Устанавливаем СКРИПТ 1 для БД Budget12K версии 13.65 |'
		PRINT '|                                                      |'
		PRINT '--------------------------------------------------------'
	end
Else 
	Begin
		PRINT ''
		PRINT '                                !!!!!!!!  ВНИМАНИЕ  !!!!!!!!'
		PRINT ''
		PRINT '       Не корректно была выполнена установка версии 13.47 для БД Budget12K '
		PRINT ''
		PRINT '                Установка    ПРЕРВАНА!!!    Обратитесь к разработчику'
		PRINT ''
		PRINT '                                !!!!!!!!  ВНИМАНИЕ  !!!!!!!!'
	    RAISERROR (N'',10,1);
        SET NOEXEC ON
	End
END
ELSE BEGIN 
	IF Exists (select * from Budget12K..Apps_Update where VersionNumber in (select max(VersionNumber) from Budget12K..Apps_Update)and VersionNumber<13.47) 
	Begin
		PRINT ''
		PRINT '                                    !!!!!!  ВНИМАНИЕ  !!!!!!'
		PRINT ''
		PRINT '               Убедитесь, что вы установили предыдущую версию АИСБП 13.47 '
		PRINT ''
		PRINT '   Установка СКРИПТ 1 версии 13.65 для БД Budget12K    ПРЕРВАНА!!!   Обратитесь к разработчику'
		PRINT ''
		PRINT '                                !!!!!!!!  ВНИМАНИЕ  !!!!!!!!'
	    RAISERROR (N'',10,2);
	End
		ELSE BEGIN 
	PRINT ''
	PRINT '                                    !!!!!!  ВНИМАНИЕ  !!!!!!'
	PRINT ''
	PRINT '   Установка СКРИПТ 1 версии 13.65 для БД Budget12K   ПРЕРВАНА!!!    Обратитесь к разработчику'
	PRINT ''
	PRINT '                                !!!!!!!!  ВНИМАНИЕ  !!!!!!!!'
		END
	RAISERROR (N'',10,3);
	SET NOEXEC ON
END
GO

Print '----------------------------------Apps_Update-----------------------------------------------------------'
go
If Not Exists(Select * from Apps_Update Where VersionNumber=13.65)
 Insert Into Apps_Update (FileName, VersionNumber, UpdatePath, Description, ChangeLocalDatabase)
 Values('Budget2k.mdb', 13.65, '\\depo\App\', 'Новое в версии 13.65', 0)
Go

И сразу заменил в Apps_Update \\Server\App\ на \\depo\App — так обновление клиентской части стартует автоматом, как положено. Текст для сообщений вписывать не стал все пишется раньше. Важность оставил 10, в примере так было, код возврата ставил разный, хотя тоже можно было одинаковый, все равно не обрабатываю.

В скрипте 2013.sql в самом начале раскомментировал строки, этот баг важен только если вы выполняете скрипт с помощью sqlcmd, если вы исполняете в Studio то там после выполнения 2012.sql текущей базой становится Budget13K и никаких проблем:

USE [Budget13K]
GO

И исправил Apps_Update. Переименовал «Скрипт для баз прошлых лет.sql» в «old.sql» – лень писать.

Немного доделал сценарий установки:

@echo off
rem ************************
set SQLCMDUSER=sa
set SQLCMDPASSWORD=stop
set SQLCMDSERVER=DEPO
set SQLCMDDBNAME=Budget12K

set SQLCMD="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe"
set BACKUP=C:\mssql2005\backup\
rem ************************
cls
del /F /Q c:\result.*
del /F /Q result.* 
del *.txt

echo ===== Поселение: >> result.txt
%SQLCMD% -b -o 1.txt -Q "declare @PosName varchar(50) select @PosName=ConstantDesc from dbo.Apps_Constants where ConstantName='CUL_KF' print @PosName"
if NOT %ERRORLEVEL%==0 (
  echo Error >> result.txt
  echo ЋиЁЎЄ  goto :END
)
type 1.txt >> result.txt
echo Backup 12K
echo ====== Backup 12K:  >> result.txt
%SQLCMD% -b -o backup12.txt -Q "BACKUP DATABASE [Budget12K] TO  DISK = N'%BACKUP%\12v1365b.bak' WITH NOFORMAT, INIT,  NAME = N'Budget12K-ЏҐаҐ¤ гбв ­®ўЄ®© 13-65', SKIP, NOREWIND, NOUNLOAD,  STATS = 10"
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  echo ЋиЁЎЄ  goto :END
)
type backup12.txt >> result.txt
echo Backup 13K
echo ====== Backup 13K:  >> result.txt
%SQLCMD% -b -o backup13.txt -Q "BACKUP DATABASE [Budget13K] TO  DISK = N'%BACKUP%\13v1365b.bak' WITH NOFORMAT, INIT,  NAME = N'Budget13K-ЏҐаҐ¤ гбв ­®ўЄ®© 13-65', SKIP, NOREWIND, NOUNLOAD,  STATS = 10"
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  echo ЋиЁЎЄ  goto :END
)
type backup13.txt >> result.txt

echo 2012
echo ====== 2012:  >> result.txt
%SQLCMD% -b -i 2012.sql -o 2012.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  echo ЋиЁЎЄ  goto :REST12
)
type 2012.txt >> result.txt

echo 2013
echo ====== 2013:  >> result.txt
%SQLCMD% -b -i 2013.sql -o 2013.txt
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  echo ЋиЁЎЄ  goto :REST13
)
type 2013.txt >> result.txt

echo Љ®ЇЁа㥬 Є«ЁҐ­вбЄго з бвм
echo ====== Копируем клиентскую часть:  >> result.txt
copy /Y Bud1365.exe ..\app\

echo ‘ЄаЁЇв ¤«п Ў § Їа®и«ле «Ґв
echo ====== Скрипт для баз прошлых лет:  >> result.txt
%SQLCMD% -i "old.sql" -o old.txt
type old.txt >> result.txt

goto :END

:REST13
echo ‚®ббв ­®ў«Ґ­ЁҐ 13K
echo ====== Restore 13K:  >> result.txt
%SQLCMD% -b -o restore13.txt -Q "RESTORE DATABASE [Budget13K] FROM DISK=N'%BACKUP%\13v1365b.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10"
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type restore13.txt >> result.txt

:REST12
echo ‚®ббв ­®ў«Ґ­ЁҐ 12K
echo ====== Restore 12K:  >> result.txt
%SQLCMD% -b -o restore12.txt -Q "RESTORE DATABASE [Budget12K] FROM DISK=N'%BACKUP%\12v1365b.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10"
if NOT %ERRORLEVEL%==0 (
  echo Error. >> result.txt
  goto :END
)
type restore12.txt >> result.txt

:END
"C:\Program Files\7-Zip\7z.exe" a -tzip -mx=9 c:\result.zip *.txt
copy /Y result.zip c:\ 
del *.txt

Первое и самое важное изменение — это восстановление баз в случае неудачной установки! Теперь все практически на 80% автоматизировано.

Несколько нюансов:

  1. два echo перед блоком, первый на экран, второй в файл результатов. Первый в OEM кодировке (DOS), второй в ANSI(Win1251)!!! Все время путаюсь ….
  2. Скрипт old.sql должен выполняться без ключа –b. Потому, что выполнение частей для баз которых нет, в поселениях нет баз меньше 2006 года, заканчивается ошибкой.

НЕСМОТРЯ на то, что они, обернуты в условие и select действительно возвращает пустой набор.

If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget2K' group by s_mf.database_id)
   Begin

USE [Budget2K]
Print 'Версия . Budget2K. Добавление рабочих таблиц'

Всегда ошибка на 5-й строке, т.е. срабатывает USE, с какого перепуга …

Вот укороченный вариант old.sql:

If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget2K' group by s_mf.database_id)
   Begin
USE [Budget2K]
Print 'Версия . Budget2K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------02
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget02K' group by s_mf.database_id)
   Begin
USE [Budget02K]
Print 'Версия . Budget02K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------03
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget03K' group by s_mf.database_id)
   Begin
USE [Budget03K]
Print 'Версия . Budget03K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------04
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget04K' group by s_mf.database_id)
   Begin
USE [Budget04K]
Print 'Версия . Budget04K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------05
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget05K' group by s_mf.database_id)
   Begin
USE [Budget05K]
Print 'Версия . Budget05K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------06
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget06K' group by s_mf.database_id)
   Begin
USE [Budget06K]
Print 'Версия . Budget06K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------07
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget07K' group by s_mf.database_id)
   Begin
USE [Budget07K]
Print 'Версия . Budget07K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------08
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget08K' group by s_mf.database_id)
   Begin
USE [Budget08K]
Print 'Версия . Budget08K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------09
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget09K' group by s_mf.database_id)
   Begin
USE [Budget09K]
Print 'Версия . Budget09K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------10
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget10K' group by s_mf.database_id)
   Begin
USE [Budget10K]
Print 'Версия . Budget10K. Добавление рабочих таблиц'
END
GO
------------------------------------------------------------------------------------------11
If Exists (select db_name(s_mf.database_id) from sys.master_files s_mf 
           where s_mf.state = 0 and db_name(s_mf.database_id)='Budget11K' group by s_mf.database_id)
   Begin
USE [Budget11K]
Print 'Версия . Budget11K. Добавление рабочих таблиц'
END
GO

А вот результат выполнения:

Сообщение 911, уровень 16, состояние 1, сервер DEPO, строка 4
Не удалось найти запись в таблице sysdatabases для базы данных "Budget2K". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.
Сообщение 911, уровень 16, состояние 1, сервер DEPO, строка 5
Не удалось найти запись в таблице sysdatabases для базы данных "Budget02K". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.
Сообщение 911, уровень 16, состояние 1, сервер DEPO, строка 5
Не удалось найти запись в таблице sysdatabases для базы данных "Budget03K". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.
Сообщение 911, уровень 16, состояние 1, сервер DEPO, строка 5
Не удалось найти запись в таблице sysdatabases для базы данных "Budget04K". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.
Сообщение 911, уровень 16, состояние 1, сервер DEPO, строка 5
Не удалось найти запись в таблице sysdatabases для базы данных "Budget05K". Запись с таким именем не найдена. Убедитесь, что имя введено правильно.
Контекст базы данных изменен на "Budget06K".
Версия . Budget06K. Добавление рабочих таблиц
Контекст базы данных изменен на "Budget07K".
Версия . Budget07K. Добавление рабочих таблиц
Контекст базы данных изменен на "Budget08K".
Версия . Budget08K. Добавление рабочих таблиц
Контекст базы данных изменен на "Budget09K".
Версия . Budget09K. Добавление рабочих таблиц
Контекст базы данных изменен на "Budget10K".
Версия . Budget10K. Добавление рабочих таблиц
Контекст базы данных изменен на "Budget11K".
Версия . Budget11K. Добавление рабочих таблиц

Как видно, при условии, что нет базы и возвращается пустой набор, скрипт все равно пытается выполниться. Может конечно я что-то не знаю про условия…
Еще плюшка: при создании SFX в WinRar, можно создавать ярлыки, одни из параметров имя папки куда поместить ярлык, так вот, можно использовать вложенные папки, если указывать их как путь, например АИСБП\Документация
Как всегда комментарий для SFX:

;Расположенный ниже комментарий содержит команды SFX-сценария

Path=C:\distrib\distAISBP_PFO\v13-65\
SavePath
Setup=C:\distrib\distAISBP_PFO\v13-65\start.bat
Silent=2
Overwrite=1
Title=Обновление АИСБП
License=АИСБП версия 13-65
{

Обновления для АИСБП:

  • АИСБП версия 13-65

ЧЕРНОЕ ОКНО НЕ ЗАКРЫВАТЬ!!!

} Shortcut=P, "C:\Distrib\distAISBP_PFO\v13-65\Инструкция_13-65.doc", АИСБП\Документация, Инструкция к версии 13-65, Инструкция к версии 13-65,

Скачать:

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.