Учебник по Showcase: Удаление записи

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

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


Иногда возникает необходимость выполнения каких-либо действий на сервере, например, удаление элемента. Делается это с помощью так называемых серверных процедур.

Рассмотрим расширенную процедуру прорисовки кнопок работы с сотрудниками:

ALTER PROCEDURE [dbo].[employeesButtons]
   @main_context varchar(MAX) ='',
   @add_context varchar(MAX) ='',
   @filterinfo xml='',
   @session_context xml ='',
   @element_id varchar(MAX) ='',    
   @webtextdata xml output,
   @webtextsettings xml output
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE 
      @currentEmployee as varchar(max) 
      ,@addButton as varchar(max)
      ,@editButton as varchar(max)
      ,@delButton as varchar(max)
      ,@currentId as varchar(max)

   set @currentEmployee = coalesce(@session_context.value('(/sessioncontext/related/
gridContext[@id = 130]/currentRecordId)[1]', 'nvarchar(250)'),'')
		
   set @addButton = 
      '<td>				
         <button onclick="gwtWebTextFunc('''+@element_id+''',''1'');">
            <span>Добавить</span>
         </button>
      </td>';

   if @currentEmployee = ''
      begin
         set @editButton = ''
         set @delButton = ''
      end 
   else
      begin
         set @editButton = 
            '<td>				
               <button onclick="gwtWebTextFunc('''+@element_id+''',''2'');">
                  <span>Редактировать</span>
               </button>
            </td>'
         set @delButton =
            '<td>
               <button onclick="var answer=confirm(''Вы действительно хотите удалить данную запись?''); 
                                 if (answer)  
                                    gwtWebTextFunc('''+@element_id+''',''3'');">
                  <span>Удалить</span>
               </button>
            </td>';
      end
		
   SET @webtextdata = 
      '<table>
         <tr>'+@addButton+@editButton+@delButton+'</tr>
      </table>'
   
   SET @webtextsettings =
      '<properties>		
         <event name="single_click" linkId="1">
            <action show_in="MODAL_WINDOW">
               <main_context>current</main_context>
               <modalwindow caption="Добавление данных о сотруднике" height="525" width="720"/>
               <datapanel type="current" tab="current">
                  <element id="140">
                     <add_context>add</add_context>
                  </element> 	                                                            
               </datapanel>
            </action>
         </event>  
         <event name="single_click" linkId="2">
            <action show_in="MODAL_WINDOW">
               <main_context>current</main_context>
                  <modalwindow caption="Редактирование данных о сотруднике"  height="525" width="720"/>
                  <datapanel type="current" tab="current">
                     <element id="140">
                        <add_context>edit</add_context>
                     </element>                                                             
                  </datapanel>
            </action>
         </event>
         <event name="single_click" linkId="3">
            <action>
               <main_context>current</main_context>
               <datapanel type="current" tab="current">
                  <element id="130"/>
                </datapanel>
               <server>
                  <activity id="1" name="delEmployee"/>
               </server>
            </action>
         </event>
      </properties>'

END

Здесь появилась кнопка "Удалить". Она также, как и кнопка "Редактировать", активна только при нажатии на запись сотрудника в гриде. При клике на нее запускается действие при linkId=3, которое запускает процедуру на сервере (это описано в <server><activity id="1" name="delEmployee"/></server>) и перерисовывает элемент с id=130.

Сама же процедура выглядит следующим образом:

ALTER PROCEDURE [dbo].[delEmployee]
   @main_context varchar(MAX)='',
   @add_context varchar(MAX)='',
   @filterinfo xml='',        
   @session_context xml='',	
   @error_mes varchar(MAX)='' output
AS
BEGIN
   SET NOCOUNT ON;

   declare @current_emp as uniqueidentifier

   set @current_emp = @session_context.value('(/sessioncontext/related/
gridContext[@id = 130]/currentRecordId)[1]', 'uniqueidentifier')

   delete from employees where uid = @current_emp

END

В данной процедуре доступны все контексты (это контексты webtext), поэтому используя related мы можем удалить выделенную в гриде запись.

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