Ошибка Invalid property value в откомпилированной программе

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Ошибка Invalid property value в откомпилированной программе

Сообщение nouyana » 05.05.2024 (Вс) 18:30

В IDE и при компиляции в P-код программа работает отлично, а при компиляции в Native Code возникает ошибка: "Invalid property value" in line 0. Параметры компиляции (Advanced optimizations) пробовал как устанавливать (все галочки), так и снимать их полностью - результат одинаковый.

Реально ошибка возникает в строке №484, которая выглядит так:
Код: Выделить всё
ReDim aResultVzm(1& To ARR_BLOCK)

Причём эта строка отрабатывается в цикле множество раз, а ошибку выдаёт именно на этой итерации, специфичные особенности которой определить пока не удалось.

aResultVzm - это массив пользовательского типа, который всегда содержит по 20 строк табличных данных (ARR_BLOCK). То есть командой ReDim я просто постоянно очищаю его. На всякий случай приведу его структуру:

Код: Выделить всё
Public Type type_RESULT             'Структура таблицы t_RESULT
   RES_ID          As Long
   VZ_ID           As Long
   VZ_DATE_ID      As Integer
   VZ_ACC_ID       As Integer
   DATE_ID         As Integer
   DOC_ID          As Long
   DEAL_ID         As Long
   ITEM_ID         As Long
   OPER_ID         As Integer
   ZATR_ID         As Integer
   PODRAZ_ID       As Integer
   ACC_ID          As Integer
   NOMEN_ID        As Long
   NG_ID           As Integer
   DESCR_ID        As Long
   REL_DOC_ID      As Long
   SUM_CLEAN       As Currency
   SUM_NDS         As Currency
   QUANTITY        As Currency
   DATATYP_ID      As Integer

   IS_BUH_ONLY     As Boolean
   SUM_DEBT        As Currency
   SUM_CRED        As Currency
   
   TMP_SUM         As Currency
   TMP_NDS         As Currency
   TMP_QNT         As Currency
End Type

Сталкивался ли кто-нибудь с подобной ситуацией?

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение серверянин » 06.05.2024 (Пн) 0:04

nouyana писал(а):aResultVzm - это массив пользовательского типа, который всегда содержит по 20 строк табличных данных (ARR_BLOCK). То есть командой ReDim я просто постоянно очищаю его.


Нет, я с такой ситуацией не сталкивался, потому что вообще не использую структуры... вот как-то обхожусь без них, привык уже))))

А текущую проблему решал бы тривиально: на замену ReDim написал бы подпрограмму aResultClr, внутри которой цикл, приравнивающий к нулю все поля всех элементов поштучно.

Да: наверное неизящно, зато работать будет наверняка.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение The trick » 06.05.2024 (Пн) 6:54

Нужно больше информации / кода, либо ехе файл.
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение Хакер » 06.05.2024 (Пн) 8:36

nouyana писал(а):а при компиляции в Native Code возникает ошибка: "Invalid property value" in line 0

Стоп-стоп.
При выводе Run-time ошибок VB никогда не сообщает номер строки. Просто Type mismatch или Overflow и гадай где. А здес «in line 0». Стало быть речь идёт не о run-time error, а о compile-time error?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение nouyana » 06.05.2024 (Пн) 10:22

The trick писал(а):Нужно больше информации / кода, либо ехе файл.
Хакер писал(а):Стоп-стоп.
При выводе Run-time ошибок VB никогда не сообщает номер строки. Просто Type mismatch или Overflow и гадай где. А здес «in line 0». Стало быть речь идёт не о run-time error, а о compile-time error?


Это Run-time error, компиляция произведена успешно. Процедура имеет обработчик ошибок, использующий функцию Erl, которая почему-то вместо 484-ой строки выдаёт 0. Номер строки, где реально происходит ошибка я отловил, расставив по тексту процедуры подробное логгирование.

(Удалено.)

Более подробный текст процедуры приведён ниже. Она, к сожалению, очень большая, и я не могу её уменьшить, чтобы продемонстрировать ситуацию на маленьком фрагменте. Процедура имеет несколько вызовов типа GoSub/Return. Ошибка возникает в строке 484 в подпрограмме RESULT_VZAIM_SHIP_IN, которая вызывается из строки 254. Ошибка возникает только на определённой итерации цикла (строки 134-196) при значении RecVzm.VZ_ID = 5033.

В этой процедуре практически не используются объекты или классы, за исключением DAO. Все переменные вида "RecVzm.VZ_ID" - это структуры данных (массивы или нет). Переменные вида "t_REGVZAIM" - это как раз объекты DAO.Recordset, с которыми в частности работает цикл в строках 134-196.

Код: Выделить всё
Public Function fnProcessResult() As Boolean
        '<EhHeader>
        On Error GoTo fnProcessResult_Err
100     PrintLog "==>> xxMProcessResult.fnProcessResult"
        '</EhHeader>

       Const ERR_LOC = "ПРОЦЕДУРА:    fnProcessResult" & vbCrLf

       Dim bRetVal      As Boolean      'Возвращаемое значение
       Dim bTransaction As Boolean      'Начата ли транзакция?

102    PrintLog "Формирование результирующей таблицы t_RESULT..."
104    CurrStage = STAGE3_PROCESS_RESULT ' Для ErrHeader

106    NG_ASSETS = fnGetNomenGroupID("__АКТИВЫ__", SPRAV_NG)

108    With frmMain.ProgressBar1
110       .Min = 1
112       nVzmCount = t_REGVZAIM.RecordCount
114       .Max = nVzmCount
116       .Value = 1
118       .Visible = True
       End With
   
120    nVzmItem = 0&
122    With t_REGVZAIM
124       .Index = "VZ_DATE"
126       .MoveFirst
128       .MoveNext               'Пропуск VZ_DATE = "19.02.1982" (VZ_ID=1)
130       oWorkspase.BeginTrans
132       bTransaction = True
134       Do Until .EOF                           'ПЕРЕБИРАЕМ ВЗАИМОРАСЧЁТЫ
136          nVzmItem = nVzmItem + 1&
138          If nVzmItem Mod 50& = 0& Then
140             oWorkspase.CommitTrans
142             bTransaction = False
144             With frmMain
146                .ProgressBar1.Value = nVzmItem
148                .StatusBar1.Panels(1).Text = "Запись: " & nVzmItem
150                DoEvents
                End With
152             oWorkspase.BeginTrans
154             bTransaction = True
             End If
