CftClub.ru
Клуб специалистов ЦФТ-Банк

Убрать повторяющиеся записи
На страницу Пред.  1, 2
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеВт Авг 13, 2019 16:05    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
cool_dude пишет:

Если 2 адреса (например, старый и новый) - какой из них правильный?
1) Адреса типа "Фактический" должны попадать в отчет. Это отчет для физ.лиц.


Выводи в два этапа, сначала строго по фактическому, плюс запоминай без пробелов

Потом все остальные с проверкой значений на соответствие значению из первого пункта

cool_dude пишет:

2) По тех. заданию, оба адреса должны выходить в отчет. Есть такие моменты, что наши операционисты оба адреса (и в старом и в новом) вставят галочки "Фиксировать".


Если галка фиксировать, то что?


А как сделать так, чтобы у тех клиентов у которых по два одинаковых адреса (один с пробелом и т.п.), взять только один?
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Авг 13, 2019 16:13    Ответить с цитатой
Полезность: Нет оценки
cool_dude пишет:

А как сделать так, чтобы у тех клиентов у которых по два одинаковых адреса (один с пробелом и т.п.), взять только один?


Об этом же было ранее)...

Матвеев Евгений пишет:

плюс запоминай без пробелов

Потом все остальные с проверкой значений на соответствие значению из первого пункта


Или здесь имеется в виду несколько адресов, часть из которых одинаковы без учета пробелов?
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Авг 13, 2019 16:14    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии


...сделать текст без пробелов...
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Авг 13, 2019 16:15    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
vtar пишет:
на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии


Как вариант вот так

Код:

REGEXP_REPLACE(Adr, ' ')


либо так
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеВт Авг 13, 2019 16:20    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:

Или здесь имеется в виду несколько адресов, часть из которых одинаковы без учета пробелов?


Да. Хочу вывести один адрес из массива и всё.
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеВт Авг 13, 2019 16:22    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:
Матвеев Евгений пишет:
vtar пишет:
на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии


Как вариант вот так

Код:

REGEXP_REPLACE(Adr, ' ')


либо так


У некоторых адресов, не только пробел но и по содержимому отличаются. Например, один и тот же адрес ввели один раз с индексом, второй без индекса почтового.
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеВт Авг 13, 2019 16:23    Ответить с цитатой
Полезность: Нет оценки
Просто надо вывести первый адрес из массива адресов в отчет, если там два и более адресов...
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Авг 13, 2019 16:25    Ответить с цитатой
Полезность: Нет оценки
cool_dude пишет:
Матвеев Евгений пишет:

Или здесь имеется в виду несколько адресов, часть из которых одинаковы без учета пробелов?


Да. Хочу вывести один адрес из массива и всё.


Если один, тогда сделай две выборки через for

Первая строго по фактическому с exit

Вторая по всем существующим тоже с exit

Сделай флаг, проверить был ли фактический, чтобы во второй for не переходить

Как то так

Технически сейчас в чем именно сложность?
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеВт Авг 13, 2019 16:27    Ответить с цитатой
Полезность: Нет оценки
cool_dude пишет:
Матвеев Евгений пишет:
Матвеев Евгений пишет:
vtar пишет:
на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии


Как вариант вот так

Код:

REGEXP_REPLACE(Adr, ' ')


либо так


У некоторых адресов, не только пробел но и по содержимому отличаются. Например, один и тот же адрес ввели один раз с индексом, второй без индекса почтового.


Для данных кейсов отдельная процедура нормализации адресов нужна, трудоемкая, кропотливая, ... Это точно выходит за рамки задачи по написанию отчетов
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеСр Авг 14, 2019 06:15    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений пишет:


Если один, тогда сделай две выборки через for

Первая строго по фактическому с exit

Вторая по всем существующим тоже с exit

Сделай флаг, проверить был ли фактический, чтобы во второй for не переходить

Как то так

Технически сейчас в чем именно сложность?


Сложности сейчас с кодом...
Как определить в массиве адресов, одна запись или два и более? И если определить как брать первую из них?
Не подскажете кодом?
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Авг 14, 2019 09:27    Ответить с цитатой
Полезность: Нет оценки
Что Вы понимаете под первым адресом, вторым?
Как во вьюхе? Или м.б. на типы адресов смотреть?
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Авг 14, 2019 10:23    Ответить с цитатой
Полезность: 1
cool_dude пишет:

Не подскажете кодом?


Приветствую

Код:
   function GetFirstAdr(cl ref [CLIENT]) return varchar2(1000)
   is
   begin
      -- Проверка на пустой указатель
      if cl is null then   return ''; end if;
      -- Сначала смотрим фактический, если не нашли, смотрим полную выборку   
      return nvl(   ::[RUNTIME].[VIEWFUN].GetAddress(cl, 'ALL', 'FACT'),::[RUNTIME].[VIEWFUN].GetAddress(cl, 'ALL')   );
   end;
begin
   debug('Первый адрес, с учетом фактичкого первым: '||GetFirstAdr(this),0);
end;
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Авг 14, 2019 10:35    Ответить с цитатой
Полезность: 1
Код:
::[RUNTIME].[VIEWFUN].GetAddress(cl, 'ALL', 'FACT')


ALL по умолчанию выводит полный вариант адреса, с индексами и проч.

... можно переиграть, возможные варианты описаны тут...

Подробнее о форматах адресов см описание к ::[PERSONAL_ADDRESS].[STR_LIB].Addr_to_Str, параметр P_FORMAT

Дабы далеко не ходить) ... выглядит это так:

Код:

/**
 * Получение адреса в виде строки заданного формата.
 *
 * @param p_Addr - ссылка на адрес
 * @param p_Format - строка с форматом получаемого адреса:
 *       Формат 9-ти запятых
 *       FMT_NINE_COMMAS            Код страны, Почтовый индекс, Код региона, Наименование района,
 *                            Наименование города, Наименование населенного пункта,
 *                            Наименование улицы, Дом, Корпус, Квартира
 *   
 *      Формат 10-ти запятых
 *       FMT_TEN_COMMAS            Код страны, Почтовый индекс, Код региона, Наименование района,
 *                             Наименование города, Наименование населенного пункта,
 *                            Наименование улицы, Дом, Корпус, Квартира, Код типа адреса
 *    
 *      Простой формат  запятых
 *       FMT_SIMPLE               Индекс, Наименование региона, Наименование района, Наимение населенного
 *                            пункта, Наименование улицы, Дом, Строение, Корпус, Квартира
 *                            
 *      Для формирования формата доступны следующие значения:
 *       >> Индкс ---------------
 *          'ZIP', 'POST_CODE' - почтовый индекс;
 *       >> Страна ---------------
 *          'COUNTRY' - Наименование страны населенного пункта;
 *          'COUNTRY_NO' - Наименование страны населенного пункта, если страна не соответствует стране нахождения банка;
 *          'COUNTRY_CODE' - цифровой код страны;
 *          'COUNTRY_ALFA2' - Буквенный код страны (альфа - 2);
 *          'COUNTRY_ALFA3' - Буквенный код страны (альфа - 3);
 *          'COUNTRY_FULL' - Полное наименование страны;
 *          'COUNTRY_NO_FULL' - Полное наименование страны, если страна не соответствует стране нахождения банка;
 *       >> Регион ---------------
 *          'REGION' - Наименование региона населенного пункта вместе с наименованием типа региона, порядок следования опеределяется в типе региона;
 *          'REGION_NT' - Наименование региона населенного пункта;
 *          'REGION_TE' - Наименование региона населенного пункта вместе с наименованием типа региона, порядок <регион> <тип>;
 *          'REGION_CODE' - Код региона;
 *          'REGION_LCODE' - Код региона по КЛАДР;
 *             Для населенных пунктов уровня > 1 и статуса не равного 5 (Города федерального значения):
 *          'REGION_NCT', 'REGION_NCT_NT', 'REGION_NCT_TE', 'REGION_NCT_CODE', 'REGION_NCT_LCODE'
 *             Для населенных пунктов уровня > 1 и статуса не равного 2 (Центр региона), 3 (Центр района и региона), 5 (Города федерального значения):
 *          'REGION_NCC', 'REGION_NCC_TE', 'REGION_NCC_NT', 'REGION_NCC_CODE', 'REGION_NCC_LCODE';
 *       >> Район рениона ---------------
 *          'DISTRICT', 'AREA' - Район региона вместе с типом района, порядок следования опеределяется типом района;
 *          'DISTRICT_TE' - Район региона вместе с типом района, порядок следования:  <район> <тип>;
 *          'DISTRICT_NT' - Район региона;
 *          'DISTRICT_CODE' - Код района региона;
 *             Для районов не в статусе: 1(Центр района) 3(Центр района и региона)
 *          'DISTRICT_NCC', 'DISTRICT_NCC_TE', 'DISTRICT_NCC_NT', 'DISTRICT_NCC_CODE'
 *       >> Город     - по административно-территориальному делению ---------------
 *       >> Поселение - по муниципальному делению ---------------
 *          'MAIN_CITY', 'MAIN_CITY_TE', 'MAIN_CITY_NT', 'MAIN_CITY_CODE',
 *     >> Населенный пункт ---------------
 *          'CITY' , 'CITY_TE','CITY_NT', 'CITY_CODE', 'CITY_DISTRICT',
 *       >> Элемент планировочной структуры ---------------
 *          'SUBAREA' - планировочная структура с наименованием типа;
 *          'SUBAREA_NT' - планировочная структура без типа;
 *       >> Улично-дорожная сеть ---------------
 *          'STREET' - наименование улицы с наименованием типа улицы, порядок следования опеределяется в типе улицы;
 *          'STREET_TE' - наименование улицы с наименованием типа улицы, порядок следования:  <улица> <тип> (улица строкой игнорируется);
 *          'STREET_NT' - наименование улицы;
 *          'STREET_CODE' - Код улицы;
 *       >> Дом ---------------
 *          'HOUSE' - Номер дома с наименованием вида;
 *          'HOUSE_NT' - номер дома;
 *           'KORPUS' - корпус дома с наименованием вида;
 *          'KORPUS_NT' - корпус дома;
 *          'KORPUS_ONLY' - только корпус искючая строение с типом;
 *          'KORPUS_ONLY_NT' - только корпус искючая строение без типа;
 *          'BUILD', 'STRUCTURE'  - номер строения дома с наименованием вида;
 *          'BUILD_NT', 'STRUCTURE_NT' - номер строения дома;
 *       >> Квартира/офис ---------------
 *          'FLAT', 'FLAT_NT' - квартира(офис);
 *       >> Другое ---------------
 *          'IMP_STR' - адрес строкой
 *          'ADDR_TYPE' - код типа адреса;
 *          'KLADR_CODE' - код по КЛАДР. В порядке приоритета: улица, город, регион;
 * @param p_Delimiter - Символ-разделитель полей формата.
 * @param p_Empty_Fields - Добавлять пустые поля.
 *
 * @return строка содержащая адрес в формате, заданном в соответсвующем параметре
 */




Примеры в ассортименте

Код:


main_doc_ref.[KL_DT].[2].[2]:=main_doc_ref.[KL_DT].[1].[1].[NAME]||' //'||::[RUNTIME].[VIEWFUN].GetAddress(main_doc_ref.[KL_DT].[1].[1],'CITY,STREET,KORPUS,HOUSE,FLAT')||'//';

vAdr2 := ::[RUNTIME].[VIEWFUN].GetAddressByRef(Adr%id, 'REGION_NCT,DISTRICT,CITY,STREET,HOUSE,KORPUS,FLAT') ;

vAdr  := ::[RUNTIME].[VIEWFUN].GetAddressByRef(Adr%id, 'POST_CODE,COUNTRY') ;

