powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите написать функцию...
16 сообщений из 16, страница 1 из 1
Помогите написать функцию...
    #33387972
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите написать функцию, чтоб проверяла, присутствуют ли записи главной таблицы в дочерней, и если их там нет, что необходимо скрыть эти записи из главной таблицы.
Например 2 таблицы:
1) организация
id
1
2
3
4
2) товары
id товар
1 кофеварка
1 сковородка
3 кофеварка
В результате надо чтобы в таблице Организация был наложен фильтр
id<>1 AND id<>3
т.е. получилось
1) организация
id
1
3
Или как можно проще?
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388021
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в таблице "товары" есть индекс по полю Id, который так и называется Id, то можно так:

Код: plaintext
1.
2.
select (организации)
SET FILTER TO SEEK(id,(товары),"id")
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388128
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир, спасибо.
Я писал там огромные функции, а как всегда все гениальное - просто...
Но вот что опять появилось...
В отчете найденная запись из таблицы Товары начала дублироваться.

Сначала искал:
SELECT Товары
IF ((Thisform.Check8.Value=1) AND Thisform.Check8.Enabled)
IF EMPTY(FILTER('Товары'))
SET FILTER TO Товары.товар=RTRIM(Thisform.Text8.Value)
ELSE
STORE FILTER('Товары') TO OldFilter
SET FILTER TO (&OldFilter) AND Товары.товар=RTRIM(Thisform.Text8.Value)
ENDIF
ENDIF

Затем
IF (Thisform.Check8.Value=1)
SELECT Организация
IF EMPTY(FILTER('Организация'))
SET FILTER TO SEEK(id,'Товары','id')
ELSE
STORE FILTER('Организация') TO OldFilter
SET FILTER TO (&OldFilter) AND SEEK(id,'Товары','id')
ENDIF
ENDIF

REPORT FORM report_find.frx PREVIEW

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

Код: 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.
LOCAL lcFilterTovar, lcFilterOrg
STORE "" TO lcFilterTovar, lcFilterOrg

IF Thisform.Check8.Value= 1 
	m.lcFilterOrg = m.lcFilterOrg+ " AND " + "SEEK(id,'Товары','id')"
	IF Thisform.Check8.Enabled = .T.
		m.lcFilterTovar= m.lcFilterTovar+ " AND " + ;
			"Товары.товар=["+RTRIM(Thisform.Text8.Value)+"]"
	ENDIF
ENDIF

* Отсекаю лишние первые  5  символов - Первый " AND "
m.lcFilterTovar = SubStr(m.lcFilterTovar, 6 )
m.lcFilterOrg   = SubStr(m.lcFilterOrg, 6 )

* Собственно установка фильтра
select Товары
IF EMPTY(m.lcFilterTovar) = .T.
	SET FILTER TO
ELSE
	SET FILTER TO &lcFilterTovar
ENDIF

select Организация
IF EMPTY(m.lcFilterOrg) = .T.
	SET FILTER TO
ELSE
	SET FILTER TO &lcFilterOrg
ENDIF

Заметь, при формировании фильтра для (Товара) я подставил не ссылку на объект формы, а само значение этого объекта Thisform.Text8.Value. Дело в том, что ссылка типа ThisForm будет работать только в пределах данной формы. А при выполнении отчета ты окажешся вне формы, как следствие, либо будет сообщение об ошибке, либо фильтр будет работать некорректно.

Далее просто вызываешь этот метод при любой модификации какого-либо объекта так или иначе влияющего на этот фильтр.

Однако по большому счету, игра с фильтрами грозит тебя "похоронить". Слишком это сложно. Во всех смыслах.

Поэтому, во-вторых, надо отказаться от фильтров в пользу прямых запросов Select-SQL. Т.е. надо использовать не сами таблицы с наложенными на них фильтрами, а выборки из этих таблиц. Динамически формируя команды Select-SQL по аналогии с фильтром.
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388353
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функция работает также, только код сократился...

1). А что такое XBase?
Это и есть те самые фильтры которые я устанавливаю?
Делаю задание в институте, вот там указано что в моем варианте использовать язык запросов XBase.
А вообще фильтры в моем задании никак и не клеются. Мне надо найти записи главной таблицы, по критерия поиска в дочерних таблицах, а затем вывести отчет по удовлетворяющим запросу записям главной таблицы и полным списком соответствующих полей дочерних.

2. Буду пробовать sql

SELECT a.название, b.товар;
FROM Организация a, Товары b;
WHERE b.товар="газ"

Выводит в a.название все поля главной таблицы, и почемуто всем ставит в b.товар = "газ", хотя этому условию удовлетворяет всего одна запись.
Что неправильно?
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388410
shami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМЕсли в таблице "товары" есть индекс по полю Id, который так и называется Id, то можно так:

Код: plaintext
1.
2.
select (организации)
SET FILTER TO SEEK(id,(товары),"id")


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

1). А что такое XBase?
Это и есть те самые фильтры которые я устанавливаю?
Делаю задание в институте, вот там указано что в моем варианте использовать язык запросов XBase.
Что имеется в виду в данном случае - понятия не имею.

genek84
SELECT a.название, b.товар;
FROM Организация a, Товары b;
WHERE b.товар="газ"