156          If fnReadRegvzaim(t_REGVZAIM, RecVzm) = False Then
158             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура fnReadRegvzaim вернула ошибку."
160             GoTo HELL
             End If
             
               ' Debug.Assert Not (RecVzm.VZ_ID = 5033)
             
162          With RecVzm
164             If (.VZ_SUM <> 0@) And (.VZ_NDS <> 0@) Then
166                .STAVKA_NDS = .VZ_NDS / .VZ_SUM
                End If
             End With
             
168          nOperTypId = fnOperTypId(RecVzm.OPER_ID, sOperAccDt, sOperAccCt)
170          If (nOperTypId = otpDT_VZAIM_CT_REMAINS) _
             Or (nOperTypId = otpDT_REMAINS_CT_VZAIM) _
             Or (nOperTypId = otpDT_VZAIM_CT_VZAIM) Then
172             If fnVzaim() = False Then         'ЗАГРУЖАЕМ РЕАЛИЗАЦИЮ.
174                PrintLog ErrHeader & ERR_LOC & _
                      "Процедура fnVzaim вернула ошибку."
176                GoTo HELL
                End If
             End If
178          nRCashCount = 0&
180          GoSub ASSETS                      'ЗАГРУЖАЕМ АКТИВЫ.
         
182          If fnDIRECT() = False Then        'ЗАГРУЖАЕМ РЕАЛИЗАЦИЮ.
184             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура fnDIRECT вернула ошибку."
186             GoTo HELL
             End If
         
188          If nRCashCount = 0& Then          'Если платежей по поставкам
190             If fnAdvances() = False Then   'нет, то ЗАГРУЖАЕМ АВАНСЫ.
192                PrintLog ErrHeader & ERR_LOC & _
                      "Процедура fnAdvances вернула ошибку."
194                GoTo HELL
                End If
             End If
     
196          .MoveNext
          Loop
198       oWorkspase.CommitTrans
200       bTransaction = False
       End With
   
202    bRetVal = True
204    GoTo HELL                                  'ВЫХОД
   
       '===================================================================
       '            ПОДПРОГРАММА ЗАГРУЗКИ АКТИВОВ В aRecAssets
       '-------------------------------------------------------------------
ASSETS:
206    ReDim aRecAssets(1& To ARR_BLOCK)
208    nAssCount = 0&
210    ReDim aResultAssFull(1& To ARR_BLOCK)
212    nRAssFullCount = 0&
214    With t_REGASSETS
216       .Index = "VZ_ID"
218       .SeekRecord "=", RecVzm.VZ_ID
220       If .NoMatch Then Return
222       Do Until .EOF
224          If (!VZ_ID <> RecVzm.VZ_ID) Then Exit Do
226          nAssCount = nAssCount + 1&
228          If nAssCount Mod ARR_BLOCK = 0& Then
230             ReDim Preserve aRecAssets(1& To nAssCount + ARR_BLOCK)
             End If
232          If fnReadRegassets(t_REGASSETS, aRecAssets(nAssCount)) = False Then
234             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура fnReadRegassets вернула ошибку."
236             GoTo HELL
             End If

238          GoSub COSTS                          'ЗАГРУЖАЕМ РАСХОДЫ
240          GoSub RESULT_ASSETS_COSTS            'ФОРМИРУЕМ РЕЗУЛЬТАТ

242          For nRAssItem = 1& To nRAssCount
244             nRAssFullCount = nRAssFullCount + 1&
246             If nRAssFullCount Mod ARR_BLOCK = 0& Then
248                ReDim Preserve aResultAssFull(1& To nRAssFullCount + ARR_BLOCK)
                End If

                'Массив aResultAss обнуляется на каждой итерации цикла.
                'Но нам нужны полные данные об активах для каждого VZ_ID
                '(используется в RESULT_VZAIM_SHIP_IN), поэтому объединим
                'их в отдельный массив.
250             aResultAssFull(nRAssFullCount) = aResultAss(nRAssItem)
             Next

252          .MoveNext
          Loop

254       GoSub RESULT_VZAIM_SHIP_IN              'ЗАГРУЖАЕМ ПОСТУПЛЕНИЯ
256       GoSub CASH_OUT                          'ЗАГР.ОПЛАТЫ ПОСТАВЩИКАМ

258       If nRCashCount Then
260          If aResultCash(nRCashCount).VZ_ID = RecVzm.VZ_ID Then
262             GoSub PAY_OUT                     'ТЕ ЖЕ ОПЛАТЫ, НО ИЗ t_REGVZAIM
             End If
          End If

       End With
264    Return

       '===================================================================
       '            ПОДПРОГРАММА ЗАГРУЗКИ РАСХОДОВ В aRecCosts
       '-------------------------------------------------------------------
COSTS:
266    ReDim aRecCosts(1& To ARR_BLOCK)
268    nCostCount = 0&
270    With t_REGCOSTS
272       .Index = "ASS_ID"
274       .SeekRecord "=", aRecAssets(nAssCount).ASS_ID
276       If .NoMatch Then Return
278       Do Until .EOF
280          If (!ASS_ID <> aRecAssets(nAssCount).ASS_ID) Then Exit Do
282          nCostCount = nCostCount + 1
284          If nCostCount Mod ARR_BLOCK = 0& Then 'Приращаем массив.
286             ReDim Preserve aRecCosts(1& To nCostCount + ARR_BLOCK)
             End If                               'Получаем текущую запись
288          If fnReadRegcosts(t_REGCOSTS, aRecCosts(nCostCount)) = False Then
290             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура fnReadRegcosts вернула ошибку."
292             GoTo HELL
             End If
294          .MoveNext
          Loop
    '      ReDim Preserve aRecCosts(1& To nCostCount)
       End With
296    Return

       '===================================================================
       '         ПОДПРОГРАММА ФОРМИРОВАНИЯ И ЗАПИСИ РЕЗУЛЬТАТА
       '        ПО АКТИВАМ И РАСХОДАМ В aResultCos И aResultAss
       '-------------------------------------------------------------------
RESULT_ASSETS_COSTS:
298    ReDim aResultCos(1& To ARR_BLOCK)
300    ReDim aResultAss(1& To ARR_BLOCK)
302    nRAssCount = 0&
304    nRCostCount = 0&
306    nRestSum = aRecAssets(nAssCount).ASS_SUM
308    nRestQnt = aRecAssets(nAssCount).ASS_QNT
310    If nCostCount > 0& Then                    'Если текущая запись активов
312       For nCostItem = 1& To nCostCount        'связана с расходами, то
                                                  'распределяем активы по расходам.
314          nRAssCount = nRAssCount + 1&
316          If nRAssCount Mod ARR_BLOCK = 0& Then
318             ReDim Preserve aResultAss(1& To nRAssCount + ARR_BLOCK)
             End If
320          With aResultAss(nRAssCount)          'Делаем записи в активах
322             .VZ_ID = RecVzm.VZ_ID
324             .VZ_DATE_ID = RecVzm.VZ_DATE
326             .VZ_ACC_ID = RecVzm.ACC_ID
328             .DEAL_ID = RecVzm.DEAL_ID
330             .ITEM_ID = RecVzm.ITEM_ID

332             .DATE_ID = aRecAssets(nAssCount).ASS_DATE
334             .DOC_ID = aRecAssets(nAssCount).DOC_ID
336             .OPER_ID = aRecAssets(nAssCount).OPER_ID
338             .ZATR_ID = aRecAssets(nAssCount).ZATR_ID
340             .PODRAZ_ID = aRecAssets(nAssCount).PODRAZ_ID
342             .ACC_ID = aRecAssets(nAssCount).ACC_ID
344             .NOMEN_ID = aRecAssets(nAssCount).NOMEN_ID
346             .DESCR_ID = aRecAssets(nAssCount).DESCR_ID
348             .REL_DOC_ID = aRecAssets(nAssCount).REL_DOC_ID

350             .SUM_CLEAN = aRecCosts(nCostItem).COST_SUM
352             .QUANTITY = aRecCosts(nCostItem).COST_QNT
354             .NG_ID = aRecCosts(nCostItem).NG_ID

356             .SUM_NDS = .SUM_CLEAN * RecVzm.STAVKA_NDS
358             .DATATYP_ID = enum_DATATYPES.dtypASSETS

360             nRestSum = nRestSum - .SUM_CLEAN
362             nRestQnt = nRestQnt - .QUANTITY
             End With

364          nRCostCount = nRCostCount + 1&
366          If nRCostCount Mod ARR_BLOCK = 0& Then 'Приращаем массив.
368             ReDim Preserve aResultCos(1& To nRCostCount + ARR_BLOCK)
             End If
370          With aResultCos(nRCostCount)         'Делаем записи в расходах.
372             .VZ_ID = RecVzm.VZ_ID
374             .VZ_DATE_ID = RecVzm.VZ_DATE
376             .VZ_ACC_ID = RecVzm.ACC_ID
378             .DEAL_ID = RecVzm.DEAL_ID
380             .ITEM_ID = RecVzm.ITEM_ID

382             .ZATR_ID = aRecAssets(nAssCount).ZATR_ID
384             .PODRAZ_ID = aRecAssets(nAssCount).PODRAZ_ID

386             .DATE_ID = aRecCosts(nCostItem).COST_DATE
388             .DOC_ID = aRecCosts(nCostItem).DOC_ID
390             .OPER_ID = aRecCosts(nCostItem).OPER_ID
392             .ACC_ID = aRecCosts(nCostItem).ACC_ID
394             .NOMEN_ID = aRecCosts(nCostItem).NOMEN_ID
396             .NG_ID = aRecCosts(nCostItem).NG_ID
398             .DESCR_ID = aRecCosts(nCostItem).DESCR_ID
400             .REL_DOC_ID = aRecCosts(nCostItem).REL_DOC_ID
402             .SUM_CLEAN = aRecCosts(nCostItem).COST_SUM
404             .QUANTITY = aRecCosts(nCostItem).COST_QNT

406             .SUM_NDS = .SUM_CLEAN * RecVzm.STAVKA_NDS
408             .DATATYP_ID = enum_DATATYPES.dtypCOSTS
             End With
          Next
       End If

410    If (nCostCount = 0&) Or (nRestSum <> 0@) Then
                                                  'Если связанных расходов нет,
                                                  'или остались несвяз.активы,
412       nRAssCount = nRAssCount + 1&
414       If nRAssCount Mod ARR_BLOCK = 0& Then
416          ReDim Preserve aResultAss(1& To nRAssCount + ARR_BLOCK)
          End If
418       With aResultAss(nRAssCount)             'Делаем записи в активах
420          .VZ_ID = RecVzm.VZ_ID
422          .VZ_DATE_ID = RecVzm.VZ_DATE
424          .VZ_ACC_ID = RecVzm.ACC_ID
426          .DEAL_ID = RecVzm.DEAL_ID
428          .ITEM_ID = RecVzm.ITEM_ID

430          .DATE_ID = aRecAssets(nAssCount).ASS_DATE
432          .DOC_ID = aRecAssets(nAssCount).DOC_ID
434          .OPER_ID = aRecAssets(nAssCount).OPER_ID
436          .ZATR_ID = aRecAssets(nAssCount).ZATR_ID
438          .PODRAZ_ID = aRecAssets(nAssCount).PODRAZ_ID
440          .ACC_ID = aRecAssets(nAssCount).ACC_ID
442          .NOMEN_ID = aRecAssets(nAssCount).NOMEN_ID
444          .DESCR_ID = aRecAssets(nAssCount).DESCR_ID
446          .REL_DOC_ID = aRecAssets(nAssCount).REL_DOC_ID

448          .SUM_CLEAN = nRestSum
450          .QUANTITY = nRestQnt
452          .NG_ID = NG_ASSETS

454          If AccInt(.ACC_ID) = 19 _
             Or AccNum(.ACC_ID) = ACC_NDS_LEASING Then
456             .SUM_NDS = aRecAssets(nAssCount).ASS_NDS
             Else
458             .SUM_NDS = .SUM_CLEAN * RecVzm.STAVKA_NDS
             End If
460          .DATATYP_ID = enum_DATATYPES.dtypASSETS
          End With
       End If

462    If nRCostCount Then                        'Запись на диск
464       For nRCostItem = 1& To nRCostCount
466          If AddNew_RESULT(aResultCos(nRCostItem)) = False Then
468             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура AddNew_RESULT(aResultCos) вернула ошибку."
470             GoTo HELL
             End If
          Next
       End If
472    If nRAssCount Then
474       For nRAssItem = 1& To nRAssCount
476          If AddNew_RESULT(aResultAss(nRAssItem)) = False Then
478             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура AddNew_RESULT(aResultAss) вернула ошибку."
480             GoTo HELL
             End If
          Next
       End If
