Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Есть MS SQL 2000 Sp4, есть клиент Access 2000, из которого вызывается процедура. Так вот процедура почему-то из Accessa, срабатывает два раза (из QA все нормально). Отловил профайлером двойное срабатывание в логе которого меня смутила цифра - 1 (она отмечена красным кружком)

Картинка с другого сайта.

почему процедура вызываемая один раз, срабатывает - два? И откуда к параметрам процедуры приклеилась цифра 1?
вот текст процедуры:

CREATE procedure pfn_PerechislenieZapr
@JurLicID char(10)
AS
update too_klient
set Prim = case when len(isnull(Prim,''))>54 then isnull(Prim,'') else 'Только за наличный расчет ' + ISNULL(Prim,'') end,
PerechislenieZapr = 1,
VidOplat_Zakr = VidOplat,
VidOplat = '3',
DataKonDog_Zakr = DataKonDog,
DataKonDog = dateadd(dd, -1, convert(nvarchar(10),getdate(),121)),
PerechislenieZapr_Data = convert(nvarchar(10),getdate(),121)
where JurLicID = @JurLicID
GO

27 окт 09, 14:21    [7844617]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Маша это маша, а два раза - два раза. Ну собственно ;1 - версия процедуры. При создании и вызове можно создать несколько версий хп, это нормально. А два-раза, ну вот так клиента написали, это не к нам.
27 окт 09, 14:24    [7844639]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Я понимаю, что это версия процедуры, но ни я ни клиент эту версию туда не передавали. Остальные процедуры, почему-то без единицы...
27 окт 09, 14:27    [7844669]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Вы ещё и слепой ? 13 строка , это что ?
27 окт 09, 14:31    [7844693]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Alexandr Gruzdev
Есть MS SQL 2000 Sp4, есть клиент Access 2000, из которого вызывается процедура. Так вот процедура почему-то из Accessa, срабатывает два раза (из QA все нормально). Отловил профайлером двойное срабатывание в логе которого меня смутила цифра - 1 (она отмечена красным кружком)
А почему профайлер пишет, что не из Accessa, а из QA 2 раза???
27 окт 09, 14:34    [7844705]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Alexandr Gruzdev
Я понимаю, что это версия процедуры, но ни я ни клиент эту версию туда не передавали. Остальные процедуры, почему-то без единицы...
Некоторые клиенты добавляют номер версии = 1, если программист её не задал явно.
Заморачиваться на это не стоит, ибо фича давно устарела и используется редко.
В подавляющем большинстве случаев имеется единственная версия процедуры.
В следующих версиях Microsoft обещал её вообще выкинуть.
27 окт 09, 14:34    [7844706]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Там такая ситуация - клиент на Accesse запускает процедуру на локальном сервере, которая в свою очередь, запускает другую процедуру (текст которой я указал выше) на удаленном сервере, вот текст этой процедуры:
CREATE PROCEDURE dbo.pfn_filial_PerechislenieZapr
@JurLicID char(10) 
AS
set nocount on
set xact_abort on 
begin tran
exec Bazas.Forevers.dbo.pfn_PerechislenieZapr @JurLicID
commit tran
set nocount off
set xact_abort off

GO

что вообще неправильно? Зачем сразу набрасываться и пинать?
27 окт 09, 14:47    [7844772]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Ken@t
Вы ещё и слепой ? 13 строка , это что ?

а что, GO в конце процедуры, это команда - повторить процедуру?
27 окт 09, 14:50    [7844785]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Alexandr Gruzdev
Ken@t
Вы ещё и слепой ? 13 строка , это что ?

а что, GO в конце процедуры, это команда - повторить процедуру?


не, это "идти"...
27 окт 09, 14:51    [7844796]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Alexandr Gruzdev
Ken@t
Вы ещё и слепой ? 13 строка , это что ?

а что, GO в конце процедуры, это команда - повторить процедуру?


кстати, поставьте там
GO 5

что будет?
27 окт 09, 14:51    [7844800]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Winnipuh
Alexandr Gruzdev
Ken@t
Вы ещё и слепой ? 13 строка , это что ?

а что, GO в конце процедуры, это команда - повторить процедуру?


не, это "идти"...


то-то и оно идти некуда, а оно идет!

