Страница 2 из 3
Re: Подцепка или фильтр
Добавлено: 18 фев 2011, 11:58
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;
Re: Подцепка или фильтр
Добавлено: 18 фев 2011, 12:27
Den
Isvalid и isvalidall это разные методы (первый- метод интерфейса, второй - метод логической таблицы).
Работают они тоже по разному. Как то помню сталкивался с тем, что там где Isvalid = false, isvalidall = true
Но толком все равно не догнал почему так было )
Re: Подцепка или фильтр
Добавлено: 18 фев 2011, 12:31
galover
Надо писать - "работает на данном примере". Были случаи, когда такое не прокатывало (скорей всего когда имел кучу именованных view с повторяющимися в них таблицами) и нужно писать viewName.IsVAlidAll(viewName.tnTableName);
Вот такой вариант уже прокатывал железобетонно. Стандарта на vip (как например на С++) нет. Так что тут программирование сродни методу проб и ошибок, поскольку сам компилятор довольно глючный. Например, еще год назад конструкция прединкремента (++var) давала неправильный результат в цикле _loop, или компилятор анализировал комментарии(!, нафига?) и валился с RunTime error если встречал там макроопределение. И таких тонкостей вагон и маленькая тележка
Re: Подцепка или фильтр
Добавлено: 21 фев 2011, 08:28
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
Т. е. полностью запрос.
Re: Подцепка или фильтр
Добавлено: 21 фев 2011, 11:56
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
));
Re: Подцепка или фильтр
Добавлено: 03 мар 2011, 05:29
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; // <<= Именнованная
.....
Re: Подцепка или фильтр
Добавлено: 05 мар 2011, 23:01
Screw
Ged абсолютно прав.
А что до выбора "фильтр" или "подцепка", то имейте в виду: чтобы отработал фильтр, нужно сначала закачать данный из БД на клиента, а подцепка, наоборот, отправляется на сервер с тем, чтобы тот прислал клиенту уже усеченное множество записей. Поэтому используйте подцепки везде, где только это возможно. Выгоднее бывает получить данные пятью отдельными запросами с подцепками, чем одним, но с фильтрами.
IsValid хорош, когда данные для узла уже доставлены клиенту. Если анализируемый узел подцеплен к вышестоящему по уникальному ключу, то упомянутые данные доставляются запросом для вышестоящего узла. Например, в нижеследующей ЛТ данные для PERSONS будут получены при обращении к LSCHET, и использование IsValid(#PERSONS) обоснованно.
Код: Выделить всё
create view from LSCHET, PERSONS where ((LSCHET.TPERSON == PERSONS.NREC));
...
_loop LSCHET
if IsValid(#PERSONS)...
Когда анализируемый узел подцеплен к вышестоящему по неуникальному ключу (например, спецификация документа), без дополнительного запроса к базе после навигации по вышестоящему узлу не обойтись. Использование IsValid к генерации такого запроса не приводит. Обращение к полю узла - должно, если не ошибаюсь. Поле этого на результат IsValid уже можно полагаться.
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 08:03
Алексей
Напишу сюда, дабы не создавать лишних тем.
Возникла ситуация следующего характера.
Есть пять таблиц. подцеплены следующим образом
Код: Выделить всё
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.
вопрос: это так надо и я чего то недопонял, или глючит атлантис?
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 11:19
n0where
table3.nrec /== table4.ctable3
Аналог
INNER JOIN
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 11:23
Den
Алексей писал(а):
вопрос: это так надо и я чего то недопонял, или глючит атлантис?
угу...Так и должно быть...так будет и в TSQL и в PL SQL . Аналогично это получается и Атлантис-SQL
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 12:31
Алексей
тогда почему не отсекается запись в table1 если оставить так
table3.nrec == table4.ctable3
table4.nrec /== table5.ctable4 ?
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 12:55
Den
Может, потому что есть хоть одна запись на узле table4 от table1...там же наверняка у Вас от table1 к table2 и т.д. связи 1:N
А так
table3.nrec /== table4.ctable3
table4.nrec /== table5.ctable4
обязывает быть и на узле table4 и table5
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 13:13
Алексей
записи в таблице table4 есть, но вот записи в table5 отсекаются условием и по жесткой подцепке отсекается запись из таблицы 4.
короче понятно, что ничего непонятно.
т.к. в одних интерфейсах такая схема работает как мне надо, а в других почему то режет снизу до верхнего уровня записи.
я думал что если подцепка жесткая... то данные т1 т2 т3 покажутся а т4 т5 будут пустыми... но т1 всё равно выведется. т.к. т1 к т2 ведь не жёстко подцеплена! иногда проще отказываться от этих подцепок и логикой внутри цикла фильтровать записи.
Re: Подцепка или фильтр
Добавлено: 06 фев 2013, 21:17
edward_K
жесткая то и значит, что родительская отбирается только при наличии записей в дочерней. Аналогично функции isvalidall - почитайте в vipprogr.chm
Re: Подцепка или фильтр
Добавлено: 07 фев 2013, 06:07
Алексей
родительская, независимо сколько уровней выше?
vipprog
При жесткой подцепке записи родительской таблицы, для которых не были найдены записи в таблицах-потомках, в выборку не попадают.
я понимаю так что если table4.nrec /== table5.ctable4 подцепка жесткая, то пусть записи из table4 и не попадают в выборку. но почему режутся записи записи выше по логической таблице вплоть до корневой? корневая ведь не жестко подцеплена.
если бы я хотел резать корневую, я бы всю логическую на жестких подцепках сделал.