powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Out Of Memory ;-(
13 сообщений из 13, страница 1 из 1
Out Of Memory ;-(
    #32605863
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем.
Есть задача - из БД выбрать все данные за определенный день и запихать их в массив для последующей обработки. Но вот и проблема:
Сейчас кол-во записей достигает уже 185000 за день, и впроцессе выполнения запроса выдает сообщение:

Program raised exception class EOutOfMemory with message 'Out of memory'

Текст запроса:
Код: plaintext
1.
2.
3.
Select * From table
{...далее идет перебор всех условий }
 Order by STEL_A,DBEGDATE;

... а в программе ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 IBQuery1.Open;
 IBQuery1.First;
 i:= 0 ;
  while not IBQuery1.eof do
    begin
      telmas1[i, 0 ]:=IBQuery1.FindField('SPAY').AsString;
      telmas1[i, 1 ]:=IBQuery1.FindField('STEL_A').AsString;
      telmas1[i, 2 ]:=IBQuery1.FindField('DBEGDATE').AsString;
      ...
      inc(i);
      IBQuery1.Next;
    end;
IBQuery1.Close;
и где-то в этом месте программа и вываливается...:-(


С уважением, Ihor
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32605874
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятно, что вываливается...
а для чего ты такие объёмы в массив суёшь?
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606040
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
STEL_A - номер телефона абонента, который звонит. Необходимо выбрать все номера за определенный промежуток времени (чаще всего, сутки) и выбрать все разговоры с этого номера, которые удовлетворяют определенному вопросу.
Пробовал делать все через запросы, т.е, вначален выбираю все значения STEL_A ,потом для каждого выполняю запрос на поиск опред. промежуточных данных (сразу выбрать все данные для заданного условия не получается). Но по времени эта процедура длиться минут 20-30, машина виснет.
Хочу вначале выбрать все данные в массив, и там их обрабатывать (что по сравнению с запросом у меня заняло на порядок меньше времени).
Но вот и появился этот глюк...
С уважением, Ihor
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606152
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с таким подходом тебе лучше перейти на BerkleyDB

почитай хорошую книгу по SQL
в конце-концов давай ТЗ в студию
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606221
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не в тему или всё же ХП может тут помочь отцу русской демократии???
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606227
d'Evil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Испльзуй ХП c FOR SELECT. Внутри строится выборка, а в теле блока begin/end рассчитывай. У меня строится аналитеческая выборка из 6 таблиц твоего размера за неск секунд (с построением промежуточных итогов даже вручную)
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606231
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vis: Да, согласен. Такой подход не есть гут. :-( Просто необходимо эти данные получать как-можно скорее, вопрос о времени стоит на первом месте.
Само задание.
Есть три поля

STEL_A - номер абонента, который звонит (тел. А)
DBEGDATE - дата и время начала разговора (к примеру, 08.07.2004 0:00:31)
NDURATION - длительность разговора (сек.)
Есть данные
Код: plaintext
1.
2.
STEL_A        DBEGDATE             NDURATION
 300147     08 . 07 . 2004   2 : 46 : 59            12 
 300147     08 . 07 . 2004   2 : 47 : 44             9  

Тут получается: разговор начался в 2:46:59, длился 12 сенуд (закончился в 2:47:11) и начался след. разговор в 08.07.2004 2:47:44. Тут все нормально. Но необходимо выбрать для каждого номера телефона след. ситуации:
Код: plaintext
1.
2.
3.
STEL_A          DBEGDATE        NDURATION
 543001 	 08 . 07 . 2004   0 : 19 : 24        506 
 543001 	 08 . 07 . 2004   0 : 22 : 07         26 
т.е., Разговор начался в 0:19:24, длился 506 секунд (закончился в 0:27:50), НО следующий разговор начался в 0:22:07 ,т. е., иными словами 0:22:07-0:19:24=2 минуты 43 секунды<чем длительность первого разговора (8 минут 26).
Получается, что в определенный момент с одного и того же телефона в одно ито же время ОДНОВРЕМЕННО ПРОИСХОДЯТ ДВА РАЗГОВОРА ,что просто не возможно.
Т. е., получили пример так называемого "зависшего разговора" (линия не освободилась, а абонент начал другой разговор (по другому каналу, другой линии) ) Из-за таких случаев ему выставляется б'ольший счет за разговоры

ВОТ эти случаи и надо отобрать, чтобы исправлять проблему сразу после обнаружения, а не после жалобы клиента...
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606241
Фотография Ihor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2VF, 2d'Evil
А можно листинг такой процедуры? (просто я в этом деле новичек и никогда не приходилось еще работать с ХП, а тем более, через Дельфи)

С уважением, Ihor
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606277
Фотография VF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работать с ХП можно через IBStoredProc, а ещё можно простым Query вызывать строкой типа
Код: plaintext
Select * from SP_name;
а текст процедуры мне лень писать, вот примерно как это выглядит
Код: plaintext
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.
CREATE PROCEDURE ZAPOL_TXO (
    PRCHOZOPER INTEGER)
RETURNS (
    RNREC INTEGER,
    RNUMPROV INTEGER,
    RCVAL INTEGER,
    RSODPR VARCHAR( 81 ),
    RCPLANSSCH INTEGER,
    RTIDKGAL CHAR( 3 ),
    RNOMRAS VARCHAR( 15 ),
    RVARRAS CHAR( 3 ),
    RSCHOS VARCHAR( 22 ),
    RSUBOS VARCHAR( 22 ),
    RTBLOS1 CHAR( 2 ),
    RTBLOS2 CHAR( 2 ),
    RTBLOS3 CHAR( 2 ),
    RTBLOS4 CHAR( 2 ),
    RTBLOS5 CHAR( 2 ),
    RTBLOS6 CHAR( 2 ),
    RCKAUOS1 INTEGER,
    RCKAUOS2 INTEGER,
    RCKAUOS3 INTEGER,
    RCKAUOS4 INTEGER,
    RCKAUOS5 INTEGER,
    RCKAUOS6 INTEGER,
    RPRSPO VARCHAR( 20 ),
    RKODSPO VARCHAR( 100 ),
    RKODSPO1 VARCHAR( 200 ),
    RKRSCHETK VARCHAR( 21 ),
    RSCHKS VARCHAR( 22 ),
    RSUBKS VARCHAR( 22 ),
    RTBLKS1 CHAR( 2 ),
    RTBLKS2 CHAR( 2 ),
    RTBLKS3 CHAR( 2 ),
    RTBLKS4 CHAR( 2 ),
    RTBLKS5 CHAR( 2 ),
    RTBLKS6 CHAR( 2 ),
    RCKAUKS1 INTEGER,
    RCKAUKS2 INTEGER,
    RCKAUKS3 INTEGER,
    RCKAUKS4 INTEGER,
    RCKAUKS5 INTEGER,
    RCKAUKS6 INTEGER,
    RPRSPK VARCHAR( 20 ),
    RKODSPK VARCHAR( 100 ),
    RKODSPK1 VARCHAR( 200 ),
    RALG CHAR( 3 ),
    RNOS1 VARCHAR( 90 ),
    RNOS2 VARCHAR( 90 ),
    RNOS3 VARCHAR( 90 ),
    RNOS4 VARCHAR( 90 ),
    RNOS5 VARCHAR( 90 ),
    RNOS6 VARCHAR( 90 ),
    RNKS1 VARCHAR( 90 ),
    RNKS2 VARCHAR( 90 ),
    RNKS3 VARCHAR( 90 ),
    RNKS4 VARCHAR( 90 ),
    RNKS5 VARCHAR( 90 ),
    RNKS6 VARCHAR( 90 ),
    RANOS1 VARCHAR( 90 ),
    RANOS2 VARCHAR( 90 ),
    RANOS3 VARCHAR( 90 ),
    RANOS4 VARCHAR( 90 ),
    RANOS5 VARCHAR( 90 ),
    RANOS6 VARCHAR( 90 ),
    RANKS1 VARCHAR( 90 ),
    RANKS2 VARCHAR( 90 ),
    RANKS3 VARCHAR( 90 ),
    RANKS4 VARCHAR( 90 ),
    RANKS5 VARCHAR( 90 ),
    RANKS6 VARCHAR( 90 ),
    R_NDPOLD1 CHAR( 10 ),
    R_NDPOLD2 CHAR( 10 ),
    R_NDPOLD3 CHAR( 10 ),
    R_NDPOLD4 CHAR( 10 ),
    R_NDPOLD5 CHAR( 10 ),
    R_NDPOLD6 CHAR( 10 ),
    R_NDPOLK1 CHAR( 10 ),
    R_NDPOLK2 CHAR( 10 ),
    R_NDPOLK3 CHAR( 10 ),
    R_NDPOLK4 CHAR( 10 ),
    R_NDPOLK5 CHAR( 10 ),
    R_NDPOLK6 CHAR( 10 ),
    R_NDPOLTIPD1 CHAR( 10 ),
    R_NDPOLTIPD2 CHAR( 10 ),
    R_NDPOLTIPD3 CHAR( 10 ),
    R_NDPOLTIPD4 CHAR( 10 ),
    R_NDPOLTIPD5 CHAR( 10 ),
    R_NDPOLTIPD6 CHAR( 10 ),
    R_NDPOLTIPK1 CHAR( 10 ),
    R_NDPOLTIPK2 CHAR( 10 ),
    R_NDPOLTIPK3 CHAR( 10 ),
    R_NDPOLTIPK4 CHAR( 10 ),
    R_NDPOLTIPK5 CHAR( 10 ),
    R_NDPOLTIPK6 CHAR( 10 ))
AS
DECLARE VARIABLE S_NTABL CHAR( 10 );
DECLARE VARIABLE S_NAME VARCHAR( 50 );
DECLARE VARIABLE S_TBL CHAR( 10 );
DECLARE VARIABLE I_CKAU INTEGER;
DECLARE VARIABLE N1 INTEGER;
DECLARE VARIABLE PUS CHAR( 10 );
begin
  for select nrec,tidkgal,nomras,var_ras,alg,numprov,schos,subos,
  schks,subks,tblos1,tblos2,tblos3,tblos4,tblos5,tblos6,
  ckauos1,ckauos2,ckauos3,ckauos4,ckauos5,ckauos6,
  tblks1,tblks2,tblks3,tblks4,tblks5,tblks6,
  ckauks1,ckauks2,ckauks3,ckauks4,ckauks5,ckauks6,
  CVAL,SODPR,CPLANSSCH,TIDKGAL,PRSPO,KODSPO,KODSPO1,KRSCHETK,
  PRSPK,KODSPK,KODSPK1
  from hozobor where chozoper=:prchozoper
  into
  :rnrec,:rtidkgal,:rnomras,:rvarras,:ralg,:rnumprov,:rschos,:rsubos,
  :rschks,:rsubks,:rtblos1,:rtblos2,:rtblos3,:rtblos4,:rtblos5,:rtblos6,
  :rckauos1,:rckauos2,:rckauos3,:rckauos4,:rckauos5,:rckauos6,
  :rtblks1,:rtblks2,:rtblks3,:rtblks4,:rtblks5,:rtblks6,
  :rckauks1,:rckauks2,:rckauks3,:rckauks4,:rckauks5,:rckauks6,
  :RCVAL,:RSODPR,:RCPLANSSCH,:RTIDKGAL,:RPRSPO,:RKODSPO,
  :RKODSPO1,:RKRSCHETK,:RPRSPK,:RKODSPK,:RKODSPK1
          do   begin
        /*вызов процедуры заполнения наименования аналитики
        передаются на вход коды таблиц КАУ и nrec(и) по всем уровням аналитики
        */ 
        execute procedure zapol_name_anal(:RTBLOS1,:RTBLOS2,
        :RTBLOS3,:RTBLOS4,:RTBLOS5,:RTBLOS6,:RCKAUOS1,:RCKAUOS2,:RCKAUOS3,
        :RCKAUOS4,:RCKAUOS5,:RCKAUOS6,:RTBLKS1,
        :RTBLKS2 ,:RTBLKS3,:RTBLKS4,:RTBLKS5,:RTBLKS6 ,:RCKAUKS1,:RCKAUKS2,
        :RCKAUKS3,:RCKAUKS4,:RCKAUKS5,:RCKAUKS6)
        returning_values (:RNOS1,:RNOS2,:RNOS3,:RNOS4,:RNOS5,:RNOS6,
        :RNKS1,:RNKS2,:RNKS3,:RNKS4,:RNKS5,:RNKS6,:RANOS1,:RANOS2,:RANOS3,:RANOS4,:RANOS5,:RANOS6,
        :RANKS1,:RANKS2,:RANKS3,:RANKS4,:RANKS5,:RANKS6,
        :R_NDPOLD1,:R_NDPOLD2,:R_NDPOLD3,:R_NDPOLD4,:R_NDPOLD5,:R_NDPOLD6,
        :R_NDPOLK1,:R_NDPOLK2,:R_NDPOLK3,:R_NDPOLK4,:R_NDPOLK5,:R_NDPOLK6,
        :R_NDPOLTIPD1,:R_NDPOLTIPD2,:R_NDPOLTIPD3,:R_NDPOLTIPD4,:R_NDPOLTIPD5,:R_NDPOLTIPD6,
        :R_NDPOLTIPK1,:R_NDPOLTIPK2,:R_NDPOLTIPK3,:R_NDPOLTIPK4,:R_NDPOLTIPK5,:R_NDPOLTIPK6);
suspend;
end
end
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32606922
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как насчет такого запроса?

Код: plaintext
1.
2.
3.
4.
5.
6.
select a.stel_a, a.dbegdate, a.duration, b.begdate
from mytable a
inner join mytable b on ( a.stel_a = b.stel_a )
where (a.begdate < b.begdate) and
         (a.begdate + a.duration /  0 . 00001157  > b.begdate)

здесь 0.00001157 = 1/24/60/60
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32608573
d'Evil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вот одна из моих. там кстати есть принятие решения - нужно ли возвращать эту строку ни клиента (нужно ли делать suspend)

Код: plaintext
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.
CREATE PROCEDURE GETRASHODBYFACE(
    ID_PERIOD INTEGER,
    ID_FACE INTEGER)
RETURNS (
    ID INTEGER,
    OPERDATE DATE,
    TIMEMARKER DATE,
    SUMMA DOUBLE PRECISION,
    REST DOUBLE PRECISION,
    ID_CUR INTEGER,
    CURNAME CHAR( 5 ),
    COLOUR INTEGER,
    CURS DOUBLE PRECISION,
    ID_OFFICE INTEGER,
    OFFICE CHAR( 50 ),
    FIRM CHAR( 50 ),
    DEPART CHAR( 50 ),
    FIRM_FIRST CHAR( 50 ),
    DEPART_FIRST CHAR( 50 ),
    ID_FIRM INTEGER,
    ID_DEPART INTEGER,
    ID_FIRM_FIRST INTEGER,
    ID_DEPART_FIRST INTEGER,
    ISCASH SMALLINT,
    ISCASHSTR CHAR( 3 ),
    MEMO CHAR( 100 ),
    ID_DESTVENDOR INTEGER)
AS
declare variable allreports DOUBLE PRECISION;
declare variable restbefore DOUBLE PRECISION;
declare variable recperiod INTEGER;
begin
  if (:id_face =  55 ) then BEGIN /* Ветка только для расхода денег */ 
  FOR SELECT OPERS.ID, OPERS.OPERDATE, OPERS.TIMEMARKER, OPERS.SUMMA,
    OPERS.ID_CUR, Currency.SName, Currency.Colour, OPERS.CURS, OPERS.ID_OFFICE,
    Offices.Name, opers.id_firm, opers.id_depart, opers.id_firm_first,
    opers.id_depart_first, OPERS.ISCASH, OPERS.MEMO, OPERS.ID_DESTVENDOR,
    OPERS.ID_PERIOD
    FROM Opers, Offices, Currency
    WHERE OPERS.ID_FACE = :ID_FACE
      and OPERS.FACE_TYPE IN ( 0 , 3 )
      and Opers.ID_Period = :ID_Period
      and OPERS.SUMMA <  0 
      and OPERS.ID_Office = Offices.ID
      and OPERS.ID_Cur = Currency.ID
    PLAN JOIN (OPERS INDEX (OPERS_IDX5),
      CURRENCY INDEX (RDB$PRIMARY11),OFFICES INDEX (RDB$PRIMARY30))
     /*PLAN SORT (JOIN (OPERS INDEX (OPERS_IDX5),
      CURRENCY INDEX (RDB$PRIMARY11),OFFICES INDEX (RDB$PRIMARY30)))
    ORDER BY OPERS.OPERDATE, OPERS.TIMEMARKER*/ 
    INTO :ID, :OPERDATE, :TIMEMARKER, :SUMMA, :ID_CUR, :Curname, :COLOUR, :CURS,
    :Id_Office, :Office, :Id_Firm, :Id_Depart, :Id_Firm_First, :Id_Depart_First,
    :ISCASH, :MEMO, :ID_DESTVENDOR, :RecPeriod DO
    begin
      Summa = -:Summa;
       /* Проверка на остаток на начало периода не нужна проводкам этого периода */ 
      if (:RecPeriod < :ID_Period) then begin
         /* Остаток на начало текущего периода */ 
        SELECT Zero(sum(REPORTS.SUMMA))
          FROM REPORTS
          WHERE REPORTS.ID_OPER = :ID and REPORTS.ID_PERIOD < :Id_period
            and REPORTS.REPORT_TYPE =  0   /*<> 1*/   /* Выбрасываем удаленные */ 
          PLAN (REPORTS INDEX (REPORTS_IDX4))
          INTO :allreports;
        restbefore = DRound(:summa - :allreports,  2 );
      end
      else
        restbefore = :Summa;
       /* Оставались ли деньги на начало текущего периода */ 
       /*if (restbefore > 0) then begin*/ 
         /* Остаток на конец текущего периода */ 
        SELECT Zero(sum(REPORTS.SUMMA))
          FROM REPORTS
          WHERE REPORTS.ID_OPER = :ID and REPORTS.ID_PERIOD  /*<*/ = :Id_period
            and REPORTS.REPORT_TYPE =  0   /*<> 1*/   /* Выбрасываем удаленные */ 
          PLAN (REPORTS INDEX (REPORTS_IDX4))
          INTO :allreports;
        rest = DRound(:summa - :allreports,  2 );
      if ((restbefore <>  0 ) or (rest <  0 )) then begin
        if (iscash =  1 ) then
          iscashstr = '';
        else
          iscashstr = 'Б/Н';
        Firm = '';
        select name from firms where firms.id = :id_firm
          into :Firm;
        Firm_First = '';
        select name from firms where firms.id = :id_firm_first
          into :Firm_First;
        Depart = '';
        select name from departs where departs.id = :id_depart
          into :Depart;
        Depart_First = '';
        select name from departs where departs.id = :id_depart_first
          into :Depart_First;
        suspend;
      end
       /*end*/ 
    end
  END ELSE BEGIN  /* Ветка для прочих лиц */ 
  FOR SELECT OPERS.ID, OPERS.OPERDATE, OPERS.TIMEMARKER, OPERS.SUMMA,
    OPERS.ID_CUR, Currency.SName, Currency.Colour, OPERS.CURS, OPERS.ID_OFFICE,
    Offices.Name, opers.id_firm, opers.id_depart, opers.id_firm_first,
    opers.id_depart_first, OPERS.ISCASH, OPERS.MEMO, OPERS.ID_DESTVENDOR,
    OPERS.ID_PERIOD
    FROM Opers, Offices, Currency
    WHERE OPERS.ID_FACE = :ID_FACE
      and OPERS.FACE_TYPE IN ( 0 , 3 )
      and Opers.ID_Period <= :ID_Period
      and OPERS.SUMMA <  0 
      and OPERS.ID_Office = Offices.ID
      and OPERS.ID_Cur = Currency.ID
    PLAN JOIN (OPERS INDEX (OPERS_IDX5),
      CURRENCY INDEX (RDB$PRIMARY11),OFFICES INDEX (RDB$PRIMARY30))
     /*PLAN SORT (JOIN (OPERS INDEX (OPERS_IDX5),
      CURRENCY INDEX (RDB$PRIMARY11),OFFICES INDEX (RDB$PRIMARY30)))
    ORDER BY OPERS.OPERDATE, OPERS.TIMEMARKER*/ 
    INTO :ID, :OPERDATE, :TIMEMARKER, :SUMMA, :ID_CUR, :Curname, :COLOUR, :CURS,
    :Id_Office, :Office, :Id_Firm, :Id_Depart, :Id_Firm_First, :Id_Depart_First,
    :ISCASH, :MEMO, :ID_DESTVENDOR, :RecPeriod DO
    begin
      Summa = -:Summa;
       /* Проверка на остаток на начало периода не нужна проводкам этого периода */ 
      if (:RecPeriod < :ID_Period) then begin
         /* Остаток на начало текущего периода */ 
        SELECT Zero(sum(REPORTS.SUMMA))
          FROM REPORTS
          WHERE REPORTS.ID_OPER = :ID and REPORTS.ID_PERIOD < :Id_period
            and REPORTS.REPORT_TYPE =  0   /*<> 1*/   /* Выбрасываем удаленные */ 
          PLAN (REPORTS INDEX (REPORTS_IDX4))
          INTO :allreports;
        restbefore = DRound(:summa - :allreports,  2 );
      end
      else
        restbefore = :Summa;
       /* Оставались ли деньги на начало текущего периода */ 
       /*if (restbefore > 0) then begin*/ 
         /* Остаток на конец текущего периода */ 
        SELECT Zero(sum(REPORTS.SUMMA))
          FROM REPORTS
          WHERE REPORTS.ID_OPER = :ID and REPORTS.ID_PERIOD <= :Id_period
            and REPORTS.REPORT_TYPE =  0   /*<> 1*/   /* Выбрасываем удаленные */ 
          PLAN (REPORTS INDEX (REPORTS_IDX4))
          INTO :allreports;
        rest = DRound(:summa - :allreports,  2 );
      if ((restbefore <>  0 ) or (rest <  0 )) then begin
        if (iscash =  1 ) then
          iscashstr = '';
        else
          iscashstr = 'Б/Н';
        Firm = '';
        select name from firms where firms.id = :id_firm
          into :Firm;
        Firm_First = '';
        select name from firms where firms.id = :id_firm_first
          into :Firm_First;
        Depart = '';
        select name from departs where departs.id = :id_depart
          into :Depart;
        Depart_First = '';
        select name from departs where departs.id = :id_depart_first
          into :Depart_First;
        suspend;
      end
       /*end*/ 
    end
    END
end
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32608600
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Select * From table
{...далее идет перебор всех условий }
Order by STEL_A,DBEGDATE;


Ну, а в "перебор всех условий" нельзя ли сразу все условия подставить? Пусть сервер все запросы и выполняет. Динамически формируй запросЮ вот и все. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
 Conditions := 'where DBEGDATE between (' + BegDate + ' and ' + EndDate + ')'
  ' and STEL_A = '  STEL_A;
...
  MyDataSet.SQL.Text  := format (' Select * From tableXXX  %s Order by STEL_A,DBEGDATE', Conditions);

MyDataSet.Open;
...
...
Рейтинг: 0 / 0
Out Of Memory ;-(
    #32608611
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, скобки в between не нужны, конечно...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Out Of Memory ;-(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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