вот строка из клиента, единственная, никаких циклов, повторений и т.д. нет! Запускал ее в отладчике, отрабатывает один раз! Так-сто на клиента тут пенять, нельзя...
27 окт 09, 14:55    [7844818]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Alexandr Gruzdev
Winnipuh
Alexandr Gruzdev
Ken@t
Вы ещё и слепой ? 13 строка , это что ?

а что, GO в конце процедуры, это команда - повторить процедуру?


не, это "идти"...


то-то и оно идти некуда, а оно идет!

вот строка из клиента, единственная, никаких циклов, повторений и т.д. нет! Запускал ее в отладчике, отрабатывает один раз! Так-сто на клиента тут пенять, нельзя...

            DoCmd.RunSQL ("EXEC pfn_filial_PerechislenieZapr '" + Form_fzk_gzk.JurLicID + "'")
27 окт 09, 14:55    [7844824]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Убрал из обоих процедур GO, не помогает, та-же ситуация! Процедура выполняется два раза.
27 окт 09, 15:06    [7844900]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
покажите полный код , где вызываете процедуру свою через DoCmd.RunSQL
27 окт 09, 15:07    [7844911]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alexandr Gruzdev

            DoCmd.RunSQL ("EXEC pfn_filial_PerechislenieZapr '" + Form_fzk_gzk.JurLicID + "'")

А это правильный метод запуска процедур ?
Он разве не подразумевает, что выполняемый код должен вернуть какой-то набор данных ?
27 окт 09, 15:08    [7844917]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Вот весь код на событие выхода из поля на клиенте, как видно (на мой взгляд) ничего такого:

Private Sub Kolvo_Exit(Cancel As Integer)
Dim NN As String
NN = KodTs.Column(7)
If [KOLVO] > 1000 Then
MsgBox "Проверь количество! (>1000?) ", vbExclamation, "Pasūtijums"
KodT.SetFocus
End If
If Nz([Summa+], 0) = 0 Then
MsgBox "Проверь количество или категорию цены", vbInformation, "Cenas"
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True
Else
End If
'Proverka na balans jur.lica
If Form_fzk_gzk.VidOplat.Value = 4 Then
  Dim a As Double
  lim = Nz(Form_fzk_gzk.Limit.Value, 0)
  bal = Nz(Form_fzk_gzk.Balans.Value, 0)
  nenal = Nz(Form_fzk_gzk.NePerevoditNaNal.Value, 0)
  Me.Dirty = False
  Sum = DSum("[Summa+]", "filial_tzk_zakaz", "RealID=" & Form_fzk_gzk.AutoID)
 If lim > 0 Then
   If bal + Sum > lim Then
      If nenal = True Then
         MsgBox "Превышен лимит!", vbInformation, "Piegādes kontrole"
         DoCmd.SetWarnings False
         DoCmd.RunCommand acCmdDeleteRecord
         DoCmd.SetWarnings True
      Else
        If MsgBox("Превышен денежный лимит! " + Chr(13) + "перевести на наличный расчет?", vbYesNo, "Piegādes kontrole") = vbYes Then
            DoCmd.RunSQL ("EXEC pfn_filial_PerechislenieZapr '" + Form_fzk_gzk.JurLicID + "'")
                            If RTrim(NN) = "N" Then 'Esli produkcija nenasha'
                             MsgBox "За наличный расчет этот товар не поставляется!" & Chr(13) & "           и не будет поставлен!", vbInformation, "Контроль поставок"
                             DoCmd.SetWarnings False
                             DoCmd.RunCommand acCmdDeleteRecord
                             DoCmd.SetWarnings True
                            Else
                             Form_fzk_gzk.VidOplat.Value = 3
                             VidOplat.Value = 3
                             KodT.SetFocus
                             DoCmd.GoToRecord , , acNext
                            End If 'Esli produkcija nenasha'
        Else
         DoCmd.SetWarnings False
         DoCmd.RunCommand acCmdDeleteRecord
         DoCmd.SetWarnings True
        End If
      End If
   End If
 End If
End If 'vidoplat=4'

If Form_fzk_gzk.VidOplat.Value = 3 Then
     lim = Nz(Form_fzk_gzk.Limit.Value, 0)
     bal = Nz(Form_fzk_gzk.Balans.Value, 0)
     nenal = Nz(Form_fzk_gzk.NePerevoditNaNal.Value, 0)
     Me.Dirty = False
     Sum = DSum("[Summa+]", "tzk_zakaz", "RealID=" & Form_fzk_gzk.AutoID)
   If lim > 0 Then
     If bal + Sum > lim Then
       If RTrim(NN) = "N" Then 'Esli balans previshen i produkcija nenasha'
          MsgBox "Превышен денежный лимит!", vbInformation, "Piegādes kontrole"
          DoCmd.SetWarnings False
          DoCmd.RunCommand acCmdDeleteRecord
          DoCmd.SetWarnings True
       End If 'Esli balans previshen i produkcija nenasha'
     Else
       If RTrim(NN) = "N" Then 'Esli produkcija nenasha i balans ne previshen'
          MsgBox "За наличный расчет этот товар не поставляется!" & Chr(13) & "           и не будет поставлен!", vbInformation, "Контроль поставок"
          DoCmd.SetWarnings False
          DoCmd.RunCommand acCmdDeleteRecord
          DoCmd.SetWarnings True
       End If 'Esli produkcija nenasha i balans ne previshen'
     End If 'bal + Sum > lim
   End If 'lim>0'
End If 'VidOplat=3'

End Sub

27 окт 09, 15:20    [7845053]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Glory
Alexandr Gruzdev

            DoCmd.RunSQL ("EXEC pfn_filial_PerechislenieZapr '" + Form_fzk_gzk.JurLicID + "'")

А это правильный метод запуска процедур ?
Он разве не подразумевает, что выполняемый код должен вернуть какой-то набор данных ?


Может я делал что-то не так, но это обычный запуск, и он только передает параметр, который берет из контрола формы и передает серверу.
27 окт 09, 15:22    [7845076]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alexandr Gruzdev
Вот весь код на событие выхода из поля на клиенте, как видно (на мой взгляд) ничего такого:

Если вы думаете, что использование ADO/DAO/ODBC и прочих способов способов работы с MSSQL транслирует ваш клиентский код один в один в серверный, то вы заблуждаетесь.
Каждый отдельный метод есть контейнер с некой логикой, которая может выполнять дополнительные действия над переданной ей командой. Вплоть до выполнения допольнительных команд и процедур на сервере
27 окт 09, 15:25    [7845095]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Alexandr Gruzdev
Member

Откуда:
Сообщений: 135
Glory
Alexandr Gruzdev
Вот весь код на событие выхода из поля на клиенте, как видно (на мой взгляд) ничего такого:

Если вы думаете, что использование ADO/DAO/ODBC и прочих способов способов работы с MSSQL транслирует ваш клиентский код один в один в серверный, то вы заблуждаетесь.
Каждый отдельный метод есть контейнер с некой логикой, которая может выполнять дополнительные действия над переданной ей командой. Вплоть до выполнения допольнительных команд и процедур на сервере

У нас на Accesse построено все производсто (достаточно сложное и большое), куча программ созданных на нем работают уже десять лет, и до сих пор ADO/DAO/ODBC успешно и без проблем транслировало клиентский код на SQL сервер. Но вот что-то сломалось в этом механизме...
27 окт 09, 15:33    [7845141]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
у вас там событие формы текущая запись или тому-подобное срабатывает, включите отладчик и проверяйте все события формы
27 окт 09, 15:33    [7845143]     Ответить | Цитировать Сообщить модератору
 Re: Двойное срабатывание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alexandr Gruzdev
Glory
Alexandr Gruzdev
Вот весь код на событие выхода из поля на клиенте, как видно (на мой взгляд) ничего такого:

Если вы думаете, что использование ADO/DAO/ODBC и прочих способов способов работы с MSSQL транслирует ваш клиентский код один в один в серверный, то вы заблуждаетесь.
Каждый отдельный метод есть контейнер с некой логикой, которая может выполнять дополнительные действия над переданной ей командой. Вплоть до выполнения допольнительных команд и процедур на сервере

У нас на Accesse построено все производсто (достаточно сложное и большое), куча программ созданных на нем работают уже десять лет, и до сих пор ADO/DAO/ODBC успешно и без проблем транслировало клиентский код на SQL сервер. Но вот что-то сломалось в этом механизме...

Ну так вот и выясняйте, что случилось с вашим клиентским кодом
27 окт 09, 15:34    [7845159]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить