|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Для формы, открываемой в режиме таблицы, задается свойство 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 или * или одного поля. В чем дело? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2004, 20:44 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2004, 21:16 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Про символ продолжения строки я понял, все порядке. А вот почему происходит ошибка 2176? Она никуда не делась, хоть с правильным переносом строк, хоть вообще без оного ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2004, 19:20 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
А как выглядит программа после исправления? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2004, 19:24 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
При нажатии кнопки на форме загружаются две формы: одна в режиме таблицы (из нее потом строится диаграмма), вторая - в режиме ленточной формы (с ней работает пользователь). Данные в этих формах одинаковые (по тексту далее видно, что '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 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2004, 06:49 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Читаем:2176 Слишком большое значение для данного свойства.@Значение этого свойства может содержать не более 255 или 2048 знаков в зависимости от типа данных. Как раз вчера возился с запихиванием в Recordsource SQL-выражения на 4200 знаков (2002, adp), все нормально работет. В спецификации на A2002 сказано что, Recordsource формы может содержать более 32000 знаков, в спецификациях A2000 этот вопрос скромно обойден. Для интереса, поскольку adp-ка в формате 2000, попытался открыть ее в 2000, и при попытке запихнуть свою строку в Recordsource получил ту же ошибку 2176. Что здесь можно сказать... Я на A2000 и полгода после 97-го не протянул, достал он меня своими фокусами, ушел на 2002-й. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2004, 07:22 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Значит, все-таки глюки... Так и знал! Кстати, это первый (но, вероятно, не последний) глюк, который мне встретился в Access 2000. Какие же варианты? Все перевалить назад в А97? или перейти к 2002? А может быть, версия, которую я у себя ставил "недокряканная". Ведь ясно, что не может быть такая фигня не замечена разработчиками, слишком уж вопиюще... По крайней мере, про разные версии "хорошо" и "плохо" крякнутых Windows (в частности, 2000) я слышал. Различаются они по Cd-key. Вероятно, с Office тоже может быть что-то подобное. К версии Office2000, которую я ставил у себя, Cd-key: Код: plaintext
Если кто может чего дельное ответить на то, что я тут написал - милости прошу. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2004, 17:15 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
еще один из берлоги вылез. медведь, а медведь. ващета уже SP1 на офис 2003 вышел. вот сам и решай в какой версии тебе работать тем более, что используешь пиратскую версию ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2004, 17:33 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Ну почему сразу "медведь"? То, что выходят новые программы и 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, а там лишние столбцы мешают. А во-вторых, это дело принципа. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2004, 20:55 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
КДа на последней строке приведенного ниже кода выдает '3141': ошибочное или пропущенное зарезервированное слово или аргумента в инструкции SELECT или неверная пунктуация. Это проверяется следующим способом: 1. Ставим брейкпойнт в каком-нибудь месте, где strSQL уже получило окончательное значение. 2. Запускаем программу, доходим до этого места. 3. Берем значение strSQL и методом Copy-Paste копируем в новый запрос. 4. Пытаемся его запустить. 5. Аксесс выдает нам ту же ошибку, что и раньше, но при этом выделяет в тексте запроса то место, которое ему не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2004, 21:00 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Фрагмент кода: 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 осталась… ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2004, 17:56 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Прошу прощения, а зачем в этом селекте ссылки на формы? Если он все равно составляется динамически, почему нельзя вставить в него сразу значения? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2004, 13:03 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Прошу прощения, для тех, кто на бронепоезде, объясните, а как сразу вставить значения? Я так думал, что вот как раз в зависимости от того, какие числа появились в одних контролах и какие пользователь ввел в другие (а там еще и всякие переключатели есть, в зависимости от которых по некоторым ингредиентам выбирается не 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2004, 19:19 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
1. Для данных примеров (самое неприятное - время) Код: plaintext 1.
а) www.sql.ru/forum/actualthread.aspx?tid=43550 б)Разве трудно установить количество записей в во вставляемом рекордсете и от них вычислять диапазон в)rng = xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(a, 17)) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 00:47 |
|
Инструкция SELECT, не "запихиваются" поля
|
|||
---|---|---|---|
#18+
Ну, во-первых, символы # везде не нужны, там не по датам ведется отбор, а по действительным числам. По датам только в строке 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2004, 18:41 |
|
|
start [/forum/topic.php?fid=45&msg=32745273&tid=1670699]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 152ms |
0 / 0 |