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

» VBA for Access

Автор: apexfmm
Дата сообщения: 14.09.2008 15:13
Luit
Попробуй так:
1. Set rs = db.OpenRecordSet("таблица",dbOpenSnapshot)
2. Выгрузи из памяти Recordset, добавив 2 команды в конце:
Set rs = Nothing
Set db = Nothing
Автор: dneprcomp
Дата сообщения: 14.09.2008 20:48
Luit

Цитата:
при повторном нажатии появляются сразу две записи

Такое поведение показывает на не правильную архетиктуру базы и/или не правильную логику работы програмы.
1. Если не должны образовываться идентичные записи, то
a) не допускать создания, проверяя перед внесением на существование
b) добавит поле-autonumber. Тогда строки записей не будут идентичы.
c) запретить создание двойников на уровне relationship таблиц
2. Предотвратить создание на уровне логики програмы
a) на нажатие кнопки делать ее disabled до завершения Requery
(простейший вариант)
Автор: Elena3785
Дата сообщения: 18.09.2008 17:54
Кто подскажет такую вещь. Есть форма, в которой есть кнопка. При нажатии этой кнопки данные из формы добавляются в таблицу, далее эта форма закрывается, а другая форма открывается. Я прописала так:
Private Sub Form_Close()
DoCmd.OpenForm "НовыйОклад", , , , , acDialog
End Sub

Private Sub КнДалее_Click()
CurrentDb.Execute "INSERT INTO ВыборМесяца ( Год, Месяц) SELECT " & Forms!ВыборМесяца!Год & " AS Гoд, " & Forms!ВыборМесяца!Месяц & " AS Мeсяц "
Else
DoCmd.Close acForm, Me.Name

End Sub
Данные добавляются, другая форма открывается, а та которая должна закрыться не закрывается. Как прописать правильно?
Автор: tavz
Дата сообщения: 18.09.2008 18:52
Elena3785

это из-за опции acDialog в OpenForm, она заставляет ждать возврата из открытой формы т.е. закрытия ее.
надо заменить на acWindowNormal и первая форма закроется
Автор: Elena3785
Дата сообщения: 22.09.2008 19:42
Подскажите пожайлуста как в поле формы прописать формулу, чтобы в этом поле отображалась последняя запись из таблицы, например, месяц. Т.е. есть таблица ВыборМесяца, где сл.поля: КодМесяц, Месяц, Год.
Автор: David_Kats
Дата сообщения: 29.09.2008 15:52
Кто знает как передавать парметр запроса и вызывать запрос с параметром из кода VBA?
Автор: Elena3785
Дата сообщения: 29.09.2008 19:16
Ребята! Подскажите, пожайлуста, как хоть называется (вообще, есть ли такая?) функция (желательно ее ситаксис), с помощью которой показывается последняя запись (строка) в таблице. Например, я хочу в запросе отбразить только последнюю запись из таблицы?
Заранее спасибо.
Автор: dneprcomp
Дата сообщения: 29.09.2008 20:01
Elena3785
В таблице нельзя найти последнюю запись саму по себе. Физически запись может быть записана на любом свободном месте. База даных не является файлом последовательной записи. Чтобы найти последнюю добавленую запись надо или Select Max(поля c autonumber/другой вариацией уникального ID), или сохранять в базе дату/время создания и Select Max по этому полю.
Автор: jONES1979
Дата сообщения: 29.09.2008 21:04
David_Kats примеры есть даже в Northwind.mdb
в запросе вызывается vba-функция, функция должна быть описана в глобальном модуле с директивой Public

Синтаксис SQL примерно такой:
SELECT ... FROM [Откудато] WHERE [Откудато]![Чтото] = VBAFunction()
иди даже
SELECT ... FROM [Откудато] WHERE ЧтотоЕщё = VBAFunction([Откудато]![ЧтотоЕщё])
Автор: David_Kats
Дата сообщения: 30.09.2008 10:33
jONES1979
Не в запросе код VBA, а НАОБОРОТ! Как ИЗ кода VBA запустить запрос и передать в этот запрос параметр?

Добавлено:
Такая ситуация. В форме у одного из комбобоксов в качестве источника данных используется запрос. Этот запрос зависит от значения в другом комбобоксе этой формы. При загрузке формы все работает правильно: Запрос "смотрит" что в Комбобокс1, формирует список значений и подставляет в Комбобокс2. Но если, не закрывая форму, я поменяю значение Комбобокс1, то список значений во втором комбобоксе не меняется! А надо чтобы менялся. Как это сделать? Проще говоря, нужно чтобы запрос обновился.
Автор: Elena3785
Дата сообщения: 06.10.2008 19:32
помогите, пожайлуста в следующей проблеме. у меня есть форма, из которой данные попадают в таблицу Начисление2. Я написала код:

Private Sub КнДобавитьДанные1_Click()

Dim База As Object, Начисление2 As Object
Set База = CurrentDb
Set Начисление2 = База.OpenRecordset("Начисление2", dbOpenDynaset)
With Начисление2
.AddNew
![КодРаботник] = [КодРаботник]
![Год] = [Год]
![Месяц] = [Месяц]
![Выручка] = [Выручка]
![КодПлан] = [КодПлан]
![Коэффициент] = [Коэффициент]
![Оклад] = [Оклад]
![КолДетей] = [КолДетей]
![ФиксЗП] = [ФиксЗП]
![Курс] = [Курс]
![НеоблагаемаяСумма] = [НеоблагаемаяСумма]
![СтоимостьТрафика] = [СтоимостьТрафика]
![НеоблагаемаяСуммаД] = [НеоблагаемаяСуммаД]

.Update

End With

Начисление2.Close

Set База = Nothing

End Sub

Это работает, но добавляет только одну запись из формы, т.е когда я в форму ввожу только одну запись. А как прописать этот код, чтобы добавлялось несколько записей из этой формы в таблицу Начисление2?
Заранее спасибо.
Автор: AlexeiKozlov
Дата сообщения: 06.10.2008 21:28
Private Sub КнДобавитьДанные1_Click()

Dim База As Object, Начисление2 As Object
dim count as integer,i as integer
Set База = CurrentDb
Set Начисление2 = База.OpenRecordset("Начисление2", dbOpenDynaset)
count=3



for i=1 to count
With Начисление2
.AddNew
![КодРаботник] = [КодРаботник]
![Год] = [Год]
![Месяц] = [Месяц]
![Выручка] = [Выручка]
![КодПлан] = [КодПлан]
![Коэффициент] = [Коэффициент]
![Оклад] = [Оклад]
![КолДетей] = [КолДетей]
![ФиксЗП] = [ФиксЗП]
![Курс] = [Курс]
![НеоблагаемаяСумма] = [НеоблагаемаяСумма]
![СтоимостьТрафика] = [СтоимостьТрафика]
![НеоблагаемаяСуммаД] = [НеоблагаемаяСуммаД]

.Update
End With
next i
Начисление2.Close

Set База = Nothing

End Sub
Автор: Zhenik2000
Дата сообщения: 08.10.2008 13:39
Здрасьте вам! у меня такой вопрос.

Есть таблица
СОТРУДНИК | ДАТА1 | ДАТА2
-----------------------------------
Иванов 01.10 20.10
Иванов 25.10 28.10
Петров 03.10 15.10

как программно сделать так, чтобы если я вводил в поле СОТРУДНИК новую запись "Иванов", а (ДАТА1) или (ДАТА2) или (ДАТА1 и ДАТА2) попадала в промежуток другой записи "Иванов" выдавало ошибку?

например, что неправильно:
Иванов 15.10 16.10
Иванов 20.09 02.10
Иванов 18.10 25.10
Иванов 25.09 30.10

и т. д.

Заранее спасибо!:)
Автор: Elena3785
Дата сообщения: 09.10.2008 18:54
AlexeiKozlov
Спасибо тебе за подсказку, только вот когда я начала пробовать, то в таблицу добавляется только одна первая запись из формы в количестве 3 раз (т.к. count = 3), а надо чтобы добалялись разные записи, внесенные в форму.
Может что-то типа этого, только не работает, число записей и первую запись не определяет:

Private Sub КнДобавитьДанные_Click()

Dim База As Object, Начисление2 As Object
Dim count As Integer, i As Integer, c As Integer
Dim ПерваяЗапись As Integer, ЧислоЗаписей As Integer
Dim Количество As Integer

Set База = CurrentDb
Set Начисление2 = База.OpenRecordset("Начисление2", dbOpenDynaset)

ПерваяЗапись = ДобавлениеДанных.Form.SelTop
ЧислоЗаписей = ДобавлениеДанных.Form.SelHeight

ДобавлениеДанных.SetFocus
DoCmd.RunCommand acCmdSelectAllRecords

Количество = IIf(ЧислоЗаписей = 0, 1, ЧислоЗаписей)

With Начисление2
.SetFocus
For i = ПерваяЗапись To ПерваяЗапись + Количество - 1

DoCmd.GoToRecord , , acGoTo, i

.AddNew
.Form![КодРаботник] = [КодРаботник]
.Form![Год] = [Год]
.Form![Месяц] = [Месяц]
.Form![Выручка] = [Выручка]
.Form![КодПлан] = [КодПлан]
.Form![Коэффициент] = [Коэффициент]
.Form![Оклад] = [Оклад]
.Form![КолДетей] = [КолДетей]
.Form![ФиксЗП] = [ФиксЗП]
.Form![Курс] = [Курс]
.Form![НеоблагаемаяСумма] = [НеоблагаемаяСумма]
.Form![СтоимостьТрафика] = [СтоимостьТрафика]
.Form![НеоблагаемаяСуммаД] = [НеоблагаемаяСуммаД]

.Update

Next i

DoCmd.RunCommand acCmdSaveRecord
.Requery

End With

Начисление2.Close

Set База = Nothing

End Sub
Но кажется это полная чушь?
Автор: AlexeiKozlov
Дата сообщения: 10.10.2008 08:54
Добавлено:
Private Sub КнДобавитьДанные_Click()

Dim База As Object, Начисление2 As Object
Dim count As Integer, i As Integer, c As Integer
Dim ПерваяЗапись As Integer, ЧислоЗаписей As Integer
Dim Количество As Integer

Set База = CurrentDb
Set Начисление2 = База.OpenRecordset("Начисление2", dbOpenDynaset)

ПерваяЗапись = ДобавлениеДанных.Form.SelTop
ЧислоЗаписей = ДобавлениеДанных.Form.SelHeight

Количество = IIf(ЧислоЗаписей = 0, 1, ЧислоЗаписей)
For i = ПерваяЗапись To ПерваяЗапись + Количество - 1
With Начисление2
.AddNew
.Form![КодРаботник] = [КодРаботник]
.Form![Год] = [Год]
.Form![Месяц] = [Месяц]
.Form![Выручка] = [Выручка]
.Form![КодПлан] = [КодПлан]
.Form![Коэффициент] = [Коэффициент]
.Form![Оклад] = [Оклад]
.Form![КолДетей] = [КолДетей]
.Form![ФиксЗП] = [ФиксЗП]
.Form![Курс] = [Курс]
.Form![НеоблагаемаяСумма] = [НеоблагаемаяСумма]
.Form![СтоимостьТрафика] = [СтоимостьТрафика]
.Form![НеоблагаемаяСуммаД] = [НеоблагаемаяСуммаД]

.Update
End With
ДобавлениеДанных.Form.recordset.movenext
Next i


Начисление2.Close

Set База = Nothing

End Sub
Автор: Hird
Дата сообщения: 10.10.2008 08:58
Имеется одна таблица с данными сотрудников: имя, фамилия и т. д., а также форма, где присутствует фотография.
Я посчитал, что хранить сотни мегабайтных изображений в таблице не айс и стал подгружать их из внешней папки:


Код:
Private Sub Form_Current()
Dim str As String
Set FSO = CreateObject("Scripting.FileSystemObject")
str = "C:\" + Name.Value + Surename.Value + ".jpg" 'формат названий графических файлов: ИмяФамилия.jpg
If FSO.FileExists(str) = True Then
img8.Picture = str
Else
img8.Picture = "C:\no.gif"
End If
End Sub
Автор: AlexeiKozlov
Дата сообщения: 10.10.2008 08:59
удалено.

Добавлено:
Hird
иди на sql.ru
Автор: Elena3785
Дата сообщения: 13.10.2008 17:00
AlexeiKozlov
Попробовала второй вариант. Выдает ошибку 424: object requried и выделяет в коде строку: ПерваяЗапись = ДобавлениеДанных.Form.SelTop
В чем может быть проблема?
Автор: AlexeiKozlov
Дата сообщения: 13.10.2008 18:03
ДобавлениеДанных.SelTop

