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

» Access VBA

Автор: InsideTM
Дата сообщения: 07.02.2008 14:41
Подскажите, замучался уже.
Есть выпадающий список. Источник строк:
SELECT DISTINCT notes_date
FROM notes
ORDER BY notes_date

И есть код VB, который должен делать запрос с учётом выбора в первом выпадающем списке:

Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =#" & cbo_frm_notes_date_filter & "#" & _
" ORDER BY notes.notes_text"
End Sub

На выходе получаю: Incorrect syntax near '.02.'

Я понимаю, что проблема в формате даты. Уже пробовал несколько вариантов сс МСДН, но что то ничего не помогает.

notes_date - хранится в кратком формате даты.

Проект Access 2007, на базе MSSQL 2005

Добавлено:
.02. это часть от 01.02.2008
Автор: AndVGri
Дата сообщения: 07.02.2008 15:23
InsideTM
Попробуй дату формировать как #ММ/ДД/ГГГГ# для обращения к Access базам из кода необходим только такое написание даты, может и для MS SQL необходимо такое?
Автор: MrZeRo
Дата сообщения: 07.02.2008 16:07
InsideTM
При работе с датами нормально отрабатывает CDate, например:

CDate("30.01.2008")
Автор: InsideTM
Дата сообщения: 07.02.2008 16:22
Попробовал так:

Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Dim formateddate As String
formateddate = Format(cbo_frm_notes_date_filter, "#mm/dd/yyyy#")
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =" & formateddate & _
" ORDER BY notes.notes_text"
End Sub


Не получилось. Что делать?

Добавлено:
MrZeRo
Пробовал и его, в таком коде:

Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Dim formateddate As String
formateddate = CDate(cbo_frm_notes_date_filter)
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =" & formateddate & _
" ORDER BY notes.notes_text"
End Sub

Во всех случаях одна ошибка.

Добавлено:
MrZeRo
Ради проверки даже вбивал без поля, а чисто дату, то есть код такой:
Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Dim formateddate As String
formateddate = CDate("08.02.2007")
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =" & formateddate & _
" ORDER BY notes.notes_text"
End Sub

Ошибка такая же как выше, синтаксис, тольлко чуть правее: Incorrect syntax near '.2007'
Автор: MrZeRo
Дата сообщения: 07.02.2008 16:37
А так?

Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Dim formateddate As String
formateddate = "08.02.2007"
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =CDATE(""" & formateddate & """)" _
" ORDER BY notes.notes_text"
End Sub
Автор: InsideTM
Дата сообщения: 07.02.2008 17:24
MrZeRo
Тут говорит ошибка в самом синтаксисе vb
Автор: AndVGri
Дата сообщения: 07.02.2008 17:53
InsideTM

Цитата:
formateddate = Format(cbo_frm_notes_date_filter, "#mm/dd/yyyy#")

А ты проверял, что получается в formateddate? У меня в VBA при использовании # вообще выдаётся 3948mm/dd/yyyy6. А на стандартный
"#" & Format(Now, "mm/dd/yyyy") & "#" получаю
#02.08.2008# - то есть Format возвращает опрелелённые языком разделители, так что используй Replace для замены точек на /
Автор: InsideTM
Дата сообщения: 07.02.2008 18:05
AndVGri
Я может уже с ума сошёл после рабочего дня, но на код:
Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Dim formateddate As String
Dim formateddate2 As String
formateddate = Format(cbo_frm_notes_date_filter, "mm/dd/yyyy")
formateddate2 = Replace(formateddate, ".", "/")
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =" & "#" & formateddate2 & "#" & _
" ORDER BY notes.notes_text"
End Sub

Получил туже ошибку.
Автор: AndVGri
Дата сообщения: 07.02.2008 19:04
InsideTM

Цитата:
"#" & formateddate2 & "#"

А что получается здесь, посмотри в отладчике. Да и " ORDER BY notes.notes_text" попробуй добавить точку с заяпятой " ORDER BY notes.notes_text;" - в Access запросах она присутствует (правда, не знаю как в 2007)
Автор: erm1
Дата сообщения: 07.02.2008 19:19
InsideTM

В Вы преобразуете дату в текстовую константу в запросе.
Для корректной работы необходимо в полученной текстовой константе заменить все "." на "/".

