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 ????
<pre class="prettyprint linenums">'********************************************************************** ' Visual Basic ActiveX Script '************************************************************************ Function Main() Set XLA = CreateObject("Excel.Application") Set wkbNew = XLA.Workbooks.Add Set wksheet = wkbNew.Worksheets.Add wksheet.name="Report" wksheet.Cells(1, 1).Value = "TotalReceived" wksheet.Cells(1, 2).Value = "KilledReceived" For i = 1 to XLA.WorkBooks(1).Sheets.Count XLA.WorkBooks(1).Sheets(i).Activate() RowsCnt = XLA.ActiveCell.CurrentRegion.Rows.Count ColsCnt = XLA.ActiveCell.CurrentRegion.Columns.Count XLA.ActiveCell.CurrentRegion.Borders.LineStyle = 1 XLA.ActiveCell.CurrentRegion.Borders.Weight = 3 If RowsCnt > 2 Then XLA.Range(XLA.Cells(3, 1), XLA.Cells(RowsCnt, ColsCnt)).Borders(3).LineStyle = 3 End if If RowsCnt > 1 Then XLA.Range(XLA.Cells(2, 1), XLA.Cells(RowsCnt-1, ColsCnt)).Borders(4).LineStyle = 3 End if XLA.Range(XLA.Cells(1, 1), XLA.Cells(1, ColsCnt)).Font.Bold = True XLA.Range(XLA.Cells(1, 1), XLA.Cells(1, ColsCnt)).HorizontalAlignment = 3 XLA.Range(XLA.Cells(1, 1), XLA.Cells(1, ColsCnt)).VerticalAlignment = 2 XLA.Range(XLA.Cells(1, 1), XLA.Cells(1, ColsCnt)).Interior.Color = 12632256 XLA.ActiveCell.CurrentRegion.Columns.AutoFit Next If Month(Now) < 10 Then wkbNew.SaveAs "C:\Reports\Report"+"_"+CStr(Year(Now))+Cstr(Day(Now))+"<b>0"</b>+Cstr(Month(Now))+".XLS" end if If Month(Now) > 10 Then kbNew.SaveAs "C:\Report"+"_"+CStr(Year(Now))+Cstr(Day(Now))+Cstr(Month(Now))+".XLS" end if wkbNew.Application.Quit Set XLA=Nothing Main = DTSTaskExecResult_Success End Function</pre>


vesna*

Почти все правильно. Только я делаю так - 1-ый ActiveX Script Task только создает файл с нужным именем
<pre class="prettyprint linenums">'********************************************************************** ' 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("Excel.Application") objXL.Visible = FALSE objXL.WorkBooks.Add Dim SheetsCnt Set SheetsCnt = objXL.WorkBooks(1).Sheets While SheetsCnt.Count > 1 objXL.WorkBooks(1).Sheets(SheetsCnt.Count).Delete Wend objXL.WorkBooks(1).Sheets(1).Activate() objXL.WorkBooks(1).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</pre>
- 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-и - И наконец форматирование конечного файла
<pre class="prettyprint linenums">'********************************************************************** ' Visual Basic ActiveX Script '************************************************************************ Function Main() Dim FileName FileName = DTSGlobalVariables("OutputFileFullName").Value Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Main = DTSTaskExecResult_Failure If (fso.FileExists(FileName)) Then Dim objXL Set objXL = CreateObject("Excel.Application") objXL.Visible = FALSE objXL.WorkBooks.Open(FileName) Dim SheetsCnt If (objXL.WorkBooks(1).Sheets.Count > 1) Then objXL.WorkBooks(1).Sheets(1).Delete End if For i = 1 to objXL.WorkBooks(1).Sheets.Count objXL.WorkBooks(1).Sheets(i).Activate() RowsCnt = objXL.ActiveCell.CurrentRegion.Rows.Count ColsCnt = objXL.ActiveCell.CurrentRegion.Columns.Count objXL.ActiveCell.CurrentRegion.Borders.LineStyle = 1 objXL.ActiveCell.CurrentRegion.Borders.Weight = 3 If RowsCnt > 2 Then objXL.Range(objXL.Cells(3, 1), objXL.Cells(RowsCnt, ColsCnt)).Borders(3).LineStyle = 3 End if If RowsCnt > 1 Then objXL.Range(objXL.Cells(2, 1), objXL.Cells(RowsCnt-1, ColsCnt)).Borders(4).LineStyle = 3 End if objXL.Range(objXL.Cells(1, 1), objXL.Cells(1, ColsCnt)).Font.Bold = True objXL.Range(objXL.Cells(1, 1), objXL.Cells(1, ColsCnt)).HorizontalAlignment = 3 objXL.Range(objXL.Cells(1, 1), objXL.Cells(1, ColsCnt)).VerticalAlignment = 2 objXL.Range(objXL.Cells(1, 1), objXL.Cells(1, ColsCnt)).Interior.Color = 12632256 objXL.ActiveCell.CurrentRegion.Columns.AutoFit Next objXL.WorkBooks(1).Save objXL.Quit Set objXL = Nothing Main = DTSTaskExecResult_Success End If End Function</pre>


vesna*

ogromnoe spacibo Glory !!!!


vesna*

Glory ! eshe odin vopros :
<pre class="prettyprint linenums">Filename = "C:\Reports\[b]Report[/b]" +"_"+ CStr(Year(Now)) + Right("<b>0"</b> + Cstr(Day(Now)), 2 ) + Right("<b>0"</b> + Cstr(Month(Now)), 2 ) + ".XLS" DTSGlobalVariables("OutputFileFullName").Value = Filename</pre>
y menia est" table Clients , mne nado proxodit" po clientID i cozdavat" file c ychetom imeni ocherednogo clienta :
<pre class="prettyprint linenums">Filename = "C:\Reports\[b]Client_Name_Report[/b]" +"_"+ CStr(Year(Now)) + Right("<b>0"</b> + Cstr(Day(Now)), 2 ) + Right("<b>0"</b> + Cstr(Month(Now)), 2 ) + ".XLS" DTSGlobalVariables("OutputFileFullName").Value = Filename</pre>
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 и с запросом вроде такого
<pre class="prettyprint linenums">SELECT TOP 1 client_id, client_name FROM dbo.myclients WHERE client_id > ? ORDER BY client_id</pre>
В Parameters - Input Parameters выбираем переменную ClientNumber В Parameters - Output Parameters - Row Value выбираем переменные ClientNumber и ClientName. (Предупреждение DTS Designer-а игнорируем) 4. Создаем ActiveX Script Task для проверки результатов выполнениняи предыдущего шага. Скрипт очень простой
<pre class="prettyprint linenums">Function Main() If (Len(Ltrim(Rtrim(DTSGlobalVariables("ClientNumber").Value))) = 0) Then Main = DTSTaskExecResult_Failure Else Main = DTSTaskExecResult_Success End if End Function</pre>
Для числового 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