fast report из грида деталей
Технические вопросы
Разработка

fast report из грида деталей

Здравствуйте.

Возможно ли напечатать fast report для документов из грида детали workSpace-а ?
см. picture1.jpg

С помощью этой строки:
var ID = ReportPreviewer.ParentWindow.Attributes.Values('DatasetIDs')[0];
получаю ID выбранного документа в основном гриде.

А как получить ID выбранного документа в гриде детали ?
Есть пример ?

Спасибо.

Нравится

13 комментариев

Картинка не открывается.

Здравствуйте, Марина!

Да, возможно.

Посмотрите, как реализован вызов отчета в функции ReportMenuItemExecute в скрипте scr_ReportUtils.

Получить ID выбранного документа в основном гриде можно ещё таким образом:

var ID = wndGridData.Window.ComponentsByName('grdData').SelectedIDs[0];

"Марина Карапетян" написал:А как получить ID выбранного документа в гриде детали ?

Не совсем понятно, что Вы имеете ввиду.

Если нужно получить ID документа для записи в детали, тогда можно получить значение поля DocumentID детали при условии, что деталь связана с основной таблицой документов.

Если Вы просто хотите из детали получить ID документа, который выбран в данный момент в основном гриде, тогда это можно сделать через окно раздела (Workspace).
При инициализации детали в качестве аттрибута ему можно передать окно основного грида, а потом, получить ID выбранного документа аналогично описанному выше, получив значение из аттрибута.

[code]
Почему-то рисунок не прикрепляется.
Попытаюсь без рисунка объяснить.

Основной грид имеет деталь_1.
В детали_1 находятся дочерние документы каждого из документов основного грида соответственно.
При выборе документа в основном гриде, происходит обновление детали_1.

связь Родительский документ : дочерний документ
один : многие

Например:
основной грид
Родительский документ_Номер1
Родительский документ_Номер2
...
Родительский документ_НомерN

деталь_1 (если выбран Родительский документ_Номер1)
Дочерний документ_1_Родительского документа_Номер1
Дочерний документ_2_Родительского документа_Номер1
...
Дочерний документ_N_Родительского документа_Номер1

деталь_1 (если выбран Родительский документ_Номер2)
Дочерний документ_1_Родительского документа_Номер2
Дочерний документ_2_Родительского документа_Номер2
...
Дочерний документ_M_Родительского документа_Номер2

Нужно получить ID дочернего документа, который выбран в детали_1.

Но получить ID нужно в скрипте fast report-а в событии OnPreview, чтобы задать как параметр ADODataset - у, а там уже с помощью SQL запроса запрашиваются нужные данные.

Спасибо.
[/code]

Здравствуйте, Марина!

Вы можете передавать нужное значение ID документа через атрибут ReportPreviewer.

Так, например, как атрибут ReportPreviewer, передается объект Report в функции ShowSelectedRecordsReport.

А определять ID, как мы обсуждали в предыдущих комментариях к этому посту.

Здравствуйте Алла.

Вы написали:
Если нужно получить ID документа для записи в детали, тогда можно получить значение поля DocumentID детали при условии, что деталь связана с основной таблицой документов.

что это за поле и что означает деталь связана с основной таблицой документов?

Спасибо.

Здравствуйте, Марина.

Если мы говорим о стандартной связке основной раздел - деталь, то обычно они связаны по полю ID записи основного раздела связью один ко многим.

То есть, если это раздел [Документы] и какая-то деталь этого раздела, то в датасете, запросе на выборку и таблице детали есть поле DocumentID, которое заполнено значением поля ID из таблицы документов.

В окно грида детали это значение передается через атрибут 'ParenItemtID'.

Таким образом получить значение поля DocumentID в окне грида детали, можно так: Self.Attributes('ParentItemID').

[code]
Если мы говорим о стандартной связке основной раздел - деталь, то обычно они связаны по полю ID записи основного раздела связью один ко многим.
[/code] Да, у меня есть такая связь.

[code]
То есть, если это раздел [Документы] и какая-то деталь этого раздела, то в датасете, запросе на выборку и таблице детали есть поле DocumentID, которое заполнено значением поля ID из таблицы документов.
[/code] Это раздел [Заявки физ. лиц.]. В датасете, запросе на выборку и таблице детали есть соответствующее поле, которое заполнено значением поля ID из таблицы заявок.

[code]
В окно грида детали это значение передается через атрибут 'ParenItemtID'.
[/code] Это тоже сделала.

[code]
Таким образом получить значение поля DocumentID в окне грида детали, можно так: Self.Attributes('ParentItemID').
[/code]
Но мне нужно получить не DocumentID (где записан ID записи основного грида) а ID именно записи детали. Ведь надо напечатать конкретную запись детали.

То есть, нажав на конкретную запись в основном гриде, в детали получаю соответствующие записи.
Далее нажимая на конкретную запись детали, надо напечатать ее с помощью fast report-а.
Спасибо

Получить ID выбранной записи грида можно так:

var ID = Window.ComponentsByName('grdData').SelectedIDs[0]

где Window - это название окна грида, его можно ещё заменить на Self

Так как я пишу в скрипте fast report-а, то Self в этом скрипте = "FastReport"
поэтому попыталась получить Window так:

var Window = Services.GetNewItemByUSI('wnd_XXXGridArea'); // где wnd_XXXGridArea - имя окна

var ID = Window.ComponentsByName('grdData').SelectedIDs[0];

и получаю undefined.

Посмотрела debugger-ом
[code]
Window.ComponentsByName('grdData').SelectedIDs
{...}
CoClassGUID: "{D143A918-4CBE-48F9-AEB5-E373F6D6679D}"
CommaText: ""
Connector: {...}
Count: 0
InstanceID: "{83BD163D-9070-4543-9A89-A2A8FF3218BE}"
IsCaseSensitive: false
IsSorted: false
IsUnique: false
Items: Invalid number of parameters.
ObjectState: 0
Text: ""
[/code]

[code]
Window.ComponentsByName('grdData').SelectedIDs[0]
undefined
[/code]

Спасибо.

Вам нужно получить ID записи раньше, а потом передать его через атрибуты ReportPreviewer (выше я уже об этом писала).

Если писать так, как Вы, то получается, что обращение идет к другому экземпляру окна, а не к тому, которое является окном реестра в детали. Соответственно, что и никакие записи в нём не выбраны.

Здравствуйте Алла.

// scr_BaseWorkspace
function ReportMenuItemOnExecute(ActionMenuItem)
{
...
ChildIDs = Self.ComponentsByName('wndDetail1Grid').Window.ComponentsByName('grdData').SelectedIDs.CommaText;
// где Self-окно workspace-а(wnd_ContactCreditWorkspace) , wndDetail1Grid - деталь окна
ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid, ExtractUSICodeEx(Self.USI), ChildIDs);
}

// scr_ReportUtils
function ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid, WorkspaceName, ChildIDs)
{
...
ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode, SelectedIDs, FilterForm, ChildIDs);
...
}

// scr_ReportUtils
function ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode, GridDatasetIDs, FilterForm, ChildIDs)
{
...

SetAttribute(ReportPreviewer, 'ChildDatasetIDs', ChildIDs);
...
}

И все работает. Спасибо большое!!!
Может мой вопрос покажется глупым, но объясните пожалуйста, что такое окно реестра?

Окно реестра — это страница, на которой находится грид. Обычно название таких страниц заканчивается на «GridArea». В Вашем случае есть основное окно реестра в разделе и по одному для каждой детали.

Хорошо, спасибо.

Показать все комментарии