Список форумов Акцент Акцент
официальный форум разработчика программы Акцент
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Вызов процедуры

 
Начать новую тему   Ответить на тему    Список форумов Акцент -> Акцент 6.0
Предыдущая тема :: Следующая тема  
Автор Сообщение
virainf



Зарегистрирован: 15.01.2009
Сообщения: 58

СообщениеДобавлено: Пн Ноя 09, 2009 1:37 pm    Заголовок сообщения: Вызов процедуры Ответить с цитатой

Вот что творится: есть отчет, в котором есть функция:

Цитата:
Function RSFunction(ByRef RES1)
Dim RecS
Set Cn = WorkArea.AdoConnection
Cn.CursorLocation = adUseClient
Set Cmd = CreateObject("ADODB.Command")
Set Cmd.ActiveConnection = Cn
Cmd.CommandTimeOut = 3000
Cmd.CommandType = adCmdStoredProc
Cmd.CommandText = "p_ZbKilkDniv_RB_EN"

Cmd.Parameters.Append Cmd.CreateParameter("@StrAcCr", adVarChar, adParamInput,4000, StrAcCr)
Cmd.Parameters.Append Cmd.CreateParameter("@StrAcDb", adVarChar, adParamInput,4000, StrAcDb)
Cmd.Parameters.Append Cmd.CreateParameter("@StrAg", adVarChar, adParamInput,4000, StrAg)
Cmd.Parameters.Append Cmd.CreateParameter("@StrEnt", adVarChar, adParamInput,4000, StrEnt)
Cmd.Parameters.Append Cmd.CreateParameter("@StrMisc", adVarChar, adParamInput,4000, StrMisc)
Cmd.Parameters.Append Cmd.CreateParameter("@pDStart", adDate, adParamInput,, CDate(Workarea.Map("RB_Otchot_Run_TVikUk.ArStart")))
Cmd.Parameters.Append Cmd.CreateParameter("@pDEnd", adDate, adParamInput,, CDate(Workarea.Map("RB_Otchot_Run_TVikUk.ArEnd")))
' Вызов диалога
ShowDlgVibZerna
Cmd.Parameters.Append Cmd.CreateParameter("@StrSklad", adVarChar, adParamInput,4000, Workarea.Map("RB_VidbirZerna.Sklad"))
Cmd.Parameters.Append Cmd.CreateParameter("@pVidZerna", adVarChar, adParamInput,4000, Workarea.Map("RB_VidbirZerna.Zerno"))

Set RecS= CreateObject("ADODB.Recordset")
RecS.Open Cmd,, 2
If Not RecS.EOF Then
Set RES1 = RecS.Clone
RSFunction = True
Else
RSFunction = False
End If
RecS.Close
End Function


При вызове этой функции начинаются "тормоза"!!! Тормозит капитально! Не только у меня, но и у других пользователей, которые работают с Акцентом.
При чем если я прекращаю виполнение отчета, то тормоза продолжаются.
Вот текст процедуры p_ZbKilkDniv_RB_EN:

Цитата:
CREATE PROCEDURE p_ZbKilkDniv_RB_EN
@StrAcCr nvarchar(4000), -- счета кредита при приходе зерна (счет дебета при расходе)
@StrAcDb nvarchar(4000), -- счета дебета при приходе зерна (счет кредита при расходе)
@StrAg nvarchar(4000),
@StrEnt nvarchar(4000),
@StrMisc nvarchar(4000), -- ID разного (договора)
@pDStart smalldatetime,
@pDEnd smalldatetime,
@StrSklad nvarchar(4000),
@pVidZerna nvarchar(4000) = N'A' -- отбор зерна (на хранении - Z, собственного - S или всего - A)
AS
SET NOCOUNT ON
Declare @StrParam2 varchar(100)
Declare @Date smalldatetime
Declare @StrSQL nvarchar(4000)
Declare @StrSQL0 nvarchar(4000)
Declare @StrSQL1 nvarchar(4000)
Declare @StrSQL2 nvarchar(4000)
Declare @StrSQL3 nvarchar(4000)
Declare @StrSQL4 nvarchar(4000)
Declare @StrSQL5 nvarchar(4000)
Declare @StrSQL6 nvarchar(4000)

Declare @Prm nvarchar(4000)
SET @StrParam2 = 'Число3' -- назва параметру проводки, де збеігається залікова вага !!!
SET @StrAcCr = Rtrim(Ltrim(@StrAcCr))
IF Len(@StrAcCr) = 0 SET @StrAcCr = ''
SET @StrAcDb = Rtrim(Ltrim(@StrAcDb))
IF Len(@StrAcDb) = 0 SET @StrAcDb = ''
SET @StrAg = Rtrim(Ltrim(@StrAg))
IF Len(@StrAg) = 0 SET @StrAg = ''
SET @StrEnt = Rtrim(Ltrim(@StrEnt))
IF Len(@StrEnt) = 0 SET @StrEnt = ''
IF Len(@StrSklad) = 0 SET @StrSklad = ''

SET @Date = @pDStart
--SELECT @StrAcCr AS CR, @StrAcDb AS DB, @StrAg AS AG, @StrEnt AS ENT
CREATE TABLE #TempZalishokPoDnyam (Data smalldatetime, ZalishokStart money, Prihod money,Vidatok money, ZalishokEnd money, KilkDniv int, Zalishok money)
SET @StrSQL = ''
SET @StrSQL0 = ''
SET @StrSQL1 = ''
SET @StrSQL2 = ''
SET @StrSQL3 = ''
SET @StrSQL4 = ''
SET @StrSQL5 = ''
SET @StrSQL6 = ''

SET @StrSQL0 = N' INSERT #TempZalishokPoDnyam (Data,ZalishokStart,Prihod,Vidatok,ZalishokEnd)'
SET @StrSQL0 = @StrSQL0 + N' SELECT @Date,'
-- ZalishokStart
SET @StrSQL0 = @StrSQL0 + N' SUM(CASE WHEN J_DATE < @Date'
IF @StrAcCr > '' SET @StrSQL0 = @StrSQL0 + N' AND ACC_CR in (' + @StrAcCr + N')'
IF @StrAcDb > '' SET @StrSQL0 = @StrSQL0 + N' AND ACC_DB in (' + @StrAcDb + N')'
IF @StrAg > '' SET @StrSQL0 = @StrSQL0 + N' AND J_AG1 in (' + @StrAg + N')'
SET @StrSQL0 = @StrSQL0 + N' THEN JOURNAL.J_QTY WHEN J_DATE <Date>= @Date AND J_DATE <DATEADD>= @Date AND J_DATE < DATEADD(dd,1,@Date)'
IF @StrAcDb > '' SET @StrSQL2 = @StrSQL2 + N' AND ACC_CR in (' + @StrAcDb + N')'
IF @StrAcCr > '' SET @StrSQL2 = @StrSQL2 + N' AND ACC_DB in (' + @StrAcCr + N')'
IF @StrAg > '' SET @StrSQL2 = @StrSQL2 + N' AND J_AG2 in (' + @StrAg + N')'
SET @StrSQL2 = @StrSQL2 + N' THEN JOURNAL.J_QTY ELSE 0 END) AS Vidatok , '
-- ZalishokEnd
SET @StrSQL3 = @StrSQL3 + N' SUM(CASE WHEN J_DATE < DATEADD(dd,1,@Date)'
IF @StrAcCr > '' SET @StrSQL3 = @StrSQL3 + N' AND ACC_CR in (' + @StrAcCr + N')'
IF @StrAcDb > '' SET @StrSQL3 = @StrSQL3 + N' AND ACC_DB in (' + @StrAcDb + N')'
IF @StrAg > '' SET @StrSQL3 = @StrSQL3 + N' AND J_AG1 in (' + @StrAg + N')'
SET @StrSQL3 = @StrSQL3 + N' THEN JOURNAL.J_QTY WHEN J_DATE < DATEADD(dd,1,@Date)'
IF @StrAcCr > '' SET @StrSQL3 = @StrSQL3 + N' AND ACC_DB in (' + @StrAcCr + N')'
IF @StrAcDb > '' SET @StrSQL3 = @StrSQL3 + N' AND ACC_CR in (' + @StrAcDb + N')'
IF @StrAg > '' SET @StrSQL3 = @StrSQL3 + N' AND J_AG2 in (' + @StrAg + N')'
SET @StrSQL3 = @StrSQL3 + N' THEN -JOURNAL.J_QTY ELSE 0 END) AS ZalishokEnd '