вот так надо наверное.
трудно сказать,не зная стуктуры твоих форм.
Автор: Elena3785
Дата сообщения: 13.10.2008 19:39
AlexeiKozlov
А если я тебе пошлю базу, чтобы ты мог посмотреть?
Автор: David_Kats
Дата сообщения: 14.10.2008 13:04
При создании базы добавлял некоторые ссылки (References) ADO, Controls и т.п. Но при открытии базы на другом компе, ругается и пишет, что мол че-то невозможно найти, какие-то неправильные ссылки и т.п Кто подскажет, кто расскажет в чем тут дело-то?
Автор: Dixi257
Дата сообщения: 14.10.2008 15:54
David_Kats
Дык на то они и ссылки, что файлы (*.ocx, *.dll) на которые эти ссылки добавлены, должны лежать на другом компьютере в тех же самых местах. Мало того, часто нужно, чтобы эти *.ocx и *.dll были корректно установлены, зарегестрированы в реестре.
Т.е. перенос (запуск в сети) базы на другом компьютере часто требует идентичности программного обеспечения.
Автор: David_Kats
Дата сообщения: 16.10.2008 15:35
Dixi257
Спасибо за отклик! Ну так а как это сделать? Как перенести, корректно установить и т.п. И как узнать какой именно файл переносить?
Автор: Dixi257
Дата сообщения: 16.10.2008 22:52

Цитата:
И как узнать какой именно файл переносить?

Дружище, а как ты ссылки вставлял? Там же и смотри, что отсутствует. Т.е. открываешь на редактирование любой модуль, меню->сервис->ссылки. По названию и местоположению файла, помеченного как отсутствующей, определяешь к чему этот файл относиться. Потом, тебе виднее, какие контролы ты используешь, эти контролы и раздавай клиентам, если лицензия позволяет.
Вот еще, может мы о разном говорим, можешь точнее описать, что за ошибка появляется. Да и вообще, если ты раздаешь базу клиентам, то надо написать сервис протоколирования ошибок. Все модули должны содержать подпрограмму обработки ошибок времени исполнения и тупо записывать максимально возможное количество информации об ошибке в файл. Правда, нерабочие ссылки, если не ошибаюсь, относятся к этапу компиляции.
Ну и в завершение, хорошо бы вообще использовать SetupWizard и создавать инсталяционный пакет для раздачи клиентам.
Автор: klimusu
Дата сообщения: 19.10.2008 12:32
подскажите как распечатать массив данных RS1

Dim DB1 As Database
Dim RS1 As Recordset
Dim SQL As String
Set DB1 = CurrentDb()
SQL = "Select * From Users"
Set RS1 = DB1.OpenRecordset(SQL)

RS1.Close
DB1.Close
Автор: klimusu
Дата сообщения: 19.10.2008 18:59
в общем решение нашел решение
RS1.Fields("Surname").Value

но возникает проблема если это поле пустое, т.е. нет в таблице значения для "Surname".
vb говорит что ошибка синтаксиса в sql запросе.
как быть?
Автор: David_Kats
Дата сообщения: 20.10.2008 15:03
Народ! Куда-то пропала страница свойств и не хочет возвращаться ни по нажатию соответствующей кнопки на панели инструментов, ни из контекстного меню. Как быть?
Автор: MrZeRo
Дата сообщения: 20.10.2008 16:16
klimusu
Ну, запрос можно переписать :

Цитата:

Select * From Users WHERE Surname IS NOT NULL

Можно

Цитата:

SELECT ...., Nz(Surname, "") as Surname, ... FROM Users

тогда пустышки будут выводиться.
Можно при выводе проверять:

Цитата:

IF RS1.Fields("Surname").Value IS NOT NULL THEN .... (выводится информация)
Автор: klimusu
Дата сообщения: 20.10.2008 16:57
MrZeRo
а если я хочу не только surname проверять на пустышку? просто в запросе указать все поля? не смотрится как-то запросик
Автор: dneprcomp
Дата сообщения: 20.10.2008 19:20
klimusu

Цитата:
не смотрится как-то запросик

Тогда в свойствах полей в TABLE PROPERTY поставь дефолтные значения для новых записей. Также, произведи апдейт всей базы, чтобы везде заменить Null на дефолтные значения.

Страницы: 1234567891011121314151617

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


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