Убрать повторяющиеся записи
На страницу Пред. 1, 2
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Вт Авг 13, 2019 16:05   |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: | cool_dude пишет: |
Если 2 адреса (например, старый и новый) - какой из них правильный?
1) Адреса типа "Фактический" должны попадать в отчет. Это отчет для физ.лиц.
|
Выводи в два этапа, сначала строго по фактическому, плюс запоминай без пробелов
Потом все остальные с проверкой значений на соответствие значению из первого пункта
cool_dude пишет: |
2) По тех. заданию, оба адреса должны выходить в отчет. Есть такие моменты, что наши операционисты оба адреса (и в старом и в новом) вставят галочки "Фиксировать". |
Если галка фиксировать, то что? |
А как сделать так, чтобы у тех клиентов у которых по два одинаковых адреса (один с пробелом и т.п.), взять только один? |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вт Авг 13, 2019 16:13   |
|
Полезность: Нет оценки
|
cool_dude пишет: |
А как сделать так, чтобы у тех клиентов у которых по два одинаковых адреса (один с пробелом и т.п.), взять только один? |
Об этом же было ранее)...
Матвеев Евгений пишет: |
плюс запоминай без пробелов
Потом все остальные с проверкой значений на соответствие значению из первого пункта |
Или здесь имеется в виду несколько адресов, часть из которых одинаковы без учета пробелов? |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вт Авг 13, 2019 16:14   |
|
Полезность: Нет оценки
|
vtar пишет: | на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии |
...сделать текст без пробелов... |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вт Авг 13, 2019 16:15   |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: | vtar пишет: | на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии |
Как вариант вот так
Код: |
REGEXP_REPLACE(Adr, ' ')
|
|
либо так |
|
![](templates/subSilver/images/spacer.gif) |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Вт Авг 13, 2019 16:20   |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: |
Или здесь имеется в виду несколько адресов, часть из которых одинаковы без учета пробелов? |
Да. Хочу вывести один адрес из массива и всё. |
|
![](templates/subSilver/images/spacer.gif) |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Вт Авг 13, 2019 16:22   |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: | Матвеев Евгений пишет: | vtar пишет: | на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии |
Как вариант вот так
Код: |
REGEXP_REPLACE(Adr, ' ')
|
|
либо так |
У некоторых адресов, не только пробел но и по содержимому отличаются. Например, один и тот же адрес ввели один раз с индексом, второй без индекса почтового. |
|
![](templates/subSilver/images/spacer.gif) |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Вт Авг 13, 2019 16:23   |
|
Полезность: Нет оценки
|
Просто надо вывести первый адрес из массива адресов в отчет, если там два и более адресов... |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вт Авг 13, 2019 16:25   |
|
Полезность: Нет оценки
|
cool_dude пишет: | Матвеев Евгений пишет: |
Или здесь имеется в виду несколько адресов, часть из которых одинаковы без учета пробелов? |
Да. Хочу вывести один адрес из массива и всё. |
Если один, тогда сделай две выборки через for
Первая строго по фактическому с exit
Вторая по всем существующим тоже с exit
Сделай флаг, проверить был ли фактический, чтобы во второй for не переходить
Как то так
Технически сейчас в чем именно сложность? |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 31.01.2012
|
Вт Авг 13, 2019 16:27   |
|
Полезность: Нет оценки
|
cool_dude пишет: | Матвеев Евгений пишет: | Матвеев Евгений пишет: | vtar пишет: | на хрен пробел.
replace(addr, ' ', '')
спасет отца русской демократии |
Как вариант вот так
Код: |
REGEXP_REPLACE(Adr, ' ')
|
|
либо так |
У некоторых адресов, не только пробел но и по содержимому отличаются. Например, один и тот же адрес ввели один раз с индексом, второй без индекса почтового. |
Для данных кейсов отдельная процедура нормализации адресов нужна, трудоемкая, кропотливая, ... Это точно выходит за рамки задачи по написанию отчетов |
|
![](templates/subSilver/images/spacer.gif) |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Ср Авг 14, 2019 06:15   |
|
Полезность: Нет оценки
|
Матвеев Евгений пишет: |
Если один, тогда сделай две выборки через for
Первая строго по фактическому с exit
Вторая по всем существующим тоже с exit
Сделай флаг, проверить был ли фактический, чтобы во второй for не переходить
Как то так
Технически сейчас в чем именно сложность? |
Сложности сейчас с кодом...
Как определить в массиве адресов, одна запись или два и более? И если определить как брать первую из них?
Не подскажете кодом? |
|
![](templates/subSilver/images/spacer.gif) |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
Ср Авг 14, 2019 09:27   |
|
Полезность: Нет оценки
|
Что Вы понимаете под первым адресом, вторым?
Как во вьюхе? Или м.б. на типы адресов смотреть? |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 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; |
|
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 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');
|
и т.д. |
|
![](templates/subSilver/images/spacer.gif) |
Матвеев Евгений Профи
Вступление в Клуб: 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;
|
|
|
![](templates/subSilver/images/spacer.gif) |
cool_dude Участник - экстремал
Вступление в Клуб: 05.02.2013
|
Пн Авг 19, 2019 14:11   |
|
Полезность: Нет оценки
|
Матвеев Евгений, спасибо за варианты решения.
Проблема решилась. |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|