Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Access VBA

Автор: novo_again
Дата сообщения: 18.11.2011 13:37
SevereK20
Мне кажется, писать команду закрытия нужно в той форме, которая получает фокус... Я всегда делаю попап модальным и, пока юзер его не закроет, на основную форму не выйдет.

Народ, а никто не подскажет: пытаюсь посчитать в коде количество записей в определенном сохраненном запросе, который фильтром имеет значение отдельной формы - все время ошибка rs.open ((( У меня такое впечатление, что такие неявные фильтры через код не работают...
Автор: grbdv
Дата сообщения: 18.11.2011 15:19

Цитата:
все время ошибка rs.open

Если бы еще кто-то знал - что такое rs...


Цитата:
посчитать в коде количество записей в определенном сохраненном запросе,

Точную цифру даст только рекордсет на запросе и то, если ты его populated - .MoveLast с последующим .MoveFirst


Цитата:
который фильтром имеет значение отдельной формы

Я где-то выше высказывался - не доверяю встроенным механизмам передачи значений контролов. Загони в переменную, обнови ее по нужде, и, в последнюю очередь ужЕ - передай в запрос. Строкой передай :)

Чтобы точно знать, где новое занчение получается, - точки останова на событиях формы, контролов и связанных с ней форм... По идее - чудеc не бывает. А что, в дебаггере не судьба посмотреть базовый запрос?
? recordset.name
is the first 256 characters of the SQL statement

Другое дело, если ты вторичный реордсет формируешь на базе основного через .Sort или .Filter - там сложнее. Через переменные все надо делать - спросил ее - она тебе сказала.
Автор: novo_again
Дата сообщения: 18.11.2011 15:41
grbdv
"Спросил ее - она тебе сказала" - золотые слова)
Помогла функция по подсчету записей на листе без обращения к рекордсету под этим листом.

rs, пардон - рекордсет.
Еще пардон - немного спутанно описал ситуацию: есть необходимость сделать функцию, которая считает количество записей. Внутри функции рекордсет, количество записей которого, собственно, необходимо посчитать, получает в качестве фильтра WHERE значения из формы - они же являются аргументами функции. Так вот этот рекордсет строится на ряде таблиц и на сохраненном запросе. Сохраненный запрос в качестве фильтра также использует значение формы. Все фильтры засунуть в рекордсет низзя ибо сначала должен фильтровать один, потом другой.
Скармливать сохраненному запоросу паблик переменную не пробовал ибо пустое)

Спасибо за отклик!
Автор: Yado
Дата сообщения: 18.11.2011 18:01
подскажите, а какие можно еще символы использовать в строке поиска кроме *. А то я пока использую именно ее. Например, надо найти: Трубы 450мм красные. Пишу: *трубы*450*красные. Но такой поиск не находит таких строк: Трубы красные 450мм. Или например, надо чтоб не было в строке какого-нибудь слова. Какой символ ставить? Как будет тогда выглядеть строка поиска?
Автор: novo_again
Дата сообщения: 18.11.2011 19:18
надо в фильтре напечатать like *трубы* and like *450* and like *красные*
чтобы не было символа, надо ставить перед ним "<>"

Добавлено:
надо в фильтре напечатать like *трубы* and like *450* and like *красные*
чтобы не было символа, надо ставить перед ним "<>"
Автор: grbdv
Дата сообщения: 18.11.2011 20:11
novo_again
Странно, часть поста сожралась... Повторю. Может пригодится на будущее. Про нюансы.

Приметил как-то: при накладывании .Sort и .Filter св-во .Name нового рекордсета возвращает запрос родительского рекордсета, а не того, который получился. Т.е. все эти неявные WHERE и ORDER "сглатываются". А что там будет при n-й степени навороченности их друг на друга - не знаю. Дальше одной не нырял. А нырял-то из нужды только. Если масса БД позволяет, лучше отдельный рекордсет отдельным запросом сделать. По месту, короче. Вобщем, аккуратней надо с ними.


Добавлено:
novo_again

Цитата:
есть необходимость сделать функцию, которая считает количество записей.

Давно сделано :))

Код:
Public Function fn_RecCntRst(pRst As Recordset) As Long
With pRst
Select Case .BOF And .EOF
Case True: fn_RecCntRst = 0
Case False: .MoveLast: .MoveFirst: fn_RecCntRst = .RecordCount
End Select
End With
End Function
Автор: Yado
Дата сообщения: 18.11.2011 20:27
novo_again
нее...не правильно меня поняли. Вот такой скрипт есть:

Private Sub Поле0_KeyUp(KeyCode As Integer, Shift As Integer)
Dim strSQL As String
strSQL = "SELECT запрос2.Goods, запрос.Price, запрос2.Suppl, запрос2.Cod, запрос2.Credit FROM запрос2 WHERE запрос2.Goods Like '" & Me!Поле0.Value & "*' order by запрос2.Price"

