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

» VBA for Access

Автор: Slatsik
Дата сообщения: 23.01.2010 22:52
ZlydenGL постоянно таким пользуюсь к сожалению, здесь не прокатило (
придется делать переходную табличку, которая будет локальная, и сначала вносить и править все в ней, а потом синхронизировать нужные записи.
Спасибо за участие!
Автор: ZlydenGL
Дата сообщения: 24.01.2010 16:34
Slatsik, а что именно-то не получилось? Можно код и ошибку в студию?
Автор: Slatsik
Дата сообщения: 24.01.2010 18:48

Цитата:
Slatsik, а что именно-то не получилось? Можно код и ошибку в студию?


Цитата:
есть связанная таблица в Access - связь с MySQL. Какие-то записи в этой таблице редактируются нормально, а на каких-то выскакивает сообщение, мол, пока вы тут правите, кто-то эту запись уже изменил...и изменить не могу %) Стопудова, что никто ничего не меняет в этой таблице!

номера ошибки нет! это, типа, информационное сообщение

к сожалению, более подробно не получается описать и скриншот не могу представить, потому как на работе из-за соображений безопасности отключен Инет от раб. компов.
Автор: ZlydenGL
Дата сообщения: 25.01.2010 11:10
Slatsik, а нет ли у моста к MySQL какого-то таймаута? Т.е. не получается ли следующий затык?

1. Пользователь открыл запись на редактирование
2. Пока пользователь редактировал запись - мост счет, что сессия с БД уже неактивна и дропнул ее
3. Пользователь нажал "Сохранить", мост открывает ВТОРУЮ нитку на Update - и тут-то ловится медулла обломата.

Если затык в этом - помести таймер на форму и к примеру раз в 10 секунд делай какой-нить простенький селект.
Автор: metrim
Дата сообщения: 31.01.2010 17:33
Подскажите пожалуйста
Что то туплю

Есть таблица допустим "Таблица1". В ней поля "Индекс" "Имя" "Информация" "примечания"

Мне нужно пройтись по всем записям "Таблица1" , выполнить определенные расчетные действия и поместить результаты вычислений по каждой записи в "Таблица2"

В принципе я предполагаю, что здесь должен работать оператор for each , но вот как его прикрутить к обработке результата запроса - не понимаю
Т.е. что то типа как то так:

Код: sub test_obrab()
dim poisk as string
dim zapros as recordset
poisk = "SELECT Таблица1.индекс, Таблица1.имя FROM Таблица1;"
zapros = CurrentDb.OpenRecordset(poisk)
for each .....
Автор: Oyger
Дата сообщения: 02.02.2010 13:54
metrim
Я может и не лучший вариант использую, но - что есть...

Dim RST As ADODB.Recordset
Dim RST2 As ADODB.Recordset
Set RST = New ADODB.Recordset
Set RST_2 = New ADODB.Recordset
RST.Open "[Taблица1]", CurrentProject.Connection, adOpenStatic, adLockOptimistic 'Имя таблицы, если целиком. Или текст запроса.
RST_2.Open "[Таблица2]", CurrentProject.Connection, adOpenStatic, adLockOptimistic
Do Until RST.EOF = True 'Перебираем до тех пор, пока записи не закончатся

ХХХ
'Сюда записываешь текст обработки и записи в результирующую таблицу RST_2.

RST.MoveNext 'Переход на следующую запись
Loop

RST.Close
RST_2.Close
Set RST = Nothing
Set RST_2 = Nothing


Кто знает как лучше - рад выслушать!
Автор: dneprcomp
Дата сообщения: 02.02.2010 23:21
metrim
А какие собственно вычисления проходят. Операции с полями из SELECT можно провести в принципе и в самом Insert/Update стайтменте. Без перебора рекордов.
Автор: Oyger
Дата сообщения: 03.02.2010 10:07
dneprcomp

Цитата:
Операции с полями из SELECT можно провести в принципе и в самом Insert/Update стайтменте. Без перебора рекордов.

