Конференция "Базы" » Узнать макс. номер счетчика в таблице [D7, Access]
 
  • jiura (17.01.12 16:35) [0]
    Здравствуйте!
    Использую Access и компоненты ADOQuery и ADOConnection. В определенный момент при нажатии на кнопку пользователя я добавляю новую пустую строку в базу данных, а именно:


    ADOQuery1.SQL.Add('INSERT INTO Orders (S1) VALUES('''')');



    Т.е. добавляю строку с пустым значением в столбце. Сама таблица orders содержит автоатиеский счетчик, который после добавления записи увеличивается на один. Мне необходимо узнать его номер. Т.е. номер последней актуальной записи.
    Два нюанса.
    Если я делаю так (S1 - счетчик):

    ADOQuery1.SQL.Add('SELECT S1 FROM Orders');
    ADOQuery1.Active:=True;
    Showmessage(INttostr(ADOQuery1.RecordCount));



    То он все равно не выводит последнюю запись, так как пустые записи добавленные до этого по ходу оказываются вверху таблицы и номер счетчика выводится неверно.

    А если делаю так (S1 - счетчик):

    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT max(S1) FROM Orders');
    ADOQuery1.Active:=True;



    То он вроде как выводит поседею запись, но как узнать ее номер я не знаю. Помогите пож-ста.
  • stas © (17.01.12 17:19) [1]
    1. Select @@Identity - возвращает последнее значение счетчика в текущем подключении.
    2. Чтобы спозиционировать курсор на запись зная ее ID необходимо
    Использовать метод Locate
    AdoQuery.Locate ();

    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT @@Identity');
    ADOQuery1.Active:=True;
    ID = AdoQuery.fields[0].value;
    AdoQury2.locate ('S1',ID,[])


    По моему так, сейчас нет delphi под рукой
  • sniknik © (17.01.12 17:24) [2]
    var
     RecordsAffected, Identity: integer;
    begin
     with ADOCommand1 do begin
       CommandText:= 'INSERT INTO aTable (Name) VALUES (''Name'')';
       Execute(RecordsAffected, EmptyParam);

       CommandText:= 'SELECT @@IDENTITY';
       Identity   := Execute.Fields[0].Value;
     end;

     Edit1.Text:= IntToStr(RecordsAffected) +':'+ IntToStr(Identity);
    end;

  • Ega23 © (17.01.12 19:17) [3]

    > То он все равно не выводит последнюю запись, так как пустые
    > записи добавленные до этого по ходу оказываются вверху таблицы
    > и номер счетчика выводится неверно.


    А ты не номер счётчика выводишь, а количество записей в таблице.
    Вот представь. Изначальное значение счётчика 0. Я добавил 10 записей. Текущее значение счётчика стало 10. Потом я удалил все 10 записей. Текущее значение счётчика не изменилось. Теперь я добавил одну запись. Текущее значение счётчика - 1. А ты
    ADOQuery1.SQL.Add('SELECT S1 FROM Orders');
    ADOQuery1.Active:=True;
    Showmessage(INttostr(ADOQuery1.RecordCount));


    выводишь RecordCount который будет равен единице.

    Смотри вариант sniknik ©
  • Ega23 © (17.01.12 19:31) [4]
    Опечатка

    > Текущее значение счётчика - 1


    Текущее значение счётчика - 11.
  • Alex_C (25.01.12 21:00) [5]

    > 1. Select @@Identity - возвращает последнее значение счетчика
    > в текущем подключении.


    Правильно ли я понимаю - Select @@Identity - последнее для ДАННОГО подключения, т.е. то, что я сейчас вставил, Select Max(S1) - это ВООБЩЕ последнее для ВСЕХ подключений?
  • Ega23 © (25.01.12 21:33) [6]

    >  Select Max(S1) - это ВООБЩЕ последнее для ВСЕХ подключений?

    Не знаю, как конкретно в Access, но вообще Select Max(S1) - максимальное из всех подтверждённых (comitted)
 
Конференция "Базы" » Узнать макс. номер счетчика в таблице [D7, Access]
Есть новые Нет новых   [134431   +11][b:0][p:0.001]