powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / IBE 2017.3.30, ошибка при открытии процедуры.
3 сообщений из 3, страница 1 из 1
IBE 2017.3.30, ошибка при открытии процедуры.
    #39440823
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

При открытии процедуры, получаю ошибку:

Error Message:
----------------------------------------
Access violation at address 00A1FB5E in module 'IBExpert.exe'. Read of address 00000010

[00A1FB5E] ParseClasses.TIBEProcStatement.BeginBoolIn (Line 2975, "ParseClasses.pas" + 3) + $7
[00403BFF] System.@HandleAnyException + $33
[009BB476] MyYacc.yyparse (Line 4741, "MyYacc.pas" + 0) + $9F6
[00A1D5D6] ParseClasses.ParseIBSP (Line 1965, "ParseClasses.pas" + 32) + $0
[00DC7280] ProcViewF.TProcViewForm.actLazyModeExecute (Line 2156, "ProcViewF.pas" + 12) + $1F
[004258B7] Classes.TBasicAction.Execute (Line 8076, "Classes.pas" + 3) + $7
[00446F8A] Forms.TCustomForm.WndProc (Line 3063, "Forms.pas" + 94) + $5

Поправьте, пожалуйста.
...
Рейтинг: 0 / 0
IBE 2017.3.30, ошибка при открытии процедуры.
    #39440825
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
create or alter procedure RPT$D$LIABILITY (
    "DATE" D$DATE not null,
    PARAMS_MASK D$MASK = 7)
returns (
    ROW_ID D$KEY,
    CLIENT_CODE D$KEY,
    CLIENT_FK D$KEY,
    CLIENT_LAST_NAME type of column CLIENTS.LAST_NAME,
    CLIENT_FIRST_NAME type of column CLIENTS.FIRST_NAME,
    CLIENT_MIDDLE_NAME type of column CLIENTS.MIDDLE_NAME,
    CLIENT_ADDRESS type of column CLIENTS.ADDRESS_REG,
    CLIENT_BIRTH_DATE type of column CLIENTS.BIRTH_DATE,
    CLIENT_DOC_TYPE_FK type of column DOC_TYPES.DOC_TYPE_ID,
    CLIENT_DOC_SERIES type of column CLIENTS.DOC_SERIES,
    CLIENT_DOC_NUMBER type of column CLIENTS.DOC_NUMBER,
    CLIENT_DOC_ISSUE_DATE type of column CLIENTS.DOC_ISSUE_DATE,
    CLIENT_DOC_ISSUER type of column CLIENTS.DOC_ISSUER,
    CLIENT_DOC_ISSUER_CODE type of column CLIENTS.DOC_ISSUER_CODE,
    CLIENT_PHONE type of column CLIENTS.PHONE_HOME,
    CLIENT_EMAIL type of column CLIENTS.EMAIL,
    D_ACCOUNT D$ACCOUNT,
    D_DATE D$DATE,
    D_NUM_DOG D$VC50,
    D_AMOUNT D$SUM,
    D_AMOUNT_RUR D$SUM,
    C_ACCOUNT D$ACCOUNT,
    C_DATE D$DATE,
    C_NUM_DOG D$VC50,
    C_AMOUNT D$SUM,
    C_AMOUNT_RUR D$SUM,
    SUM_RESULT_1_RUR type of D$SUM,
    SUM_RESULT_2_RUR type of D$SUM)
AS
DECLARE VARIABLE C1_CLIENT_FK D$KEY;
DECLARE VARIABLE C1_ACCOUNT D$ACCOUNT;
DECLARE VARIABLE C1_DATE D$DATE;
DECLARE VARIABLE C1_NUM_DOG D$VC50;
DECLARE VARIABLE C1_AMOUNT D$SUM;
DECLARE VARIABLE C1_AMOUNT_RUR D$SUM;
DECLARE VARIABLE C2_CLIENT_FK D$KEY;
DECLARE VARIABLE C2_ACCOUNT D$ACCOUNT;
DECLARE VARIABLE C2_DATE D$DATE;
DECLARE VARIABLE C2_NUM_DOG D$VC50;
DECLARE VARIABLE C2_AMOUNT D$SUM;
DECLARE VARIABLE C2_AMOUNT_RUR D$SUM;
DECLARE VARIABLE RESULT_CLIENT_FK D$KEY;
DECLARE VARIABLE RESULT_SUM TYPE OF D$SUM;
DECLARE VARIABLE IS_SUSPEND D$BOOLEAN;
DECLARE GET_ACCOUNT_D CURSOR FOR (
    SELECT
      A.CLIENT_FK, A.ACCOUNT, A.CONTRACT_NUM, A.DATE_IN, SUM(T.OP_DIRECTION * T.OP_SUM) AS OP_SUM,
      CAST(CR.RATE * SUM(T.OP_DIRECTION * T.OP_SUM) AS D$SUM) AS OP_SUM_RUR
    FROM D$ACCOUNTS A
    INNER JOIN D$TRANSACTIONS T ON T.ACCOUNT1 = A.ACCOUNT
    INNER JOIN D$OPERATIONS O ON O.OPERATION_ID = T.OPERATION_FK AND O.IS_ACTIVE = 1 AND O."DATE" <= :"DATE"
    INNER JOIN D$TYPES DT ON DT.TYPE_ID = A.DEPOSIT_TYPE_FK
    LEFT OUTER JOIN GET_LAST_CURRENCY_RATE(:"DATE", DT.CURRENCY_FK) CR ON 1 = 1
    WHERE A.STATUS IN (0, 1)
      AND :"DATE" BETWEEN A.DATE_IN AND A.DATE_OUT2 - 1
    GROUP BY A.CLIENT_FK, A.ACCOUNT, CR.RATE, 3, 4
    UNION ALL
    SELECT A.CLIENT_FK, A.ACCOUNT, A.CONTRACT_NUM, A.DATE_IN, A.OP_SUM, CAST(CR.RATE * A.OP_SUM AS D$SUM)
    FROM D$TMP$ACCOUNTS A
    LEFT OUTER JOIN GET_LAST_CURRENCY_RATE(:"DATE", A.CURRENCY_FK) CR ON 1 = 1
    WHERE A.STATUS IN (1, 2)
      AND A.OP_DIRECTION = +1
    ORDER BY 1, 2);
DECLARE GET_ACCOUNT_C CURSOR FOR (
    SELECT A.CLIENT_FK, A.ACCOUNT, A.CONTRACT_NUM, A.DATE_IN, A.OP_SUM, CAST(CR.RATE * A.OP_SUM AS D$SUM) AS OP_SUM_RUR
    FROM D$TMP$ACCOUNTS A
    LEFT OUTER JOIN GET_LAST_CURRENCY_RATE(:"DATE", A.CURRENCY_FK) CR ON 1 = 1
    WHERE A.STATUS IN (1, 2)
      AND A.OP_DIRECTION = -1
    ORDER BY A.CLIENT_FK, A.ACCOUNT);
DECLARE GET_AMOUNT CURSOR FOR (
    SELECT CLIENT_FK, SUM(SUMM) AS OP_SUM_RUR
    FROM (SELECT A.CLIENT_FK, CAST(CR.RATE * SUM(T.OP_DIRECTION * T.OP_SUM) AS D$SUM) AS SUMM
          FROM D$ACCOUNTS A
          INNER JOIN D$TRANSACTIONS T ON T.ACCOUNT1 = A.ACCOUNT
          INNER JOIN D$OPERATIONS O ON O.OPERATION_ID = T.OPERATION_FK AND O.IS_ACTIVE = 1 AND O."DATE" <= :"DATE"
          INNER JOIN D$TYPES DT ON DT.TYPE_ID = A.DEPOSIT_TYPE_FK
          LEFT OUTER JOIN GET_LAST_CURRENCY_RATE(:"DATE", DT.CURRENCY_FK) CR ON 1 = 1
          WHERE A.STATUS IN (0, 1)
            AND :"DATE" BETWEEN A.DATE_IN AND A.DATE_OUT2 - 1
          GROUP BY A.CLIENT_FK, A.ACCOUNT, CR.RATE
          UNION ALL
          SELECT A.CLIENT_FK, A.OP_DIRECTION * CAST(CR.RATE * A.OP_SUM AS D$SUM)
          FROM D$TMP$ACCOUNTS A
          LEFT OUTER JOIN GET_LAST_CURRENCY_RATE(:"DATE", A.CURRENCY_FK) CR ON 1 = 1
          WHERE A.STATUS IN (1, 2)) T
    GROUP BY T.CLIENT_FK
    ORDER BY T.CLIENT_FK);
BEGIN
  OPEN GET_ACCOUNT_D;
  OPEN GET_ACCOUNT_C;
  OPEN GET_AMOUNT;
  FETCH GET_ACCOUNT_D INTO :C1_CLIENT_FK, :C1_ACCOUNT, :C1_NUM_DOG, :C1_DATE, :C1_AMOUNT, :C1_AMOUNT_RUR;
  IF (ROW_COUNT = 0) THEN
    C1_CLIENT_FK         = -1;
  FETCH GET_ACCOUNT_C INTO :C2_CLIENT_FK, :C2_ACCOUNT, :C2_NUM_DOG, :C2_DATE, :C2_AMOUNT, :C2_AMOUNT_RUR;
  IF (ROW_COUNT = 0) THEN
    C2_CLIENT_FK         = -1;
  FETCH GET_AMOUNT INTO  :RESULT_CLIENT_FK, :RESULT_SUM;
  IF (ROW_COUNT = 0) THEN
    RESULT_CLIENT_FK     = -1;
  ROW_ID                 = 0;
  CLIENT_CODE            = 50000000;
  FOR
    SELECT
      T.CLIENT_FK, T.CLIENT_LAST_NAME, T.CLIENT_FIRST_NAME, NULLIF(NULLIF(T.CLIENT_MIDDLE_NAME, '-'), ''), NULLIF(TRIM(T.CLIENT_ADDRESS), ''), T.CLIENT_BIRTH_DATE,
      T.CLIENT_DOC_TYPE_FK, NULLIF(NULLIF(TRIM(T.CLIENT_DOC_SERIES), '-'), ''), NULLIF(NULLIF(TRIM(T.CLIENT_DOC_NUMBER), '-'), ''), T.CLIENT_DOC_ISSUE_DATE, NULLIF(NULLIF(TRIM(T.CLIENT_DOC_ISSUER), '-'), ''), NULLIF(NULLIF(TRIM(T.CLIENT_DOC_ISSUER_CODE), '-'), ''),
      NULLIF(TRIM(T.CLIENT_PHONE), ''), NULLIF(TRIM(T.CLIENT_EMAIL), '')
    FROM (
      SELECT DISTINCT
        A.CLIENT_FK, A.CLIENT_LAST_NAME, A.CLIENT_FIRST_NAME, A.CLIENT_MIDDLE_NAME, A.CLIENT_ADDRESS, NULLIF(A.CLIENT_BIRTH_DATE, DATE '1900-01-01') AS CLIENT_BIRTH_DATE,
        A.CLIENT_DOC_TYPE_FK, A.CLIENT_DOC_SERIES, A.CLIENT_DOC_NUMBER, NULLIF(A.CLIENT_DOC_ISSUE_DATE, DATE '1900-01-01') AS CLIENT_DOC_ISSUE_DATE, A.CLIENT_DOC_ISSUER, A.CLIENT_DOC_ISSUER_CODE,
        A.CLIENT_PHONE, NULL AS CLIENT_EMAIL
      FROM D$TMP$ACCOUNTS A
      WHERE A.STATUS = 2
      UNION ALL
      SELECT
        C.CLIENT_ID, C.LAST_NAME, C.FIRST_NAME, C.MIDDLE_NAME, C.ADDRESS_REG, NULLIF(C.BIRTH_DATE, DATE '1899-12-30'),
        C.DOC_TYPE_FK, C.DOC_SERIES, C.DOC_NUMBER, NULLIF(C.DOC_ISSUE_DATE, DATE '1899-12-30'), C.DOC_ISSUER, C.DOC_ISSUER_CODE,
        COALESCE(C.PHONE_HOME, C.PHONE_WORK), C.EMAIL
      FROM CLIENTS C
      WHERE EXISTS (
          SELECT 1 FROM D$ACCOUNTS A
          WHERE A.CLIENT_FK = C.CLIENT_ID
            AND A.STATUS IN (0, 1)
            AND :"DATE" BETWEEN A.DATE_IN AND A.DATE_OUT2 - 1
        )
    ) T
    ORDER BY 1
  INTO
    :CLIENT_FK, :CLIENT_LAST_NAME, :CLIENT_FIRST_NAME, :CLIENT_MIDDLE_NAME, :CLIENT_ADDRESS, :CLIENT_BIRTH_DATE,
    :CLIENT_DOC_TYPE_FK, :CLIENT_DOC_SERIES, :CLIENT_DOC_NUMBER, :CLIENT_DOC_ISSUE_DATE, :CLIENT_DOC_ISSUER, :CLIENT_DOC_ISSUER_CODE,
    :CLIENT_PHONE, CLIENT_EMAIL DO
  BEGIN
    IF (CLIENT_FK = RESULT_CLIENT_FK) THEN
    BEGIN
      IF (BIN_AND(PARAMS_MASK, 4) = 4) THEN
      BEGIN
        SUM_RESULT_1_RUR = RESULT_SUM;
        SUM_RESULT_2_RUR = IIF(RESULT_SUM < 0, 0, RESULT_SUM);
        /* OLD ДО 13.10.2008 N 174-ФЗ
        IF (SUM_RESULT_2_RUR > 100000) THEN
          SUM_RESULT_2_RUR = 100000 + (SUM_RESULT_2_RUR - 100000) * 0.9;
        SUM_RESULT_2_RUR = IIF(SUM_RESULT_2_RUR > 400000, 400000, SUM_RESULT_2_RUR);
        */
        SUM_RESULT_2_RUR = IIF(SUM_RESULT_2_RUR > 1400000, 1400000, SUM_RESULT_2_RUR);
      END
      FETCH GET_AMOUNT INTO  :RESULT_CLIENT_FK, :RESULT_SUM;
      IF (ROW_COUNT = 0) THEN
        RESULT_CLIENT_FK = -1;
      CLIENT_CODE        = CLIENT_CODE + 1;
    END

    IS_SUSPEND           = 0;
    IF (BIN_AND(PARAMS_MASK, 1) = 0) THEN
      C1_CLIENT_FK       = -1;
    IF (BIN_AND(PARAMS_MASK, 2) = 0) THEN
      C2_CLIENT_FK       = -1;
    WHILE (CLIENT_FK IN (C1_CLIENT_FK, C2_CLIENT_FK)) DO
    BEGIN
      IF (BIN_AND(PARAMS_MASK, 1) = 1 AND CLIENT_FK = C1_CLIENT_FK) THEN
      BEGIN
        D_ACCOUNT        = C1_ACCOUNT;
        D_DATE           = C1_DATE;
        D_NUM_DOG        = C1_NUM_DOG;
        D_AMOUNT         = C1_AMOUNT;
        D_AMOUNT_RUR     = C1_AMOUNT_RUR;
        FETCH GET_ACCOUNT_D INTO :C1_CLIENT_FK, :C1_ACCOUNT, :C1_NUM_DOG, :C1_DATE, :C1_AMOUNT, :C1_AMOUNT_RUR;
        IF (ROW_COUNT = 0) THEN
          C1_CLIENT_FK   = -1;
      END
      IF (BIN_AND(PARAMS_MASK, 2) = 2 AND CLIENT_FK = C2_CLIENT_FK) THEN
      BEGIN
        C_ACCOUNT        = C2_ACCOUNT;
        C_DATE           = C2_DATE;
        C_NUM_DOG        = C2_NUM_DOG;
        C_AMOUNT         = C2_AMOUNT;
        C_AMOUNT_RUR     = C2_AMOUNT_RUR;
        FETCH GET_ACCOUNT_C INTO :C2_CLIENT_FK, :C2_ACCOUNT, :C2_NUM_DOG, :C2_DATE, :C2_AMOUNT, :C2_AMOUNT_RUR;
        IF (ROW_COUNT = 0) THEN
          C2_CLIENT_FK   = -1;
      END
      SUSPEND;
      IS_SUSPEND         = 1;
      ROW_ID             = ROW_ID + 1;
      SUM_RESULT_1_RUR   = NULL;
      SUM_RESULT_2_RUR   = NULL;
      D_ACCOUNT          = NULL;
      D_DATE             = NULL;
      D_NUM_DOG          = NULL;
      D_AMOUNT           = NULL;
      D_AMOUNT_RUR       = NULL;
      C_ACCOUNT          = NULL;
      C_DATE             = NULL;
      C_NUM_DOG          = NULL;
      C_AMOUNT           = NULL;
      C_AMOUNT_RUR       = NULL;
    END /* WHILE */
    IF (IS_SUSPEND = 0) THEN
    BEGIN
      SUSPEND;
      ROW_ID             = ROW_ID + 1;
    END
    SUM_RESULT_1_RUR     = NULL;
    SUM_RESULT_2_RUR     = NULL;
    D_ACCOUNT            = NULL;
    D_DATE               = NULL;
    D_NUM_DOG            = NULL;
    D_AMOUNT             = NULL;
    D_AMOUNT_RUR         = NULL;
    C_ACCOUNT            = NULL;
    C_DATE               = NULL;
    C_NUM_DOG            = NULL;
    C_AMOUNT             = NULL;
    C_AMOUNT_RUR         = NULL;
  END /* FOR */
  CLOSE GET_AMOUNT;
  CLOSE GET_ACCOUNT_C;
  CLOSE GET_ACCOUNT_D;
END

...
Рейтинг: 0 / 0
IBE 2017.3.30, ошибка при открытии процедуры.
    #39440986
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / IBE 2017.3.30, ошибка при открытии процедуры.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]