Выводит в a.название все поля главной таблицы, и почемуто всем ставит в b.товар = "газ", хотя этому условию удовлетворяет всего одна запись.
Что неправильно?
Нет условия объединения таблиц.

Чтобы было понятно, Select-SQL выполняется приблизительно так:

Берется первая запись из первой таблицы и первая запись из второй таблицы. Проверяются условия отбора записей, если они удовлетворяют условиям указанным в WHERE, то попадают в итоговую выборку.

Далее все для той же первой записи первой таблицы берется следующая запись второй таблицы и снова проверяется условие.

После того, как для первой записи первой таблицы будут просканированы все записи второй таблицы берется следующая запись первой таблицы и повторяется сканирование всех записей второй таблицы.

Т.е. весьма приблизительно, команда Select-SQL - это вложенные циклы, сканирующие ВСЕ записи каждой таблицы.

Разумеется, на самом деле команда Select-SQL работает не так. Но приведенное описание позволяет понять логику отбора записей в итоговую выборку.

Возвращаясь к твоему запросу. В результате ты получишь ВСЕ записи главной таблицы, а из подчиненной будет взята только одна запись, удовлетворяющая условию.

В данном случае необходимо добавить условие объединения таблиц. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ;
	a.название, ;
	b.товар ;
FROM Организация a ;
INNER JOIN Товары b ON a.id=b.id ;
WHERE b.товар="газ"
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388416
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторshami

Код: plaintext
1.
select (организации)
SET FILTER TO SEEK(id,(товары),"id")

Фильтрует ID таблицы Организация, если соответствующие ID в дочерней таблице Товары не найдены
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388421
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shami ВладимирМЕсли в таблице "товары" есть индекс по полю Id, который так и называется Id, то можно так:

Код: plaintext
1.
2.
select (организации)
SET FILTER TO SEEK(id,(товары),"id")


обьясните глупому, почему этот код будет работать, что сет фильтер будет труе фильтровать...

Фильтр работает приблизительно так:

Для КАЖДОЙ записи таблицы проверяется условие, указанное в фильтре. Если это условие истинно (.T.), то такая запись отображается, если ложно (.F.), то "прячется".

Причем следует иметь в виду, что эта проверка выполняется не один раз, а каждый раз при переходе на очередную запись. Т.е. в общем случае, наложенный на таблицу фильтр замедляет процесс сканирования записей.

В данном случае в фильтре указано приблизительно следующее:

Найти в индексе с именем "id" в таблице (товары) значение ключа, совпадающее с ТЕКУЩИМ значением поля id таблицы (организации).

Т.е. в качестве первого значения функции SEEK() выступает не значение поля id какой-то одной записи таблицы (организации), а для каждой записи берется свое (текущее) значение этого поля
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388431
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как добавить еще одну таблицу:

SELECT ;
a.название, ;
b.товар ;
FROM Организация a;
INNER JOIN Товары b ON a.id=b.id ;
INNER JOIN Услуги с ON a.id=с.id ;
WHERE b.товар="газ"

Так уже вместо двух отражается одна таблица.
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388433
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тоесть одна найденная запись вместо двух
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388440
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genek84А как добавить еще одну таблицу:

SELECT ;
a.название, ;
b.товар ;
FROM Организация a;
INNER JOIN Товары b ON a.id=b.id ;
INNER JOIN Услуги с ON a.id=с.id ;
WHERE b.товар="газ"

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

В данном случае ты получишь для КАЖДОЙ записи таблицы (Организация) ВСЕ связанные записи таблицы (Товары) (связка по полю id). И для КАЖДОЙ ПАРЫ (Организация-Товары) ВСЕ связанные записи таблицы (Услуги).

Ну, напрягись, представь как будет работать перебор записей в данном случае. Грубо говоря, что-то вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select (Организация)
SCAN
	select (Товары)
	SCAN
		select (Услуги)
		SCAN
			* Вот здесь проверяем все текущие записи на факт 
			* удовлетворения как условиям объединения записей 
			* (все, что после ON), так и условиям отбора записей 
			* (все, что после WHERE)
		ENDSCAN
	ENDSCAN
ENDSCAN

Повторюсь, это всего-лишь схема. Просто она дает достаточно наглядное представление о логике отбора записей.
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388454
genek84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, я понял данную схему,
а как связать 3 таблицы (Товары, Услуги, Адреса), чтобы они все являлись дочерними для таблицы Организация (для наложения впоследсвии условий выборки)?
...
Рейтинг: 0 / 0
Помогите написать функцию...
    #33388458
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genek84Да, я понял данную схему,
а как связать 3 таблицы (Товары, Услуги, Адреса), чтобы они все являлись дочерними для таблицы Организация (для наложения впоследсвии условий выборки)?
Еще раз.

В команде Select-SQL нет такого понятия как "родительская"/"дочерняя". Есть условия объединения. Т.е. ты объединяешь таблицы в нечто единое целое.

Ты сначала определись, что именно хочешь получить в результате. Одну большую таблицу с повторяющимися значениями (большая "простыня") или несколько маленьких (выборка по родительской таблице, выборка по дочерней таблице).

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


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