среда, 28 апреля 2010 г.

Eliminate Group By clause from interface mapping

Quite often a behavior for IKM Module is by default to put Group By clause to a generated SQL for interface where there is grouping function in a Mapping Implementation.
It may be very handy, but sometimes it is unwanted. E.g. in below mapping:

decode (row_number()
over(partition by S_DOCSUM_DELTA.ISN order by F_INSURED_RISK.ACC_SUBGR_ID ),1,floor(10000*abs(S_DOCSUM_DELTA.AGRAMOUNTPAY)/count(S_DOCSUM_DELTA.ISN) over (partition by S_DOCSUM_DELTA.ISN))/10000 + remainder(abs(S_DOCSUM_DELTA.AGRAMOUNTPAY),floor(10000*abs(S_DOCSUM_DELTA.AGRAMOUNTPAY)/count(S_DOCSUM_DELTA.ISN) over (partition by S_DOCSUM_DELTA.ISN ))/10000),floor(10000*abs(S_DOCSUM_DELTA.AGRAMOUNTPAY)/count(S_DOCSUM_DELTA.ISN) over (partition by S_DOCSUM_DELTA.ISN))/10000 )


No matter what it means it does not need Group By since COUNT() OVER here is an analytical function.

To force ODI not no use default behavior we should either comment the line <%=snpRef.getGrpBy() %> in Insert Step of IKM or make it optional with creating option GENERATE_GROUP_BY_CLAUSE with default value Yes and substituting <%=snpRef.getGrpBy() %> with:

<% if (odiRef.getOption("GENERATE_GROUP_BY_CLAUSE").equals("1") ) out.print(odiRef.getGrpBy()); %>

Best, Ivan.

Upd:
I stumbled upon graceful trick to solve this problem.
Prooflink

понедельник, 26 апреля 2010 г.

Локализация в ODI

В ходе разбора различных KM обнаружилось, что все они требуют доработок для корректной выгрузки и загрузки кириллицы.
Вот некоторые из них:

1) Модуль LKM MSSQL to Oracle (bcp,sqlldr). Чтобы выгрузка из MSSQL происходила c учетом кодовой страницы 1251 нужно добавить соотв-й параметр в конец строки формирования bcp на шаге 191. BCP out data to temporary bcp file

На Sunopsys API это выглядит так:
<%out.print(" -C"+odiRef.getOption("MSSQL_FILE_ENCODING"));%>

Здесь задана опция MSSQL_FILE_ENCODING с типом Value и значением по умолчанию = 1251

Результат будет например следующим:

C:\"Program Files"\"Microsoft SQL Server"\90\Tools\Binn\bcp my_db.dbo.AGREEMENT out C:/Temp/dump.bcp -c -S192.168.10.01 -Uuser -Ppassword -t @#$% -C1251

2) Модуль LKM MSSQL to Oracle (bcp,sqlldr). Загрузка sqlldr происходит с учетом клиентских настроек машины. Часто разделитель на клиенте и сервере не совпадают и SQLLOADER выдает ошибки. Что бы в ODI изменять параметр NLS_NUMERIC_CHARACTERS надо выполнять команду ОС в шаге Call SQLLoader via Jython.

Чтобы задать это с помощью Option, создадим новую опцию O_NNC c Type = Text и Default Value = .,
а для получения структуры "set NLS_NUMERIC_CHARACTERS=.," мы добавим в начале в этом шаге:

exitCode = os.putenv(r"NLS_NUMERIC_CHARACTERS","<%
NNC=odiRef.getOption("O_NNC");
out.print(NNC);
%>")

Теперь перед запуском будет выполнена команда set NLS_NUMERIC_CHARACTERS=".," и после этого примутся все записи с разделителем "точка". Вот что получим в итоге:

import os

exitCode = os.putenv(r"NLS_NUMERIC_CHARACTERS",".,")
exitCode = os.system(r"sqlldr control=C:/Temp/X1240101.ctl log=C:/Temp/X1240101.log userid=proto2/<@=snpRef.getInfo("DEST_PASS") @>@orcl > C:/Temp/X1240101.out")

if (exitCode<>0 and exitCode<>2) :
raise("SQLLDR failure(s)");


3) Модуль LKM Excel to Oracle
Для возможности делать Reverse excel-структуры надо создать ODBC, к нему Sun-JDBC-ODBC Bridge а в самом Excel файле создать Range - выделить диапазон вместе с заголовком, далее правая кнопка - Name A Range и задать Имя Диапазона. После этого при Selective Reverse - Objects to Reverse будет доступен это Range.

Также для возможности корректно исп-ть кириллицу, надо в настройках Data Server к Excel прописать в Description key charSet = cp1251.

Надеюсь, кому-нибудь сэкономит время.