Учебник по Showcase: Грид как зависимый элемент

Материал из Course Orchestra
Перейти к: навигация, поиск

Внимание! Изложенная здесь информация устарела! В качестве учебника следует использовать https://share.curs.ru/webhelp/ (work in progress).


В предыдущем примере мы просто перерисовали элемент по клику на строку. При этом во втором гриде отобразились все сотрудники, которые есть в таблице employees. Однако, в большинстве случаев хочется отображать не просто всех сотрудников, а сотрудников выбранного в первом гриде отдела. Говоря иными словами, мы хотим, чтобы при перерисовке второго грида он каким-то образом знал, какая именно запись выделена в первом гриде. Для этого служит механизм зависимых элементов.

Чтобы указать, что элемент зависим от другого, надо указать это в информационной панели, прописав новый тэг <related>:

<?xml version="1.0" encoding="UTF-8"?>
<datapanel>
   <tab id="1" name="Сотрудники и оргструктура">	
      <element id="30" type="grid" proc="orgGrid"/>
      <element id="130" type="grid" proc="employeesGrid" hideOnLoad="true">
         <related id="30"/>         
      </element>
   </tab>	
</datapanel>

Далее в процедуру грида, от которого зависит другой элемент, необходимо добавить новый столбец [~~id], содержащий идентификаторы для каждой записи:

ALTER PROCEDURE [dbo].[orgGrid]
   @main_context nvarchar(512)='' ,  
   @add_context nvarchar(512)='' ,  
   @filterinfo xml='',  
   @session_context xml='',
   @sortcols nvarchar(1024)='', 
   @element_id nvarchar(512)='',
   @gridsettings xml='' output,      
   @error_mes nvarchar(max) = '' output
AS
BEGIN
   SET NOCOUNT ON;
   
   SELECT
      o."uid" as "~~id"
      ,o."name" as "Наименование"
      ,'<properties>
           <event name="row_single_click">
              <action>
                 <main_context>current</main_context>
                 <datapanel type="current" tab="current">
                    <element id="130"/>
                 </datapanel>
              </action>
           </event>                                     
        </properties>' as "~~properties" 
   FROM "orgStructure" o

   SET @gridsettings='
      <gridsettings>
         <columns>
            <col id="Наименование" width="325px"/>
         </columns>
         <properties pagesize="10" profile="gr_withoutExcel.properties"/>
      </gridsettings>';
   
END

Столбец [~~id] не будет отображаться в гриде. Идентификация записи при выделении будет происходить именно по данному значению.

После того, как мы указали зависимость между элементами и указали идентифицирующий столбец, при перерисовке второго грида переменная session_context будет иметь следующий вид:

<sessioncontext>
    <username>имя пользователя</username>
    <sid>S-1-5-21-3280272421-4220533252-1382601228-1147</sid>
    <email>info@curs.ru<email/>
    <fullusername>полное имя пользователя</fullusername>
    <phone>9392612<phone/>
    <userdata/>
    <related>
     <gridContext id="30">
         <additional></additional>
         <filter></filter>
         <sortedColumn id="_Id" sorting="ASC" valueType="INT" width="100px"/>
         <pageInfo number="1" size="10"/>
         <currentRecordId>58871DFA-BB00-11E1-8FC5-1F34CBDC1C06</currentRecordId>
         <currentColumnId>_Id</currentColumnId>
         <selectedRecordId/>
         <selectedRecordId/>
      </gridContext>
    </related>
</sessioncontext>

Обратите внимание, что теперь в session_context появился новый тэг <related>, в котором прописана информация о состоянии всех элементов, от которых данный элемент зависит. В нашем случае, это один элемент с id=30. Выделенная в верхнем гриде запись определяется столбцом [~~id], в который мы прописали uid. И теперь данный uid отображается в тэге <currentRecordId>. Т.е. через параметр session_context в зависимом элементе мы всегда можем знать, какая запись выделена в первом гриде.

В процедуре зависимого грида это делается следующим образом. Здесь функция @session_context.VALUE написана большими буквами. SQL Server может ругаться, что не находит такой функции. Надо исправить на все маленькие буквы - @session_context.value

ALTER PROCEDURE [dbo].[employeesGrid]
   @main_context varchar(512)='',
   @add_context varchar(512)='',
   @filterinfo xml='',
   @session_context xml ='',
   @element_id varchar(512) ='',
   @sortcols varchar(1024) ='',
   @gridsettings xml ='' output,
   @error_mes varchar(MAX)='' output
AS
BEGIN
   SET NOCOUNT ON;
   declare 
      @currentOrgStructure as uniqueidentifier 
   
   set @currentOrgStructure = @session_context.value('(/sessioncontext/related/gridContext[@id = 30]/
currentRecordId)[1]', 'uniqueidentifier')

   SELECT 
      e.fio as "ФИО"
      ,p."name" as "Должность"
      ,e."date" as "Дата приема"
      ,case e."status" 
         when 0 then 'Не женат/ не замужем'	
         when 1 then 'Женат/ замужем'	
       end as "Статус"
      ,e."comment" as "Комментарий"		
      FROM "employees" as "e"
         left join "posts" as "p" 
            on "p".uid = e."postId"
      WHERE "orgStructureId" = @currentOrgStructure      

   SET @gridsettings='
      <gridsettings>
         <columns>
            <col id="ФИО" width="200"/>
            <col id="Должность" width="150px"/>
         </columns>
         <properties flip="false" pagesize="15" profile="gr_withoutExcel.properties"/>
      </gridsettings>'

END

Теперь мы в процедуре можем извлекать в переменную @currentOrgStructure uid выделенного отдела и отображать сотрудников только конкретного отдела