Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема со строковым значением 
:(
    Опции темы
Jonnik
Дата 13.10.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Функция на VisualBasic вызывается для обработки нажатия кнопки формы в MS ACESS.
Суть функции – перенумерация операций в порядке возрастания с шагом 5.
(т.е. было 5, 7, 10, 15, 17, 20 – стало 5, 10, 15, 20, 25, 30)

Функция написана не мной, я дорабатывал эту функцию, чтобы можно было задавать пропуск в номерации
(например,  … 95, 100, 105 … – вставить разрыв на 20 между 95 и 100, чтобы получить … 95, 120, 125)

Мне необходимо сравнить номер операции в цикле с введённым номером, с которого должен начинаться разырв («Окно»).
Если делать так:
Код
if (rs.Fields("НомерОперации").Value= Str(kap)) ...

то ничего не получается, т.к. функция STR добавляет лишние пробелы в текстовое представление числа kap.
Сейчас вопрос с перенумерацией решён, я к обоим строкам применяю функцию TRIM, которая удаляет лишние пробелы. 

Пока я переделывал функцию, то заметил, что команды вида
Код
if (rs.Fields("НомерОперации").Value= Str(kap)) ...
MsgBox rs.Fields("НомерОперации").Value

обрабатываются нормально, а команды, в которых я оперирую значением «rs.Fields("НомерОперации").Value», вида:
Код
vstr = " " + rs.Fields("НомерОперации").Value 
vstr = Str(kap) + " vs " + rs.Fields("НомерОперации").Value

вызывают зависание программы. (ACESS выдаёт «песочные часы», не отвечает на команды, реагирует только на закрытие программы).

Главный вопрос: почему ACESS зависает если в функции есть манипуляции с rs.Fields("НомерОперации").Value  и подобными? В данной функции этот вопрос удалось обойти, а что делать если, подобные значения надо как-то обрабатывать?

Далее – код функции.
Код

Private Sub buNum_Click()
'    If (rs.Fields("НомерОперации").Value = "100") Then
'    If (rs.Fields("НомерОперации").Value = Str(kap)) Then
'    kap = 100
'    MsgBox ("[" + Str(kap) + "]")

y = MsgBox("Вы действительно хотите ПЕРЕНУМЕРОВАТЬ техпроцесс на данную деталь?", vbDefaultButton2 + vbQuestion + vbYesNo)
If y = vbYes Then
    k = InputBox("Введите начальный номер операции, с которой будет начинаться технология!", "Изменение шифра детали", 5)
    If (Len(k) = 0 Or IsNumeric(k) = False) Then
        MsgBox "Неверно введён номер операции!!! (Только число!)"
        Exit Sub
    End If
    ' Учёт "ОКНА"
    okn = MsgBox("Окно будем учитывать? (на свой риск)", vbDefaultButton2 + vbQuestion + vbYesNo)
    If (okn = vbYes) Then
    kap = InputBox("с какой операции делать окно? (по старой номерации)", "НАдо ещё информация", 0)
    If (Len(kap) = 0 Or IsNumeric(kap) = False) Then
        MsgBox "Неверно введён номер операции!!! (Только число!)"
        Exit Sub
    End If
    
    End If ' esli uchit. okno
    
    DoCmd.Hourglass True
    
            'vstr = "[" + Mid(Str(kap), 2) + "]"
            vstr = Trim(Str(kap))
            'non = MsgBox("len skap = [" + Len(Str(kap)) + "]", vbOKOnly)
            
            'non = MsgBox(vstr, vbOKOnly)

    
    Dim i As Long
    Dim j As Long
    Dim sst As String
    Dim rs As Recordset
    Dim rs1 As Recordset
    Dim db As Database
        Set db = CurrentDb
        Set rs = db.OpenRecordset("SELECT Операция.КодОперации, Операция.НомерОперации  FROM ТехМаршрут LEFT JOIN Операция ON ТехМаршрут.КодТехМаршрут = Операция.КодТехМаршрут WHERE (((ТехМаршрут.КодТехМаршрут) = " & [Forms]![ТехМаршрут]![КодТехМаршрут] & ")) ORDER BY Операция.НомерОперации;")
        j = rs.RecordCount
        DoCmd.SetWarnings (False)
        For i = 1 To j
            If (okn = vbYes) Then ' okno
            'MsgBox rs.Fields("НомерОперации").Value
            vstr2 = Trim(rs.Fields("НомерОперации").Value)
            'MsgBox vstr2
            'MsgBox vstr
            
            If (vstr2 = vstr) Then
            'If (rs.Fields("НомерОперации").Value = vstr) Then
            'vstr = " " + rs.Fields("НомерОперации").Value
            'If (vstr = Str(kap)) Then
             k = k + 20
             MsgBox "Найдено начало окна!"
            End If
              'If (rs.Fields("НомерОперации").Value = Str(kap)) Then k = k + 20
              'vstr = Str(kap) + " vs " + rs.Fields("НомерОперации").Value
              'MsgBox vstr
            End If ' okno
            
            sst = "UPDATE Операция SET Операция.НомерОперации = " & k & " WHERE (((Операция.КодОперации)=" & rs![КодОперации] & "));"
            DoCmd.RunSQL sst
            
            rs.MoveNext
            k = k + 5
        Next i
        DoCmd.SetWarnings (True)
        DoCmd.Hourglass False
End If 'y=vbYES....
End Sub




PM MAIL   Вверх
Akina
Дата 13.10.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Jonnik @  13.10.2008,  20:40 Найти цитируемый пост)
функция STR добавляет лишние пробелы в текстовое представление числа kap

CStr(), в отличие от Str(), не оставляет пробела на знакоместо.

Цитата(Jonnik @  13.10.2008,  20:40 Найти цитируемый пост)
аметил, что команды вида
[skipped]
обрабатываются нормально, а команды, в которых я оперирую значением «rs.Fields("НомерОперации").Value», вида:
[skipped]
вызывают зависание программы

Руками надо код писать (сорри) - это тебе не ПХП, тут надо точно соблюдать типы данных. Строка? только строковые функциию Число? только чисельные. А у тебя винегрет.

Цитата(Jonnik @  13.10.2008,  20:40 Найти цитируемый пост)
почему ACESS зависает если в функции есть манипуляции с rs.Fields("НомерОперации").Value

А какой у тебя тип этого поля? А ты что туда суёшь? а используешь как? Скажи спасибо, что у Аксесса рук нет - он тебе кроме зависа и ответить-то ничем не может.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 14.10.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



VB позволяет выполнять конкатенацию строк при помощи оператора +. Но тут, нужно быть очень внимательным, т.к. в результате можно получить сложение. Особенно учитывая тот факт, что в строках у вас числа храняться, я так предполагаю. 

Поэтому рекомендую для конкатенации строк использовать знак &. Даже если в выражении будут присутствовать типы, отличные от строк, VBA не ошибется преобразовав их к строковым автоматически.
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0983 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.