Показать сообщение отдельно
Старый 12.05.2009, 11:02   #12  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от kia Посмотреть сообщение
Хочется обойтись средствами самой АХ. Будем считать что нет доступа к БД.
Для АХ 4.0 :
1. Заходим в АХ монопольно.
2. Создаем класс, запускаемый на сервере.
3. Создаем в нем метод main и вносим в него имя нужной таблицы :
X++:
#define.TableName("MyTable")

public static void main(Args _args)
{
    Connection                      con;
    Statement                       stmt;
    SqlStatementExecutePermission   ssep;
    SqlDictionary                   sqlDictionary;
    str                             sqlStr;
    int                             result;
    ;
    con  = new Connection();
    stmt = con.createStatement();

    select firstonly sqlDictionary where sqlDictionary.TabId == tablenum(#TableName) && !sqlDictionary.fieldId;

    if (sqlDictionary)
    {
        ttsbegin;

        sqlStr  = "UPDATE SystemSequences \n";
        sqlStr += "SET NextVal = (SELECT MAX(RecID) FROM " + sqlDictionary.sqlName + " WITH (TABLOCK)) + 1 \n";
        sqlStr += "WHERE DataAreaId = 'dat' AND Id = -1 AND TabId = " + int642str(tablenum(#TableName)) + " \n";

        ssep =  new SqlStatementExecutePermission(sqlStr);
        ssep.assert();
        result = stmt.executeUpdate(sqlStr);
        CodeAccessPermission::revertAssert();

        ttscommit;
    }
}
4. Запускаем класс
5. Перезапускаем АОС.
6. Проверяем на всякий случай присвоение нового RecId с помощью вставки строки.

PS. Если нет уверенности, то сначала "тренируемся на кошках"
За это сообщение автора поблагодарили: Logger (2), Poleax (2), AvrDen (1).