|
|
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Временные таблици. Их нет, а они нужны . Насколько стабильно будет работать 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... А нету... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 11:12 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Я не совсем понял ... Для каких целей нужны временные таблицы? Между прочем есть совершенно иные методы работы ... могу рассказать ... Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 11:27 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Да... Нет а хотелось бы конечно.. А так курсоров нема, viewы почти не работают ... Ща будем писать и надеятся что не будут так виснуть ХП... :| ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 11:37 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Господа .... FOR SELECT ... это почти тоже самое что и курсор или временная таблица. авторЩа будем писать и надеятся что не будут так виснуть ХП... :| Если зависнет - поставим памятник !!!! Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 11:42 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Для каких целей. Вообще-то я спросил уже от того что устал доказывать рядомсидящим программистам, что временные таблици ненужны и вполне можно обойтись транзакцией snapshot и несколькоми запорсами. Просто чуствую что сил на споры с ними у меня неосталось и подготавливаю пути для отступления... Они пишут выходные формы на FastReport-е, десятки однотипных выходных форм, и еще очень нелюбят запросы на объединения Если нужно получить значения из двух таблиц я пишу нечто типа: Код: plaintext 1. 2. 3. 4. Они: Код: plaintext 1. 2. У меня просто закончилось терпение повторять одно и тоже, а в приказном порядке я тоже немогу действовать... Ну представь себе как это выглядело бы состороны: "20-тилетний сопляк (это я :)) учит программистов с 25-30 летним стажем как программы писать". Короче вы мне скажите будет оно нормально работать или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 12:06 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Ну конечно будет. И то и другое. Хотя первое решение наиболее удобнее. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 12:52 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Я вообще-то спрашивал про "частое create/drop table без постоянных backup/restore", а не про те запросы :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 13:19 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Про создание/удаление таблиц могу сказать одно : База будет разрастаться на глазах ... Еще раз повторяю - самое лучшее и правлиьное решение : Использовать ХП. Best regards, Dnico. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 13:26 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
>Andrey_ Позволю себе несколько замечаний к уже высказанным: 1. Нет такой ситуации, когда невозможно обойтись без временной таблицы. 2. В общем случае выполнение одного запроса всегда быстрее нескольких. При этом логика проще и понятней. 3. Твои "программисты" чего-то не догоняют...:) Если они действительно предлагают, как ты написал, то лично я сильно сомневаюсь в их квалификации... PS Интересны их аргументы за вр.тбл. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 14:31 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Просто так пишут все, кто пришел с Фокса :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 15:11 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
>Johnmen 1. Хм... ну например когда одни и теже данные должны быть видны в контексте нескольких транзакций. Возможно даже непересекающихся по времени. При этом исходные данные постоянно обновляются. Но в моем случае действительно всегда можно обойтись запросами в контексте одной транзакции. Правда прийдется в FastReport 2. Бесспорно. 3. Эти господа писали на FoxPro с момента его пявления. Отсюда и аргументация "У меня так было и оно работало, а главное все просто и понятно" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 15:17 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Johnmen1. Нет такой ситуации, когда невозможно обойтись без временной таблицы. Вообще-то есть, но КРАЙНЕ редко. С 1998 года я создал несколько достаточно сложных БД. И только один единственный раз не смог обойтись ХП - действительно требовались две временных таблицы. Жутко выпендрёжный отчёт понадобился заказчику. Я создал две обычных таблицы. Во время выполнения ХП сбрасывал туда результаты и затем объединив их в однин набор данных отправлял клиенту. Затем чистил таблицы. Чистил, а не удалял. Поэтому не было никакой надобности менять метаданные во время каждого такого отчёта. Частота надобности в этом отчёте была 1 или 2 раза в месяц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 15:26 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
>Zmeishe Ну не могу я даже приблизительно представить ситуации, когда без вр.табл. никак и никуда...:) А то, что просто чистить, это верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:00 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Старый - престарый способ: 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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:10 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
на www.interbase-world.com есть статья как можно имитировать временные таблиц дропать таблицу и создавать занова - это evil - начнут непропорционально разрастаться системные таблицы и очень скоро без backup/restore все начнет жутко тормозить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:17 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
И вообще, где-то я читал (один злобный Фокспрошник показывал, что ли?), что число модификаций метаданных в InterBase ограничено счетчиком с очень небольшим число значений, который сбрасывается только при Backup/Restore. Из этого было сделан вывод, что FoxPro - forever. Тем не менее, будте осторожны, меняйте методику работу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:41 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Ну прально вы читали - 255 изменений кажись, а потом переполнение счётчика. В общем временные таблицы - это зло для IB/FB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:46 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Интересно, а почему так было сделано? С т.зр. всемирно-исторической? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:48 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
>mv & Gold Правильно все вы читали: http://ibase.ru/devinfo/ibfaq.htm#1.62 и http://ibase.ru/devinfo/metaver.htm Только там написано "255 на одну таблицу", а не на всю БД. Вы господа меня убедили, буду с новыми сила со злобными фоксовскими привычками боротся :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:51 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
И индексы здесь пятнадцать раз при формировании отчета не построишь, до не просто по всяким-разным полям, а по функциям типа "как моя левая нога захочет", и индексы Ascending при сортировке Descending не работают (надо создавать еще раз, но Descend). В общем, это не FoxPro... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 12:55 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
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 не даст верного (по деньгам) и желаемого по внешнему виду (т.е. по красоте) результату. Если у Вас возникли дополнительные (уточняющие вопросы) спрашивайте. Я давно хочу избавиться от этих двух таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 14:31 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Я забыл образец оформить так, чтобы лучше было Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 14:40 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Я эти ужасные таблицы формирую в вариантных динамических массивах, а потом бросаю в Excell, и сшивать не надо, и пусть бухгалтера сами думают, как все это распечатать. Естествено, за несколько проходов: - сначала формирую формирую загловки (горизонтальные и вертикальные), а затем - пробегаюсь еще раз - заплняю данными. Excel - очень классно. На любой принтер годится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 14:51 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Я это рапечатываю в QuickReport несколько страничек (обычно 3-5) формата A4. Формируется всё на сервере. И бухгалтера заняты анализом эффективности работы предприятия, а не проблемой распечатывания. Я стараюсь не напрягать клиентов тем, что можно сделать программно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 14:56 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Возьмите MSSQL, там все это есть (в смысле - временные таблицы), раз уж Вас с пути не свернуть. И на фига Вам эти SQL - серверы? Вам же предложили варианты решения с временными таблицами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 15:03 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Не совсем понял, что означают в вашем отчете "Сумма частная" и "Сумма общая". Если речь идет о следующем: -необходимо знать входящий остаток по счету, дебетовый оборот по счету за период, кредитовый оборот по счету за период, исходящий остаток по счету; -счета с пустыми значениями по всем четырем позициям не должны присутствовать в отчете, тогда попробуйте приспособить под свои нужды примерно следующий план. Главная процедура проходит по всем счетам. Которые не будут участвовать в этом отчете - пропускаются 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 К вопросу о птичках. На мысль о неизбежности использования временных таблиц наводят размышления, исходящие из того, "Что мы имеем". Попробуйте исходить из того, "Что надо получить". Надо получить сортировку по счетам - главный цикл должен идти по таблице счетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2003, 20:25 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
На входе в отчёт период и код какого-то одного счёта, по которому нужно получить результат. С периодом - хитрость. Какой бы период не задал пользователь - начало периода перед расчётом надо сбросить в начало года, а пользователю показать сведения за им желаемый период. Первая половинка - в отчёт собираются из журнала операций все обороты по всем счетам по дебету, когда указанный счёт в кредите. Затем вторая половинка - собираются все обороты по всем счетам по кредиту, когда указанный счёт в дебете. Каждая половинка сортируется по месяцам и по номеру счёта. Выясняется количество строк по месяцам в каждой половинке и недостающие заполняются пустыми строками. (Можно и не заполнять математически, но в отчёте должно выглядеть именно так) Сумма частная - это сумма(оборот) за конкретный месяц. Сумма общая - это оборот с начала года. Поэтому в январе по всем счетам частная сумма это оборот по счёту за январь, а общие у всех счетов нули. В феврале у тех счетов, которые встречались в январе - частная сумма будет оборотом за февраль, а общая сумма - оборот за январь плюс оборот за февраль т.е. плюс частная. Те счета, по которым движение началось только в феврале будут иметь только частную сумму, а общая ноль. Если движение по счетам в феврале было, а затем прекратилось, они всё равно должны попасть в отчёт, но все последующие месяцы частная сумма у них будет ноль, а общая постоянная - та которая была последней. Пример чисто условно (без привязки к налоговому кодексу) Журнал 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. Остатки меня не интересуют - они прекрасно вычисляются безо всяких временных таблиц. Обороты тоже вычисляются без временных таблиц, для всех других отчётов, кроме этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2003, 08:43 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
>Zmeishe О-о-о ! До боли знакомые вещи ! Делал когда-то. И журналы и оборотно-сальдовые были...:) Тогда я это решал с использованием виртуальной таблицы в памяти. Сейчас я бы это сделал по-другому... Исходя из следующих соображений: 1. Джойнить таблицу можно и саму с собой 2. Использование конструкции SELECT A, (SELECT ...), (SELECT ...) FROM ... Еще не совсем понятно: 1. Зачем выводить по какому-то счету, если движения не было ? 2. Каков критерий, что по этому выводим, а по этому - нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2003, 12:58 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
>> 1. Зачем выводить по какому-то счету, если движения не было ? ГОСТ >> 2. Каков критерий, что по этому выводим, а по этому - нет ? Выводим все, которые с заданным счётом корреспондируют либо по дебету либо по кредиту с самого начала года. Остальные счета не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2003, 13:50 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Попробуем разработать однопроходную процедуру. Для того чтобы получить данные в виде: Период, Счет Дебета, Сумма частная, Сумма общая, Счет кредита, Сумма частная, Сумма общая, мы создадим промежуточную процедуру. Она выдает данные в следующем виде: Период, Статус(Дебет или Кредит), Счет, Сумма частная, Сумма общая. Например Апрель, Дебет, 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2003, 13:57 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Kata, методология мне ясна, она отличается от моей только тем, что у тебя в одном наборе данных, а у меня в двух физических таблицах. Реализацию анализировать буду только в выходные. Я распечатал твоё предложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2003, 14:25 |
|
||
|
Модификация метеденных
|
|||
|---|---|---|---|
|
#18+
Вся фишка в том, что в одной таблице данные по дебету и по кредиту обязательно должны чередоваться. Тогда не надо их никуда скидывать. Поправка Рекурсия не обязательна. Можно двигаться в прямом направлении. Главный цикл по счетам, внутренний по периодам. В примере - вычисление общей суммы засунуть глубже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2003, 15:24 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1579522]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 458ms |

| 0 / 0 |
