powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / нужен поиск по вхождению по базе
7 сообщений из 7, страница 1 из 1
нужен поиск по вхождению по базе
    #32371010
_Serghei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите,

нужен поиск по вхождению по базе (текстовое поле).
База открыта в Grid-e,

Есть готовая функция, или надо программировать ручками ?
...
Рейтинг: 0 / 0
нужен поиск по вхождению по базе
    #32371071
AlexEV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй этот код. Я его взял из рассылки. У меня работает без проблем
Код: 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.
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.
declare @s varchar( 1000 )
 --Здесь собственно текст который нужно найти,
 
 --кстати работает и с числами
 
set @s='t35779'

SET NOCOUNT ON
DECLARE @TableID int, @TableName sysname
DECLARE @ColumnName sysname, @Type sysname, @IsNullable int
DECLARE @Columns varchar( 8000 ), @Where varchar( 8000 )
DECLARE @MarkNum bit

 -- таблица, содержащая результаты поиска
 
CREATE TABLE #Result (TableName sysname, String ntext)

 -- признак того, искать ли среди числовых значений
 
SET @MarkNum = IsNumeric(@s)

 -- искать подстроку
 
SET @s='%' + @s + '%'

 -- курсор по всем пользовательским таблицам базы данных
 
DECLARE #Table CURSOR LOCAL FAST_FORWARD FOR
select id, name
from sysobjects
where status> 0  and xtype='U'

OPEN #Table
WHILE @@ERROR= 0 
BEGIN
  FETCH NEXT FROM #Table INTO @TableID, @TableName
  IF @@FETCH_STATUS<> 0  BREAK

 -- пропустить таблицы, к которым нет доступа
 
  if IS_SRVROLEMEMBER('dbcreator')= 0  AND
    not EXISTS(select *
    from INFORMATION_SCHEMA.TABLE_PRIVILEGES a
    join sysusers b on b.name=a.GRANTEE and b.issqlrole= 1 
    join sysusers c on c.gid=b.gid and c.issqlrole= 0  and c.name=USER_NAME()
    where a.PRIVILEGE_TYPE='SELECT' and a.TABLE_NAME=@TableName
    ) CONTINUE

  SET @Columns=''

 -- курсор по всем колонкам текущей таблицы
 
  DECLARE #Column CURSOR LOCAL FAST_FORWARD FOR
  select a.name, b.name, a.isnullable
  from syscolumns a
  join systypes b on b.xtype=a.xtype and b.xusertype< 256 
  where id=@TableID
  order by colid

  OPEN #Column
  WHILE @@ERROR= 0 
  BEGIN
    FETCH NEXT FROM #Column INTO @ColumnName, @Type, @IsNullable
    IF @@FETCH_STATUS<> 0  BREAK

    if (@Type <> 'image' and @Type <> 'bit' and CHARINDEX('text', @Type) =  0 )
      and (@MarkNum= 1  or CHARINDEX('char', @Type) >  0  or CHARINDEX('datetime', @Type) >  0 )
    begin
      if @IsNullable =  1  SET @Columns = @Columns + 'isnull('

      if (CHARINDEX('char', @Type) >  0 )
        SET @Columns = @Columns + @ColumnName
      else if (CHARINDEX('datetime', @Type) >  0 )
        SET @Columns = @Columns + 'convert(varchar,' + @ColumnName + ',104)'
      else
        SET @Columns = @Columns + 'cast(' + @ColumnName + ' as varchar)'

      if @IsNullable =  1 
        SET @Columns = @Columns + ','''')+'' | ''+'
      else
        SET @Columns = @Columns + '+'' | ''+'
    end
  END
  CLOSE #Column
  DEALLOCATE #Column


  IF @Columns <> ''
  BEGIN
    SET @Columns = LEFT(@Columns, LEN(@Columns)- 7 )
    SET @Where = @Columns + ' like ''' + @s + ''''

    exec('insert #Result
select ''' + @TableName + ''',' + @Columns + '
from ' + @TableName + '
where ' + @Where)
  END
END
CLOSE #Table
DEALLOCATE #Table

SET NOCOUNT OFF

SELECT * FROM #Result

DROP TABLE #Result
...
Рейтинг: 0 / 0
нужен поиск по вхождению по базе
    #32371075
AlexEV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, не посмотрел тему форума, думал, что SQL. Ну да и ладно, вдруг на будущее пригодится.
...
Рейтинг: 0 / 0
нужен поиск по вхождению по базе
    #32371506
andrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select твои_поля from твоя_таблица where условие_поиска $ поле_в_котором_искать INTO CURSOR куда_сохранить
...
Рейтинг: 0 / 0
нужен поиск по вхождению по базе
    #32371985
_Serghei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятно, какое "условие" и зачем «INTO CURSOR куда_сохранить»

Надо при воде букв – искать водимое слово и CURSOR чтобы становился на это слово.
...
Рейтинг: 0 / 0
нужен поиск по вхождению по базе
    #32372051
andrush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон, не обратил внимание что у тебя грид.
select table1
locate for usl$field
if found()
нашли и следовательно рефреш грида
else
какие-то действия
endif

Примечание: table1 - твой курсор
usl - условие поиска(что ты ищешь)
field - имя поля, в котором ты ищешь
...
Рейтинг: 0 / 0
нужен поиск по вхождению по базе
    #32372052
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На www.foxclub.ru в "Решениях" было несколько подобных классов.
Один из возможных вариантов - включаешь на форма свойство KeyPreview=.t. и в событии KeyPress формы анализируешь набраные буквы и ищещ строку по таблице, если нашел - устанавливаешь указатель и рефрешиш свой Грид.
Я предпочитаю сделать TextBox в InterectivChange которого ищем по таблице Value этого TextBox-а. Если нашли - устанавливаем указатель и обновляем грид, если нет - возврашаем указатель на свое место.
Чтото вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT s_opr

m_serch=AllTrim(This.Value)
ThisForm.RecNo=RecNo()

IF .not.Empty(m_serch)
   SET ORDER TO TAG lognam IN s_opr
   IF Seek(Crea_log_nam(m_serch), 's_opr')
      SET ORDER TO TAG nom IN s_opr
      GO RecNo()
      ThisForm.fGrid.Refresh
   ELSE
      SET ORDER TO TAG nom IN s_opr
  	  This.Value=Left(m_serch, Len(m_serch)- 1 )
      This.SelStart=Len(AllTrim(This.Value))
   	  This.Refresh
   	  IF ThisForm.RecNo > RecCount()
   	     GO bott
   	  ELSE
	     GO ThisForm.RecNo
      ENDIF
   ENDIF
ENDIF
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / нужен поиск по вхождению по базе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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