SET @StrSQL4 = @StrSQL4 + N' FROM JOURNAL'
IF @StrMisc >'' SET @StrSQL4 = @StrSQL4 + N' INNER JOIN JRN_MISC ON JOURNAL.J_ID = JRN_MISC.J_ID'
SET @StrSQL4 = @StrSQL4 + N' WHERE J_DONE = 2 AND J_DATE <DATEADD>0 '
IF @pVidZerna = 'A' SET @StrSQL4 = @StrSQL4 + N''
-- SET @StrSQL4 = @StrSQL4 + N' GROUP BY J_DATE '
SET @StrSQL5 = @StrSQL5 + N' HAVING (SUM(CASE WHEN J_DATE >= @Date AND J_DATE <DATEADD> 0 ) OR '
SET @StrSQL5 = @StrSQL5 + N' (SUM(CASE WHEN J_DATE >= @Date AND J_DATE <DATEADD> 0) '


SET @StrSQL6 = @StrSQL6 + N' HAVING ( SUM(CASE WHEN J_DATE < @Date'
IF @StrAcCr > '' SET @StrSQL6 = @StrSQL6 + N' AND ACC_CR in (' + @StrAcCr + N')'
IF @StrAcDb > '' SET @StrSQL6 = @StrSQL6 + N' AND ACC_DB in (' + @StrAcDb + N')'
IF @StrAg > '' SET @StrSQL6 = @StrSQL6 + N' AND J_AG1 in (' + @StrAg + N')'
SET @StrSQL6 = @StrSQL6 + N' THEN JOURNAL.J_QTY WHEN J_DATE <Date> 0) '

--SELECT @StrSQL,@StrSQL1,@StrSQL2,@StrSQL3,@StrSQL4
SET @StrSQL = @StrSQL0 + @StrSQL1 + @StrSQL2 + @StrSQL3 + @StrSQL4 + @StrSQL6

SET @Prm = N'@Date smalldatetime, @pDEnd smalldatetime'
execute sp_executesql @StrSQL, @prm, @Date,@pDEnd
SET @Date = DATEADD(dd,1,@Date)

SET @StrSQL = @StrSQL0 + @StrSQL1 + @StrSQL2 + @StrSQL3 + @StrSQL4 + @StrSQL5
-- SET @Date = DATEADD(dd,1,@pDStart)
WHILE @Date <DATEADD> @pDStart AND Data <> NULL

--select * from #TempZalishokPoDnyam
-------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
BEGIN
DECLARE @pk int, @ZalishokEnd money, @col int,@Zalishok money
SET @pk = 1
SET @Date = NULL
SET @col = 0
--- (Data smalldatetime, ZalishokStart money, Prihod money,Vidatok money, ZalishokEnd money, KilkDniv int, Zalishok money)
Declare curs1 CURSOR SCROLL FOR SELECT Data, ZalishokEnd From #TempZalishokPoDnyam
FOR READ ONLY
OPEN curs1
WHILE @pk <CURSOR_ROWS> 1 AND @pk <CURSOR_ROWS>0 Then Prihod ELSE 0 END) AS Prihod, SUM(Vidatok) AS Vidatok, @Zalishok AS ZalishokEnd, SUM(KilkDniv) AS KilkDniv, SUM(Zalishok) AS Zalishok
FROM #TempZalishokPoDnyam

SELECT * FROM #TempZalishokPoDnyam
GO
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AllexL



Зарегистрирован: 10.03.2005
Сообщения: 434
Откуда: Donetsk

СообщениеДобавлено: Пн Ноя 09, 2009 3:30 pm    Заголовок сообщения: Re: Вызов процедуры Ответить с цитатой

1. Попытайтесь по-максимуму избавиться от динамических запросов
2. Оцените объем получаемых данным и их месторасположение (клиент или сервер).
3. Приведите результирующий код SQL, приводящий к тормозам
4. Если запустить ХП из SQL Server Management Studio, тормоза сохраняются?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Акцент -> Акцент 6.0 Часовой пояс: GMT + 2
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group