Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
02.02.2006, 23:43
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Пожалуйста помогите решить следующую проблему. У меня имеется программа, которая выводит на экран таблицу, в которой пользователь может корректировать записи из двух таблиц. С помощью Ctrl+T любая запись помечается на удаление, Ctrl+N дает новую запись, но в новой записи корректируются поля только одной таблицы, а, например, поле b.naim не корректируется вовсе. Как можно решить эту задачу? Код: set century on set date to german define window wb2 from 3,0 to 23,78 title " К О Р Р Е К Т И Р О В К А Д О Г О В О Р О В " sele d use sys(2003)+"\"+"dogovor.dbf" set order to kod select b use predp set order to kod select d set relation to kod into predp set skip to predp goto top select d goto top browse fields d.kod_r:h='Район', d.kod :h='Код',; b.naim :h='Наименование':45, d.kod_pr :h='№_дог.', d.data:h='Дата'; COLOR SCHEME 10; window wb2 return to master ======================================================================= ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.02.2006, 10:00
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Во-первых - никогда не давать пользователю корректировать и вообще работать напрямую с таблицами! Создавай для этого специальную процедуру, где используя команды SAY, GET и READ, а также какие-нибудь нажатия клавиш, для удаления-вставки пользователь будет что-то править, работая при этом не напрямую с данными, а с их "образами". Т.е. вначале считываешь допустим нужные поля в переменные памяти (или просто в переменные, не имет особого значения, просто с переменными памяти чуть удобнее работать), потом - записываешь их назад в таблицы. Во-вторых - желательно никогда не назначать конкретные алиасы - d, c a. Лучше всегда назначать свободный алиас командой SELECT 0 и открывать таблицу в нем, а потом обращаться к таблице по имени, или по заданному специально алиасу. Что-то вроде: Код: 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.
Обязательно в конце всех произведенных пользователем операций по редактированию и "изменению" записей, нужно сначала спросить что-то типа: "А вы уверены, что все правильно?", "Вы действительно хотите удалить (вставить)?" Меньше будет потом проблем с нечаянным удалением-порчей данных. BROWSE и прямую работу с данными имеет смысл использовать только для работы с "промежуточной" таблицей - откуда потом копировать данные в основную, или же если повреждение данных не играет большой роли, а надо все сделать, чтобы работало "еще вчера" :) А вообще BROWSE - очень неудобная по функциональности и тяжелая вещь. Советую сделать свою замену для нее - написать программку с использованием SAY, GET, READ в цикле DO WHILE, и потом пользоваться ей. Я пробовал делал проги и на BROWSE и на POPUP-ах - чтобы с максимально удобным интерфейсом. И пришел к выводу, что использование SAY, GET, READ - дает самую лучшую функиональность, быстродействие и минимум проблем при работе с некоторыми современными видеокартами (BROWSE частенько подвешивает машину при ALT+TAB). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.02.2006, 10:27
|
|||
---|---|---|---|
Fox Pro 2.6 |
|||
#18+
CrispyОбязательно в конце всех произведенных пользователем операций по редактированию и "изменению" записей, нужно сначала спросить что-то типа: "А вы уверены, что все правильно?", "Вы действительно хотите удалить (вставить)?" Меньше будет потом проблем с нечаянным удалением-порчей данных.Лучше не заставлять пользователя продираться через частокол подобных вопросов. Я лично задаю такие только если: 1. Возможен случайный выбор действия (например, запуск отчета из меню), который приведет к необратимым изменениям данных либо к запуску на выполнение чего-то тяжелого, причем на экране не возникает иного предваряющего действие диалогового окна, в котором есть кнопка отмены последующих действий (например, окна с заданием параметров отчета). 2. Программа проанализировала предыдущие действия пользователя и/или текущее состояние данных, нашла в них что-то подозрительное или неправильное и должна проинформировать пользователя об этом. В диалоговых окнах, в том числе и окнах редактирования данных, у меня всегда есть кнопки ОК (или Сохранить) и Отмена. После нажатия на кнопку ОК (или Сохранить) никаких дополнительных вопросов не задается. (Конечно, есть и исключения, но и они сводятся к двум описанным выше "если", и они очень редки.) Если пользователь будет видеть сообщение всякий раз при выполнении одного и того же действия, то вместо предостережения получим обратный эффект: научим пользователя лишний раз жать на Enter, жать быстро, не читая текста самого сообщения. И тогда пользователь даже не заметит, что в тот раз, после которого все стало плохо, сообщение-то было другое, типа "фатальная ошибка!", а не "повторить?" ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.02.2006, 10:50
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Уточнение правильное, конечно. Но я как раз это и имел в виду (в данном конкретном случае) - ведь если пользователь в результате нечаянных нажатий поудаляет сколько-то записей и вспомнит о них только через какое-то время, после неоднократной перепаковки таблиц, то могут возникать лишние проблемы. А вообще контролировать каждый незначительный шаг - само собой не имеет смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.02.2006, 21:34
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Спасибо за предложения, но ведь по сущесиву никто и не ответил на мой вопрос - как редактировать новые записи через табличную форму, создаваемую browse. Напрямую ли я работаю с базой или нет - это уж мои проблемы. В том-то и дело, что от say и get я отказался. Интересует именно ТАБЛИЧНОЕ представление данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.02.2006, 21:56
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Хотите по существу? Ну что ж, можно и по существу. Но только предварительно ответье на несколько вопросов: При нажатии на Ctrl+N в какую таблицу добавляется запись? В dogovor? Или в predpr? Или в обе? А надо в обе или в какую-то одну? Почему? Как фокс должен различить указанные выше варианты, по каким признакам? Какие значения и куда должны быть занесены в predpr при добавлении записи в dogovor? Вводимое в поле b.name значение должно измениться у всех записей с таким же значением поля kod или нет? Если нет, то как это, по вашему мнению, может быть осуществимо? Особенно если учесть предположительную уникальность значения поля kod в prepr? Или в ней есть несколько записей с одинаковым значением поля kod и разными значениями поля name? И что в этом случае показывает browse? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
04.02.2006, 11:33
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Напоминает монолог агента Смита из "Матрицы". Все, что нужно - корректировать через browse две таблицы. Общее поле у таблиц predp.dbf и dogovor.dbf - kod. Из таблицы predp берется на редактирование только поле naim, т.е. наименование предприятия. (Хотя должно редактироваться и поле kod - общее для двух таблиц). Из таблицы dogovor и так все редактируется. При добавлении пользователем новой записи не корректируется только наименование предприятия, это все, что меня интересует (все остальные записи редактируются). Say и get не нужны. Работа идет напрямую с базой. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
04.02.2006, 14:00
|
|||
---|---|---|---|
Fox Pro 2.6 |
|||
#18+
BROWSE - это НЕ табличная форма. Это некая "вещь в себе". "Черный ящик". С точки зрения управляемости - очень тяжелая штука, а если ты хочешь в ОДНОМ Browse-окне редактировать ДВЕ таблицы ОДНОВРЕМЕННО, то дело становиться практически неподъемным. Ты проигнорировал вопросы, которые задал проходящий . Очень зря. Попробуй хотя бы самому себе на них ответить. Он ведь спросил не про техническую сторону дела, а, так сказать, про постановку задачи. Ну например, с одним предприятием заключили несколько договоров. Жмем Ctrl+T. ЧТО удаляем? Само предприятие со всеми договорами или только один договор? Ответ типа "в зависимости от того, где стоим" - не пройдет, поскольку невозможно определить "где стоим". На первой или не первой подчиненной записи. Обратная ситуация, жмем Ctrl+N. ЧТО создаем? Новый договор или новое предприятие? Теперь понял в чем проблема? В таком Browse-окне просто невозможно определить с какой именно таблицей производить то или иное действие. Это еще не расматривая разных "глюков" такой множественной связи. Обычно делают не одно Browse-окно для двух таблиц, а два Browse-окна, каждое из которых отображает только ОДНУ таблицу. Две таблицы в одном Browse-окне допустимы, но только если модификация производится для одной из них. Логика примерно такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Можно подвесить оба BROWSE-окна через команду READ. Если бы речь шла о FoxPro 2.6 for Windows, то через экранную форму. Через функцию в опции WHEN команды BROWSE можно фиксировать в каком Browse-окне работаем в настоящий момент и выполнять создание / удаление в соответствующей таблице Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Обработка нажатий клавишь делается через настройки ON KEY LABEL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Для отмены привязки к комбинации клавишь дается та юе команда но без параметра Код: plaintext 1. 2.
Также почитай HELP по командам PUSH KEY и POP KEY Реакцию на изменение полей делается через опцию V:= соотвествующего поля. При этом, чтобы отследить факт изменения значения в опции W:= необходимо сохранить значение поля до изменения Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
А вообще-то, поищи в магазинах книгу Попов А.А.: "СУБД FoxPro 2.0" Эта книга выдержала большое количество переизданий. Последнее издание касается сравнения версий FoxPro for DOS 2.6 и FoxPro for Windows 2.6. Есть практически во всех магазинах. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
04.02.2006, 20:55
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Есть у меня Попов. Остальное обдумаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.02.2006, 00:10
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Вообще, когда жмем Ctrl+N создаем новый договор И новое предприятие, ибо КАЖДЫЙ новый договор есть новое предприятие. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.02.2006, 11:46
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
AlexanderKRибо КАЖДЫЙ новый договор есть новое предприятие. Тогда зачем две таблицы??? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.02.2006, 16:01
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
В таблице predp хранится информация о предприятиях, наименования, адреса и т.д. В таблице dogovor хранится техническая информация о приборах учета предприятия. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.02.2006, 18:00
|
|||
---|---|---|---|
Fox Pro 2.6 |
|||
#18+
AlexanderKR andrewkor AlexanderKRибо КАЖДЫЙ новый договор есть новое предприятие. Тогда зачем две таблицы??? В таблице predp хранится информация о предприятиях, наименования, адреса и т.д. В таблице dogovor хранится техническая информация о приборах учета предприятия. Ты не понял вопроса. Если у тебя, по твоим же собственным словам, для одного предприятия НЕ МОЖЕТ быть несколько договоров. То ЗАЧЕМ ты создаешь 2 таблицы? В чем ПРАКТИЧЕСКИЙ смысл такого разделения? Нормализация? Ну, так она не цель, а всего-лишь средство. В самых общих чертах, нормализованные данные - это такие данные, которые не содержат повторяющихся значений. Но если у тебя с одним предприятием невозможно заключить несколько договоров, то и нет смысла делить данные на таблицу договоров и предприятий. И так данные не будут дублироваться. Либо под терминами "предприятие" и "договор" ты понимаешь что-то свое. Как правило, под этими терминами понимают примерно следующее: "Предприятие" - это контрагент. Т.е. некое физическое или юридическое лицо. Причем количество его реквизитов очень велико и не исчерпывается простой записью в ОДНОЙ таблице. Ну, например, кроме собственно адреса еще набор банковских реквизитов, список контактных лиц. Т.е. "предприятие" - это само по себе набор таблиц. "Договор" - это документ, который состоит, как минимум, из 2 частей: шапка документа и строки документа. Т.е. тоже никак не может быть описан ОДНОЙ таблицей. Шапка - это общая информация: номер, дата, с кем заключен и т.п. Строки - это как раз "техническая информация о приборах учета". Причем количество таблиц, для описания договора может еще возрасти, в зависимости от того, что вкладывается в этот термин в конкретной задаче. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.02.2006, 18:05
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
AlexanderKRибо КАЖДЫЙ новый договор есть новое предприятие. Судя по этой фразе у тебя взаимоднозначное соответствие между таблицами предприятий и договоров. Т.е. одной записи в predp соответствует одна запись в dogovor и наоборот. А это значит, что речь идет об одной сущности, а, значит, и инфа по такому объекту должна храниться в одной таблице. Это логично, проще в поддержке и намного проще в реализации интерфейса. Если всё-таки нужны две таблицы, то что-нибудь типа такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Если же одной записи в predp может соответствовать несколько записей в dogovor, то тебе однозначно нужны два brows-а. Или вообще иной интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.02.2006, 18:08
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Извиняюсь, что названия полей в предыдущем примере не такие, как у тебя... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.02.2006, 18:53
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Спасибо за пример, попробую. А две таблицы достались в наследство от разработчика. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2006, 09:26
|
|||
---|---|---|---|
Fox Pro 2.6 |
|||
#18+
И все равно, когда-нибудь наступит момент, когда с предпиятием будет заключен второй договор. Это с одной стороны. А с другой - ввод предприятий и ввод договоров - это разные действия. Они, в общем случае, должны проводиться сотрудниками с разными функциональными полномочиями. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2006, 23:47
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
2Urri: Я его сговаривал на объединение, абстрагируясь от контекста, коли уж автор аж заглавными буквами утверждает эквивалентность объектов. Если же вдаваться в суть задачи - я с тобой полностью согласен, скорее всего всё вообще должно быть не так, да и сам разработчик (от которого наследство), видимо, другое имел ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.11.2010, 19:07
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
Crispy, Помоги решить 3 вопроса 1) изменить значение числового поля,записей выбраных по двойному критерию отбора. 2)определить количество записей выбраных по двойномц критерию с логическим оператором OR и вывести на экран количество и сообщение. 3)сортировка бд помистить группу записей выбраных по диапозону числового поля 4-х полей. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.11.2010, 20:34
|
|||
---|---|---|---|
|
|||
Fox Pro 2.6 |
|||
#18+
BlackBeRRy, Вы на дату сообщений смотрели? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=41&mobile=1&tid=1584769]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 304ms |
total: | 470ms |
0 / 0 |