DTS:репорт c Dynamic property task u global variable .помогите , очень надо

vesna*

добрый день ! у меня 10 клиентов , для кажого надо создать Еxcel репорт ( RecordSet из xранимои процедуры ) Hазвание Excel file должно складыватся из : клиент_имя +date 1 ) step DTS - Active X task , создание имя файла : как его создать если изпользовать таблицу Kлиентов ( cursor ? ) 2) sql connection , Transformation task : call xранимои процедуры с параметром - ID клиентa 3) Excel соединение - тоже должно бить в зависимости от шага 1) ( имя файла ) подскажите как мне использовать Dynami Property Task u Global Variable или может использовать dtsrun ??? помогите , очень надо !!!!
12 ответов

vesna*

Zdes vi naydete otveti na vse interesuushie voprosi po DTS http://www.sqldts.com/ Uda4i


vesna*

tam pochti nichego net pro Dynamic Property task :( Glory !!!! ia znay vi bol'shoi spesialist po DTS ...


vesna*

dlia cozdanie file ispol"zyu code : eto moi 1 step , kak cdelat" chtobi posle cozdania Excel file ego imia peredalos" cherez output variable v Global i zakluchitel'nii step (export to Excel ) ispol'zoval imenno eto coedinenie ????
'**********************************************************************
' Visual Basic ActiveX Script
'************************************************************************
Function Main()
Set XLA = CreateObject(<b>"Excel.Application"</b>)
Set wkbNew = XLA.Workbooks.Add
Set wksheet = wkbNew.Worksheets.Add
wksheet.name=<b>"Report"</b>
wksheet.Cells(<b>1</b>, <b>1</b>).Value = <b>"TotalReceived"</b>
wksheet.Cells(<b>1</b>, <b>2</b>).Value = <b>"KilledReceived"</b>
 For i = <b>1</b> to XLA.WorkBooks(<b>1</b>).Sheets.Count
 XLA.WorkBooks(<b>1</b>).Sheets(i).Activate()
 RowsCnt = XLA.ActiveCell.CurrentRegion.Rows.Count
 ColsCnt = XLA.ActiveCell.CurrentRegion.Columns.Count
 XLA.ActiveCell.CurrentRegion.Borders.LineStyle = <b>1</b>
 XLA.ActiveCell.CurrentRegion.Borders.Weight = <b>3</b>
If RowsCnt > <b>2</b> Then
 XLA.Range(XLA.Cells(<b>3</b>, <b>1</b>), XLA.Cells(RowsCnt, ColsCnt)).Borders(<b>3</b>).LineStyle = <b>3</b>
End if
If RowsCnt > <b>1</b> Then
 XLA.Range(XLA.Cells(<b>2</b>, <b>1</b>), XLA.Cells(RowsCnt-<b>1</b>, ColsCnt)).Borders(<b>4</b>).LineStyle = <b>3</b>
End if
XLA.Range(XLA.Cells(<b>1</b>, <b>1</b>), XLA.Cells(<b>1</b>, ColsCnt)).Font.Bold = True
XLA.Range(XLA.Cells(<b>1</b>, <b>1</b>), XLA.Cells(<b>1</b>, ColsCnt)).HorizontalAlignment = <b>3</b>
XLA.Range(XLA.Cells(<b>1</b>, <b>1</b>), XLA.Cells(<b>1</b>, ColsCnt)).VerticalAlignment = <b>2</b>
XLA.Range(XLA.Cells(<b>1</b>, <b>1</b>), XLA.Cells(<b>1</b>, ColsCnt)).Interior.Color = <b>12632256</b>
XLA.ActiveCell.CurrentRegion.Columns.AutoFit
		Next
If Month(Now) < <b>10</b> Then
wkbNew.SaveAs <b>"C:\Reports\Report"</b>+<b>"_"</b>+CStr(Year(Now))+Cstr(Day(Now))+<b>"<b>0</b>"</b>+Cstr(Month(Now))+<b>".XLS"</b>
end if 
If Month(Now) > <b>10</b> Then
 kbNew.SaveAs <b>"C:\Report"</b>+<b>"_"</b>+CStr(Year(Now))+Cstr(Day(Now))+Cstr(Month(Now))+<b>".XLS"</b>
end if 
wkbNew.Application.Quit
Set XLA=Nothing
Main = DTSTaskExecResult_Success
End Function


vesna*

Почти все правильно. Только я делаю так - 1-ый ActiveX Script Task только создает файл с нужным именем
'**********************************************************************
' Visual Basic ActiveX Script
'************************************************************************
Function Main()
	Main = DTSTaskExecResult_Failure
Filename = "C:\Reports\Report" +"_"+ CStr(Year(Now)) + Right("0" + Cstr(Day(Now)), 2 ) + Right("0" + Cstr(Month(Now)), 2 ) + ".XLS"
	DTSGlobalVariables("OutputFileFullName").Value = Filename
Dim fso
	Set fso = CreateObject("Scripting.FileSystemObject")
	'Delete file if exists
	If (fso.FileExists(FileName)) Then
		fso.DeleteFile FileName, TRUE
	End If
	'Create Excel file
	If (fso.FileExists(FileName)) Then
		Main = DTSTaskExecResult_Failure
	Else
		Dim objXL
		Set objXL = CreateObject(<b>"Excel.Application"</b>)
objXL.Visible = FALSE
		objXL.WorkBooks.Add
Dim SheetsCnt
		Set SheetsCnt = objXL.WorkBooks(<b>1</b>).Sheets
		While SheetsCnt.Count > <b>1</b>
			objXL.WorkBooks(<b>1</b>).Sheets(SheetsCnt.Count).Delete
		Wend
objXL.WorkBooks(<b>1</b>).Sheets(<b>1</b>).Activate()
		objXL.WorkBooks(<b>1</b>).SaveAs(FileName)
		objXL.Quit
		Set objXL = Nothing
If (fso.FileExists(FileName)) Then
			Main = DTSTaskExecResult_Success
		Else
			Main = DTSTaskExecResult_Failure
		End If
	End If
End Function
- 2-ой Dynamic Properties Task устанавливает имя файла для Connection Add - Connections - Excel file Connection - Data Source - Set - Source:Global Variable - Variable:Variable with file name - Далее через Execute SQL Task создаем worksheet-ы Например CREATE TABLE `Invoices` ( `Period` VarChar (7) , `Count` Decimal (10,0) , `Sum` Decimal (10,2) ) Не забудьте только в Execute SQL Task указывать в Existing connection ваш коннект к Excel файлу - Далее идут Transformation Task-и - И наконец форматирование конечного файла
'**********************************************************************
' Visual Basic ActiveX Script
'************************************************************************
Function Main()
Dim FileName
	FileName = DTSGlobalVariables(<b>"OutputFileFullName"</b>).Value
Dim fso
	Set fso = CreateObject(<b>"Scripting.FileSystemObject"</b>)
Main = DTSTaskExecResult_Failure
	If (fso.FileExists(FileName)) Then
		Dim objXL
		Set objXL = CreateObject(<b>"Excel.Application"</b>)
objXL.Visible = FALSE
		objXL.WorkBooks.Open(FileName)
Dim SheetsCnt
		If (objXL.WorkBooks(<b>1</b>).Sheets.Count > <b>1</b>) Then
			objXL.WorkBooks(<b>1</b>).Sheets(<b>1</b>).Delete
		End if
For i = <b>1</b> to objXL.WorkBooks(<b>1</b>).Sheets.Count
			objXL.WorkBooks(<b>1</b>).Sheets(i).Activate()
RowsCnt = objXL.ActiveCell.CurrentRegion.Rows.Count
			ColsCnt = objXL.ActiveCell.CurrentRegion.Columns.Count
objXL.ActiveCell.CurrentRegion.Borders.LineStyle = <b>1</b>
			objXL.ActiveCell.CurrentRegion.Borders.Weight = <b>3</b>
If RowsCnt > <b>2</b> Then
				objXL.Range(objXL.Cells(<b>3</b>, <b>1</b>), objXL.Cells(RowsCnt, ColsCnt)).Borders(<b>3</b>).LineStyle = <b>3</b>
			End if
			If RowsCnt > <b>1</b> Then
				objXL.Range(objXL.Cells(<b>2</b>, <b>1</b>), objXL.Cells(RowsCnt-<b>1</b>, ColsCnt)).Borders(<b>4</b>).LineStyle = <b>3</b>
			End if
objXL.Range(objXL.Cells(<b>1</b>, <b>1</b>), objXL.Cells(<b>1</b>, ColsCnt)).Font.Bold = True
			objXL.Range(objXL.Cells(<b>1</b>, <b>1</b>), objXL.Cells(<b>1</b>, ColsCnt)).HorizontalAlignment = <b>3</b>
			objXL.Range(objXL.Cells(<b>1</b>, <b>1</b>), objXL.Cells(<b>1</b>, ColsCnt)).VerticalAlignment = <b>2</b>
			objXL.Range(objXL.Cells(<b>1</b>, <b>1</b>), objXL.Cells(<b>1</b>, ColsCnt)).Interior.Color = <b>12632256</b>
objXL.ActiveCell.CurrentRegion.Columns.AutoFit
		Next
objXL.WorkBooks(<b>1</b>).Save
		objXL.Quit
		Set objXL = Nothing
Main = DTSTaskExecResult_Success
	End If
End Function


vesna*

ogromnoe spacibo Glory !!!!


vesna*

Glory ! eshe odin vopros :
Filename = <b>"C:\Reports\[b]Report[/b]"</b> +<b>"_"</b>+ CStr(Year(Now)) + Right(<b>"<b>0</b>"</b> + Cstr(Day(Now)), <b>2</b> ) + Right(<b>"<b>0</b>"</b> + Cstr(Month(Now)), <b>2</b> ) + <b>".XLS"</b>
	DTSGlobalVariables(<b>"OutputFileFullName"</b>).Value = Filename
y menia est" table Clients , mne nado proxodit" po clientID i cozdavat" file c ychetom imeni ocherednogo clienta :
Filename = <b>"C:\Reports\[b]Client_Name_Report[/b]"</b> +<b>"_"</b>+ CStr(Year(Now)) + Right(<b>"<b>0</b>"</b> + Cstr(Day(Now)), <b>2</b> ) + Right(<b>"<b>0</b>"</b> + Cstr(Month(Now)), <b>2</b> ) + <b>".XLS"</b>
	DTSGlobalVariables(<b>"OutputFileFullName"</b>).Value = Filename
a potom i procedura dolshna s etim ClientID otrabativat"


vesna*

Не понятно - Вы хотите организовать цикл внутри DTS Package ? или - Вы каким-то образом циклически запускаете DTS Package с параметрами ?


vesna*

da , package dolshen po idee otrabotat" stol'ko raz ckol'ko y menia clientov v tablice . vot kak ego zaciklit" proxodit" po tablice client brat" ocherednyu zapis" i kashdii raz run vcu cepochky dlia etogo clienta ? query nelzia ispolzovat" dlai Global variable :(


vesna*

Тогда так. 1. Создаем Global Variables, например, ClientNumber и ClientName. 2. Создаем Dynamic Properties Task. Обзываем его скажем Initialization. В ней присваиваем ClientNumber и ClientName значения " "(пробел) ну или 0(если ID числового типа). то нужно, чтобы цикл правильно стартовал 3. Создаем Execute SQL Task к SQL Server Connection с именем скажем Next Client и с запросом вроде такого
SELECT TOP <b>1</b> client_id, client_name
FROM dbo.myclients 
WHERE client_id > ? 
ORDER BY client_id
В Parameters - Input Parameters выбираем переменную ClientNumber В Parameters - Output Parameters - Row Value выбираем переменные ClientNumber и ClientName. (Предупреждение DTS Designer-а игнорируем) 4. Создаем ActiveX Script Task для проверки результатов выполнениняи предыдущего шага. Скрипт очень простой
Function Main()
	If (Len(Ltrim(Rtrim(DTSGlobalVariables(<b>"ClientNumber"</b>).Value))) = <b>0</b>) Then
		Main = DTSTaskExecResult_Failure
	Else
		Main = DTSTaskExecResult_Success
	End if
End Function
Для числового ClientNumber проверка должна быть иная - думаю понятно какая К сожалению проверку на окончание цикла нельзя сделать(у меня не получилось) в самом Execute SQL Task без оформления запроса в виде хранимой процедуры. Так что можете подумать что вам больше подходит. 5. Далее идут Task-и по формированию файла и добавлению в него данных. Переменные ClientNumber и ClientName содержат нужные нам значения. 6.И наконец - возврат к началу цикла. Добавляем еще один Dynamic Properties Task с именем Loop. В нем только одно действие Add - Steps - Тут ищем Step с Description-ом равным Next Client (см.п.3) - Execution Status - Set - Constant - 1 - Все перечисленные выше шаги связываются Workflow On success - Можно далее "обустроить" Package, создав действия для ситуаций On failure каждого шага или по крайней мере для шага завершения цикла. - Единственное неудобство такого подхода в том, что Package всегда будет завершаться со статусом failed, т.к. на этом основан цикл.


vesna*

spacibo vam bol'shoe , Glory !!!! :)


vesna*

2 GloryА не могли б Вы посказать как сделать так, что б в ActiveX Script (из Вашего примера) не спрашивал подтверждения удаления листа из книги Excel. Большое спасибо.


vesna*

Спасибо уже нашел.objXL.CutCopyMode = FalseobjXL.DisplayAlerts = False