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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 19:05   #1
Di_sol
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию Как избежать дублирование данных в списке?

Здравствуйте!
Имеется список, в который по клику кнопки вносятся характеристики товара и вводится количество в один из столбцов. Как сделать так, если товар с таким id уже есть в списке, то новый элемент в список не добавлялся, а обновлялось только кол-во в уже присутствующем элементе?
получился такой код:

Private Sub buy_Click()
Dim myins, c, b, sel, x As String
Dim rst As Recordset
Dim a, d, i, t, id As Integer

c = InputBox("count", "input count")
If IsNumeric(c) And c <> 0 Then
d = spisok8.Column(11) 'element cost
b = spisok8.Column(1) element name
id = spisok8.Column(0) 'element id

For i = 0 To spisok6.ListCount - 1
If spisok6.ItemData(3) = b Then ?????
Next i

spisok6.AddItem ("" & b & ";" & d & ";" & c & ";" & id & "")
spisok6.SetFocus
spisok.ListIndex = 0
End
End If

Подскажите, что необходимо написать в цикле
Di_sol вне форума Ответить с цитированием
Старый 08.12.2011, 23:37   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Di_sol.
"..если товар с таким id уже есть .. новый элемент в список не добавлялся.."
в Вашем случае цикл должен выглядеть подобным образом:
Код:
...
For i = 0 To spisok6.ListCount - 1
    If spisok6.Column(3, i) = id Then Exit Sub
Next
...
значение Id располагается в четвертой колонке (индекс 3)
Евгений.

P.S. выкладываемый код заключайте в тэги [соde]...[/соde], для этого на панели инструментов размещена кнопка #

Последний раз редактировалось Teslenko_EA; 08.12.2011 в 23:40.
Teslenko_EA вне форума Ответить с цитированием
Старый 09.12.2011, 06:50   #3
Di_sol
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию

Спасибо, с индексами разобрался
но дело в том, что мне необходимо не просто не добавлять товар, а при совпадении - менять кол-во в уже имеющемся, то есть в цикле должно быть выражение, которое я и затрудняюсь написать!
Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
Код:
...
For i = 0 To spisok6.ListCount - 1
    If spisok6.Column(3, i) = id Then Exit Sub
Next
...
пробовал так
Код:
.... Then spisok6.Column(2, i) = spisok6.Column(2, i) + с And spisok6.Recuery
, но этот код не работает, данные в списке не обновляются!
вот в этом собственно и основная проблема.
Подскажите еще немного и работа закипит
Di_sol вне форума Ответить с цитированием
Старый 09.12.2011, 08:23   #4
Di_sol
Пользователь
 
Регистрация: 15.11.2011
Сообщений: 26
По умолчанию

Решил проблему следующим способом:
Код:
Private Sub buy_Click()
Dim myins, c, b, sel, x As String
Dim rst As Recordset
Dim a, d, i, t, id, gt As Integer
t = 0
c = InputBox("kol-vo", "input kol-vo")
If IsNumeric(c) And c <> 0 Then
    d = spisok8.Column(11)
    b = spisok8.Column(1)
    id = CInt(spisok8.Column(0))
    pole13 = pole13 + c * d
    
    For i = 0 To spisok6.ListCount - 1
      If CInt(spisok6.Column(3, i)) = id Then
        gt = CInt(spisok6.Column(2, i))
        spisok6.RemoveItem (i)
        spisok6.AddItem ("" & b & ";" & d & ";" & gt + c & ";" & id & "")
        t = t + 1
        End
      End If
    Next i
    
    If t = 0 Then
      spisok6.AddItem ("" & b & ";" & d & ";" & c & ";" & id & "")
      spisok6.SetFocus
      spisok6.ListIndex = 0
      End
    End If
 End If
End Sub
Костыль конечно, но другим способом никак не получается что-то...
Спасибо за помощь
Di_sol вне форума Ответить с цитированием
Старый 09.12.2011, 18:15   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Di_sol.
будет работать и подобный код:
Код:
Private Sub buy_Click()
Dim q!, s0$, s1$, s2$, s3$, j%, i%, v
s0 = spisok8.Column(1) & ""
s1 = spisok8.Column(11) & ""
s2 = InputBox("kol-vo", "input kol-vo")
s3 = CInt(Nz(spisok8.Column(0), 0))

If Len(s0) * Len(s1) * Len(s3) = 0 Then Exit Sub
If Not IsNumeric(s2) Or Val(s2) = 0 Then Exit Sub
With spisok6
    For i = 0 To .ListCount - 1
        If CInt(Nz(.Column(0, i), 0)) = s0 Then
            q = CDbl(.Column(3, i))
	'чтение содержимого списка
            s = .RowSource
	'массив из содержимого списка
            v = Split(s, ";")
	'индекс искомого значения в массиве
            j = i * 4 + 2 ' 4 - кол-во колонок в списке, 2-номер колонки суммирования
	'сложение значений
            v(j) = q + CDbl(s2)
	'заполнение списка измененными данными (измененным источником строк)
            .RowSource = Join(v, ";")
            .Selected(i) = True
            Exit Sub
        End If
    Next
    If Val(s3) = 0 Then Exit Sub
    .AddItem (s0 + ";" + s1 + ";" + s2 + ";" + s3)
    .Selected(.ListCount - 1) = True
End With
End Sub
Успехов Вам.
Евгений.

Последний раз редактировалось Teslenko_EA; 09.12.2011 в 18:18.
Teslenko_EA вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избежать излишнего использования :: invector Помощь студентам 2 28.09.2011 14:54
как избежать подвисания Juffin Общие вопросы Delphi 12 18.05.2011 23:41
Как избежать Selection? Мультипликатор Microsoft Office Word 10 21.06.2010 17:15
как избежать кэширования в Опере rolling PHP 3 01.12.2009 18:34
Проверка на дублирование в базе данных POPOV Помощь студентам 9 04.12.2007 18:21