powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как завести числовое поле типа счетчик?
41 сообщений из 41, показаны все 2 страниц
Как завести числовое поле типа счетчик?
    #32522859
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть поле "адрес".
Есть таблица с двумя полями "№адреса" и "адрес".
Пользователь вводит адрес и соответствующий товар по этому адресу.
Мне нужно создать счетчик, который бы являлся идентификатором адреса.
Т.е. если адрес уже есть в базе данных, то у адреса нет приращения счетчика и номер адреса остается константой, а если адрес изменился, то значение счетчика приращается на единицу.
Как это сделать?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32522869
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А адрес заносится в эту же таблицу?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32523008
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, "адрес" и "счетчик адреса" находятся в одной и той же таблице.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32523070
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
То есть в одной таблице сидят примерно такие данные:

1 адрес1 товар1
2 адрес2 товар8
1 адрес1 товар4

Так?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32523656
Partner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может стоит использовать поле со списком для вода адреса; свойство "ограничиться списком" - да, если адреса нет в списке - написать процедуру добавления в таблицу нового адреса для события 'отсутствие в списке'.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32523665
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но здесь очень нехорошо, что в одной таблице сидят два поля, дублирующих друг друга. По-нормальному надо держать в отдельной таблице адреса и коды (по одному разу), а в обсуждаемую таблицу заносить только код.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32524770
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВС:
>То есть в одной таблице сидят примерно такие данные:
>1 адрес1 товар1
>2 адрес2 товар8
>1 адрес1 товар4
>Так?
Да, так.
>Но здесь очень нехорошо, что в одной таблице сидят два поля,
>дублирующих друг друга.
Конечно, не очень правильно, но база уже написана, поэтому изменять все - слишком долго.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32524841
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ну, тогда в общих чертах так:

dim n as variant
n=dlookup("addresscode","mytable","address=...")
if isnull(n) then n=dmax("addresscode","mytable")+1

и плюс обработка на случай, когда два юзера попытаются что-то сделать одновременно.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529527
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А без dlookup нельзя обойтись, а то он как-то тормозит процесс?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529530
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Можно написать свою функцию, которая будет работать точно так же.

function MyDLookup(s1 as string,s2 as string,s3 as string)
with currentdb.openrecordset(s2,dbopendynaset,dbreadonly)
.findfirst s3
if not .nomatch then MyDLookup=.fields(s1)
.close
end with
end function

плюс обработка ошибок.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529535
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, мысль ясна, а обработчик ошибок на что надо ставить и как он будет выглядеть?
(Для базы mdb, многопользовательской, Ac97)
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529577
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SORRY, а что надо писать вместо ...
Код: plaintext
n=dlookup("addresscode","mytable","address=...")
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529593
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Обработчик ошибок можно просто On Error Resume Next. Если будет ошибка во входных параметрах, то будет возвращен Null.

Теперь насчет n=dlookup("addresscode","mytable","address=..."):

addresscode - имя поля, в котором сидит код адреса
mytable - имя таблицы
address - имя поля, в котором сидит сам адрес
... - введенный адрес
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529599
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Я все так и написал, Access говорит "Ошибка синтаксиса", ругается на
n=dlookup("addresscode","mytable", "address=..." )
Пишу этот код на текущую запись.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529601
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Можно посмотреть на код?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529602
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... надо понимать как нужный тебе кусок Where + см хэлп на dlookup
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529603
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Почему where?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529614
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код:
Код: plaintext
1.
2.
Dim n As Variant
n = DLookup("поле_номер_магазина", "тбл_адрес", "поле_адрес=...")
If IsNull(n) Then n = DMax("поле_номер_магазина", "тбл_адрес") +  1 
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529617
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай - Access97.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529621
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, аргумент условие часто является эквивалентом предложения WHERE инструкции SQL, но без ключевого слова WHERE. Если аргумент условие опущен, DLookup выполняет


Функция DLookup

См. также Пример



Функция DLookup возвращает значение конкретного поля в указанном наборе (подмножестве) записей. Функцию DLookup используют в программах на Visual Basic, макросах, в выражениях в запросах, а также для определения вычисляемого элемента управления в форме или отчете.
Допускается использование функции DLookup для вывода значения поля в случае, когда это поле не принадлежит к базовому источнику записей формы или отчета. Предположим, например, что базовой таблицей формы является таблица «Заказано». В форме выводятся поля «КодЗаказа», «КодТовара», «Цена», «Количество» и «Скидка». Однако поле «Марка» находится в другой таблице, «Товары». В этом случае функция DLookup позволяет создать в этой форме вычисляемое поле, в котором будет выводиться значение поля «Марка».

Синтаксис

DLookup(выражение, набор[, условие])



Функция DLookup использует следующие аргументы.

Аргументы Описание

выражение Выражение, определяющее нужное поле. Данный аргумент может задаваться строковым выражением, определяющим поле в таблице или запросе, или представлять выражение, задающее выполнение вычислений над данными, содержащимися в поле. Допускается использование в аргументе выражение имени поля в таблице или элемента управления в форме, константы, а также встроенной или определяемой пользователем функции. Не допускается использование в аргументе выражение других статистических функций по подмножеству или статистических функций SQL.
набор Строковое выражение, определяющее набор записей, образующих подмножество. Может представлять имя таблицы или запроса.
условие Необязательное строковое выражение, ограничивающее диапазон данных, в которых производится поиск значений. Например, аргумент условие часто является эквивалентом предложения WHERE инструкции SQL, но без ключевого слова WHERE. Если аргумент условие опущен, DLookup выполняет действия над полем, заданным в аргументе выражение, для всего набора записей. Любое поле, указанное в аргументе условие, должно принадлежать подмножеству, заданному аргументом набор; в противном случае функция DLookup возвращает значение Null.


Дополнительные сведения

DLookup возвращает значение поля или выражения, определенного в аргументе выражение. Выбираемые в таблице или запросе значения принадлежат подмножеству записей, определяемых аргументом набор и удовлетворяющих условиям отбора, задаваемым в аргументе условие.
Если ни одна из записей набора не удовлетворяет аргументу условие или набор не содержит записей, функция DLookup возвращает значение Null.
Если указанным условиям удовлетворят несколько полей, DLookup возвращает значение первого найденного поля. Рекомендуется указывать условия, обеспечивающие уникальность значения, возвращаемого функцией DLookup. Одним из способов обеспечения уникальности возвращаемых значений является указание условий для ключевого поля, такого как поле «КодСотрудника» в следующем примере:

Dim varX As Variant
varX = DLookup("[Фамилия]", "Сотрудники", "[КодСотрудника] = 1")



При любом использовании функции DLookup в макросе или в модуле, в выражении в запросе или в вычисляемом элементе управления необходимо обеспечить правильное составление аргумента условие.

Функция DLookup может быть включена в строку «Условие отбора» бланка запроса, в выражение для вычисляемого поля, а также в строку Обновление запроса запроса на обновление.

Допускается использование функции DLookup в вычисляемом элементе управления в форме или отчете в случае, когда поле, для которого проводится поиск значения, не принадлежит к базовому источнику записей формы. Например, предположим, что в форме «Заказы» создано поле с именем «КодТовара», в котором выводится значение поля «КодТовара» из таблицы «Заказы», и что требуется одновременно вывести значение поля «Марка» из таблицы «Товары», соответствующее выведенному коду. Для этого следует создать в форме другое поле и ввести для него следующее выражение в ячейку свойства Данные (ControlSource).

=DLookup("[Марка]", "Товары", "[КодТовара] =" & Forms![Заказы]!КодТовара)



Советы

• Хотя функция DLookup позволят проводить поиск значений во внешней таблице, обычно более эффективным приемом оказывается создание запроса, содержащего все необходимые поля, с последующим созданием формы или отчета на базе этого запроса.
• Поиск значений во внешней таблице может быть также проведен с помощью мастера подстановок.



Примечание. Несохраненные изменения записей, входящих в набор, не учитываются данной функцией. Если требуется обеспечить учет в функции DLookup измененных значений, необходимо сначала сохранить изменения с помощью команды Сохранить запись из меню Записи, перевести фокус на другу запись или вызвать метод Update.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529633
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Студент, а почему вместо ... ничего не подставлено???
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529635
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч 13:05 ???
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529637
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А. То есть многоточие надо понимать как кусок where. Дошло. Да, студент этого не сделал.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529643
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, спасибо, дошло.
А что примерно должно быть в WHERE?
Я тоже не понял Саныч 13:05?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529648
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Это был вопрос к Shuhard'у. Но он уже отменен.

Насчет что должно быть вместо ... - см. 12:51.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529766
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не получается вместо ...
написать так, чтобы работало, я так примерно предполагаю, что надо написать что-то вроде CurrentRecord, но только как это написать не знаю, помогите, голова совсем не соображает.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529773
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я в 12:51 писал:... - введенный адрес
Каким образом пользователь его вводит и в какой переменной его можно взять, мне отсюда не видно.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529803
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне отсюда не видно
А что надо сделать, чтобы стало видно?
Ну не получается у меня, честное слово.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529804
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Можно протянуть оптический кабель в Тель-Авив...
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32529810
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32531491
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok. Я получил в "n" значение поля "№адреса".
А как теперь это значение записать в таблицу "тбл_адрес"?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32531494
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если это та таблица, а которой тут все время шла речь, то:

1. Получаем номер кода так, как я написал в посте от 19 май 04, 19:58.

2. Заносим в таблицу не знаю как - это зависит от задачи. Например, через рекордсет и AddNew.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32531497
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Да.
2. >Заносим в таблицу не знаю как - это зависит от задачи.
Т.е. зависит от задачи ? ? ?
Задача - занести данные в таблицу в поле для текущего адреса.
Как именно это лучше сделать?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32531498
Фотография Shuhard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim MyDb As Database
Dim Sql_String As String
Dim TestTable As Recordset
Set MyDb = CurrentDb
    Sql_String = "Select * From Твоя_Таблица Where Твой_ID = " & Твой_Контол
    Set TestTable = MyDb.OpenRecordset(Sql_String)
    With TestTable
       .Edit
       ![Твое_Поле] = Твои_данные
       .Update
    End With
 TestTable.Close
 Set MyDb=Nothing
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32531505
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Студент, заносить данные в таблицу можно многими разными способами. Ты ведь на Аксессе уже год, если не ошибаюсь? Ну так мог бы обратить внимание.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32531511
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>заносить данные в таблицу можно многими разными способами.
Да, я это знаю, поэтому и спросил какой из способов DAO наиболее оптимальный.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32533588
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем большое !
Написал следующий код:
на AfterApdate формы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim f As Variant
    f = MyDLookup("ад_номер_адреса", "тбл_адрес", "ад_адрес='" & Me.ад_адрес & "'")
    If IsNull(f) Then f = DMax("ад_номер_адреса", "тбл_адрес") +  1 

Dim MyDb As Database
Dim Sql_String As String
Dim TestTable As Recordset
Set MyDb = CurrentDb
    Sql_String = "Select * From тбл_адрес Where ад_код_адреса = " & Me.ад_код_адреса
    Set TestTable = MyDb.OpenRecordset(Sql_String)
    With TestTable
       .Edit
       ![ад_номер_адреса] = f
       .Update
    End With
 TestTable.Close
 Set MyDb = Nothing
Все работает.
Но, при многопользовательской работе mdb при одновременном обращении к полю "ад_номер_адреса", бывают сбои в нумерации.
Т.е. например ввожу адрес Кукуевка,
и для нее получаю, при многопользовательской работе:
Код: plaintext
1.
2.
3.
4.
5.
6.
Адрес            №адреса
Кукуевка         1 
Кукуевка         1 
Кукуевка         2 
Кукуевка         1  
Кукуевка         1 
Кукуевка         3 
Как этого можно избежать не прибегая к пессиместической блокировке, т.е. какое событие надо перехватить.
Или как с этим можно бороться?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32533589
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Именно об этом я предупреждал в посте от 19 май 04, 19:58. Похоже, что блокировка тут будет надежнее всего...
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32533590
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению блокировка не подойдет.
Т.е. здесь чтобы работало можно поставить только пессимистическую блокировку, но пользователей это не устроит.
Не-а.
Это что же получится, что один пользователь вводит информацию, а все остальные его ждут?
А возможно ли какое-то другое решение.
Я не знаю, может какая-то промежуточная таблица обмена данными спасет?
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32533591
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Боюсь, что не получится. Два человека одновременно заполняют одну таблицу. И один должен знать, что сделал другой. А он не может знать, потому что тот еще не сделал.
...
Рейтинг: 0 / 0
Как завести числовое поле типа счетчик?
    #32533593
Фотография Gyslik.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как завести числовое поле типа счетчик?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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