Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Вниз

Значение автоинкремнтного поля и ADOQuery   Найти похожие ветки 

 
parovoZZ ©   (2006-02-21 18:59) [0]

Народ, я вставляю Insert-ом запись в таблицу с автоинкрементным полем. Так вот как получить это значение "не отходя от кассы"? Тут подсказали @@identity, но это только для MSSQL, а у меня Access.


 
Anatoly Podgoretsky ©   (2006-02-21 19:56) [1]

SELECT @@IDENTITY


 
ALIES   (2006-02-22 07:43) [2]

Подробнее, что значить "не отходя от кассы"? Что имено тебе надо вставить?


 
parovoZZ ©   (2006-02-22 08:54) [3]


> Anatoly Podgoretsky ©   (21.02.06 19:56) [1]
> SELECT @@IDENTITY

А из ADOQuery как его вытащить? FieldByName (@@IDENTITY).Value ?


> ALIES   (22.02.06 07:43) [2]
> Подробнее, что значить "не отходя от кассы"? Что имено тебе
> надо вставить?

Не вставить, а получить. Сразу же, после вставки записи.


 
ALIES   (2006-02-22 12:05) [4]

SELECT MAX(<автоинкрементное поле>) AS LastID FROM <table name>

В дельфях
Query.FieldByName ("LastID").AsInteger;

А вообще при добавлении записи курсор устанавливается на новую запись,
поэтому можно сразу из Query взять значение

Query.ExecSQL;
Query.FieldByName (<автоинкрементное поле>).AsInteger;


 
Johnmen ©   (2006-02-22 12:16) [5]

>ALIES   (22.02.06 12:05) [4]

Прошу прощения, но это бред от первой строки до последней...:)


 
ALIES   (2006-02-22 12:40) [6]


> Прошу прощения, но это бред от первой строки до последней.
> ..:)

В чем имнно?


 
Johnmen ©   (2006-02-22 13:29) [7]

Тем, что
1. SELECT MAX(<автоинкрементное поле>) AS LastID FROM <table name>
истинный результат не гарантирует.
2. Query.ExecSQL;
Query.FieldByName (<автоинкрементное поле>).AsInteger;
нет НД нет и результата.


 
parovoZZ ©   (2006-02-22 20:55) [8]

Истина где-то рядом?

Как же быть?


 
Nikolay M. ©   (2006-02-23 14:28) [9]


> Тут подсказали @@identity, но это только для MSSQL,


http://www.sql.ru/faq/faq_topic.aspx?fid=214
Q8.


 
parovoZZ ©   (2006-02-23 16:21) [10]

Вообщем, изучив всё выше названное, родилось следующее:

  SQL := "SELECT @@Identity as ID";
  ADOQuery.Close;
  ADOQuery.SQL.Clear;
  ADOQuery.SQL.Add(SQL);
  ADOQuery.Open;
  i := ADOquery.FieldByName ("ID").AsInteger;

Вроде "показания" правильные.


 
msguns ©   (2006-02-23 17:25) [11]

function TdmLibr.DBT_PutCTLG(Rec: PDBRec_CTLG): boolean;
// Добавление / Изменение записи в каталоге
var
 NewID: Integer;
