powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Почему %ROWCOUNT возвращает пустую строку?
16 сообщений из 16, страница 1 из 1
Почему %ROWCOUNT возвращает пустую строку?
    #37002571
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
testRowCount() public {
	s stmt = ##class(%SQL.Statement).%New()
	d stmt.%Prepare("SELECT * FROM tables.sample")
	s rset = stmt.%Execute() 
	
	if rset.%ROWCOUNT = "" {
		w "%ROWCOUNT - пустая строка"
	} else {
		w "%ROWCOUNT = "_rset.%ROWCOUNT
	}
	
	w !,"SQLCODE = "_rset.%SQLCODE
	
	while rset.%Next() {
		w !,"ID = "_rset.%GetData( 1 )
	}
}
В независимости от наличия записей, всегда получаем "%ROWCOUNT - пустая строка" и SQLCODE=0 (вроде бы SQLCODE должен быть 100, если нет записей?). Что не так?
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37002634
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Что не так?
В примерах фигурирует только такое использование

Код: plaintext
1.
2.
3.
4.
5.
 NEW SQLCODE,%ROWCOUNT,%ROWID
 &sql(UPDATE MyApp.Employee 
     Set Salary = (Salary *  1 . 1 )
     WHERE Salary <  50000 )

 Write "Employees: ", %ROWCOUNT,!
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37002658
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что они там пишут?

докаmethod %Execute(%parm...) as %SQL.StatementResult
Execute the current statement. If the statement result indicates an error then return an error status. The result of the execute is always the retrun value. Success/Failure information is reported in the result object as %SQLCODE, %Message, %ROWCOUNT, and/or %ROWID. %parm... - variable number of arguments that represent the values to be bound to parameters contained in pStatementText. only parameters with input direction (input or input-output) are actually used but a position for each '?' contained in An example of calling %Execute for a prepared statement "? = call Sample.PersonSets(?,?)" is: set tStatement = ##class(%SQL.Statement).%New() set tStatus = tStatement.%Prepare("?=call Sample.PersonSets(?,?)") set tResult = tStatement.%Execute(,"A","NY") In this example, the return value is allocated a position in the %parms list (the ','), "A" is bound to the first argument passed to Sample.PersonSets and "NY" is bound to the second. This method returns a %SQL.StatementResult object.
А то переводчики какую-то фигню на этот текст дают...
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37002680
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

А в чем отличие? )

Окей, перефразируем вопрос. То что в %ROWCOUNT может быть мусор я уже вычитал поиском по форуму (хотя это жесть конечно!), но почему SQLCODE не равен 100 при отсутствии записей в таблице? Как мне узнать есть ли в record set элементы?...
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37002759
newbie'
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coder1cv8,

В документации хоть и написано, про %Execute "The result of the execute is always the retrun value. Success/Failure information is reported in the result object as %SQLCODE, %Message, %ROWCOUNT, and/or %ROWID",
но %ROWCOUNT и %SQLCODE заполняются после итератора %Next().
Посмотрите, например, $system.OBJ.Dump(rset) до и после %Next().

"%Next() returns 1 to indicate that it is positioned on a row or 0 to indicate that it is positioned after the last row (at the end of the result set). If the cursor is positioned after the last row, the value of %ROWCOUNT indicates the number of rows contained in the result set. At any other time, %ROWCOUNT contains the number of rows retrieved thus far."
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37002813
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
newbie',

офигеть!

А есть ли таки способ узнать пустой или нет record set?
Ну кроме if rset.%Next() - этот способ сдвинет указатель record set-a.
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37002902
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нда... Почитал внимательнее документацию.
%ROWCOUNT - это просто счетчик, заполняется при вызовах %Next()
а SQLCODE равен 100 только когда Next-ом перебираем record set до конца.

Cache удивляет меня все больше и больше (в негативном смысле), предыдущий вопрос остается актуальным...
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37003007
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8 ,

Каждый класс рассчитан на те возможности, которые описаны в документации по нему.
В Caché есть однонаправленные и двунаправленные наборы данных. Они имеют разные возможности и решают разные задачи.

Для Вашего случая подойдёт класс %ScrollableResultSet :

set rs = ##class(%ScrollableResultSet).%New()
do rs.Prepare("SELECT * FROM tables.sample")
do rs.Execute()
write "Total row count=",rs.Count(),!
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37003587
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8А в чем отличие? )
Как минимум в синтаксисе.
Твой запрос динамический и от классов (тех что в запросе) не зависит. В другом варианте все будет сделано в момент компиляции программки. Причем четко под классы на момент компиляции.
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37003610
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамические запросы тоже компилятся в классы и программы (правда маленько другие), а потом они статически запускаются. Соотвественно, всякие %ROWCOUNT и SQLCODE это побочный продукт работы этих программ, при работе через классы нужно использовать интерфейсы классов.

%ROWCOUNT имеет смысл при update,delete,insert.
Какой смысл оно имеет при пошаговой выборке - непонятно.
Тем более, оно не должно считаться до окончания выборки - и это в любом случае. До завершения выборки всех записей оно просто не может взяться ниоткуда

SQLCODE не станет 100 до первой выборки, и оно означет именно, что "В этой выборке строки ничего не было получено". Также и при чтении файла EOF не установится до тех пор, пока вы не попытаетесь прочитать конец файла.

Если вам нужно отслеживать пустоту запроса до входа в цикл, то либо делаейте отдельный запрос на количество записей, либо организовывайте алгоритм иначе, например так:

Код: plaintext
1.
2.
3.
4.
5.
6.
&sql(open cc)
&sql(fetch cc)
if SQLCODE  w !,"Беда, нет ничего!"
while 'SQLCODE
  {
   &sql(fetch cc)
  }
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37003666
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.правда маленько другие
Таки и я про то же...
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37003740
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спасибо за %ScrollableResultSet - это то что мне нужно! )
Просто у меня легкий шок вызвало отсутствие Count-a в рекорд сет-е из примеров в документации, простите уж )
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37004780
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мне не изменяет склероз - то %ROWCOUNT это не количество _выбранных_ строк - это количество обработанных строк.

Оно меняется только в INSERT/UPDATE запросах - в SELECT запросах она не определена
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37004791
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Просто у меня легкий шок вызвало отсутствие Count-a в рекорд сет-е из примеров в документации, простите уж )

Код: plaintext
SELECT COUNT(id) as CNT,* FROM tables.sample

И все дела.... автоматическое вычисление Count это конечно удобная фича - но порой очень "дорогая" в плане выполнения.
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37005452
Rus000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ptnавтоматическое вычисление Count это конечно удобная фича - но порой очень "дорогая" в плане выполнения.

при наличии битмапа в классе - доли секунды
...
Рейтинг: 0 / 0
Почему %ROWCOUNT возвращает пустую строку?
    #37005483
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rus000Ptnавтоматическое вычисление Count это конечно удобная фича - но порой очень "дорогая" в плане выполнения.

при наличии битмапа в классе - доли секунды

Ключевые слова "порой" и "автоматическое" - куда логичнее оставить решение о вычислении числа записей на программиста - ему должно быть виднее когда это потребуется.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Почему %ROWCOUNT возвращает пустую строку?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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