Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Циклы
 
 автор: Гоблин   (05.10.2011 в 21:18)   личное сообщение
 
 

Привет все.
Подскажите плиз. Есть список с мультиселектом. Отмечаю нужные строки, потом кнопкой выполняю действия. Необходимо, что бы все действия происходили с теми элементами, что выделены в списке. По каждому из выделенных в списке должен выполняться цикл. Все данные для цикла указаны в списке
Пишу так:
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

Что самое интересное работает, но только по последнему выделенному, а надо что бы по всем выделенным в списке элементам. Что-то тут надо менять. А что не так???

  Ответить  
 
 автор: Гоблин   (05.10.2011 в 22:00)   личное сообщение
 
 

Судя по логике - это происходит потому, что что-то связано с setfocus. хотя не вариант, но другого что-то не... Хоть массив составляй.
А может в другой список выкидывать при отметках multiselect, а потом по тому списку
for i=1 to me.Список.listcount
далее циклы....

  Ответить  
 
 автор: Гоблин   (05.10.2011 в 23:13)   личное сообщение
 
 

Ну коли мультиселект никак не работает, то пробую так:

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

По идее должна работать, но не работает. Почему???

  Ответить  
 
 автор: snipe   (06.10.2011 в 07:34)   личное сообщение
 
 

Не пойму что вы хотите сделать

вот это
Forms![форма1](Список1.Column(1) & i).TOP
TOP - это свойство контрола, а не столбца в контроле
и правильно будет
Forms![форма1]!Список1.TOP

вот это
Forms![Форма1](!Поле & i)
так
Forms![Форма1]("Поле" & i)

вот это
!Знаков
вроде так
.("Знаков") или .fields(1)

  Ответить  
 
 автор: Дядя Федор   (06.10.2011 в 08:08)   личное сообщение
 
 


Необходимо, что бы все действия происходили с теми элементами, что выделены в списке.


выбор выделенных

With List
    For i = 0 To .ListCount - 1

            If .Selected(i) Then
                .... действие
            End If

    Next i

End With

  Ответить  
 
 автор: Гоблин   (06.10.2011 в 15:43)   личное сообщение
 
 

snip - Что хочу сделать. В настоящее работает так: заполняется база, нажатием кнопки выходит форма в виде бланка, в которой строки организованы из отдельных ячеек. В них посимвольно раскидывается информация с базы. Это работает. Пользователь сам может подгонять строки под бланк. Для этого жмет кнопку "настройка", выходит форма, в которой он в списке выбирает нужную группу (строку) и кнопками смещает всю группу в разные стороны, делает наклон и сжимает-расжимает строку на форме под бланк. Настройки сохраняются в таблице "Настройки" и при следующем открытии формы та форматируется согласно последних данных. Все данные беру рекордсетом из таблицы настройки, потому и синтаксис такой. Это работает.
ХОЧУ: выбирать не по одной группе (строке), а иметь возможность проделывать эти операции с несколькими строками сразу. Проблема в том, что их нужно выделить в списке мультиселектом, (ячейки выбранных групп подсвечиваются красным цветом) сдвигать не по одной строке а по нескольким выбранным.
По одной уже работает, а как сделать по нескольку - ХЗ. не получается.

Дядя Федор, даже таким образом работает по одной строке (последней выбранной группе)
Че делать?
Уже рекорсетом пробовал, (при открытии формы именно так и форматирует форму) А тут не хочет. Вот проблема.

  Ответить  
 
 автор: Гоблин   (06.10.2011 в 15:54)   личное сообщение
 
 

Вот проблемный кусок базы. Лучше 1 раз увидеть. http://zalil.ru/31819739

  Ответить  
 
 автор: snipe   (06.10.2011 в 20:54)   личное сообщение
 
 

Чета сколько не лазил по инету не нашел как переместить фокус внутри лист бокса
последний элемент выбирается именно из-за того что фокус находится в последней выбранной строке

пока вижу так
после нажатия кнопки рекордсет листбокса выгрузить в массив
ну а потом в зависимости от свойства selected дергать значения из массива

если надо пример то только завтра
дома офис2010 а он ваш пример открывает с большими возмущениями

  Ответить  
 
 автор: Гоблин   (06.10.2011 в 22:36)   личное сообщение
 
 

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 пунктов)

  Ответить  
 
 автор: snipe   (07.10.2011 в 04:22)   личное сообщение
 
 

for i
if selected(i) then
for j
поле.тор=поле.тор+10
k=1
next j
if k=1 then
запуск запроса на изменение
к=0
end if
next i

  Ответить  
 
 автор: Дядя Федор   (07.10.2011 в 07:51)   личное сообщение
 
 

>>даже таким образом работает по одной строке (последней выбранной группе)
а что в конструкторе стоит в свойстве "Несвязное выделение"?

  Ответить  
 
 автор: Гоблин   (07.10.2011 в 10:39)   личное сообщение
 
 

Дядя Федор, так о том и речь, что мультиселект. Все работало только по одной выбранной строке. Поставил несвязное выделение, что бы несколько строк или все сразу выбирать, ну и продолжил секс с извратом. Стоит "Со связным выбором", что бы через control или shift несколько строк выбирать можно было. Теперь с обновлением таблицы записи координат, на форме все синхронно раздвигает и двигает.

snip, попробую такой вариант. результат отпишу. Но думал как-то через рекордсет обновлять. Должно быть что-то такое.

  Ответить  
 
 автор: snipe   (07.10.2011 в 10:58)   личное сообщение
 
 

Можно и через рекордсет

  Ответить  
 
 автор: snipe   (07.10.2011 в 11:17)   личное сообщение
12 Кб.
 
 

примерно в этом направлении двигаться
=>

  Ответить  
 
 автор: Дядя Федор   (07.10.2011 в 12:52)   личное сообщение
 
 

Поставь "Простой"

  Ответить  
 
 автор: Гоблин   (07.10.2011 в 20:03)   личное сообщение
 
 

Все заработало! Теперь все идет по одной структуре через рекордсет по таблице настроек. Типа как код по растяжке строки (нескольких строк) из n знаков.

Dim rst As DAO.Recordset
Dim i As Integer
DoCmd.SetWarnings False
Set rst = CurrentDb.OpenRecordset("SELECT Настройки.Код, Настройки.Ширина, Настройки.Знаков, Настройки.ПолеФормы FROM Настройки WHERE (((Настройки.Код) In (" & Условие & ")));")
With rst
If .RecordCount <> 0 Then
Do While Not .EOF
For i = 1 To !Знаков
Forms![Бланк больничного](!ПолеФормы & i).Width = Forms![Бланк больничного](!ПолеФормы & i).Width - 1
Forms![Бланк больничного](!ПолеФормы & i).left = Forms![Бланк больничного](!ПолеФормы & i).left - 1 * (i - 1)
Next i
.MoveNext
Loop
End If
End With
DoCmd.RunSQL "UPDATE Настройки SET Настройки.[Ширина] = [Ширина]-1 WHERE (((Настройки.Код) In (" & Условие & ")));"
Аналогично и по движению в разные стороны, наклону строк и т.д.

Всем спасибо за отклики.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList