powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Модификация метеденных
33 сообщений из 33, показаны все 2 страниц
Модификация метеденных
    #32347504
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Временные таблици. Их нет, а они нужны .

Насколько стабильно будет работать FB при частом create/drop table без постоянных backup/restore?
Все бы было хорошо если бы я не набрел на
http://ibase.ru/devinfo/ibfaq.htm#1.62
и
http://ibase.ru/devinfo/metaver.htm
Вот они и подорвали мою веру в FB.


P.S. И вообще очень хочется нечто типа: create [temp] table from select... А нету...
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347531
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не совсем понял ...
Для каких целей нужны временные таблицы? Между прочем есть совершенно иные методы работы ... могу рассказать ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347541
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да... Нет а хотелось бы конечно..
А так курсоров нема, viewы почти не работают ...
Ща будем писать и надеятся что не будут так виснуть ХП... :|
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347547
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа ....
FOR SELECT ... это почти тоже самое что и курсор или временная таблица.

авторЩа будем писать и надеятся что не будут так виснуть ХП... :|

Если зависнет - поставим памятник !!!!

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347591
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для каких целей.

Вообще-то я спросил уже от того что устал доказывать рядомсидящим программистам, что временные таблици ненужны и вполне можно обойтись транзакцией snapshot и несколькоми запорсами. Просто чуствую что сил на споры с ними у меня неосталось и подготавливаю пути для отступления...
Они пишут выходные формы на FastReport-е, десятки однотипных выходных форм, и еще очень нелюбят запросы на объединения

Если нужно получить значения из двух таблиц я пишу нечто типа:
Код: plaintext
1.
2.
3.
4.
select tbl1.fld1, tbl3.fld2
from tbl1, tbl2, tbl3
where (tbl1.Id= 1 ) and
         (tbl1.IdTbl2=Tbl2.Id) and
         (tbl2.IdTbl3=Tbl3.Id)

Они:
Код: plaintext
1.
2.
select tbl1.IdTbl2, tbl1.fld1 from tbl1 where Id= 1  into :IdTbl2, :fld1;
select tbl2.IdTbl3 from tbl2 where Id=:IdTbl2 into :IdTbl3;
select tbl3.fld2 from tbl3 where Id=:IdTbl3 into :fld2;



У меня просто закончилось терпение повторять одно и тоже, а в приказном порядке я тоже немогу действовать... Ну представь себе как это выглядело бы состороны: "20-тилетний сопляк (это я :)) учит программистов с 25-30 летним стажем как программы писать". Короче вы мне скажите будет оно нормально работать или нет?
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347693
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну конечно будет. И то и другое. Хотя первое решение наиболее удобнее.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347740
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вообще-то спрашивал про "частое create/drop table без постоянных backup/restore", а не про те запросы :)
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347758
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про создание/удаление таблиц могу сказать одно :
База будет разрастаться на глазах ...

Еще раз повторяю - самое лучшее и правлиьное решение :
Использовать ХП.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32347897
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Andrey_

Позволю себе несколько замечаний к уже высказанным:
1. Нет такой ситуации, когда невозможно обойтись без временной таблицы.
2. В общем случае выполнение одного запроса всегда быстрее нескольких.
При этом логика проще и понятней.
3. Твои "программисты" чего-то не догоняют...:)
Если они действительно предлагают, как ты написал, то лично я сильно
сомневаюсь в их квалификации...

PS
Интересны их аргументы за вр.тбл. :)
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348001
Zaharushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто так пишут все, кто пришел с Фокса :-)))
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348019
Фотография KiLLun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно, у нас тоже так пишут, кто раньше базы на Лисах делал...
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348021
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Johnmen
1. Хм... ну например когда одни и теже данные должны быть видны в контексте нескольких транзакций. Возможно даже непересекающихся по времени. При этом исходные данные постоянно обновляются. Но в моем случае действительно всегда можно обойтись запросами в контексте одной транзакции. Правда прийдется в FastReport

2. Бесспорно.

