Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) 1c++ и функции t-sql (число прочтений - 4092 )
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
1c++ и функции t-sql
18. Июля 2011 :: 20:11
Печать  
В запросе вызывается функция. При ВыполнитьИнструкцию в результирующей таблице есть строки, в которых функция не вернула результат. При выполнении запроса в Query Analyzer по всем строкам функция возвращает, то что должна вернуть.
Сталкивался ли кто с подобной проблемой? Какие есть рецепты?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1c++ и функции t-sql
Ответ #1 - 19. Июля 2011 :: 05:32
Печать  
Покажи функцию и её вызов
  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #2 - 19. Июля 2011 :: 05:36
Печать  
SELECT
     |      sc4432.ID gros_d
     |      , СпрСотр.ID AS МОС
     |      , zay.Товар AS Товар
     |      , zay.ГодВыпуска AS ГодВыпуска
     |      , zay.IDDoc AS ЗаявкаПокупателя 
     |      , pro.IDDoc AS Проработка
     |      , zay.dv zaydv
     |      , pro.dv prodv
     |      , dbo.GetGoodProMax(zay.Товар, zay.dv) GetGoodProMax
     |      , dbo.GetSecDiffEmpl(LEFT(zay.dv, 17), LEFT(pro.dv, 17), '56464') СкоростьПроработки

Вызов

Вот сама функция

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


ALTER             FUNCTION dbo.GetSecDiffEmpl(@_beg Char(17), @_end Char(17), @_Empl Char(9)) RETURNS Int AS 
BEGIN


If @_Empl='     0   '
     Return 0
Else If @_Empl Is Null
     Return 0


Declare @d DateTime, @t DateTime, @nSec Int
Set @d=Left(@_beg,8)
Set @nSec=0

Declare @gr Char(9), @wd Int
Declare @ts DateTime, @te DateTime, @tos DateTime, @toe DateTime

/*-------------------------------------------------*/
While @d<@_end
     Begin

     --выходной или рабочий день
     If DatePart(dw, @d)=7 Or DatePart(dw, @d)=1
           Set @wd=1
     Else
           Set @wd=2
     
     --отклонения от нормы записываются в спр Праздники
     Select @wd=sc4742.sp4740 From sc4742(Nolock) Where sc4742.sp4739=Convert(Char(8), @d, 112)
     
     --берем график из сотрудника
     Set @gr = Null
     Select Top 1 @gr=value From _1sconst(Nolock) Where id=4745 And objid=@_Empl And date<=@d Order By date Desc, time Desc, docid Desc
     If @gr Is Null
           Select Top 1 @gr=value From _1sconst(Nolock) Where id=4711 And objid='     0   ' And date<=@d Order By date Desc, time Desc, docid Desc
     
     --считываем время по графику
     If @wd=1
           Select @ts=sc4730.sp4725+':00', @te=sc4730.sp4726+':00', @tos=sc4730.sp4727+':00', @toe=sc4730.sp4728+':00' From sc4730(Nolock) Where id=@gr
     Else
           Select @ts=sc4730.sp4721+':00', @te=sc4730.sp4722+':00', @tos=sc4730.sp4723+':00', @toe=sc4730.sp4724+':00' From sc4730(Nolock) Where id=@gr
     
     --считаем кол-во секунд
     If @tos='00:00:00' --без обеда
           Begin
           If @d=Left(@_beg,8)
                 Begin
                 Set @t=SubString(@_beg,10,8)
                 If      @t>@te
                       Begin
                       Set @ts=@te
                       End
                 Else If @t>@ts
                       Begin
                       Set @ts=@t
                       End
                 End
           If @d=Left(@_end,8)
                 Begin
                 Set @t=SubString(@_end,10,8)
                 If      @t<@ts
                       Begin
                       Set @te=@ts
                       End
                 Else If @t<@te
                       Begin
                       Set @te=@t
                       End
                 End
     
           Set @nSec=@nSec+DateDiff(ss, @ts, @te)
           End
     
     Else
           Begin
           If @d=Left(@_beg,8)
                 Begin
                 Set @t=SubString(@_beg,10,8)
                 If      @t>@te
                       Begin
                       Set @ts=@tos
                       Set @toe=@te
                       End
                 Else If @t>@toe
                       Begin
                       Set @ts=@tos
                       Set @toe=@t
                       End
                 Else If @t>@tos
                       Begin
                       Set @ts=@tos
                       End
                 Else If @t>@ts
                       Begin
                       Set @ts=@t
                       End
                 End

           If @d=Left(@_end,8)
                 Begin
                 Set @t=SubString(@_end,10,8)
                 If      @t<@ts
                       Begin
                       Set @te=@toe
                       Set @tos=@ts
                       End
                 Else If @t<@tos
                       Begin
                       Set @te=@toe
                       Set @tos=@t
                       End
                 Else If @t<@toe
                       Begin
                       Set @te=@toe
                       End
                 Else If @t<@te
                       Begin
                       Set @te=@t
                       End

                 End

           Set @nSec=@nSec+DateDiff(ss, @ts, @tos)
           Set @nSec=@nSec+DateDiff(ss, @toe, @te)
           End

     Set @d=DateAdd(dd, 1, @d)
     End
/*-------------------------------------------------*/


Return @nSec


END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #3 - 19. Июля 2011 :: 06:03
Печать  
Еще какие данные может нужны?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: 1c++ и функции t-sql
Ответ #4 - 19. Июля 2011 :: 06:22
Печать  
Локали 1Ски и QA совпадают?
Особенно, учитывая использование datepart(dw, ...) и неявные преобразования из строк в даты
  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #5 - 19. Июля 2011 :: 06:30
Печать  
Локалки одинаковые. Более того из 1с после обнаружения глюка выполняю этот же запрос обычным ADODB.Recordset - все работает.
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: 1c++ и функции t-sql
Ответ #6 - 19. Июля 2011 :: 08:19
Печать  
Попробовать оставить только один return в функции. Какие-то глюки были в MSSQL2000, если в функции несколько return, вот только уже не помню какие.
  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #7 - 19. Июля 2011 :: 09:03
Печать  
в MSSQL все работает без глюков. Глюк в 1с++
  
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: 1c++ и функции t-sql
Ответ #8 - 19. Июля 2011 :: 10:25
Печать  
А я вот что-то не уверен, что это именно 1с++. Глюки они на то и глюки, чтобы проявлять себя самым неожиданным образом и в неожиданных местах.
  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #9 - 19. Июля 2011 :: 10:28
Печать  
Согласен. Но именно от 1с++ пришлось отказаться при реализации данной задачи. Так что пока других данных нет считаем, что глюк в 1с++.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: 1c++ и функции t-sql
Ответ #10 - 20. Июля 2011 :: 06:25
Печать  
А профилером смотрел, что 1С++ (объект Recordset) отправляет на скуль?
  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #11 - 20. Июля 2011 :: 06:31
Печать  
Нет не смотрел. Выполнил только Отладка(1) и этот код в QUery Analizer закинул и в ADODB.Recordset его же выполняю.
Но фишка в том, что функция не выдает результат только для меньшей части получаемых записей.
У меня складывается стойкое впечатление, что глюк происходит на этапе заполнения результатами запроса ТаблицыЗначений в методе ВыплолнитьИнструкцию.
  
Наверх
 
IP записан
 
Rom
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 28
Местоположение: Москва
Зарегистрирован: 21. Ноября 2008
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #12 - 20. Июля 2011 :: 06:33
Печать  
Посмотрю в Profiler как время будет. О результате сообщу.
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: 1c++ и функции t-sql
Ответ #13 - 20. Июля 2011 :: 12:49
Печать  
может с
Код
Выбрать все
set nocount on 


надо "поиграться"?
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать