Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2012, 15:33   #1
Gul'ka
Пользователь
 
Аватар для Gul'ka
 
Регистрация: 11.02.2011
Сообщений: 69
Восклицание из VBA в сохраненую процедуру

Здраствуйте уважаемые программисты. Нужна ваша помощь. Дело в том, что переделываю mdb в adp. и возникла такая проблема, нужно написать функцию в сохраненой процедуре, раньше она была написанна в VBA. Вот процедура:
Public Function fnc_KRM(m_tp, sri, dpos, m_zzz) As Double
Dim k, m_tfakt
Dim dbs As Database
Dim rst As Recordset
k = 0
m_tfakt = 0
If Year(sri) <> Year(dpos) Then
k = "sss" & CStr(Year(dpos))
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("select Max_PORNOM From TBL_STEP_0 Where ss='" & k & "'")
If rst.RecordCount > 0 Then
k = CInt(rst("Max_Pornom"))
End If
End If
m_tp = CCur(Nz(m_tp, 0)) + k
m_tfakt = m_tp + CCur(Nz(m_zzz, 0))
m_tfakt = IIf(m_tfakt < m_tp, m_tp, m_tfakt)
If m_tfakt <= 0 Or m_tp <= 0 Then
fnc_KRM = 1
Else
fnc_KRM = CDbl(CCur(m_tp / m_tfakt))
End If
End Function
я пробовала переделать ее и вот что получилось, вроде и правильно, но что то не так считает, подскажите что именно, кидаю то что я сделала:
ALTER FUNCTION dbo.fnc_KRM (@m_tp int,@sri datetime, @dpos datetime, @m_zzz int )
RETURNS int
As
BEGIN
DECLARE @m_tfakt int
DECLARE @fnc_KRM int
DECLARE @rst int
Declare @k int
Declare @l nvarchar (20)
Set @k=0
Set @m_tfakt = 0
If Year(@sri) <> Year(@dpos)
Set @l=Cast(Year(@dpos) as nvarchar (17))
Set @rst= (select Max_PORNOM From TBL_STEP_0 Where ss= @l)
IF (@rst>0)
begin
Set @k=@rst
end
Set @m_tp = @m_tp + @k
Set @m_tfakt = @m_tp + @m_zzz
If(@m_tfakt<@m_tp)
Set @m_tfakt=@m_tp
Else
Set @m_tfakt=@m_tfakt
if ( @m_tp<=0 OR @m_tfakt<=0 )
SET @fnc_KRM=1
Else
SET @fnc_KRM=(@m_tp / @m_tfakt)
Return (@fnc_KRM)
END
Заранее огромное спасибо)
Gul'ka вне форума Ответить с цитированием
Старый 09.07.2012, 23:31   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Gul'ka.
не имея представления о Вашей задаче (так-же не могу проверить синтаксис)
выкладываю рекомендации по корректировке функции

Код:
..
DECLARE @m_tfakt int
-- DECLARE @fnc_KRM int -- не стоит давать переменной имя функции
DECLARE @fnc_KRM2 int
-- DECLARE @rst int -- не используется
Declare @k int
-- Declare @l nvarchar (20)
-- Year возвращает год, ему пока достаточно четырёх знаков
Declare @l nvarchar (4)
Set @k=0
Set @m_tfakt = 0
If Year(@sri) <> Year(@dpos)
--	Set @l=Cast(Year(@dpos) as nvarchar (17))
	Set @l=Cast(Year(@dpos) as nvarchar (4))

-- Set @rst= (select TOP1 Max_PORNOM From TBL_STEP_0 Where ss= @l)
-- IF (@rst>0)
-- begin
-- Set @k=@rst
-- end
-- если Max_PORNOM не содержит отрицательных значений присваивать k лучше так
IF EXISTS(select Max_PORNOM From TBL_STEP_0 Where ss= @l)
	SET @K =(select TOP 1 Max_PORNOM From TBL_STEP_0 Where ss= @l)
-- а TOP 1 вернет одно значение, т.е. скалярную величину 

Set @m_tp = @m_tp + @k
Set @m_tfakt = @m_tp + @m_zzz
If(@m_tfakt<@m_tp) -- если условие истинно значение @fnc_KRM2 не присвоится ? --> результатом будет NULL
	Set @m_tfakt=@m_tp
Else
--	Set @m_tfakt=@m_tfakt  --??
	if ( @m_tp<=0 OR @m_tfakt<=0 )
		SET @fnc_KRM2=1
	Else
		SET @fnc_KRM2=(@m_tp / @m_tfakt)

Return (@fnc_KRM2)
..
да простят меня "жители" форума MS Access

Евгений.
P.S. для удобочитаемости выкладываемые конструкции заключайте в тэги [соde] ... [/соde]
для этого на панели расположена кнопка - #

Последний раз редактировалось Teslenko_EA; 09.07.2012 в 23:38.
Teslenko_EA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Word,VBA Excel решить 2 задачи fafolo4ka Фриланс 6 05.03.2012 01:15
Написать процедуру, заменяющую стандартную процедуру Insert Andi5 Паскаль, Turbo Pascal, PascalABC.NET 2 24.11.2011 17:57
Описать процедуру в С++ Devil21RUS Помощь студентам 1 17.10.2011 11:54
создайть процедуру brans Microsoft Office Excel 6 19.10.2010 17:18
Как разбить на части VBA процедуру (ту лардж)? neprofi Помощь студентам 1 29.04.2010 04:11