powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Инструкция SELECT, не "запихиваются" поля
15 сообщений из 15, страница 1 из 1
Инструкция SELECT, не "запихиваются" поля
    #32743457
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для формы, открываемой в режиме таблицы, задается свойство Recordsource.

strSQL = "SELECT * FROM tblSvodnaia WHERE " & strWhere & ""

DoCmd.OpenForm "frmResultAnaliz_табл", acFormDS, , , , acHidden

Forms!frmResultAnaliz_табл.Visible = False

Forms![frmResultAnaliz_табл].Form.RecordSource = strSQL

Попытка задать не все поля, а только определенные

strSQL = "SELECT dtmDate, sngAmm, sngApav, sngChlorid, sngFosf, _
sngHpk, sngMarg, sngMed, sngNeft, sngNitrat, sngNitrit, sngPh, _
sngSuchOst, sngSulf, sngVzvV_va, sngZhel FROM tblSvodnaia WHERE " & strWhere & ""

DoCmd.OpenForm "frmResultAnaliz_табл", acFormDS, , , , acHidden

Forms!frmResultAnaliz_табл.Visible = False

Forms![frmResultAnaliz_табл].Form.RecordSource = strSQL

при отладке на последней строке приводит к ошибке 2176 "слишком большое значение для данного свойства"
Причем происходит это только в Access 2000. Access 97 эту строку спокойно воспринимает. Единственное, что 2000-й
"допускает" без вывода ошибки - включение в SELECT или * или одного поля. В чем дело?
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32743472
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32745273
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про символ продолжения строки я понял, все порядке.
А вот почему происходит ошибка 2176? Она никуда не делась, хоть с правильным переносом строк, хоть вообще без оного
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32745281
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А как выглядит программа после исправления?
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32747516
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При нажатии кнопки на форме загружаются две формы: одна в режиме таблицы (из нее потом строится диаграмма), вторая - в режиме ленточной формы (с ней работает пользователь). Данные в этих формах одинаковые (по тексту далее видно, что 'strWhere' используется для обеих форм).

Код для формы в режиме таблицы:
Первая строка (с rem) работает без проблем. А вторая (с развернутой инструкцией SQL) дает ту самую ошибку. Причем хоть с As для каждого поля, хоть без As. И что это за ошибка 2176? Раздел справки для нее не выводится, описания я найти не сумел.

'формирование источника данных для формы frmResultAnaliz_табл
Rem strSQL = "SELECT * FROM tblSvodnaia WHERE " & strWhere & ""
strSQL = "SELECT dtmDate As Дата, sngAmm As Аммоний, " & _
"sngApav As АПАВ, sngChlorid As Хлориды, sngFosf As Фосфаты, " & _
"sngMarg As Марганец, sngMed As Медь, sngNeft As Нефтепродукты, " & _
"sngNitrat As Нитраты, sngNitrit As Нитриты, sngPh As рН, " & _
"sngSuchOst As Сухой ост, sngSulf As Сульфаты, sngVzvV_va As Взв в-ва, " & _
"sngZhel As Железо, sngHpk As ХПК FROM tblSvodnaia WHERE " & strWhere & ""

'открытие формы frmResultAnaliz_табл как скрытой
DoCmd.OpenForm "frmResultAnaliz_табл", acFormDS, , , , acHidden

'запрет вывода формы frmResultAnaliz_табл на экран
Forms!frmResultAnaliz_табл.Visible = False

'установка источника данных для формы frmResultAnaliz_табл
Forms![frmResultAnaliz_табл].Form.RecordSource = strSQL

Код для формы в виде ленточной формы:
'открытие формы frmResultAnaliz как скрытой
DoCmd.OpenForm "frmResultAnaliz", acNormal, , strWhere, , acHidden

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

'Сульфаты (на каждый ингредиент такой код)

If Forms!frmAnalizData.Controls!optSulfGroupVisible.Value Then

If Forms!frmAnalizData.Controls!optSulfDiap.Value Then
strWhereSulf = "[sngSulf] Between [Forms]![frmAnalizData]![txtSulfMin] And [Forms]![frmAnalizData]![txtSulfMax] Or [sngSulf] Is Null"

ElseIf Forms!frmAnalizData.Controls!optSulfMax.Value Then
strWhereSulf = "[sngSulf] = " + Forms!frmAnalizData.lstSulfMax.ItemData(0)

ElseIf Forms!frmAnalizData.Controls!optSulfPdk.Value Then
strWhereSulf = "[sngSulf] > " + Str(Forms!frmAnalizData.Recordset.Fields("sngSulf").Value * [Forms]![frmAnalizData]![txtSulfPdkKrat])

Else
strWhereSulf = "[sngSulf] Between [Forms]![frmAnalizData]![txtSulfMin] And [Forms]![frmAnalizData]![txtSulfMax] Or [sngSulf] Is Null"

End If

Else
strWhereSulf = "[sngSulf] Between [Forms]![frmAnalizData]![txtSulfMin] And [Forms]![frmAnalizData]![txtSulfMax] Or [sngSulf] Is Null"

End If

'Даты

strWhereDate = "[dtmDate] Between [Forms]![frmAnalizData]![txtDateBegin] And [Forms]![frmAnalizData]![txtDateEnd]"

'Предприятия

strWherePredpr = "[chrПредприятия] Like '" + Trim(Forms!frmAnalizData.Controls!cboPredpr) + "'"

'Вариант, учитывающий выбор конкретного предприятия
strWhere1 = strWherePredpr & " AND (" & strWhereDate & ") AND (" & strWhereChlorid & ") AND (" & strWhereSulf & ") AND (" & strWherePh & ") AND (" & strWhereMarg & ") AND (" & strWhereHpk & ") AND (" & strWhereVzvV_va & ") AND (" & strWhereSuchOst & ") AND (" & strWhereNeft & ") AND (" & strWhereMed & ") AND (" & strWhereZhel & ") AND (" & strWhereFosf & ") AND (" & strWhereNitrat & ") AND (" & strWhereNitrit & ") AND (" & strWhereAmm & ") AND (" & strWhereApav & ")"

'Вариант, учитывающий случай, когда конкретное предприятие не выбрано
strWhere2 = "(" & strWhereDate & ") AND (" & strWhereChlorid & ") AND (" & strWhereSulf & ") AND (" & strWherePh & ") AND (" & strWhereMarg & ") AND (" & strWhereHpk & ") AND (" & strWhereVzvV_va & ") AND (" & strWhereSuchOst & ") AND (" & strWhereNeft & ") AND (" & strWhereMed & ") AND (" & strWhereZhel & ") AND (" & strWhereFosf & ") AND (" & strWhereNitrat & ") AND (" & strWhereNitrit & ") AND (" & strWhereAmm & ") AND (" & strWhereApav & ")"


If Forms!frmAnalizData.Controls!cboPredpr = "<любое>" Then

strWhere = strWhere2

Else
strWhere = strWhere1
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32747522
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаем:2176
Слишком большое значение для данного свойства.@Значение этого свойства может содержать не более 255 или 2048 знаков в зависимости от типа данных.

Как раз вчера возился с запихиванием в Recordsource SQL-выражения на 4200 знаков (2002, adp), все нормально работет. В спецификации на A2002 сказано что, Recordsource формы может содержать более 32000 знаков, в спецификациях A2000 этот вопрос скромно обойден. Для интереса, поскольку adp-ка в формате 2000, попытался открыть ее в 2000, и при попытке запихнуть свою строку в Recordsource получил ту же ошибку 2176.
Что здесь можно сказать... Я на A2000 и полгода после 97-го не протянул, достал он меня своими фокусами, ушел на 2002-й.
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32748950
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит, все-таки глюки... Так и знал! Кстати, это первый (но, вероятно, не последний) глюк, который мне встретился в Access 2000. Какие же варианты? Все перевалить назад в А97? или перейти к 2002? А может быть, версия, которую я у себя ставил "недокряканная". Ведь ясно, что не может быть такая фигня не замечена разработчиками, слишком уж вопиюще... По крайней мере, про разные версии "хорошо" и "плохо" крякнутых Windows (в частности, 2000) я слышал. Различаются они по Cd-key. Вероятно, с Office тоже может быть что-то подобное.
К версии Office2000, которую я ставил у себя, Cd-key:
Код: plaintext
отмодерировано Санычем
А вообще, похоже, надо эту тему (глюки в программах) выносить на другие форумы и там обсуждать.
Если кто может чего дельное ответить на то, что я тут написал - милости прошу.
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32749007
ищ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще один из берлоги вылез.

