Как реализовать выборку без лог. таблицы

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Как реализовать выборку без лог. таблицы

Сообщение Optimist »

Привет!
Есть физическая таблица и в ней в каждой записи есть поле "Дата1" и поле "Дата2". Во время выполнения программы я узнаю значение даты, которое ограничивыет поле "Дату1". И мне нужно последовательно получить несколько записей, которые будут удовлетворять условию "Дата1" < "моя дата", а также чтоб из этих выбралась сначала запись с самой большой "Дата2", потом следующая по убыванию "Дата2" и т.д.

Через GetFirst, GetNext такое вообще возможно организовать или только создавать логическую таблицу ограничивая по полу "Дата1" и сортируя по полю "Дата2"?

P.S. Просто по ходу работы программы цикл по всем контрагентам и для каждого контрагента свое значение "моя дата" высчитывается и через логическую таблицу будет долго.
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

Или на крайняк скажите как отсортироовать по убыванию логическую таблицу или начинать проход в обратном порядке.

Почему-то на ORDER bY <поле> DESC выдает ошибку при компиляции.
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

Со вторым вопросом разобрался, доки читал невнимательно.
ORDER BY <поле> (DESC)
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

Вообще крышняк едет...
Добавил еще одну логическую таблицу в АРД-отчет и у меня перестал работать GetFirst и иже с ним. Вот две таблицы, добавил нижнюю.

.CREATE VIEW Org
AS SELECT korg.nrec,korg.name
FROM pick,synonym katorg korg
WHERE ((korg.nrec /== pick.crec
AND 6 == pick.wlist))
ORDER BY korg.name;
!-------------------------------------------------------------------------
.CREATE VIEW dbt
AS SELECT *
FROM synonym opt_dbt o_dbt
WHERE o_dbt.date_change <= EndDate
AND o_dbt.direct = 1
ORDER BY o_dbt.date_dolg (DESC);


Пример использования GetFirst:

While GetFirst kontras where ((SaldoDate == kontras.dkonsal and kontras.corg == korg.nrec)) <> tsOK Do begin
SaldoDate:= Add_Day(SaldoDate, -1); end;

If GetFirst kontras where ((SaldoDate == kontras.dkonsal and kontras.corg == korg.nrec)) = tsOK then SaldoSum:= kontras.SumRub;

While нормально прорабатывает и выходит из цикла тогда, когда есть запись в таблице kontras - могу судить по дате SaldoDate. И второе условие тоже работает, т.е. я попадаю "внутрь" IF'а, но присвоение не работает. Как-будто с маркером что-то.

Если убрать описание второй логической таблицы, то все ОК, все работает. Мысли будут?
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

Попробовал вот так:

_loop opt_dbt ordered by opt_dbt.date_dolg(desc)
{
...................
}

Откомпилировалось без ошибок, но при выполнении выпадает ошибка

Нет индекса для opt_dbt.dat
Нет фильтров.
Порядок:
1.DATE_DOLG, 232, В таблице Opt_Dbt


И просто не выполняет этот _loop, но программа не прерывается.

Но я ведь создавал эту таблицу с индексом...
  • Create Table D_MyTabl.opt_Dbt "ДЕБЕТ"
    Using "opt_Dbt.dat"
    With Table_Code = 31970
    With Replace
    (
    nrec: comp,
    cOrg: comp "Ссылка на KatOrg",
    OrgName: string[150] "Наименование контрагента",
    Date_Change: date "Дата изменения (покупки или продажи)",
    Sum_Dolg: double "Сумма задолженности",
    Sum_Change: double "Сумма изменения долга",
    NoDoc: string[20] "Номер документа (источник)",
    Direct: word "1-закупка(долг растет), 2-оплата",
    Flag_Dolg: word "0-не должен, 1-должен, 2-должен > 1000",
    Days: word "Дней отсрочки (при закупке)",
    Date_Dolg: date "Дата возникновения задолженности",
    Rez_1: double "резерв",
    cRez: comp "ссылка на дополнительную таблицу"
    )
    WITH INDEX
    (
    opt_dbt_1=nrec(Unique, Surrogate, Journal),
    opt_dtb_2=cOrg,
    opt_dbt_3=Date_Change,
    opt_dbt_4=Flag_Dolg,
    opt_dbt_5=Date_Dolg,
    opt_dbt_6=cRez
    );
Что может быть с индексом, почему эта ошибка? :-?
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

мысли в слух :)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Нет индекса для opt_dbt.dat
Нет фильтров.
Порядок:
1.DATE_DOLG, 232, В таблице Opt_Dbt


обычно такое бывает когда сам файл базы не соответсвует словарю
запустите "проверку таблиц БД" в модуле настройка.
Вариант в сапорте один словарь, в галке другой.
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

san, а что делать... :grin:
edward_k, проверил. "Все таблицы корректны" - вот что мне написала галка. В саппорте и галактике один и тот же словарь, т.к. настроены на один и тот же путь.
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

Можно вместо GetFirst написать GetLast
и вместо GetNext использовать GetPrev
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Optimist, у тебя две вьюхи
Модификаторы _всегда_ нужно указывать через имя вьюхи

вьюха._loop таблица
{
}

вьюха.Getfirst таблица where...

и все будет путем

и индекс, походу нужен по обеим датам


date_change + date_dolg
и станет все намного проще

и еще - не рекомендую использовать знак подчеркивания в именах таблиц и полей, можно нарваться на грабли. Раньше по крайней мере, знак подчеркивания означал то же самое, что точка в разделителе таблица-поле.
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

hope, угу, шутку оценил.
coolibin, тут такое дело, что в 4-м своем сообщении про 2 вьюхи, GetFirst делался по физической таблице, которая во вьюху не входит.
Соответственно и _loop я тоже делал по физической таблице, которая во вьюху не входит. Он работает, если не писать "ordered", но мне нужны отсортированные по убыванию по дате записи.

Запихнуть во вьюху физ. таблицу будет геморно, с учетом NxN...
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

нет ни в интерфейсах ни в формах никаких "физических" таблиц.
все таблицы - суть узлы логической.
не рекомендую шутить с атлантисом - там глюков цельный мешок. пиши все по правилам и сэкономишь кучу времени.

а насчет индекса - я еще раз повторяюсь - таблица твоя - кто тебе мешает сделать индекс сразу по обеим датам, и не надо никаких "order by" и иже с ним.
order by - это как-раз большая часть того мешка, в том смысле что не всегда он делает то, что от него ждешь
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение WiRuc »

coolibin писал(а):нет ни в интерфейсах ни в формах никаких "физических" таблиц.
все таблицы - суть узлы логической.
Из хелпа по Атлантису:
Оператор выборки предназначен для извлечения данных из физических таблиц БД.

Если оператор выборки не является частью оператора create view (см. 'Описание логических таблиц (View). '), то при его выполнении создается временная логическая таблица. Если Вы хотите сохранить выборку в ресурсе для последующего использования, то ее нужно включить в оператор создания логической таблицы create view.
Т.е. обращение к таблицам вне логической вполне допустимо.
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Из хелпа по Атлантису:
Цитата:

Оператор выборки предназначен для извлечения данных из физических таблиц БД.

Если оператор выборки не является частью оператора create view (см. 'Описание логических таблиц (View). '), то при его выполнении создается временная логическая таблица. Если Вы хотите сохранить выборку в ресурсе для последующего использования, то ее нужно включить в оператор создания логической таблицы create view.


Т.е. обращение к таблицам вне логической вполне допустимо.

Ну так о том и речь, что обращение к таблицам "вне логической таблицы" - суть создание еще одной логической таблицы
Optimist
Постоянный обитатель
Сообщения: 104
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Moscow
Контактная информация:

Сообщение Optimist »

coolibin, если я пишу не "order by", а "from opt_dbt (opt_dbt_5)", то мне вываливается такая же ошибка Нет индекса для opt_dbt.dat (opt_dbt_5 - это название индекса для поля date_dolg).

Если при обращении к физической создается логическая, то тогда все понятно - в АРД больше 2-х вьюх у меня никогда не работало. :(

Тогда остается проблема только с этим индексом - что нужно сделать чтобы он заработал?

Create Table D_MyTabl.opt_Dbt "ДЕБЕТ"
Using "opt_Dbt.dat"
With Table_Code = 31970
With Replace
(
nrec: comp,
cOrg: comp "Ссылка на KatOrg",
OrgName: string[150] "Наименование контрагента",
Date_Change: date "Дата изменения (покупки или продажи)",
Sum_Dolg: double "Сумма задолженности",
Sum_Change: double "Сумма изменения долга",
NoDoc: string[20] "Номер документа (источник)",
Direct: word "1-закупка(долг растет), 2-оплата",
Flag_Dolg: word "0-не должен, 1-должен, 2-должен > 1000",
Days: word "Дней отсрочки (при закупке)",
Date_Dolg: date "Дата возникновения задолженности",
Rez_1: double "резерв",
cRez: comp "ссылка на дополнительную таблицу"
)
WITH INDEX
(
opt_dbt_1=nrec(Unique, Surrogate, Journal),
opt_dtb_2=cOrg,
opt_dbt_3=Date_Change,
opt_dbt_4=Flag_Dolg,
opt_dbt_5=Date_Dolg,
opt_dbt_6=cRez
);


Добавить нужно "opt_dbt_77=date_change+date_dolg," ?
Но это всеравно не решит проблемы "нет индекса", но попробую с радостью - делать нечего...
Ответить