|
|
|
| Привет все.
Подскажите плиз. Есть список с мультиселектом. Отмечаю нужные строки, потом кнопкой выполняю действия. Необходимо, что бы все действия происходили с теми элементами, что выделены в списке. По каждому из выделенных в списке должен выполняться цикл. Все данные для цикла указаны в списке
Пишу так:
dim v As Variant
For Each v In Me.Список1.ItemsSelected
For i = 1 To Me.Список1.Column(2)
Forms![форма1](Список1.Column(1) & i).TOP = Forms![форма1](Список1.Column(1) & i).TOP - 10
Next i
Next v
Что самое интересное работает, но только по последнему выделенному, а надо что бы по всем выделенным в списке элементам. Что-то тут надо менять. А что не так??? | |
|
| |
|
|
|
| Судя по логике - это происходит потому, что что-то связано с setfocus. хотя не вариант, но другого что-то не... Хоть массив составляй.
А может в другой список выкидывать при отметках multiselect, а потом по тому списку
for i=1 to me.Список.listcount
далее циклы.... | |
|
| |
|
|
|
| Ну коли мультиселект никак не работает, то пробую так:
For Each v In l.ItemsSelected
If Len(Условие) = 0 Then
Me.Условие = l.ItemData(v)
Else
Me.Условие = Me.Условие & "," & l.ItemData(v)
End If
Next v
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT Настройки.Код, Настройки.Знаков, Настройки.Поле FROM Настройки WHERE (((Настройки.Код) In (" & Me.Условие & ")));")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
For i = 1 To !Знаков
Forms![Форма1](!Поле & i).TOP = Forms![Форма](!Поле & i).TOP - 10
Next i
.MoveNext
Loop
End If
End With
По идее должна работать, но не работает. Почему??? | |
|
| |
|
|
|
| Не пойму что вы хотите сделать
вот это
Forms![форма1](Список1.Column(1) & i).TOP
TOP - это свойство контрола, а не столбца в контроле
и правильно будет
Forms![форма1]!Список1.TOP
вот это
Forms![Форма1](!Поле & i)
так
Forms![Форма1]("Поле" & i)
вот это
!Знаков
вроде так
.("Знаков") или .fields(1) | |
|
| |
|
|
|
|
Необходимо, что бы все действия происходили с теми элементами, что выделены в списке.
|
выбор выделенных
With List
For i = 0 To .ListCount - 1
If .Selected(i) Then
.... действие
End If
Next i
End With
|
| |
|
| |
|
|
|
| snip - Что хочу сделать. В настоящее работает так: заполняется база, нажатием кнопки выходит форма в виде бланка, в которой строки организованы из отдельных ячеек. В них посимвольно раскидывается информация с базы. Это работает. Пользователь сам может подгонять строки под бланк. Для этого жмет кнопку "настройка", выходит форма, в которой он в списке выбирает нужную группу (строку) и кнопками смещает всю группу в разные стороны, делает наклон и сжимает-расжимает строку на форме под бланк. Настройки сохраняются в таблице "Настройки" и при следующем открытии формы та форматируется согласно последних данных. Все данные беру рекордсетом из таблицы настройки, потому и синтаксис такой. Это работает.
ХОЧУ: выбирать не по одной группе (строке), а иметь возможность проделывать эти операции с несколькими строками сразу. Проблема в том, что их нужно выделить в списке мультиселектом, (ячейки выбранных групп подсвечиваются красным цветом) сдвигать не по одной строке а по нескольким выбранным.
По одной уже работает, а как сделать по нескольку - ХЗ. не получается.
Дядя Федор, даже таким образом работает по одной строке (последней выбранной группе)
Че делать?
Уже рекорсетом пробовал, (при открытии формы именно так и форматирует форму) А тут не хочет. Вот проблема. | |
|
| |
|
|
|
| Вот проблемный кусок базы. Лучше 1 раз увидеть. http://zalil.ru/31819739 | |
|
| |
|
|
|
| Чета сколько не лазил по инету не нашел как переместить фокус внутри лист бокса
последний элемент выбирается именно из-за того что фокус находится в последней выбранной строке
пока вижу так
после нажатия кнопки рекордсет листбокса выгрузить в массив
ну а потом в зависимости от свойства selected дергать значения из массива
если надо пример то только завтра
дома офис2010 а он ваш пример открывает с большими возмущениями | |
|
| |
|
|
|
| snip, спасибо. Я вроде разобрался. Теперь убрал большие циклы, все работает через простой рекордсет.
Dim v As Variant
Dim rst As DAO.Recordset
Dim i As Integer
Me.Условие = "" ' поле на форме настройка
For Each v In Me.Список1.ItemsSelected
If Len(Условие) = 0 Then
Me.Условие = Me.Список1.ItemData(v)
Else
Me.Условие = Me.Условие & "," & Me.Список1.ItemData(v)
End If
Next v
Set rst = CurrentDb.OpenRecordset("SELECT Настройки.Код, Настройки.Знаков, Настройки.ПолеФормы FROM Настройки WHERE (((Настройки.Код) In (" & Условие & ")));")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
For i = 1 To !Знаков
Forms![Бланк больничного](!ПолеФормы & i).TOP = Forms![Бланк больничного](!ПолеФормы & i).TOP - 10
Next i
.MoveNext
Loop
End If
End With
Проблема была из-за отсутствия .MoveNext и Loop Без них работало по одному значению. Это рабочий код. Набираю изменяемые строки и одной кнопкой все двигается вверх. Сейчас проблема в обновлении рекордсетом. Раньше было все типа так:
Dim i As Integer
For i = 1 To Me.Список1.Column(2)
Forms![Бланк больничного](Список1.Column(1) & i).TOP = Forms![Бланк больничного](Список1.Column(1) & i).TOP + 1 * i
Next i
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE Настройки SET Настройки.Наклон = Настройки.Наклон+1 WHERE (((Настройки.Код)=" & Me.Список1.Column(3) & ")) ;"
Me.Наклон = Me.Наклон + 1 ' индикация на форме настройки
Выбрал в списке нужный диапазон, наклонил строку (если бланк криво отпечатан) и внес изменения в таблицу поле наклон. Также и на сдвиг строки в разные стороны.
Теперь же, если выбрать несколько строк мультиселектом, придется рекорсетом обновлять таблицу настройка.
пытаюсь так:
Set rst = CurrentDb.OpenRecordset.Update("update Настройки SET Настройки.[TOP] = Настройки.[TOP]-10 WHERE (((Настройки.Код) In (" & Условие & ")));")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
!TOP = !TOP - 10
.MoveNext
Loop
End If
End With
Жалуется на условие. Как-то вроде типа ... На форме все двигает, а в таблице как изменить в нескольких строках, которые выбрал? Ведь в каждой строке значения могут быть разными изначально, и от каждого нужно отнять 1 шаг. (в данном случае 10 пунктов) | |
|
| |
|
|
|
| for i
if selected(i) then
for j
поле.тор=поле.тор+10
k=1
next j
if k=1 then
запуск запроса на изменение
к=0
end if
next i | |
|
| |
|
|
|
| >>даже таким образом работает по одной строке (последней выбранной группе)
а что в конструкторе стоит в свойстве "Несвязное выделение"? | |
|
| |
|
|
|
| Дядя Федор, так о том и речь, что мультиселект. Все работало только по одной выбранной строке. Поставил несвязное выделение, что бы несколько строк или все сразу выбирать, ну и продолжил секс с извратом. Стоит "Со связным выбором", что бы через control или shift несколько строк выбирать можно было. Теперь с обновлением таблицы записи координат, на форме все синхронно раздвигает и двигает.
snip, попробую такой вариант. результат отпишу. Но думал как-то через рекордсет обновлять. Должно быть что-то такое. | |
|
| |
|
|
12 Кб. |
|
| примерно в этом направлении двигаться
=> | |
|
| |
|
|