begin
 result := false;
 if Rec.ID=-1 then
   with TADOQuery.Create(nil) do
    try
     Connection := cnLibr;
     SQL.Text := "SELECT MAX(ID)+1 AS NEWID FROM CTLG";
     Open;
     if RecordCount>0 then
        NewID := Fields[0].AsInteger
     else
        NewID := 1;
     Close;
    finally
     Free;
    end
 else
   NewID := Rec.ID;
 if NewID=0 then exit;
 with TADOCommand.Create(nil) do
   try
    Connection := cnLibr;
    if Rec.ID=-1 then
       CommandText := "INSERT INTO CTLG (ID,BNAME,TID,BCLTNAME,BCLTVOL,THID,PYEAR,PID,PHID"+
                      ",BINVNUM,BINVNUMA,BPRICE,BDATEIN,BDATEOUT,BAVAIL,CID,UID,ONUM,SNUM,BLANG,BADDR" +
                      ",BSTORR,BSTORB,BSTORS,BSTORN,BAUTORS,BANNOT,BMOVINFO) "+
                      " VALUES (:ID,:BNAME,:TID,:BCLTNAME,:BCLTVOL,:THID,:PYEAR,:PID,:PHID"+
                      ",:BINVNUM,:BINVNUMA,:BPRICE,:BDATEIN,:BDATEOUT,:BAVAIL,:CID,:UID,:ONUM,:SNUM,:B LANG,:BADDR"+
                      ",:BSTORR,:BSTORB,:BSTORS,:BSTORN,:BAUTORS,:BANNOT,:BMOVINFO) "
    else
       CommandText := "UPDATE CTLG SET BNAME=:BNAME,TID=:TID,BCLTNAME=:BCLTNAME,BCLTVOL=:BCLTVOL"+
                      ",THID=:THID,PYEAR=:PYEAR,PID=:PID,PHID=:PHID,BINVNUM=:BINVNUM,BINVNUMA=:BINVNUM A"+
                      ",BPRICE=:BPRICE,BDATEIN=:BDATEIN,BDATEOUT=:BDATEOUT,BAVAIL=:BAVAIL"+
                      ",CID=:CID,UID=:UID,ONUM=:ONUM,SNUM=:SNUM,BLANG=:BLANG,BADDR=:BADDR,BSTORR=:BSTO RR "+
                      ",BSTORB=:BSTORB,BSTORS=:BSTORS,BSTORN=:BSTORN,BAUTORS=:BAUTORS"+
                      ",BANNOT=:BANNOT, BMOVINFO=:BMOVINFO"+
                      "  WHERE ID=:ID ";
    Parameters.ParamByName("ID").Value := NewID;
    Parameters.ParamByName("BNAME").Value := Rec.BNAME;
    Parameters.ParamByName("TID").Value := Rec.TID;
    Parameters.ParamByName("BCLTNAME").Value := Rec.BCLTNAME;
    Parameters.ParamByName("BCLTVOL").Value := Rec.BCLTVOL;
    Parameters.ParamByName("THID").Value := NULL;
    if Rec.THID>-1 then Parameters.ParamByName("THID").Value := Rec.THID;
    Parameters.ParamByName("PYEAR").Value := NULL;
    if Rec.PYEAR>0 then Parameters.ParamByName("PYEAR").Value := Rec.PYEAR;
    Parameters.ParamByName("PID").Value := NULL;
    if Rec.PID>-1 then Parameters.ParamByName("PID").Value := Rec.PID;
    Parameters.ParamByName("PHID").Value := NULL;
    if Rec.PHID>-1 then Parameters.ParamByName("PHID").Value := Rec.PHID;
    Parameters.ParamByName("BINVNUM").Value := Rec.BINVNUM;
    Parameters.ParamByName("BINVNUMA").Value := Rec.BINVNUMA;
    Parameters.ParamByName("BPRICE").Value := NULL;
    if Rec.BPRICE>0 then Parameters.ParamByName("BPRICE").Value := Rec.BPRICE;
    Parameters.ParamByName("BDATEIN").Value := NULL;
    Parameters.ParamByName("BDATEOUT").Value := NULL;
    if Rec.BDATEIN>0 then Parameters.ParamByName("BDATEIN").Value := DateToStr(Rec.BDATEIN);
    if Rec.BDATEOUT>0 then Parameters.ParamByName("BDATEOUT").Value := DateToStr(Rec.BDATEOUT);
    Parameters.ParamByName("BAVAIL").Value := Rec.BAVAIL;
    Parameters.ParamByName("CID").Value := NULL;
    if Rec.CID>-1 then Parameters.ParamByName("CID").Value := Rec.CID;
    Parameters.ParamByName("UID").Value := NULL;
    if Rec.UID>-1 then Parameters.ParamByName("UID").Value := Rec.UID;
    Parameters.ParamByName("ONUM").Value := Rec.ONUM;
    Parameters.ParamByName("SNUM").Value := Rec.SNUM;
    Parameters.ParamByName("BLANG").Value := Rec.BLANG;
    Parameters.ParamByName("BADDR").Value := Rec.BADDR;
    Parameters.ParamByName("BSTORR").Value := Rec.BSTORR;
    Parameters.ParamByName("BSTORB").Value := Rec.BSTORB;
    Parameters.ParamByName("BSTORS").Value := Rec.BSTORS;
    Parameters.ParamByName("BSTORN").Value := NULL;
    if Rec.BSTORN>0 then Parameters.ParamByName("BSTORN").Value := Rec.BSTORN;
    Parameters.ParamByName("BAUTORS").Value := Rec.BAUTORS;
    Parameters.ParamByName("BANNOT").Value := Rec.BANNOT;
    Parameters.ParamByName("BMOVINFO").Value := Rec.BMOVINFO;
    Execute;
    result := true;
    Rec.ID := NewID;
   finally
    Free;
   end;
