Корифеи, совет нужен...

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

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

Ответить
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Корифеи, совет нужен...

Сообщение Sheinina »

Имеется интерфейс, который проверяет, являются ли номера телефонов в базе уникальными:

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

Interface TestPhone 'Проверка мобильных';
view mob1
var 
  curr_numb: string;
  c_per: comp;
  alarm: boolean;
as select com1.addr, per1.tabnmb, per1.fio,  per1.nrec
from synonym communications com1, 
     synonym persons per1 
where ((per1.nrec == com1.person and 07D0000000000240h==com1.comtype)) 
and length(trim(com1.addr))>0 and longint(per1.disdate)=0;// order o1 by per1.tabnmb; 

view mob2
as select com2.addr, per2.tabnmb, per2.fio 
from synonym communications com2 , synonym persons per2 
where ((com2.person == per2.nrec))
and 07D0000000000240h=com2.comtype and com2.person <> mob1.c_per
and mob1.curr_numb=com2.addr and longint(per2.disdate)=0;

form PhoneDouble('Phone.out');

HandleEvent
  cmInit: {  
//     mob1.SetOrder(tiO1);
     mob1.alarm:=false;
     _loop per1 {
         mob1.curr_numb:=mob1.com1.addr;
         mob1.c_per:=mob1.per1.nrec;
         if mob2.getfirst =tsOK then {
            mob1.alarm:=true;
            PhoneDouble.write(mob1.curr_numb);
            PhoneDouble.write(mob1.per1.tabnmb);
            PhoneDouble.write(mob1.per1.fio);
            PhoneDouble.write(mob2.com2.addr);
            PhoneDouble.write(mob2.per2.tabnmb);
            PhoneDouble.write(mob2.per2.fio);
         }
     }
     if mob1.alarm then {
        PhoneDouble.PutEvent(feBreak);
        PhoneDouble.ShowFile('Phone.out');
        abort;
     }
     else {
        message('Все в порядке! Можно закачивать данные');
     }
     abort;
  }
end;
end.

Вроде все просто, но!!!
Стоит раскомментировать индекс - перестает обнаруживать задублированные телефоны. Может, я что не так написала :eek:
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Здесь уже обсуждалось, что делать в интерфейсе несколько вьюх - извращение
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение Sheinina »

Знаю!!! Но когда все это сидело в одной вьюхе, ни хрена не находило. Причем запрос в Supporte типа:

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

select com1.addr, per1.tabnmb, per1.fio, com2.addr,  per2.tabnmb, per2.fio
from synonym communications com1, synonym communications com2 ,
     synonym persons per1, synonym persons per2
where ((
    com1.person == per1.nrec 
and com2.person == per2.nrec))
and 07D0000000000240h=com1.comtype 
and  07D0000000000240h=com2.comtype 
and com2.person <> com1.person
and com1.addr=com2.addr 
and length(trim(com1.addr))>0 
and longint(per1.disdate)=0 and longint(per2.disdate)=0
order by per1.tabnmb;
отрабатывает как часы, а в фейсе - ну ничего не находит...
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

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

дальше
не проще ли вместо
length(trim(com1.addr))>0
просто
com1.addr <> ''

дальше, у communications есть индекс
PERSON+COMTYPE
над вашим запросом можно поработать

Я бы рекомендовал вообще забыть, что в Галактическом "SQL" есть order by, пока не набъете руку, иначе будете частенько натыкаться на глюки. Пользуйтесь для сортировки только индексами
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение Sheinina »

В варианте запроса в интерфейсе таблица per1 (синоним persons) является, как я понимаю, корневой. Условие length(trim(com1.addr)) >0 согласна заменить только на trim(com1.addr)<>'', т.к. нашим доблестным кадровикам и телефонистам может придти в голову не удалить, а пробелами стереть номер :grin: Очевидно, самое простое в моей ситуации - расслабиться и плюнуть, что в отчет строки попадают не отсортированные - отчет в идеале должен быть пустым, ведь номер мобильника может быть привязан только к одному сотруднику :grin:
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Sheinina писал(а):т.к. нашим доблестным кадровикам и телефонистам может придти в голову не удалить, а пробелами стереть номер
гы. как-то даже в голову такое не пришло... мда, кадровики, они того...могут и не такое выкинуть. сочувствую.
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение Sheinina »

:-D
Ответить