vAdr2 := ::[RUNTIME].[VIEWFUN].GetAddressByRef(Adr%id, 'REGION_NCT,DISTRICT,CITY,STREET,HOUSE,KORPUS,FLAT') ;

P_ADRES   := ::[RUNTIME].[VIEWFUN].GetAddress(P_CLIENT,'CITY, STREET, HOUSE, KORPUS, FLAT ',null);

v_txt := ::[RUNTIME].[VIEWFUN].GetAddressByRef(P_TAX_INSP_DEPARTS.[ADDRESS],'ZIP, REGION, CITY, STREET, HOUSE, KORPUS, FLAT');

v_txt := ::[RUNTIME].[VIEWFUN].GetAddress(P_CREATOR.[FILIAL].[BANK], 'ZIP, REGION, CITY, STREET, HOUSE, KORPUS, FLAT');

,decode(df.[CL_KT].[0],1,::[RUNTIME].[VIEWFUN].GetAddress(df.[CL_KT].[1].[1], 'POST_CODE,CITY,STREET,KORPUS,HOUSE,FLAT'),df.[CL_KT].[2].[2]) : rcv_addr

,decode(df.[GRUZ_DT].[0],1,::[RUNTIME].[VIEWFUN].GetAddress(df.[GRUZ_DT].[1].[1], 'POST_CODE,CITY,STREET,KORPUS,HOUSE,FLAT'),df.[GRUZ_DT].[2].[2]) : snd_addr

tab('ADDRESS_JUR')       := ::[RUNTIME].[VIEWFUN].GetAddress(bank_ref,'POST_CODE,REGION_NCT,DISTRICT,MAIN_CITY,CITY,STREET,HOUSE,KORPUS,FLAT','CORP');



и т.д.
Матвеев Евгений
Профи


Вступление в Клуб: 31.01.2012
СообщениеСр Авг 14, 2019 14:34    Ответить с цитатой
Полезность: 1
cool_dude пишет:

Как определить в массиве адресов, одна запись или два и более?


Не в привязке к рассматриваемой задаче, но вообще
Количество элементов массива

При помощи этого модификатора можно так же подсчитать количество экземпляров в коллекции или типе. Для этого модификатор применяется к реквизиту или переменной, являющимся коллекциями, или к типу (по ссылке или непосредственно к ТБП) в формате:
%size(< числовой параметр >)
< Числовой параметр > указывает максимальное значение, до которого производить подсчет числа экземпляров. Если значение параметра пусто или равно 0, то производится полный подсчет количества экземпляров (задание значения 1, например, означает просто проверку на существование хотя бы одного экземпляра). Возвращаемый тип – целое число.

Код:
   debug('Колличество адресов клиента: '||this.[ADDRESSES]%size(0),0);
   debug('Колличество контактов клиента: '||this.[CONTACTS]%size(0),0);   
   debug('Колличество родственников клиента: '||this.[RELATIVES_CLIENT]%size(0),0);      


Через select запрос c count

Код:
   declare
      ADDRESSES_COUNT number;
   begin
      select example(count(example)) in this.[ADDRESSES] all into ADDRESSES_COUNT;
      debug('Колличество адресов клиента: '||ADDRESSES_COUNT,0);   
   end;
   
   declare
      CONTACTS_COUNT number;
   begin
      select example(count(example)) in this.[CONTACTS] all into CONTACTS_COUNT;
      debug('Колличество контактов клиента: '||CONTACTS_COUNT,0);   
   end;

   declare
      RELATIVES_CLIENT_COUNT number;
   begin
      select example(count(example)) in this.[RELATIVES_CLIENT] all into RELATIVES_CLIENT_COUNT;
      debug('Колличество родственников клиента: A'||RELATIVES_CLIENT_COUNT,0);   
   end;
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеПн Авг 19, 2019 14:11    Ответить с цитатой
Полезность: Нет оценки
Матвеев Евгений, спасибо за варианты решения.
Проблема решилась.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru