Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Всем привет!!! Вот решил совокупить VFP и SQL Server... И пошли трудности... :( 1) Создал таблицу в SQL Server 2000 с полями timestamp,char,char; 2) Добавил несколько записей в таблицу; 3) Сделал в SQL Server 2000 View; 4) Сделал в VFP Remote View ссылающуюся на View из SQL Server; 5) Организовал форму с гридом, в dataenvironment добавил view; Изменяю значение поля с типом char одной записи... Перехожу на другую запись. Потом возвращаюсь к записи, которую недавно редактировал и опять ее пытаюсь редактировать... Перехожу опять на другую запись и... Update conflict... Как читал на форуме попытаюсь через aerror выяснить точную причину... На вскидку что это может быть??? И еще... Можете подсказать как реализовать такую схему работы в многопользовательском режиме?: 1) Пользователь №1 открыл форму со списком платежек. 2) Пользователь №2 тоже открыл форму со списком платежек. 3) Пользователь №1 выбрал платежку №44 и открыл форму для ее редактирования. 4) Пользователь №2 тоже выбрал платежку №44 и попытался открыть форму для ее редактирования. Нужно сделать так чтобы эти два пользователя не могли одновременно редактировать одну и ту же платежку. Т.е. возможен один из следующих вариантов работы: а) Когда пользователь №1 открыл платежку для редактирования, то №2 уже не может открыть ее для редактирования. Т.е. при попытки открытия выскакивает сообщение о том, что платежка редактируется другим пользователем. б) Когда пользователь №1 открыл платежку для редактирования, то №2 при попытке открытия может только просмотреть ее. Т.е. у второго пользователя все поля формы имеют значение read only (делается программно). А в идеале было бы здорово если бы в списке платежек стояла бы отметка, что данная запись редактируется уже. Заранее большое спасибо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2005, 14:00 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
StasX4 А в идеале было бы здорово если бы в списке платежек стояла бы отметка, что данная запись редактируется уже. Ну так и кто Вам мешает это сделать По поводу первого вопроса - воспользуйтесь посиком - мы уже многократно этот вопрос обсудждали. Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2005, 14:09 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
По первому вопросу я уже читал воспользовавшись поиском... Буду в понедельник экспериментировать... А вот по второму вопросу... Мне мешает это сделать незнание данных способов реализации или хотя бы направления в котором нужно думать... С уважением, Стас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2005, 16:47 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Hi StasX4! > 3) Сделал в SQL Server 2000 View; Зачем этот лишний шаг? > Изменяю значение поля с типом char одной записи... Перехожу на другую > запись. Потом возвращаюсь к записи, которую недавно редактировал и опять > ее пытаюсь редактировать... Перехожу опять на другую запись и... Update > conflict... > Как читал на форуме попытаюсь через aerror выяснить точную причину... > На вскидку что это может быть??? Плохо заданы свойства представления - KeyFieldList/UpdatableFieldList/WhereType, не обновляется поле Timestamp и/или ключевое поле, после "сохранения", которое в случае позаписной буферизации (3) происходит при перемещении между этими самыми записями... Или накладывается то, что на шаге 3 сделано промежуточное звено, которое может как-то мешать. > И еще... Можете подсказать как реализовать такую схему работы в > многопользовательском режиме?: Никак. Конфликт можно отследить лишь в момент сохранения записи - т.е. "начать править" оно могут, а вот при сохранении "второй" как раз и получит ошибку "Update conflict" которую можно по разному решать. Теоретически для того что ты хочешь сделать требуется наложение блокировки на запись (чего MS SQL насколько я в курсе не умеет - у него страницы блокируются, а там может быть куча записей) - и опять же теоретически это можно сделать, но практически это вызовет такую кучу проблем, что лучше забыть про этот способ уже сейчас. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2005, 19:16 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
StasX4 А вот по второму вопросу... Мне мешает это сделать незнание данных способов реализации или хотя бы направления в котором нужно думать... Все очень просто - вводится поле - запись взята для работы - при взятие записи пишите туда 1. Остальные пользователь получают доступ только на чтение... Но это все надо писать Вам самому - то есть этот контроль доступа и не забыть случай, когда клиент может взять запись и "отвалиться" - тут можно по таймеру очищать поле, например раз в час Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2005, 20:14 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Извиняюсь что так долго не писал... Решал вопрос о том как узнать обновил ли другой пользователь таблицу... Для этого ввел в таблицу поле timestamp... Создал курсор вычисляющий максимум по полю timestamp... Этот максимум запоминается в переменный при открытии формы со списком... Создал таймер, который каждые 60 секунд обновляет курсор с результирующим максимум по timestamp и сравнивает с запомненным результатом и если он отличается,то обновляет курсор с основным списком. Скажите, мыслю в правильном направлении??? У меня сейчас созрел вопрос... А что произойдет если последующая запись увеличит значение поля timestamp превышающее 8 байт? Сбросится на ноль, зациклиться или же автоматически перенумеруется? P.S. С первым вопросом по поводу update conflict разобрался... Поставил не там галочку в представлении... Поставил на timestamp... :) А вот со вторым вопросом никак... О варианте Sergey_Ch уже думал, но вот его недостаток, о котором он сам указал, меня смущает немного... Просто хочется чтобы все работало по человечески, а не через одно место... Типа, пользователь ввел дофига данных, а во время сохранения узнает, что кто-то другой уже редактирует и он не может ничего сохранить... Обидно... Может все-таки есть более корректное решение данного вопроса??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 18:29 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
я тоже перепробовал массу вариантов, реализовал следующую схему 1. на сервере только хранимые процедуры, которые отдаю данные на локальные машины в таблицы 2. если кто-то открыл позыцию то он пометил поле useredit своим id, когда покидает накоаную, то обнуляет это поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 20:57 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
изменяю данные на сервере тоже с помощью хранимых процедур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 20:58 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
StasX4Может все-таки есть более корректное решение данного вопроса??? @@spid - идентификатор текущего процесса (соединения) на SQL Server sysprocesses - таблица, хранящая информацию об активных процессах Query Analyzer есть? Подключаемся к серверу, создаем предварительные условия Код: 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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Сравниваем результаты. Похожее проделываем в фоксе с помощью формочек, sqlconnect() и sqlexec(). учитывая, что GO - это разделитель группы команд, а не команда TSQL. PS подробности в BOL, VFP Help и на лучших форумах рунета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2005, 23:14 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Hi StasX4! Скажите, мыслю в правильном направлении??? Нет. Просто хочется чтобы все работало по человечески, а не через одно место... "По человечески" это и есть проверять на конфликт совместного доступа и РАЗРЕШАТЬ этот конфликт тем или иным способом. Типа, пользователь ввел дофига данных, а во время сохранения узнает, что кто-то другой уже редактирует и он не может ничего сохранить Почему не может? Вполне может - ему можно предъявить изменённые данные, он сравнит что "другой" ввёл, и что он сам и выберет - сохранить свои данные (переписав "чужие" конечно) или отменить то что он навводил. Для этого предусмотрено - и TableUpdate(..., .T.) и конечно всегда можно запросить "наисвежайшие" данные с сервера - как раз для "конфликтной" записи :) Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 00:16 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
@Cyrus Спасибо, попробую поэкспериментировать... Но когда бегло проссмотрел, то кажется там нет защиты от вываливания (вернее есть, но возможны ситуации когда условия будут соблюдены)... Но это надо проверить опытным путем... @Igor Korolyov Почему я мыслю не в правильном направлении? Да, я допустил ошибку... Нужно было считать не максимум, а сумму по полю timestamp (максимальное значение остается прежним при удалении записи не с максимальным значением)... Естественно при подсчете суммы перевел ее в формат int в самом селекте... Проверил... Вроде работает... Где может возникнуть ошибка? @All Сегодня пытался разобраться с ADSI и удаленным вызовом процедур... С ADSI ничего не получилось... Подозрения, что нужен SP по новее и винды по новее... Экспериментировал и лазил по инету несколько часов... А с вызовом удаленных процедур не совсем понятна одна вешь... Как и где вычитать результат, который возвратила процедура используя return XX??? В курсор не возвращаются эти данные естественно, в ?@Result тоже не лезит и это тоже понятно... И другие варианты... Но тогда откуда??? Код: plaintext 1. Хочется обработать именно по return... По select и ?@Result1,?@Result2 понятно как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 19:47 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Ошибочка вышла: Подозрения, что нужен SP по новее и винды по новее... Я имел ввиду: Подозрения, что нужен SP по новее как для Windows 2000 Server, так и для SQL Server... P.S. Я решил наконец-то зарегистрироваться... :) Но главное не это, а мучащие меня вопросы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 19:53 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
StasX4Спасибо, попробую поэкспериментировать... Но когда бегло проссмотрел, то кажется там нет защиты от вываливания (вернее есть, но возможны ситуации когда условия будут соблюдены)... Но это надо проверить опытным путем... Дык проверяй. Честно говоря, у меня кто последним ввел данные, того и тапки, поэтому всякое может быть. StasX4А с вызовом удаленных процедур не совсем понятна одна вешь... Как и где вычитать результат, который возвратила процедура используя return XX??? Возвращаемое знаечение вещь спецфичная.. BOL читал? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/acdata/ac_8_con_04_25f2.asp StasX4В курсор не возвращаются эти данные естественно, в ?@Result тоже не лезит и это тоже понятно... И другие варианты... Но тогда откуда??? Код: plaintext 1. Создай отдельную ХП, которая будет обрабатывать значение, полученное от твоей ХП. Можно, конечно и в лоб Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 22:08 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
@Cyrus Да, хитро... Интересно, а без курсора это реально сделать??? А то как-то сложно получается и леге использовать будет не return, а OUTPUT... Сейчас проверить не имею возможности, но такой вариант может и прокатить... Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 22:50 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
StasX4Интересно, а без курсора это реально сделать??? Через дополнительную ХП Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext О чем и речь. Не стоит изобретать велосипед. StasX4Сейчас проверить не имею возможности, но такой вариант может и прокатить... Код: plaintext 1. Нет, не прокатит. Выходные параметры работают тольео с ХП. В данномм случае на сервер будет передано что-то вроде Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2005, 23:14 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Hi Cyrus! А где это написано что @@spid не может повторяться? Например создали коннект 1 - он имеет spid=100 - запустили "выборку" - ХП пометила запись - потом коннект убили, запустили через некоторое время коннект 2 и коннект 3 - они получили например spid = 100 (повторно - ведь "старый" 100-й уже давно умер!) и spid=101 - и если теперь запросить из коннекта 3 запись - получим отлуп. P.S. Даже если в рамках нормальной работы MS SQL идентификаторы не повторяются (что вряд-ли), то например после "падения" и перезапуска сервера они 100% будут повторяться - так что твой вариант хоть и хитёр, но весьма и весьма небезупречен. Так что тут по любому нужна блокировка со всеми вытекающими из этого неприятными последствиями. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 20:05 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Hi StasX4! > Почему я мыслю не в правильном направлении? Потому что не понимаешь ИДЕОЛОГИЮ работы клиент-серверных программ. Там в 99% случаев НЕ НУЖНЫ блокировки и соответственно там просто НЕ ДЕЛАЮТ так как хочешь ты - а делают так как я описал - т.е. проверяют на конфликт в момент сохранения, и разрешают конфликт тем или иным способом. А что ты там с timestamp делаешь и как - я, уж извини, даже смотреть не буду - глупости всё это и пустое. Делай всё проще и так как это принято и будет тебе счастье :) Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 20:05 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovА где это написано что @@spid не может повторяться? Например создали коннект 1 - он имеет spid=100 - запустили "выборку" - ХП пометила запись - потом коннект убили, запустили через некоторое время коннект 2 и коннект 3 - они получили например spid = 100 (повторно - ведь "старый" 100-й уже давно умер!) и spid=101 - и если теперь запросить из коннекта 3 запись - получим отлуп. Резонно. Igor KorolyovP.S. Даже если в рамках нормальной работы MS SQL идентификаторы не повторяются (что вряд-ли), то например после "падения" и перезапуска сервера они 100% будут повторяться - так что твой вариант хоть и хитёр, но весьма и весьма небезупречен. Так что тут по любому нужна блокировка со всеми вытекающими из этого неприятными последствиями. Пожалуй, не соглашусь. Всегда можно найти какой-нибудь признак, который с большой вероятностью опредляет текущий процесс Код: 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. Только не говори, что сервер можно перезапустить таким образом, что совпадут и spid, и login_time. Хотя не стану утверждать, что такого не можен быть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2005, 21:34 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
@Igor Korolyov Может быть я и не понимаю идеалогию клиент-сервер... Но... Скажем один пользователь открыл список платежных поручений и тупо глядит на него весь день. А второй пользователь в это время правит элементы этого списка. Т.е. добавляет, изменяет, удаляет... И вопрос тогда... Как первый пользователь узнает, что таблица изменилась??? Добавить на форму кнопку "Обновить"? Не думаю, что это хороший способ... Делать по таймеру обновление таблицы каждую минуту? Тоже не лучший способ т.к. может быть ничего в таблице не поменялось, а перезапрос по любому делается по таймеру (загруз сети, сервака и при любом ежеминутном запросе вздергивается список в гриде)... Я же предлагал делать по таймеру проверку изменилась ли таблица или нет и в случае изменения производить перезапрос... (Этот вопрос никак не связан с блокировкой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 14:16 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
есмть два ответа 1 наша фирма работает на корпоративном софте (с фоксом НИЧЕГО общего!!!). там при каждом клике мышей в любом месте формы происходит такое приятное подергивание, что наталкивает на мысль - задействован перезапрос данных + рефреш формы 2 я бы лично кнопку ОБНОВИТЬ сделал и все... чем она Вам не угодила не знаю.. 2 только что додумаолся... если есть ресурсы - подключаете микрофон и вешаете на форму восприятие голосовой команда If this.voice("ну-ка... че ж там в этом списке нового") = .t. thisform.refresh() ....................... Endif ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2005, 14:39 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Hi Cyrus! Всё что ты предлагаешь - это лишь способы снизить вероятность конфликта - но это не устраняет его причину! И вообще это всё больше смахивает на попытки кувалдой "починить" дамские часики... Проблема не в том КАК - проблема в том ЗАЧЕМ - решив это мы просто приходим к выводу, что все эти извращения и не нужны вовсе :) Ну не нужно в момент НАЧАЛА редактирования чего-то там проверять! Невозможно "синхронизировать" 2 ХП (Get и Set) так, чтобы можно было гарантировано "проэмулировать" блокировку не делая собственно реальной блокировки. Нужно в момент ЗАПИСИ это делать - и всего делов то! 2 StasX4 Реши идеологические вопросы сначала. - На кой пользователю видеть что там чего-то поменялось в таблице - ты когда ЧИТАЕШЬ или ПИШЕШЬ ОТВЕТ в форуме тоже постоянно давишь на Refresh? т.е. прочитал слови и давай его давить - а вдруг уже новое что-то написали (хотя ещё и старое не прочитал!) Примерно такую-же логику и у себя реализуй - НАДО новые данные - перезапроси, но не надо их "навязывать" пользователю - ибо моментально возникнет у тебя другой вопрос, типа описанного здесь: http://forum.foxclub.ru/read.php?f=5&i=109245&t=109245 т.е. человек сам себе сделал проблему, и теперь героически с ней борется... Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 02:28 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovВсё что ты предлагаешь - это лишь способы снизить вероятность конфликта - но это не устраняет его причину! С такой же вероятностью можно можно говорить о падениии метеорита в серверный шкаф. Это как же нужно постараться, чтобы создать два подключения с одинаковыми номером и временем соединения с точностью до миллисекунды. В рабочих условиях это будет сделать довольно затруднительно. Igor KorolyovИ вообще это всё больше смахивает на попытки кувалдой "починить" дамские часики... Проблема не в том КАК - проблема в том ЗАЧЕМ - решив это мы просто приходим к выводу, что все эти извращения и не нужны вовсе :) Ну не нужно в момент НАЧАЛА редактирования чего-то там проверять! Невозможно "синхронизировать" 2 ХП (Get и Set) так, чтобы можно было гарантировано "проэмулировать" блокировку не делая собственно реальной блокировки. Нужно в момент ЗАПИСИ это делать - и всего делов то! Я нигде не писал, что это правильный подход и что так нужно поступать. Я просто хотел показать, что это возможно. Я не знаю, какие требования предъявляют пользователи к автору топика. А пользователи, это такие люди, для которых программирование, технология клиент-сервер и прочие премудрости - пустой звук, особенно когда программа работает не так, как им хотелось бы. Поэтому иногда такое приходится воротить, что становится мучительно больно за собственный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2005, 21:15 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Hi Cyrus! Ты программист - и ТЫ пишешь программу. Так что разъяснить пользователю что он мягко говоря не прав - это твоя задача. Интересно, когда у них был бумажный документооборот, как они контролировали чтобы 2 человека не выписывали одновременно одинаковую бумажку? Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2005, 18:09 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovИнтересно, когда у них был бумажный документооборот, как они контролировали чтобы 2 человека не выписывали одновременно одинаковую бумажку? Класс!!! Спасибо за идею!!! :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2005, 19:02 |
|
||
|
Новичек + VFP + SQL Server2000
|
|||
|---|---|---|---|
|
#18+
Кстати, зря Вы мою идею не рассмотрели - на Западе так многие конторы работают... А если клиент "ушел на ланч" - то есть администратор, который выкинет данного клиента из платежки и тот уже не сможет потом ее опубликовать - так как в поле кто взял - будет пусто... But anyway, Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2005, 21:26 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32943725&tid=1594685]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 418ms |

| 0 / 0 |
