Внешние Атрибуты

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

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

Ответить
korvanakorvana
Местный житель
Сообщения: 429
Зарегистрирован: 24 сен 2008, 11:53

Внешние Атрибуты

Сообщение korvanakorvana »

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

interface korvana_protokol ;

create view protokol

as select * 
from
katmc
,attrnam
,attrval    
where 
((
word(1411)==attrnam.wtable 
and 'Код для протокола'==attrnam.name
and word(1411)==attrval.wtable 
and katmc.nrec==attrval.crec
and attrnam.nrec==attrval.cattrnam
))
//Order by katmc.name
;
screen params 
show at(,,,3);
buttons 
cmOK, default;
cmCancel;
<<       
 <.Формировать.>  <.  Закрыть  .>
>>
end;

Handleevent
 
cminit:
{

}
//ok-start

////////////////////////////////////////
cmOk:
{
var filename:string;
var kol:longint;

kol:=1;


//sozdaem fail

filename:=GetStringParameter('Files','OutputFilesDirectory',0)+'КОДДЛЯПРОТОКОЛА'+DatetoStr(cur_Date,'DDMMYYYY')+'.xls';
xlCreateExcel(filename,true);
StartNewVisual(vtRotateVisual, vfTimer+vfBreak+vfConfirm,'ЗАПОЛНЯЮ ТАБЛИЦУ ОЖИДАЙТЕ ...', RecordsInTable(#katmc));
_loop katmc
{

xlSetCellStringValue(katmc.name,kol,1,kol,1);
xlSetCellStringValue(KATMC.BARKOD,kol,3,kol,3);


if(attrval.vdouble<>1 or attrval.vdouble<>2 or attrval.vdouble<>3 or attrval.vdouble<>11 or attrval.vdouble<>12 or attrval.vdouble<>13) then
   xlSetCellStringValue('отстутствует',kol,2,kol,2);
else
    xlSetCellStringValue(attrval.vdouble,kol,2,kol,2);
kol:=kol+1;
}
StopVisual('Ну вот и все ',0);
xlSetColumnWidth(30,1,1,kol+1,2);//устанавливаем ширину колонок
xlKillExcel;

}

cmDefault : 
{ 
CloseInterface ( cmDefault );
};

end;

end.

Опять наверно не по глазам мелочи) , Может выборку не верно написала(, Значение attrval.vdouble в выходной форме не соответствует действительности(
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

сделайте

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

browse b1
table katmc
fields
   katmc.name;
   attrval.vdouble;
end;
увидите реальные поля.
вполне возможно, что стоит сделать так:

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

integer(attrval.vdouble)<>1
либо округлять
korvanakorvana
Местный житель
Сообщения: 429
Зарегистрирован: 24 сен 2008, 11:53

Сообщение korvanakorvana »

Сделала. browse выдает все значения верные, но вот при выводе в ехсеl происходит след ошибка. если значение attrval.vdouble есть то выводится информация верно, а если там ничего не должно быть то выводится информация по предыдущему значению attrval.vdouble, т.е как будто значение attrval.vdouble не обнуляется(( :o при переходе к след позиции katmc
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

До того, как проверять значения в ATTRVAL, желательно убедиться, что для текущей МЦ там есть запись:

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

if (IsValid(tnATTRVAL))  {
  if(attrval.vdouble<>1 or attrval.vdouble<>2 or attrval.vdouble<>3 or
     attrval.vdouble<>11 or attrval.vdouble<>12 or attrval.vdouble<>13)
  then 
    xlSetCellStringValue('отстутствует',kol,2,kol,2); 
  else 
    xlSetCellStringValue(attrval.vdouble,kol,2,kol,2); 
  }
else
  xlSetCellStringValue('полностью отстутствует',kol,2,kol,2);
Вообще, такие простые выборки гораздо быстрее делать SQL-запросами, а не интерфейсами. Если нужно под Excel - в конце добавить TO DBF.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

А вот интересно, почему если для текущей родительской записи нет дочерних и читаем дочерние, то возвращается не default значение ('', 0, 0.0, 0h), а последнее валидное? Такое (как у korvanakorvana) раньше у меня было, но потом пропало и возвращаются именно значения по умолчанию. Нигде не написано какое должно быть поведение. Поэтому для себя я решил не ставить проверку по IsValid в таких случаях. Задавал вопрос ТП по уточнению данного нюанса - ничего внятного не услышал, они в программировании вообще не сильны ((

З.Ы. У меня подозрение, что для второго уровня дочерних записей (AttrNam) все работает как default (т.е. IsValid можно не ставить), а вот третий уровень (AttrVal) уже неопределенное поведение
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

В таких случаях желательно тогда говорить IsValidAll
Метод IsValidAll
Назначение
Возвращает логическую истину, если есть текущая позиция в узле iLeaf логиче-
ской таблицы. В случае отсутствия позиции нельзя вызывать позиционно зави-
симые модификаторы (update, delete, getNext, getPrev) – будет возвращен код
ошибки.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Речь не про IsValidAll. Хэлп я читал. Там вообще невнятно написано, я так и не врубился чем IsValid отличается от IsValidAll. По опыту: IsValidAll применим для именованных view. Попытка вызывать IsValid для той же view, вызовет ошибку компиляции.
Речь вообще-то шла о том можно ли читать из дочерних таблиц, если там нет записей. Т.е. что будет возвращено - мусор или дефолтное значение?
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

galover писал(а):Нигде не написано какое должно быть поведение. Поэтому для себя я решил не ставить проверку по IsValid в таких случаях.
Странное решение. Проверка нужна именно потому, что поведение непредсказуемо. Все-таки прикладной программист должен смотреть, получает он реальные данные, или этих данных нет, и к нему попадает мусор. Конечно, было бы неплохо перед передачей на прикладной уровень такой мусор обнулять, но с программиста это ответственности не снимает.
galover писал(а):У меня подозрение, что для второго уровня дочерних записей (AttrNam) все работает как default (т.е. IsValid можно не ставить), а вот третий уровень (AttrVal) уже неопределенное поведение
ATTRNAM - не дочерний уровень, для него нет "родительских" таблиц.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Странное решение. Проверка нужна именно потому, что поведение непредсказуемо. Все-таки прикладной программист должен смотреть, получает он реальные данные, или этих данных нет, и к нему попадает мусор. Конечно, было бы неплохо перед передачей на прикладной уровень такой мусор обнулять, но с программиста это ответственности не снимает.
Решение пришло по опыту, у меня возвращаются дефолтные значения. Поэтому при чтении, IsVAlid я не ставлю. Вот и все. Критерий истины - практика и опыт. Ответственность на мне, кто ж спорит. Был бы стандарт могли бы на него сослаться, а так только методом проб и ошибок.
ATTRNAM - не дочерний уровень, для него нет "родительских" таблиц.
имел в виду, что на нем есть ограничения по подцепке. Все что в подцепке справа - дочерний элемент
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

лично я IsValid не использую, давным давно были проблемы, теперь везде ставлю IsValidAll. Ну а неопределенное значение-есть неопределенное значение. Учитывая, что NULL-а не имеется, что же возвращать-то? Всегда желательно проверять в подобных случаях во избежание мусора. а в данном случае можно вообще ко вьюхе добавить ограничение
where ((...)) and isvalidall(tnattrval)
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Alexander
ну тут тормоза будут на пустом месте, фильтр вообще тормозит. IsValid работает нормально, на именованных вьюхах только не работает. Вообще о таких нюансах могут только разработчики ядра рассказать. Беда в том, что нет стандарта на поведение (как, например в С++), который бы жестко фиксировал все нюансы - где неопределенное поведение, где исключение, а где дефолтное значение
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

не майтесь херней с valid .. есть же функции

#include ExtAttr.vih

var
piExAttr:iExtAttr;

if(piExAttr.ValueExists(coKatBank,PlPor.cBankPol,'Наименование организации'),
piExAttr.sGetAttr(coKatBank,Plpor.cBankPol,'Наименование организации'),
'Значение не определено')
Время ведет!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

ValueExists как раз проверка на присутствие
Время ведет!
Ответить