Страница 1 из 2

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

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

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

P.S. Просто по ходу работы программы цикл по всем контрагентам и для каждого контрагента свое значение "моя дата" высчитывается и через логическую таблицу будет долго.

Добавлено: 09 дек 2005, 22:40
Optimist
Или на крайняк скажите как отсортироовать по убыванию логическую таблицу или начинать проход в обратном порядке.

Почему-то на ORDER bY <поле> DESC выдает ошибку при компиляции.

Добавлено: 09 дек 2005, 23:45
Optimist
Со вторым вопросом разобрался, доки читал невнимательно.
ORDER BY <поле> (DESC)

Добавлено: 10 дек 2005, 00:53
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'а, но присвоение не работает. Как-будто с маркером что-то.

Если убрать описание второй логической таблицы, то все ОК, все работает. Мысли будут?

Добавлено: 11 дек 2005, 20:10
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
    );
Что может быть с индексом, почему эта ошибка? :-?

Добавлено: 12 дек 2005, 06:52
san
мысли в слух :)

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


обычно такое бывает когда сам файл базы не соответсвует словарю
запустите "проверку таблиц БД" в модуле настройка.
Вариант в сапорте один словарь, в галке другой.

Добавлено: 12 дек 2005, 17:11
Optimist
san, а что делать... :grin:
edward_k, проверил. "Все таблицы корректны" - вот что мне написала галка. В саппорте и галактике один и тот же словарь, т.к. настроены на один и тот же путь.

Добавлено: 12 дек 2005, 17:20
hope
Можно вместо GetFirst написать GetLast
и вместо GetNext использовать GetPrev

Добавлено: 12 дек 2005, 17:28
coolibin
Optimist, у тебя две вьюхи
Модификаторы _всегда_ нужно указывать через имя вьюхи

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

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

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

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


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

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

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

Запихнуть во вьюху физ. таблицу будет геморно, с учетом NxN...

Добавлено: 12 дек 2005, 17:56
coolibin
нет ни в интерфейсах ни в формах никаких "физических" таблиц.
все таблицы - суть узлы логической.
не рекомендую шутить с атлантисом - там глюков цельный мешок. пиши все по правилам и сэкономишь кучу времени.

а насчет индекса - я еще раз повторяюсь - таблица твоя - кто тебе мешает сделать индекс сразу по обеим датам, и не надо никаких "order by" и иже с ним.
order by - это как-раз большая часть того мешка, в том смысле что не всегда он делает то, что от него ждешь

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

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

Добавлено: 12 дек 2005, 18:22
coolibin
Из хелпа по Атлантису:
Цитата:

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

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


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

Ну так о том и речь, что обращение к таблицам "вне логической таблицы" - суть создание еще одной логической таблицы

Добавлено: 12 дек 2005, 18:47
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," ?
Но это всеравно не решит проблемы "нет индекса", но попробую с радостью - делать нечего...