If KeyCode = vbKeyReturn Then
Me!List2.RowSource = strSQL
End If
End Sub
соответственно есть форма, в которой вбивается в строке поиск Трубы красные 450 и по нажатию enter выдаются записи соответствущие поиску.
Просто попробовал в строке поиска набрать ваш вариант...ничего не нашел(
Автор: aidomars
Дата сообщения: 21.11.2011 08:07
Подскажите как сформировать вывод в Excel?
Есть форма с подчиненной таблицей table1. По каждой записи в ней нужно выбрать все записи из table2, где table1.ID = table2.ID.
В table1 ID уникальные, а в table2 могут повторяться.
Циклом уж больно долго считать...
Автор: AndVGri
Дата сообщения: 21.11.2011 08:23
aidomars
А не проще ли данные запроса импортировать в Excel, чем формировать вывод?
Автор: aidomars
Дата сообщения: 21.11.2011 08:28
Да вот с запросом засада, не могу SQL написать.
Table2 это таблица, а Table1 это подчиненная форма, вот и не могу Table1 использовать в запросе.
Получаю ID так:

Код:
Set rstПеревод = Forms![Перевод списком].Controls![Перевод списком подчиненная].Form.RecordsetClone
With rstПеревод
Do While Not rstПеревод.EOF
p = rstПеревод.ID
Loop
End With
Автор: AndVGri
Дата сообщения: 21.11.2011 08:40
aidomars
Так чего проще то?
1. Используя конструктор запросов, кидаем table1 и table2 в него
2. перетаскиванием соединяем ID двух таблиц
3. накидываем необходимые поля для вывода
4. если необходимо, то устанавливаем порядок сортировки и, возможно, ограничений на выборку
5. сохраняем
6. в Excel импортируем данные запроса
Автор: aidomars
Дата сообщения: 21.11.2011 08:41
AndVGri
Говорю ж, table1 то нет.
Автор: AndVGri
Дата сообщения: 21.11.2011 08:47
aidomars
Извиняюсь, но при ответе не было приведённого Вами кода. Но, подчинённая форма откуда-то берёт данные эту таблицу или запрос и добавляем
Автор: aidomars
Дата сообщения: 21.11.2011 08:54
Берет из других двух таблиц и формированием Form.RecordSource и Form.Filter (с помощью полей со списком на форме). Так что если только подставить эти самые RecordSource и Filter в запрос, что я точно не соображу как. А ведь еще подтянуть данные из table2 нужно.
Пока все-таки делаю циклом и присваиваю в массив, а его потом в книгу запихну. Хотя с запросом возможно быстрее бы было.
Автор: Yado
Дата сообщения: 21.11.2011 09:14
никто на мой вопрос выше не может ответить?
Автор: novo_again
Дата сообщения: 21.11.2011 09:25
Yado
я еще только учусь) - по- моему, так просто символами здесь не обойдешься ибо скармливая sql строчку с фильтром сложновато его заставить не обращать внимания на порядок слов... надо делать функцию по разбору текста условия и обратной сборке фильтра для sql со словами OR (смотри дисклеймер в начале)...

Добавлено:
aidomars
если мне ничто не изменяет, в конструкторе формы можно зайти в свойство рекордсорса, открыть конструктор запроса, перевести его в sql-вид, скопировать код, создать новый запрос и засандалить код туда.
Автор: aidomars
Дата сообщения: 21.11.2011 10:38
novo_again, засандалить код туда не проблема, нужно еще прикрутить к нему другой код, чтоб на основании полученных ID вывести в запросе все записи из table2.
Автор: novo_again
Дата сообщения: 21.11.2011 11:56
aidomars
как раз прикрутить код можно переключившись из sql режима в режим конструктора, access сам все нарисует, останется только добавить к полученному таблицы, связи и поля в запрос
Автор: novo_again
Дата сообщения: 29.11.2011 14:35
Народ, а как эффективней всего форму заставить перейти на определенную запись с определенным значением индексного скрытого поля? Смотрел всякие Find - чувствую, что то не то...
Автор: aidomars
Дата сообщения: 10.01.2012 14:19
Есть двумерный массив с данными (ФИО, НомерДоговора, Контора). Как мне создать для каждой конторы Excel-файл (есть шаблон) с соответствующими ФИО и НомерДоговора? Не хочется возиться с циклами и ячейками. Хочется красиво чтоб), типа через временную таблицу и SQL-запрос. Реализуемо?
Сейчас вот как:

Код:
Set wb = Excel.Workbooks.Open(CurrentProject.Path & "\Шаблоны\Акт.xls")
wb.Application.Visible = True
With wb.Sheets("Акт")
For i = 1 To Ubound(arrАкт)
.Cells(9+i, 1) = arrАкт(a, aFIO)
'добавить строку
Next i
End With
Автор: AndVGri
Дата сообщения: 11.01.2012 03:13
aidomars
Зачем же так длинно? Просто вставка значений массива

Код:
Dim vRows As Long, vCols As Long

vRows = UBound(arrАкт, 1) - LBound(arrАкт, 1)
vCols = UBound(arrАкт, 2) - LBound(arrАкт, 2)
With wb.Sheets("Акт")
.Range(.Cells(9, 1), .Cells(9 + vRows, 1 + vCols)).Value = arrАкт
End With
Автор: aidomars
Дата сообщения: 11.01.2012 05:51

Цитата:
Зачем же так длинно? Просто вставка значений массива

AndVGri, задача в том, чтобы из массива данных создать 5 файлов, т.е. в массиве например имеем: 100 строк, где 5 контор по 20 строк.
Пока делаю по старинке, по каждой конторе в массиве ищу циклом строки, вношу их в массив2, а его уже вставляю:
Код: Range("A10").Cells.Resize(UBound(arrUv, 1), UBound(arrUv, 2)) = arrАкт
Автор: AndVGri
Дата сообщения: 11.01.2012 06:35
aidomars
1. А при чём тут Access VBA?
2. Массив же не данность - каким-то образом заполняется, что мешает сразу создавать 5 массивов?
Автор: aidomars
Дата сообщения: 11.01.2012 07:17
AndVGri
1. Работа ведется в Access это раз, думал сделать через вставку массива в таблицу с последующим нахождением каждой конторы через SQL-запрос, это два. В первом посте написано было.
2. Массив читается функией LoadArrayFromWorkbook, т.е. данные с листа сразу заносятся в массив.
Результат должен быть в виде формирования количества книг (равному количеству уникальных контор) с соотвующими им данными (ФИО, НомерДоговора).
Автор: petrosyanserg
Дата сообщения: 31.01.2012 19:33
Как можно защитить строки в таблице от редактирования другим пользователем? Нужно, чтобы пользователи вносили свои данные в базу данных, редатировали только свои внесённые данные, производили поиск по всем данным, введённым и другими пользователями тоже.
1) Примерно 10 пользователей, у каждого свой файл .mdb (пример во вложении). Это архив чертежей, номер - название. Каждый пользователь заносит свои в свой файл .mdb, а при поиске через определённую форму все эти файлы объединяются и производится поиск.
2) Либо создается один файл .mdb у администратора, при добавлении своих записей в общий файл форма сама заносит в определённое поле свой id, так форма будет знать, что это её строка и только его можно редактировать.
Возможно есть какой-то другой способ защиты строк? Кто, что применял?

Добавлено:
Вложение http://ifolder.ru/28427630
Автор: aidomars
Дата сообщения: 31.01.2012 20:15
petrosyanserg
Я сделал просто до ужаса.
Определяешь при запуске комп/ip/username и записываешь в ту же таблицу при вносе данных. Открываешь форму с таблицей (в свойствах - запрещено редактировать), щелчок по строке - открытие формы для забивки данных, в зависимости от роли определяется доступ. Саму таблицу имхо так не защитить.
Формы храни у юзеров локально, таблицы в сети.
Автор: GSkva
Дата сообщения: 14.02.2012 10:15
Доброго времени суток! Задача:
Есть база данных на Access она довольно часто меняется и каждый раз чтобы обновить ее у всех клиентов приходится брать ихнюю и перекидывать данные в новую. Вопрос: как сделать так чтобы изменения в базе делались с помощью макроса, вне базы данных. Нужно что-то на подобие файла обновления. Как организовать?
Автор: novo_again
Дата сообщения: 14.02.2012 11:16
Поместить на сеть меняющийся файл и заставить клиентские базульки обновляться при открытии.
Автор: GSkva
Дата сообщения: 14.02.2012 16:21
КАК заставить? Технически?
Сети нет и не будет, у каждого клиента база называется по своему так что обновление не может найти базу. Нужно чтобы в базе была кнопка "обновить", которая брала бы файл и в соответствии с ним делала изменения в себе. Логика процесса мне и самому понятна, а вот технически!????

Добавлено:
Т.Е. как заставить базу выполнить код который храниться во внешнем файле как будто это код самой кнопки "обновить"? Клиент не сможет скопировать и вставить код в кнопку (естественно)!!!
Автор: novo_again
Дата сообщения: 14.02.2012 16:59
По-моему, данные всегда переносятся в базу с новым кодом, а не наоборот...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: BDE - траблы, помогите пожалуйста срочно...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.