powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Последовательная фильтрация
25 сообщений из 31, страница 1 из 2
Последовательная фильтрация
    #37654603
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые коллеги!

Пусть дана некоторая таблица Т.

Рассмотрим фильтр Ф1:

set filter to Поле1 = Значение1 .and. Поле2 = Значение2 .and. ... .and. ПолеК = ЗначениеK
go top

Каждому должно быть понятно, что в результате получим некоторую таблицу ТФ1.

Эксперимент показывает, что в результате выполнения последовательности команд

set filter to Поле1 = Значение1
go top

set filter to Поле2 = Значение2
go top
...
set filter to ПолеК = ЗначениеK
go top

НЕ получается таблица ТФ1.

Вопросы:

1. Почему это так?
2. Как написать последовательность указанного типа, чтобы результат был ТФ1.

Для чего это нужно?

Чтобы логическое выражение в фильтре можно было делать произвольной длины, например.
Да и работать намного удобнее.
И т. д.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37654640
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: UAP
> НЕ получается таблица ТФ1.
>
> Вопросы:
>
> 1. Почему это так?

Не получается, т.к. каждый фильтр "сбрасывает" предыдуший фильтр

> 2. Как написать последовательность указанного типа, чтобы результат был ТФ1.

Перечислять все условия фильтрации в условии.

Это код DblClick ListBox'а. В классе Header по Click'у строится курсор для "автофильтра" по этому столбцу и
присваивается как RecordSource ListBox'у из которого выбирают значение и по этому значению ставится фильтр. Т.к. это
грид, то фильтров может быть много, по разным столбцам, которые нужно учесть :)
Через ListBox.Tag передается имя поля в курсоре и имя столбца в таблице
Код: sql
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
Local sOldFilters As String, sNameField As String, sNameColumn As String, sValue As String
Local sTypeFilterColumn As String, sCharEnd As String, sCharStart As String
Local sCond As String, nCountConditions As Long, bIsFind  As Boolean
bIsFind  = .F.
Try
 sOldPoint = Set("Point")
 Set Point To [.]
 sOldFilters = Filter(Thisform.exgrid1.RecordSource)
 Select raw_fact
 CurrRecNo = Recno()
 sNameField  = Getwordnum(This.Tag, 1, "^")
 sNameColumn = Getwordnum(This.Tag, 2, "^")
 sValue = This.List(This.ListIndex)

* Ищем столбец курсора по которому будем фильтровать и определяем его тип, для правильного оформления условия фильтра
 Afields(arrF, Thisform.exgrid1.RecordSource)
 If Type("arrF[1]")#"U" Then
  nPos = Ascan(arrF, m.sNameField, -1, -1, 1, 1+8)
  If nPos != 0 Then
   sTypeFilterColumn = arrF(nPos,2)
  Else
   sTypeFilterColumn = "C"
  Endif
 Endif
* По определенному типу столбца, определяем символ ограничитель
 Do Case
 Case Inlist(sTypeFilterColumn, "C", "V")
  sCharStart = "["
  sCharEnd = "]"
 Case  Inlist(sTypeFilterColumn, "D", "T")
  sCharStart = "{"
  sCharEnd = "}"
 Case  Inlist(sTypeFilterColumn, "I", "Y", "B", "F", "N", "L")
  sCharStart = "  "
  sCharEnd = "  "
 Endcase
 If Len(sOldFilters) > 1 Then
* Если фильтр не пустой, проверяем, что наше поле есть уже в фильтре и устанавливаем новое значение
  nCountConditions = Alines(arrFilters, sOldFilters,1+4, ".AND.")
  sOldFilters = ""
  If nCountConditions > 0 Then
* В массиве из условий фильтра пробуем найти свое
   For i = 1 To nCountConditions
*    If Atc(sNameField, arrFilters(i)) != 0 Then
    If Len(sNameField) <= Len(arrFilters(i)) Then
     If Lower(sNameField) == Lower(Left(arrFilters(i), Len(sNameField))) Then
      bIsFind = .T.
* Если нашли наше поле, смотрим, что нужно делать. Поменять условие или убрать вообще
      If sValue != "(Все)" Then
* Если выбрали отобразить всё - удаляем условие, просто пропускаем это условие
* Если выбрали другое значение - перестраиваем условие
       sCond = sNameField + " = " + sCharStart + sValue + sCharEnd + " and "
*  Проверяем, если тип поля числовой, заменяем все запятые на точки
       If Inlist(sTypeFilterColumn, "I", "Y", "B", "F", "N", "L")
        sOldFilters = Chrtran(sCond, ",", ".")
       Endif
       sOldFilters = sOldFilters + sCond
      Endif
     Else
      sOldFilters = sOldFilters + arrFilters(i) + " and "
     Endif && If sNameField == Left(arrFilters(i), Len(sNameField)) Then
    Else
     sOldFilters = sOldFilters + arrFilters(i) + " and "
    Endif && If Len(sNameField) <= Len(arrFilters(i)) Then
   Next i
   If Len(sOldFilters) > 5 Then
    sOldFilters = Left(sOldFilters, Len(sOldFilters) - 5)
   Endif
   If !bIsFind And sValue != "(Все)" Then
    sCond = sNameField + " = " + sCharStart + sValue + sCharEnd
*  Проверяем, если тип поля числовой, заменяем все запятые на точки
    If Inlist(sTypeFilterColumn, "I", "Y", "B", "F", "N", "L")
     sCond = Chrtran(sCond, ",", ".")
    Endif
    sOldFilters = sOldFilters + " and " + sCond
   Endif
  Else
*  Количество условий пустое, просто добавляем
   sOldFilters = sNameField + " = " + sCharStart + sValue + sCharEnd
  Endif

* * Ищем вхождение "нашего" поля в фильтр
*   nStart = Atc(sNameField, sOldFilters)
*   If nStart > 0 Then
*    nEnd = Atc(sCharEnd, sOldFilters)
* * Если нашли, заменяем его
*    If sValue = "(Все)" Then
* * Вырезаем наше условие фильтра
*     If nStart = 1 Then
* * Если ускомое условие стоит первым, обрезаем его и захватываем оператор AND, если он есть
*      If nEnd => Len(Alltrim(sOldFilters)) Then
*       sOldFilters = ""
*      Else
*       sOldFilters = Substr(sOldFilters, nEnd + 6) && ].AND.
*      Endif
*     Else
* * Если искомое условие стоит НЕ первым, захватываем оператор AND
*      sOldFilters = Substr(sOldFilters, 1, nStart - 4) + Substr(sOldFilters, nEnd)
*     Endif
*    Else
*     sOldFilters = Substr(sOldFilters, 1, nStart - 1) + sNameField + " = " + sCharStart + sValue + sCharEnd + 
Substr(sOldFilters, nEnd)
*    Endif
*   Else
* * Если не нашли наше поле в условии и выбрали не фильтр, добавляем условие
*    If sValue != "(Все)" Then
*     sOldFilters = sOldFilters + " and " + sNameField + " = " + sCharStart + sValue + sCharEnd
*    Endif
*   Endif
 Else
  If sValue != "(Все)" Then
   sOldFilters = sNameField + " = " + sCharStart + sValue + sCharEnd
  Endif
 Endif
 Set Point To (sOldPoint)
* Если строка фильтра заполнена, применяем её
 Select(Thisform.exgrid1.RecordSource)
 Set Filter To
 If Len(sOldFilters) > 3 Then
*  sOldFilters = Chrtran(sOldFilters, ",", ".")
  Set Filter To &sOldFilters
 Endif
 sOldFilters = "Thisform.Exgrid1." + sNameColumn + ".Header1.ForeColor = " + Iif(sValue != "(Все)", "Rgb(0,0,255)", 
"Rgb(0,0,0)")
 &sOldFilters
 sOldFilters = "Thisform.Exgrid1." + sNameColumn + ".SetFocus()"
 &sOldFilters
Catch To oErr
 Set Point To (sOldPoint)
 If g_debug Then
  m.lcmess='('+Alltrim(Str(oErr.ErrorNo))+') '+Trim(oErr.Details) + Chr(10) ;
   + 'Сообщение: ' + Alltrim(oErr.Message) + Chr(10) ;
   + 'Функция: ' + Alltrim(oErr.Procedure) + Chr(10) ;
   + 'Строка №' + Alltrim(Str(oErr.Lineno)) + Chr(10) ;
   + 'Код в строке: ' + Alltrim(oErr.LineContents) + Chr(10) ;
   + 'message:' + Message() + Chr(10) ;
   + 'sOldFilters = ' + sOldFilters
  Messagebox(m.lcmess,0,'Ваше соединение вернуло ошибку: ',30000)
 Endif
Endtry

* Подбиваем итоги
Select(Thisform.exgrid1.RecordSource)
Sum Summa To m_summa_filters
Count To  m_count_filters
With Thisform.conItogs
 .lblCountFilters.Caption = Alltrim(Transform(m_count_filters, "999999"))
 .lblSumFilters.Caption = Alltrim(Transform(m_summa_filters, "999 999 999 999 999.99"))
Endwith
Thisform.Refresh()
Select(Thisform.exgrid1.RecordSource)
Go Record CurrRecNo
* Убираем за собой, удаляем ненужный курсор и сбрасывает Тэг
sOldFilters = This.RowSource
This.ResetToDefault("RowSource")
This.ResetToDefault("RowSourceType")
*This.RowSource = []
This.Tag = ""
*Release &sOldFilters
Use In Select(sOldFilters)
This.Visible = .F.
Thisform.exgrid1.SetFocus()




Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37654909
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Игорь Горбонос!

Может все таки есть некий прием, позволяющий не сбрасывать предидущий фильтр?
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37654917
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Игорь Горбонос!

Может все таки есть некий прием, позволяющий не сбрасывать предидущий фильтр?
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655054
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну если вам без фильтра - ни жить, ни быть...
наверное, имелось в виду следующее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
use kladr
browse
lcFilter='.t.'
SET FILTER TO &lcFilter
lcFilter='('+FILTER()+') .and. name="Вол"'
SET FILTER TO &lcFilter
lcFilter='('+FILTER()+') .and. socr="г"'
SET FILTER TO &lcFilter
...
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655330
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

Ваше предложение заманчиво...
Я тоже пытаюсь "накапливать" фильтрующее выражение.
Но.
При большом количестве условий не налетим ли мы на ограничение в количестве символов на длину оператора, равную 254 символа.
Конечно, я могу ошибаться.
Если так, то поправьте меня.
Более того.
Представляет интерес ведение "протокола" наложения фильтров с целью ОТМЕНИТЬ наложенный только что "частичный" фильтр и точно так же его ВЕРНУТЬ (произвольное количество отмен и возвращений).
С вожделением жду ответов коллег!
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655509
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UAP, с таким количеством фильтров вы скорей налетите на замедление работы программы.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655510
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В фоксе нет накопительных фильтров.
Обычно хватает подхода предложенного AndreTM
Тут есть ограничение по длине строки, только 254 или больше точно не скажу. Никогда не надо было много.

Можно вызывать SET FILTER свою функцию, а там уже прописать все что надо.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655542
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа !!!
(Звоню в колокольчик...)

Давайте говорить по сути.
Мне нужно решить задачу, а не поддерживать светскую беседу ...
Извините ...
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655573
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAPМне нужно решить задачу, а не поддерживать светскую беседу ...
Извините ...
Ну так решай и конкретно спрашивай что не решается. Мы за тебя твои гипотезы тестить должны?
UAPПри большом количестве условий не налетим ли мы на ограничение в количестве символов на длину оператора, равную 254 символа.
Конечно, я могу ошибаться.
Если так, то поправьте меня.
Взял да проверил. Вопрос на 2 минуты.
Лично мне просто интересно сколько чего такого юзер должен навыбирать чтобы это не влезло в 254 символа.

UAPПредставляет интерес ведение "протокола" наложения фильтров с целью ОТМЕНИТЬ наложенный только что "частичный" фильтр и точно так же его ВЕРНУТЬ (произвольное количество отмен и возвращений).
В чем проблема? Создал таблицу/переменную/объект и веди туда протокол.

Вобщем описывай что там у тебя за задача, как она решена и что конкретно тебе не нравится в этом решении.
Если рассуждать в общих словах - то получается только светская беседа.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37655825
ALEW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Накапливай условия фильтра в символьную строку <...>
Затем делай макроподстановку

SET FILTER TO &<...>
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37656787
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAPПри большом количестве условий не налетим ли мы на ограничение в количестве символов на длину оператора, равную 254 символа.Что-то я не заметил в описании SET FILTER ограничения на длину условия... Если же вас интересует ограничение длины строки в макроподстановке - то читайте .
UAPПредставляет интерес ведение "протокола" наложения фильтров с целью ОТМЕНИТЬ наложенный только что "частичный" фильтр и точно так же его ВЕРНУТЬ (произвольное количество отмен и возвращений)Как по вашему, зачем я в примере множу скобки? Немного подумав, вы поймёте, что в этом случае анализ самого выражение фильтра позволит...
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37657072
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

Мне понятно Ваше решение.
Но.
Предположим, что у первоначальной таблицы есть "сопровождающая" таблица с одним символьным полем, в котором каждая новая запись появляется с изменением фильтра. То есть "приращение" фильтрующего выражения записывается в новую запись. Это та структура о которой Вы говорите.
Понятно, что если через .and. "просуммировать" все записи, то получим текущий фильтр.
Если "просуммировать" все записи за исключением последней, то это "вернет" нас на шаг назад.
И так далее.
И вот тут возникает возможное ограничение на длину фильтрующего выражения.
Как быть?
Именно это наводит на мысль не "накапливать" выражение, а налагать последовательно фильтры.
Однако и это не годится.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37657370
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понял в ваших рассуждениях...
Какая вторая таблица? Зачем? Я предлагаю использовать только выражение фильтра. И всё.
На основе анализа самого выражения - можно всегда найти все "шаги" добавления.
И покажите мне ссылку на ограничение длины выражения фильтра (вернее, на размер этого ограничения). Из официального руководства.
Если же вы про длину символьной строки - то для девятки она равна 16Мб. Не считая вешеописанного приема.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658107
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

Безусловно Вы правы.
Просто хочется ДО разработки фрагмента как можно больше продумать тонкостей.
Интересно найти альтернативу.
Ведь писать плохие программы легко и быстро.
...
По поводу альтернативы.
Вероятно, на меня опять обрушатся с критикой, но я позволю себе предложить такой вариант.
В начале фрагмента напишем:
set dele on
Если нам нужен фильтр с логическим условием L1, то при альтернативном подходе это все равно что
dele all for !L1
Затем "фильтруем согласно логического условия L2"
dele all for !L2
Вот тут-то НЕ нужно делать так
dele all for !(L1.and.L2),
поскольку set dele on
и т.д.
В конце концов делаем recall all.
Таблицы у меня маленькие.
Время обработки НЕ критично.
Конечно есть риск уничтожить таблицу...
Интересно Ваше мнение обо всем вышеизложенном.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658140
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз ничего не понял...
Каким образом SET FILTER соотносится с условиями и областью действия в операторе DELETE?
Вы чего вообще пытаетесь достичь? Расскажите уж "ваше понимание" вопроса простым русским доходчивым языком

Кстати, !L1 and !L2 <=> !(L1 or L2). Так что ваши рассуждения - вообще из области "своёпонятия"... Судя по всему, вы там придумали себе некий "мегасуперпринцип", который проистёк из "вашей интуиции". Я уж не знаю, что и посоветовать - то ли практику по языку наработать, то ли теорию множеств почитать
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658167
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

set filter to L1.and.L2

"эквивалентен"

dele all for !( L1.and.L2)

(Я очень хорошо знаю, что !( L1.and.L2) <=> !L1.or.!L2 - дело не в этом)

Наличие

set dele on (определяет, что команды не обрабатывают записи, помеченные на удаление)

делает "эквивалентными" дествия

dele all for !( L1.and.L2)

и пару

dele all for !L1
dele all for !L2

Это позволяет очень упростить программу.
Не нужно разбирать длинные выражения, наталкиваться на ограничения ...
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658173
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы собираетесь фильтровать записи с помощью пометки на удаление?
Нет, конечно, метод - но защем?? Только потому, что есть такое дело, как пометка?
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658179
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

Да.
Собираюсь фильтровать записи с помощью пометки на удаление.
Зачем?
Потому, что я не могу сообразить как того же результата достичь последовательной фильтрацией да еще с короткими логическими выражениями.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658184
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стОит так делать... Вот в этом случае у вас и получится, что нужны всякие "дополнительные базы", "логи"... да и не наш это метод - вы думаете, вам это даст быстродействие?

Что, вам нужен просто рабочий пример "с последовательной фильтрацией" на больших таблицах, что ли? С помощью исползования выражения фильтра? Так это не ко мне - я на Фоксе сейчас уже не пишу. Хотя и могу попробовать изобразить...
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658195
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

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

Да и не путаем - логика там как раз по теории множеств, как бы не хотелось обратного авторset filter to L1.and.L2
"эквивалентен"
dele all for !( L1.and.L2)от этом и говорит...

А в целом - путь указан, и я рАтую именно за него. Но решать - вам.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658247
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM!

Спасибо ...
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658332
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAPПонятно, что если через .and. "просуммировать" все записи, то получим текущий фильтр.
Если "просуммировать" все записи за исключением последней, то это "вернет" нас на шаг назад.
И так далее.
И вот тут возникает возможное ограничение на длину фильтрующего выражения.
Ты проверил какое это именно ограничение? или так и продолжаешь философствовать о черной кошке в темной комнате?
UAPКак быть?
Именно это наводит на мысль не "накапливать" выражение, а налагать последовательно фильтры.
Однако и это не годится.
Я же уже предлагал сделать свою функцию-фильтр, примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create cursor tFilter (cFilter c(254))
* в курсор пишем все условия фильтрации
insert into tFilter (cFilter) values ('MyTable.Field1 = 10')
insert into tFilter (cFilter) values ('MyTable.Field2 = 20')
...
sele MyTable
set filter to SuperFilter('tFilter')
brow

func SuperFilter
lpara tcAlias
local llRet, lcPrevAlias
llRet = .T.
lcPrevAlias = alias()
sele (tcAlias)
scan
    if !eval(cFilter)
      llRet = .F.
      exit
    endif
endscan
sele (lcPrevAlias)
return llRet


Думаю суть кода понятна, дальше сам допиливай под свою задачу.

PS Вариант с генерацией строки и подстановкой ее в SET FILTER будет работать быстрее.
...
Рейтинг: 0 / 0
Последовательная фильтрация
    #37658340
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочитал мельком, так просто идея.. можно просто ввести поле фильтра (f_iltr), и проставлять метки на накопительные условия.., в конце когда бесконечный цикл накопительных условий закончится, поставить фильр по этому полю... но может я что-то не догоняю и поэтому не прав.. :-)
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Последовательная фильтрация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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