Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 сложная ситуация с фильтром  [new]
pophigist
Member

Откуда:
Сообщений: 90
уважаемые знатоки такая задача
в главной форме1 с помощью выбора из нескольких списков при нажатии на кнопку (таким образом

Call condition("")
DoCmd.OpenForm "frm_Datas", , , strCond)

открывается др.форма2 где отображаются выбранные наименования по сути фильтруются (форма2 основана на запросе в котором объеденены несколько таблиц) вот данный фильтр с помощью которого все происходит

Public Sub condition(where As String)
' makes up condition and grouping for analyse'tables (filter)
Dim cond(15) As Boolean
Dim cr As String, gr As String
Dim i As Integer
'***
cond(LBound(cond)) = chFlds(LBound(chFlds)).ListCount = 0
For i = LBound(cond) + 1 To UBound(chFlds) - 1
cond(i) = cond(i - 1) And chFlds(i).ListCount = 0
Next
'***
If cond(LBound(cond)) Then
cr = ""
gr = ""
Else
cr = critery(chFlds(LBound(chFlds)), flds(LBound(flds)))
gr = flds(LBound(flds))
End If
'***
strCond = cr
grCond = gr
For i = LBound(cond) + 1 To UBound(chFlds)
strCond = strCond & expr(chFlds(i).ListCount <> 0, _
cond(i - 1), critery(chFlds(i), flds(i)), " and ")
grCond = grCond & expr(chFlds(i).ListCount <> 0, cond(i - 1), flds(i), " , ")
Next
'***
If Len(strCond) = 0 Then
strCond = where & " DBASE.direct = '" & cmbDir & "'"
grCond = ", direct "
Else
strCond = where & strCond & " and DBASE.direct = '" & cmbDir & "'"
grCond = ", direct" & "," & grCond
End If
Exit Sub
End Sub

где DBASE это таблица
chFlds переменная - Dim chFlds() As Variant


вопрос можно ли этот фильтр применить к таблице или переделать в обычный запрос? мне нужно отфильтрованные таким образом данные из формы импортировать в обычную таблицу

надеюсь понятно изъясняюсь
заранее благодарю всех кто откликнется
11 окт 06, 15:12    [3248062]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
mds_world
Member

Откуда: Ташкент
Сообщений: 27548
автор
надеюсь понятно изъясняюсь
Не совсем.
автор
вопрос можно ли этот фильтр применить к таблице или переделать в обычный запрос?
Вы и так его применяете к таблице. Очевидно ваш вопрос состоит в том, что нельзя ли с его помощью добавить получившийся набор в другую таблицу? Типа, скопировать все и переставить? Ну да, скопировать и перенести. Руками. Или как вы пишете, переделать в обычный запрос. Только на добавление.
Есть еще вариант. В форме на подходящем событии или на специальной кнопке образовать RecordsetClone от субформы (фильтр вы ведь применяете для субформы, не так ли?) и программно перетащить все данные из формы.

ЗЫ.
автор
мне нужно отфильтрованные таким образом данные из формы импортировать в обычную таблицу
Вы, наверно имели в виду экСпортировать? Но даже если так, это все равно не общепринятый термин. Дело в том, что под определениями "импортировать" и "экспортировать" понимается совершенно другое - обмен данными с внешними приложениями и БД.
11 окт 06, 22:03    [3250196]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
pophigist
Member

Откуда:
Сообщений: 90
Да Вы совершенно правы и все правильно поняли хотя я жутко объясняюсь и небыло надежды что кто-то откликнется я путаюсь в терминах поскольку новичок
по поводу субформы нет это самостоятельная форма открывающаяся из главной по кнопке, насколько я понимаю субформа это подчиненная форма или я опять ошибаюсь?
по поводу RecordsetClone немогли бы Вы немного поподробней разъяснить или кинуть ссылку где есть исчерпывающий ответ, я пытаюсь что то сделать но пока безуспешно вот мое произведение если это можно так назвать:

Private Sub FormTab()

Dim ds As Object
Dim ex As Database
Dim Con As Recordset

Set ex = CurrentDb
Set Con = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)

Set ds = Me("Торг_наименование").Form.RecordsetClone
Dim i&: i = 16
ds.MoveFirst

Do While Not ds.EOF

Con![Торг_наименование] = Me![Торг_наименование].value
Con![Лек_форма] = Me![Лек_форма].value
Con![Дозировка] = Me![Дозировка].value
Con![Номер] = Me![Номер].value
Con![Упаковки] = Me![Упаковки].value
Con![Опт_цена] = Me![Опт_цена].value
Con![Сумма(опт_ц)] = Me![Сумма(опт_ц)].value
Con![Вход_цена] = Me![Вход_цена].value
Con![Сумма(вход_ц)] = Me![Сумма(вход_ц)].value
Con![МНН,АТХ_5] = Me![МНН,АТХ_5].value
Con![Производитель] = Me![Производитель].value
Con![Страна] = Me![Страна].value
Con![Покупатель] = Me![Покупатель].value
Con![Посредник] = Me![Посредник].value
Con![год] = Me![год].value

i = i + 1
ds.MoveNext
Loop
Set Con = Nothing
End Sub

еще раз спасибо за попытку понять
12 окт 06, 12:01    [3252118]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
mds_world
Member

Откуда: Ташкент
Сообщений: 27548
Не вдаваясь пока в подробности, могу сказать, что точно необходимо:
после строки
Set ds = Me("Торг_наименование").Form.RecordsetClone
нужно обязательно вставить
ds.MoveLast
, чтобы инициализировать набор записей. Без этого количество записей сведется к 1, если даже записей много. А чтобы не было обращения к пустому рекордсету, перед циклом ставится
If ds.RecordCount > 0 Then

2. Вы открыли рекордсет Con, но не пользуетесь им, хотя это целевая таблица.
3. Равенство типа:
Con![Торг_наименование] = Me![Торг_наименование].value
не имеет отношения к рекордсету. По-видимому нужно так:
Con("Торг_наименование") = ds("Торг_наименование")
Чтобы сформировать новую запись в Con, необходимо воспользоваться методом AddNew, в виде
Con.AddNew. Это указание надо поставить сразу после Do While. А в конце цикла необходимо записать указание на запись и и перейти на новую строку:
Con.Update 
Con.MoveNext
ds.MoveNext

4. Если нужно узнать кол-во возвращаемых записей, совсем не требуется формировать свой счетчик (у вас i = i + 1), достаточно опросить ds.RecordCount
12 окт 06, 12:48    [3252611]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
pophigist
Member

Откуда:
Сообщений: 90
спасибо попробую разобраться
12 окт 06, 13:34    [3253017]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
pophigist
Member

Откуда:
Сообщений: 90
Dim ds As Object
Dim ex As Database
Dim Con As Recordset

Set ex = CurrentDb
Set Con = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)

Set ds = Me.RecordsetClone
ds.MoveLast
Dim i&: i = 16
ds.MoveFirst
If ds.RecordCount > 0 Then
Do While Not ds.EOF
Con.AddNew
Уважаемый mds_world спасибо за помощь не только от меня, но и всех чайников в VBA сразу небыло возможности закончить вот сейчас следуя Вашим советам состряпалось вот это:

Con("Торг_наименование") = ds("name")
Con("Лек_форма") = ds("lec")
Con("Доза") = ds("doza")
Con("Номер") = ds("numer")
Con("Упаковка") = ds("pack")
Con("Опт_пр") = ds("opt_pr")
Con("МНН") = ds("MNN")
Con("АТХ_5") = ds("ath5")
Con("Производитель") = ds("producer")
Con("Страна") = ds("country")
Con("Покупатель") = ds("provider")
Con("Посредник") = ds("mediator")
Con("Год") = ds("year")

Con.Update
ds.MoveNext
Loop
End If
Set Con = Nothing

все отлично работает что приводит в бешеный восторг
помещаю код для тех кто будет заниматься подобным изощрением
18 окт 06, 13:30    [3276428]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
pophigist
Member

Откуда:
Сообщений: 90
Sorry :)
Уважаемый mds_world спасибо за помощь не только от меня, но и всех чайников в VBA сразу небыло возможности закончить вот сейчас следуя Вашим советам состряпалось вот это:

Dim ds As Object
Dim ex As Database
Dim Con As Recordset

Set ex = CurrentDb
Set Con = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)

Set ds = Me.RecordsetClone
ds.MoveLast
Dim i&: i = 16
ds.MoveFirst
If ds.RecordCount > 0 Then
Do While Not ds.EOF
Con.AddNew
Con("Торг_наименование") = ds("name")
Con("Лек_форма") = ds("lec")
Con("Доза") = ds("doza")
Con("Номер") = ds("numer")
Con("Упаковка") = ds("pack")
Con("Опт_пр") = ds("opt_pr")
Con("МНН") = ds("MNN")
Con("АТХ_5") = ds("ath5")
Con("Производитель") = ds("producer")
Con("Страна") = ds("country")
Con("Покупатель") = ds("provider")
Con("Посредник") = ds("mediator")
Con("Год") = ds("year")

Con.Update
ds.MoveNext
Loop
End If
Set Con = Nothing

все отлично работает что приводит в бешеный восторг
помещаю код для тех кто будет заниматься подобным изощрением
18 окт 06, 13:32    [3276444]     Ответить | Цитировать Сообщить модератору
 Re: сложная ситуация с фильтром  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
Con("Доза") = ds("doza")
pophigist
что приводит в бешеный восторг
18 окт 06, 13:37    [3276474]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить