Текущее время: Вт, июн 24 2025, 10:16

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Подскажите как грамотно обновить строку в Z* таблице
СообщениеДобавлено: Чт, фев 01 2007, 13:07 
Ассистент
Ассистент

Зарегистрирован:
Пн, май 29 2006, 11:05
Сообщения: 30
Всем привет Уважаемые!

Подскажите мне по следующему вопросу:
Есть Z* таблица (ztbl). Эта таблица в самописной проге засасывается во внутренную таблицу itab и вывадится в ALVGrid на редактирование.
Одновременно эту таблицу могут корректировать несколько пользователей. Думаю, что последовательностьдействий должна быть такая:
1)Отлавливаем событие Data_Changre ALVGrid
2)В событии пытаемся заблокировать редактируемую запись. Если удачно хорошо, иначе вываливаемся обратно в редактирование строки с сообщениемю
3)Делаем UPDATE таблицы по ключевым полям с установкой новых отредактированных значений
4)Делаем commit
5)Разблокируем запись
6)Обновим ALVGrid

Вот не совсем понимаю, как нужно делать п.2, 4 и 5. Подскажите как это можно проделать?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите как грамотно обновить строку в Z* таблице
СообщениеДобавлено: Чт, фев 01 2007, 13:31 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, июн 05 2006, 13:33
Сообщения: 805
Пол: Мужской
mmsmms написал(а):
2)В событии пытаемся заблокировать редактируемую запись. Если удачно хорошо, иначе вываливаемся обратно в редактирование строки с сообщениемю
5)Разблокируем запись
Вот не совсем понимаю, как нужно делать п.2, 4 и 5. Подскажите как это можно проделать?


В SE11 создаем объект блокировки 'EZOBJ'.

2) Блокируем через ф.м. ENQUEUE_EZOBJ

5) Разблокируем объект через ф.м. DEQUEUE_EZOBJ


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, фев 01 2007, 13:32 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, июн 16 2005, 10:29
Сообщения: 336
Откуда: Минск->Москва
Пол: Мужской
2 и 5 шаг с помощью объектов блокирования, смотрите в se11. Там даже хелп есть... Обновление через тот самый UPDATE, а коммит COMMIT WORK [AND WAIT].


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, фев 01 2007, 13:41 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
Я думаю, что надо сделать так:
Code:
select single for update * into ztbl_wa from ztbl where...
****  Делаешь изменения *****
update ztbl from ztbl_wa

Другой вариант - создать объект блокировки. Описание смотри в хелпе, раздел SAP Locking


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите как грамотно обновить строку в Z* таблице
СообщениеДобавлено: Чт, фев 01 2007, 14:15 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
mmsmms написал(а):
Всем привет Уважаемые!

Подскажите мне по следующему вопросу:
Есть Z* таблица (ztbl). Эта таблица в самописной проге засасывается во внутренную таблицу itab и вывадится в ALVGrid на редактирование.
Одновременно эту таблицу могут корректировать несколько пользователей. Думаю, что последовательностьдействий должна быть такая:
1)Отлавливаем событие Data_Changre ALVGrid
2)В событии пытаемся заблокировать редактируемую запись. Если удачно хорошо, иначе вываливаемся обратно в редактирование строки с сообщениемю

А какой смысл в этом? На мой взгляд при редактировании все выбранные записи должны блокироваться в момент их выборки.
Иначе при таком алгоритме после блокирования записи необходимо перечитывать запись из базы, сравнивать не былали она изменена, и если её не успели поменять то только тогда возможен переход к следующим шагам.

Поэтому и мгновнное сохранение редактируемых записей в БД - так-же далеко не идеальный результат, тем более в той реализации, которая предрагается - ведь в этом варианте у пользователя не остаётся никаких шансов отказаться от "не правильных" изменений.
Цитата:
3)Делаем UPDATE таблицы по ключевым полям с установкой новых отредактированных значений
4)Делаем commit
5)Разблокируем запись
6)Обновим ALVGrid

Вот не совсем понимаю, как нужно делать п.2, 4 и 5. Подскажите как это можно проделать?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, фев 01 2007, 16:49 
Ассистент
Ассистент

Зарегистрирован:
Пн, май 29 2006, 11:05
Сообщения: 30
to sy-uname:
Тут мысль такая: когда ячейку кол-ва исменили и нажали Enter, то переходим в Data_change и там мне нужно используя ключевые поля редактируемой записи поставить блокировку на эту запись в Z-таблице (если ее еще не удалили). После этого делаем ее UPDATE на свое значение и снимаем блокировку. Естественно, если кто-то паралелльно пытался корректировать эту-же строку, то значение кол-ва в этой строке поменяется очередно -сначала для одного, затем для другого. Так, чтоздесь я думаю все нормально.

to Timon&Pumba:

Создал объект блокировки EZRESURS, со стандартной блокировкой от записи. Стал искатьФМ с именем ENQUEUE_EZRESURS и не нахожу. в чем дело? (Прошу прощения если вопрос ламерский, с блокировкаминикогда не работал).
А Commit Work нужно ставить до снятия блокировки. Или снятие блокировки само инициирует Commit?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, фев 01 2007, 16:58 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
mmsmms написал(а):
to sy-uname:
Тут мысль такая: когда ячейку кол-ва исменили и нажали Enter, то переходим в Data_change и там мне нужно используя ключевые поля редактируемой записи поставить блокировку на эту запись в Z-таблице (если ее еще не удалили). После этого делаем ее UPDATE на свое значение и снимаем блокировку. Естественно, если кто-то паралелльно пытался корректировать эту-же строку, то значение кол-ва в этой строке поменяется очередно -сначала для одного, затем для другого. Так, чтоздесь я думаю все нормально.
При таком подходе не имеет смысла заморачиваться с саповскими блокировками - достаточно просто тупо апдейтить таблицу - кто последним нажмёт ENTER, тот и будет прав.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, фев 01 2007, 17:29 
Ассистент
Ассистент

Зарегистрирован:
Пн, май 29 2006, 11:05
Сообщения: 30
Возможно это так, но в дальнейшем предполагается делать дополнительные манипуляции с другими таблицами в зависимости от введенных значений и хотелось бы сразу заложить механизм блокировки, что-бы в будущем к этому не возвращаться.

Вопрос: Почему после создания объекта блокировки и его активации у меня не появились функциональные модули ENQUEUE_ / DEQUEUE_ ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, фев 01 2007, 18:19 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
mmsmms написал(а):
...
Стал искатьФМ с именем ENQUEUE_EZRESURS и не нахожу. в чем дело?..

А что его искать? В объекте блокирования в меню "перейти к -> модули блокировки"

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 02 2007, 09:20 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, июн 05 2006, 13:33
Сообщения: 805
Пол: Мужской
mmsmms написал(а):
А Commit Work нужно ставить до снятия блокировки. Или снятие блокировки само инициирует Commit?

На самом деле ничего не блокируется. Модуль блокирования всего лишь создает запись в специальной табличке о том что объект блокирован. Если сам не проверишь блокировку объекта никто не мешает сделать с ним все что угодно. Commit конечно нужно ставить до снятия блокировки.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 02 2007, 10:26 
Ассистент
Ассистент

Зарегистрирован:
Пн, май 29 2006, 11:05
Сообщения: 30
Так. Сами фанкциональные модули нашел (спасибо sy-uname)

Теперь не совсем понятно, что на самом деле происходит при их использовании.
Насколько я понял, эти модули просто пишут строчку о блокировке записи в спец.таблицу, подразумевая, что все остальные программы при обращении к пользовательской таблице тоже будут использовать эти функциональные модули для блокировки. И если все остальные программы действительно пользуются этими ФМ, то можно сказать, что блокировки работают. А если отдельные программы например сразу запускают UPDATE строчки, которая ранее уже с помощью ФМ была "заблокирована", то эта отдельная программа "заблокированную" строчку поменяет, несмотря на то, что ее ранее уже "заблокировали"? Или все-таки SAP сам неявно запускает для этой программули блокировочные ФМ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 02 2007, 10:32 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, июн 05 2006, 13:33
Сообщения: 805
Пол: Мужской
mmsmms написал(а):
А если отдельные программы например сразу запускают UPDATE строчки, которая ранее уже с помощью ФМ была "заблокирована", то эта отдельная программа "заблокированную" строчку поменяет, несмотря на то, что ее ранее уже "заблокировали"?

Именно так. SAP отдал задачу блокировки на волю ABAP-еров.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 02 2007, 10:39 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, июн 02 2006, 09:59
Сообщения: 67
Пол: Мужской
Да, полная каша...
А прикольно будет, если пользователь А сделает изменения в десяти разных строках и пользователь Б тоже полчаса будет что-нибудь долбить в грид, а потом оба нажмут SAVE!
При таком подходе уж лучше предложить следующий вариант:
- в свойствах грида усланавливаешь выделение единственной строки
- в TOOLBAR вешаешь кнопарь EDIT
- при нажатии кнопки вешаешь блокировку по ключу данной строки, перечитываешь ее из базы и рефрешишь грид
- только после этого даешь править данные в строке
- после сохранения запрещаешь редактирование и снимаешь блокировку


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 02 2007, 10:59 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Всё зависит от того, как пользователи работают с данными: конкурентно или нет.

Если конкурентно, т.е. например в сценарии бронирования билетов, то спору нет, блокировки нужны. При этом есть свобода выбора: ставить ли Shared-блокировку при просмотре документа или нет. При продаже ж/д билетов блокировка не ставится, т.к. не раз бывало, что кассирша сообщает: "Ой, у Вас билет из под носа увели". И это правильно, т.к. на просмотр открывается очень много позиций и при наличии S-блокировки практически невозможно было бы купить билет поставив X-блокировку. А вот если бухгалтер открывает один-единственный документ на просмотр, то S-блокировка допустима, т.к. в достаточной степени маловероятна одновременная попытка открыть документ на редактирование, и даже при осуществлении таковой проблема решается телефонным звонком: "Юля, закрой, пожалуйста, такой-то документ".

Возможен другой случай. Пусть в издательстве есть база данных книг. Информацию о количестве страниц в книге могут вносить: отдел вёрстки, производственный отдел или продажники, при условии, если эта информация не была предыдущим отделом. Теперь представим ситуацию, когда ген. директор громко рявкнул: "почему нет кол-ва страниц в такой-то книге?". И все три отдела одновременно открыли карточку книги и ввели туда кол-во страниц. Блокировки тут не нужны, т.к. ошибка в базе данных может возникнуть только по вине неправильного ввода информации одним из пользователей (последним) и это никак не зависит от того, были блокировки или нет.

В этом случае я когда-то реализовывал следующий алгоритм: после нажания на кнопку Save таблица блокируется, читается текущая информация, затем сравниваются три копии данных (a — первоначально считанную, b — исправленную пользователем, и c —текущую). Если (b ne a) and (a ne c), то пользователю предлагается выбрать: записать в базу b или оставить c.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, фев 02 2007, 11:35 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Спасибо Sibrin, интересно было почитать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB