Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2017, 10:30   #1
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию Access.VBA Изменение данных по условию

Доброго времени суток

Хочу сделать программку, которая добавляла бы "0" в выбранное поле выбранной таблицы. Но, не во все записи поля, а только в те, где длина записи - 5 символов (т.к. нужная длина - 6 символов и нуля может не хватать ошибочно).

Опираясь на свои колоссальные(сарказм) познания VBA, я написал код:
Код:
Sub ZeroAtStart()
Dim tb                         ' таблица
Dim fd                         ' поле
Dim vf As String               ' значение поля
Dim rs As DAO.Recordset        ' рекордсет

tb = Forms![Zero].[Поле0].Value
fd = Forms![Zero].[Поле4].Value

Set rs = CurrentDb.OpenRecordset("SELECT [" & fd & "] FROM [" & tb & "]")

vf = Len(Trim(rs.Fields("fd").Value))

If vf = 5 Then
CurrentDb.Execute "UPDATE [" & tb & "] SET [" & fd & "] = 0 & [" & fd & "]"
End If

rs.Close: Set rs = Nothing

End Sub
Ошибка "элемент не обнаружен в данном семействе" в строке:
Код:
vf = Len(Trim(rs.Fields("fd").Value))
Стараюсь искать инфу в интернете - пока безуспешно

P.S. Формат БД - 2002-2003 Access
Библиотеки:
Visual Basic For Applications
Microsoft Access 14.0 Object Library
OLE Automation
Microsoft Office 14.0 Access database engine Object Library
Microsoft ActiveX Data Objects 2.1 Library
Microsoft Word 14.0 Object Library
Microsoft Office 14.0 Object Library
Ethex вне форума Ответить с цитированием
Старый 18.05.2017, 10:38   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Код:
vf = Len(Trim(rs.Fields(fd).Value))
как вариант, ваш код попытайтесь заменить на
Код:
Sub ZeroAtStart()
Dim tb                         ' таблица
Dim fd                         ' поле
tb = Forms![Zero].[Поле0].Value
fd = Forms![Zero].[Поле4].Value
CurrentDb.Execute "UPDATE [" & tb & "] SET [" & fd & "] = Format([" & fd & "],""000000"")"
End Sub
upd.
имхо, Ваш подход неверен. Так как если rs будет больше 1 записи, вы будете сравнивать длину первой записи
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 18.05.2017 в 10:55.
Aleksandr H. вне форума Ответить с цитированием
Старый 18.05.2017, 10:38   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

у вас в fd находится название поля?

тогда так попробуйте:
Код:
vf = Len(Trim(rs.Fields(fd).Value))
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.05.2017, 11:17   #4
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию

Aleksandr H., Serge_Bliznykov спасибо, ошибка пропала.

Однако программа работает не так, как нужно. Начал тестировать на табличке.
Вставляет ноль, если первая запись поля из 5 символов, иначе ничего не происходит. И, вставляет в каждую запись поля, а не только туда, где запись из пяти символов
В коде чего-то не хватает

upd
Aleksandr H., действительно. Сейчас опробую предложенный вами способ

Последний раз редактировалось Ethex; 18.05.2017 в 11:22.
Ethex вне форума Ответить с цитированием
Старый 18.05.2017, 12:03   #5
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию

Aleksandr H. попробовал ваш вариант, изменений в таблице не происходит

По поводу
Цитата:
Так как если rs будет больше 1 записи, вы будете сравнивать длину первой записи
А что если...?
Код:
For i = 1 To rs.Record.Count
vf = Len(Trim(rs.Fields(fd).Value))
If vf = 5 Then
CurrentDb.Execute "UPDATE [" & tb & "] SET [" & fd & "] = 0 & [" & fd & "]"
End If
End For
Не, не то

Последний раз редактировалось Ethex; 18.05.2017 в 12:17.
Ethex вне форума Ответить с цитированием
Старый 18.05.2017, 12:57   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Ethex Посмотреть сообщение
попробовал ваш вариант, изменений в таблице не происходит
странно, у меня меняло
ATT.jpg

Цитата:
Сообщение от Ethex Посмотреть сообщение
А что если...?
Неа.
Вариант2:
Код:
    Sub af()
    Dim tb, fd
    tb = "Таблица1"
    fd = "F1"
    Dim vf As Byte               ' длина поля
    Dim rs As DAO.Recordset        ' рекордсет
    
    Set rs = CurrentDb.OpenRecordset("SELECT [" & fd & "] FROM [" & tb & "]")
    rs.MoveLast
    rs.MoveFirst
    While Not rs.EOF
        vf = Len(Trim(rs.Fields(fd).Value))
        If vf = 5 Then
            rs.Edit
            rs.Fields(fd) = "0" & rs.Fields(fd).Value
            rs.Update
        End If
        rs.MoveNext
    Wend
End Sub
и о5 вариант через Format
Код:
Sub afOrmat()
    Dim tb, fd
    tb = "Таблица1"
    fd = "F1"
    Dim rs As DAO.Recordset        ' рекордсет
    Set rs = CurrentDb.OpenRecordset("SELECT [" & fd & "] FROM [" & tb & "]")
    rs.MoveLast
    rs.MoveFirst
    While Not rs.EOF
        rs.Edit
        rs.Fields(fd) = Format(rs.Fields(fd).Value, "000000")
        rs.Update
        rs.MoveNext
    Wend
End Sub
кстати, в вашем коде
Код:
Dim vf As String               ' значение поля
vf = Len(Trim(rs.Fields("fd").Value))
If vf = 5 Then
не смущает сравнение String с Integer?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 18.05.2017 в 13:17.
Aleksandr H. вне форума Ответить с цитированием
Старый 18.05.2017, 20:43   #7
Ethex
Пользователь
 
Регистрация: 26.04.2017
Сообщений: 86
По умолчанию

Aleksandr H.
Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Вариант2:
Сработал, спасибо большое. Варианты с Format записал в тетрадь, потестирую как время будет, сейчас другие задачи передо мной поставили.

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
не смущает сравнение String с Integer?
Хотел было ответить, что ранее в других модулях сравнивал длину текстовой строки с числом, но увидел, что в тех случаях она не была объявлена как строковая переменная
Ethex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA, Access, Импорт данных Ethex Помощь студентам 5 05.05.2017 22:43
VBA, Access, Размножение данных Ethex Microsoft Office Access 13 04.05.2017 23:03
Изменение диапазона данных точечной диаграммы через переменные VBA ymnuhj Microsoft Office Excel 3 05.05.2016 18:59
Реализовать возможность поиска по заданному условию по одной из таблиц БД (есть программа Delphi база данных Access) carrie bradshaw Помощь студентам 3 27.03.2014 22:20
Изменение данных в таблице access AD_min БД в Delphi 2 27.10.2008 12:23