|
|
|
Воросы о курсоре (Select-SQL) для Grid + Page Frame
|
|||
|---|---|---|---|
|
#18+
Выбираю клиента в родительской файле client, чтобы поработать с его заказами в дочернем файле zakaz. Файл zakaz -большой и записей в нем -много. Но по каждому отдельному клиенту около 10. Итак, вызываю: Код: plaintext На этой форме размещается Grid с колонками: 1. idZakaz (AutoInc) 2. dDate, 3. lMade(признак исполнения) - минимум информации. и многостраничный PageFrame с информацией по текущему заказу и сведениями о клиенте. Раньше для выборки я пользовался SET FILTER TO zakaz.nClient=client.idClient, но файл располнел и Set Filter стал ленивым. Приходится от его услуг отказаться в пользу SELECT-sql. В Init через выбираю нужный минимум информации и забрасываю его в Grid: Код: plaintext 1. 2. 3. 4. 5. 6. PageFrame строю на основе записи из файла zakaz, для чего делаю: Код: plaintext ВОПРОС 1. Стоит ли делать такое распределение обязанностей между курсором и таблицей? Или лучше всю информацию выбирать в CURSOR clientzakaz? А потом, по мере каких-то изменений в нем, скидывать это все в таблицу zakaz? ВОПРОС 2. Пока я играю с курсором clientzakaz, в таблице zakaz могут происходить изменения по сети. Как мне их отследить? Должен ли я при каждом BeforeRowColChange перечитывать курсор: Код: plaintext 1. Или курсор сам обновляется, а изменения станут мне видны в Grid, когда я "шагну" на измененную запись? ВОПРОС 3. Имеет ли смысл устанавливать на CURSOR clientzakaz режим буферизации или его проще в случае отказа перечитать заново? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2005, 04:50 |
|
||
|
Воросы о курсоре (Select-SQL) для Grid + Page Frame
|
|||
|---|---|---|---|
|
#18+
men dea...На этой форме размещается Grid с колонками: 1. idZakaz (AutoInc) 2. dDate, 3. lMade(признак исполнения) - минимум информации. и многостраничный PageFrame с информацией по текущему заказу и сведениями о клиенте. Вот idZakaz (AutoInc) показывать ненадо. Нужно сделать дополнительное поле например nZakaz - номер заказа и его показывать. Т.к. возможен случай, что в следующем году номер заказа начнется с 1. Возможно дублирование номера. Это надо разрешить. men dea...В Init через выбираю нужный минимум информации и забрасываю его в Grid: Код: plaintext 1. 2. 3. 4. 5. 6. Лучше оформлять через параметризованное представление команда CREATE SQL VIEW... WHERE zakaz.nClient=?idClient ... (прочитай обязательно про эту команду). Поля оформить обновляемыми. И здесь выбрать все поля относящиеся к заказам. men dea...PageFrame строю на основе записи из файла zakaz, для чего делаю: Код: plaintext men dea...ВОПРОС 1. Стоит ли делать такое распределение обязанностей между курсором и таблицей? Или лучше всю информацию выбирать в CURSOR clientzakaz? А потом, по мере каких-то изменений в нем, скидывать это все в таблицу zakaz?Посмотреть про буфферизацию. ВладимирМ в статьях и в форуме очень много рассказывал. men dea...ВОПРОС 2. Пока я играю с курсором clientzakaz, в таблице zakaz могут происходить изменения по сети. Как мне их отследить?Как раз строить идеологию на представлениях и пользоваться функциями REQUERY(), TABLEUPDATE(). men dea...Должен ли я при каждом BeforeRowColChange перечитывать курсор: Код: plaintext 1. Или курсор сам обновляется, а изменения станут мне видны в Grid, когда я "шагну" на измененную запись?Само ничего не бывает. Но тут нужно задать вопрос:"У тебя несколько пользователей могут одновременно редактировать один и тот же заказ???" men dea...ВОПРОС 3. Имеет ли смысл устанавливать на CURSOR clientzakaz режим буферизации или его проще в случае отказа перечитать заново?На представлении режим буферизации надо устанавливать. Насколько помнится по Default - 3 режим буфферизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2005, 07:47 |
|
||
|
Воросы о курсоре (Select-SQL) для Grid + Page Frame
|
|||
|---|---|---|---|
|
#18+
Hi men dea! > Стоит ли делать такое распределение обязанностей между курсором и > таблицей? Нет не стоит. > Или лучше всю информацию выбирать в CURSOR clientzakaz? Лучше сделать 2 представления - одно на клиента (там будет одна запись, но это несущественно), второе на строки заказа относящиеся к данному клиенту. Одно представление "соединяющее" оба эти тоже можно делать - но только в том случае если полей немного, и таблица клиентов НЕ ИЗМЕНЯЕТСЯ из этой формы - т.е. хорошее правило - одно представление - одна обновляемая из него таблица. Исключения конечно есть, но не для связи типа 1-ко-многим. > А потом, по мере каких-то изменений в нем, скидывать это все в таблицу > zakaz? скидывать надо по команде пользователя - когда он решит, что то что он наводил пора сохранять. При закрытии формы, переходе на другого клиента и т.п. также стоит посмотреть есть ли изменения, и если есть - то спросить что с ними делать - сохранять или нет. > Пока я играю с курсором clientzakaz, в таблице zakaz могут происходить > изменения по сети. Как мне их отследить? Никак. Да и это ненужно. При сохранении надо отслеживать подобные конфликты - т.е. "пока я вбивал кто-то уже чего-то поменял - что теперь делать - перезаписать моими данными, или оставить о что другие сделали". Предотвращать такие ситуации конечно теоретически можно, но практически в этом смысла никакого нет - т.е. открыл "дядя Вася" клиента А, а сам пошёл на обед - теперь все сидят и нервно ждут - когда же он вернётся и "отпустит" данные... Автообновление (на основе таймера) тоже не советую - разве что в режиме ReadOnly, и обязательно чтоб пользователь ЗНГАЛ о таком обновлении и мог его отключить - нет ничего хуже, когда пользователь смотрит какие-то записи, считает там чего-то у себя в уме/на бумажка/на калькуляторе, а в это самое время на экране происходит нехорошее "шевеление" - только что стояла циферка 10, а через секунду уже стоит 20! > Должен ли я при каждом BeforeRowColChange перечитывать курсор: Нет, лучше так не делать по причинам указанным выше. Вот если ты делаешь перемещение в "главном" курсоре (т.е. в списке клиентов идёшь на другого клиента - хотя по ходу ты такой фишки в этой форме не делаешь, оставляя навигацию в другой форме - вызывающей эту) - тогда надо перезапросить курсоры (для View это банальное Requery("MyAlias")) > Или курсор сам обновляется, а изменения станут мне видны в Grid, когда я > "шагну" на измененную запись? Нет, ни с view, ни с "просто запросом" этого не произойдёт. > Имеет ли смысл устанавливать на CURSOR clientzakaz режим буферизации Да, если вносятся изменения - то только таким образом можно отследить что же именно было изменено. Впрочем при работе с Local View просто нет никакой возможности отказаться от буферизации :) При этом для простоты лучше использовать 5-й режим - как полностью управляемый тобой - без дурных "авто-сохранений"... > или его проще в случае отказа перечитать заново? Не понял. В случае если изменения сохранять не нужно, следует дать TableRevert(). А уж нужно после этого получить "свежие" данные, или можно оставить то что и было (после отката мы получаем "исходное" состояние - как было на момент начала редактирования - или точнее на момент последнего перезапроса). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 03:22 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=285&tid=1592797]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 370ms |

| 0 / 0 |
