Текущее время: Ср, июн 25 2025, 10:23

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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