Расскажите, пожалуйста, по подробнее. Если не затруднит.
Что за методы такие?
Автор: PrWork1
Дата сообщения: 03.02.2010 16:57
Oyger
Посмотрите язык SQL, операции SELECT и Update.
Потренитуйтесь в простроителе запросов

Как подготовите правильный запрос пишите в VBA

currentDB.execute(выражение на SQL)
Автор: dneprcomp
Дата сообщения: 03.02.2010 19:37
Oyger
Как я могу что-либо объяснить, если неизвестно что и как именно надо вычислять?
Без конкретных данных - что, откуда, как - лучший совет уже озвучил PrWork1


Добавлено:
Ну к примеру, что-то вроде
Код: insert into table1
select [цена] * [количество] from table2 where [количество] >10
Автор: Oyger
Дата сообщения: 04.02.2010 08:38
PrWork1
dneprcomp

Спасибо, спасибо.
Это я знаю. Просто не сообразил что речь идет о SQL. Думал, может это методы какие.
Спасибо за ответы.
Автор: PrWork1
Дата сообщения: 04.02.2010 21:07
Oyger
Пожалуйста.
Если знаете, так и пишите, т.к. это быстрее будет работать, чем рекордсет дергать и править проще.
Автор: metrim
Дата сообщения: 05.02.2010 13:06

Цитата:
А какие собственно вычисления проходят. Операции с полями из SELECT можно провести в принципе и в самом Insert/Update стайтменте. Без перебора рекордов.

Собственно мне надо поверить: есть ли в другой таблице поля с определенными параметрами, определяемыми из Таблицы1, если нет - то создать таковое.
Собственно я уже сделал это ручным перебором, запуская процесс создания кнопкой в форме для каждой отдельной записи.
На данный момент мне просто интересно знать (да и на будущее) как реализовать такой перебор.

Т.е. еще раз, алгоритм собственно таков
В Таблица1 Поля: "Индекс"(текстовое), "ММД"(логич), "СПМД"(логич).
В Таблице2 Поля: "Индекс"(текстовое), "Двор"(текст, ммд/спмд)

Скрипт должен взять запись в Таблице1, если поле ММД отмечено - проверить существует ли в Таблице2 запись "Индекс"="Таблтца1.Индекс" и "Двор"=ммд , если нет, то оздать
и т.д.

Автор: dneprcomp
Дата сообщения: 06.02.2010 00:04
metrim
Можно попробовать как-то так

Код: insert into Таблица2
select Индекс, "MMD"
FROM Таблица1 Left JOIN
Таблица2 ON Таблица2.Индекс = Таблица1.Индекс
where Таблица1.ММД = True
and Таблица2.Двор = "MMD"
and Таблица2.Индекс Is Null
Автор: taravasya
Дата сообщения: 08.02.2010 13:47
Здравствуйте. Не мог бы кто-нить мне помочь:
Я создал в VisualStudio, элементарное приложенице, которое отображает данные из простого запроса. Возможно ли сделать так, что бы при добавлении пользователями, новой записи в таблицу-источник, этого запроса, в приложении происходило бы автоматическое обновление отображения данных? Пользователей 2-3 человека. то-есть загрузки особой нет. Если это возможно, то как? Мне посоветовали изучить:SqlDependency, но там скудноватая инфа, и я не разобрался что к чему. Хотя вроде как подходит...
Желательно пример на VBA
Автор: nkurrich
Дата сообщения: 08.02.2010 16:53
вот такой вопрос: допустим есть 2 поля в форме "остаток" и допустим "поле 2" как с пом выражения или байсика аксесовского сделать формулу для "поле 2" чтобы туда бралось "остаток" для текущей записи + "поле 2" из предыдущей записи
Автор: dneprcomp
Дата сообщения: 08.02.2010 19:58
taravasya
SqlDependency для SQL Server 2005. Совсем не для Access.
В Access смотри [more=Form.Timer Event...]Access Developer Reference
Form.Timer Event
The Timer event occurs for a form at regular intervals as specified by the form's TimerInterval property.expression.Timer
expression A variable that represents a Form object.

Remarks

To run a macro or event procedure when this event occurs, set the OnTimer property to the name of the macro or to [Event Procedure].

By running a macro or event procedure when a Timer event occurs, you can control what Microsoft Access does at every timer interval. For example, you might want to requery underlying records or repaint the screen at specified intervals.

The TimerInterval property setting of the form specifies the interval, in milliseconds, between Timer events. The interval can be between 0 and 2,147,483,647 milliseconds. Setting the TimerInterval property to 0 prevents the Timer event from occurring.

Example

The following example demonstrates a digital clock you can display on a form. A label control displays the current time according to your computer's system clock.

To try the example, add the following event procedure to a form that contains a label named Clock. Set the form's TimerInterval property to 1000 milliseconds to update the clock every second.

Visual Basic for Applications
Private Sub Form_Timer()
Clock.Caption = Time ' Update time display.
End Sub
[/more]
Автор: taravasya
Дата сообщения: 09.02.2010 15:45
Спасибо.
Как я понял из описания, этой функцией задается интервал обновления? Если не прав поправьте пожалуйста. Если прав то она не совсем подходит... Хотелось бы обновления, только после внесения новых данных.
И есть ещё один вопрос. Ищу решение уже несколько дней. Нигде не могу найти даже зацепку.
Имею таблицу :
Счётчики
В ней столбцы:
№Смены, Дата, R4, R5, R6,..
Данные заполняются ~ раз в сутки.
Как создать запрос или VBA модуль для формы, в которой подсчитывалась бы разница полей?
То-есть допустим:
№Cмены | Дата | R4 | R5 | R6 |
--------------------------------------------------------------------------
1 |25.01.10 | 100 | 150 | 50 |
2 |26.01.10 | 200 | 200 | 60 |

Как вычислить разницу между 1-й и 2-й сменами в поле R4?
Я понимаю, что это элементарно делается в Exele, но задача стоит, собрать всё в одну кучу. Что бы не приходилось метаться из окна в окно.
Автор: dneprcomp
Дата сообщения: 09.02.2010 21:02
taravasya
Ты так вскользь упамянул, что интерфейс сделан на Visual Studio, что я не сразу и заметил. Тем более, что задал вопрос в топике Access.
Строго говоря, Access не является сервером(ну или полноценым сервером), поэтому возможностей по самостоятельному информированию клиентов у него нет.
Посмотри http://www.tek-tips.com/viewthread.cfm?qid=1178990&page=1

Можно перейти на бесплатный MS SQL SERVER EXPRESS. Он гораздо мощнее Access. Хотя и не предлогает front-end решений. Но, т.к. у тебя всеравно сделано на VS, то это и не помешает. В SQL Server уже можно будет попробовать использовать SqlDependency.
http://www.google.com/#hl=en&source=hp&q=SqlDependency+express&btnG=Google+Search&aq=0&aqi=&oq=SqlDependency+express&fp=1&cad=b

Опять же, если использована .NET, то можно порыться в сторону broadcast message
http://www.google.com/#hl=en&source=hp&q=vb.net+broadcast+message&btnG=Google+Search&aq=0&aqi=g1&oq=vb.net+broadcast&fp=1&cad=b

Но все это при условии использования .NET. Какая имено VS использована ты не указал. Т.ч. сам гадай




