Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Доброе утро! Ситуация такая: В одном методе у меня согласно признаку (редактирования или добавления записи) происходят эти действия. Сначала у меня при добавлении новой записи была инструкция INSERT только для тех полей, где проверяется целостность базы данных, а зетем шел REPLACE. Когда попробовал это действие по сети, то у меня возникли существенные задержки при добавлении новой записи. Я убрал REPLACE и в инструкцию INSERT поместил изменения всех значений полей. Результат был потрясающим. Но проблема была в том, что помимо INSERT необходимо делать и просто обнавление данных. В обновлении данных у меня по-прежнему участвует REPLACE. Может быть использовать UPDATE? Тогда необходимо иcпользовать уникальный индекс номера записи. Есть ли в VFP6 возможность автоматического добавления уникального номера записи или необходимо самому создать такое поле? Если самому создавать такое поле, то как присваивать номер для записи, т.е. по RECNO() записи или как-то по-другому? Буду благодарен за советы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 09:27 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
такое поле создавать нужно ручками. И в VFP60 пользовать свою ф-цию создания уникального ключа. Афтоинкремент появися в 8 версии. Лична я еще с FPD26 пользую данную мульку на ключ. Выдрал с какой-то книжки и модифил. См. комменты Код: 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. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 10:33 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Немного не в тему, но если нужен уникальный суррогатный ключ, то я пользуюсь функцией sys(2015) - MS гарантирует, что все значения будут уникальными... Пока так оно и было. Эту функцию можно вставлять в Insert... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 10:45 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
2 Sergey Ch в сети она может не катить ;) А помница еще в FPD на _одной_ машине лабала _одинаковые_ названия. Когад пентюшки быстренькие пошли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 10:55 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Все может быть :) Ставил аналогичный эксперемент в сети - 1 Gb/s - машины были в основном Xenon 2.4 Ghz, в таблице с 1000000 записей - все значения шли почти по порядку. Двойных не было, а может мне просто повезло... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 11:11 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
А если еще к этому использовать имя пользователя в сети? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 11:16 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Лучше сгенирить GUID Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 11:25 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
2 Hel!Riser sys(2015), равно как и sys(3) уникально в течение одной милисекунды. используй например str(recno()) + sys(2015) и будет тебе ШАСТЬЕ (компы, на которых фокс сможет вставить, удалить а потом снова вставить запись в течение одной милисекунды появястя оооччччень не скоро:-)) ------------------------------------------------ Who is Fuck the Alise? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 12:16 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Можно еще на всякий случай перед вставкой "уникального" значения поискать его в таблице и если !seek - смело вставлять! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 18:48 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
to Crip Для чайников - можно пару фраз коментариев к приведённому коду. Заранее спасибо!!!!!!!!!!!!!!!!!!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:20 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Уважаемые участники форума! ДЛЯ ЧАЙНИКОВ! Кто использует приведённый Crip'ом код. Пожалуйста, несколько фраз комментариев. Вообще, оптимальное ли это решение. Позарез нужен уникальный индекс.(VFP 7). БОЛЬШОЕ СПАСИБО ВСЕМ, КТО ОТКЛИКНЕТСЯ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 11:59 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Специально для "чайников" Сделайте поиск в данном форме по ключевому слову "NewID" Код, предложенный Crip предполагает генерацию уникального ключа в пределах ВСЕЙ базы данных. Т.е. даже в разных таблицах значение ключа не должно повторятся. Вам действительно нужны такие строгости? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 12:16 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
ВладимирМ, топик называется <Вставка в таблицу записи с уникальным id> Там приведён Ваш код генерации уникального ключа. Буду разбираться. Или я смотрю не там? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 12:37 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Поясления к коду Crip. The CoCreateGuid function calls the RPC function UuidCreate , which creates a GUID, a globally unique 128-bit integer. Use the CoCreateGuid function when you need an absolutely unique number that you will use as a persistent identifier in a distributed environment.To a very high degree of certainty, this function returns a unique value – no other invocation, on the same or any other system (networked or not), should return the same value . Microsoft обозвала термином GUID (Global Unique IDentifier) идентификатор UUID (Universal Unique IDentifier), в инете полно определений, что это такое, например, здесь - "What is a UUID?" . А вот нужна ли вам такая уникальность - решайте сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 12:53 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Там. Это код генерации уникального ID в пределах одной таблицы. Т.е. значение ID из разных таблиц могут совпадать. Код основан на сохранении последнего использованного значения ID в специальной служебной таблице. При создании новой записи это сохраненное значение увеличивается на 1 и используется как новое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 12:55 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
ВладимирМ, для полных даунов... IF CursorGetProp('buffering','TabLists')>1 AND TableUpdate(.F.,.T.,'TabLists')=.F. * Если на служебную таблицу была установлена буферизация и сброс буфера * не удался, то делаю откат буфера, причем результат этого отката уже * не имеет значения TableRevert(.F.,'TabLists') ELSE lnNewID=TabLists.LastID ENDIF[quot автор][/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:10 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, клацнул не туда ВладимирМ ВладимирМ, для полных даунов... IF CursorGetProp('buffering','TabLists')>1 AND TableUpdate(.F.,.T.,'TabLists')=.F. * Если на служебную таблицу была установлена буферизация и сброс буфера * не удался, то делаю откат буфера, причем результат этого отката уже * не имеет значения TableRevert(.F.,'TabLists') ELSE lnNewID=TabLists.LastID ENDIF При каких условиях сброс буфера может не удасться и мои действия и почему результат отката уже не имеет значения?????? Тысяча извинений за назойливость!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:15 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Здравствуйте >Здесь используется служебная таблица TabLists из базы данных Leasing >следующей структуры Подскажите, пожалуйста, в чём ньюанс использования именно базы. а не свободной таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:19 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
При использовании свободных таблиц невозможна транзакция. А при открытой транзакции есть ряд ограничений, которые надо учитывать в коде. Кроме того, предполагается, что вызов функции обычно будет производится из Default ключевого поля таблицы. А это также невозможно в свободных таблицах. В принципе, приведенный код подойдет и для свободных таблицы. Подробнее о базе данных почитай здесь http://www.foxclub.ru/kb/index.php?sid=28924&aktion=artikel&rubrik=004&id=5&lang=ru#DataBase ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:42 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
ВладимирМ! Всё понятно, за ислючением следующего: 1. При каких условиях сброс буфера может не удасться и как обрабатывать эту ситуацию 2. Почему результат отката уже не имеет значения. Спасибо, если найдёте время ответить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:49 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
1. Ну, в данном случае я предполагал, что другим пользователем открыта транзакция и он первым успел создать новую запись. В этом случае до закрытия транзакции запись служебной таблицы будет заблокирована и никто ничего не сможет в нее записать. TableUpdate() будет возвращать .F. 2. Если сброс буфера не произошел, то это ошибка генерации нового значения. Значит эту ситуацию следует как-то обработать в вызвавшей программе. Скорее всего, там или будет предпринята попытка повторной генерации ключа или глобальный откат вообще всех изменений Кроме того, ситауция когда не получился откат буфера я себе как-то не представляю. Т.е. наверно это возможно (раз такое предусматривается самой командой), но я пока не встречал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 13:55 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Большое спасибо, ВладимирМ ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 14:06 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Отвечу за ВладимираМ Основная причина того, что сброс буфера может не удасться - конфликт при блокировке (другая транзакция заблокировала запись и никак не завершится). Могут быть и другие причины, но разбирать их не так интересно, как определить способ обработки ошибок. Если увеличить счетчик в таблице поддержки идентификаторов не получилось, то проводить сохранение далее нельзя. Функция NewID может вернуть .Null. - при условии, что используется контейнер БД, а ID объявлен первичным ключом (или, если значение счетчика вставляется в неключевое поле, можно на это поле назначить условие is not .null.), этого будет достаточно, чтобы вызвать ошибку вставки в таблицу. Но эту ошибку, в свою очередь, нужно корректно обработать в клиентском приложении. Обычно решение предоставляется пользователю (например, мы откатываем текущую транзакцию и говорим пользователю в messagebox'е, что вставка не получилась, не хотите ли попробовать еще раз (Да/Нет) - по "Да" повторяем попытку). В случае, если выполняется автоматическая обработка, messagebox не пойдет - он же ее остановит, не так ли? Можно попытаться, например, сохранить данные автоматом еще пару раз, и если-таки вставка не прошла, сбросить сообщение об ошибке в log, сохранить куда-то отвергнутые данные и продолжить работу. Или пытаться сохранить снова и снова, до тех пор, пока не получится ;-) Ну и общий совет - всегда использовать короткие по времени транзакции и оптимистические блокировки. Правда, в этом случае нужно будет обрабатывать значительно больше исключений, зато в сети всем будет хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 14:22 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
по поводу ""испоьзовать КОРОТКИЕ по времени транзакции.. что-то я е понимаю... Транзакция допустим вешается на кнопку "Сохранить данные", под которой кликметод - несколько begin transaction UPDATE or INSERT UPDATE or INSERT . . . UPDATE or INSERT END TRANSACTION так? время транзакции = времени произведенных изменений..... или же кто-то делает начало транзакции при открытии форму, а конец ее после зактытия, и, если оператор открыв форму пошел покурить - транзакция остается открытой - это "длинная по времени транзакция" ??? Я правильно понял??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 14:38 |
|
||
|
Уникальный индекс номера записи
|
|||
|---|---|---|---|
|
#18+
Да, я как раз предостерегал против начала транзакции с открытием формы и конца - с закрытием ;-) Вам это может показаться смешным, но я, например, знаю людей, которые начинающие и порываются сделать именно так ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 14:48 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32447215&tid=1596969]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 324ms |

| 0 / 0 |
