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

Возможно ли напечатать 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 выбранного документа аналогично описанному выше, получив значение из аттрибута.

Почему-то рисунок не прикрепляется.
Попытаюсь без рисунка объяснить.
 
Основной грид имеет деталь_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 запроса запрашиваются нужные данные.
 
Спасибо.

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

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

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

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

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

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

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

Спасибо.

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

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

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

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

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

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

Да, у меня есть такая связь.

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

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

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

Это тоже сделала.

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

Но мне нужно получить не 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-ом

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: ""
Window.ComponentsByName('grdData').SelectedIDs[0]
undefined

Спасибо.

Вам нужно получить 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». В Вашем случае есть основное окно реестра в разделе и по одному для каждой детали.

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

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