powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Grid???
13 сообщений из 13, страница 1 из 1
Grid???
    #32242866
bdv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP6 SP5.

Есть 3 таблицы
sertif (kod, name) - сертификаты
tovar (kod, name) - карточки товара
ser_tov (kod_ser, kod_tov) - таблица для связи сертификатов и карточек (один-ко-многим)
ser_tov открывается дважды (again) с алиасами:
ser_tovS (для привязки сертификатов к карточкам, акт. индекс kod_ser)
ser_tovT (для привязки карточек к сертификатам, акт. индекс kod_tov)

На форме 2 Grid'а
В 1-м случае отображаем все сертификаты в Grid1 и привязанные к ним карточки в Grid2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
***
Очистка связи
Установление нужных индексов
***
Sele ser_tovS
Set Rela To kod_tov Into tovar
Sele sertif
Set Orde To name
Set Rela To kod Into ser_tovS
Grid1.RecordSource = 'sertif'
Grid1.Column1.ControlSource = 'sertif.name'
Grid2.RecordSource = 'ser_tovS'
Grid2.Column1.ControlSource = 'tovar.name'

Во 2-м случае отображаем все карточки в Grid2 и привязанные к ним сертификаты в Grid1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
***
Очистка связи
Установление нужных индексов
***
Sele ser_tovT
Set Rela To kod_ser Into sertif
Sele tovar
Set Orde To name
Set Rela To kod Into ser_tovT
Grid1.RecordSource = 'ser_tovT'
Grid1.Column1.ControlSource = 'sertif.name'
Grid2.RecordSource = 'tovar'
Grid2.Column1.ControlSource = 'tovar.name'

Подмена Grid'ов происходит по кнопке RadioButton.

Проблема состоит в том, что при первой-же замене источника данных в Grid'е не отображаются записи, в которых 1-й символ поля name "-" или "!" (в главной таблице: в 1-м случае - сертификаты, во 2-м - карточки).

С индексами все в порядке (Browse отображает все правильно - проверял в Debugger'е), а вот в Grid'е данные не все. Переход с записи с "-" или "!" происходит при подмене RecordSource (в 1-м случае: Grid1.RecordSource = 'sertif', во 2-м: Grid2.RecordSource = 'tovar'), переход идет на запись, следующую за последней записью с символом "-" или "!".

Если кто сталкивался с чем-то подобным поделитесь опытом.
Бьюсь уже второй день, не могу решить.
...
Рейтинг: 0 / 0
Grid???
    #32242910
Равиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню кто именно, но на Фоксфоруме советовали делать переназначения через ControlSource=NULL.
Я бы еще попробовал в ControlSource фразу: " "+sertif.name
...
Рейтинг: 0 / 0
Grid???
    #32242976
АлександрК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте примерно так:

***
* Для первого случая. Если прокатит, то аналогично и для второго
***
Grid1.RecordSource = ""
Grid2.RecordSource = ""

Sele ser_tovS
Set Rela To kod_tov Into tovar
GO TOP
Sele sertif
Set Orde To name
Set Rela To kod Into ser_tovS
SET SKIP TO Tovar
GO TOP

Grid1.RecordSource = 'sertif'
Grid1.Column1.ControlSource = 'sertif.name'
Grid2.RecordSource = 'ser_tovS'
Grid2.Column1.ControlSource = 'tovar.name'

Grid1.Refresh()
Grid2.Refresh()
...
Рейтинг: 0 / 0
Grid???
    #32243034
bdv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Равиль
Можно уточнить?
Точно ControlSource?
Может RecordSource?
Если RecordSource, то уже пытался, не помогло.

2АлександрК
Попробовал, не помогает.
Все равно при изменении RecordSource происходит скачок на запись, следующую за "-" или "!".
...
Рейтинг: 0 / 0
Grid???
    #32243171
Равиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С RecordSource у тебя порядок, т.к. нужные области назначаются гриду.
С ControlSource похоже надо изощряться, типа:
ControlSource = "EVAL(Sertif.Name)"
или через какую-нибудь свою функцию, типа:
ControlSource = "MyFunc()"

***
Func MyFunc
Retu Sertif.Name

извините, все что могу :)
...
Рейтинг: 0 / 0
Grid???
    #32243241
АлександрК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 bdv9
Может SET COLLATE как-то влияет?
...
Рейтинг: 0 / 0
Grid???
    #32243273
bdv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлександрК
Set("Collate") = "MACHINE"
Таблицы созданы и проиндексированы в среде VFP при Set("Collate")="MACHINE".
...
Рейтинг: 0 / 0
Grid???
    #32243281
Aijik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При создании реляций активны ли теги?
В таблице tovar тэг kod_tov?
В таблице ser_tovS тэг kod ?
В таблице sertif тэг kod_ser?
В таблице ser_tovT тэг kod?

По листингам этого не видно
...
Рейтинг: 0 / 0
Grid???
    #32243291
bdv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Aijik
При создании реляций активны ли теги?
В таблице tovar тэг kod_tov?
В таблице ser_tovS тэг kod ?
В таблице sertif тэг kod_ser?
В таблице ser_tovT тэг kod?
По листингам этого не видно

Да, теги активны.
...
Рейтинг: 0 / 0
Grid???
    #32243302
Aijik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще есть такой стандартный финт:
GO RECNO() в родительских таблицах... ну и Grid.Refresh() уже говорили
...
Рейтинг: 0 / 0
Grid???
    #32243444
bdv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что это? Глюк? Или ошибка в логике приложения.

Попробуйте.
1. На диске C:\ должен быть каталог temp.
2. Создать форму.
3. На форму поместить 2 Grid'а (Grid1, Grid2) и кнопку (Command1).
4. Методы (всего 3 Load, Init, Click):
Код: 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.
30.
31.
32.
33.
34.
35.
36.
*** Метод Load формы
public gNum
gNum =  0 
set safety off
close table all
** Создание таблиц
create table c:\temp\ser (kod C( 1 ), name C( 2 ))
insert into ser (kod, name) valu ('1', '-s')
insert into ser (kod, name) valu ('2', 's')
create table c:\temp\tov (kod C( 1 ), name C( 2 ))
insert into tov (kod, name) valu ('1', '-t')
insert into tov (kod, name) valu ('2', 't')
create table c:\temp\ser_tov (kod_ser C( 1 ), kod_tov C( 1 ))
insert into ser_tov (kod_ser, kod_tov) valu ('1', '1')
insert into ser_tov (kod_ser, kod_tov) valu ('2', '2')
** Создание индексов
sele ser
inde on kod tag kod of c:\temp\ser.cdx
inde on name tag name of c:\temp\ser.cdx
sele tov
inde on kod tag kod of c:\temp\tov.cdx
inde on name tag name of c:\temp\tov.cdx
sele ser_tov
inde on kod_ser tag kod_ser of c:\temp\ser_tov.cdx
inde on kod_tov tag kod_tov of c:\temp\ser_tov.cdx
use
use in  0  c:\temp\ser_tov alias ser_tovS
sele ser_tovS
set orde to kod_ser
use in  0  c:\temp\ser_tov alias ser_tovT again
sele ser_tovT
set orde to kod_tov
sele ser
set rela to kod into ser_tovS
sele tov
set rela to kod into ser_tovT

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
*** Метод Init формы
sele ser_tovS
set rela to
sele ser_tovT
set rela to
with thisform
	if mod(gNum,  2 ) =  0 
		sele ser
		set orde to name
		sele tov
		set orde to kod
		sele ser_tovS
		set rela to kod_tov into tov
	else
		sele ser
		set orde to kod
		sele tov
		set orde to name
		sele ser_tovT
		set rela to kod_ser into ser
	endif
	with .grid1
		sele (iif(mod(gNum,  2 ) =  0 , 'ser', 'ser_tovT'))
		.recordsource = iif(mod(gNum,  2 ) =  0 , 'ser', 'ser_tovT')
		.columncount =  1 
		.columns( 1 ).controlsource = 'ser.name'
	endwith
	with .grid2
		sele (iif(mod(gNum,  2 ) =  0 , 'ser_tovS', 'tov'))
		.recordsource = iif(mod(gNum,  2 ) =  0 , 'ser_tovS', 'tov')
		.columncount =  1 
		.columns( 1 ).controlsource = 'tov.name'
	endwith
	if mod(gNum,  2 ) =  0 
		.grid1.setfocus
	else
		.grid2.setfocus
	endif

	gNum = gNum +  1 
endwith

Код: plaintext
1.
2.
*** Метод Click в кнопке
thisform.init()


У меня при клике на кнопку исчезают записи с "-" из Grid'а.
...
Рейтинг: 0 / 0
Grid???
    #32243672
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на глюк. В качестве решения могу предложить только не менять главный и подчиненный Grid. В этом случае глюк не наблюдается. Т.е. если взять твой код метода Init, то он будет выглядеть так:

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
*** Метод Init формы
sele ser_tovS
set rela to
sele ser_tovT
set rela to
with thisform
	.grid1.recordsource=''
	.grid1.columncount= 1 
	.grid2.recordsource=''
	.grid2.columncount= 1 
	if mod(gNum,  2 ) =  0 
		sele ser
		set orde to name
		sele tov
		set orde to kod
		sele ser_tovS
		set rela to kod_tov into tov
		.grid1.recordsource='ser'
		.grid1.columns( 1 ).controlsource = 'ser.name'
		.grid2.recordsource='ser_tovS'
		.grid2.columns( 1 ).controlsource = 'tov.name'
	else
		sele ser
		set orde to kod
		sele tov
		set orde to name
		sele ser_tovT
		set rela to kod_ser into ser
		.grid1.recordsource='tov'
		.grid1.columns( 1 ).controlsource = 'tov.name'
		.grid2.recordsource='ser_tovT'
		.grid2.columns( 1 ).controlsource = 'ser.name'
	endif

	.grid1.setfocus
	gNum = gNum +  1 
endwith


Ну, и если необходимо, то меняй их местами (координаты Left гридов). Вообще-то, я не вижу смысла дважды открывать Ser_Tov. В данном случае можно использовать и один алиас.
...
Рейтинг: 0 / 0
Grid???
    #32243727
bdv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Максимов
Спасибо! Все получилось!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Grid???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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