end;


 
Johnmen ©   (2006-02-23 19:06) [12]

>msguns ©   (23.02.06 17:25) [11]

Серёга, зачем ты огорчаешь общественность такими высказываниями?
Особенно "SELECT MAX(ID)+1 AS NEWID FROM CTLG"
:(


 
msguns ©   (2006-02-24 10:33) [13]

>Johnmen ©   (23.02.06 19:06) [12]

Жень, речь-то об акцесе идет ;)


 
Nikolay M. ©   (2006-02-24 12:44) [14]


> msguns ©   (24.02.06 10:33) [13]


А чем ахсекс так уникален, что при многопользовательской работе MAX (ID) + 1 не даст граблями по лбу?


> INTO CTLG


Название таблицы уж очень знакомо... "BackBone" - говорит о чем-нибудь? :)


 
msguns ©   (2006-02-24 13:04) [15]

>Nikolay M. ©   (24.02.06 12:44) [14]
>А чем ахсекс так уникален, что при многопользовательской работе MAX (ID) + 1 не даст граблями по лбу?

Программа, фрагмент которой я привел, работает так: если кто-то уже начал писать в базу, то она уже только читает (функции обновления не работают). Дело в том, что программа предназначена для хранения библиотечной картотеке и основной ее функционал - это быстро искать требуемую литературу. Ввод же в БД значителен только при заполнении базы их описей. В нашей организации только одна девушка работает библиотекарем, - параллировать ее просто не с кем.
А вот смотреть (искать) лиературу будут многие.
Программа писана чисто для "местного" использования и не предназначена для продажи или тиражирования.

Пример привел просто как фрагмент работающей программы, выполняющий описанную в сабже работу (вставка новой записи, определение ее ID и поиск ее в обновленном датасете)

>Название таблицы уж очень знакомо... "BackBone" - говорит о чем-нибудь? :)

Нет


 
sniknik ©   (2006-02-24 13:18) [16]

> как фрагмент работающей программы
работающей правильно только в силу специфических причин (только один добавляет записи. судя по [15]. да еще и редко т.к. ручной ввод)
имхо не стоит такие методы рекомендовать для всеобщего применения... не у всех "специфика" совпадет.


 
Nikolay M. ©   (2006-02-24 13:19) [17]


> msguns ©   (24.02.06 13:04) [15]
> Программа, фрагмент которой я привел, работает так: если
> кто-то уже начал писать в базу, то она уже только читает
> (функции обновления не работают).


В этом примере нет ничего, что указывало бы на то, что изменения вносит только один пользователь, а код инициализации двух десятков полей в свете сабжа здесь вообще лишний.
Продолжая тему: если уж очень хочется руками генерировать ID как MAX + 1, то для многопользовательской системы нужна блокировка таблицы.

http://www.compdoc.ru/bd/access/schemes_blocking_in_bd/


 
msguns ©   (2006-02-24 13:58) [18]

>sniknik ©   (24.02.06 13:18) [16]
>Nikolay M. ©   (24.02.06 13:19) [17]

Я же с вами не спорю. Я предложил лишь один из способов, пусть и далеко не самый лучший.
Праативныеее


 
Nikolay M. ©   (2006-02-24 14:05) [19]


> Я предложил лишь один из способов


Решил с [4] померяться?


> Праативныеее

Угу. Николаи - они тово... вредные...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.031 c
2-1144403565
fast2
2006-04-07 13:52
2006.04.23
Как "выкинуть" из списка Tab Order... определенный компонент?


1-1142917383
_Mike_
2006-03-21 08:03
2006.04.23
should match case of ancestor TComponent.Create


3-1141100337
Vladimir M
2006-02-28 07:18
2006.04.23
Как передать массив данных в параметр SQL запроса


2-1144320979
Naganov
2006-04-06 14:56
2006.04.23
Функция MonthOfTheYear


2-1144396353
Daria
2006-04-07 11:52
2006.04.23
разделители





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский