Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Уровень элемента справочника (число прочтений - 5563 )
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Уровень элемента справочника
09. Декабря 2011 :: 11:40
Печать  
привет всем (1с 77)
нужно получить
Уровень элемента справочника

по тину Спр.Уровень()

как будет выглядеть запрос
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Уровень элемента справочника
Ответ #1 - 09. Декабря 2011 :: 12:27
Печать  
Я Использую функцию:
Код
Выбрать все
CREATE FUNCTION [dbo].[Уровень_Контрагенты] (@IDSpr Char(9))
RETURNS  Int
BEGIN
DECLARE @R Char(9)
DECLARE @Lev Int
	SET @Lev = 0
	SET @R = @IDSpr
	WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
	BEGIN
		SELECT
		@R = PARENTID, @Lev = @Lev + 1
		FROM SC172
		WHERE
			(ID = @R)
	END
	RETURN @Lev
END
 

  
Наверх
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #2 - 09. Декабря 2011 :: 12:30
Печать  
Спасибо попробую засунуть в запрос

+++ Правка

     ТекстЗапроса = "CREATE FUNCTION [dbo].[Уровень_Ном] (@IDSpr Char(9))
           |RETURNS  Int
           |BEGIN
           |DECLARE @R Char(9)
           |DECLARE @Lev Int
           |SET @Lev = 0
           |SET @R = @IDSpr
           |WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
           |BEGIN
           |SELECT
           |@R = PARENTID, @Lev = @Lev + 1
           |FROM $Справочник.Номенклатура
           |WHERE
           |(ID = @R)
           |END
           |RETURN @Lev
           |END
           |
           |SELECT Уровень_Ном(Номенклатура.ID) [Уровень]
           |      ,Номенклатура.DESCR [НомНаим]
           |FROM $Справочник.Номенклатура AS Номенклатура
           |";



Как использовать в запросе?
  
Наверх
 
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #3 - 12. Декабря 2011 :: 06:13
Печать  
Люди что никто не знает как функцию к запросу прикрутить.
Главное в инети найти не магу найти ни где.
И в хелпах не вижу.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Уровень элемента справочника
Ответ #4 - 12. Декабря 2011 :: 06:16
Печать  
Ну, скажем так, и не искал Улыбка)
http://msdn.microsoft.com/ru-ru/library/ms186755.aspx
смотри примеры внизу.
  
Наверх
 
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #5 - 12. Декабря 2011 :: 06:56
Печать  
Я конечно туплю но вот что мне подходит

                                                      у МЕНЯ

USE AdventureWorks2008R2; //AdventureWorks2003R2
GO
IF OBJECT_ID (N'dbo.ISOweek', N'FN') IS NOT NULL
    DROP FUNCTION dbo.ISOweek;
GO
CREATE FUNCTION dbo.ISOweek (@DATE datetime)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
     DECLARE @ISOweek int;
     SET @ISOweek= DATEPART(wk,@DATE)+1
         -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104');
--Special cases: Jan 1-3 may belong to the previous year
     IF (@ISOweek=0)
         SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
              AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1;
--Special case: Dec 29-31 may belong to the next year
     IF ((DATEPART(mm,@DATE)=12) AND
         ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
         SET @ISOweek=1;
     RETURN(@ISOweek);
END;
GO
SET DATEFIRST 1;
SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';


тАК НЕ РАБОТАЕТ

ТекстЗапроса = "USE AdventureWorks2003R2;
           |GO
         |CREATE FUNCTION [dbo].[Уровень_Ном] (@IDSpr Char(9))
           |RETURNS  Int
           |BEGIN
           |DECLARE @R Char(9)
           |DECLARE @Lev Int
           |SET @Lev = 0
           |SET @R = @IDSpr
           |WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
           |BEGIN
           |SELECT
           |@R = PARENTID, @Lev = @Lev + 1
           |FROM $Справочник.Номенклатура
           |WHERE
           |(ID = @R)
           |END
           |RETURN @Lev
           |END
           |GO
           |SELECT Уровень_Ном(Номенклатура.ID) [Уровень]
           |      ,Номенклатура.DESCR [НомНаим]
           |FROM $Справочник.Номенклатура AS Номенклатура
           |";


Так тоже нет
|CREATE FUNCTION [dbo].[Уровень_Ном] (@IDSpr Char(9))
           |RETURNS  Int
           |BEGIN
           |DECLARE @R Char(9)
           |DECLARE @Lev Int
           |SET @Lev = 0
           |SET @R = @IDSpr
           |WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
           |BEGIN
           |SELECT
           |@R = PARENTID, @Lev = @Lev + 1
           |FROM $Справочник.Номенклатура
           |WHERE
           |(ID = @R)
           |END
           |RETURN @Lev
           |END
           |GO
           |SELECT Уровень_Ном(Номенклатура.ID) [Уровень]
           |      ,Номенклатура.DESCR [НомНаим]
           |FROM $Справочник.Номенклатура AS Номенклатура
           |";
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Уровень элемента справочника
Ответ #6 - 12. Декабря 2011 :: 07:02
Печать  
>>>USE AdventureWorks2003R2

:_))
зачет, ага.

У тебя точно есть база с таким именем ?
Улыбка

ЗЫ: Если че, раздели запросы через ;
  