3. Эти господа писали на FoxPro с момента его пявления. Отсюда и аргументация "У меня так было и оно работало, а главное все просто и понятно"
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348057
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnmen1. Нет такой ситуации, когда невозможно обойтись без временной таблицы.
Вообще-то есть, но КРАЙНЕ редко.

С 1998 года я создал несколько достаточно сложных БД.
И только один единственный раз не смог обойтись ХП - действительно требовались две временных таблицы. Жутко выпендрёжный отчёт понадобился заказчику. Я создал две обычных таблицы. Во время выполнения ХП сбрасывал туда результаты и затем объединив их в однин набор данных отправлял клиенту. Затем чистил таблицы. Чистил, а не удалял.
Поэтому не было никакой надобности менять метаданные во время каждого такого отчёта.
Частота надобности в этом отчёте была 1 или 2 раза в месяц.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348934
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Zmeishe

Ну не могу я даже приблизительно представить ситуации, когда без вр.табл.
никак и никуда...:)
А то, что просто чистить, это верно.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348956
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый - престарый способ:
1. Раз без временных таблмц можно обойтись, то обходимся без них.
2. Раз при Create Table - Drop Table пухнет база до очередного Create/Restore - не делаем так.
3. Если нашелся такой случай, что без временных таблиц - никак, то действуем так:
- "временная" таблица создается статически, т.е. один раз, при создании базы;
- каждый юзер при коннекте получает свой User_Connect_Id (создайте специальный генератор для этого).
- во временную таблицу данные пишутся с составным ключем, одним из полей которого является значение User_Connect_Id. Соответственно, остальные юзеры не видят эти записи (если не хотят их видет, конечно...)
- в конце - не Drop Table, а
delete from MyTable where User_Connect_Id = 9999...
...
Рейтинг: 0 / 0
Модификация метеденных
    #32348977
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на www.interbase-world.com есть статья как можно имитировать временные таблиц

дропать таблицу и создавать занова - это evil - начнут непропорционально разрастаться системные таблицы и очень скоро без backup/restore все начнет жутко тормозить
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349024
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, где-то я читал (один злобный Фокспрошник показывал, что ли?), что число модификаций метаданных в InterBase ограничено счетчиком с очень небольшим число значений, который сбрасывается только при Backup/Restore. Из этого было сделан вывод, что FoxPro - forever.
Тем не менее, будте осторожны, меняйте методику работу.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349040
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну прально вы читали - 255 изменений кажись, а потом переполнение счётчика. В общем временные таблицы - это зло для IB/FB.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349044
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а почему так было сделано? С т.зр. всемирно-исторической?
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349050
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>mv & Gold
Правильно все вы читали:
http://ibase.ru/devinfo/ibfaq.htm#1.62
и
http://ibase.ru/devinfo/metaver.htm
Только там написано "255 на одну таблицу", а не на всю БД.


Вы господа меня убедили, буду с новыми сила со злобными фоксовскими привычками боротся :)
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349059
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И индексы здесь пятнадцать раз при формировании отчета не построишь, до не просто по всяким-разным полям, а по функциям типа "как моя левая нога захочет", и индексы Ascending при сортировке Descending не работают (надо создавать еще раз, но Descend). В общем, это не FoxPro...
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349234
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnmenНу не могу я даже приблизительно представить ситуации, когда без вр.табл. никак и никуда...:)
Тогда помоги, буду очень благодарен.

Бухгалтерская программа.
Таблица "Журнал операций" или ещё называют "Журнал проводок"
В упрощенном варианте
Id integer,
Oper_date date,
Debit integer, /*Код счёта по дебету из плана счетов*/
Kredit integer, /*Код счёта по кредиту из плана счетов*/
Summa double precision

Задача - построить отчёт по форме облпотреб союза образца 1971 года.
Это типа образец
-----------------------------------------------------------------------------
| Дебет | Кредит |
-----------------------------------------------------------------------------
|счёт | cумма частная | сумма общая | счёт |cумма частная | сумма общая |
| Сальдо на 01.01.2003 <сколько-то> |
-----------------------------------------------------------------------------
41/01/01 | 100 р | <null> | 62/01/01 | 333 р | <null> |
41/01/02 | 200 р | <null> | 62/01/02 | 444 р | <null> |
------------------------------------------------------------------------------
| Сальдо на 01.02.2003 <сколько-то> |
-----------------------------------------------------------------------------
41/01/01 | 100 р | 200 р | 48/01 | 1111 р | <null> |
41/01/02 | 300 р | 500 р | 62/01/01 | 222 р | 555 р |
51/01 | 300 р | <null> | 62/01/02 | <null> | 444 р |

