Подцепка или фильтр

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

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

Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: Подцепка или фильтр

Сообщение Ged »

galover писал(а): IsValid (если view без имени) и IsValidAll (если вьюха именованная)

Код: Выделить всё

Create view vS1
As Select
 *
From
  Lschet
, Persons
Where
((
     'У' == Persons.isEmployee
And  Persons.Nrec == Lschet.TPerson
))
;

HandleEvent
  cmInit:
  {
    vS1._loop Persons
     if(IsValid(#vS1.Lschet)) // Работает без проблем
      LogStrToFile('1111.txt',vS1.Persons.StrTabn)

  }
end;        
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Подцепка или фильтр

Сообщение Den »

Isvalid и isvalidall это разные методы (первый- метод интерфейса, второй - метод логической таблицы).
Работают они тоже по разному. Как то помню сталкивался с тем, что там где Isvalid = false, isvalidall = true
Но толком все равно не догнал почему так было )
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: Подцепка или фильтр

Сообщение galover »

Надо писать - "работает на данном примере". Были случаи, когда такое не прокатывало (скорей всего когда имел кучу именованных view с повторяющимися в них таблицами) и нужно писать viewName.IsVAlidAll(viewName.tnTableName);
Вот такой вариант уже прокатывал железобетонно. Стандарта на vip (как например на С++) нет. Так что тут программирование сродни методу проб и ошибок, поскольку сам компилятор довольно глючный. Например, еще год назад конструкция прединкремента (++var) давала неправильный результат в цикле _loop, или компилятор анализировал комментарии(!, нафига?) и валился с RunTime error если встречал там макроопределение. И таких тонкостей вагон и маленькая тележка
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Подцепка или фильтр

Сообщение n0where »

Надо писать - "работает на данном примере". Были случаи, когда такое не прокатывало (скорей всего когда имел кучу именованных view с повторяющимися в них таблицами) и нужно писать viewName.IsVAlidAll(viewName.tnTableName);
Что значит именованных?
Нашел в инструкции такое, но не нашёл примера с разными as <описание-выборки>
Оператор описания логической таблицы используется для создания и сохранения определения логической таблицы.

Описание логической таблицы начинается ключевыми словами create view (слово create можно опустить) и оканчивается точкой с запятой:

<логическая-таблица> = [ create ] view
[ <имя-логической-таблицы> ] [ <описание-переменных> ]
[ <описание-массивов> ] [ <поля-логической-таблицы> ]
as <описание-выборки>
;
Как я понимаю вместо

Код: Выделить всё

Create view vS1 As Select
*
From
  Lschet
, Persons
Where
((
     'У' == Persons.isEmployee
And  Persons.Nrec == Lschet.TPerson
))
;
Можно как то написать типа

Код: Выделить всё

Create view As Select
*
From
  Lschet
, Persons
Where
((
     'У' == Persons.isEmployee
And  Persons.Nrec == Lschet.TPerson
));
AS vS1
Т. е. полностью запрос.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: Подцепка или фильтр

Сообщение Ged »

Код: Выделить всё

// [ create ] view [ <имя-логической-таблицы> ] 
Create view  vS1 
//[ <описание-переменных> ] [ <описание-массивов> ] [ <поля-логической-таблицы> ]
Var do1: Double;
     Arr: Array[1..10] of string;
//as <описание-выборки>
As Select
*
From
  Lschet
, Persons
Where
((
     'У' == Persons.isEmployee
And  Persons.Nrec == Lschet.TPerson
));
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: Подцепка или фильтр

Сообщение Ged »

n0where писал(а):Что значит именованных?
Дополнительно...
Если пишем фейс и в нем создаем одну выборку (create view), то к элементам данной выборки можно обращаться без указания имени view -> As ИмяView.

А если в фейсе/форме несколько View, то для первой которая описана - имя не обязательно указывать(вроде она носит имя фейса... не проверял ), а вот след. должны иметь имя.

Код: Выделить всё

Interface test;
Create view As Select * From KatOrg;
Create view vMc As Select * From KatMc; // <<= Именнованная
Create view vUsl As Select * From KatUsl; // <<= Именнованная
.....
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: Подцепка или фильтр

Сообщение Screw »

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

IsValid хорош, когда данные для узла уже доставлены клиенту. Если анализируемый узел подцеплен к вышестоящему по уникальному ключу, то упомянутые данные доставляются запросом для вышестоящего узла. Например, в нижеследующей ЛТ данные для PERSONS будут получены при обращении к LSCHET, и использование IsValid(#PERSONS) обоснованно.

Код: Выделить всё

create view from LSCHET, PERSONS where ((LSCHET.TPERSON == PERSONS.NREC));
...
_loop LSCHET
  if IsValid(#PERSONS)...
Когда анализируемый узел подцеплен к вышестоящему по неуникальному ключу (например, спецификация документа), без дополнительного запроса к базе после навигации по вышестоящему узлу не обойтись. Использование IsValid к генерации такого запроса не приводит. Обращение к полю узла - должно, если не ошибаюсь. Поле этого на результат IsValid уже можно полагаться.
Виталий
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Подцепка или фильтр

Сообщение Алексей »

Напишу сюда, дабы не создавать лишних тем.
Возникла ситуация следующего характера.
Есть пять таблиц. подцеплены следующим образом

Код: Выделить всё

table1.nrec == table2.ctable1
table2.nrec == table3.ctable2
table3.nrec /== table4.ctable3
table4.nrec /== table5.ctable4
4-я и 5-я таблицы подцеплены жёстко. НО если так сделать, то при цикле по table1 при отсутствии записей в 4-й и 5-й таблицах пропускает запись в table1.

если table3.nrec /== table4.ctable3 убрать жесткую подцепку - то запись с table1 в цикл попадает.

я думал что жесткая подцепка будет рубить записи только по третьей таблице, и не влиять на записи таблиц 1 и 2.

вопрос: это так надо и я чего то недопонял, или глючит атлантис?
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Подцепка или фильтр

Сообщение n0where »

table3.nrec /== table4.ctable3
Аналог
INNER JOIN
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Подцепка или фильтр

Сообщение Den »

Алексей писал(а): вопрос: это так надо и я чего то недопонял, или глючит атлантис?
угу...Так и должно быть...так будет и в TSQL и в PL SQL . Аналогично это получается и Атлантис-SQL
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Подцепка или фильтр

Сообщение Алексей »

тогда почему не отсекается запись в table1 если оставить так
table3.nrec == table4.ctable3
table4.nrec /== table5.ctable4 ?
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Подцепка или фильтр

Сообщение Den »

Может, потому что есть хоть одна запись на узле table4 от table1...там же наверняка у Вас от table1 к table2 и т.д. связи 1:N
А так
table3.nrec /== table4.ctable3
table4.nrec /== table5.ctable4

обязывает быть и на узле table4 и table5
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Подцепка или фильтр

Сообщение Алексей »

записи в таблице table4 есть, но вот записи в table5 отсекаются условием и по жесткой подцепке отсекается запись из таблицы 4.

короче понятно, что ничего непонятно. :-( т.к. в одних интерфейсах такая схема работает как мне надо, а в других почему то режет снизу до верхнего уровня записи.

я думал что если подцепка жесткая... то данные т1 т2 т3 покажутся а т4 т5 будут пустыми... но т1 всё равно выведется. т.к. т1 к т2 ведь не жёстко подцеплена! иногда проще отказываться от этих подцепок и логикой внутри цикла фильтровать записи.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Подцепка или фильтр

Сообщение edward_K »

жесткая то и значит, что родительская отбирается только при наличии записей в дочерней. Аналогично функции isvalidall - почитайте в vipprogr.chm
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Подцепка или фильтр

Сообщение Алексей »

родительская, независимо сколько уровней выше?
vipprog
При жесткой подцепке записи родительской таблицы, для которых не были найдены записи в таблицах-потомках, в выборку не попадают.
я понимаю так что если table4.nrec /== table5.ctable4 подцепка жесткая, то пусть записи из table4 и не попадают в выборку. но почему режутся записи записи выше по логической таблице вплоть до корневой? корневая ведь не жестко подцеплена.
если бы я хотел резать корневую, я бы всю логическую на жестких подцепках сделал.
Ответить