terça-feira, 13 de outubro de 2009

Query com colunas Acumuladas

Ola pessoal!!!

Desculpa pela demora em postar mais dicas, estava muito enrolado mês passado (por aquele motivo) e ainda tive uma mini-ferias... Vou tentar voltar a postar as dicas com mais freqüência agora...

Bom, vou dar um dia de query acumulado... por exemplo: Quero que o resultado de minha query seja o numero da nota, data emissão, o valor da nota, o acumulado da nota por dia e o acumulado geral, o resultado tem ser algo parecido com:



Para montar esse resultado, vou usar o comando OVER!!! Ficara assim:



Apesar da query não ter ficado alinhada (fui obrigado a colocar como figura), acho que da pra entender... não sei porque não fica alinhado do jeito que monto, isso ta limitando um monte de dicas que quero passar, com tem trechos de código maiores fica muito ruim de entender quando não esta alinhando...


Abs,

terça-feira, 14 de julho de 2009

Trabalhando com Idiomas no Oracle

Olá Galera, depois de um tempinho trabalhando igual um cavalo... consegui um tempinho para postar uma nova dica.

Vamos falar de idioma!!!

Como podem ver na figura abaixo, o idioma do default do banco esta em inglês. O mês esta trazendo 'AUG', se estivesse o idioma em português traria 'AGO'.


Mas se eu quiser ver o mês em português, como que faço?

É bem simples, apenas precisamos alterar a sessão para o idioma português:


O Oracle tem uma vasta lista de idioma, faça um teste altera a sessão e veja como fica o nome do mês no idioma que quiser (lembrando que isso dependente se os idiomas estão instalados na base e que alguns idiomas têm caracteres especiais).

Olha como fica escrito JULHO em alemão:

Quando estamos com um idioma setado e passamos uma data em outro idioma da erro, mas podemos alterar o idioma de uma data no momento da execução e ainda sem mexer com o idioma da sessão,

No caso abaixo o idioma esta setado em inglês e vou passar uma data em português, vai dar erro!


Agora vou passar a mesma data, mas setando o idioma banco vai entender como uma data valida e não irá mexer no idioma da sessão.


Pra dica ficar completa abaixo tem uma lista de idiomas:

NLS_LANGUAGE = ENGLISH

us AMERICAN
ar ARABIC

bn BENGALI
ptb BRAZILIAN PORTUGUESE
bg BULGARIAN

frc CANADIAN FRENCH
ca CATALAN
zhs SIMPLIFIED CHINESE
hr CROATIAN
cs CZECH

dk DANISH
nl DUTCH

eg EGYPTIAN
gb ENGLISH
et ESTONIAN

sf FINNISH
f FRENCH

din GERMAN DIN
d GERMAN
el GREEK

iw HEBREW
hu HUNGARIAN

is ICELANDIC
in INDONESIAN
i ITALIAN

ja JAPANESE

ko KOREAN

esa LATIN AMERICAN SPANISH
lv LATVIAN
lt LITHUANIAN

ms MALAY
esm MEXICAN SPANISH

n NORWEGIAN

pl POLISH
pt PORTUGUESE

ro ROMANIAN
ru RUSSIAN

sk SLOVAK
sl SLOVENIAN
e SPANISH
s SWEDISH

th THAI
zht TRADITIONAL CHINESE
tr TURKISH

uk UKRAINIAN

vn VIETNAMESE



Abs

quarta-feira, 17 de junho de 2009

Tabelas Temporárias

E ai galera!!!! Beleza???

Utilizem o comando abaixo para criarem tabelas temporárias, ou seja, tabelas para manterem dados de cálculos ou para seleção e que depois podem ser excluídos.

Esse comando já define a tabela como temporária e seus dados são excluídos automaticamente após encerrar a sessão ou a transação.

CREATE GLOBAL TEMPORARY
TABLE nome_tabela ( definicao_campos....)
ON COMMIT DELETE ROWS -- exclui registros ao término da transação
-- ou
ON COMMIT PRESERVE ROWS -- exclui registros ao término da sessão

Vantagens das tabelas temporárias:
* São bem mais rápidas, pois não geram redo-logs e uma série de outras coisas.
* Os dados são vistos apenas pela sessão que inseriu os dados. Exemplo: Se alguém inserir dados dentro dela e comitar,ninguém vai ver o que tem na tabela, apenas será visto pela sessão que inseriu os dados. (cada sessão só enxerga o que é seu).
* Você não precisa se preocupar em apagar as informações, assim que a sessão ou transação (depende de como for criada a tabela temporária) terminar as informações da tabela se apagam automaticamente.


Colaboração Thiago Esmerine (Tripa).


Flw pessoal!!!

quarta-feira, 3 de junho de 2009

Estornar Lançamento Contábil do GL usando PL/SQL

E ai galera, belezeria???

Depois um tempo sem postar nada, estou de volta!!! Hoje vou dar uma dica sobre como fazer um estorno de um lançamento contábil do GL vai PL/SQL.

Em primeiro lugar temos que atualizar o ACCRUAL_REV_FLAG da GL_JE_HEADERS, para fazer isso estou usando uma API conforme abaixo

gl_je_headers_pkg.update_row( x_rowid => l_rowid -- ROWID da linha a ser atualizada
, x_je_header_id => r_gl_je_headers.je_header_id
, x_last_update_date => r_gl_je_headers.last_update_date
, x_last_updated_by => r_gl_je_headers.last_updated_by
, x_ledger_id => r_gl_je_headers.ledger_id
, x_je_category => r_gl_je_headers.je_category
, x_je_source => r_gl_je_headers.je_source
, x_period_name => r_gl_je_headers.period_name
, x_name => r_gl_je_headers.NAME
, x_currency_code => r_gl_je_headers.currency_code
, x_status => r_gl_je_headers.status
, x_date_created => r_gl_je_headers.date_created
, x_accrual_rev_flag => 'Y' --Flag que atualiza os dados para Y confirmando o estorno
, x_multi_bal_seg_flag => r_gl_je_headers.multi_bal_seg_flag
, x_actual_flag => r_gl_je_headers.actual_flag
, x_default_effective_date => r_gl_je_headers.default_effective_date
, x_conversion_flag => r_gl_je_headers.conversion_flag
, x_last_update_login => r_gl_je_headers.last_update_login
, x_encumbrance_type_id => r_gl_je_headers.encumbrance_type_id
, x_budget_version_id => r_gl_je_headers.budget_version_id
, x_balanced_je_flag => r_gl_je_headers.balanced_je_flag
, x_balancing_segment_value => r_gl_je_headers.balancing_segment_value
, x_je_batch_id => r_gl_je_headers.je_batch_id
, x_from_recurring_header_id => r_gl_je_headers.from_recurring_header_id
, x_unique_date => r_gl_je_headers.unique_date
, x_earliest_postable_date => r_gl_je_headers.earliest_postable_date
, x_posted_date => r_gl_je_headers.posted_date
, x_accrual_rev_effective_date => r_gl_je_headers.accrual_rev_effective_date
, x_accrual_rev_period_name => r_gl_je_headers.period_name
, x_accrual_rev_status => r_gl_je_headers.accrual_rev_status
, x_accrual_rev_je_header_id => r_gl_je_headers.accrual_rev_je_header_id
, x_accrual_rev_change_sign_flag => r_gl_je_headers.accrual_rev_change_sign_flag
, x_description => r_gl_je_headers.description
, x_tax_status_code => r_gl_je_headers.tax_status_code
, x_control_total => r_gl_je_headers.control_total
, x_running_total_dr => r_gl_je_headers.running_total_dr
, x_running_total_cr => r_gl_je_headers.running_total_cr
, x_running_total_accounted_dr => r_gl_je_headers.running_total_accounted_dr
, x_running_total_accounted_cr => r_gl_je_headers.running_total_accounted_cr
, x_currency_conversion_rate => r_gl_je_headers.currency_conversion_rate
, x_currency_conversion_type => r_gl_je_headers.currency_conversion_type
, x_currency_conversion_date => r_gl_je_headers.currency_conversion_date
, x_external_reference => r_gl_je_headers.external_reference
, x_attribute1 => r_gl_je_headers.attribute1
, x_attribute2 => r_gl_je_headers.attribute2
, x_attribute3 => r_gl_je_headers.attribute3
, x_attribute4 => r_gl_je_headers.attribute4
, x_attribute5 => r_gl_je_headers.attribute5
, x_attribute6 => r_gl_je_headers.attribute6
, x_attribute7 => r_gl_je_headers.attribute7
, x_attribute8 => r_gl_je_headers.attribute8
, x_attribute9 => r_gl_je_headers.attribute9
, x_attribute10 => r_gl_je_headers.attribute10
, x_context => r_gl_je_headers.CONTEXT
, x_ussgl_transaction_code => r_gl_je_headers.ussgl_transaction_code
, x_context2 => r_gl_je_headers.context2
, x_doc_sequence_id => r_gl_je_headers.doc_sequence_id
, x_doc_sequence_value => r_gl_je_headers.doc_sequence_value
);

COMMIT; --Commit no processamento da API que atualiza os dados do cabeçalho dos lançamentos contábeis

Depois da atualização pego o IMPLICIT_ACCESS_SET_ID do livro contábil, esse valor será usado como parâmetro para submeter o concurrent de estorno.

SELECT implicit_access_set_id
INTO l_implicit_access_set_id
FROM gl_ledgers
WHERE ledger_id = r_gl_je_headers.ledger_id;

O próximo e ultimo passo seria chamar o concurrent que estorna os lançamentos (GLPREV) passando como parametros o IMPLICIT_ACCESS_SET_ID e o ID do lote (JE_HEADER_ID da GL_JE_HEADERS).


l_n_request_id := fnd_request.submit_request( application => 'SQLGL'
, program => 'GLPREV'
, description => 'Estornar Lancamentos'
, argument1 => l_implicit_access_set_id
, argument2 => r_gl_je_headers.je_header_id
);

COMMIT; --Commit no processamento do Concorrente


Bom, aqui isso ta funcionando... os lançamentos estão sendo estornados.


Absss

terça-feira, 19 de maio de 2009

Comandos básicos de banco e EBS

Uma dica rápida hoje... vou passar alguns comandos básicos de banco e EBS...

-> FND_PROFILE.VALUE('USER_ID')
-- Recupera o ID do usuário logado no EBS (USER_ID da FND_USER)

-> FND_PROFILE.VALUE('USERNAME')
-- Recupera o nome do usuário logado no EBS (USER_NAME da FND_USER)

-> FND_GLOBAL.CONC_REQUEST_ID ou FND_PROFILE.VALUE('REQUEST_ID')
-- Recupera o ID do concurrent em execução (REQUEST_ID da FND_CONCURRENT_REQUESTS)

-> FND_GLOBAL.CONC_PROGRAM_ID
-- Recupera o ID do programa em execução (CONCURRENT_PROGRAM_ID da FND_CONCURRENT_PROGRAMS)

-> FND_GLOBAL.PROG_APPL_ID
-- Recupera o ID da aplicação do concurrent em execução (APPLICATION_ID da FND_CONCURRENT_PROGRAMS)

-> FND_PROFILE.VALUE('ORG_ID')
-- Recupera o ID da Organização setada da responsabilidade corrente

-> FND_GLOBAL.RESP_NAME;
-- Recupera o nome da responsabilidade corrente

-> FND_CLIENT_INFO.SET_ORG_CONTEXT('1')
-- Seta organização no banco (por sessão)

-> DBMS_SESSION.SET_NLS('NLS_LANGUAGE', '"BRAZILIAN PORTUGUESE"') ou DBMS_SESSION.SET_NLS('NLS_LANGUAGE', 'AMERICAN')
-- Seta o idioma no banco (por sessão)

-> DBMS_SESSION.SET_NLS('NLS_TERRITORY', 'BRAZIL') ou DBMS_SESSION.SET_NLS('NLS_TERRITORY', 'AMERICA')
-- Seta o território no banco (por sessão)

-> FND_PROFILE.PUT('GL_SET_OF_BKS_ID', 1111);
-- Seta valores numa profile (GL_SET_OF_BKS_ID é profile e o 1111 é o valor que esta sendo setado)

-> DBMS_UTILITY.COMPILE_SCHEMA('<>');
-- Compila um schema inteiro

-> SELECT * FROM V$INSTANCE
-- Para pegar informações sobre o banco que esta conectado

-> ALTER USER <> IDENTIFIED BY <>
-- Para alterar a senha de um usuário de banco:

-> ALTER TABLE <> DROP COLUMN <>;
-- Deletar coluna da tabela


São comandos básicos, mas podem ser bastante útil de acordo com necessidade de cada um...


Abrsss...

quarta-feira, 13 de maio de 2009

Submeter um concurrent no Oracle EBS de dentro de um código PL/SQL com data de execução dinâmica (FND_REQUEST.SUBMIT_REQUEST)

E ai pessoal!!!! Blz???

Hoje vou mostrar uma solução simples para um problema que tive, talvez alguém não conheça essa função e suas opções...

A situação é seguinte, precisamos executar um concurrent todo último dia do mês e não pode ser sábado ou domingo.

Na minha primeira visão da solução, imaginei o próprio schedule do concurrent, colocando na opção "Em dias específicos", porém, lá só tem a opção de ultimo dia, ele não vai se importar se o dia é sábado ou domingo...

Minha idéia é submeter o concurrent de dentro do meu PL/SQL, pega o último dia do mês seria simples, verificar se é sábado ou domingo também é simples, só não sabia se conseguiria colocar uma data para iniciar a execução do concurrent usando o FND_REQUEST.SUBMIT_REQUEST.

Pra quem não conhece o FND_REQUEST.SUBMIT_REQUEST, ela é um API da Oracle que irá submeter o concurrent do seu PL/SQL... guarda esse nome, que com certeza irá usar algum dia.

Depois de uma pesquisada... descobri um parâmetro do FND_REQUEST.SUBMIT_REQUEST que se coloca a data de execução, é somente preencher o parâmetro START_TIME.

Sempre que utilizava o FND_REQUEST.SUBMIT_REQUEST colocava somente os parâmetros obrigatórios e argumentos, não conhecia o START_TIME.

Assim, a solução ficou simples, montei o meu código da seguinte maneira, peguei o ultimo dia do mês com a query abaixo e verifiquei se é sábado ou domingo:

SELECT DECODE( TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1)),'D')
, '1', TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1))-2,'DD-MON-RRRR ')
, '7', TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1))-1,'DD-MON-RRRR ')
, TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1)),'DD-MON-RRRR ')
) '14:00:00'
INTO v_date_submit
FROM dual;

Com o resultado executei a FND_REQUEST.SUBMIT_REQUEST passando a data que select acima retornou no parâmetro START_TIME.

v_request_id := fnd_request.submit_request( application => 'XXFND' -- Aplicação do concurrent
, program => 'XXCONCURRENT' -- Nome do concurrent
, description => 'Meu Concurrent' -- Descrição do concurrent
, start_time => v_date_submit -- Data de Execução do concurrent
, argument1 => 'S' -- Parâmetro do concurrent
, argument2 => '1060' -- Parâmetro do concurrent
);

Ai é só sair para o abraço!!!!!!

Um exemplo de como o programa ira funcionar: Hoje é dia 30/04/2009, o usuário submete o concurrent. O programa vai fazer todo o processo, buscar o ultima dia do mês seguinte 29/05/2009 e submeter o concurrent para rodar nesta data. Quando chegar no dia 29/05/2009 ele vai fazer processo, buscar o ultima dia do mês seguinte 30/06/2009 e submter o concurrent para rodar nesta data... e assim vai longe... até alguém cancelar o concurrent schedulado.

Espero que a dica acima ajude algum profissional necessitado... heheheheeeeeeeeee



Absss

terça-feira, 5 de maio de 2009

Status de um Concurrent no EBS

Olá pessoal!!! Beleza???

Hoje vou passar uma dica sobre os possíveis status de um concurrent no EBS.

Para saber o status do concurrent você tem que olhar dois campos, o PHASE_CODE e o STATUS_CODE da FND_CONCURRENT_REQUESTS (tabela de execução de concurrent). Olhando os dois campos saberemos qual o status do concurrent.

Esses campos armazenam apenas letras, então, na tabelas abaixo tem o significado de cada letra:

-> PHASE_CODE:


-> STATUS_CODE:


Exemplo: Tenho um concurrent com o ID (REQUEST_ID) número 2612437 e quero saber qual o seu status. Dando um select na tabela de execução de concurrent vai mostrar os nossos dois campos (PHASE_CODE e STATUS_CODE), conforme abaixo


Neste caso, o concurrent foi completado (terminou) com erro.

Abs,

segunda-feira, 27 de abril de 2009

Diferença entre o EXIT e o RETURN

Uma coisinha bem simples e bastante útil é a diferença do EXIT para o RETURN em um LOOP.


  • EXIT = quando passa pelo EXIT ele vai sair do LOOP e continuar o programa... Este comando só pode ser usado dentro de uma condição de LOOP, ele ira forçar a saída do LOOP para continuar a execução do programa.

  • RETURN = quando passa pelo RETURN ele vai finalizar a execução do programa... Seja onde estiver o RETURN o programa será finalizado, se estiver dentro ou fora de um LOOP quando passar por ele vai para o último END e finaliza do programa sem erro.

Um exemplo, libera o output de seu programa editor de PL/SQL e roda o código abaixo com o EXIT e depois troca por RETURN:

Até próxima pessoal!!!!

segunda-feira, 20 de abril de 2009

Lógica para carregar o TRX_DATE da RA_CUSTOMER_TRX_ALL

E ai pessoal, blz???

Uma dica legal que é pouco encontrada na em sites, é qual a lógica do EBS para colocar a data da nota de saída (TRX_DATE da RA_CUSTOMER_TRX_ALL).

Se você acha que sempre é o SYSDATE, tome cuidado!!! Nem sempre é assim... a lógica é simples:

Bom, o primeiro ponto da lógica é simples... se o GL_DATE não estiver nulo é ele...

Se o GL_DATE estiver nulo, ai tem que verificar o se como esta flegado o campo Data de Derivação da nota na tabela de Source (DERIVE_DATE_FLAG da RA_BATCH_SOURCES_ALL):
----> Se for Y e o SHIP_DATE_ACTUAL não estiver nulo, esse é o cara!!!
----> Se for Y e o SHIP_DATE_ACTUAL estiver nulo e o SALES_ORDER_DATE não estiver nulo, então esse é o cara!!!
----> Se for Y, o SHIP_DATE_ACTUAL e o SALES_ORDER_DATE forem nulo é a vez do SYSDATE ser o cara!!!
----> Se for N, o SYSDATE é a data da nota!!!

Pra quem ainda não entendeu nada que disse em português, quem sabe entende algo em "PL/SQLguês"... rs


IF GL_DATE IS NOT NULL THEN
TRX_DATE := GL_DATE;
ELSE

SELECT DERIVE_DATE_FLAG
INTO V_DERIVE_DATE_FLAG
FROM RA_BATCH_SOURCES_ALL
WHERE NAME = 'SOURCE';

IF NVL(V_DERIVE_DATE_FLAG,'N') = 'Y' THEN

IF SHIP_DATE_ACTUAL IS NOT NULL THEN
TRX_DATE := SHIP_DATE_ACTUAL;

ELSIF SALES_ORDER_DATE IS NOT NULL THEN
TRX_DATE := SALES_ORDER_DATE;

ELSE

TRX_DATE := SYSDATE;

END IF;

ELSE

TRX_DATE := SYSDATE;

END IF;

END IF;



Absss

segunda-feira, 13 de abril de 2009

Dicas de Workflow - Parte 2

Olá pessoal,

Muitas vezes quando vamos abrir um Workflow dá erro, e o mais legal disso é que na maioria das vezes este erro não tem nada haver com o nosso Workflow.





O porquê acontece esse erro já não sei, mas sei a solução. Roda os comandos abaixo e pronto! Não dará mais o erro.


update wf_activities_tl
set display_name = rtrim(display_name)
where display_name<>rtrim(display_name)
/
update wf_activities_tl
set description = rtrim(description)
where description<>rtrim(description)
/
commit
/
update wf_item_types_tl
set display_name = rtrim(display_name)
where display_name<>rtrim(display_name)
/
update wf_item_types_tl
set description = rtrim(description)
where description<>rtrim(description)
/
commit



Outra dica legal é pra quando você executa o Workflow e da algum erro no momento de execução, pra pegar esse erro é só rodar a query mágica abaixo passando o ITEM_TYPE e o ITEM_KEY do seu Workflow:


SELECT WPA.PROCESS_NAME
, WPA.ACTIVITY_NAME
, WIAS.BEGIN_DATE
, WIAS.END_DATE
, WIAS.*
FROM WF_ITEM_ACTIVITY_STATUSES WIAS
, WF_PROCESS_ACTIVITIES WPA
WHERE WIAS.PROCESS_ACTIVITY = WPA.INSTANCE_ID
AND WIAS.ITEM_TYPE = 'XXODMAIL'
AND WIAS.ITEM_KEY = '1'



Abs a todos,

terça-feira, 7 de abril de 2009

Dicas de Workflow - Parte 1

Pessoal,

Hoje estou afim de falar sobre Workflow, então vou passar algumas dicas básicas para quem esta começando mexer com essa ferramenta da Oracle que quando funciona é "Lindo Demais", mas como nada é perfeito ela é cheio de bugs.

A primeira dica é onde se cadastra o Workflow no EBS, ou melhor, onde não se cadastra... Estranho isso, né? Quando se navega pela responsabilidade do "Administrador do Workflow" se encontra um monte de Workflow, mas o engraçado disso é que não tem uma tela para cadastrá-los. As informações que aparecem na tela vêm do banco de dados quando se cria um Workflow no "Oracle Workflow Builder".

"Oracle Workflow Builder" é a ferramenta onde se modela e desenha o fluxo do Workflow.

Quando se entra no "Oracle Workflow Builder" e se loga em um banco de dados vai aparecer todos os Workflows associados ao usuário que você logou. Procure sempre fazer isso usando o usuário APPS.

Para disparar ou 'startar' um Workflow geralmente usa uma trigger ou um concurrent, depende da necessidade. Para fazer disparar o seu Workflow é preciso um código PL/SQL simples com apenas dois procedimentos:

- WF_ENGINE.CREATEPROCESS
Esse procedimento serve para criar/associar um ITEM_TYPE (nome interno do Workflow) ao seu processo inicial (um Workflow pode ter vários processos dentro dele) e dar o seu ITEM_KEY (um número de controle, tipo um ID).

- WF_ENGINE.STARTPROCESS
Executa o Workflow que criou com o comando acima.

Exemplo:


DECLARE
ITEM_TYPE VARCHAR2(30);
ITEM_KEY VARCHAR2(240);
BEGIN
ITEM_TYPE := 'XXSENDMAIL';
ITEM_KEY := '10';
WF_ENGINE.CREATEPROCESS(ITEM_TYPE,ITEM_KEY,'XX_SENDMAIL_P');
WF_ENGINE.STARTPROCESS(ITEM_TYPE,ITEM_KEY);
END;


Onde:
- 'XXSENDMAIL' é o ITEM_TYPE.
- '10' é o ITEM_KEY.
- 'XX_SENDMAIL_P' é nome interno do processo inicial do Workflow.

Um procedimento muito usando quando se dispara um Workflow é passar parâmetros para ele, ou melhor, setar seus atributos. Existe apenas uma restrição para setar os atributos do Workflow, só podem setar um atributo se o processo já estiver criado, do resto pode-se seta-lo em qualquer lugar. O comando para setar um atributo é:

WF_ENGINE.SETITEMATTRTEXT(ITEM_TYPE,ITEM_KEY,'XX_FROM_A','RIQUE');

Onde:
- 'XX_FROM_A' é o nome interno do atributo.
- 'RIQUE' é o valor que estou setando o atributo.

Daqui alguns dias passo mais algumas dicas legais de Workflow.


Abs

segunda-feira, 6 de abril de 2009

Criando Conta Contábeis usando API do Oracle

E ai Galera, blz???

Hoje vou passar uma dica bastante simples, vamos ver como criar contas contábeis usando a API do Oracle.

O primeiro passo seria recuperar o CHART_OF_ACCOUNTS_ID, em muitos lugares na net as rotinas de criação de conta estão com o CHART_OF_ACCOUNTS_ID fixo, isso não legal, mesmo sabendo que muitas empresas sempre utilizam o mesmo CHART_OF_ACCOUNTS_ID...

Com a query abaixo estaremos recuperando o CHART_OF_ACCOUNTS_ID que esta associada ao livro contábil da responsabilidade.


SELECT DISTINCT chart_of_accounts_id
INTO v_chart_of_accounts_id
FROM gl_access_sets
WHERE access_set_id = fnd_profile.value('GL_ACCESS_SET_ID');


Agora usaremos a função FND_FLEX_EXT.GET_CCID para criar a conta contábil e retornar o ID da combinação contábil criada (CODE_COMBINATION_ID). Essa função é tão boa que ela mesma verifica se a conta contábil que esta tentando criar já existe criada, se existir craida ela apenas retorna o ID da conta contábil... Ela é foda!!!!

Se a função retornar 0, é porque deu algum na criação da conta contábil. Na maioria dos problemas é a regra de validação que não deixa criar a conta.


v_new_conta := FND_FLEX_EXT.GET_CCID('SQLGL'
,'GL#'
,v_chart_of_accounts_id
,TO_CHAR(SYSDATE, fnd_flex_ext.date_format)
,'SEGMENT1.SEGMENT2.SEGMENT3.SEGMENT4.SEGMENT5.SEGMENT6.SEGMENT7');

IF v_new_conta = 0 THEN -- ERRO NA CRIACAO DA CONTA CONTABIL
RAISE_APPLICATION_ERROR(-20000,'Não foi possível criar a combinação contábil!!!'fnd_message.get);
END IF;


Para verificar a conta criada é olhar a GL_CODE_COMBINATIONS.


SELECT *
FROM gl_code_combinations
WHERE code_combination_id = v_new_conta


Abraços a todos



sexta-feira, 3 de abril de 2009

Comando POWER, cálculo com potência

Um comandinho pouco usado, mas de extrema importância é POWER, ele faz o calculo de potência, pra que não se lembra das aulas de matemática vou dar uma explicaçãozinha...

