|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Для полноты картины: create table xx (id counter) Эта команда создает таблицу со счетчиком. Странно, что до сих пор в этом топике она не появилась. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2004, 21:47 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Получение последнего значения счетчика для adp: SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY] Спасибо Темному! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2004, 14:44 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Вах! Прыятно, да! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2004, 15:12 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
маленькое уточнение SELECT @блабла = SCOPE_IDENTITY в ХП вернет null пользоваться параметром вывода RETURN SCOPE_IDENTITY ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2004, 23:44 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Странно, у меня "SELECT SCOPE_IDENTITY() as maxID" возвращает не NULL - а реальное значение счетчика. A2002, SQL 2000. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2004, 23:50 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
у меня null ado.net + msde щас в bol залезу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2004, 23:53 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Мужики, вы говорите о разных командах. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2004, 23:57 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
У меня выдавал NULL когда я добавлял запись через .ADDNEW, пришлось переделать через "insert into ..." - тогда все заработало. Почему не работает в первом случае - лень было разбираться... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.04.2004, 23:59 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
2 ВС Мы говорим об SCOPE_IDENTITY() - а как ее возвращать дело второе ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:02 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Вы говорите о том, что через SELECT SCOPE_IDENTITY() as maxID и RETURN SCOPE_IDENTITY оно работает, а через SELECT @блабла = SCOPE_IDENTITY нет. Вы тут спорите о чем-то, а спорить не о чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:08 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
BOL дома нету,\r прошолся гуглом и нашел тока на клиппере кто то столкнулся тынц \r и Павла 2001 года тынц но у меня не то, я через command, завтра на ado.net форуме задам\r Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:15 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
тьфу, прошу прошения... подмахнуф вместо @@identity незаметил :) все ухожу спать, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:18 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
2 Артист Кларион и Клиппер абсолютно разные вещи ;-) Я аж прыгул по ссылке - думаю неуж то Клиппер с эскюлем стыковали? ;-))) Я на Клиппере много задач решил в свое времяю Он даже лицензионный был у меня... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:21 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
вернулся из кровати позвольте а кроме как в параметре я тогда несмог бы использовать SCOPE_IDENTITY ? Кларион и Клиппер абсолютно разные вещи ;-) ну да кларион магнитолы есть такие ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:27 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
сам же и отвечаю, после INSERT писать SCOPE_IDENTITY в переменную\r и юзать - иначе SCOPE_IDENTITY будет null\r /topic/87320\r опять с вашими идентитями не выспалюсь ... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2004, 00:47 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Самый-самый последний вариант. Вопросы. Q1: Как создать свой счетчик (чтобы поле было не типа счетчик)? Q2: Как заставить счетчик начать выдавать значения начиная с некоторой заданной величины? Q3: Может ли поле счетчика содержать повторяющиеся значения? Q4: В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было? (Другой вариант вопроса. Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей меньше. Почему счетчик неправильно считает количество записей в таблице? Что это - баг или фича?) Q5: Как сымитировать счетчик в отчете? Q6: Как сымитировать счетчик в запросе на добавление? Q7: Как сымитировать счетчик в обычном запросе либо ленточной форме? Q8: Как получить значение счетчика только что добавленной записи? Q9: Как создать одним запросом таблицу со счетчиком? Вопросы с ответами. Q1: Как создать свой счетчик (чтобы поле было не типа счетчик)? A: Надо написать функцию, к которой обращаться либо в DefaultValue контрола (к сожалению, DefaultValue поля в таблице допускает только ограниченный набор стандартных функций), либо в программе, которая добавляет запись через рекордсет, либо в запросе на добавление. Ниже приведено несколько вариантов такой функции. Особое внимание надо уделить обработчику ошибок. Вариант 1: Код: plaintext
Так можно нумеровать записи даже внутри группы, а не только насквозь через всю таблицу. Для этого надо правильно задать параметры DMax. Правда, надо отдельно позаботиться о ситуации, когда два юзера обратятся к этому "генератору счетчиков" одновременно. На этот случай надо написать обработчик ошибок. Вариант 2: Заводим отдельную таблицу с одним полем типа счетчик и без данных. Приводимая ниже процедура обращается к такой таблице и возвращает очередное значение для "нашего" счетчика. Внимание - файл, в котором сидит эта таблица, запрещено сжимать. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
Подвариант: все-таки делать rsCounter.Update, тогда по виду этой таблицы будет сразу ясно, какое значение было выдано последним. Правда, в этом случае файл станет расти. Еще подвариант: держать в этой таблице одну запись, в которой находится очередное значение счетчика, и вместо AddNew делать Edit и rsCounter!nCounter=rsCounter!nCounter+1, а потом соответственно Update. Вариант 3 (от Гетца): Держим в отдельной таблице очередное значение счетчика и каждый раз увеличиваем его на 1. Таблица блокируется на момент чтения и увеличения счетчика, а все, кто в нее будут в это время стучаться, спокойно ждут (см. обработчик ошибок adhGetNextAutoNumber_Err) освобождения таблицы. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
Q2: Как заставить счетчик начать выдавать значения начиная с некоторой заданной величины? A1: Добавить в таблицу со счетчиком при помощи инсерта запись, в которой полю счетчика дается значение на 1 меньше, чем надо. Потом удалить эту запись. Способ работает только при условии, что этот счетчик этого или большего значения еще не выдавал. (Если таким образом дать счетчику отрицательное значение, то он начнет выдавать отрицательные значения, несмотря на то что уже выдавал значения, большие их. Играя на этом, можно добиться, чтобы счетчик выдавал любые значения, в т.ч. и те, которые уже были.) A2: Сжать базу, в которой сидит таблица со счетчиком. Счетчик будет выдавать значения начиная с наибольшего из существующих +1. В некоторых версиях Аксесса это работает только при условии, что таблица со счетчиком пуста (и тогда счетчик начнет выдавать значения с 1). A3: Начиная с Аксесса 2000, можно запустить запрос наподобие такого: Код: plaintext
Q3: Может ли поле счетчика содержать повторяющиеся значения? A: В принципе да. Этого несложно достичь, меняя состояние счетчика описанными способами. Однако если при этом возникнут нарушения ключа (вообще говоря, поле счетчика можно и не делать ключевым, но обычно все-таки принято делать), то записи просто не смогут добавляться. Каждая неудачная попытка добавить запись будет увеличивать значение счетчика на 1. Когда зона существующих значений будет пройдена, то записи опять смогут добавляться. Q4: В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было? (Другой вариант вопроса. Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей меньше. Почему счетчик неправильно считает количество записей в таблице? Что это - баг или фича?) A: Это нормальная ситуация. Если возникла необходимость, чтобы значения счетчика шли подряд, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть. Счетчик не служит для подсчета записей. Q5: Как сымитировать счетчик в отчете? A: Заводим текстбокс и задаем ему свойства: Код: plaintext 1.
Q6: Как сымитировать счетчик в запросе на добавление? A: Пишем функцию примерно такого вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В запросе обращаемся к ней дважды: в части WHERE - с параметрами (чтоугодно,N), где N равно нужному начальному значению счетчика; в части SELECT - в качестве первого параметра передавать любое поле из таблицы, второй параметр не указывать. Внимание: упрощать этот код, удаляя из него параметр, передаваемый в части SELECT, - нельзя. Без параметра функция будет вызвана только один раз, а не в каждой записи заново. Q7: Как сымитировать счетчик в обычном запросе либо ленточной форме? A1: SELECT (Select Sum(1) From t AS p Where p.f<=p1.f), p1.f FROM t AS p1 ORDER BY p1.f; A2: SELECT DCount("f", "t","f<=" & CStr(f)), f FROM t ORDER BY f; Примечание 1. Поле f обязано быть уникальным. Примечание 2. Способ 1 быстрее работает, но является необновляемым. Q8: Как получить значение счетчика только что добавленной записи? A1: Если запись добавляется через рекордсет, то так: Код: plaintext 1. 2. 3.
A2: Более широкий круг применимости у такого способа: Код: plaintext 1. 2. 3. 4. 5.
Однако и этот способ имеет ограничения, а именно: работает только через ADO, только в Jet 4 и позже, и только с базами формата Аксесса 2000 и позже; возвращает значение только из записи, добавленной программно, но не через юзер-интерфейс. A3: Для adp годится такая модификация того же способа: SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY] Q9: Как создать одним запросом таблицу со счетчиком? A: create table xx (id counter) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 16:32 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Опубликовано! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 16:47 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Уважаемые, прошу сразу не бить, но позвольте спросить - насколько порочна идея, касающаяся SQL-adp. Принцип состоит в использовании id таблицы SQL server. Т.е. составлять уникальный (???) номер строки, добавляя по 1 к id. Добавляя не арифметически, а строчно. Просветите пожалуйста, насколько будет уникален такой номер. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 16:54 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Он не будет уникален, потому что два юзера могут одновременно создать одинаковое значение. А что значит строчно? Типа, если было 11111111111111111111111111111 то добавить 1 и получить 111111111111111111111111111111 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 16:56 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
ну да ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 16:58 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Но тогда он не только не будет уникальным, но и поле придется под него заводить бешеного размера, и все равно оно быстро кончится. Зачем делать плохо, если можно делать хорошо? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 17:01 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Сан Саныч, прошу прошения за неточность, я имел ввиду следующее ID - 1234 1 строка - 12341 2 строка 12342 3 строка 12343 4 строка 12344 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 17:04 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
Владимир Саныч - я чёкнулся - простите ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 17:06 |
|
FAQ. Что мы знаем про каунтеры (aka счетчики)
|
|||
---|---|---|---|
#18+
А если будет 12349, то дальше 123410? Или 123491? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2004, 17:07 |
|
|
start [/forum/topic.php?fid=45&msg=32504953&tid=1654065]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 264ms |
total: | 403ms |
0 / 0 |