|
|
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
Помогите написать функцию, чтоб проверяла, присутствуют ли записи главной таблицы в дочерней, и если их там нет, что необходимо скрыть эти записи из главной таблицы. Например 2 таблицы: 1) организация id 1 2 3 4 2) товары id товар 1 кофеварка 1 сковородка 3 кофеварка В результате надо чтобы в таблице Организация был наложен фильтр id<>1 AND id<>3 т.е. получилось 1) организация id 1 3 Или как можно проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 22:28:51 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
Если в таблице "товары" есть индекс по полю Id, который так и называется Id, то можно так: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 23:53:26 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
Владимир, спасибо. Я писал там огромные функции, а как всегда все гениальное - просто... Но вот что опять появилось... В отчете найденная запись из таблицы Товары начала дублироваться. Сначала искал: 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 С первой функцией в отчете одна соответствующая запись, а втором найденная запись дублируется. Непонятно почему и как это можно исправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 09:23:21 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
А еще как можно теперь убрать фильтр с таблицы Товары, чтоб в главной Таблице организация остались теже записи? Надо наложить туда какойто фильтр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 09:23:43 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
Во-первых, не надо "динамически" наращивать или убавлять выражение фильтра. Сделай отдельный метод формы, который будет формировать выражение фильтра "с нуля" в соответствии со всеми настройками формы. Код: 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. Заметь, при формировании фильтра для (Товара) я подставил не ссылку на объект формы, а само значение этого объекта Thisform.Text8.Value. Дело в том, что ссылка типа ThisForm будет работать только в пределах данной формы. А при выполнении отчета ты окажешся вне формы, как следствие, либо будет сообщение об ошибке, либо фильтр будет работать некорректно. Далее просто вызываешь этот метод при любой модификации какого-либо объекта так или иначе влияющего на этот фильтр. Однако по большому счету, игра с фильтрами грозит тебя "похоронить". Слишком это сложно. Во всех смыслах. Поэтому, во-вторых, надо отказаться от фильтров в пользу прямых запросов Select-SQL. Т.е. надо использовать не сами таблицы с наложенными на них фильтрами, а выборки из этих таблиц. Динамически формируя команды Select-SQL по аналогии с фильтром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 10:54:12 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
Функция работает также, только код сократился... 1). А что такое XBase? Это и есть те самые фильтры которые я устанавливаю? Делаю задание в институте, вот там указано что в моем варианте использовать язык запросов XBase. А вообще фильтры в моем задании никак и не клеются. Мне надо найти записи главной таблицы, по критерия поиска в дочерних таблицах, а затем вывести отчет по удовлетворяющим запросу записям главной таблицы и полным списком соответствующих полей дочерних. 2. Буду пробовать sql SELECT a.название, b.товар; FROM Организация a, Товары b; WHERE b.товар="газ" Выводит в a.название все поля главной таблицы, и почемуто всем ставит в b.товар = "газ", хотя этому условию удовлетворяет всего одна запись. Что неправильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 16:21:11 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
ВладимирМЕсли в таблице "товары" есть индекс по полю Id, который так и называется Id, то можно так: Код: plaintext 1. 2. обьясните глупому, почему этот код будет работать, что сет фильтер будет труе фильтровать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 18:36:56 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 18:43:12 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
авторshami Код: plaintext 1. Фильтрует ID таблицы Организация, если соответствующие ID в дочерней таблице Товары не найдены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 18:48:12 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
shami ВладимирМЕсли в таблице "товары" есть индекс по полю Id, который так и называется Id, то можно так: Код: plaintext 1. 2. обьясните глупому, почему этот код будет работать, что сет фильтер будет труе фильтровать... Фильтр работает приблизительно так: Для КАЖДОЙ записи таблицы проверяется условие, указанное в фильтре. Если это условие истинно (.T.), то такая запись отображается, если ложно (.F.), то "прячется". Причем следует иметь в виду, что эта проверка выполняется не один раз, а каждый раз при переходе на очередную запись. Т.е. в общем случае, наложенный на таблицу фильтр замедляет процесс сканирования записей. В данном случае в фильтре указано приблизительно следующее: Найти в индексе с именем "id" в таблице (товары) значение ключа, совпадающее с ТЕКУЩИМ значением поля id таблицы (организации). Т.е. в качестве первого значения функции SEEK() выступает не значение поля id какой-то одной записи таблицы (организации), а для каждой записи берется свое (текущее) значение этого поля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 18:51:23 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
А как добавить еще одну таблицу: SELECT ; a.название, ; b.товар ; FROM Организация a; INNER JOIN Товары b ON a.id=b.id ; INNER JOIN Услуги с ON a.id=с.id ; WHERE b.товар="газ" Так уже вместо двух отражается одна таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 19:05:24 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
тоесть одна найденная запись вместо двух ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 19:06:12 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
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. Повторюсь, это всего-лишь схема. Просто она дает достаточно наглядное представление о логике отбора записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 19:19:19 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
Да, я понял данную схему, а как связать 3 таблицы (Товары, Услуги, Адреса), чтобы они все являлись дочерними для таблицы Организация (для наложения впоследсвии условий выборки)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 19:43:06 |
|
||
|
Помогите написать функцию...
|
|||
|---|---|---|---|
|
#18+
genek84Да, я понял данную схему, а как связать 3 таблицы (Товары, Услуги, Адреса), чтобы они все являлись дочерними для таблицы Организация (для наложения впоследсвии условий выборки)? Еще раз. В команде Select-SQL нет такого понятия как "родительская"/"дочерняя". Есть условия объединения. Т.е. ты объединяешь таблицы в нечто единое целое. Ты сначала определись, что именно хочешь получить в результате. Одну большую таблицу с повторяющимися значениями (большая "простыня") или несколько маленьких (выборка по родительской таблице, выборка по дочерней таблице). Т.е. как именно ты предполагаешь все это отображать на форме: один общий Grid или несколько связанных Grid или что-то еще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2005, 19:51:16 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33388158&tid=1593002]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
201ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 486ms |

| 0 / 0 |