В общем сложность в следующем - заранее не известно какие счета и сколько их каждый месяц по дебету и соответственно какие и сколько их по кредиту. В один месяц по дебету строк больше - недостающие строки кредита заполнить <null>, другой месяц по кредиту больше - недостающие строки дебета заполнить <null>. Какой-то счет например в марте имел обороты, а в апреле по нему движения не было. Это значит, что его всёравно надо занести в отчёт и по марту и по апрелю и по маю .. до конца года.
Причём в каждом месяце дебетовая половинка этого отчёта должна быть отсортирована по возрастанию дебетовых счетов, а кредитовая половинка этого отчёта должна быть отсортирована по возрастанию кредитовых счетов.


На сальдо не обращайте внимание оно как раз через ХП, а остальное так:

несколькими ХП я заполняю две таблички одна по дебету, другая по кредиту, а затем их склеиваю, предварительно проанализировав и дополнив недостающие строки либо в одной либо в другой.
Не сделав этого никакой join не даст верного (по деньгам) и желаемого по внешнему виду (т.е. по красоте) результату.

Если у Вас возникли дополнительные (уточняющие вопросы) спрашивайте.
Я давно хочу избавиться от этих двух таблиц.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349266
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я забыл образец оформить так, чтобы лучше было
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 -----------------------------------------------------------------------------
 
|             Дебет                                 |    Кредит                                     |
 -----------------------------------------------------------------------------
 
|счёт | cумма частная | сумма общая | счёт |cумма частная | сумма общая |
| Сальдо на    01 . 01 . 2003   <сколько-то>                                                    |
 -----------------------------------------------------------------------------
 
  41 / 01 / 01  |  100  р         |    <null>        |  62 / 01 / 01  |  333  р         |    <null>      |
  41 / 01 / 02  |  200  р         |    <null>        |  62 / 01 / 02  |  444  р         |    <null>      |
 ------------------------------------------------------------------------------
 
| Сальдо на    01 . 02 . 2003   <сколько-то>                                                  |
 -----------------------------------------------------------------------------
 
  41 / 01 / 01  |  100  р         |     200  р        |  48 / 01      |  1111  р          |     <null>   |
  41 / 01 / 02  |  300  р         |     500  р        |  62 / 01 / 01  |  222  р           |      555  р     |
  51 / 01      |  300  р         |   <null>        |  62 / 01 / 02  | <null>          |      444  р    |   
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349310
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я эти ужасные таблицы формирую в вариантных динамических массивах, а потом бросаю в Excell, и сшивать не надо, и пусть бухгалтера сами думают, как все это распечатать. Естествено, за несколько проходов:
- сначала формирую формирую загловки (горизонтальные и вертикальные), а затем - пробегаюсь еще раз - заплняю данными.
Excel - очень классно. На любой принтер годится.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349323
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я это рапечатываю в QuickReport несколько страничек (обычно 3-5) формата A4. Формируется всё на сервере. И бухгалтера заняты анализом эффективности работы предприятия, а не проблемой распечатывания.
Я стараюсь не напрягать клиентов тем, что можно сделать программно.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349342
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьмите MSSQL, там все это есть (в смысле - временные таблицы), раз уж Вас с пути не свернуть. И на фига Вам эти SQL - серверы?
Вам же предложили варианты решения с временными таблицами.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32349870
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понял, что означают в вашем отчете
"Сумма частная" и "Сумма общая".
Если речь идет о следующем:
-необходимо знать входящий остаток по счету,
дебетовый оборот по счету за период,
кредитовый оборот по счету за период,
исходящий остаток по счету;
-счета с пустыми значениями по всем четырем позициям
не должны присутствовать в отчете,
тогда попробуйте приспособить под свои нужды примерно следующий план.


Главная процедура проходит по всем счетам.
Которые не будут участвовать в этом отчете - пропускаются
create procedure GetMoveAndRestReport(
BeginDate Date,
EndDate Date)
returns (
Account Integer,
BeginRest Double Precision,
DebitMove Double Precision,
KreditMove Double Precision,
EndRest Double Precision)
as
declare variable DebitRest Double Precision;
declare variable KreditRest Double Precision;
begin
for select a.ID from Account a
into :Account
do begin
/* вычисляем входящий остаток по счету */
select Sum(m.Summa) from Move m
where m.Debit = :Account and m.Oper_date < :BeginDate
into :DebitRest;
if (DebitRest is null) then DebitRest = 0;
select Sum(m.Summa) from Move m
where m.Kredit = :Account and m.Oper_date < :BeginDate
into :KreditRest;
if (KreditRest is null) then KreditRest = 0;
BeginRest = DebitRest - KreditRest;
/* вычисляем дебетовый оборот по счету за период */
select Sum(m.Summa) from Move m
where m.Debit = :Account and m.Oper_date between :BeginDate and :EndDate
into :DebitMove;
if (DebitMove is null) then DebitMove = 0;
/* кредит */
select Sum(m.Summa) from Move m
where m.Kredit = :Account and m.Oper_date between :BeginDate and :EndDate
into :KreditMove;
if (KreditMove is null) then KreditMove = 0;
if ((BeginRest <> 0) or (DebitMove <> 0 ) or (KreditMove <> 0)) then begin
/* исходящий */
EndRest = BeginRest + DebitMove - KreditMove;
suspend;
end
end
end

Вот такие получаются результаты
select * from Account
ID
===========
1
2
3
4
5
6
7
8
9
10

select * from Move
ID OPER_DATE DEBIT KREDIT SUMMA
=========== =========== =========== =========== ======================
1 1-JAN-2003 1 2 100
2 2-JAN-2003 1 3 101
3 20-JAN-2003 2 3 102
4 18-JAN-2003 5 6 103
5 19-JAN-2003 5 2 104

select * from GetMoveAndRestReport('15-JAN-2003','30-JAN-2003')
ACCOUNT BEGINREST DEBITMOVE KREDITMOVE ENDREST
=========== ====================== ====================== ====================== ======================
1 201 0 0 201
2 -100 102 104 -102
3 -101 0 102 -203
5 0 207 0 207
6 0 0 103 -103


К вопросу о птичках.
На мысль о неизбежности использования временных таблиц наводят размышления,
исходящие из того, "Что мы имеем".
Попробуйте исходить из того, "Что надо получить".
Надо получить сортировку по счетам - главный цикл должен идти по таблице счетов.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32350046
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На входе в отчёт период и код какого-то одного счёта, по которому нужно получить результат. С периодом - хитрость. Какой бы период не задал пользователь - начало периода перед расчётом надо сбросить в начало года, а пользователю показать сведения за им желаемый период.

Первая половинка - в отчёт собираются из журнала операций все обороты по всем счетам по дебету, когда указанный счёт в кредите.
Затем вторая половинка - собираются все обороты по всем счетам по кредиту, когда указанный счёт в дебете.

Каждая половинка сортируется по месяцам и по номеру счёта. Выясняется количество строк по месяцам в каждой половинке и недостающие заполняются пустыми строками. (Можно и не заполнять математически, но в отчёте должно выглядеть именно так)

Сумма частная - это сумма(оборот) за конкретный месяц.
Сумма общая - это оборот с начала года.
Поэтому в январе по всем счетам частная сумма это оборот по счёту за январь, а общие у всех счетов нули.

В феврале у тех счетов, которые встречались в январе - частная сумма будет оборотом за февраль, а общая сумма - оборот за январь плюс оборот за февраль т.е. плюс частная.
Те счета, по которым движение началось только в феврале будут иметь только частную сумму, а общая ноль.

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

Пример чисто условно (без привязки к налоговому кодексу)
Журнал
05.01.2003 Дт-51 Кт-60 1000 р
07.01.2003 Дт-50 Кт-51 500 р
09.02.2003 Дт-48 Кт-51 100 р

Отчёт по счёту 51
Код: plaintext
1.
2.
3.
4.
5.
Первая половинка (Дт)       |  Вторая половинка (Кт)
Январь
 60  частная  1000  р общая  0  р |   50  частная  500  р общая  0  р
Февраль 
 60  частная  0  р общая  1000  р |   48  частная  100  р общая  0  р
   <null>                   |   50  частная  0  р   общая  500  р

Остатки меня не интересуют - они прекрасно вычисляются безо всяких временных таблиц.
Обороты тоже вычисляются без временных таблиц, для всех других отчётов, кроме этого.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32350546
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Zmeishe

О-о-о ! До боли знакомые вещи !
Делал когда-то. И журналы и оборотно-сальдовые были...:)
Тогда я это решал с использованием виртуальной таблицы в памяти.
Сейчас я бы это сделал по-другому... Исходя из следующих соображений:
1. Джойнить таблицу можно и саму с собой
2. Использование конструкции SELECT A, (SELECT ...), (SELECT ...) FROM ...

Еще не совсем понятно:
1. Зачем выводить по какому-то счету, если движения не было ?
2. Каков критерий, что по этому выводим, а по этому - нет ?
...
Рейтинг: 0 / 0
Модификация метеденных
    #32350669
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> 1. Зачем выводить по какому-то счету, если движения не было ?
ГОСТ

>> 2. Каков критерий, что по этому выводим, а по этому - нет ?
Выводим все, которые с заданным счётом корреспондируют либо по дебету либо по кредиту с самого начала года. Остальные счета не нужны.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32350686
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуем разработать однопроходную процедуру.
Для того чтобы получить данные в виде:
Период, Счет Дебета, Сумма частная, Сумма общая, Счет кредита, Сумма частная, Сумма общая,
мы создадим промежуточную процедуру.
Она выдает данные в следующем виде:
Период, Статус(Дебет или Кредит), Счет, Сумма частная, Сумма общая.
Например
Апрель, Дебет, 50, 100, 300
Апрель, Кредит, 48, 200, 500
Апрель, Дебет, 60, 0, 100
Апрель, Кредит, 61, 20, 90
Апрель, Кредит, 70, 0, 30
Дебет и Кредит при этом ОБЯЗАТЕЛЬНО должны чередоваться,
тогда главная процедура растолкает их по нужным местам в один проход.
Проблема: для того, чтобы получить общие данные, необходим рекурсивный
вызов для предыдущего периода. Например, между первой и второй строкой
Апрель, Дебет, 50, 100, 300
Апрель, Кредит, 48, 200, 500
могут быть такие данные:
Март, Дебет, 50, 100, 200
Февраль, Дебет, 50, 100, 0
При этом нарушается чередование Дебета и Кредита
(То, что нарушается порядок по периодам -
не проблема, так как промежуточный результат можно еще раз отсортировать)
Решение: вводим еще одно поле - идентификатор записи, и для этого поля
два счетчика - отдельно для дебита и кредита. Причем для каждого периода
своя пара счетчиков - итого 24 счетчика. Инкремент для них = 2. Значения
по дебету всегда нечетные, значения по кредиту - всегда четные
Получаем промежуточные данные в следующем виде:
1, Апрель, Дебет, 50, 100, 300
1, Март, Дебет, 50, 100, 200
1, Февраль, Дебет, 50, 100, 0
2, Апрель, Кредит, 48, 200, 500
2, Март, Кредит, 48, 300, 0
3, Апрель, Дебет, 60, 0, 100
3, Март, Дебет, 60, 100, 0
4, Апрель, Кредит, 61, 20, 90
4, Март, Кредит, 61, 20, 70
2, Февраль, Кредит, 61, 25, 25
2, Январь Кредит, 61, 25, 0
6, Апрель, Кредит, 70, 0, 30
6, Март, Кредит, 70, 30, 0

