powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SET FILTER TO и массив, такое возможно?
16 сообщений из 16, страница 1 из 1
SET FILTER TO и массив, такое возможно?
    #35824927
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Собственно хочу сделать такое что-то такое

Код: plaintext
select fil1 from tab2 into cursor cur 
(массив получается)

Код: plaintext
set filter to fil2 = cur.fil1 in tab1
(фильтр на основании массива)

Если можно такое сделать, то как правильно?
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35824965
Imperous,
Если я правильно понял вопрос, то примерно так:
Смотреть в сторону временных индексов по полю fil2 на таблицу Tab1 + Set Relation to cur.fil1 into Tab2...
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35824970
Станислав С...кийImperous,
Если я правильно понял вопрос, то примерно так:
Смотреть в сторону временных индексов по полю fil2 на таблицу Tab1 + Set Relation to cur.fil1 into Tab2...
Исправляюсь:
Set Relation to cur.fil1 into Tab1
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825053
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то непонятно.. не хочет оно так работать..
делаю так 1:
Код: plaintext
1.
2.
select fil1 from tab2 into cursor cur 
Set Relation to cur.fil1 into Tab1
говорит что циклическая реляция

делаю так 1:
Код: plaintext
1.
2.
3.
select fil1 from tab2 into cursor cur 
select tab1
Set Relation to cur.fil1 into fil2
говорит что не найден альяс
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825366
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImperousВсем привет!
Собственно хочу сделать такое что-то такое

Код: plaintext
select fil1 from tab2 into cursor cur 
(массив получается)

Код: plaintext
set filter to fil2 = cur.fil1 in tab1
(фильтр на основании массива)

Если можно такое сделать, то как правильно?

Не массив, а курсор получается. Если нужен массив (а он нужен ?), то SELECT...INTO ARRAY...
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825396
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperousчто-то непонятно.. не хочет оно так работать..
делаю так 1:
Код: plaintext
select fil1 from tab2 into cursor cur 

После этой команды текущим стал алиас курсора cur.
Imperous
Код: plaintext
1.
Set Relation to cur.fil1 into Tab1

И тут-же вы пытаетесь установить его реляцию с самим собой.
Imperousговорит что циклическая реляция
Потому и говорит.
Imperousделаю так 1:
Код: plaintext
1.
2.
3.
select fil1 from tab2 into cursor cur 
select tab1
Set Relation to cur.fil1 into fil2
говорит что не найден альяс
Что-то не понял - вы кого с кем связать пытаетесь ? Фигурируют 2 таблицы и курсор.
SET RELATION TO <поле, по которому идет связка> INTO <таблица, с которой связываемся>.
А у вас что-то и select tab1 (она становится текущей и ведущей в связке), и cur упоминается, а сама связка делается с fil2. Ниче не понял.
Вроде в первой мессаге речь шла о фильтре, тут уже про relation началось. Обьясните на пальцах, чего надо ? А то так в трех соснах себя не найдете.
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825420
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы правы, нужен фильтр, с релэйшном я решил поиграться потому что так подсказали
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825438
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо выбрать из таблицы_1 значения которые попадают в выборку из таблицы_2
другими словами:
Код: plaintext
1.
2.
select * ;
from tab1 ;
where fil2 in (select fil1 from tab2)

вот я и хочу узнать как такое условие можно запихнуть в
Код: plaintext
SET FILTER TO
или альтернативное решение, НО я не хочу использовать курсор для таблицы_1
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825527
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperousнадо выбрать из таблицы_1 значения которые попадают в выборку из таблицы_2
другими словами:
Код: plaintext
1.
2.
select * ;
from tab1 ;
where fil2 in (select fil1 from tab2)
вот я и хочу узнать как такое условие можно запихнуть в
Код: plaintext
SET FILTER TO
или альтернативное решение, НО я не хочу использовать курсор для таблицы_1

Какое-то противоестественное желание. Вы-же уже все выполнили первым селектом. Или есть тяга к самоистязанию ? :) Тогда так :

Код: plaintext
1.
2.
SELECT fil1 FROM tab2 INTO ARRAY zzz
SET FILTER TO ASCAN(zzz,tab1.fil2)> 0  IN tab1
GO top IN tab1
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35825874
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareImperousнадо выбрать из таблицы_1 значения которые попадают в выборку из таблицы_2
другими словами:
Код: plaintext
1.
2.
select * ;
from tab1 ;
where fil2 in (select fil1 from tab2)
вот я и хочу узнать как такое условие можно запихнуть в
Код: plaintext
SET FILTER TO
или альтернативное решение, НО я не хочу использовать курсор для таблицы_1

Какое-то противоестественное желание. Вы-же уже все выполнили первым селектом. Или есть тяга к самоистязанию ? :) Тогда так :

Код: plaintext
1.
2.
SELECT fil1 FROM tab2 INTO ARRAY zzz
SET FILTER TO ASCAN(zzz,tab1.fil2)> 0  IN tab1
GO top IN tab1


Спасибо, это именно то что мне надо!!!
Единственный неприятный момент это объявление массива с указанием кол-ва записей, т.е. каждый раз перед тем как загнать данные в массив необходимо сначала сделать такой же запрос но с целью узнать count и загнать в курсор, затем этот курсор подставить в кол-во записей массива...
я делал так:

Код: plaintext
1.
2.
3.
4.
SELECT CNT(*) FROM tab2 INTO CURSOR xx
PUBLIC zzz[xx.cnt]
SELECT fil1 FROM tab2 INTO ARRAY zzz
SET FILTER TO ASCAN(zzz,tab1.fil2)> 0  IN tab1
GO top IN tab1
[/quot]
Или есть иной способ?
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35826138
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous
Спасибо, это именно то что мне надо!!!
Единственный неприятный момент это объявление массива с указанием кол-ва записей, т.е. каждый раз перед тем как загнать данные в массив необходимо сначала сделать такой же запрос но с целью узнать count и загнать в курсор, затем этот курсор подставить в кол-во записей массива...

Бред. Не надо считать никакие записи и заранее обьявлять размер массива. Массив автоматически создается САМ при SELECT...INTO ARRAY. Факт успешного создания массива можно проверить, спросив ? _TALLY сразу после выполненного селекта.
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35826494
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imperous
Спасибо, это именно то что мне надо!!!

Вообще, непонятно, откуда такая нелюбовь к курсорам. Отличие SELECT...INTO ARRAY от SELECT...INTO CURSOR в том, что при создании курсора появляются многие удобства - работа, как с обычным dbf-файлом. Только на диск ничего не пишется, пока сам не заставишь. И уничтожается курсор сразу при его закрытии. А в целом - такой-же виртуальный обьект, как и массив. Кушает столько-же памяти. И обьем данных, который сканирует SELECT-SQL, одинаков, независимо от того, куда вы направляете результат выборки. Хоть в курсор, хоть в массив, хоть в query. Приведенный мной пример SELECT...INTO ARRAY полон нелепости, потому-что вам приходится делать выборку дважды - сначала в массив, потом по содержимому массива - из первичной таблицы. Зачем ? Ведь это прекрасно делается одной строкой по SELECT...WHERE... IN... Такие игрушки в принципе должны даже влиять на быстродействие приложения.
И еще - приятно, конечно, использовать все богатство функций VFP в команде SELECT-SQL. Но не забывайте, что эти фокусы с ASCAN() действуют только, пока вы не вылезли за рамки VFP. Если такой селект послать реальному SQL-серверу, то он просто не поймет, о какой такой ASCAN() идет речь. Неизбежно вам придется использовать WHERE IN. Надо придерживаться стандартов языка SQL. Поэтому, разумней и перспективней писать SELECT-SQL так, как он должен выглядеть, если бы вы его применяли для связи с SQL-сервером. Даже при работе на локальной машине, даже при чисто фоксовых БД.
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35826520
rewareКушает столько-же памяти.
Маленькая поправочка - курсор кушает памяти меньше, чем массив, за счет одноразового определения типов и размерностей полей для всего курсора, а не для каждого элемента массива. Да и заточен фокс именно под работу с таблицами/курсорами, а не с массивами.
С остальным полностью согласен.
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35826588
Imperous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даю объяснение почему мне в данном случае не нужен курсор: потому что на форме имею таблицу из dataenveronment (буфферизация), которая изменяется пользователем, т.е. он делает необходимую выборку и в ней делает корректировки.
почему не использую для этого курсорадаптер? - все просто, я не умею его использовать, знаю что надо научится, но покачто не хочу и нет желания.
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35826601
Imperousдаю объяснение почему мне в данном случае не нужен курсор: потому что на форме имею таблицу из dataenveronment (буфферизация), которая изменяется пользователем, т.е. он делает необходимую выборку и в ней делает корректировки.
И это мешает завести еще один курсор?
[quot]
покачто не хочу и нет желания.[/quot]
Это два разных повода? :)
...
Рейтинг: 0 / 0
SET FILTER TO и массив, такое возможно?
    #35826738
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ImperousВсем привет!
Собственно хочу сделать такое что-то такое

Код: plaintext
select fil1 from tab2 into cursor cur 
(массив получается)

Код: plaintext
set filter to fil2 = cur.fil1 in tab1
(фильтр на основании массива)

Если можно такое сделать, то как правильно?

если в таблице tab2 есть индекс по полю fil1, то можно вообще без запросов. Примерно так

Код: plaintext
Set Filter To Indexseek(fil2,.f.,"tab2","fil1")

Здесь fil1 - это предполпгаемое имя индексного тега в таблице tab2.

Хотя, советы вам давали правильные. SET FILTER хорош только в случае, когда надо сделать "по быстрому", просто чтобы "заткнуть дырку". Если же вы предполагаете дальнейшее развитие приложения, то использование SET FILTER - не желательно. Он сильно ограничивает возможности модификации приложения.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SET FILTER TO и массив, такое возможно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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