|
|
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Доброго всем времени суток! Ребяты есть такой вопросик: в таблице oss.dbf хранятся объекты с инвентарными номерами скажем от 100000 до 999999, вводим новый объект - ему надо присвоить инвентарный номер, которого в таблице oss.dbf нет. Как сформировать SQL-запрос, чтобы он выдал все свободные номера от 100000 до 999999, которых нет в oss.dbf Вариант когда создается курсор с одним полем, содержащим номера от 100000 до 999999, а потом делается SQL-запрос используя связку NOT IN не совсем подходит.... Заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:20:14 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
имхо иначе никак. курсор значений пусть существует фсегда. А если в результате такого запроса те не нравица слишком большое количество записеq, то пользуй конструкцию типа SELECT MIN(Value) FROM AllValues WHERE NOT IN () тогда фсегда будет возвращена тока одно свободное число ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:40:22 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Ты уж определись, что именно тебе нужно: Узнать ВСЕ "дыры" в нумерации Узнать ПЕРВУЮ (одну) "дыру" в нумерации В любом случае, без дополнительной таблицы это займет достаточно много времени. Поиск первой попавшейся примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Здесь TabNum - это поле с табельным номером. По нему построен индекс. Если "дыра" в начале нумерации, то поиск пройдет быстро, а если в конце или вообще нет дыр, то очень медленно. Хотя, можно предварительно оценить, есть ли дыры вообще Код: plaintext 1. 2. 3. 4. 5. 6. 7. Если надо узнать ВСЕ "дыры", то несколько сложнее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:44:05 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
если бы oss.dbf была отсортирована... тогда бы подошло Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:44:08 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Ясненько.... тогда уж лучше первый вариант, хотя я очень надеялся на что-то более оригинальное. Спасибо, Hel!Riser. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:46:07 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Тут проще и быстрее без запроса упорядочиваешь по номеру идешь по таблице и считашь счетчиком параллельно. Как счетчик не совпал. Значит нашел. примерно так Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:46:25 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Ух, ребяты, спасибо... столько сразу ответов, но у меня именно перебор и используется, а я хотел что-то побыстрее... Мне понравился вариант, который предложил Komissar, но, к сожалению, он не подходит так как в таблице инвентраные номера не целые, а имеют дробную часть... Все равно всем спасибо. Наверное создам табличку с одним полем и со всеми доступными номерами и пусть валяется себе на диске, а когда необходимо буду выбирать из нее те номера, которых нет в oss.dbf одним запросом и быстро и просто! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 10:51:34 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Вариант, предложенный Komissar не подходит при любом раскладе. Дробные числа можно умножать, например, на 1000, чтобы они стали целыми. Проблема не в этом. Recno() не учитывает записи помеченные как удаленные. Т.е. их вроде уже как нет, но данный алгоритм предполагает, что есть. Команда INSERT BEFOR требует эксклюзивного доступа к таблице. Накладывает ряд ограничений на саму таблицу. В VFP оставлена для обратной совместимости. Не стоит использовать подобные команды без крайней необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 11:10:45 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
ВладимирМВариант, предложенный Komissar не подходит при любом раскладе... 1. а зачем удалять инвентарные номера??? куда они деваются чтоб их надо было удалять??? 2. ну я и сказал что "некрасиво"! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 11:27:54 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
И мои несколько копеек Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 11:29:44 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
ВладимирМ, по поводу примера Kommisar'a вы, конечно, правы, но мне и не нужна была команда INSERT BEFORE просто мне понравился вариант нахождения первого свободного номера... PaulWist, вам спасибо за пример, но видимо из-за версии фокса у меня не идет функция INDEXSEEK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2005, 11:45:18 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
Hi kms_! > видимо из-за версии фокса у меня не идет функция INDEXSEEK. Какая же у тебя версия то :( Вообще найти "дырки" в нумерации можно и сравнительно простым SQL запросом - например таким: SELECT t1.nID + 1 FROM test t1 WHERE t1.nID NOT IN (SELECT t2.nID - 1 FROM test t2) и/или таким: SELECT t1.nID - 1 FROM test t1 WHERE t1.nID NOT IN (SELECT t2.nID + 1 FROM test t2) Конечно это даст НЕ ВСЕ дырки, а лишь первые (или соответственно последние) из пропущенных интервалов - ну т.е. если пропущены номера с 5 по 20, то первый запрос вернёт 5, а второй - 20 "промежуточные" значения возвращены не будут. Если пропущено всего одно значение (т.е. есть всё кроме # 5), то конечно в обоих случаях будет возвращено именно оно - это своеобразный интервал содержащий всего 1 число. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2005, 01:43:32 |
|
||
|
Свободные номера через SQL-запрос
|
|||
|---|---|---|---|
|
#18+
У меня работает такой вариант... ********************************* SELECT NOMER NOFILTER FROM NOMERIN ORDER BY 1 INTO CURS _NOMER_ M.DYRKA=_TALLY+1 IF M.DYRKA-1<_NOMER_.NOMER &&& ЕСТЬ ДЫРКИ INDEX ON NOMER TAG NOMER FOR NOMER-RECNO()>0 **************** GO TOP M.DYRKA=IIF(_NOMER_.NOMER>0,_NOMER_.NOMER-1,M.DYRKA) ENDIF ********************************* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2005, 04:02:45 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33255734&tid=1593527]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
220ms |
get topic data: |
16ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 544ms |

| 0 / 0 |
