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

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

Есть готовая функция, или надо программировать ручками ?
...
Рейтинг: 0 / 0
09.01.2004, 08:12
    #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
09.01.2004, 08:15
    #32371075
AlexEV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужен поиск по вхождению по базе
Блин, не посмотрел тему форума, думал, что SQL. Ну да и ладно, вдруг на будущее пригодится.
...
Рейтинг: 0 / 0
09.01.2004, 14:01
    #32371506
andrush
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужен поиск по вхождению по базе
select твои_поля from твоя_таблица where условие_поиска $ поле_в_котором_искать INTO CURSOR куда_сохранить
...
Рейтинг: 0 / 0
09.01.2004, 19:15
    #32371985
_Serghei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужен поиск по вхождению по базе
Непонятно, какое "условие" и зачем «INTO CURSOR куда_сохранить»

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

Примечание: table1 - твой курсор
usl - условие поиска(что ты ищешь)
field - имя поля, в котором ты ищешь
...
Рейтинг: 0 / 0
09.01.2004, 21:22
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / нужен поиск по вхождению по базе / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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