powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
12 сообщений из 37, страница 2 из 2
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32460930
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, а ведь я сам тоже накололся с этими параметрами в ADO для UPDATE-запросов.

Таким образом запускаемый UPDATE-запрос работать не будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  Set cmd = New ADODB.Command
  cmd.ActiveConnection = CurrentProject.Connection
  cmd.CommandType = adCmdStoredProc
  cmd.CommandText =  "qryUpdDate" 
  cmd.Parameters( "ля-ля" ) = MyDate
  cmd.Execute lngAffected, , adExecuteNoRecords
  Set cmd = Nothing


Коллекция выполняемого запроса "qryUpdDate" cmd.Parameters.Count=0, даже если мы сделаем cmd.Parameters.Refresh после cmd.CommandText = .... все равно ноль. - Естественно вышеуказанную ошибку о не удается найти объект.... мы и получаем

Если не задавать тип cmd.CommandType= , т.е. =adCmdUnknown, то становится совсем весело, в вотчере в свойстве cmd.Parameters.Count наблюдаем такой текст - Invalid SQL Statement; expected 'DELETE', 'INSERT','PROCEDURE', 'SELECT' or 'UPDATE'
В MSDN на эту ошибку находим такой любопытный документ: ACC2000: You May Need to Refer to Jet Stored Procedures as Tables in ADO из которого узнаем, что оказывается при обращении к сохраненным запросам через ADO при необходимости манипулировать параметрами надо заменить cmd.CommandType = adCmdStoredProc на cmd.CommandType = adCmdTable, иначе получим ошибку. Но все это касается токо SELECT запросов, для UPDATE запросов adCmdTable конечно никак не прокатит.

Вообщем для UPDATE запросов с параметрами чрез ADO необходимо действовать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Set cmd = New ADODB.Command
  cmd.ActiveConnection = CurrentProject.Connection

  cmd.CommandType = adCmdStoredProc
  cmd.CommandText =  "qryUpdDate" 
  
  ' создаем параметр и сами добавляем его в коллекцию '  
  Set prm = cmd.CreateParameter( "myDate" , adDate, adParamInput)
  prm.value = DateSerial( 4 ,  3 ,  25 )
  cmd.Parameters.Append prm
    
  cmd.Execute lngAffected, , adExecuteNoRecords
 
  Set prm = Nothing
  Set cmd = Nothing


Т.о. в ADO в этом случае надо самим создавать параметр и добавляеть его в коллекцию, потому что сам ADO для UPDATE запросов коллекцию Parameters заполнять не хочет (или не может или не видит или еще что). Причем ни в коем случае после строки
Код: plaintext
cmd.Parameters.Append prm

не делайте
Код: plaintext
cmd.Parameters.Refresh

иначе Ваш добавленный параметр в мгновение ока тут же исчезнет из коллекции Parameters, веселуха вообщем

(Если это общеизвестный факт, то дико извиняюсь, но для меня, после DAO такое поведение ADO оказалось сюрпризом)
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462922
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Count(Явка.Явка) - это число , а Вы его приравниваете к True

Прошу обратить внимание, что согласна, что запрос не универсален, однако Count(Явка.Явка)=True писать можно (док-вом является действующий запрос). Вы случайно не путаете с Sum. Сначала идет выборка тех записей, кот true, группируя по № сотрудника, т е -1, а далее подсчитывается количество выбранных явок для этих сотрудников, так что все ОК.
А с остальным буду разбираться...
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462933
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
автороднако Count(Явка.Явка)=True писать можно (док-вом является действующий запрос).
Готов спорить на съедение собственной кепки, что в действующем запросе этого нет.
Count(...)=True - это все равно что Count(...)= - 1.
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462950
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Пы.Сы.
Писать так действительно можно. Только результат будет не тот.
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462951
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для проверки временно заменила пар-ры на конкретные ссылки на форму.
1 вариант не работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT Явка.[Код сотрудника], Count(Явка.Явка) AS KolYavok
FROM Сотрудники INNER JOIN Явка ON Сотрудники.[Табельный № сотрудника]=Явка.[Код сотрудника]
WHERE (((Явка.[Код сотрудника])=Сотрудники![Табельный № сотрудника])
And ((Явка.Дата)>=[dateBefore] And (Явка.Дата)<=[dateAfter]))
GROUP BY Явка.[Код сотрудника]
HAVING (((Count(Явка.Явка))=True));

2 вариант работает:
Код: plaintext
1.
2.
3.
4.
5.
SELECT Явка.[Код сотрудника], Count(Явка.Явка) AS KolYavok
FROM Сотрудники INNER JOIN Явка ON Сотрудники.[Табельный № сотрудника] = Явка.[Код сотрудника]
WHERE (((Явка.[Код сотрудника])=[Сотрудники]![Табельный № сотрудника])
AND ((Явка.Дата) Between [Forms]![ЖурналХозОп1]![с] And [Forms]![ЖурналХозОп1]![по]) AND ((Явка.Явка)=True))
GROUP BY Явка.[Код сотрудника];

3 вариант тоже работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT Явка.[Код сотрудника], Count(Явка.Явка) AS KolYavok
FROM Сотрудники INNER JOIN Явка ON Сотрудники.[Табельный № сотрудника] = Явка.[Код сотрудника]
WHERE (((Явка.[Код сотрудника])=[Сотрудники]![Табельный № сотрудника])
AND ((Явка.Дата) Between [Forms]![ЖурналХозОп1]![с] And [Forms]![ЖурналХозОп1]![по]))
GROUP BY Явка.[Код сотрудника]
HAVING (((Count(Явка.Явка))=True));

К моему большому удивлению, в первом варианте я использовала не between, >= ... <=
И как только поменяла на between, то запрос начал выдавать количество не всех явок сотр-ка, а пределах дат с формы.
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462961
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Похоже, что мне надо съесть половину кепки... Выбираю ту, где нет козырька.

Во-первых, оказалось, что в HAVING действительно True ведет себя не как -1. В высшей степени странное явление. Вполне тянет на грабли и заслуживает всеобщего внимания.


Во-вторых, все равно 2-й и 3-й варианты не эквивалентны. Оказалось, что HAVING Count(...)=True - это все равно что HAVING Count(...)>0, но не HAVING Count(...)=-1 (как думал я) и не WHERE ...=True (как думала автор вопроса).
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462969
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Проверено следующим образом.

Таблица A:
f1 - counter
f2 - text
b - yes/no

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
f1 f2 b
 1   a  v
 2   a
 3   b
 4   b  v
 5   c  v
 6   c  v
 7   d
 8   d

SELECT f2 FROM A GROUP BY f2 HAVING Count(b)>0 - возвращает все 4 значения a, b, c, d.
SELECT f2 FROM A GROUP BY f2 HAVING Count(b)=True - аналогично.
SELECT f2 FROM A GROUP BY f2 HAVING Count(b)=-1 - не возвращает ничего.
SELECT f2 FROM A WHERE b=True GROUP BY f2 - возвращает a, b, c, т.е. только те значения, где есть b=True.

Итого: единственный работающий вариант - WHERE b=True.
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462971
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Итого: единственный работающий вариант - WHERE b=True

ну это как бы и подразумевалось. А вот
select count b from t having count(b)=true
- явление действительно забавное. Насколько я помню, у меня были проблемы с запросами вида

select max(boolField) from ....

, которые вместо ожидаемого 0 возвращали не 0 (сейчас не помню, 1, -1, или мифический true). Лечилось преобразованием логического поля к числу:

select max(boolField*1) from ....
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462972
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, оказалась ошибка... Проверку делала не на те месяцы, где было у сотрудника неявка, поэтому, когда пробовала разные запросы, он выдавал один и тот же правильный рез-т...Полностью согласна с ед-ым верным реш-ем...и каюсь...
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462973
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 irinka:
У меня козырек остался. Могу поделиться. :^)
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462974
irinka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)
Только, если он шоколадный
...
Рейтинг: 0 / 0
Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
    #32462975
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Бе. Я-то настоящий ел...
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Error: Не удается найти объект в семействе, соответ-щий треб-му имени или порядковому номеру
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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