Текущее время: Пт, июл 25 2025, 19:17

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 14:22 
Ассистент
Ассистент

Зарегистрирован:
Вт, сен 15 2009, 18:25
Сообщения: 28
Есть две таблицы (на внешнем SQL-сервере). В таблице заголовков есть поле-счётчик (назовём его id), которое автоматически увеличивается при вставке новых строк. В другой таблице содержатся строки к каждому заголовку, то есть у каждой записи есть поле id, которое указывает к какому заголовку она относится.
Нужно в собственноручно созданном ФМ заполнять эти таблицы из переданной в параметрах таблицы. Вначале создать строку в таблице заголовков, а затем создать множество строк в дочерней таблице с id, равным идентификатору созданной в таблице заголовков строки.
Делаю так.
Вначале у меня отдельным exec sql/endexec создаётся запись в таблице заголовков. Затем В loop-цикле периодически запускается exec sql/endexec, который вставляет строки в дочернюю таблицу. Таким образом, каждый раз после вставки строки в дочернюю таблицу глобальная переменная @@IDENTITY (та, что содержит последний номер счётчика, который был в поле id) обнуляется. Локальная переменная не решает проблему, так как она исчезает после endexec. Хотел попробовать вытащить значение переменной в программу, но не нашёл, как это сделать. Хотел попробовать изменять значение переменной @@IDENTITY перед самым endexec, но снова не получилось.

Кто что может посоветовать? Может есть другой способ заполнения таблицы, так чтобы @@IDENTITY не обнулялась?

_________________
- What makes the grass grow?
- BLOOD! BLOOD! BLOOD! (c)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 14:40 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Dragon27 написал(а):
Есть две таблицы (на внешнем SQL-сервере). В таблице заголовков есть поле-счётчик (назовём его id), которое автоматически увеличивается при вставке новых строк. В другой таблице содержатся строки к каждому заголовку, то есть у каждой записи есть поле id, которое указывает к какому заголовку она относится.
Нужно в собственноручно созданном ФМ заполнять эти таблицы из переданной в параметрах таблицы. Вначале создать строку в таблице заголовков, а затем создать множество строк в дочерней таблице с id, равным идентификатору созданной в таблице заголовков строки.
Делаю так.
Вначале у меня отдельным exec sql/endexec создаётся запись в таблице заголовков. Затем В loop-цикле периодически запускается exec sql/endexec, который вставляет строки в дочернюю таблицу. Таким образом, каждый раз после вставки строки в дочернюю таблицу глобальная переменная @@IDENTITY (та, что содержит последний номер счётчика, который был в поле id) обнуляется. Локальная переменная не решает проблему, так как она исчезает после endexec. Хотел попробовать вытащить значение переменной в программу, но не нашёл, как это сделать. Хотел попробовать изменять значение переменной @@IDENTITY перед самым endexec, но снова не получилось.

Кто что может посоветовать? Может есть другой способ заполнения таблицы, так чтобы @@IDENTITY не обнулялась?

Почему бы не сделать процедуру, которая сама всё сделает (добавит заголовок и строки)?
Вам остаётся только её вызвать и передать параметры

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 14:44 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Dragon27 написал(а):
Есть две таблицы (на внешнем SQL-сервере). В таблице заголовков есть поле-счётчик (назовём его id), которое автоматически увеличивается при вставке новых строк. В другой таблице содержатся строки к каждому заголовку, то есть у каждой записи есть поле id, которое указывает к какому заголовку она относится.
Нужно в собственноручно созданном ФМ заполнять эти таблицы из переданной в параметрах таблицы. Вначале создать строку в таблице заголовков, а затем создать множество строк в дочерней таблице с id, равным идентификатору созданной в таблице заголовков строки.
Делаю так.
Вначале у меня отдельным exec sql/endexec создаётся запись в таблице заголовков. Затем В loop-цикле периодически запускается exec sql/endexec, который вставляет строки в дочернюю таблицу. Таким образом, каждый раз после вставки строки в дочернюю таблицу глобальная переменная @@IDENTITY (та, что содержит последний номер счётчика, который был в поле id) обнуляется. Локальная переменная не решает проблему, так как она исчезает после endexec. Хотел попробовать вытащить значение переменной в программу, но не нашёл, как это сделать. Хотел попробовать изменять значение переменной @@IDENTITY перед самым endexec, но снова не получилось.

Кто что может посоветовать? Может есть другой способ заполнения таблицы, так чтобы @@IDENTITY не обнулялась?

Может быть, как вариант, после того как вы вставили запись заголовка, сделать выборку из этой таблицы (exec sql/endexec) максимального значения id в переменную программы и дальше уже использовать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 15:01 
Ассистент
Ассистент

Зарегистрирован:
Вт, сен 15 2009, 18:25
Сообщения: 28
Besa написал:
Может быть, как вариант, после того как вы вставили запись заголовка, сделать выборку из этой таблицы (exec sql/endexec) максимального значения id в переменную программы и дальше уже использовать.

Спасибо. Этот вариант вполне устраивает.

_________________
- What makes the grass grow?
- BLOOD! BLOOD! BLOOD! (c)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 15:06 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Вариант Besa не является потокобезопасным.

Правильный вариант - хранимая процедура на стороне СУБД и ее вызов из ABAP.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 15:16 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Пономарев Артем написал:
Вариант Besa не является потокобезопасным.

Правильный вариант - хранимая процедура на стороне СУБД и ее вызов из ABAP.

Да, согласен. Но у Dragon27 с самого начала все не является потокобезопасным, надо менять весь подход к решению задачи, иногда это бывает не просто в силу каких то других обстоятельств. Поэтому только как вариант. :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Заполнение id для дочерней таблицы
СообщениеДобавлено: Ср, июл 21 2010, 16:08 
Ассистент
Ассистент

Зарегистрирован:
Вт, сен 15 2009, 18:25
Сообщения: 28
Да чего нам терять, в самом деле? Можно попробовать сделать и по-человечески!

_________________
- What makes the grass grow?
- BLOOD! BLOOD! BLOOD! (c)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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