482    Return

       '===================================================================
       '         ПОДПРОГРАММА ФОРМИРОВАНИЯ И ЗАПИСИ РЕЗУЛЬТАТА
       '        ПО ВЗАИМОРАСЧЁТАМ В ЧАСТИ ПОСТУПЛЕНИЙ В aResultVzm
       '-------------------------------------------------------------------
RESULT_VZAIM_SHIP_IN:

           Debug.Assert Not (RecVzm.VZ_ID = 5033)

       If RecVzm.VZ_ID = 5033 Then
         PrintLog "Строка 484. ARR_BLOCK = " & ARR_BLOCK
         PrintLog "LBound(aResultVzm) = " & LBound(aResultVzm)
         PrintLog "UBound(aResultVzm) = " & UBound(aResultVzm)
       End If

484    ReDim aResultVzm(1& To ARR_BLOCK)
   
       If RecVzm.VZ_ID = 5033 Then PrintLog "Строка 486..."
       
486    nRVzmCount = 0&
       
488    If (RecVzm.VZ_SUM = 0@) And (RecVzm.VZ_NDS = 0@) Then Return
   
490    nRestSum = 0@                    'Все остатки активов считаем
492    nRestNds = 0@                    'суммированием
494    nRestQnt = 0@                    '(поступления + / расходы -)

496    For nRAssFullItem = 1& To nRAssFullCount   'Перебираем активы.

          'Считаем остатки активов. При этом пропускаем
          'поступление НДС на 19-ый счёт (потому что мы уже
          'начислили его по ставке в .SUM_NDS), но учитываем
          'выбытие НДС по Д68.02К19.
498       b6802 = ((sOperAccDt = "68.02") Or (sOperAccCt = "68.02"))
500       With aResultAssFull(nRAssFullItem)
502          nOperTypId = fnOperTypId(.OPER_ID, sOperAccDt, sOperAccCt)
504          If (.IS_BUH_ONLY = False) Or b6802 Then
506             nRestSum = nRestSum + .SUM_CLEAN
508             nRestNds = nRestNds + .SUM_NDS
510             nRestQnt = nRestQnt + .QUANTITY
             End If
          End With

512       If IsCosts(aResultAssFull(nRAssFullItem).OPER_ID) = False Then
                                                  'Работаем сначала с расходами.
514          GoTo NEXT_RASS_ITEM                  '(там есть аналитика)
          End If
516       nOperTypId = fnOperTypId(aResultAssFull(nRAssFullItem).OPER_ID, _
                                   sOperAccDt, sOperAccCt)
518       If (sOperAccDt = "90.03") Or (sOperAccCt = "90.03") Then
520          GoTo NEXT_RASS_ITEM                  'Пропускаем Д90.03-К19
          End If

522       With aResultAssFull(nRAssFullItem)
             'Проверяем: если аналитика, полученная из активов
             'та же, что и в предыдущей записи, то новую запись
             'не создаём, а добавляем суммы к предыдущей.
524          bIsGroup = False
526          If (nRVzmCount > 0&) Then
528             If (.ZATR_ID = aResultVzm(nRVzmCount).ZATR_ID) _
                And (.PODRAZ_ID = aResultVzm(nRVzmCount).PODRAZ_ID) _
                And (.NOMEN_ID = aResultVzm(nRVzmCount).NOMEN_ID) _
                And (.NG_ID = aResultVzm(nRVzmCount).NG_ID) Then
530                bIsGroup = True
                End If
             End If
          End With

532       If bIsGroup = False Then                'Если группировки нет,
534          nRVzmCount = nRVzmCount + 1&         'то приращаем массив.
536          If nRVzmCount Mod ARR_BLOCK = 0& Then
538             ReDim Preserve aResultVzm(1& To nRVzmCount + ARR_BLOCK)
             End If
          End If

540       With aResultVzm(nRVzmCount)             'Делаем записи о поступл.
542          If bIsGroup Then
544             .SUM_CLEAN = .SUM_CLEAN + aResultAssFull(nRAssFullItem).SUM_CLEAN
546             .SUM_NDS = .SUM_NDS + aResultAssFull(nRAssFullItem).SUM_NDS
548             .QUANTITY = .QUANTITY + aResultAssFull(nRAssFullItem).QUANTITY
             Else
550             .VZ_ID = RecVzm.VZ_ID
552             .VZ_DATE_ID = RecVzm.VZ_DATE
554             .VZ_ACC_ID = RecVzm.ACC_ID
556             .DEAL_ID = RecVzm.DEAL_ID
558             .ITEM_ID = RecVzm.ITEM_ID
560             .DATE_ID = RecVzm.VZ_DATE
562             .DOC_ID = RecVzm.DOC_ID
564             .OPER_ID = RecVzm.OPER_ID
566             .DESCR_ID = RecVzm.DESCR_ID
568             .REL_DOC_ID = RecVzm.REL_DOC_ID
570             .ACC_ID = RecVzm.ACC_ID

572             .ZATR_ID = aResultAssFull(nRAssFullItem).ZATR_ID
574             .PODRAZ_ID = aResultAssFull(nRAssFullItem).PODRAZ_ID
576             .NOMEN_ID = aResultAssFull(nRAssFullItem).NOMEN_ID
578             .NG_ID = aResultAssFull(nRAssFullItem).NG_ID

580             .SUM_CLEAN = aResultAssFull(nRAssFullItem).SUM_CLEAN
582             .SUM_NDS = aResultAssFull(nRAssFullItem).SUM_NDS
584             .QUANTITY = aResultAssFull(nRAssFullItem).QUANTITY

586             .DATATYP_ID = enum_DATATYPES.dtypSHIP_IN
             End If
          End With
         
          'В результате группировки сумма по строке может обнулиться.
          'Такую строку записывать в базу не нужно.
588       If bIsGroup And (aResultVzm(nRVzmCount).SUM_CLEAN = 0@) And (aResultVzm(nRVzmCount).SUM_NDS = 0@) Then
590          nRVzmCount = nRVzmCount - 1&
          End If
NEXT_RASS_ITEM:
       Next

592    nEntryCount = 0&
594    If (nRestSum <> 0@) Or b6802 Then          'Если осталась нераспр.сумма,
596       For nRAssFullItem = 1& To nRAssFullCount 'то ещё раз перебираем активы.
598          If IsVzaim(aResultAssFull(nRAssFullItem).OPER_ID) = False Then
                                                  'Работаем теперь с пос-
600             GoTo NEXT_RASS_ITEM2              'туплениями (меньше аналитики).
             End If
602          nEntryCount = nEntryCount + 1&

604          nRVzmCount = nRVzmCount + 1&         'Приращаем массив.
606          If nRVzmCount Mod ARR_BLOCK = 0& Then
608             ReDim Preserve aResultVzm(1& To nRVzmCount + ARR_BLOCK)
             End If

610          With aResultVzm(nRVzmCount)          'Делаем записи о поступлении
612             .VZ_ID = RecVzm.VZ_ID
614             .VZ_DATE_ID = RecVzm.VZ_DATE
616             .VZ_ACC_ID = RecVzm.ACC_ID
618             .DEAL_ID = RecVzm.DEAL_ID
620             .ITEM_ID = RecVzm.ITEM_ID
622             .DATE_ID = RecVzm.VZ_DATE
624             .DOC_ID = RecVzm.DOC_ID
626             .OPER_ID = RecVzm.OPER_ID
628             .DESCR_ID = RecVzm.DESCR_ID
630             .REL_DOC_ID = RecVzm.REL_DOC_ID
632             .ACC_ID = RecVzm.ACC_ID

634             .ZATR_ID = aResultAssFull(nRAssFullItem).ZATR_ID
636             .PODRAZ_ID = aResultAssFull(nRAssFullItem).PODRAZ_ID
638             .NOMEN_ID = aResultAssFull(nRAssFullItem).NOMEN_ID
640             .NG_ID = aResultAssFull(nRAssFullItem).NG_ID

                'В активах должно быть всего две записи
                'о поступлении: основная сумма и НДС.
642             If nEntryCount > 2 Then
644                PrintLog ErrHeader & ERR_LOC & _
                      "Подпрограмма RESULT_VZAIM_SHIP_IN обнаружила более " & _
                      "двух записей о поступлении активов по одному VZ_ID."
646                GoTo HELL
                End If
           
648             If sOperAccDt = "76.02" _
                And nOperTypId = otpDT_VZAIM_CT_ASSETS Then
                    'По операциям возврата товаров поставщику
                    'добавляем НДС по взаиморасчётам к проводке Д76.02 К-активы
                    'вместо Д76.02 К68.02 (где она должна быть), чтобы не
                    'искать аналитику для суммы НДС на счёте 76.
650                .SUM_CLEAN = -nRestSum         'На сумму остатка.
652                .QUANTITY = -nRestQnt
654                .SUM_NDS = -nRestNds
656             ElseIf aResultAssFull(nRAssFullItem).SUM_CLEAN <> 0@ Then
658                .SUM_CLEAN = -nRestSum         'На сумму остатка.
660                .QUANTITY = -nRestQnt
662                .SUM_NDS = 0@
                Else
664                .SUM_CLEAN = 0@
666                .QUANTITY = 0@
668                .SUM_NDS = -nRestNds
                End If

670             .DATATYP_ID = enum_DATATYPES.dtypSHIP_IN
             End With
NEXT_RASS_ITEM2:
          Next
       End If

672    If nRVzmCount Then                        'Запись на диск
674       For nRVzmItem = 1& To nRVzmCount
         
         
676          If AddNew_RESULT(aResultVzm(nRVzmItem)) = False Then
678             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура AddNew_RESULT(aResultVzm) вернула ошибку."
680             GoTo HELL
             End If
          Next
       End If
682    Return

       '===================================================================
       '       ПОДПРОГРАММА ЗАГРУЗКИ ИСХОДЯЩИХ ПЛАТЕЖЕЙ В aRecCash
       '           А ТАКЖЕ ФОРМИРОВАНИЯ И ЗАПИСИ РЕЗУЛЬТАТА
       '              ПО ИСХОДЯЩИМ ПЛАТЕЖАМ В aResultCash
       '-------------------------------------------------------------------
CASH_OUT:
684    ReDim aRecCash(1& To ARR_BLOCK)
686    nCashCount = 0&
688    nFullSum = 0@
690    nFullNds = 0@
692    With t_REGCASH
694       .Index = "VZ_ID_SHIPPING"
696       .SeekRecord "=", RecVzm.VZ_ID
698       If .NoMatch Then Return
700       Do Until .EOF
702          If (!VZ_ID_SHIPPING <> RecVzm.VZ_ID) Then Exit Do
704          nCashCount = nCashCount + 1&
706          If nCashCount Mod ARR_BLOCK = 0& Then 'Приращаем массив.
708             ReDim Preserve aRecCash(1& To nCashCount + ARR_BLOCK)
             End If                               'Получаем текущую запись
710          If fnReadRegcash(t_REGCASH, aRecCash(nCashCount)) = False Then
712             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура fnReadRegcash вернула ошибку."
714             GoTo HELL
             End If
716          nFullSum = nFullSum + aRecCash(nCashCount).CASH_SUM
718          nFullNds = nFullNds + aRecCash(nCashCount).CASH_NDS

720          .MoveNext
          Loop
       End With
                                                  'ФОРМИРУЕМ РЕЗУЛЬТАТ
       '-------------------------------------------------------------------
722    ReDim aResultCash(1& To ARR_BLOCK)
724    nRCashCount = 0&

       'Этот коэффициент показывает, во сколько раз сумма платежей
       'больше суммы поставки (возможно при корректировках)
726    nCoeff = (nFullSum + nFullNds) / (RecVzm.VZ_SUM + RecVzm.VZ_NDS)

728    nRestSum = 0@                    'Суммы по поставке, индексирован-
730    nRestNds = 0@                    'ные на nCoeff по платежам.
732    nRestQnt = 0@
734    For nRVzmItem = 1& To nRVzmCount
736       With aResultVzm(nRVzmItem)
738          .TMP_SUM = .SUM_CLEAN * nCoeff
740          .TMP_NDS = .SUM_NDS * nCoeff
742          .TMP_QNT = .QUANTITY
744          nRestSum = nRestSum + .TMP_SUM
746          nRestNds = nRestNds + .TMP_NDS
748          nRestQnt = nRestQnt + .TMP_QNT
                                                  'Погрешность округления
750          If (nRVzmItem = nRVzmCount) And (nFullSum <> nRestSum) Then
752             .TMP_SUM = .TMP_SUM + nFullSum - nRestSum
754             .TMP_NDS = .TMP_NDS + nFullNds - nRestNds
756             nRestSum = nFullSum
758             nRestNds = nFullNds
             End If
          End With
       Next

