среда, 25 мая 2016 г.

Закладка в тексте HTML-страницы

Сама закладка оформляется так:
<a name="закладка_1">
Ссылка, ведущая на закладку:
<a href="закладка_1">Ссылка на закладку 1</a>
Переход к закладке в тексте страницы "textpage.html":
<a href="textpage.html#закладка_1">Ссылка на закладку 1 на странице textpage.html</a>

Отображение в браузере содержимого текстового файла

Как отобразить в браузере содержимое текстового файла?

Например, лога импорта дампа - \\myserver\logs\restore.log.
Прямые ссылки (<a href="file://///myserver/logs/restore.log">show file</a>) не работают из-за ограничений безопасности браузеров (ссылка на странице отображается, но щелчок по ней ни к чему не приводит).

Решение с помощью JSTL:
Создаем jsp-страницу, например, "show_log.jsp", следующего содержания:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%//Антикракозябриковая кодировка
request.setCharacterEncoding("UTF-8");%>
<pre><c:import url="file://///myserver/logs/restore.log" /></pre>

На главную страницу добавляем ссылку на "show_log.jsp". Теперь при щелчке по такой ссылке в браузере откроется страница с содержимым текстового файла "\\myserver\logs\restore.log".

Открыть ссылку в новой вкладке

Чтобы ссылка открывалась в новой вкладке браузера нужно:
<a href="..." target="_blank">blablabla</a>

Oracle: директории

Пример: чтобы утилита "impdp" сразу сохраняла лог импорта в определенной папке, например, "/mnt/oracle/dumps/logs", нужно:
1) создать нужную папку (в примере "LOG_DIR"):
create directory LOG_DIR as '/mnt/oracle/dumps/logs';
2) указать ее в команде запуска:
impdp ... LOGFILE=LOG_DIR:import.log

понедельник, 16 мая 2016 г.

(MS Outlook) Сохранение отправленных писем в папке "Отправленные" общего почтового ящика

Если в рамках MS Exchange личной учетной записи на почтовом сервере предоставлен доступ к общему почтовому ящику, то, чтобы отправленные письма сохранялись в папке "Отправленные" общего ящика, нужно следовать инструкции:
https://support.microsoft.com/en-us/kb/2843677.

1. Click Start, click Run, type regedit, and then click OK.
2. Locate and then click the following registry subkey:
HKEY_CURRENT_USER\Software\Microsoft\Office\x.0\Outlook\Preferences
Note The x.0 placeholder represents your version of Office (16.0 = Office 2016, 15.0 = Office 2013, 14.0 = Office 2010).
3. On the Edit menu, point to New, and then click DWORD Value.
4. Type DelegateSentItemsStyle, and then press Enter.
5. Right-click DelegateSentItemsStyle, and then click Modify.
6. In the Value data box, type 1, and then click OK.
7. Exit Registry Editor.

Пример для MS Office 2010 x32:

четверг, 12 мая 2016 г.

Пример запроса, который создает запросы по констрейнту

Задача:
Найти таблицы, в которых используется пара кодов из справочника "КЦСР", а именно: 7140450641 и 7140450642.

Решение с помощью запроса, создающего подзапросы:
1) Пишем запрос, результатом которого будет один большой запрос, состоящий из множества подзапросов объединенных оператором "union all":
«
select
'select '''||c.table_name||'.'||cc.column_name||''',count(*) CNT from '
||c.table_name
||' t where t.'||cc.column_name||' in (''7140450641'', ''7140450642'') and t.BUDGET_ID=800000001309 union all'
from user_constraints c join user_cons_columns cc on cc.constraint_name = c.constraint_name where c.r_constraint_name='UQ_KCSR' and cc.column_name <> 'BUDGET_ID'
order by c.table_name,cc.column_name;
»
/* "cc.column_name <> 'BUDGET_ID'" - это условие добавлено, т.к. констрейнт "UQ_KCSR" содержит 2 колонки, в том числе и колонку "BUDGET_ID", поэтому без этого условия все подзапросы удвоятся */

2) Пример результата:
«
select 'PROTOCOL.KCSR_CODE',count(*) CNT from PROTOCOL t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
select 'PURPOSEFULGRANT_EXPKBK.KCSR_CODE',count(*) CNT from PURPOSEFULGRANT_EXPKBK t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
...;
»


3) Этот результат оформляем таким образом (см. первую и последнюю строки):
«
select * from (
select 'PROTOCOL.KCSR_CODE',count(*) CNT from PROTOCOL t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
select 'PURPOSEFULGRANT_EXPKBK.KCSR_CODE',count(*) CNT from PURPOSEFULGRANT_EXPKBK t where t.KCSR_CODE in ('7140450641', '7140450642') and t.BUDGET_ID=800000001309 union all
...
) where CNT<>0;
»
/* "CNT<>0" - это условие добавлено, т.к. без него запрос будет показывать все таблицы, в том числе и где нужных нам записей нет */

Итог:
Решение сработало успешно, в результате запрос выдал (т.е. в таблице "PURPOSEFULGRANT_EXPKBK" есть 1 запись, содержащая искомый код КЦСР):
«
PURPOSEFULGRANT_EXPKBK.KCSR_CODE' 1
»

P.S. Запрос для запросов для Firebird:

Пример №1 (простой):
select
'select '''
||trim(i.rdb$relation_name)||'.'||trim(isg.rdb$field_name)||''' as TABLE_NAME, count(*) as CNT from '
||trim(i.rdb$relation_name)||' where '||trim(isg.rdb$field_name)||'=777 union all'
from rdb$indices i
join rdb$index_segments isg on isg.rdb$index_name = i.rdb$index_name
where i.rdb$foreign_key = 'PK_BUDGETLINE'
order by
i.rdb$relation_name
,isg.rdb$field_name;

Пример №2 (сложный):
select
'select '''
||trim(i.rdb$relation_name)||''' as TABLE_NAME, count(*) as CNT from '
||trim(i.rdb$relation_name)||' as t where t.'
||trim(isg.rdb$field_name)||'=3250000000441 and t.KCSR_CODE is not null union all'
from rdb$indices i
join rdb$index_segments isg on isg.rdb$index_name = i.rdb$index_name
where i.rdb$foreign_key = 'UQ_KCSR'
and trim(isg.rdb$field_name) = 'BUDGET_ID'
order by
i.rdb$relation_name
,isg.rdb$field_name;

Архив