Private Function koor(buf As String) As String
Dim poz As Integer
start:
poz = InStr(buf, ".")
If poz <> 0 Then
Mid(buf, poz, 1) = "/"
GoTo start
End If
koor = buf
End Function

Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes_date =#" & koor(formateddate) & _
"# ORDER BY notes.notes_text"
Автор: AndVGri
Дата сообщения: 08.02.2008 01:08
erm1

Цитата:
Private Function koor(buf As String) As String
Dim poz As Integer
start:
poz = InStr(buf, ".")
If poz <> 0 Then
Mid(buf, poz, 1) = "/"
GoTo start
End If
koor = buf
End Function

А чем это отличается от выше названной функции Replace?
Автор: MrZeRo
Дата сообщения: 08.02.2008 08:13
Создал тестовую таблицу с полем в виде даты, следующий код у меня работает:

Цитата:

Private Sub Кнопка2_Click()
Dim dd As String
dd = "05.01.2008"
Me.List1.RowSource = "SELECT d1 FROM t1 WHERE d1=CDate(""" & dd & """)"
End Sub

А проект у вас mdb или adp? Если adp, то там должно быть по идее согласно синтаксиса SQL Server, то есть для даты CONVERT(datetime, '01.05.2007', 103)
(103 - формат даты в виде dd.mm.yyyy).
Автор: AndVGri
Дата сообщения: 08.02.2008 09:32
InsideTM
Поковырял MS SQL 2005 Express получилось либо
как у MrZeRo с notes_date = CONVERT(...)
либо можно привести дату к типу Double
"notes_date = " & CStr(CDbl(CDate(cbo_frm_notes_date_filter)) - 2#).
Вещественное представление даты у MS SQL почему то на два дня меньше, чем в VBA
Автор: InsideTM
Дата сообщения: 08.02.2008 10:32
Спасибо всем огромнейшее. Рабочий код:
Private Sub cbo_frm_notes_date_filter_AfterUpdate()
Me.cbo_frm_notes_text_filter.RowSource = "SELECT notes.notes_id, notes.notes_text, notes.notes_date FROM" & _
" notes WHERE notes.notes_date =CONVERT(DATETIME, '" & cbo_frm_notes_date_filter & "', 103)" & _
" ORDER BY notes.notes_text"
End Sub


Проблема в том, что в конструкторе SQL запрососв в самом аксессе 2007 этот код выдаёт ноль результатов и сам аксес в конструкторе предлагает формат 102, тогда работает. Это и ввело в заблуждение, хотя подобный код пробовался с 102.
ЗЫ проект АДП само собой.
Автор: AdUser
Дата сообщения: 12.02.2008 15:43
Народ! Привет всем!

Помогите мне с базой разобраться. Я новичок в практике. А так вобщем работу БД и СУБД знаю.

Дали мне задание собрать базу в Ацессе. Суть ее такова: раньше в нашей конторе все записи об экспорте товара записывались в журнал. А теперь надо их писать в БД.

Я сделал базу. Но надо очень хотел бы, чтобы профи хотя бы подсказали где у меня не так, и как лучше ее сделать (или где почитать об этом). Я не прошу сделать работу за меня, я прошу подсказать, помочь советом и ссылками, где можно научиться самому.




Вот так сейчас выглядит база:
На одну строку в журнале приходится с десяток столбцов (Товар, Масса, Страна-получатель, Фирма-отправитель, Номер сертификата, Дата выдачи сертификата, Сотрудник). База создается затем, что нам в конце года нужно все пересчитывать и сдавать отчеты (копаться в 4х журналах в конце года очень и очень в лом).
Отчеты по следующим данным - Сколько было вывезено товара (каждого и по скольку), Сколько было выдано всего сертификатов. Остальное сам доделаю.


Я сделал базу так: Товар-отдельная таблица Справочник. Масса - в таблице База. Страна-получатель, Фирма, Сотрудник - справочники, отдельными таблицами. А Номер сертификата и Дата выдачи серт. я сделал отдельной таблицей.

Сделал форму на основе таблицы База (куда все сваливается из других таблиц и справочников). Из нее забиваются данные в таблицу.


Теперь конкретные (это я в нормальном смысле =) ) вопросы:
1. Правильно ли я вообще сделал? Как правильно распихать поля (по отдельным таблицам или в основную таблицу База)?
2. Как поставить условие Да/Нет. На случай если сертификат будет считаться недействительным, то удалять запись не надо, надо поставить галочку Испорчен. Я поле Status в таб. Базу добавил, логическое. В форму вытащил. Но как их связать вообще не понимаю! И при этом! Если буду делать отчет, надо чтобы у недействительной записи Масса груза не считалась, но считалось количество выданных сертификатов.



Вот ссылка на базу, люди знающие, подскажите плиз!
__tp://www.51clubber.ru/uploads/db5.zip (64 kb)
__tp://www.51clubber.ru/uploads/db5.mdb (553 kb, не ужимал, оригинал)
Автор: LuckyELF
Дата сообщения: 12.02.2008 22:18
По собственной глупости разделил БД - выбрал в меню "сервис" -> "служебные программы" -> "разделение баз данных", в итоге у меня получилось 2 файла, причем в исходном я не могу менять структуру таблиц - "мол они находятся в другом файле", а в новом файле аксес свалил в кучу схему данных - там порядка 30 таблиц, которые в схеме были аккуратненько выстроены. очень нужно все вернуть . бэкапа нет .

И еще м.б. кто нить знает как реализовать в аксесе следующие.
есть таблица Извещения (Номер, Дата, КодУчастникаОтправителя, КодУчастникаПолучателя) и таблица Участники (КодУчастника, НаименованиеУчастника).
Как не пытался сделать две связи между этими таблицами (по полям Извещения.КодУчастникаОтправителя = Участники.КодУчастника, Извещения.КодУчастникаПолучателя = Участники.КодУчастника), но аксес не позволил мне сделать обеспечение ссылочной целостности, есть варианты как такое реализовать?

И еще вопросик. В аксесе можно заводить пользователей, а как заставить аксес логинится под определенными пользователем?
Автор: ochennadosoft
Дата сообщения: 21.02.2008 13:59
Кто-нибудь может коротко и понятно объяснить как организовать Отчет о поощрениях по одному человеку (отдельно для каждого)? Имеется Запрос, в котором есть все необходимые сведения на всех сотрудников.

Добавлено:
Access 97 (однако!)
Автор: InsideTM
Дата сообщения: 21.02.2008 20:28
Легко. создаёшь отчёт, а там в его свойствах в разделе данные ищешь "фильтр" думаю в 97 оно должно быть так же как в 07
Автор: Vitus_Bering
Дата сообщения: 22.02.2008 10:03
ochennadosoft
Выложи куда-нибудь пример и получишь ответ.
Автор: MrZeRo
Дата сообщения: 25.02.2008 16:01
ochennadosoft
Если открывать отчет через DoCmd.OpenReport, там строку фильтра можно указать.
Автор: Orda
Дата сообщения: 28.02.2008 10:39
Добрый день, уважаемые.
Очень нужна помощь!

Ситуация следующая:

Существует куча еженедельных отчётов и каждую неделю 1 добавляется. Они представляют из себя текстовые файлы по ~45Mb
Необходимо создать базу данных Access - "архив" этих данных. Так будет ~ 3 месяца, пока капитально не выйдет перейти на SQL.

Сейчас головная боль по вопросу импорта этих данных автоматически...

Нужно создать связку форма+макрос со следующим функционалом:

В форме 3 элемента:
1) Поле, где вводится дата загружаемого отчёта
2) Поле, где указывается путь к файлу для импорта (в идеале меню для выбора)
3) Кнопка "ОК" для запуска скрипта

Макрос же подтягивает файл указанный в форме и в зависимости от даты, указанной там же, проводит импорт определённым образом.
1) Если за дату в течение календарной недели отчёт ещё не загружался - идёт добавление данных в таблицу;
2) Если за дату в течение календарной недели отчёт уже загружался (в четверг загружают новее данные чем в среду) - старые данные заменяются новыми.

На текущий момент ума хватило на осуществление только:
макрос тянет файл "Base.txt" из строго определённого места и при любом раскладе добавляет данные к старой таблице

Как прописать всё прочее - ума не приложу...

Для разъяснения ситуации выложил пример файлов:

http://orda.msk.ru/Sample.zip

1) "Исходники" - образцы исходных txt-файлов
2) "DB" - файл с жутко примитивным макросом импорта. Бессмысленен..., т. к. спецификацию импорта передать не могу (или могу?)
3) "Описание" - это описание
Автор: MrZeRo
Дата сообщения: 28.02.2008 12:38
Orda
Надо на VBA писать логику обработки, не сложно, в принципе. Макросами, наверное, не обойтись. По-разному можно подходить к задаче. Н-р, сначала закачать что есть методом

Цитата:

DoCmd.TransferText [transfertype][, specificationname], tablename, filename[, hasfieldnames][, HTMLtablename][, codepage]

а потом SQL-запросами добавлять или обновлять.
Можно средствами VBA производить анализ и добавлять или менять в таблице, наподобие того, как описано здесь: hччp://www.thescripts.com/forum/thread205851.html или что-то подобное можно найти.
Учитывая, что текстовые файлы большие, возможно, предпочтительнее второй вариант. Хотя первый вариант удобнее в отладке, да и 45Мб не такой уже большой объем по современным меркам ... Можно какие-то комбинации на эту тему. Решать вам. Но без VBA не обойтись, скорее всего. На нем же можно реализовать ввод имени файла, может, еще какой-нибудь сервис.
Автор: Abiturient
Дата сообщения: 03.03.2008 08:37
Подскажите, как решить, думаю для большинства, простенькую задачку. Есть две связанные таблицы:
1-я Список работников с ФИО и массой всяческих данных;
2-я Список должностей, которые занимал каждый из работников на предприятии с указанием даты назначения № приказа и т.д. (как правило этих должностей несколько на каждого работника).
Необходимо создать запрос, который выводил бы список работников и занимаемые ими в настоящее время должности.
Автор: OlegLKL
Дата сообщения: 05.03.2008 10:25
Народ, помогите! Есть запрос:

SELECT
sales.*,
product.name,
product.productgroup
FROM sales
Left outer join product on sales.ProductID=product.ProductID
where sales.session=21
==============
Так вот, в таблице sales есть поле createtime - "дивным" способо запрос "сворачивает" данные по других полях и ставит в поле createtime какое-то время. Какое (первое ил последнее) - пока неизвестно.
Так вот вопрос - в чем я неправ в написании запроса. Мне нужно, чтобы ввыдало ВСЕ ДЕТАЛЬНЫЕ ЗАПИСИ ИЗ ТАБЛИЦЫ sales
Автор: MrZeRo
Дата сообщения: 05.03.2008 16:14
OlegLKL
Быть не может, смотри внимательнее. Этот запрос выведет ВСЕ записи из sales (само собой, при условии sales.session=21), никаких полей из sales он не сворачивает.
Автор: dneprcomp
Дата сообщения: 05.03.2008 20:57
OlegLKL
Если действительно творятся такие "дивные" дела, то попробуй вместо sales.* перечислить поименно все нужные поля. Как для product.
И что ты понимаешь под "сворачивает"?
Автор: dmka
Дата сообщения: 06.03.2008 15:55
OlegLKL
Наблюдал похожие эффекты в mssql, когда используется хранимая процедура или вьюха со звездочкой и после, в одной из таблиц, добавляется/удаляется поле. Перечисли поля явно и все будет ок.
Автор: LuckyELF
Дата сообщения: 07.03.2008 20:24
В справке написано, что можно определить переменную типа String которая будет содержать более 255 символов, но не написано как это сделать.
Я объявлял так:
Dim str As String
но это не пологло.

Как решить?
Автор: dneprcomp
Дата сообщения: 08.03.2008 03:07
LuckyELF
Что значит "не помогло"?
Покажи код и объясни, что пытаешься сделать.
Автор: LuckyELF
Дата сообщения: 08.03.2008 21:50
Вот код:

Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Form_Open

Dim sFind_SQL, sID_CHECK
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

If IsNull(Forms!fmEDIT_CHECK.OpenArgs) Then
DoCmd.Close
Exit Sub
End If


sID_CHECK = Forms!fmEDIT_CHECK.OpenArgs

sFind_SQL = "SELECT T_CHECK.ID_CHECK, T_CHECK.ALT_NUMBER, R_CHECK_DIR.CHECK_DIR_NAME, " & _
"R_CHECK_TYPE.CHECK_TYPE_NAME, T_CHECK.BEG_PROV_PERIOD, T_CHECK.END_PROV_PERIOD, " & _
"T_CHECK.BEG_PROV_DATE, T_CHECK.END_PROV_DATE, T_CHECK.PRIKAZ_N, T_CHECK.PRIKAZ_DATE, " & _
"T_CHECK.INFO_DATE, T_CHECK.OUT_DATE " & _
"FROM R_CHECK_DIR INNER JOIN " & _
"(R_CHECK_TYPE INNER JOIN T_CHECK ON R_CHECK_TYPE.ID_CHECK_TYPE = T_CHECK.ID_CHECK_TYPE) " & _
"ON R_CHECK_DIR.ID_CHECK_DIR = T_CHECK.ID_CHECK_DIR " & _
"WHERE T_CHECK.ID_CHECK = " & sID_CHECK

Set rs = New ADODB.Recordset
Set cn = Application.CurrentProject.Connection

rs.Open sFind_SQL, cn, adOpenStatic, adLockOptimistic

If (rs.RecordCount <= 0) Then
If rs.State = adStateOpen Then rs.Close

Set rs = Nothing
Set cn = Nothing

DoCmd.Close

Exit Sub
Else
Me!Edit_Number.Value = rs.Fields(0).Value ' ID
Me!Edit_Number.Enabled = False

Me!Edit_AltNumber.Value = rs.Fields(1).Value
Me!Edit_AltNumber.Enabled = False

Me!ComboBox_CheckDir.Value = rs.Fields(2).Value
Me!ComboBox_CheckDir.Enabled = False
Me!btnCheckDir.Enabled = False

Me!ComboBox_CheckType.Value = rs.Fields(3).Value
Me!ComboBox_CheckType.Enabled = False
Me!btnCheckType.Enabled = False

Me!Edit_BegPer.Value = rs.Fields(4).Value
Me!Edit_BegPer.Enabled = False

Me!Edit_EndPer.Value = rs.Fields(5).Value
Me!Edit_EndPer.Enabled = False

Me!Edit_BegProv.Value = rs.Fields(6).Value
Me!Edit_BegProv.Enabled = False

Me!Edit_EndProv.Value = rs.Fields(7).Value
Me!Edit_EndProv.Enabled = False

Me!Edit_PrikazN.Value = rs.Fields(8).Value
Me!Edit_PrikazN.Enabled = False

Me!Edit_Prikaz_Date.Value = rs.Fields(9).Value
Me!Edit_Prikaz_Date.Enabled = False

Me!Edit_InfoDate.Value = rs.Fields(10).Value

Me!Edit_Out_Date.Value = rs.Fields(11).Value
Me!Edit_Out_Date.Enabled = False

Me!ListBox_CheckUsers.RowSource = "SELECT A.ID_CHECK_USER, A.ID_CHECK, A.ID_USER, B.NAME1, B.NAME2, B.NAME3, B.JOB_TITLE " & _
"FROM T_CHECK_USER A, T_USERS B " & _
"WHERE A.ID_USER = B.ID_USER AND A.ID_CHECK = " & sID_CHECK

Me!ListBox_TB.RowSource = "SELECT A.ID_TB_LINK, A.ID_CHECK, A.TB_INDEX, B.TB_NAME, B.TB_NAME & ( & A.TB_INDEX & )" & _
"FROM T_TB_LINK A, R_TB B " & _
"WHERE A.TB_INDEX = B.TB_INDEX AND A.ID_CHECK = " & sID_CHECK

'SELECT [T_TB_LINK].[ID_TB_LINK], [T_TB_LINK].[ID_CHECK], [T_TB_LINK].[TB_INDEX] FROM [T_TB_LINK]
End If

Err_Form_Open:
If rs.State = adStateOpen Then rs.Close
Set rs = Nothing
Set cn = Nothing
End Sub

Пытаюсь сформировать строку для поиска в БД, сформированную строку пишу в sFind_SQL. По логике должно все работать, но на практике вылетает ошибка. Прошелся в отладчике, выяснил, что сформированная строка должна быть >255 символов, но реально она 255, в итоге получается ошибка.

Вопрос: как объявиться переменную типа String для хранения строк более 255 символов?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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