Lembra qdo falava de um numero elevado a outro? Tipo 2 elevado a 3 (2³)? Então, o resultado desta potência é 2X2X2 = 8, em poucas palavras, o segundo número e a quantidade de vezes que irá se repetir o primeiro número.

2 é a base
3 é o expoente
8 é a potencia


SELECT POWER(2,3) RESULTADO
FROM DUAL


RESULTADO
---------
8


Esse comando é bastante usado em cálculos financeiros, de matemática e física, como de juros, energia cinética, potencia elétrica, etc


Depois dessa só tenho que agradecer minha ex-professora de matemática, valeu Maria Cândida!!!!



Flw

quinta-feira, 2 de abril de 2009

Visualizar o conteúdo de um campo do tipo CLOB

E ai galera!!!! Blz????

Uma postagem rápida hoje... caso alguém precisar ver o conteúdo de um campo CLOB e o seu software de consulta ao banco não funciona direito com esse tipo, segue um comandinho básico para ver o conteúdo destes campos.

SELECT DBMS_LOB.SUBSTR( notes_detail, 5000, 1 )
FROM ap_notes
WHERE 1 = 1

O campo 'notes_detail' da tabela 'ap_notes' é do tipo CLOB, e a função DBMS_LOB.SUBSTR mostra o seu conteúdo.


Abs

segunda-feira, 30 de março de 2009

Rotina para enviar e-mail em PL/SQL sem o servidor SMTP fixo

E ai galera.... bem vindos ao meu blog....

Esse blog tem a finalidade de ajudar os profissionais do mundo Oracle, principalmente os desenvolvedores EBS.

Minha primeira postagem é um problema que acredito que a maioria das pessoas que tenha uma rotina feita em PL/SQL para mandar e-mail tem...

Se você quer uma rotina de mandar e-mail no Oracle usando PL/SQL é muito fácil de encontrar no Google, vai trazer um monte.... mas praticamente todas tem o mesmo problema.... praticamente todas as rotinas estão com o servidor SMTP fixo, um maldito Hard Code!!!! rs... Ai qdo aquele carinha resolve mudar o servidor SMPT ou alterar o nome dele, o desenvolver tem que alterar o código....

Depois de alguns pesquisas no Google, no Metalink, em telas do EBS e em tabelas do EBS montei a seguinte query:
-- Busca servidor SMTP
BEGIN
SELECT a.parameter_value
INTO v_smtp_server
FROM fnd_svc_comp_param_vals a
, fnd_svc_components b
, fnd_svc_comp_params_b c
WHERE b.component_id = a.component_id
AND b.component_type = c.component_type
AND c.parameter_id = a.parameter_id
AND b.component_name LIKE '%Mailer%'
AND c.parameter_name = 'OUTBOUND_SERVER'
AND c.encrypted_flag = 'N';
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20000,'Erro ao buscar servidor SMTP - 'SQLERRM);
END;
Essa query esta buscando o servidor SMTP que o Workflow utiliza.

Ai vc pode pensar, mas continua com Hard Code.... bom, tecnicamente sim..... teoricamente não....

O COMPONENT_NAME é o nome dos serviços do Workflow que esta suas configurações e o OUTBOUND_SERVER é o nome da propriedade que esta o servidor do SMTP do Workflow.

Se você precisar alterar o servidor SMTP não será necessário alterar o programa, basta entrar no caminho abaixo do Oracle EBS, geralmente quem faz essa alteração é o DBA:

- Responsabilidade: Administrador de Sistemas
- Workflow
- Service Components
- Workflow Notification Mailer ( Aqui já mostra qual o servidor SMPT)
- Para alterar clicar no botão Edit

A porta por default é a 25.

Isso tudo foi testado usando o Oracle EBS R12 e banco 10.2.0.3.0

Mais uma coisa, desculpa se tiver algum erro de ortografia.... é que o SQL Navigator não tem corretor ortográfico.... heheheheheheeeeeeeee


Abs a todos,