AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.06.2011, 13:34   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Для автоинкрементных полей в MS SQL можно воспользоваться вызовом
X++:
select @@identity
после вставки

Если для ADO, то это будет выглядеть примерно так
X++:
    CCADOConnection con = new CCADOConnection();
    CCADORecordSet  rec;
    ;
    con.open('настройка для подключения');

    rec = new CCADORecordset();
    rec.open("set nocount on\n insert into tablex (name) values ('Name3')\n select @@identity as ident", con);
    if (rec.fields().count() > 0)
    {
        print rec.fields().itemIdx(0).value();
        rec.close();
    }
    con.close();
    pause;
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: uchenik (1).
Старый 29.06.2011, 14:44   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,719 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
Для автоинкрементных полей в MS SQL можно воспользоваться вызовом
X++:
select @@identity
после вставки
Угу. Только следует помнить, что @@identity относится к последнему созданному значению в любой таблице

В данном случае, например, если таблица tablex имеет триггер на вставку в котором происходит вставка в связанную таблицу, которая тоже имеет поле со свойством Identity, то в результате @@identity вернет не код записи таблицы tablex, а код записи подчиненной таблицы.

Поэтому в данном конкретном случае лучше использовать функцию SCOPE_IDENTITY(). Примерно так

X++:
stringSQL = " set nocount on;" + "\n" + 
                   " insert into tablex (name) values ('Name3');" + "\n" +
                   " SELECT NewIdent=SCOPE_IDENTITY()" + 
                    "";
rec.open(stringSQL);
Если же используется версия MS SQL 2005 или старше, то есть более строгое решение с использованием опции OUTPUT

X++:
stringSQL = " set nocount on;" + "\n" + 
                   " declare @retVal table(f1 integer)"
                   " insert into tablex (name) output inserted.f1 into @retVal values ('Name3');" + "\n" +
                   " SELECT f1 from @retVal" + 
                    "";
rec.open(stringSQL);
В данном случае я предполагаю, что таблица имеет поле f1 типа integer со свойством identity

Другими словами, одной команды INSERT явно не достаточно. Нужно либо писать процедуру, либо посылать повторный запрос для поиска только что вставленной записи. Что для Вас проще и привычнее, то и делайте.
Теги
ado, insert, odbc, ключ

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta 3.0 Добавление записей во врем. таблицу vagon DAX: Функционал 1 14.02.2011 13:56
Массовое удаление записей через CCADOConnection Shirmin Oleg DAX: Программирование 68 04.05.2010 15:49
добавление поля в таблицу с огромным количеством записей rpr DAX: Программирование 22 24.04.2009 14:13
Задвоение RecId при вставке записей через COM коннектор db DAX: Программирование 1 23.04.2009 15:12
К чему приводит добавление поля в таблицу. si DAX: Программирование 6 21.05.2002 11:54
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:10.