|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
Доброго дня всем! В Фосксе далеко я не первый день, а вот в SQL - недавно. Столкнулся с такой проблемой: Все таблицы хранятся на сервере sql. Интерфейс и большая часть обработки данных, естественно, в Фоксе. Для работы с данными при загрузки формы вытягиваю данные из представления в локальный курсор. При изменении, добавлении или удалении записи хочу обновлять только редактируемые записи, что вроде бы реализовал (выполняется после каждой модификации записи): [code] select fvsp0 SET DELETED OFF NextRecord = GETNEXTMODIFIED(0, "fvsp0") do while NextRecord <> 0 do case case deleted() and IsNull(oldVal("deleted()")) * Создали и тут же удалили. Без действий case IsNull(oldVal("deleted()")) * Создали новую запись. Необходимо создать новую запись на сервер =SQLExec(ch,"INSERT INTO fvsp (kvtp,kc,kd,osd,km,gs,kev,op,nrvsm)"+ ; "VALUES (?fvsp0.kvtp, ?fvsp0.kc,?fvsp0.kd,?fvsp0.osd,?fvsp0.km,?fvsp0.gs,?fvsp0.kev,?fvsp0.op,?fvsp0.nrvsm)") case deleted() * Запись была удалена. Удаляем на сервере =SQLExec(ch, "DELETE FROM fvsp WHERE kvtp=?OldVal([fvsp0.kvtp]) and kc=?OldVal([fvsp0.kc]) "+ ; "and kd=?OldVal([fvsp0.kd]) and osd=?OldVal([fvsp0.osd]) "+ ; "and km=?OldVal([fvsp0.km]) and gs=?OldVal([fvsp0.gs]) "+ ; "and kev=?OldVal([fvsp0.kev]) and op=?OldVal([fvsp0.op]) and nrvsm=?OldVal([fvsp0.nrvsm])") otherwise * Запись была модифицирована. Если необходимо, можно уточнить по GetFldState() что именно было изменено =SQLExec(ch, "UPDATE fvsp SET kvtp=?fvsp0.kvtp,kc=?fvsp0.kc,kd=?fvsp0.kd,osd=?fvsp0.osd,km=?fvsp0.km,gs=?fvsp0.gs,kev=?fvsp0.kev,op=?fvsp0.op,nrvsm=?fvsp0.nrvsm)" + ; " WHERE kvtp=?OldVal([fvsp0.kvtp]) and kc=?OldVal([fvsp0.kc]) "+ ; "and kd=?OldVal([fvsp0.kd]) and osd=?OldVal([fvsp0.osd]) "+ ; "and km=?OldVal([fvsp0.km]) and gs=?OldVal([fvsp0.gs]) "+ ; "and kev=?OldVal([fvsp0.kev]) and op=?OldVal([fvsp0.op]) and nrvsm=?OldVal([fvsp0.nrvsm])") endcase * Берем следующую измененную запись NextRecord = GETNEXTMODIFIED(NextRecord, "fvsp0") enddo SET DELETED ON [\code] Делаю таким образом, чтобы каждый раз не обновлять все записи курсора. Но в этом случае я до конца сессии не вижу изменений других пользователей. Вопрос в следующем: может есть какая-нить возможность обновления только тех записей, которые изменены в текущее время мной и другими пользователями, но при этом не обновлять всю базу, т.к. есть очень большие таблицы. Наверняка я не один с такой проблемой столкнулся. Реализовать нужно именно через sqlexec(). Курсорадаптеры не рассматриваю по программным причинам. Прошу прощения, если этот вопрос уже поднимался, но я ни одного толкового предложения не увидел в топиках... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:35 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
авторКурсорадаптеры не рассматриваю по программным причинам.. изв. за флуд, но не могу удержаться. убит наповал, валяюсь под столом, бьют конвульсии ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:36 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
счаз, кулинар прибежит - научит готовить, а так, предостерегу: не дай Боже, в отборе напишите где-то tt=isnull(tt,'') , либо апдейт без параметра наименования [O'Genry], либо пляски с преобразованием типов туда-обратно, затем пляски с рефрешем курсора и отменой, и привязыванием, отвязыванием источников ну и километры безумного кода нам, конечно не страшны, фокспро все стерпит, а разум - молчит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:42 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
ВладимирТК Делаю таким образом, чтобы каждый раз не обновлять все записи курсора. Но в этом случае я до конца сессии не вижу изменений других пользователей. Вопрос в следующем: может есть какая-нить возможность обновления только тех записей, которые изменены в текущее время мной и другими пользователями, но при этом не обновлять всю базу, т.к. есть очень большие таблицы. Наверняка я не один с такой проблемой столкнулся. Реализовать нужно именно через sqlexec(). Курсорадаптеры не рассматриваю по программным причинам. ... 1. На клиента не надо тянуть всю табличку с сервера, на клиенте нужно выбирать только необходимые записи - таких как правило не много. 2. Что должно дать знание "изменены в текущее время мной и другими пользователями"? 3. Если надо через SQLEXEC с анализом "тонкостй", то надо вызывать ХП в которую передавать изменённые записи, а в самой ХП разбирать изменились ли они или нет (для записи можно использовать доп. поле timestamp) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:47 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
прошелмимо ну и километры безумного кода нам, конечно не страшны, фокспро все стерпит, а разум - молчит. Так потому и спрашиваю, что километры кода писать не хочется. А КАД у меня не совсем совместимы с теми классами, которые я использую по наставлению начальства. И без них никак. А писать свои такие же, но с исправлением текущей проблемы нету особо времени ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:52 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
ВладимирТК, альтернатив немного. Или писать километры кода SQLEXEC, или переделывать под КАД. Что проще и быстрее - мне отсюда не видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 12:56 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
PaulWist 1. На клиента не надо тянуть всю табличку с сервера, на клиенте нужно выбирать только необходимые записи - таких как правило не много. 2. Что должно дать знание "изменены в текущее время мной и другими пользователями"? 3. Если надо через SQLEXEC с анализом "тонкостй", то надо вызывать ХП в которую передавать изменённые записи, а в самой ХП разбирать изменились ли они или нет (для записи можно использовать доп. поле timestamp) По 1 пункту: я так и делаю, но одновременно со мной вполне может работать с этими же записями другой пользователь. По 3-му: Если в ХП передавать изменнённые записи, то, к примеру, одна из записей, модифицируемых мной, уже может быть удалена на сервере... Что тогда? (но это единичный случай). А вообще основной вопрос в том, чтобы увидеть изменения других пользователей тех записей, с которыми я работаю в данный момент ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 13:04 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
авторкоторые я использую по наставлению начальства. если у Вас разработка ведется и производится пром.експлуатация, то целесообразно посчитать трудозатраты на разр-ку с применением различных подходов, если новый инструмент снизит трудозатраты, то целесообразно доказать руководству оптимальность использования другого подхода. а почему собственно, раз такой хорошей была разработка ранее с пом-ю своих классов, сейчас Вы не можете нормально сохранить изм-я, откатить изм-я, обновить данные и т.д.. Почему эти классы не так хороши, чтобы реализовать сейчас какие-то Ваши потребности? может они и не так хороши Ваши классы? и доработать это будет намного трудозатратнее и т.д.? может всеже посмотреть в сторону альтернативы? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 13:06 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
авторПо 1 пункту: я так и делаю, но одновременно со мной вполне может работать с этими же записями другой пользователь. По 3-му: Если в ХП передавать изменнённые записи, то, к примеру, одна из записей, модифицируемых мной, уже может быть удалена на сервере... Что тогда? (но это единичный случай). А вообще основной вопрос в том, чтобы увидеть изменения других пользователей тех записей, с которыми я работаю в данный момент таймстамп + логич.блокировки Вам в помощь, принципы реализации поиском на форуме мс скл. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 13:08 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
Что ж. Спасибо за внимание. Возможно я ещё не все альтернативы рассмотрел. А используемые мной классы, не совершенны, но лучше пока ничего нет. А использовать только стандартное очень накладно в плане времени. Причина неиспользования КАД - при выборке данных с сервера (с использованием вышеупомянутых классов), моя форма не отображается до тех пор, пока не сбросятся все запрашиваемые записи. А это по времени такой же интервал, как при использовании SQLEXEC(), т.е. пользователь не имеет возможности работать с данными, пока КАД не обновится полность, а так не должно быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 13:24 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
ВладимирТКЧто ж. Спасибо за внимание. Возможно я ещё не все альтернативы рассмотрел. А используемые мной классы, не совершенны, но лучше пока ничего нет. А использовать только стандартное очень накладно в плане времени. Причина неиспользования КАД - при выборке данных с сервера (с использованием вышеупомянутых классов), моя форма не отображается до тех пор, пока не сбросятся все запрашиваемые записи. А это по времени такой же интервал, как при использовании SQLEXEC(), т.е. пользователь не имеет возможности работать с данными, пока КАД не обновится полность, а так не должно быть.1. Не надо так много завпрашивать. 2. КАД необязательно сразу заполнять данными. Можно показать форму и только потом загрузить данные. При этом заодно можно и фильтр у юзера запросить, чтобы выполнить пункт 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 13:29 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
ВладимирТК Причина неиспользования КАД - при выборке данных с сервера (с использованием вышеупомянутых классов), моя форма не отображается до тех пор, пока не сбросятся все запрашиваемые записи. А это по времени такой же интервал, как при использовании SQLEXEC(), т.е. пользователь не имеет возможности работать с данными, пока КАД не обновится полность, а так не должно быть. кажися причина в Вас. почему нельзя получать на клиенте какие-то данные по условию? даже если это так, и Вы тяните какой-то огромный объем, то я Вас уверяю, скорость получения данных через КАД будет быстрее (незначительно). авторт.е. пользователь не имеет возможности работать с данными, пока КАД не обновится полность, а так не должно быть. пользователь должен работать с минимальным количеством записей, минимальным, нужно всеми силами ограничить объем скачиваемых на клиента данных. этого достигаем различными ухищрениями, в том числе и "мордой лица", предлагая тащить данные по условию какому-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 13:30 |
|
sqlexec(),VFP9,курсоры. Мультиобработка
|
|||
---|---|---|---|
#18+
ВладимирТКPaulWist 1. На клиента не надо тянуть всю табличку с сервера, на клиенте нужно выбирать только необходимые записи - таких как правило не много. 2. Что должно дать знание "изменены в текущее время мной и другими пользователями"? 3. Если надо через SQLEXEC с анализом "тонкостй", то надо вызывать ХП в которую передавать изменённые записи, а в самой ХП разбирать изменились ли они или нет (для записи можно использовать доп. поле timestamp) По 1 пункту: я так и делаю, но одновременно со мной вполне может работать с этими же записями другой пользователь. По 3-му: Если в ХП передавать изменнённые записи, то, к примеру, одна из записей, модифицируемых мной, уже может быть удалена на сервере... Что тогда? (но это единичный случай). А вообще основной вопрос в том, чтобы увидеть изменения других пользователей тех записей, с которыми я работаю в данный момент Вы так и не ответили - зачем видеть записи которые изменил другой юзер. Если записи нет (её срубил другой юзер), есть три стратегии принятия решения: 1. Кто первый сохранил - тот и прав 2. Кто последний сохранил - тот и прав 3. Кто последний сохраняет - тот принимает решение какую из первых двух стратегий выбрать. Собственно, Вы должны дать на этот вопрос ответ сами, что делать - добавлять ли запись или же соглашаться с её удалением. Но практика показывает, что какую бы мы стратегию не придумали, последний юзер добьется любыми путями сохранения "своих" данных, поэтому как правило используют стратегию №2. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2010, 14:53 |
|
|
start [/forum/topic.php?fid=41&msg=36474781&tid=1585588]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 324ms |
total: | 460ms |
0 / 0 |