760    If CBool(nRestQnt) Then                    'Цена (с НДС)
762       nPrice = (nRestSum + nRestNds) / nRestQnt
       Else
764       nPrice = 0#
       End If

766    nExtractNds = RecVzm.STAVKA_NDS / (1 + RecVzm.STAVKA_NDS)

768    For nCashItem = 1& To nCashCount           'Перебираем платежи.

770       With aRecCash(nCashItem)
772          nCurSum = .CASH_SUM + .CASH_NDS
774          If CBool(nRestQnt) Then
776             nCurQnt = nCurSum / nPrice
             Else
778             nCurQnt = 0@
             End If
          End With

780       For nRVzmItem = 1& To nRVzmCount 'Перебираем взаиморасчёты.

782          With aResultVzm(nRVzmItem)
784             If (.TMP_SUM = 0@) And (.TMP_NDS = 0@) Then
786                GoTo NEXT_VZM_ITEM
                End If
             End With

788          nRCashCount = nRCashCount + 1& 'Приращаем массив
790          If nRCashCount Mod ARR_BLOCK = 0& Then
792             ReDim Preserve aResultCash(1& To nRCashCount + ARR_BLOCK)
             End If

794          With aResultVzm(nRVzmItem)

                'Если сумма текущего платежа недостаточна, то списываем
                'платёж полностью. Обычно все суммы отрицательные (пла-
                'тёж - всегда отрицательный).
796             If (nCurSum > (.TMP_SUM + .TMP_NDS)) Then
798                With aResultCash(nRCashCount)
800                   .SUM_NDS = nCurSum * nExtractNds
802                   .SUM_CLEAN = nCurSum - .SUM_NDS
804                   .QUANTITY = nCurQnt
806                   nCurSum = 0@
808                   nCurQnt = 0@
810                   aResultVzm(nRVzmItem).TMP_SUM = aResultVzm(nRVzmItem).TMP_SUM - .SUM_CLEAN
812                   aResultVzm(nRVzmItem).TMP_NDS = aResultVzm(nRVzmItem).TMP_NDS - .SUM_NDS
814                   aResultVzm(nRVzmItem).TMP_QNT = aResultVzm(nRVzmItem).TMP_QNT - .QUANTITY
                   End With

                'А если платежа хватает, то списываем из взаиморасчётов.
                Else
816                With aResultCash(nRCashCount)
818                   .SUM_NDS = aResultVzm(nRVzmItem).TMP_NDS
820                   .SUM_CLEAN = aResultVzm(nRVzmItem).TMP_SUM
822                   .QUANTITY = aResultVzm(nRVzmItem).TMP_QNT
824                   nCurSum = nCurSum - aResultVzm(nRVzmItem).TMP_SUM
826                   nCurSum = nCurSum - aResultVzm(nRVzmItem).TMP_NDS
828                   nCurQnt = nCurQnt - aResultVzm(nRVzmItem).TMP_QNT
830                   aResultVzm(nRVzmItem).TMP_SUM = 0@
832                   aResultVzm(nRVzmItem).TMP_NDS = 0@
834                   aResultVzm(nRVzmItem).TMP_QNT = 0@
                   End With
                End If
836             nRestSum = nRestSum - aResultCash(nRCashCount).SUM_CLEAN
838             nRestNds = nRestNds - aResultCash(nRCashCount).SUM_NDS
840             nRestQnt = nRestQnt - aResultCash(nRCashCount).QUANTITY

842             With aResultCash(nRCashCount)  'Переносим аналитику.
844                .VZ_ID = aResultVzm(nRVzmItem).VZ_ID
846                .VZ_DATE_ID = aResultVzm(nRVzmItem).DATE_ID
848                .VZ_ACC_ID = aResultVzm(nRVzmItem).ACC_ID
850                .DEAL_ID = aResultVzm(nRVzmItem).DEAL_ID
852                .ITEM_ID = aResultVzm(nRVzmItem).ITEM_ID
854                .ZATR_ID = aResultVzm(nRVzmItem).ZATR_ID
856                .PODRAZ_ID = aResultVzm(nRVzmItem).PODRAZ_ID
858                .NOMEN_ID = aResultVzm(nRVzmItem).NOMEN_ID
860                .NG_ID = aResultVzm(nRVzmItem).NG_ID

862                .DATE_ID = aRecCash(nCashItem).CASH_DATE
864                .DOC_ID = aRecCash(nCashItem).DOC_ID
866                .OPER_ID = aRecCash(nCashItem).OPER_ID
868                .ACC_ID = aRecCash(nCashItem).ACC_ID
870                .DESCR_ID = aRecCash(nCashItem).DESCR_ID
872                .REL_DOC_ID = aRecCash(nCashItem).REL_DOC_ID

874                .DATATYP_ID = enum_DATATYPES.dtypCASH_OUT
                End With

                                                  'Погрешность округления
876             If (nRestSum <> -nRestNds) _
                And (Abs(nRestSum + nRestNds) < 0.0004@) Then
878                With aResultCash(nRCashCount)
880                   If (Abs(nRestSum) > Abs(nRestNds)) Then
882                      .SUM_CLEAN = .SUM_CLEAN - nRestSum - nRestNds
884                   ElseIf nRestSum = nRestNds Then
886                      .SUM_CLEAN = .SUM_CLEAN - nRestSum
888                      .SUM_NDS = .SUM_NDS - nRestNds
                      Else
890                      .SUM_NDS = .SUM_NDS - nRestSum - nRestNds
                      End If
                   End With
                End If
             End With

892          If (nCurSum = 0@) Then               'Проверка окончания работы
894             If (nRestSum + nRestNds = 0@) Then
896                If (nRVzmItem = nRVzmCount) Then
                      Exit For
                   Else
898                   If (aResultVzm(nRVzmItem + 1&).TMP_SUM = 0@) _
                      And (aResultVzm(nRVzmItem + 1&).TMP_NDS = 0@) Then
                         Exit For
                      Else
                         'Обрабатываем ситуации, когда все платежи
                         'уже перераспределены по взаиморасчётам, но
                         'ещё остались записи в aResultVzm, которые
                         'в сумме = 0@. В этом случае мы переприсвоим
                         'значение nCurSum на сумму взаиморасчётов из
                         'aResultVzm. Надо только определить, с какой
                         'строкой aResultVzm мы продолжим работу.
900                      If (aResultVzm(nRVzmItem).TMP_SUM + _
                             aResultVzm(nRVzmItem).TMP_NDS <> 0@) Then
902                         nCurSum = aResultVzm(nRVzmItem).TMP_SUM + aResultVzm(nRVzmItem).TMP_NDS
904                         nRVzmItem = nRVzmItem - 1
                         Else
906                         nCurSum = aResultVzm(nRVzmItem + 1&).TMP_SUM _
                                    + aResultVzm(nRVzmItem + 1&).TMP_NDS
                         End If
                      End If
                   End If
                Else
                   'Если платежей для распределения больше нет,
                   'а nRestSum<>0, то мы продолжае мобрабатывать
                   'ситуацию, описанную выше, и стараемся не выходить из цикла.
908                If (nCashItem = nCashCount) Then
910                   If (nRVzmItem = nRVzmCount) Then
                         Exit For
                      Else
912                      If (aResultVzm(nRVzmItem + 1&).TMP_SUM = 0@) _
                         And (aResultVzm(nRVzmItem + 1&).TMP_NDS = 0@) Then
                            Exit For
                         Else
914                         If (aResultVzm(nRVzmItem).TMP_SUM + _
                                aResultVzm(nRVzmItem).TMP_NDS <> 0@) Then
916                            nCurSum = aResultVzm(nRVzmItem).TMP_SUM + aResultVzm(nRVzmItem).TMP_NDS
918                            nRVzmItem = nRVzmItem - 1
                            Else
920                            nCurSum = aResultVzm(nRVzmItem + 1&).TMP_SUM _
                                       + aResultVzm(nRVzmItem + 1&).TMP_NDS
                            End If
                         End If
                      End If
                   Else
                      Exit For
                   End If
                End If
             End If
NEXT_VZM_ITEM:
          Next
       Next

922    nRestSum = 0@                              'Погрешность округления
924    nRestNds = 0@
926    For nRCashItem = 1& To nRCashCount
928       With aResultCash(nRCashItem)
930          nRestSum = nRestSum + .SUM_CLEAN
932          nRestNds = nRestNds + .SUM_NDS
          End With
       Next
934    If ((Abs(nFullSum - nRestSum) > 0.001@) _
       Or (Abs(nFullNds - nRestNds) > 0.001@)) Then
936       PrintLog ErrHeader & ERR_LOC & _
             "Ошибка распределения исходящих платежей."
938       GoTo HELL
       End If
940    With aResultCash(nRCashCount)
942       .SUM_CLEAN = .SUM_CLEAN + nFullSum - nRestSum
944       .SUM_NDS = .SUM_NDS + nFullNds - nRestNds
       End With

946    If nRCashCount Then                     'Запись на диск
948       For nRCashItem = 1& To nRCashCount
950          If AddNew_RESULT(aResultCash(nRCashItem)) = False Then
952             PrintLog ErrHeader & ERR_LOC & _
                   "Процедура AddNew_RESULT(aResultCash) вернула ошибку."
954             GoTo HELL
             End If
          Next
       End If

956    Return

       '===================================================================
       '       ПОДПРОГРАММА ФОРМИРОВАНИЯ И ЗАПИСИ РЕЗУЛЬТАТА
       '        ПО ИСХОДЯЩИМ ПЛАТЕЖАМ (ВЗАИМОРАСЧЁТЫ) В aResultPay
       '-------------------------------------------------------------------
PAY_OUT:
958    ReDim aResultPay(1& To ARR_BLOCK)
960    nRPayCount = 0&

962    For nRCashItem = 1& To nRCashCount

          'Проверяем: если аналитика, полученная из ДДС
          'та же, что и в предыдущей записи, то новую запись
          'не создаём, а добавляем суммы к предыдущей.
964       bIsGroup = False
966       With aResultCash(nRCashItem)
968          If (nRPayCount > 0&) Then
970             If (.ZATR_ID = aResultPay(nRPayCount).ZATR_ID) _
                And (.PODRAZ_ID = aResultPay(nRPayCount).PODRAZ_ID) _
                And (.NOMEN_ID = aResultPay(nRPayCount).NOMEN_ID) _
                And (.NG_ID = aResultPay(nRPayCount).NG_ID) _
                And (.DATE_ID = aResultPay(nRPayCount).DATE_ID) Then
972                bIsGroup = True
                End If
             End If
          End With

974       If bIsGroup = False Then                'Если группировки нет, то
976          nRPayCount = nRPayCount + 1&         'приращаем массив
978          If nRPayCount Mod ARR_BLOCK = 0& Then
980             ReDim Preserve aResultPay(1& To nRPayCount + ARR_BLOCK)
             End If
          End If

982       With aResultPay(nRPayCount)             'Делаем записи о поступл.
984          If bIsGroup Then
986             .SUM_CLEAN = .SUM_CLEAN - aResultCash(nRCashItem).SUM_CLEAN
988             .SUM_NDS = .SUM_NDS - aResultCash(nRCashItem).SUM_NDS
990             .QUANTITY = .QUANTITY - aResultCash(nRCashItem).QUANTITY
             Else
992             .VZ_ID = aResultCash(nRCashItem).VZ_ID
994             .VZ_DATE_ID = aResultCash(nRCashItem).DATE_ID
996             .DATE_ID = aResultCash(nRCashItem).DATE_ID
998             .DOC_ID = aResultCash(nRCashItem).DOC_ID
1000             .DEAL_ID = aResultCash(nRCashItem).DEAL_ID
1002             .ITEM_ID = aResultCash(nRCashItem).ITEM_ID
1004             .OPER_ID = aResultCash(nRCashItem).OPER_ID
1006             .ZATR_ID = aResultCash(nRCashItem).ZATR_ID
1008             .PODRAZ_ID = aResultCash(nRCashItem).PODRAZ_ID
1010             .NOMEN_ID = aResultCash(nRCashItem).NOMEN_ID
1012             .NG_ID = aResultCash(nRCashItem).NG_ID
1014             .DESCR_ID = aResultCash(nRCashItem).DESCR_ID
1016             .REL_DOC_ID = aResultCash(nRCashItem).REL_DOC_ID
1018             .SUM_CLEAN = -aResultCash(nRCashItem).SUM_CLEAN
1020             .SUM_NDS = -aResultCash(nRCashItem).SUM_NDS
1022             .QUANTITY = -aResultCash(nRCashItem).QUANTITY
1024             .DATATYP_ID = enum_DATATYPES.dtypPAYMENTS

1026             .VZ_ACC_ID = AccIdDebt(.OPER_ID, aResultCash(nRCashItem).ACC_ID)
1028             If .VZ_ACC_ID = aResultCash(nRCashItem).ACC_ID Then
1030                .VZ_ACC_ID = AccIdCred(.OPER_ID, aResultCash(nRCashItem).ACC_ID)
                      End If
1032             .ACC_ID = .VZ_ACC_ID
                   End If
                End With

                'В результате группировки сумма по строке может обнулиться.
                'Такую строку записывать в базу не нужно.
1034       If bIsGroup And (aResultPay(nRPayCount).SUM_CLEAN = 0@) _
                 And (aResultPay(nRPayCount).SUM_NDS = 0@) Then
1036          nRPayCount = nRPayCount - 1&
                 End If
              Next

1038    If nRPayCount Then                         'Запись на диск
1040       For nRPayItem = 1& To nRPayCount
1042          If AddNew_RESULT(aResultPay(nRPayItem)) = False Then
1044             PrintLog ErrHeader & ERR_LOC & _
                           "Процедура AddNew_RESULT(aResultPay) вернула ошибку."
1046             GoTo HELL
                     End If
                  Next
               End If

1048    Return

                 '===================================================================
                 '                              ВЫХОД
                 '-------------------------------------------------------------------
HELL:
                 On Error Resume Next
1050    frmMain.StatusBar1.Panels(1).Text = ""
1052    frmMain.ProgressBar1.Visible = False
1054    PrintLog "Процедура fnProcessResult " & _
                            IIf(bRetVal, "завершена успешно.", "не завершена.")
1056    nRecord = 0

1058    If bTransaction Then oWorkspase.Rollback
1060    fnProcessResult = bRetVal
1062    CurrStage = STAGE0_DOING_NOTHING   ' Для ErrHeader

         '<EhFooter>
1064     PrintLog "<<== xxMProcessResult.fnProcessResult"
         Exit Function

fnProcessResult_Err:
1066     PrintLog ErrHeader
1068     PrintLog "ERROR!!! " & Err.Description & _
                " in xxMProcessResult.fnProcessResult " & _
                "in line " & Erl, True, True, _
                Err.HelpFile, Err.HelpContext
1070     GoTo HELL
         '</EhFooter>
End Function
Последний раз редактировалось nouyana 07.05.2024 (Вт) 19:43, всего редактировалось 2 раз(а).

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение серверянин » 07.05.2024 (Вт) 8:48

nouyana писал(а): Процедура имеет обработчик ошибок, использующий функцию Erl, которая почему-то вместо 484-ой строки выдаёт 0.
Потому что во время выполнения скомпилированного файла, в нем строк уже нету.

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение nouyana » 07.05.2024 (Вт) 9:34

Удалено.
Последний раз редактировалось nouyana 07.05.2024 (Вт) 19:43, всего редактировалось 1 раз.

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение nouyana » 07.05.2024 (Вт) 19:42

Решение проблемы найдено. Проблема была в выходе из блока With...End With при помощи GoTo. Я уже где-то писал (не могу найти), что после таких выходов откомпилированная в Native Code программа вылетает при выходе из процедуры, содержащей такой блок. А теперь вот можно добавить, что откомпилированная в Native Code программа не может переопределить массив, если он заблокирован блоком With. Вопросы, правда, всё равно остались, но уже чисто теоретические, если кому интересно:

Итак. Полностью воссоздать ситуацию на коротком примере я так и не смог, но произошло примерно следующее:
Код: Выделить всё
Private Type MyType
   N As Long
End Type

Sub Main()
       On Error GoTo Main_Err
       
       Dim a() As MyType
       Dim i   As Long
   
100    For i = 1 To 5
105       ReDim a(5)     ' На втором круге цикла здесь возникнет ошибка.
110       GoSub SUB_PROC
       Next
   
       Exit Sub
   
SUB_PROC:
115    With a(1)
120       GoTo EXIT_SUB_PROC ' Некорректный выход из блока With
       End With
EXIT_SUB_PROC:
125    Return

Main_Err:
130    VBA.MsgBox Err.Description, , "Error #" & Err.Number & " in line " & Erl
       Exit Sub
End Sub


Вопрос в следующем. В приведённом выше примере программа выдаст нормальную ошибку:
Error #10 in line 105, "This array is fixed or temporarily locked". В моём же случае функция line выдала строку 0, а ошибка была совсем другая (Invalid property value). При работе в IDE и при компиляции в P-код ошибок не было вообще. Тем не менее, проблему решил исправлением вот этого кода (убрал блок With):

Код: Выделить всё
782          With aResultVzm(nRVzmItem)
784             If (.TMP_SUM = 0@) And (.TMP_NDS = 0@) Then
786                GoTo NEXT_VZM_ITEM
                End If
             End With


Вывод: никаких GoTo внутри блока With. Второй раз на одни и те же грабли наступаю.

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение серверянин » 08.05.2024 (Ср) 9:17

А с чего бы это надо применять GoSub, а не Call ? Здесь же не QBasic.
И, потом, выход из циклов по Goto (или другим прямым переходом куда-то) это недопустимый вариант. В VB6 для этого надо использовать команду Exit.

И еще нюанс.
Если в примитивных бейсиках (типа DOS, или для микроконтроллеров) можно было сделать выход из цикла For i ... To n, присвоив в теле цикла переменной i значение больше n, то в VB6 так лучше не делать, а использовать Exit For.

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 114
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение nouyana » 08.05.2024 (Ср) 9:43

серверянин писал(а):А с чего бы это надо применять GoSub, а не Call ?


Привычка, наверное. Это программа по бух.учёту. Тут примерно 20-25k строк кода и все они делают приблизительно одно и то же:) Я теряюсь в модулях, в которых по 20-30 очень похожих процедур. У меня их 5-6, но они бывают большие. Здесь проблема не в GoSub, а именно в GoTo и Exit. Нельзя выходить из блока With навсегда (надо возвращаться). Из циклов и блоков If/Select - можно.

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Ошибка Invalid property value в откомпилированной програ

Сообщение серверянин » 08.05.2024 (Ср) 10:58

Из циклов тоже лучше так не делать, я писал выше.
VB6 строит циклы как-то слишком хитро по их скрытой внутренней структуре. Следует использовать Exit
(а GoTo вообще не приветствуется).


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 50

    TopList  
cron