| 
			| 
					
						| little | 
								|  | «  : 11-08-2003 11:53 »  |  | 
 
 Есть запрос, формирующий результат и сортирующий его по категории, подкатегории и номеру позиции. Бывает, что подкатегория отсутствует ( is NULL), в этом случае эта строка лезет на самый верх в данной категории. Мне же нужно, чтобы она была внизу (последней в своей категории), как это сделать? SELECT tp.PriceLIstCategoryID, tpc.PriceListCategoryName, tp.PriceListSubCategoryID, tpsc.PriceListSubCategoryName, tp.ServiceID, tp.ServiceName, tp.PriceListLineNumber, tp.ServicePrice1, tp.ServicePrice2
 From tblPriceList As tp, tblPriceListCategories As tpc, tblPriceListSubCategories As tpsc
 Where tp.PriceListCategoryID=tpc.PriceListCategoryID And )tp.PriceListSubCategoryID = tpsc.PriceListSubCategoryID:
 UNION ALL SELECT tp.PriceLIstCategoryID, tpc.PriceListCategoryName, tp.PriceListSubCategoryID, Null As PriceListSubCategoryName, tp.ServiceID, tp.ServiceName, tp.PriceListLineNumber,
 tp.ServicePrice1, tp.ServicePrice2
 From tblPriceList As tp, tblPriceListCategories As tpc
 Where tp.PriceListCategoryID=tpc.PriceListCategoryID And )tp.PriceListSubCategoryID Is Null:
 Order By tp.PriceListCategoryID, tp.PriceLIstSubCategoryID, tp.PriceListLineNumber;
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #1 : 11-08-2003 12:03 »  |  | 
 
 Нужно использовать чтото типа Order By tp.PriceListCategoryID, isnull(tp.PriceListSubCategoryID,100000) , tp.PriceListLineNumber;
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #2 : 11-08-2003 12:30 »  |  | 
 
 Order By tp.PriceListCategoryID, isnull(tp.PriceListSubCategoryID,100000) , tp.PriceListLineNumber; Наверно все-таки ifnull() |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #3 :  11-08-2003 12:47 »   |  | 
 
 Нет именно isnull. Главное чтобы слитно.  is null или is not null  используется в where  , а isnull это функция. |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #4 : 11-08-2003 13:01 »  |  | 
 
 Дык, isnull имеется в Access-овском SQL или нет? Неизвестно?
 Да и вообще, что она делает?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #5 : 11-08-2003 13:19 »  |  | 
 
 Ну не знаю как у "вас", а у нас isnull() принимает один аргумент - вот я и подумал что ошибка. А ifnull() тут как раз вписывается. Дык, isnull имеется в Access-овском SQL или нет? Неизвестно? Попробуй - узнаешь.isnull(x)  возвращает логическое значение true (или 1 - у какого как) на x равное NULL и, соотв., false (0) на NOT NULL.ifnull(x,y)  - если x не равно NULL, то его же и возвращает, иначе y. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #6 : 12-08-2003 05:50 »  |  | 
 
 То есть в данном случае мне предлагается вместо Null выплевывать огромное значение, которое будет заведомо больше всех имеющихся? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #7 : 12-08-2003 06:12 »  |  | 
 
 Да, или -1 и выполнять сортировку с DESC. В  SQL Server(помню что у тебя акцес и не уверен что прокатит ) можно еще и так Order By tp.PriceListCategoryID,
 
 case when tp.PriceListSubCategoryID is null then 1 else 0 end, --  создаем еще один критерий сортировки
 
 tp.PriceListSubCategoryID , tp.PriceListLineNumber
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #8 : 12-08-2003 07:20 »  |  | 
 
 case when tp.PriceListSubCategoryID is null then 1 else 0 end А вот как раз эту длинную строчку и призвана заменять ф-ия isnull() . Если, конечно, она есть в access-е... Кстати, есть ли у кого нормальная документация по access (97,2000 - хоть какая)? На msdn library нашел только мусор. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #9 : 12-08-2003 07:39 »  |  | 
 
 Цитата:
 case when tp.PriceListSubCategoryID is null then 1 else 0 end
 
 А вот как раз эту длинную строчку и призвана заменять ф-ия isnull() . Если, конечно, она есть в access-е...
 
 Не совсем верно, isnull заменяет NULL осмысленым значением и только его. А здесь иметт место четкое разбиение на две группы(еще один критерий). Элегантно обходим ситуацию  когда ID  догонит заведомо болшее значение. |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #10 : 12-08-2003 07:46 »  |  | 
 
 2PSD: из твоих слов нахожу, что MSSQL и MySQL серьезно различаются. В MySQL isnull() возвращает не что попало, а 0 или 1. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #11 : 12-08-2003 08:21 »  |  | 
 
 Это не MSSQL а T-SQL   В MySQL isnull() возвращает не что попало, а 0 или 1.
 
 В Т-SQL  аналогом будет конструкция [поле]  is [not] null   и собственно это помоему из ANSY SQL 2.  Но это не суть важно главное сама идея, как ее закодировать это другой вопрос. |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #12 : 12-08-2003 08:46 »  |  | 
 
 Выражение "IS NULL" тоже есть и используется там где положено (после ON, WHERE и т.п.), а "ISNULL()" - это ф-ий, которая также может использоваться между SELECT и FROM. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #13 : 12-08-2003 08:55 »  |  | 
 
 Понятно, это я упустил из виду. В Т-TSQL аналога нет но всегда можно воспользоваться CASE.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #14 : 12-08-2003 11:25 »  |  | 
 
 Диалекты... |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #15 : 12-08-2003 11:35 »  |  | 
 
 Сейчас испытаю case, но очень не уверен в его наличии... |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #16 : 12-08-2003 12:01 »  |  | 
 
 Нет, не ведает Access о наличии case...   Ну, в общем, я подставил мульён в качестве ID-шника, в данной ситуации они до него все равно никогда не доберутся. Теперь все красиво. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #17 : 12-08-2003 12:09 »  |  | 
 
 Слабоват что-то access...Если пишешь на C, то порекомендую MySQL - есть такая фича как embedded server. Это когда движок сервера подключается к программе как обычная библиотека - работать можно так же как и с "обычным" сетевым сервером.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #18 : 13-08-2003 05:35 »  |  | 
 
 Уж слишком дохрена там уже понаписано, чтобы переводить на C. Да и не работал я с базами из под C  вообще. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| query 
								Гость
 | 
								|  | « Ответ #19 : 13-08-2003 05:54 »  |  | 
 
 Нет, не ведает Access о наличии case...   Ну, в общем, я подставил мульён в качестве ID-шника, в данной ситуации они до него все равно никогда не доберутся. Теперь все красиво.по моему самый простой способ в Access это SELECT IIF(ISNULL(<Поле>), 100000, <поле>) ..... а в TSQL (MS SQLServer) еще проще SELECT ISNULL(<Поле>, 100000) .... |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #20 : 13-08-2003 13:02 »  |  | 
 
 по моему самый простой способ в Access это SELECT IIF(ISNULL(<Поле>), 100000, <поле>) А по-моему Вы тут что-то напутали. IIF - это VB-шный оператор, которого в SQL никак не присутствует. По описаниям от MS, в Access имеется аналог ANSI SQL-89, в MS Jet 4.0 OLE DB он немного расширен и поддерживает некоторые вещи из ANSI SQL-92, многие из которых работают только для adp-проектов (т.е. в клиент серверных приложениях). Таким образом Access обычно что-то не умеет из стандартов SQL, а говорить о том, что в его SQL-е есь что-то свое (вроде IIF) тут уж не приходится. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| PSD 
								Главный специалист    Offline 
								Пол:    | 
								|  | « Ответ #21 : 14-08-2003 04:22 »  |  | 
 
 Таким образом Access обычно что-то не умеет из стандартов SQL, а говорить о том, что в его SQL-е есь что-то свое (вроде IIF) тут уж не приходится.
 
 Спорить не буду(не знаю я акцес ) но помоему в Access очень плотно сплетен SQL и VBA поэтому такой вариант(с IIF) может запросто работать как и другие VB функции. |  
						| 
								|  |  
								|  |  Записан | 
 
 Да да нет нет все остальное от лукавого. |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #22 : 16-08-2003 11:32 »  |  | 
 
 Нет, эта штука работает только в VBA, а также используется в значениях полей форм и отчетов, SQL же в Акцессе порезаный, а не "усиленный"   Вопрос в догонку: Подключил библиотеку объектов ADO (ActiveX Data Objects), которая позволяет пользоваться более мощным SQL, чем DAO, в частности позволяет использовать хранимые процедуры (правда их не сравнить с T-SQL, но все же), виды, менять связи, управлять пользователями и разрешениями, и использовать транзакции. И вот этот кусок не делает того что я от него хочу: Public Function DropEmployee)id As Long: As BooleanDim cmd As ADODB.Command
 
 DropEmployee = False
 Set cmd = New ADODB.Command
 cmd.ActiveConnection = CurrentProject.Connection
 cmd.CommandText = "Begin Transaction"
 On Error GoTo Sql_Error
 cmd.Execute
 cmd.CommandText = "Delete * From tblWorkDayServices Where WorkDayID In )Select WorkDayID From tblWorkDays " _
 & "Where EmployeeID = " & id & ":"
 cmd.Execute
 cmd.CommandText = "Delete * From tblWorkDayLines Where WorkDayID In )Select WorkDayID From tblWorkDays " _
 & "Where EmployeeID = " & id & ":"
 cmd.Execute
 cmd.CommandText = "Delete * From tblWorkDays Where EmployeeID = " & id
 cmd.Execute
 cmd.CommandText = "Delete * From tblAppointments Where EmployeeID = " & id
 cmd.Execute
 cmd.CommandText = "Delete * From tblEmployees Where EmployeeID = " & id
 cmd.Execute
 cmd.CommandText = "Commit"
 cmd.Execute
 DropEmployee = True
 Exit Function
 
 Sql_Error{
 cmd.CommandText = "Rollback"
 cmd.Execute
 End Function
Что не так? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| little | 
								|  | « Ответ #23 : 19-08-2003 06:25 »  |  | 
 
 Может, есть у кого какие мысли? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| wiz 
								Гость
 | 
								|  | « Ответ #24 : 31-01-2006 19:17 »  |  | 
 
 я сам мечтаю розобраться в загадочном SQL (особенно с "select*") и в VBA еслиб меня кто небуть розчехлил...    |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| HandKot 
								Молодой специалист    Offline | 
								|  | « Ответ #26 : 07-02-2006 06:17 »  |  | 
 
 Вопрос в догонку:
 Подключил библиотеку объектов ADO (ActiveX Data Objects), которая позволяет пользоваться более мощным SQL, чем DAO, в частности позволяет использовать хранимые процедуры (правда их не сравнить с T-SQL, но все же), виды, менять связи, управлять пользователями и разрешениями, и использовать транзакции.
 ...
 
 Что не так?
 
 У объекта Conection усть свои методы BeginTransaction, CommitTransaction и RollBackTransaction, т.е давать команду на выполнение cmd.CommandText = "Begin Transaction"  не надо, а правильнее использовать встроенные методы |  
						| 
								|  |  
								|  |  Записан | 
 
 I Have Nine Lives You Have One OnlyTHINK!
 |  |  | 
	|  |