Ваш вариант алгоритма

sander1
Дата: 28.09.2005 12:57:25
Всем добрый день. Есть следующий вопрос: как бы вы реализовали на бейсике т.н. алгоритм "отсутствия присутствия?" (т.е. алгоритм по проверке, присутствует ли некоторый элемент в заданном множестве).

По моим представлениям, "самый красивый вариант" выглядел бы так (на примере проверки, есть ли таблица с заданным именем в базе):

Public Function TableID(TableName As String) As Integer
TableID = 0
While (TableID <= CurrentDb.TableDefs.Count - 1) And (CurrentDb.TableDefs(TableID).Name <> TableName)
    TableID = TableID + 1
Wend
TableID = IIf(TableID = CurrentDb.TableDefs.Count, 0, TableID)
End Function

Проблема в следующем. На другом языке этот алгоритм сработал бы отлично, но в бейсике не работает, т.к. второе условие в while проверяется даже при невыполнении первого, и появляется ошибка об отсутствующем элементе в семействе.

Как бы Вы реализовали данную проверку?

P.S. Интересует не решение этой конкретной задачи, а "красивый" с вашей точки зрения алгоритм. Спасибо :)
Shark
Дата: 28.09.2005 13:00:25
Че просют не понял но может это

Если 1 То Если 2 То НиФигаСебе
Rivkin Dmitry
Дата: 28.09.2005 13:21:58
В Аксе нет смысла давать индекс таблице. Проверить есть ли такая таблица, на мой взгляд проще всего если напрямую обратиться к ней. Если она существует, получаем положительный ответ, в противном случае, процедура упадет.

Function ExistsTable(db As DAO.Database, nmt) As Boolean
On Error GoTo err_ExistsTable
    
   Dim td As DAO.TableDef: Set td = db.TableDefs(nmt)
 
   ExistsTable = True

exit_ExistsTable:
    Exit Function

err_ExistsTable:
    Resume exit_ExistsTable

End Function
Rivkin Dmitry
Дата: 28.09.2005 13:27:47
Public Function TableID(TableName As String) As Integer
Dim  i As Integer

For i = 0 To CurrentDb.TableDefs.Count - 1
    If CurrentDb.TableDefs(i).Name = TableName Then
        TableID = i
        Exit For
    Endif
Next
End Function
sander1
Дата: 28.09.2005 13:29:24
Rivkin Dmitry
В Аксе нет смысла давать индекс таблице. Проверить есть ли такая таблица, на мой взгляд проще всего если напрямую обратиться к ней.


Спасибо за код, приму к сведению такой вариант, но повторюсь: меня интересовала больше не реализация, а вариант алгоритма поиска
sander1
Дата: 28.09.2005 13:30:23
Rivkin Dmitry
Public Function TableID(TableName As String) As Integer
Dim  i As Integer

For i = 0 To CurrentDb.TableDefs.Count - 1
    If CurrentDb.TableDefs(i).Name = TableName Then
        TableID = i
        Exit For
    Endif
Next
End Function



Ага, вот это :)
Rivkin Dmitry
Дата: 28.09.2005 13:32:29
Извиняюсь, последний вариант неверен, т.к. вернет 0 если таблица не существует. Лучше так:

Public Function TableID(TableName As String) As Integer
Dim  i As Integer

TableID = -1
For i = 0 To CurrentDb.TableDefs.Count - 1
    If CurrentDb.TableDefs(i).Name = TableName Then
        TableID = i
        Exit For
    Endif
Next
End Function

Но нужно помнить, что -1 означает отсутствие таблицы, а любая другая цифра вернет как бы номер таблицы в коллекции. Что достаточно бессмысленно. Лучше все-же вариант с да/нет
eGorkaBy
Дата: 28.09.2005 13:34:27
Public Function TableID(TableName As String) As long
dim i as long
for each td in CurrentDb.TableDefs
i = i + 1
if strcomp(td.Name,TableName)=0 then
TableID=i
exit function
endif
next
End Function
LeonM
Дата: 28.09.2005 13:42:14
Public Function InHand(tname) As Boolean
    Dim td As TableDef
    On Error GoTo notinhand
    InHand = False
    Set td = CurrentDb.TableDefs(tname)
    InHand = True
notinhand:
End Function