Добавлено:
taravasya
По второму вопросу тоже не все понятно. Не мог бы ты все же объяснить на чем написан интерфейс. Потому как если есть не связанный с Аccess GUI, то и делай в нем вычисления. При чем тут VBA?
Автор: taravasya
Дата сообщения: 09.02.2010 22:50
Я конечно дико извиняюсь... Дело в том, что бросился на амбразуру как говорится с пустого места. Поэтому наверное мои комменты не очень то понятны. Я ещё не совсем понимаю на чём нужно акцентировать внимание. Но постараюсь.
Есть фотолаба. Есть Win XP, под управлением которой, работает прога "DlabGui", которая в свою очередь контролирует лабораторию. Прога хранит статистику печати в Access-овской базе. Некоторое время, мы работали даже и не подозревая об этом. Просматривали статистику из интерфейса DlabGui. После, довольствовались тем, что переписывали ручками показания в Exele(ух... иногда мне кажется, что уж лучше так и продолжать!!!!) Но! Эти долбанные немцы... млин! Они так неудобно всё организовали. Я не буду вдаваться в подробности этого аспекта. Скажу только что недочётов - море. Причём просто таки детских Видно, что те кто разрабатывал принципы обработки статистики этой лабораторией, никогда не пробовал печатать фотографии....
Одна из самых больших неудобностей:
Во время печати невозможно проконтролировать сколько в каком заказе ушло фоток. При выходе последних из лаборатории, часто приходится их пересчитывать вручную. А это и отпечатки пальцев на фотках, и ЗРЯ потерянное время.
Я подумал-подумал, и решил - вот было бы класно, если бы где нибудь, постоянно отображалась инфа о текущих заказах. Прога то проносит данные о том, что напечатала, в режиме реального времени. А нигде её не отображает.
Держать постоянно открытым окно Access-а очень не удобно. По специфике работы программы DlabGui, её неудобно сворачивать потом разворачивать. Она как бы и не расчитана на это. А удобным мне показалось манюсенькое, полупрозрачное окошко, созданное в VS2008, в котором отображается всего лишь 10-15 строк из запроса(данные добавленные за последние 15минут).
Больше от VS мне ничего и не надобно, за исключением как раз поднятого вопроса об автоматическом обновлении(и в идеале звуковом сопровождении обновления).
Второй вопрос чисто Access-овский. Речь идёт про данные, о кол-ве напечатанных фоток за всю смену, и ведении отчетов о ней. Данные беруться опять же из обычной MDB таблицы. Ранее(как я уже говорил), эти данные переписывались в Exele вручную. Сейчас я вынужден контролировать 3 лаборатории, и вечерний отчёт стал для меня пыткой. Вот и бьюсь теперь как рыба для того что-бы облегчить свою участь.(а вскоре брезжит 4-я лаба).....
Если что не ясно, прошу не пинать, не ругать. Задайте мне пару наводящих. pleas....
Автор: dneprcomp
Дата сообщения: 09.02.2010 23:34
taravasya
Так я совсем и не ругаю, и не пинаю.
Просто чем лучше объяснишь, тем лучше будет ответ. Вот сейчас уже понятно, что SQL Sever не подойдет.
В данной ситуации я бы все же рекомедовал поставить на форму, созданную в VS2008, контрол Timer и по его команде запрашивать обновления. Ничего другого или лучшего при данной базе и конфиге не придумать.
Звук тоже можно сделать. Запоминаем количество рекордов или какой рекорд был последним и делаем запрос. При изменении запомненного значения, подаем звуковой сигнал.
Импорт из базы в Excell руками делать совершенно не надо. Смотри в своей версии Excell help для import/export data. Там можно как источник указать Access.
Или можно на другом Timer настроить на импорт в Excell по ночам.
Или вобще ничего никуда не импортировать, а все делать в этом "манюсенькое, полупрозрачное", забирая данные напрямую из Access и обрабатывая в програме.
Автор: taravasya
Дата сообщения: 09.02.2010 23:52
Проблема в том, что "манюсенькое, полупрозрачное", ничего никуда не сохраняет. Только показывает. А моей подготовленности, явно не хватит, на то что бы создать полновесное приложение, способное без глюков общаться с базой данных.

Цитата:
Импорт из базы в Excell руками делать совершенно не надо. Смотри в своей версии Excell help для import/export data.

Это я уже проходил. Ничего плохого в этом не вижу, но всё же хотелось бы собрать всю отчётность в одно русло, ведь есть ещё другие аспекты деятельности, которые надо документировать, а Exele становится не достаточным...
Так, что если с "манюсенькое, полупрозрачное" я вроде как определился, то со второй проблемой я бы ещё хотел разобраться в рамках Access-а(тем более, что я уже не впервые сталкиваюсь с таким вопросом).
Автор: dneprcomp
Дата сообщения: 10.02.2010 01:11
taravasya

Цитата:
А моей подготовленности, явно не хватит, на то что бы создать полновесное приложение, способное без глюков общаться с базой данных.

Так что же в таком случае можно сделать? Ни в какой базе нет чудесного визарда, который сделает именно то, что надо.
Могу только посоветовать обратиться к специалисту.
Давайте договоримся. Мы обязуемся не продавать ваши фото, а вы не будете програмировать Да, и еще мы оба не будем торговать семечками.

PS. Cмотри PM
Автор: taravasya
Дата сообщения: 10.02.2010 01:18
Так может быть Вы ещё и фотографировать откажетесь?
Автор: dneprcomp
Дата сообщения: 10.02.2010 01:32
taravasya
Ну, я в принципе и не занимаюсь. Но отказываться не буду. А то мало ли что...
Автор: dneprcomp
Дата сообщения: 10.02.2010 05:46
taravasya


Цитата:
со второй проблемой я бы ещё хотел разобраться в рамках Access-а(тем более, что я уже не впервые сталкиваюсь с таким вопросом).
Вот в этом и сложность. Сталкиваешься не впервые и решения нет. Верно? Но по прежнему
хочется. Вот потому и надо дать програмисту делать а не фотографу.
В рамках только Access и без програмирования получить запрашиваемое решение не получится.

Впрочем, если хочется научиться, то пожалуйста. Задавай вопросы и делай.

Да, забыл упомянуть, что та программа именно и расчитана на работу и обмен данными c несколькими лабораториями/филиалами. И репорты тоже предоставляет.
Автор: Oyger
Дата сообщения: 12.02.2010 10:25
Коллеги.
Подскажите, прибегать ли к помощи макроса.
Есть таблица с двумя столбцами (А и Б).
В столбце А содержатся номера (число - длинное). Без разницы чего - пусть будут заказы.
В столбцу Б - характеристика (текстовая).
Номера в А могут повторяться.
Надо сделать новую таблицу в которой будут уникальны номера заказов (А), а все значения в столбце Б из первой таблицы по заказам будут объеденены в одну ячейку.
К примеру:
Исходная таблица
А Б
12 а
16 к
12 у
17 н

Получаем
А Б
12 ау
16 к
17 н

Написать макрос ручным перебором через два рекордсета - я могу. Только надо ли так? Может есть пути попроще?
Подскажите.
Автор: Anton T
Дата сообщения: 15.02.2010 14:43
Здравствуйте.
Как можно сделать фильтр SQL в форме (Фамилия, Имя, Отч.. и т.д.)?


а следующий вводил:


[more=Код]Сам модуль:

Код: Option Compare Database
Option Explicit

Public Par As Byte

Sub fFilForm(strFiltr As String, strSql As String, strSql1 As String, frm As Form, strFieldName As String)
On Error GoTo Err_
With frm
If Len(strFiltr) <> 0 Or Not IsNull(strFiltr) Then
strFiltr = " WHERE Left([" & strFieldName & "]," & Len(strFiltr) & ") = '" & strFiltr & "'"
Else
strFiltr = ""
End If
.RecordSource = strSql & strFiltr & " " & strSql1 & ";"
End With
Exit_:
Exit Sub
Err_:
MsgBox Err.Description
Err.Clear
Resume Exit_
End Sub
Автор: dneprcomp
Дата сообщения: 15.02.2010 20:20
Anton T
Честно говоря, непонятно что именно не работает и что надо.
Строка
Код:
strFiltr = " WHERE Left([" & strFieldName & "]," & Len(strFiltr) & ") = '" & strFiltr & "'"
Автор: Anton T
Дата сообщения: 16.02.2010 11:10
dneprcomp
Ничего не получается, пишет: Object variable or With block variable not set (Error 91)
и переезжает желтую строку:
Код: If frm.Поле1 <> "" Then

Страницы: 1234567891011121314151617

Предыдущая тема: Delphi+ADO


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