Текущее время: Чт, июл 24 2025, 07:38

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


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

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


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

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