медведь, а медведь. ващета уже SP1 на офис 2003 вышел.
вот сам и решай в какой версии тебе работать
тем более, что используешь пиратскую версию
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32749348
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну почему сразу "медведь"? То, что выходят новые программы и SP к ним еще не гарантирует корректную работу. Вот Alexander G, может быть и пользуется лицензионной, но ошибки и в ней есть. И что дальше? А почему надо платить большие деньги за лицензионные глюки?
Ладно, теперь к делу. OfficeXP меня тоже не порадовал. Поставил выборочно Access и Excel.
Ошибку '2176' он больше не выдает, а на последней строке приведенного ниже кода выдает '3141': ошибочное или пропущенное зарезервированное слово или аргумента в инструкции SELECT или неверная пунктуация.

Rem strSQL = "SELECT * FROM tblSvodnaia WHERE " & strWhere & ""
strSQL = "SELECT dtmDate AS Дата, sngAmm AS Аммоний, " & _
"sngApav AS АПАВ, sngChlorid AS Хлориды, sngFosf AS Фосфаты, " & _
"sngMarg AS Марганец, sngMed AS Медь, sngNeft AS Нефтепродукты, " & _
"sngNitrat AS Нитраты, sngNitrit AS Нитриты, sngPh AS рН, " & _
"sngSuchOst AS Сухой ост, sngSulf AS Сульфаты, sngVzvV_va AS Взв в-ва, " & _
"sngZhel AS Железо, sngHpk AS ХПК FROM tblSvodnaia WHERE " & strWhere & ""

'открытие формы frmResultAnaliz_табл как скрытой
DoCmd.OpenForm "frmResultAnaliz_табл", acFormDS, , , , acHidden

'запрет вывода формы frmResultAnaliz_табл на экран
Forms!frmResultAnaliz_табл.Visible = False

'установка источника данных для формы frmResultAnaliz_табл
Forms![frmResultAnaliz_табл].Form.RecordSource = strSQL

Я бы, конечно, плюнул на это. Но дело в том, что содержание frmResultAnaliz_табл методом CopyFromRecordset перекидывается в Excel, а там лишние столбцы мешают. А во-вторых, это дело принципа.
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32749353
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
КДа на последней строке приведенного ниже кода выдает '3141': ошибочное или пропущенное зарезервированное слово или аргумента в инструкции SELECT или неверная пунктуация.
Это проверяется следующим способом:
1. Ставим брейкпойнт в каком-нибудь месте, где strSQL уже получило окончательное значение.
2. Запускаем программу, доходим до этого места.
3. Берем значение strSQL и методом Copy-Paste копируем в новый запрос.
4. Пытаемся его запустить.
5. Аксесс выдает нам ту же ошибку, что и раньше, но при этом выделяет в тексте запроса то место, которое ему не нравится.
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32751608
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фрагмент кода:
strSQL = "SELECT* FROM tblSvodnaia WHERE " & strWhere & "" 'на этой строке strSQL=Empty

Rem strSQL = "SELECT dtmDate AS Дата, sngAmm AS Аммоний, " & _
"sngApav AS АПАВ, sngChlorid AS Хлориды, sngFosf AS Фосфаты, " & _
"sngMarg AS Марганец, sngMed AS Медь, sngNeft AS Нефтепродукты, " & _
"sngNitrat AS Нитраты, sngNitrit AS Нитриты, sngPh AS рН, " & _
"sngSuchOst AS Сухой ост, sngSulf AS Сульфаты, sngVzvV_va AS Взв в-ва, " & _
"sngZhel AS Железо, sngHpk AS ХПК FROM tblSvodnaia WHERE " & strWhere & "'"

'открытие формы frmResultAnalizTabl как скрытой
DoCmd.OpenForm "frmResultAnalizTabl", acFormDS, , , , acHidden

'запрет вывода формы frmResultAnalizTabl на экран
Forms!frmResultAnalizTabl.Visible = False

'установка источника данных для формы frmResultAnalizTabl
Forms!frmResultAnalizTabl.RecordSource = strSQL 'а вот на этой строке strSQL все что ниже
(извиняюсь, что так много, но пусть будет)
SELECT* FROM tblSvodnaia WHERE [chrПредприятия] Like 'ТЧ-7' AND ([dtmDate] Between [Forms]![frmAnalizData]![txtDateBegin] And [Forms]![frmAnalizData]![txtDateEnd]) AND ([sngChlorid] Between [Forms]![frmAnalizData]![txtChloridMin] And [Forms]![frmAnalizData]![txtChloridMax] Or [sngChlorid] Is Null) AND ([sngSulf] Between [Forms]![frmAnalizData]![txtSulfMin] And [Forms]![frmAnalizData]![txtSulfMax] Or [sngSulf] Is Null) AND ([sngPh] Between [Forms]![frmAnalizData]![txtPhMin] And [Forms]![frmAnalizData]![txtPhMax] Or [sngPh] Is Null) AND ([sngMarg] Between [Forms]![frmAnalizData]![txtMargMin] And [Forms]![frmAnalizData]![txtMargMax] Or [sngMarg] Is Null) AND ([sngHpk] Between [Forms]![frmAnalizData]![txtHpkMin] And [Forms]![frmAnalizData]![txtHpkMax] Or [sngHpk] Is Null) AND ([sngVzvV_va] Between [Forms]![frmAnalizData]![txtVzvV_vaMin] And [Forms]![frmAnalizData]![txtVzvV_vaMax] Or [sngVzvV_va] Is Null) AND ([sngSuchOst] Between [Forms]![frmAnalizData]![txtSuchOstMin] And [Forms]![frmAnalizData]![txtSuchOstMax] Or [sngSuchOst] Is Null) AND ([sngNeft] Between [Forms]![frmAnalizData]![txtNeftMin] And [Forms]![frmAnalizData]![txtNeftMax] Or [sngNeft] Is Null) AND ([sngMed] Between [Forms]![frmAnalizData]![txtMedMin] And [Forms]![frmAnalizData]![txtMedMax] Or [sngMed] Is Null) AND ([sngZhel] Between [Forms]![frmAnalizData]![txtZhelMin] And [Forms]![frmAnalizData]![txtZhelMax] Or [sngZhel] Is Null) AND ([sngFosf] Between [Forms]![frmAnalizData]![txtFosfMin] And [Forms]![frmAnalizData]![txtFosfMax] Or [sngFosf] Is Null) AND ([sngNitrat] Between [Forms]![frmAnalizData]![txtNitratMin] And [Forms]![frmAnalizData]![txtNitratMax] Or [sngNitrat] Is Null) AND ([sngNitrit] Between [Forms]![frmAnalizData]![txtNitritMin] And [Forms]![frmAnalizData]![txtNitritMax] Or [sngNitrit] Is Null) AND ([sngAmm] Between [Forms]![frmAnalizData]![txtAmmMin] And [Forms]![frmAnalizData]![txtAmmMax] Or [sngAmm] Is Null) AND ([sngApav] Between [Forms]![frmAnalizData]![txtApavMin] And [Forms]![frmAnalizData]![txtApavMax] Or [sngApav] Is Null)

Перенос rem'а выдал те же самые результаты, только вместо SELECT* появились все поля, которые были заданы.

По совету Владимира Саныча я скопировал это в новый запрос и попытался его открыть. Запрос обругал меня сначала за отсутствие скобок [] в псевдонимах полей, имеющих пробелы (AS Сухой ост), а также за недопустимое использование ( ) или . или ! Тогда я заменил все сочетания ].[ в обозначениях control'ов на "." Т.е. ссылки типа [Forms]![frmAnalizData]![txtDateEnd] приобрели вид Forms.frmAnalizData.txtDateEnd и это запрос "схавал" без проблем.
После этого я и в модуле поменял ссылки вида [Forms]![frmAnalizData]![txtDateEnd] на Forms.frmAnalizData.txtDateEnd, но опять вылезла ошибка ‘2176’: слишком большое значение для данного свойства.

Самое интересное, что в форме, открываемой как таблица, присутствуют только нужные поля. Эта же форма задается при построении диаграммы как Recordset. И ведь метод CopyFromRecordset переносит данные именно из формы, а не исходной таблицы. Почему же на листе Excel выводятся все поля исходной таблицы? Или этот метод копирует именно выбранные записи и ВСЕ ПОЛЯ исходной таблицы?

В конце концов мне все это надоело и в модуле построения диаграммы я просто задал удаление мешающих полей (скорее их уже можно назвать столбцами) в созданном Excel-листе.
А обида на Microsoft осталась…
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32751777
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Прошу прощения, а зачем в этом селекте ссылки на формы? Если он все равно составляется динамически, почему нельзя вставить в него сразу значения?
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32757973
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, для тех, кто на бронепоезде, объясните, а как сразу вставить значения?
Я так думал, что вот как раз в зависимости от того, какие числа появились в одних контролах и какие
пользователь ввел в другие (а там еще и всякие переключатели есть, в зависимости от которых по некоторым
ингредиентам выбирается не Between, а Max или еще что-н.) и составляется динамический селект.
Собственно форма, на основе которой он составляется, одна, но переключатели предоставляют пользователю
большое поле для разгула фантазии при выборе условий поиска. Может, я чего-то недопонял, объясните.

А заодно вот такой вопрос.

На основе Recordset'а, скопированного в Excel, строится диаграмма. Для построения требуется задать диапазон.
Начать надо от А1, а вот с правой нижней ячейкой проблема. Дело в том, что Recordset может быть не сплошь заполнен
данными, могут быть и пустые строки и пустые столбцы. Так что метод CurrentRegion не подходит. Единственное условие,
которое всегда соблюдается - первый столбец всегда заполнен данными (это даты). А всего столбцов 17 (хотя среди них
могут быть и пустые). Предположим, что у нас первая строка - названия полей и еще 12 записей. Далее:

'задание диапазона для диаграммы от ячейки A1 до
'пересечения первой пустой строки и 17-го столбца. Для этого производится
'поиск первой пустой ячейки в первом столбце (который всегда заполнен, т.к.
'это даты), а затем (значение строки - 1) присваивается значению строки ячейки
'в 17-м столбце

Dim r As Long
Dim a As Long
Dim X As Long
Dim rng As Range
Dim y As String

With xlChart
.ChartType = xlLine

Rem For r = 1 To X 'в таком виде цикл почему-то не работает

For r = 1 To 10000 'пришлось ввести число, заведомо превышающее
'возможное количество записей
If IsEmpty(xlSheet.Cells(r, 1)) Then
Let a = r - 1 'возвращает 13
Exit For
End If
Next r

.SetSourceData Source:=xlSheet.Range("A1:P13"), PlotBy:=xlColumns 'диапазон, указанный явно в стиле
'А1, работает

А далее - разные пробные варианты, которые по разным причинам не работают

Rem xlChart.SetSourceData Source:=xlSheet.Range(Cells(1, 1), Cells(a, 17)), PlotBy:=xlColumns 'особенно странно, 'почему это не работает

Rem rng = xlSheet.Range(Cells(1, 1), Cells(a, 17))

Rem y = rng.Address(RowAbsolute:=False, ColumnAbsolute:=False, ReferenceStyle:=xlA1)

Rem y = xlSheet.Range(Cells(a, 17)).Address(RowAbsolute:=False, ColumnAbsolute:=False, ReferenceStyle:=xlA1)



End With
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32758178
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Для данных примеров (самое неприятное - время)
Код: plaintext
1.
strWhereSulf = "[sngSulf] Between #" & Format([Forms]![frmAnalizData]![txtSulfMin], "mm\/dd\/yyyy") & _ 
"# And #" & Format([Forms]![frmAnalizData]![txtSulfMax], "mm\/dd\/yyyy") & "# Or [sngSulf] Is Null"
2.
а) www.sql.ru/forum/actualthread.aspx?tid=43550
б)Разве трудно установить количество записей в во вставляемом рекордсете и от них вычислять диапазон
в)rng = xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(a, 17))
...
Рейтинг: 0 / 0
Инструкция SELECT, не "запихиваются" поля
    #32760037
КД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, во-первых, символы # везде не нужны, там не по датам ведется отбор, а по действительным числам. По датам только в строке strWhereDate, которая потом включается в строку strWhere.

По поводу задания диапазона данных – спасибо за подсказку. Вот такая конструкция работает:

With xlChart
.ChartType = xlLine

For r = 1 To 10000
If IsEmpty(xlSheet.Cells(r, 1)) Then
Let a = r - 1
Exit For
End If
Next r

.SetSourceData Source:=xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(a, 16)), PlotBy:=xlColumns

End With
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Инструкция SELECT, не "запихиваются" поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]