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