Наверх
 
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #7 - 12. Декабря 2011 :: 07:07
Печать  
Да тут протупил основы запросов к СКЛ.


     рс = СоздатьОбъект("ODBCRecordset");
     
     ТекстЗапроса = "USE База;
           |GO
         |CREATE FUNCTION [dbo].[Уровень_Ном] (@IDSpr Char(9))
           |RETURNS  Int
           |BEGIN
           |DECLARE @R Char(9)
           |DECLARE @Lev Int
           |SET @Lev = 0
           |SET @R = @IDSpr
           |WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
           |BEGIN
           |SELECT
           |@R = PARENTID, @Lev = @Lev + 1
           |FROM $Справочник.Номенклатура
           |WHERE
           |(ID = @R)
           |END
           |RETURN @Lev
           |END
           |GO
           |SELECT Уровень_Ном(Номенклатура.ID) [Уровень]
           |      ,Номенклатура.DESCR [НомНаим]
           |FROM $Справочник.Номенклатура AS Номенклатура
           |";
     рс.УстановитьТекстовыйПараметр("ВыбДата", ВыбДата);
     тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
     тз.ВыбратьСтроку();

C GO - ругается без тоже.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Уровень элемента справочника
Ответ #8 - 12. Декабря 2011 :: 07:09
Печать  
Прям так и база в скуле "База" зовётся ?
+ пропущена ; между функцией и запросом на селект
  
Наверх
 
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #9 - 12. Декабря 2011 :: 07:14
Печать  
ТекстЗапроса = "USE SarHolTrade;
           |GO
         |CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
           |RETURNS  Int
           |BEGIN
           |DECLARE @R Char(9)
           |DECLARE @Lev Int
           |SET @Lev = 0
           |SET @R = @IDSpr
           |WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
           |BEGIN
           |SELECT
           |@R = PARENTID, @Lev = @Lev + 1
           |FROM $Справочник.Номенклатура
           |WHERE
           |(ID = @R)
           |END
           |RETURN @Lev
           |END;
           |GO
           |SELECT Уровень_Ном(Номенклатура.ID) [Уровень]
           |      ,Номенклатура.DESCR [НомНаим]
           |FROM $Справочник.Номенклатура AS Номенклатура
           |";


не работает на GO ругается по разному пробую ни как.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Уровень элемента справочника
Ответ #10 - 12. Декабря 2011 :: 07:24
Печать  
Код
Выбрать все
ТекстЗапроса = "
	   |CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
	     |RETURNS  Int
	     |BEGIN
	     |DECLARE @R Char(9)
	     |DECLARE @Lev Int
	     |SET @Lev = 0
	     |SET @R = @IDSpr
	     |WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
	     |BEGIN
	     |SELECT
	     |@R = PARENTID, @Lev = @Lev + 1
	     |FROM $Справочник.Номенклатура
	     |WHERE
	     |(ID = @R)
	     |END
	     |RETURN @Lev
	     |END;
 


это будет работать
но так как (0) очень смутно сформулирован то не очевидно
это то что тебе нужно или нет.
  
Наверх
 
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #11 - 12. Декабря 2011 :: 07:30
Печать  
Может и будет но как к запросу его прикрутить
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Уровень элемента справочника
Ответ #12 - 12. Декабря 2011 :: 07:36
Печать  
Ё..

Код
Выбрать все
|IF OBJECT_ID (N'dbo.Уровень_Ном', N'FN') IS NOT NULL
|   DROP FUNCTION dbo.Уровень_Ном;
|	 GO
|	CREATE FUNCTION dbo.Уровень_Ном (@IDSpr Char(9))
|	RETURNS  Int
|	BEGIN
|	 DECLARE @R Char(9)
|	 DECLARE @Lev Int
|	 SET @Lev = 0
|	     SET @R = @IDSpr
|	     WHILE (@R <> $ПустойИД) AND (@R IS NOT NULL)
|	     BEGIN
|	     SELECT
|	     @R = PARENTID, @Lev = @Lev + 1
|	     FROM $Справочник.Номенклатура (nolock)
|	     WHERE
|	     (ID = @R)
|	     END
|	     RETURN @Lev
|	     END;
|	     GO
|	     SELECT dbo.Уровень_Ном(Номенклатура.ID) [Уровень]
|		   ,Номенклатура.DESCR [НомНаим]
|	     FROM $Справочник.Номенклатура AS Номенклатура (nolock)  

« Последняя редакция: 12. Декабря 2011 :: 09:00 - Eprst »  
Наверх
 
IP записан
 
werios
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 30. Октября 2009
Re: Уровень элемента справочника
Ответ #13 - 12. Декабря 2011 :: 08:54
Печать  
Этот вариант идет с ошибкой('CREATE FUNCTION' must be the first statement in a query batch.).
но я вышел из положения.
Можно вручную создать эту функцию или как я.
1. Выполняем
                 |      CREATE FUNCTION dbo.Ur_Nom (@IDSpr Char(9))
                 |      RETURNS  Int
                 |      BEGIN
                 |       DECLARE @R Char(9)
                 |       DECLARE @Lev Int
                 |       SET @Lev = 0
                 |           SET @R = @IDSpr
                 |           WHILE (@R <> '     0   ') AND (@R IS NOT NULL)
                 |           BEGIN
                 |           SELECT
                 |           @R = PARENTID, @Lev = @Lev + 1
                 |           FROM $Справочник.Номенклатура
                 |           WHERE
                 |           (ID = @R)
                 |           END
                 |           RETURN @Lev
                 |           END


2. После того как функция уже существует делаем так.
                 |           SELECT dbo.Ur_Nom(Номенклатура.ID) [Уровень]
                 |               ,Номенклатура.DESCR [Наим]
                 |           FROM $Справочник.Номенклатура AS Номенклатура


И слава Яи*а все работает

Всем спасибо за ответы
особую благодарность выражаю Eprst.
Всем еще раз спасибо за помощь
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Уровень элемента справочника
Ответ #14 - 12. Декабря 2011 :: 08:58
Печать  
Я тебе вообще-то дал рабочий код, если че.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать