Имя: Пароль:
1C
1C 7.7
v7: Не работают прямые запросы на SQL2005 64
0 pilot 560
 
30.05.12
14:02
До недавнего времени база 1с массой в 2 гига крутилась на SQL2005 Win2k3 32 бита. В один прекрасный момент на указанном сервере разъехался RAID. Благо к тому времени уже был почти установлен новый сервер, но с Win2008 R2 х64. Все копии были вовремя сняты и развернуты на новом сервере. Т.е. простоя почти не было.
Самое интересное выяснилось позже: на SQL2005 64 не отрабатывают хранимые процедуры. Т.е. запросы, создаваемые через хранимые процедуры возвращают пустой результат.
Обращение к SQL происходит посредством Rainbow.dll
В создании запросов к SQL я только начинаю разбираться,
1 ДенисЧ
 
30.05.12
14:06
"Обращение к SQL происходит посредством Rainbow.dll"

Скажите, а свою лошадь перед выездом за деревню чем вы кормите? Овсом или сеном?
2 Irek-kazan
 
30.05.12
14:07
я так понимаю, сами хранимые процедуры что-то возвращают?
3 Злой Бобр
 
30.05.12
14:15
(1) Да супом они кормят. Супом. Вот только там одна юшка и лошадь су** нехочет ехать. И за 6 лет ненаучиться элементарному тоже нужно уметь.
4 pilot 560
 
30.05.12
14:15
(1) отмачиваю ее в керосине.
конфигурация написана из ТиС 8.какого-то за последние 10 лет практически до неузнаваемости. И в каком виде она мне досталась 2 недели назад, в таком я ее пока и оставлю.
Если есть что сказать, приму к сведению.
(2) По идее должны возвращать остаток товара на складе. Как посмотреть коды ошибок, я пока не знаю. Rainbow той версии, что у нас, их не показывает.
5 Irek-kazan
 
30.05.12
14:17
на самом сервере возвращают ли данные хранимые процедуры? не через 1С!
6 pilot 560
 
30.05.12
14:18
при восстановлении базы на 32-битном серваке помогает. Но у меня он стоит локально, и для рабочей базы не пойдет.
(5) сейчас посмотрю
7 Злой Бобр
 
30.05.12
14:23
Ты нам лучше покажи что товарищ профайлер показывает при потугах вывести нужное. А потом уже загадки гадать.
8 pilot 560
 
30.05.12
14:28
кажется разобрался. Похоже ему не нравится формат даты
Msg 242, Level 16, State 3, Procedure GdeTovarLesgit, Line 43
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Дата передается в виде '30.05.2012'
9 Злой Бобр
 
30.05.12
14:31
Значит кодовую страницу в скуле неправильно выставил.
10 pilot 560
 
30.05.12
14:31
а какой он должен быть для х64? Кстати, вполне возможно он берет формат из системы. Сейчас посмотрю.
11 Z1
 
30.05.12
14:32
(8) такую дату и sql200 не поймет.
приведи текст хп.
Может у тебя на разных серверах разные хранимые процедуры ?
12 pilot 560
 
30.05.12
14:51
нет, наврал, формат даты - '30.05.12'

сама процедура:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GdeTovarLesgit] (@DatBeg Char(8),@Tovar VarChar(MAX),@Mesto VarChar(MAX))
AS
DECLARE @Tab1 Table (Tovar Char(9), Ost Float)
DECLARE @Tab2 Table (Mesto Char(9))
DECLARE @Flag1 Bit
DECLARE @idoc integer
DECLARE @Tab3 Table (Tovar Char(9), Mesto Char(9), Reserv Numeric(16,2), Ostatok Numeric(16,2), Partiy Char(9))
DECLARE @Tab4 Table (Tovar Char(9), Mesto Char(9), Reserv Numeric(16,2), Ostatok Numeric(16,2), Partiy Char(9))        
DECLARE Pusto Char(9)
SET NOCOUNT ON    
SET Pusto='     0   '                

/* Список конкретного товару */
IF @Tovar is Null
  SET @Flag1 = 0
ELSE
BEGIN
  SET @Tovar='<root><x val='+replace(@Tovar,',','/><x val=')+'/></root>'
  EXEC sp_XML_preparedocument @idoc OUTPUT, @Tovar
  INSERT INTO @Tab1 (Tovar) SELECT RIGHT('      '+RTRIM(LTRIM(Val))+'   ',9) FROM OPENXML(@idoc,'/root/x',1)
  WITH (val CHAR(9))
  EXEC sp_XML_removedocument @idoc
  SET @Flag1 = 1
END                  

/* Список конкретных мест , вернее берется товар из списка конкретных мест */
IF @Mesto is not Null
BEGIN
  SET @Mesto='<root><x val='+replace(@Mesto,',','/><x val=')+'/></root>'
  EXEC sp_XML_preparedocument @idoc OUTPUT, @Mesto
  INSERT INTO @Tab2 (Mesto) SELECT RIGHT('      '+RTRIM(LTRIM(Val))+'   ',9) FROM OPENXML(@idoc,'/root/x',1)
  WITH (val CHAR(9))
  EXEC sp_XML_removedocument @idoc
  INSERT INTO @Tab1 (Tovar, Ost) SELECT S.SP3769,SUM(S.SP3770) FROM RG3759 S WHERE S.Period=Convert(datetime,@DatBeg)
       and (S.SP3762 in (SELECT Mesto From @Tab2)) GROUP BY S.SP3769,S.SP3762 HAVING SUM(S.SP3770)<>0
  SET @Flag1 = 1        
END    

/* Товар, Место,Резерв,Остаток=0 */
INSERT INTO @Tab3 (Tovar,Mesto, Reserv, Ostatok,Partiy)
SELECT R.SP4518,R.SP4517,SUM(R.SP4523),0,R.SP4521 FROM RG4516 R WHERE R.Period=Convert(datetime,@DatBeg)
   and (R.SP4517<>Pusto)
   and (((@Flag1=1) and (R.SP4518 in (SELECT Tovar From @Tab1))) or (@Flag1=0))
    GROUP BY R.SP4518,R.SP4517,R.SP4521
UPDATE @Tab3 SET Reserv=0 Where Reserv is Null
/* Товар, Место, Резерв=0, Остаток */
INSERT INTO @Tab3 (Tovar,Mesto,Reserv,Ostatok,Partiy)
SELECT S.SP3769,S.SP3762,0,SUM(S.SP3770),S.SP4057 FROM RG3759 S WHERE S.Period=Convert(datetime,@DatBeg)
   and (((@Flag1=1) and (S.SP3769 in (SELECT Tovar From @Tab1))) or (@Flag1=0))
       GROUP BY S.SP3769,S.SP3762,S.SP4057

UPDATE @Tab3 SET Ostatok=0 Where Ostatok is Null

INSERT INTO @Tab4 (Tovar,Mesto,Reserv,Ostatok,Partiy)
SELECT Tovar,Mesto,SUM(Reserv),SUM(Ostatok),Partiy FROM @Tab3 GROUP BY Tovar,Mesto,Partiy
/* Все что Остаток не равен нулю */
SET NOCOUNT OFF
SELECT Tovar,Mesto,Reserv,Ostatok,Partiy FROM @Tab4 WHERE Ostatok<>0
13 Злой Бобр
 
30.05.12
14:56
(10) Cyrillic_general_CI_AS
И для скуля и для базы. Плюс файлик OrdNoChk.prm в каталог базы 1С.
14 Mikeware
 
30.05.12
14:58
GdeTovarLesgit - улыбнуло.
Хорошо еще, что не Gde_Blyad_Tovar
15 pilot 560
 
30.05.12
15:00
процедура отрабатывает, но выводит пустой результат.
Данные есть. Инфа 110%
16 Irek-kazan
 
30.05.12
15:01
(14) думаешь если процедуру переименовать, покажет что-нить?
17 pilot 560
 
30.05.12
15:01
(13) все это есть
18 Mikeware
 
30.05.12
15:06
(15) Значит, отлаживай процедуру.
19 viktor_vv
 
30.05.12
15:07
А так
Вместо

Convert(datetime,@DatBeg)

Написать

Convert(datetime,@DatBeg,2)

Но он по идее и в 2000 не должон был работать, там по умолчанию третий параметр 0.
20 viktor_vv
 
30.05.12
15:09
(19)+ Это для даты в строке с годом без столетий.
21 viktor_vv
 
30.05.12
15:11
(19)+ А не прогнал. Там другой формат для 2.
22 Ёпрст
 
30.05.12
15:36
>>>нет, наврал, формат даты - '30.05.12'

это монопенисуально в данном случае.
:)
23 pilot 560
 
30.05.12
16:05
(22) но тем не менее из 1с дата передается в таком виде, и ошибок не возникает. В большинстве случаев. Вот только в случае 64 бит результат пуст.
24 pilot 560
 
30.05.12
16:06
а сказано красиво :)
25 Mikeware
 
30.05.12
16:15
(24) Посмотри, какие аргументы передаются, и отлаживай в КвА с такими же аргументами....
26 Ёпрст
 
30.05.12
16:18
(23) и это не верно, надо как минимум строкой 20120121
27 pilot 560
 
30.05.12
16:27
в общем действительно, поправил в параметрах функции Convert(). После этого результаты появились.
Сделал Convert(datetime,@DatBeg,4)
Ошибка? Это не ошибка, это системная функция.