powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / грид
20 сообщений из 20, страница 1 из 1
грид
    #33585853
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГРИД
Код: plaintext
1.
2.
3.
4.
      -----------------------------
      |  Код    |   ФИО  | Зарплата | 
      |           |           |               | 
      |           |           |               |
       -----------------------------


Зарплата-целое число.
КОД,ФИО-Table1 {ReadOnly}
Зарплата-Table2
Как сделать, что если будет введена зарплата, то в Table2 сохраняются следующие данные: КОД,ФИО, и Зарплата.

Зарплату могут иметь не все работники.

С уважение chukcha
...
Рейтинг: 0 / 0
грид
    #33587599
О_В_Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че-то я не пойму. Указывается, что код и фио - таблица 1, а эти же данные должны сохранятся таблице 2. В чем же между ними разница?
Я еще понимаю, что в таб 1 держатся сведения о работнике, а в таб 2 только зарплата, таблицы свзяываются по полю код. Выборка отсюда будет элементарная.
...
Рейтинг: 0 / 0
грид
    #33587845
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вообще-то, таблицы должны быть нормализованы. Т.е. первая таблица - это карточка сотрудника (ФИО), а вторая таблица - это зарплата и ссылка на запись карточки сотрудника.

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

Это значит, что для ввода зарплаты уже должна быть создана заранее запись с пустой зарплатой, но со ссылкой на карточку сотрудника.

По сути, в такой постановке ты вынужден будешь забить кучу пустых записей для зарплаты, а по нажатию кнопки "Сохранить" сохранять только те из них, в которых введено значение.

Не знаю, как в реальности бухгалтерия начисляет зарплату, но как-то сомневаюсь, что именно такими списками. Впрочем, тебе виднее.
...
Рейтинг: 0 / 0
грид
    #33590316
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно попробовать сделать с помощью SCATTER.
Я попробовал и никак. (выдает синтаксическую ошибку на SCATTER)
Может, что-то не так пишу.

Запоминаю в переменных tab,fam, код и фамилию
SCATTER FIELDS код,фио
SCATTER FIELDS tab,fam MEMVAR

А потом в переменой zar Запоминаю зарплату
zar = thisform.grid1.column3.text1.value

Далее просто открываю таблицу и дабовляю запись с данными, из переменных
...
Рейтинг: 0 / 0
грид
    #33590506
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз. Grid отображает то, что реально есть в таблице источнике .

Как ты себе представляешь таблицу у которой, первая запись физически имеет 2 поля, а вторая запись - 3 поля? Невозможно такое!

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

Далее уже в кнопке "сохранить" анализируешь в каких строках было изменение и делаешь записи в реальную таблицу.

Т.е. хранение информации - один набор таблиц, а отображение - это другой набор таблиц (временных)

Какой смысл сохранять что-то в переменных памяти в такой идеологии я не вижу. Вполне достаточно наложить буферизацию на эту временную таблицу и далее GetNextModified()+GetFldState()
...
Рейтинг: 0 / 0
грид
    #33590520
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обьясните глупому

> Вполне достаточно наложить буферизацию на эту временную таблицу и далее GetNextModified()+GetFldState()
...
Рейтинг: 0 / 0
грид
    #33590605
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя есть 2 исходные таблицы: Карточка клиента и Зарплата.

Для отображения в Grid объединяешь эти 2 таблицы по LEFT JOIN чтобы получить временную таблицу с 4 столбцами:

1) Идентификатор записи карточки клиента
2) ФИО
3) Идентификатор записи Зарплаты
4) Зарплата

Лишние идентификаторы в Grid не отображаются.

На эту временную таблицу накладываешь оптимистическую буферизацию таблиц

CursorSetProp("Buffering",5,"MyCursor")

MyCursor - это алиас этой временной таблицы.

По окончании редактирования и нажатия кнопки сохранить ищешь записи, в которых была произведена модификация

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
LOCAL lnNextRecord, lcModified
select MyCursor
lnNextRecord = GetNextModified( 0 )
DO WHILE m.lnNextRecord<> 0 
	* Переходим на измененную запись
	GO (m.lnNextRecord)
	* Анализируем тип изменений
	lcModified = GetFldState(- 1 )
	*  1  - нет изменений в данном поле
	*  2  - запись существовала ранее, поле было изменено
	*  3  - новая запись, изменений нет в данном поле
	*  4  - новая запись, поле было изменено
	* Первый символ - это признак удаленной записи - Deleted()
	* Остальные символы в порядке физического следования полей

* В соответствии с типом изменения необходимо сделать модификацию
* в исходных таблицах

	* Определяем номер следующей измененной записи
	lnNextRecord = GetNextModified(m.lnNextRecord)
ENDDO

Ну, тут еще можно сравнить действительно ли было изменение значения или изменили 1 на ту же 1. Это можно проверить сравнив текущее значение и OldVal().

Новые значения - это значения полей текущей записи временной таблицы MyCursor.
...
Рейтинг: 0 / 0
грид
    #33590660
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую
...
Рейтинг: 0 / 0
грид
    #33597513
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
OPEN DATABASE testdata			{Открываем базу testdata}
CREATE SQL VIEW cust_orders_view AS ;	{Создаем SQL запрос по средствам просмотра}
SELECT * FROM testdata!customer ;		{Выборку делаем из табл.              customer}
LEFT OUTER JOIN testdata!orders ;		{Создается временная табл. orders}
ON customer.cust_id = orders.cust_id		{поле cust_id из талб. customer равно полю cust_id из табл. Orders}

Вот полазил в хелпе нашел вот это.
Это то, о чем вы говорили?
И правильно ли я понял этот код?
...
Рейтинг: 0 / 0
грид
    #33600280
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ответите кто-нибудь или нет?
...
Рейтинг: 0 / 0
грид
    #33600453
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Через Local View этого не решить. Здесь нужно будет все делать "в ручную".

Т.е. сам синтаксис запроса - да, подходит. Не подходит то, что это синтаксис создания Local View. Впрочем, если это Local View не делать обновляемым, то можно и его использовать. Просто процесс сохранения внесенных изменений невозможно будет решить через подобный обновляемый Local View.
...
Рейтинг: 0 / 0
грид
    #33600485
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне главное было уточничть сам синтаксис запроса. Спасибо.
...
Рейтинг: 0 / 0
грид
    #33600605
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВладимирМ

А через курсор адаптер он не может это зделать?
...
Рейтинг: 0 / 0
грид
    #33602929
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НедоходящийА через курсор адаптер он не может это зделать?
С уверенностью не скажу. Настолько глубоко CAD не ковырял.

Здесь проблема в следующем. При использовании LEFT JOIN часть данных подчиненной таблицы отсутствует. Это значит, что если будет модифицирована именно эта часть, то надо будет создавать новую запись в подчиненной таблице.

Я не уверен, что CAD поймет, что необходимо именно создание новой записи, а не модификация существующей записи со значением ключа NULL. Это надо экспериментировать...
...
Рейтинг: 0 / 0
грид
    #33610743
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi ВладимирМ!

Не поймёт конечно - надо будет в BeforeInsert/BeforeUpdate самому
формировать соответствующие команды - т.е. в Update реально может быть
использован Insert...
В общем обновлять через один курсор 2 таблицы - это большой геморрой - даже
если они связаны как 1-к-0-или-1, а уж если как 1-к-0-или-1-или-много - то
вообще ужас будет.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
грид
    #33625649
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите пожалуста не буду ли я впустую тратить время, если попробую связать две таблицы по полю "КОД", и при вводе зарплаты к примеру просматривать все записи таким образом:

While !EOF() do
и буду проверять состояние в Column (а именно чему оно равно. Если оно равно ' ', то пропускаю, а иначе записываю в таблицу)
...
Рейтинг: 0 / 0
грид
    #33626009
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chukchaСкажите пожалуста не буду ли я впустую тратить время, если попробую связать две таблицы по полю "КОД", и при вводе зарплаты к примеру просматривать все записи таким образом:

While !EOF() do
и буду проверять состояние в Column (а именно чему оно равно. Если оно равно ' ', то пропускаю, а иначе записываю в таблицу)
В пустую, время не будет потрачено в любом случае.

Здесь все зависит от того, что Вы вкладываете в понятие "КОД". Код чего? Если это код работника и в таблице зарплат есть внешний ключ со значением кода работника, то все правильно.

Еще не вполне ясно, что вкладывается в понятие "связать две таблицы". Если речь идет о SET RELATION, то это можно использовать, но если для одного рабтника может существовать несколько зарплат (аванс и собственно зарплата), то нужно дополнить эту связь установкой один-ко-многим (SET SKIP TO), а такие конструкции крайне капризно ведут себя в циклах перебора записей

Поэтому, лучше использовать не связь, а вложенные циклы. Кстати, цикл WHILE лучше заменить на SCAN...ENDSCAN. Получаем что-то вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT (Таблица_Зарплат)
SET ORDER TO  0  		&& ускоряет работу цикла
SELECT (Таблица_Работников)
SET ORDER TO  0  		&& ускоряет работу цикла
SCAN
	SELECT (Таблица_Зарплат)
	SCAN FOR (Таблица_Зарплат.КОД_Работника=Таблица_Работников.КОД_Работника)
		* Нужная обработка
	ENDSCAN
ENDSCAN

Собственно, вложенные циклы - это полная симуляция работы объединения таблиц по JOIN. Не внутренний механизм, а логика работы с точки зрения конечного результата.
...
Рейтинг: 0 / 0
грид
    #33626708
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня будет еще такой вопросик.

А что мне делать по поводу связей? Мне нужна связь многие ко многим как лучше в моем случае сделать?
...
Рейтинг: 0 / 0
грид
    #33626880
chukcha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если использовать промежуточную таблицу, т.е. от нее будут исходить в те две таблицы связи один ко многи . И будет такое условие, Если в промежуточной таблицы была уже такая фамилия то она перезаписывается на другую. И в это время она еще и записывается в таблицу ЗАРПЛАТА.
...
Рейтинг: 0 / 0
грид
    #33629657
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связь много-ко-многим обычно и реализуется через таблицу-посредник в которой хранятся коды записей связываемых талиц.

Только я бы добавил в эту таблицу-посредник еще и код записи. Т.е. тут обычно бывает сильное искушение не вводить код записи ведь запись в таблице-посреднике однозначно идентифицируется парой кодов связываемых таблиц. Не надо на это рассчитывать. Создавайте код записи для ВСЕХ таблиц без исключения.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / грид
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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