Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Fox Pro 2.6 / 21 сообщений из 21, страница 1 из 1
02.02.2006, 23:43
    #33520530
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Пожалуйста помогите решить следующую проблему.
У меня имеется программа, которая выводит
на экран таблицу, в которой пользователь может
корректировать записи из двух таблиц.
С помощью 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
=======================================================================
...
Рейтинг: 0 / 0
03.02.2006, 10:00
    #33520960
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Во-первых - никогда не давать пользователю корректировать и вообще работать напрямую с таблицами!
Создавай для этого специальную процедуру, где используя команды 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.
SELECT  0 
use sys( 2003 )+"\"+"dogovor.dbf" ALIAS dog
set order to kod

SELECT  0 
use predp
set order to kod

SELECT dog
set relation to kod into predp
set skip to predp
goto top

SCATTER MEMVAR && считываем в переменные памяти все или выбранные поля

&& здесь процедура обработки, оформление и т.д.
@ 10 , 10  SAY'поле1' GET m.pole1
...
@ 20 , 10  SAY'поле10' GET m.pole10
READ

&&  в GET с помощью опции VALID proverka() можно делать контроль 
&&  вводимых-редактируемых данных - через отдельную процедуру proverka, 
&&  в BROWSE это добавление к полю :v=proverka(), но там чуть больше проблем
&&  с нормальной реализацией этой проверки.

&& записываем в записи нужных таблиц, подставляя их алиасы с помощью команды SELECT:

GATHER FROM MEMVAR
Т.е. пара команд SCATTER-GATHER - всегда лучший (и простейший) вариант.
Обязательно в конце всех произведенных пользователем операций по редактированию и "изменению" записей, нужно сначала спросить что-то типа: "А вы уверены, что все правильно?", "Вы действительно хотите удалить (вставить)?"
Меньше будет потом проблем с нечаянным удалением-порчей данных.
BROWSE и прямую работу с данными имеет смысл использовать только для работы с "промежуточной" таблицей - откуда потом копировать данные в основную, или же если повреждение данных не играет большой роли, а надо все сделать, чтобы работало "еще вчера" :)
А вообще BROWSE - очень неудобная по функциональности и тяжелая вещь. Советую сделать свою замену для нее - написать программку с использованием SAY, GET, READ в цикле DO WHILE, и потом пользоваться ей.
Я пробовал делал проги и на BROWSE и на POPUP-ах - чтобы с максимально удобным интерфейсом. И пришел к выводу, что использование SAY, GET, READ - дает самую лучшую функиональность, быстродействие и минимум проблем при работе с некоторыми современными видеокартами (BROWSE частенько подвешивает машину при ALT+TAB).
...
Рейтинг: 0 / 0
03.02.2006, 10:27
    #33521056
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
CrispyОбязательно в конце всех произведенных пользователем операций по редактированию и "изменению" записей, нужно сначала спросить что-то типа: "А вы уверены, что все правильно?", "Вы действительно хотите удалить (вставить)?"
Меньше будет потом проблем с нечаянным удалением-порчей данных.Лучше не заставлять пользователя продираться через частокол подобных вопросов.

Я лично задаю такие только если:
1. Возможен случайный выбор действия (например, запуск отчета из меню), который приведет к необратимым изменениям данных либо к запуску на выполнение чего-то тяжелого, причем на экране не возникает иного предваряющего действие диалогового окна, в котором есть кнопка отмены последующих действий (например, окна с заданием параметров отчета).
2. Программа проанализировала предыдущие действия пользователя и/или текущее состояние данных, нашла в них что-то подозрительное или неправильное и должна проинформировать пользователя об этом.

В диалоговых окнах, в том числе и окнах редактирования данных, у меня всегда есть кнопки ОК (или Сохранить) и Отмена. После нажатия на кнопку ОК (или Сохранить) никаких дополнительных вопросов не задается. (Конечно, есть и исключения, но и они сводятся к двум описанным выше "если", и они очень редки.)

Если пользователь будет видеть сообщение всякий раз при выполнении одного и того же действия, то вместо предостережения получим обратный эффект: научим пользователя лишний раз жать на Enter, жать быстро, не читая текста самого сообщения. И тогда пользователь даже не заметит, что в тот раз, после которого все стало плохо, сообщение-то было другое, типа "фатальная ошибка!", а не "повторить?"
...
Рейтинг: 0 / 0
03.02.2006, 10:50
    #33521161
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Уточнение правильное, конечно. Но я как раз это и имел в виду (в данном конкретном случае) - ведь если пользователь в результате нечаянных нажатий поудаляет сколько-то записей и вспомнит о них только через какое-то время, после неоднократной перепаковки таблиц, то могут возникать лишние проблемы.
А вообще контролировать каждый незначительный шаг - само собой не имеет смысла.
...
Рейтинг: 0 / 0
03.02.2006, 21:34
    #33523191
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Спасибо за предложения, но
ведь по сущесиву никто и не ответил на
мой вопрос - как редактировать новые записи
через табличную форму, создаваемую browse.
Напрямую ли я работаю с базой или нет - это
уж мои проблемы. В том-то и дело, что от
say и get я отказался. Интересует именно ТАБЛИЧНОЕ
представление данных.
...
Рейтинг: 0 / 0
03.02.2006, 21:56
    #33523204
Проходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Хотите по существу? Ну что ж, можно и по существу. Но только предварительно ответье на несколько вопросов:

При нажатии на Ctrl+N в какую таблицу добавляется запись? В dogovor? Или в predpr? Или в обе? А надо в обе или в какую-то одну? Почему? Как фокс должен различить указанные выше варианты, по каким признакам? Какие значения и куда должны быть занесены в predpr при добавлении записи в dogovor? Вводимое в поле b.name значение должно измениться у всех записей с таким же значением поля kod или нет? Если нет, то как это, по вашему мнению, может быть осуществимо? Особенно если учесть предположительную уникальность значения поля kod в prepr? Или в ней есть несколько записей с одинаковым значением поля kod и разными значениями поля name? И что в этом случае показывает browse?
...
Рейтинг: 0 / 0
04.02.2006, 11:33
    #33523468
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Напоминает монолог агента Смита из "Матрицы".
Все, что нужно - корректировать через browse две таблицы.
Общее поле у таблиц predp.dbf и dogovor.dbf - kod.
Из таблицы predp берется на редактирование только
поле naim, т.е. наименование предприятия. (Хотя
должно редактироваться и поле kod - общее для двух таблиц).
Из таблицы dogovor и так все редактируется.
При добавлении пользователем новой записи
не корректируется только наименование предприятия,
это все, что меня интересует (все остальные записи
редактируются). Say и get не нужны. Работа идет
напрямую с базой.
...
Рейтинг: 0 / 0
04.02.2006, 14:00
    #33523550
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
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.
SELECT  0 
USE dogovor.dbf ORDER kod

SELECT  0 
USE predp.dbf ORDER kod

SELECT dogovor
SET RELATION TO kod INTO predpr
* ВНИМАНИЕ!!! SET SKIP - НЕ НАСТРАИВАЕТСЯ

BROWSE NOWAIT

SELECT predpr
GO TOP
BROWSE

Можно подвесить оба BROWSE-окна через команду READ. Если бы речь шла о FoxPro 2.6 for Windows, то через экранную форму.

Через функцию в опции WHEN команды BROWSE можно фиксировать в каком Browse-окне работаем в настоящий момент и выполнять создание / удаление в соответствующей таблице

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
PRIVATE selectTab

BROWSE WHEN SelTab("dogovor")

FUNCTION SelTab
PARAMETERS TabName
selectTab = m.TabName
RETURN

Обработка нажатий клавишь делается через настройки ON KEY LABEL

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ON KEY LABEL CTRL+N DO AddRecord
ON KEY LABEL CTRL+T DO DelRecord

FUNCTION AddRecord
SELECT (m.selectTab)
APPEND BLANK
SHOW WINDOW (Заголовок BROWSE-окна) REFRESH
RETURN

FUNCTION DelRecord
SELECT (m.selectTab)
DELETE
* Для того, чтобы скрыть запись помеченную как удаленная
* т.е., чтобы подействовал фильтр SET DELETED ON необходимо
* передернуть указатель записи
SKIP
SKIP - 1 
SHOW WINDOW (Заголовок BROWSE-окна) REFRESH
RETURN

Для отмены привязки к комбинации клавишь дается та юе команда но без параметра

Код: plaintext
1.
2.
ON KEY LABEL CTRL+N 
ON KEY LABEL CTRL+T 

Также почитай HELP по командам PUSH KEY и POP KEY

Реакцию на изменение полей делается через опцию V:= соотвествующего поля. При этом, чтобы отследить факт изменения значения в опции W:= необходимо сохранить значение поля до изменения

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
PRIVATE OldValue

BROWSE ;
WHEN SelectTab("predpr") ;
FIELDS ;
predpr.kod :W=InKod() :V=OutKod()

FUNCTION InKod
OldValue = predpr.kod
RETURN

FUNCTION OutKod
IF m.OldValue <> predpr.kod
* Значение поля изменилось, выполняем нужные действия
ENDIF
RETURN

А вообще-то, поищи в магазинах книгу

Попов А.А.: "СУБД FoxPro 2.0"

Эта книга выдержала большое количество переизданий. Последнее издание касается сравнения версий FoxPro for DOS 2.6 и FoxPro for Windows 2.6.

Есть практически во всех магазинах.
...
Рейтинг: 0 / 0
04.02.2006, 20:55
    #33523885
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Есть у меня Попов.
Остальное обдумаю.
...
Рейтинг: 0 / 0
05.02.2006, 00:10
    #33524000
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Вообще, когда жмем Ctrl+N создаем
новый договор И новое предприятие,
ибо КАЖДЫЙ новый договор есть новое предприятие.
...
Рейтинг: 0 / 0
05.02.2006, 11:46
    #33524117
andrewkor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
AlexanderKRибо КАЖДЫЙ новый договор есть новое предприятие.
Тогда зачем две таблицы???
...
Рейтинг: 0 / 0
05.02.2006, 16:01
    #33524272
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
В таблице predp хранится информация о предприятиях,
наименования, адреса и т.д.
В таблице dogovor хранится техническая информация
о приборах учета предприятия.
...
Рейтинг: 0 / 0
05.02.2006, 18:00
    #33524366
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
AlexanderKR
andrewkor
AlexanderKRибо КАЖДЫЙ новый договор есть новое предприятие.
Тогда зачем две таблицы???
В таблице predp хранится информация о предприятиях,
наименования, адреса и т.д.
В таблице dogovor хранится техническая информация
о приборах учета предприятия.

Ты не понял вопроса.

Если у тебя, по твоим же собственным словам, для одного предприятия НЕ МОЖЕТ быть несколько договоров. То ЗАЧЕМ ты создаешь 2 таблицы? В чем ПРАКТИЧЕСКИЙ смысл такого разделения?

Нормализация? Ну, так она не цель, а всего-лишь средство.

В самых общих чертах, нормализованные данные - это такие данные, которые не содержат повторяющихся значений.

Но если у тебя с одним предприятием невозможно заключить несколько договоров, то и нет смысла делить данные на таблицу договоров и предприятий. И так данные не будут дублироваться.

Либо под терминами "предприятие" и "договор" ты понимаешь что-то свое.

Как правило, под этими терминами понимают примерно следующее:

"Предприятие" - это контрагент. Т.е. некое физическое или юридическое лицо. Причем количество его реквизитов очень велико и не исчерпывается простой записью в ОДНОЙ таблице.

Ну, например, кроме собственно адреса еще набор банковских реквизитов, список контактных лиц. Т.е. "предприятие" - это само по себе набор таблиц.

"Договор" - это документ, который состоит, как минимум, из 2 частей: шапка документа и строки документа. Т.е. тоже никак не может быть описан ОДНОЙ таблицей.

Шапка - это общая информация: номер, дата, с кем заключен и т.п.
Строки - это как раз "техническая информация о приборах учета".

Причем количество таблиц, для описания договора может еще возрасти, в зависимости от того, что вкладывается в этот термин в конкретной задаче.
...
Рейтинг: 0 / 0
05.02.2006, 18:05
    #33524368
andrewkor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
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.
use predp orde id
use dogovor orde id in  0 
set relation to id into dogovor
push key clear
on key label Ctrl+N do AddRecord
on key label Ctrl+T do DelRecord
browse fields;
	predp.name, predp.addr,;
	dogovor.number, dogovor.date, dogovor.content
pop key

proc AddRecord
* Простенько определяемся с новым кодом
go bottom
id=id+ 1 
insert into dogovor (id) value (m.id)
insert into predp (id) value (m.id)

proc DelRecord
select dogovor
delete
select predp
delete

Если же одной записи в predp может соответствовать несколько записей в dogovor, то тебе однозначно нужны два brows-а. Или вообще иной интерфейс.
...
Рейтинг: 0 / 0
05.02.2006, 18:08
    #33524371
andrewkor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Извиняюсь, что названия полей в предыдущем примере не такие, как у тебя...
...
Рейтинг: 0 / 0
06.02.2006, 18:53
    #33526853
AlexanderKR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Спасибо за пример, попробую.
А две таблицы достались в наследство от разработчика.
...
Рейтинг: 0 / 0
07.02.2006, 09:26
    #33527523
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
И все равно, когда-нибудь наступит момент, когда с предпиятием будет заключен второй договор.
Это с одной стороны.
А с другой - ввод предприятий и ввод договоров - это разные действия. Они, в общем случае, должны проводиться сотрудниками с разными функциональными полномочиями.
...
Рейтинг: 0 / 0
07.02.2006, 23:47
    #33530044
andrewkor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
2Urri: Я его сговаривал на объединение, абстрагируясь от контекста, коли уж автор аж заглавными буквами утверждает эквивалентность объектов. Если же вдаваться в суть задачи - я с тобой полностью согласен, скорее всего всё вообще должно быть не так, да и сам разработчик (от которого наследство), видимо, другое имел ввиду.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
25.11.2010, 19:07
    #36977784
BlackBeRRy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
Crispy,

Помоги решить 3 вопроса
1) изменить значение числового поля,записей выбраных по двойному критерию отбора.
2)определить количество записей выбраных по двойномц критерию с логическим оператором OR и вывести на экран количество и сообщение.
3)сортировка бд помистить группу записей выбраных по диапозону числового поля 4-х полей.
...
Рейтинг: 0 / 0
25.11.2010, 20:34
    #36977881
Fox Pro 2.6
BlackBeRRy,
Вы на дату сообщений смотрели?
...
Рейтинг: 0 / 0
28.11.2010, 18:36
    #36981991
BalckBeRRy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fox Pro 2.6
проходящий.,

смотрел
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Fox Pro 2.6 / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]