Составление отчета в Excel с помощью макроса

Автор EinRoterStern, 10.03.25, 15:57:36

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

EinRoterStern

Я использую Лоцман-отчеты, которые работают из клиента по sql-процедурам, данные выводятся в шаблон(.xltm).
При выводе отчет использует назначенную процедуру, мне нужно на второй лист полученной книги вывести результат другой(второй) процедуры, не получается вызвать вторую процедуру через GetReport.
Возможно ли вызвать вторую процедуру или как дважды вызвать одну процедуру поменяв параметр?

UU

Вы может код кинете, что Вы делаете и возможно Вам подскажут, где у Вас проблемы.

EinRoterStern

Сейчас создаю 2 лист через другую процедуры, но не до конца понимаю что нужно передавать в GetDataset, то есть какой метод он должен принимать(мои предположения были что в него нужно передать название процедуры)

Private CurrRow As Range ' Текущая строка, в которую выводим данные отчета

Public Sub StartMacrosLOODSMANEx(RD As Reports.ReportData)
    Dim DS As DataProvider.DataSet
    Set DS = CreateObject("DataProvider.Dataset")
    DS.Data = RD.GetReport.Data  ' Получаем данные из первого запроса
   
    Dim ws1 As Worksheet
    Set ws1 = ThisWorkbook.Sheets("Лист1") ' Первый лист для первой таблицы
   
    Dim dataRowPattern As Range
    Set dataRowPattern = ws1.Range("_dataRow") ' Шаблон строки на первом листе
   
    ' Перебираем первую таблицу и записываем данные на первый лист
    While Not DS.EOF
        AddRow dataRowPattern, ws1
       
        CurrRow.Cells(1).Value = DS.FieldValue("id")
        CurrRow.Cells(2).Formula = DS.FieldValue("Тип")
        CurrRow.Cells(3).Formula = DS.FieldValue("Обозначение")
        CurrRow.Cells(4).Formula = DS.FieldValue("Наименование материала")
        CurrRow.Cells(5).Formula = DS.FieldValue("Разработал")
       
        DS.Next
    Wend
   
    ' Выполняем второй запрос через GetDataset
    Dim DS2 As DataProvider.DataSet
    Set DS2 = CreateObject("DataProvider.Dataset")
    DS2.Data = RD.GetDataSet("rep_Info1", "").Data
   
    Dim ws2 As Worksheet
    Set ws2 = ThisWorkbook.Sheets("Лист2") ' Второй лист для второй таблицы
   
    Dim dataRowPattern2 As Range
    Set dataRowPattern2 = ws2.Range("_dataRow")
   
    ' Перебираем вторую таблицу и записываем данные на второй лист
    While Not DS2.EOF
        AddRow dataRowPattern2, ws2
       
        CurrRow.Cells(1).Value = DS2.FieldValue("Код")
        CurrRow.Cells(2).Formula = DS2.FieldValue("Название")
        CurrRow.Cells(3).Formula = DS2.FieldValue("Дата")
        CurrRow.Cells(4).Formula = DS2.FieldValue("Автор")
       
        DS2.Next
    Wend
End Sub



EinRoterStern

Переделал немного GetDataSet, в метод передаю GetReport, но параметры видимо не совсем верно указываю:
Set DS = RD.GetDataSet("GetReport", ["rep_TestDb","mode=1"])
rep_TestDb - название процедуры
mode=1 - параметр который должен передаваться в процедуры, по цифре определяется какая таблица должна выводиться

Сам код тоже немного подправил:
Public Sub StartMacrosLOODSMANEx(RD As Reports.ReportData)
    ' Получаем данные для первого листа (mode=0)
    Dim DS As DataProvider.DataSet
    Set DS = RD.GetDataSet("GetReport", ["rep_TestDb","mode=1"])
   
    Dim ws1 As Worksheet
    Set ws1 = ThisWorkbook.Sheets("Лист1")
   
    Dim currRow1 As Long
    currRow1 = 2
   
    ' Перебираем первую таблицу и записываем данные на первый лист
    While Not DS.EOF
        ws1.Cells(currRow1, 1).Value = DS.FieldValue("Idparent")
        ws1.Cells(currRow1, 2).Value = DS.FieldValue("idchild")
        ws1.Cells(currRow1, 3).Value = DS.FieldValue("relationname")
       
        currRow1 = currRow1 + 1
        DS.Next
    Wend
   
    ' Получаем данные для второго листа (mode=1)
    Dim DS2 As DataProvider.DataSet
    Set DS2 = RD.GetDataSet("GetReport", ["rep_TestDb","mode=1"])
   
    Dim ws2 As Worksheet
    Set ws2 = ThisWorkbook.Sheets("Лист2")
   
    Dim currRow2 As Long
    currRow2 = 2
   
    ' Перебираем вторую таблицу и записываем данные на второй лист
    While Not DS2.EOF
        ws2.Cells(currRow2, 1).Value = DS2.FieldValue("id")
        ws2.Cells(currRow2, 2).Value = DS2.FieldValue("type")
        ws2.Cells(currRow2, 3).Value = DS2.FieldValue("product")
       
        currRow2 = currRow2 + 1
        DS2.Next
    Wend
   
    MsgBox "Данные загружены на два листа!"
End Sub


EinRoterStern

Снова немного изменил:
Set DS = RD.GetDataSet("GetReport", Array("rep_TestDb", "0", "mode=0"))
только осталось понять как передавать id выбранного объекта