После сортировки по полям Период, Идентификатор:
2, Январь Кредит, 61, 25, 0
1, Февраль, Дебет, 50, 100, 0
2, Февраль, Кредит, 61, 25, 25
1, Март, Дебет, 50, 100, 200
2, Март, Кредит, 48, 300, 0
3, Март, Дебет, 60, 100, 0
4, Март, Кредит, 61, 20, 70
6, Март, Кредит, 70, 30, 0
1, Апрель, Дебет, 50, 100, 300
2, Апрель, Кредит, 48, 200, 500
3, Апрель, Дебет, 60, 0, 100
4, Апрель, Кредит, 61, 20, 90
6, Апрель, Кредит, 70, 0, 30

Вот и всё!

Вот вариант многопроходной процедуры.
Если отчет делается за декабрь, то по данным за январь будет 12 проходов
В принципе разницы нет между 1 секундой и 12-ю.

create procedure Get1971BurnedReport (
Account Integer,
TheMonth Integer,
TheYear Integer)
returns (
BeginDate Date,
EndDate Date,
DebitAccount Integer,
DebitPrivate Double Precision,
DebitPublic Double Precision,
KreditAccount Integer,
KreditPrivate Double Precision,
KreditPublic Double Precision)
as
declare variable CurrentMonth Integer;
declare variable DebitRingStop Smallint;
declare variable KreditRingStop Smallint;
declare variable CurrentDebitAccount Integer; /* зеркало для непустых значений */
declare variable CurrentKreditAccount Integer;
begin
/* главный цикл по периодам */
CurrentMonth = 1;
while (CurrentMonth <= TheMonth) do begin
select begindate, enddate from CalcPeriod(:CurrentMonth,:TheYear) into :BeginDate,:EndDate;
/* внутренний цикл по счетам */
select * from GetFirstAccount into :FirstAccount;
select * from GetLastAccount into :LastAccount;
DebitRingStop = 0;
KreditRingStop = 0;
CurrentDebitAccount = FirstAccount;
CurrentKreditAccount = FirstAccount;
while ((DebitRingStop = 0) and (KreditRingStop = 0)) do begin
/* очищаем значения перед печатью */
DebitAccount = null;
DebitPrivate = null;
/* бежим по всем счетам пока не находим первый, */
/* у которого не пустые обороты */
while ((DebitAccount is null) and (CurrentDebitAccount <= LastAccount) and
(DebitRingStop = 0)) do begin
/* вычисляем обороты за период */
select * from GetMove(:BeginDate,:EndDate,:Account,:CurrentDebitAccount) into :DebitPrivate;
/* если проверили последний счет, то пора выходить из цикла */
if (CurrentDebitAccount = LastAccount) then DebitRingStop = 1;
else begin
/* заполняем значение */
if (DebitPrivate > 0) then DebitAccount = CurrentDebitAccount;
/* двигаемся к следующему счету */
select * from GetNextAccount(:CurrentDebitAccount) into :CurrentDebitAccount;
end
end
/* вычисляем общую сумму */
DebitPublic = null;
select * from GetMove('01.01.'||TheYear,:BeginDate-1,:Account,:DebitAccount)
into :DebitPublic;
if ((DebitPublic > 0) and (DebitPrivate > 0)) then DebitPublic = DebitPublic + DebitPrivate;
/* аналогично для кредита */
suspend;
end
CurrentMonth = CurrentMonth + 1;
end
end
...
Рейтинг: 0 / 0
Модификация метеденных
    #32350762
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kata, методология мне ясна, она отличается от моей только тем, что у тебя в одном наборе данных, а у меня в двух физических таблицах.
Реализацию анализировать буду только в выходные. Я распечатал твоё предложение.
...
Рейтинг: 0 / 0
Модификация метеденных
    #32350856
kata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вся фишка в том, что в одной таблице данные по дебету и по кредиту обязательно должны чередоваться. Тогда не надо их никуда скидывать.
Поправка
Рекурсия не обязательна. Можно двигаться в прямом направлении. Главный цикл по счетам, внутренний по периодам.
В примере - вычисление общей суммы засунуть глубже.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Модификация метеденных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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