powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Combo i Grid
25 сообщений из 34, страница 1 из 2
Combo i Grid
    #33808481
МашкоБ.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться, Фокс начал изучать недавно и возник вопрос.
На форме создал Grid в нем подключил таблицу tab1 . Далее на форме создал ComboBox и укал в нем одно из полей таблицы tab1. Как сделать чтобы выбрав что-то в ComboBoх в Grid оставались строки только с выбранным значением.
Спасибо.
kolobok-007@yandex.ru
...
Рейтинг: 0 / 0
Combo i Grid
    #33810566
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В InteractiveChange ComboBoxа используй SET FILTER TO по значению из поля таблицы.
...
Рейтинг: 0 / 0
Combo i Grid
    #33818396
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StasLВ InteractiveChange ComboBoxа используй SET FILTER TO по значению из поля таблицы.
А можно поподробнее насчет этого, а то я вроде по форуму полазил но так и не смог понять толком как именно задаётся условие фильтрации.
Я только начал изучать VFP.
...
Рейтинг: 0 / 0
Combo i Grid
    #33818509
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МашкоБ.В. StasLВ InteractiveChange ComboBoxа используй SET FILTER TO по значению из поля таблицы.
А можно поподробнее насчет этого, а то я вроде по форуму полазил но так и не смог понять толком как именно задаётся условие фильтрации.
Я только начал изучать VFP.
Можно.

Сам принцип этого я прочитал в какой-то из статей Владимира Максимова.
Все работает отлично.
В Loade Formы пишешь
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ThisForm.AddProperty("aCombo(1,1)") && Создание свойства-массива формы
SELECT DISTINCT t.Name, t.ID_Tab1
  FROM Tab1 t;
  INTO ARRAY ThisForm.aCombo && Источник для Combo
IF _TALLY =  0 
  ThisForm.aCombo[ 1 ,  1 ] = '\'
ENDIF

SELECT * FROM Tab1 t INTO DBF tab_tmp && Источник для Grida

В Initе Combo
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH This
  .RowSourceType =  5 
  .RowSource = "ThisForm.aCombo" && Цепляю свойство-массив к Combo
 (Можно сделать курсор и его прицепить, но почему-то с курсором Combo начинает тормозить)
  .ColumnCount =  2 
  .ColumnLines = .F.
  .ColumnWidths = LTRIM (STR (.Width -  46 )) + ", 0" && Устанавливаю ширину первой колонки и скрываю вторую
  .BoundColumn =  2 
  .ListIndex =  1 
ENDWITH
ThisForm.Filter_Data()
Создаю в Formе метод Filter_Data(). В нем
Код: plaintext
1.
2.
3.
ThisForm.LockScreen = .T.
SET FILTER TO tab_tmp.ID_Tab1 = VAL(ThisForm.Combo.Value)
GO TOP && Для того чтобы сработал фильтр
ThisForm.LockScreen = .F.
И наконец в InteractiveChange ComboBoxа
Код: plaintext
ThisForm.Filter_Data()
И все.
...
Рейтинг: 0 / 0
Combo i Grid
    #33819525
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StasL , большое спасибо.
Но я извеняюсь за свою тупость и непонятливость.
Условие немножко изменилось. Grid формируется через локальное представление
vie ,которое формируется из 2-ух таблиц Disp3 и Disp1. Combo тоже формируется по полю vie.nomer. Получается что select здесь нельзя использовать. Так ?
Не подскажите как тогда здесь решить проблему.
Извеняюсь за надоедливость.
...
Рейтинг: 0 / 0
Combo i Grid
    #33819688
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МашкоБ.В.
Grid формируется через локальное представление
vie ,которое формируется из 2-ух таблиц Disp3 и Disp1. Combo тоже формируется по полю vie.nomer. Получается что select здесь нельзя использовать. Так ?

Источником данных для Combo у тебя должен быть массив из 2 полей, в первом то что-ты хочешь отобразить в на экране в самом Combo, второе уникальное поле (обычно это ID), которое ты и будешь получать как значение (Value) Combo. А уже каким образом ты его получишь, из своего vie или из Tabl, это твое сугубо личное дело
.
Так же дело обстоит и с источником данных для грида, главное что бы в нем было поле для "связи" с Соmbo. В твоем случае это vie.nomer.
В строке
Код: plaintext
SET FILTER TO tab_tmp.ID_Tab1 = VAL(ThisForm.Combo.Value)
Ты устанавливаешь фильтр на отображение значений в Gride.
Да, небольшое уточнение. Перед командой SET FILTER TO перейди в область источника данных для Grida.
Код: plaintext
SELECT <имя области>
...
Рейтинг: 0 / 0
Combo i Grid
    #33820572
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi StasL!

> SELECT * FROM Tab1 t INTO DBF tab_tmp && Источник для Grida

Зачем выбирать ВСЕ данные в новую таблицу?

> SET FILTER TO tab_tmp.ID_Tab1 = VAL(ThisForm.Combo.Value)

Не будет работать. Внутри условия фильтра не катят ThisForm... Если
состряпать условие как строку - ещё куда ни шло, а напрямую к ThisForm... -
не пойдёт.

И вообще пора, давно пора уже отказаться от SET FILTER

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Combo i Grid
    #33820863
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi Igor Korolyov

Igor Korolyov
Hi StasL!

> SELECT * FROM Tab1 t INTO DBF tab_tmp && Источник для Grida

Зачем выбирать ВСЕ данные в новую таблицу?


Естественно ВСЕ данные собирать ненужно. * -- для примера. Я думаю МашкоБ
сам об этом догадался.


Igor Korolyov
> SET FILTER TO tab_tmp.ID_Tab1 = VAL(ThisForm.Combo.Value)

Не будет работать. Внутри условия фильтра не катят ThisForm... Если
состряпать условие как строку - ещё куда ни шло, а напрямую к ThisForm... -
не пойдёт.

Ну у меня же работает (VFP8). Я привел код рабочей программы.

Igor Korolyov
И вообще пора, давно пора уже отказаться от SET FILTER

Мне кажется что все зависит от конкретной задачи. У меня небольшой объем данных как в Grid так и в Сombo. И мне достаточно SET FILTER.
Поделитесь своим опытом, может ваш вариант больше подойдет автору.
...
Рейтинг: 0 / 0
Combo i Grid
    #33821393
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за помощь.
Но я полазив по форуму и кое чего почитав сделал так
В InteractiveChange ComboBoxа я прописал
PUBLIC lsNomer

SELECT vie
lsNomer=This.Value
SET FILTER TO vie.nomer=Alltrim(LOWER(lsNomer))
GO TOP

thisform.Grid2.Refresh()

вроде бы работает,но в combo остаётся только выбранная строка , а я хочу чтобы остался первоначальный список,а чтобы вернулся первоначальный список и все записи в Grid нужно удалить через Del строку в Combo. Приэтом возникает глюк с переходом по Grid: нажав на любую запись меня перекидывает в конец. Может кто знает как исправить.
...
Рейтинг: 0 / 0
Combo i Grid
    #33821510
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну давай разберемся во всем по-порядку.
Что является источником для Combo? Я подразумеваю что у тебя
Combo.RowSource = "твоя vie". SET FILTER действует на всю область vie, поэтому у тебя и остается только выбранная строка. Так?
...
Рейтинг: 0 / 0
Combo i Grid
    #33821544
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да не совсем в Combo.RowSource="vie.nomer" тоесть поле из vie
...
Рейтинг: 0 / 0
Combo i Grid
    #33821575
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МашкоБ.В.Спасибо всем за помощь.
Но я полазив по форуму и кое чего почитав сделал так
В InteractiveChange ComboBoxа я прописал
PUBLIC lsNomer

SELECT vie
lsNomer=This.Value
SET FILTER TO vie.nomer=Alltrim(LOWER(lsNomer))
GO TOP

Объявление PUBLIC переменных в Formaх не есть хорошо
, а тем более в InteractiveChange. Так как эта переменная видна всей твоей программе, а тебе она нужна только в InteractiveChange. Если уж ты так хочешь ее использовать объяви ее LOCAL.
Хотя я не могу понять зачем она вообще нужна. Ну ладно, у каждого свой стиль программирования.


МашкоБ.В.Да не совсем в Combo.RowSource="vie.nomer" тоесть поле из vie
SET FILTER действует на всю область vie , поэтому у тебя и остается только выбранная строка. А чем тебе не полходит массив?
...
Рейтинг: 0 / 0
Combo i Grid
    #33821979
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PUBLIC lsNomer
используется для того чтобы переменная была видна всей программе
т.к. на set filter to нельзя ставить локальную переменную ибо обработав её 1 раз он потом пишет что lsNomer not found

А массив не использую т.к. по своей тупости не понимаю полностью твой код
Объясни если не сложно

Например SELECT DISTINCT t.Name, t.ID_Tab1 зачем t.Name и t.ID_Tab1 это просто переменные и зачем передними t.?

FROM Tab1 t это то откуда мы берём данные ? в моем случае это
vie?

INTO ARRAY ThisForm.аCombo то куда мы записываем наш массив
? если у меня Combo.name="Combo1" то я так и должен записать INTO ARRAY ThisForm.Combo1

SELECT * FROM Tab1 t INTO DBF tab_tmp но если у меня Grid получает данные из vie то куда их тогда записывать?

Если ещё не сильно достал объясни!! ожалуйста!
...
Рейтинг: 0 / 0
Combo i Grid
    #33822218
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МашкоБ.В.
А массив не использую т.к. по своей тупости не понимаю полностью твой код
Объясни если не сложно
"Вы не любите кошек? Вы просто не умеете их готовить!!!"

Так бы сразу и сказал. Объясняю.
МашкоБ.В.
Например SELECT DISTINCT t.Name, t.ID_Tab1 зачем t.Name и t.ID_Tab1 это просто переменные и зачем передними t.?t -- это псевдоним таблицы Tab1 используемый в SELECT
t.Name -- это ничто иное как Tab1.Name, то есть поле Name из таблицы Tab1
Его желательно использовать для явного указания SELECTу какое поле ты хочешь вывести в запросе, особенно когда ты связываешь 2 и более таблиц и они имеют одинаковые названия полей.
У меня реальный запрос много сложнее поэтому я забыл это удалить, впрочем как и DISTINCT.


МашкоБ.В.
FROM Tab1 t это то откуда мы берём данные ? в моем случае это
vie?Да

МашкоБ.В.
INTO ARRAY ThisForm.аCombo то куда мы записываем наш массив Да

МашкоБ.В.
? если у меня Combo.name="Combo1" то я так и должен записать INTO ARRAY ThisForm.Combo1Нет

ThisForm.аCombo -- это свойство формы представляющее из себя массив. Ты его создаешь коммандой
Код: plaintext
ThisForm.AddProperty("aCombo(1,1)") && Создание свойства-массива формы

Сначала опишу что у меня, возможно у тебя такая же ситуация, раз ты делаешь vie из 2 таблиц (почему из 2 ты не написал.) А ты уже по аналогии сооруди себе сам.
У меня есть таблица-справочник, ну допустим Banks. В ней два поля ID и Name.
ID - уникальный идентификатор записи.
Name - содержит названия банков.

Код: plaintext
1.
2.
3.
4.
5.
6.
ThisForm.AddProperty("aCombo(1,1)") && Создание свойства-массива формы
SELECT Name, ID
  FROM Banks;
  INTO ARRAY ThisForm.aCombo && Источник для Combo
IF _TALLY =  0 
  ThisForm.aCombo[ 1 ,  1 ] = '\'
ENDIF
После выполнения этого кода я "имею"
(хорошее слово) свойство-массив ФОРМЫ (которое "живет" пока "живет" форма), заполненное значениями из таблицы-справочника.
В твоем случае вместо таблицы Banks ты подставляешь свой источник информации vie.

Далее в Inite Combo
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
WITH This
  .RowSourceType =  5 
  .RowSource = "ThisForm.aCombo" && Цепляю свойство-массив к Combo
  .ColumnCount =  2 
  .ColumnLines = .F.
  .ColumnWidths = LTRIM (STR (.Width -  46 )) + ", 0" && Устанавливаю ширину первой колонки и скрываю вторую
  .BoundColumn =  2 
  .ListIndex =  1 
ENDWITH

Теперь о Gride.
У меня есть вторая таблица, ну допустим Оtdelenie. В ней три поля ID, ID_Banks и Name.
ID - уникальный идентификатор записи.
ID_Banks - уникальный идентификатор записи из таблицы Banks.
Name - содержит названия отделений.
Т. е. эти две таблицы связаны один-ко-многим.
Вторая таблица является источником для грида. У тебя это vie.
Т. е. SELECT FROM Tab1 t INTO DBF tab_tmp тебе делать не нужно.

Ну вроде бы все, если тебя еще больше не запутал. Ну нет у меня преподавательских способностей.
...
Рейтинг: 0 / 0
Combo i Grid
    #33822340
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока вроде понятно сейчас еду с практики домой ,буду пробывать если что ещё напишу , Большое спасибо , а не мог бы ссылочку статьи ВладимираМ скинуть или мне на ящик kolobok-007@yandex.ru
...
Рейтинг: 0 / 0
Combo i Grid
    #33827583
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi StasL!

>> Зачем выбирать ВСЕ данные в новую таблицу?
> Естественно ВСЕ данные собирать ненужно. * -- для примера.

Проблема не в * а в том что нету WHERE части...
Вообще фокс при обработке запросов не способен "частично" извлекать поля -
т.е. что ты напишешь SELECT *, что SELECT f1, f2 - разницы не будет - фокс
читает для отбираемых записей все поля из исходной таблицы.
Кроме того я не понимаю общего смысла создания копии таблицы... Если уж надо
делать выборки (и именно ограничивающие число отбираемых записей! Причём
существенно ограничивающие - выборка 90000 из 100000 под это конечно не
подходит), то в большинстве случаев более выгодно (просто, эффективно и
функционально) использовать представления - конечно параметризованные.

>>> SET FILTER TO tab_tmp.ID_Tab1 = VAL(ThisForm.Combo.Value)
>> Не будет работать. Внутри условия фильтра не катят ThisForm...
> Ну у меня же работает (VFP8).

В модальной форме?
В общем случае не работает, т.к. область видимости ThisForm ограничена и в
куче случаев будет банально выходить ошибка о недоступности этого самого
ThisForm...
Так что тут вариант Машко с PUBLIC переменной более корректен (хотя конечно
очень некрасив).
Если уж делать, то как я сказал - через перевод параметра в строку (т.е.
убрать ссылку заменив её константой).

lcFilter = "ID_Tab1 = " + ThisForm.Combo.Value
SET FILTER TO &lcFilter

Т.е. в итоге получится что условие фильтра выглядит как ID_Tab1 = 123 - и
никаких ссылок - ни на PUBLIC переменную ни на ThisForm...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Combo i Grid
    #33829886
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте StasL !!

Спасибо за подробное объяснение почти во всем разобрался!
Возник вопрос только в одном месте.

ThisForm.AddProperty('aCombo1(1)')
SELECT nomer FROM vie;
INTO ARRAY Thisform.aCombo1
IF _TALLY = 0
ThisForm.aCombo1[1] = '\'
ENDIF

что указывает 1 в ('aCombo1(1)')

и что делает цикл
IF _TALLY = 0
ThisForm.aCombo1[1] = '\'
ENDIF

Поменяв всё под своё представление у меня выкидывается ошибка
'ACOMBO1' is not an array на код

.RowSourceType = 5 т.е. aCombo1 не воспринемается как массив.


Не подскажите в чем ошибка?
Заранее благодарен.
...
Рейтинг: 0 / 0
Combo i Grid
    #33830258
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МашкоБ.В.
что указывает 1 в ('aCombo1(1)')
Как я уже говорил, коммандой
Код: plaintext
ThisForm.AddProperty('aCombo1(1)') 
ты создаешь свойство- массив , но пустой массив ты создать не можешь.
1 указывает на то, что в массиве есть один элемент. Т. е. ты указываешь размерность массива.
(1, 1) - один элемент двухмерного массива.

МашкоБ.В.
и что делает цикл
IF _TALLY = 0
ThisForm.aCombo1[1] = '\'
ENDIF Во первых это не цикл, а ветвление

_TALLY -- это системная переменная памяти. Содержит числовое значение, которое выводит количество записей, обработанных самой последней выполнявшейся табличной командой.
В твоем случае это SELECT. Т. e. если SELECT не выдает ни одной записи _TALLY = 0.
Так как твой единственный элемент в массиве имеет значение по умолчанию .F., то ThisForm.aCombo1[1] = '\' , что бы в дальнейшем не получить ошибку несовпадения типов. А символ '\' в Combo отображаться не будет.
МашкоБ.В.
Поменяв всё под своё представление у меня выкидывается ошибка
'ACOMBO1' is not an array на код

.RowSourceType = 5 т.е. aCombo1 не воспринемается как массив.


Не подскажите в чем ошибка?

Посмотри через Debugger создается ли у тебя массив ACOMBO1. Может ты где-то код не в том методе прописал. Так сразу сказать не могу.
...
Рейтинг: 0 / 0
Combo i Grid
    #33830748
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При выполнении формы в Debugger на вкладке Lokals появляется aCombo1 с не понятным типом данных '''' причём ошибка начинается с Combo1.Init=
WITH This
.RowSourceType = 5
.RowSource = "ThisForm.aCombo1(1)"
.ColumnCount = 2
.ColumnLines = .F.
.ColumnWidths = LTRIM (STR (.Width - 46))
.BoundColumn = 2
.ListIndex = 1
ENDWITH
нажав пару раз Ignor появляется форма form1 и в Debugger на вкладке Lokals открыв ветку form1 появляется aCombo1 типа array и если открыть ветку aCombo1 то видно все значения.

А код у меня написан так:

в Load form1

ThisForm.AddProperty('aCombo1(1)')
SELECT nomer FROM vie;
INTO ARRAY Thisform.aCombo1
IF _TALLY = 0
ThisForm.aCombo1[1] = '\'
ENDIF

Далее в form1 создал метод filter_data и в нем прописал


ThisForm.LockScreen = .T.
SELECT vie
SET FILTER TO vie.nomer = Val(ThisForm.Combo1.Value)
GO TOP
ThisForm.LockScreen = .F.

В Combo1.Init прописал
WITH This
.RowSourceType = 5
.RowSource = "ThisForm.aCombo1(1)"
.ColumnCount = 2
.ColumnLines = .F.
.ColumnWidths = LTRIM (STR (.Width - 46))
.BoundColumn = 2
.ListIndex = 1
ENDWITH
ThisForm.Filter_Data

А в InteractiveChange ComboBoxа прописал ThisForm.Filter_Data

Получается что сначала пытается создаться массив , но он создаётся только после создания формы.
...
Рейтинг: 0 / 0
Combo i Grid
    #33830794
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МашкоБ.В.
WITH This
.RowSourceType = 5
.RowSource = "ThisForm.aCombo1(1)"
.ColumnCount = 2
.ColumnLines = .F.
.ColumnWidths = LTRIM (STR (.Width - 46))
.BoundColumn = 2
.ListIndex = 1
ENDWITH

Неправильно. У тебя массив одномерный. Попробуй так.
Код: plaintext
1.
2.
3.
4.
WITH This
  .RowSourceType =  5 
  .RowSource = "ThisForm.aCombo1"
  .ListIndex =  1 
ENDWITH 
Все остальное вроде бы правильно.
...
Рейтинг: 0 / 0
Combo i Grid
    #33830923
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я поменял код но ничего не изменилось. Сразу после запуска возникает ошибка в

SELECT vie
WITH This
.RowSourceType = 5
.RowSource = "ThisForm.aCombo1"
.ListIndex = 1
ENDWITH
ThisForm.Filter_Data

Интерес в том что после создания формы массив в Debugger виден но он не отображается в ComboBox ?
...
Рейтинг: 0 / 0
Combo i Grid
    #33831041
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка то какая и на какой конкретно строке?
...
Рейтинг: 0 / 0
Combo i Grid
    #33831721
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StasLОшибка то какая и на какой конкретно строке?


'ACOMBO1' is not an array на код
.RowSourceType = 5
затем нажав ignor ошибка перескакивает на
.RowSource = "ThisForm.aCombo1"
затем на
.ListIndex = 1
потом на
SET FILTER TO vie.nomer = Val(ThisForm.Combo1.Value)
затем появляется форма ,Грид, Бокс, кнопки появляется окошко где написано
'ACOMBO1' is not an array
нажимаем ОК и все . Форма остается но в КОМБО ничего нет! -)
...
Рейтинг: 0 / 0
Combo i Grid
    #33831758
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Property aCombo1 в форме существовать не должно! Удали его! Ты его создаешь "на лету" коммандой
Код: plaintext
ThisForm.AddProperty('aCombo1(1)') 
И будет тебе счастье!
...
Рейтинг: 0 / 0
Combo i Grid
    #33831936
МашкоБ.В.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StasLProperty aCombo1 в форме существовать не должно! Удали его! Ты его создаешь "на лету" коммандой
Код: plaintext
ThisForm.AddProperty('aCombo1(1)') 
И будет тебе счастье!


Я что-то не понял, мне надо удалить мой Combo1 , помоему нет.Аа так я не создавал отдельно Property aCombo1. Или может я чего не понял.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Combo i Grid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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