LogLoader – printlogs

Outro utilitário interessante no application server control é o printlogs, que podemos com ele consultar e mostrar o conteúdo do repositório de logs do application server control. Assim, podemos até mesmo carrega-lo através de scripts para que de tempos em tempos o monitoramento seja automatizado. O Log Viewer está presente na interface html do application server control, onde voce poderá acessa-lo para que assim, você consiga visualizar os ultimos logs mais recentes encontrados nas suas aplicacoes ou processos do servidor.

Visor da Topologia do Applicaton Server Control

Localizado no gerenciador do servidor de aplicação, o gerenciador de topologia é uma ferramenta gráfica que nos auxilia uma visão em tempo real dos processos gerenciados pelo OPMN, e ainda nos habilita gerencia-los. Assim, temos a versão em html puro, e utilizando java applet. Quando acessamos o visor da topologia, podemos ter uma visão clara de todos os componentes do servidor de aplicação. Para acessa-lo, clique no link superior que aparece logo em que você entra no application server control. Clique logo em seguida em preferences, para selecionar entre a opção de visualizar a topologia em html ou java Applet. Clique em Apply. Com o Visualizador da topologia podemos iniciar, interromper os processos do application server. Monitorar o performance os componentes através do ambiente, e ainda consegue pegar o ID do processo no sistema operacional.

Customizar login Oracle Portal

Existe um documento no metalink, do qual podemos criar uma aplicacao toda apropriada para que o login fique customizado. Para nao perder tempo com isso, alteramos o codigo fonte original do SSO.

/oracle/product/as/inf1014/j2ee/OC4J_SECURITY/applications/sso/web/pages

Paginas: login.jsp header.jsp footer.jsp error.jsp logout.jsp

Somente alterar estes arquivos, lembrar de fazer um backup.

retornar o link da pagina no Oracle Portal

Isso foi dificil de fazer, ate mesmo porque nao se encontram exemplos dentro da documentacao da oracle, eu acabei encontrando em uma pagina do portal que retornou o erro com essa consulta de brinde.

Retornar a URL a partir das tabelas do portal.

Fazer o login primeiro para a consulta funcionar.

begin
portal.wwctx_api.set_context(‘andre.rocha’, ‘cds123’);
end;

select * from (
SELECT caid,
id,
display_name,
— SYS_CONNECT_BY_PATH(a.DISPLAY_NAME),
SYS_CONNECT_BY_PATH(a.CAID || ‘,’ || a.ID || ‘,’ || a.NAME,’;’) as path,
level,
replace(SYS_CONNECT_BY_PATH(‘/’ || a.NAME, ‘;’), ‘;’, null) as URL
FROM Portal.wwsbr_all_folders a
WHERE
a.CAID = P_PGGROUPID
AND a.LANGUAGE = Portal.wwctx_api.get_nls_language()
AND a.TYPE_ID in (SELECT DISTINCT
tp.id
FROM Portal.wwsbr_folder_types tp
WHERE tp.NAME NOT IN (‘categoryperspectivepage’, ‘nav’, ‘search’, ‘tab’))
START WITH a.PARENT_ID = 1
CONNECT BY PRIOR a.ID = a.PARENT_ID
AND PRIOR a.CAID = a.CAID
AND PRIOR a.LANGUAGE = a.LANGUAGE) a, portal.WWSBR_ALL_CONTENT_AREAS b
WHERE a.caid = b.id
AND a.id = P_PAGE_ID;

logicamente, remova os parametros ou substituia o P_PAGE_ID..

Busca customizada no Oracle PORTAL

Link da documentacao:
http://www.oracle.com/technology/products/ias/portal/html/plsqldoc/pldoc1014/wwsrc_api.html

Temos uma funcao para efetuar uns testes:

create or replace procedure search_results(searchterm varchar2, score number) as
x varchar2(100);
y number;
l_results wwsrc_api.items_result_array_type;
l_count number;
l_scores wwsrc_api.number_list_type;
begin
x := searchterm;
y := score;
l_results := wwsrc_api.item_search(
p_mainsearch => x,
p_out_count => l_count,
p_out_scores => l_scores
);
htp.p(‘Number of total hits: ‘ || l_count);

htp.p(‘resultado : ‘ || l_results.count);
htp.p(‘resultado : ‘ || l_results(1).url);
htp.p(‘resultado : ‘ || l_results(2).url) ;

htp.p(‘
‘);

htp.p(‘
‘);

for i in 1..l_results.count loop
— if (l_scores(i) > y) then
htp.p(‘‘ || i || ‘
‘”>’ || l_results(i).display_name || ‘
‘);

htp.p(‘
‘);

htp.p(‘score = ‘ || l_scores(i));
htp.p(‘
‘);

— end if;
end loop;
exception when others then
null;
end;

Mas ai tive que dar uma melhorada e criei a funcao:

CREATE OR REPLACE PROCEDURE PESQUISA(p_ATTRIBUTE_TEXT varchar2,
P_TEMA varchar2,
P_ASSUNTO varchar2,
P_AUTOR varchar2,
P_DAT_INI DATE,
P_DAT_FIM DATE,

P_TIPOTERMO VARCHAR2 default ‘ANY’)

is
/*

FALTA VALIDAR SE O ITEM FOI APROVADOR
e PUBLICADO….

Limitar a pesquisa a 3 caracteres e no maximo 128 caracteres.

*/

l_results wwsrc_api.items_result_array_type;
l_count number;
l_scores wwsrc_api.number_list_type;
l_attributes wwsrc_runtime_attr_varray;
l_pggroups wwsrc_api.number_list_type;

v_contador number default 1;
v_databusca date;

v_sqldinamico varchar2(4000);

type tpCursor is REF CURSOR;

cCursor tpCursor;
v_sql varchar2(4000) default v_sqldinamico;

— Mostrar na tela retorno do cursor.

v_tema portal.WWSBR_ALL_CATEGORIES.display_name%TYPE;
v_temaanterior portal.WWSBR_ALL_CATEGORIES.display_name%TYPE;

v_assunto portal.WWSBR_ALL_CATEGORIES.display_name%TYPE;
v_titulo portal.WWSBR_ALL_CATEGORIES.display_name%type;
v_DATADEPUBLICACAO date;
v_urlpage varchar2(4000);
v_descricao varchar2(4000);
v_tipotermo varchar2(4000);
v_nome varchar2(4000);

— solucao temporaria
v_pgname portal.WWSBR_ALL_CONTENT_AREAS.name%TYPE;

begin

— Verificar se foram designados parametros.

if length(NVL(p_ATTRIBUTE_TEXT, ”) )
length(p_ATTRIBUTE_TEXT ) >= 128 then
htp.print(‘Refaça a pesquisa. Informe acima de 3 caracteres e no maximo 128 caracteres para a busca.’);
else

— Se foram passados parametros
— entao estaremos
— com os parametros para informar na busca.

if p_tipotermo = ‘ANY’ then
v_tipotermo := portal.wwsrc_api.CONTAINS_ANY;
elsif p_tipotermo = ‘ALL’ then
v_tipotermo := portal.wwsrc_api.CONTAINS_ALL;

elsif p_tipotermo = ‘TO’ then
v_tipotermo := portal.wwsrc_api.EQUALS_TO;
end if;

— Build up attribute object with author criteria.

— Quais os page groups para a busca? OU quais os portais…

l_pggroups(1) := 813; –813– Portal Publico
— l_pggroups(2) := 833; — Portal Publico


— Para pegar o nome do portal DEFAULT
— vou pesquisar o nome para passar como parametro fixo
— Visto que a consulta somente retorna os itens da pagina LIB
— chamado aberto com a oracle para resolver.

select name
into v_pgname
from portal.WWSBR_ALL_CONTENT_AREAS
where portal.WWSBR_ALL_CONTENT_AREAS.id = 813;


if p_ATTRIBUTE_TEXT is not null then
portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_KEYWORDS,
p_value => p_ATTRIBUTE_TEXT,
p_operator => v_tipotermo,
p_in_out_attr_varray => l_attributes);

portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_TITLE,
p_value => p_ATTRIBUTE_TEXT,
p_operator => v_tipotermo,
p_in_out_attr_varray => l_attributes);

portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_URL,
p_value => p_ATTRIBUTE_TEXT,
p_operator => v_tipotermo,
p_in_out_attr_varray => l_attributes);
end if;


— Primeiro tentar converter o texto de procura para a data inicial

if P_DAT_INI is not null then

begin
v_databusca := to_char(p_ATTRIBUTE_TEXT, ‘DD-MON-RRRR’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(p_ATTRIBUTE_TEXT, ‘DDMMYYYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(p_ATTRIBUTE_TEXT, ‘DDMMYYYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(p_ATTRIBUTE_TEXT, ‘DDMMYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(p_ATTRIBUTE_TEXT, ‘DDMMYY’);
exception
when others then
v_databusca := null;
end;

end if;


— Tentar converter o formato da data INICIAL

if P_DAT_INI is not null then

begin
v_databusca := to_char(P_DAT_INI, ‘DD-MON-RRRR’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_INI, ‘DDMMYYYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_INI, ‘DDMMYYYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_INI, ‘DDMMYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_INI, ‘DDMMYY’);
exception
when others then
v_databusca := null;
end;

end if;

if v_databusca is not null then
dbms_session.set_nls(‘NLS_DATE_FORMAT’, ”’DD-MON-RRRR”’);
portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_PUBLISHDATE, –portal.wwsbr_api.
p_value => v_databusca,
p_operator => portal.wwsrc_api.GREATER_THAN,
p_in_out_attr_varray => l_attributes);

end if;



— Colocar a validacao da data final


if P_DAT_FIM is not null then

begin
v_databusca := to_char(P_DAT_FIM, ‘DD-MON-RRRR’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_FIM, ‘DDMMYYYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_FIM, ‘DDMMYYYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_FIM, ‘DDMMYY’);
exception
when others then
v_databusca := null;
end;

begin
v_databusca := to_char(P_DAT_FIM, ‘DDMMYY’);
exception
when others then
v_databusca := null;
end;

end if;

if P_DAT_FIM is not null then
v_databusca := to_char(P_DAT_INI, ‘DD-MON-RRRR’);
portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_PUBLISHDATE, –portal.wwsbr_api.
p_value => v_databusca,
p_operator => portal.wwsrc_api.LESS_THAN,
p_in_out_attr_varray => l_attributes);
end if;


— Filtrar pelo AUTOR

if P_AUTOR is not null then
portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_AUTHOR, –portal.wwsbr_api.
p_value => P_AUTOR,
p_operator => v_tipotermo,
p_in_out_attr_varray => l_attributes);
end if;


— Filtrar pelo TEMA

if P_TEMA is not null then

portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_CATEGORY,
p_value => P_TEMA,
p_operator => v_tipotermo,
p_in_out_attr_varray => l_attributes);
end if;


— Filtrar pelo ASSUNTO

if P_ASSUNTO is not null then

portal.wwsrc_api.specify_attributes(p_id => portal.wwsbr_api.ATTRIBUTE_CATEGORY,
p_value => P_ASSUNTO,
p_operator => v_tipotermo,
p_in_out_attr_varray => l_attributes);
end if;

— The search needs to be performed by a User in the Portal
— The is the Portal UI password for the portal user.
— portal.wwctx_api.set_context(‘portal’, ‘senha’);
— Perform the search.
portal.wwctx_api.set_context(‘andre.rocha’, ‘senha’);

begin

l_results := portal.wwsrc_api.item_search(p_page_groups => l_pggroups, –p_mainsearch => ‘portalpublicodl’,
p_attributes => l_attributes,
p_attributesmatch => v_tipotermo,
p_out_count => l_count,
p_out_scores => l_scores);

exception
when others then
htp.print(‘Erro na pesquisa. Favor contactar o analista responsável. Erro: ‘ || sqlerrm);
end;
— dbms_output.put_line(‘Number of results: ‘ || l_count);

v_sqldinamico := null;
for i in 1 .. l_results.count loop

— Preencher dados do ID do item para que eu possa retornar a pagina.

— Mostrar os IDs

— htp.print(‘ FOLDER_ID ‘ || l_results(i).FOLDER_ID);
— htp.print(‘ CAID ‘ || l_results(i).CAID);

if v_sqldinamico is null then
v_sqldinamico := ‘(‘ || l_results(i).id;
if i = l_results.count then
v_sqldinamico := v_sqldinamico || ‘) ‘;
end if;
else

if i = l_results.count then
v_sqldinamico := v_sqldinamico || ‘,’ || l_results(i).id || ‘) ‘;
else
v_sqldinamico := v_sqldinamico || ‘,’ || l_results(i).id;
end if;

end if;

end loop;


— Mostrar os ids de pesquisa


–htp.print(v_sqldinamico);

if nvl(l_results.count, 0) > 0 then

— agora filtrar tb a categoria com os itens e paginas.
— Montar esta consulta dinamica para conseguir
— listar ASSUNTO x TEMA x resultados.

v_sql := ‘ ‘;

v_sql := v_sql ||
‘ select rownum linha, substr(categoria.descricao, ‘;
v_sql := v_sql || ‘1, ‘;
v_sql := v_sql || ‘ decode(instr(categoria.descricao, ‘ || ”” || ‘-‘ || ”” ||
‘ ), ‘;
v_sql := v_sql || ‘ 0,’;
v_sql := v_sql || ‘ 100,’;
v_sql := v_sql || ‘ instr(categoria.descricao, ‘ || ”” || ‘-‘ || ”” ||
‘) – 2)) tema,’;
v_sql := v_sql || ‘ categoria.descricao assunto,’;
v_sql := v_sql || ‘ a.display_name titulo,’;
v_sql := v_sql || ‘ a.name nome,’;

v_sql := v_sql || ‘ case’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basefile’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘baseimage’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘baseimagemap’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” ||
‘baseloginlogout’ || ”” || ‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basemaplink’ || ”” ||
‘ then ‘;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basepagelink’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basepagepath’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘baseplsql’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘baseportallink’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” ||
‘baseportletinstance’ || ”” || ‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basesearch’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v
_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basesmarttext’ || ”” ||

‘ then’;
— v_sql := v_sql ||
— ‘ bhtrans_publico.FRETORNAURLPAGE(substr(a.text, 1, 350), pgs.id, pg.name)’;
v_sql := v_sql ||
‘ bhtrans_publico.FRETORNAURL(substr(a.text, 1, 350), FRETORNAPGIDPUBLICA(a.id,’ ||
l_pggroups(1) || ‘), ‘ || ”” || v_pgname || ”” || ‘) ‘;

v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basetab’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url’;
v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘basetext’ || ”” ||
‘ then’;
v_sql := v_sql ||
‘ bhtrans_publico.FRETORNAURL(substr(a.text, 1, 350), FRETORNAPGIDPUBLICA(a.id,’ ||
l_pggroups(1) || ‘), ‘ || ”” || v_pgname || ”” || ‘) ‘;
— ‘ bhtrans_publico.FRETORNAURLPAGE(substr(a.text, 1, 350), pgs.id, pg.name)’;

v_sql := v_sql || ‘ when a.ITEMTYPE = ‘ || ”” || ‘baseurl’ || ”” ||
‘ then’;
v_sql := v_sql || ‘ a.url ‘;
v_sql := v_sql || ‘ end DESCRICAO,’;


— TEMPORARIA
— Solucao para retornar a pagina do portal PUBLICO
— e nao a do portal LIB

— v_sql := v_sql ||
— ‘ a.publish_date DATADEPUBLICACAO, bhtrans_publico.FRETORNAURLPAGE(substr(a.text, 1, 100), pgs.id, pg.name) URLPAGE ‘;

v_sql := v_sql ||
‘ a.publish_date DATADEPUBLICACAO, bhtrans_publico.FRETORNAURL(substr(a.text, 1, 100), FRETORNAPGIDPUBLICA(a.id,’ ||
l_pggroups(1) || ‘), ‘ || ”” || v_pgname || ”” ||
‘) URLPAGE ‘;

v_sql := v_sql || ‘ from portal.wwsbr_all_items a,’;
v_sql := v_sql || ‘ portal.WWSBR_ALL_CONTENT_AREAS pg,’;
v_sql := v_sql || ‘ portal.wwsbr_user_folders pgs,’;
v_sql := v_sql || ‘ (select c.id,’;
v_sql := v_sql || ‘ substr(replace(SYS_CONNECT_BY_PATH(‘ || ”” || ‘ ‘ || ”” ||
‘ || c.display_name,’;
v_sql := v_sql || ‘ ‘ || ”” ||
‘; -‘ || ”” || ‘),’;
v_sql := v_sql || ‘ ‘ || ”” || ‘;’ || ”” || ‘,’;
v_sql := v_sql || ‘ null),’;
v_sql := v_sql || ‘ 4) as descricao ‘;
v_sql := v_sql || ‘ from portal.WWSBR_ALL_CATEGORIES c ‘;
v_sql := v_sql ||
‘ where c.language = Portal.wwctx_api.get_nls_language()’ ||
‘ and c.id in ‘ ||
‘ (select distinct x.category_id
from portal.wwsbr_all_items x
where x.id in ‘ || v_sqldinamico || ‘)’;

v_sql := v_sql || ‘ start with c.PARENTID = 0’;
v_sql := v_sql || ‘ connect by prior c.ID = c.PARENTID’;
v_sql := v_sql || ‘ and prior c.CAID = c.CAID’;
v_sql := v_sql || ‘ and prior c.language = c.language’ ||
‘ ) categoria,’;
v_sql := v_sql || ‘ portal.WWSBR_ALL_CATEGORIES d ‘;
v_sql := v_sql || ‘ where a.category_id = categoria.id’;
v_sql := v_sql ||
‘ and a.language = Portal.wwctx_api.get_nls_language()’;
v_sql := v_sql || ‘ and a.caid = pg.id’;
v_sql := v_sql || ‘ and a.caid = pgs.caid’;
v_sql := v_sql || ‘ and pgs.caid = pg.id’;
v_sql := v_sql || ‘ and a.FOLDER_ID = pgs.id’;
v_sql := v_sql || ‘ and a.active = 1’;
v_sql := v_sql || ‘ and a.is_current_version = 1’;

v_sql := v_sql || ‘ and a.category_id = d.id’;
v_sql := v_sql || ‘ and a.id in ‘ || v_sqldinamico;

v_sql := v_sql || ‘ order by 2, 3 ‘;

–htp.print(‘CONSULTA: ‘ || v_SQL);

open cCursor for v_SQL;

— Mostrar o SQL pronto
htp.print(‘CONSULTA: ‘ || v_SQL);

v_temaanterior := ‘ ‘;
loop

fetch cCursor
into v_contador, v_tema, v_assunto, v_titulo,v_nome, v_descricao, v_DATADEPUBLICACAO, v_urlpage;

exit when cCursor%notfound;
if v_urlpage is null then

if v_temaanterior v_tema then
v_temaanterior := v_tema;
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

CATEGORIA: ‘ || v_tema || ‘

‘);
end if;

htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);

— v_returnurl:= ‘‘ || v_returnurl || ‘‘;


htp.print(‘

‘);
htp.print(‘

‘);

htp.print(‘

‘);
htp.print(‘

‘);



htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);

htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘);
htp.print(‘

‘ || v_contador || ‘ – ‘ || nvl(v_titulo,v_nome) || ‘

‘ || FRETORNANEGRITO(v_descricao, trim(p_ATTRIBUTE_TEXT))|| ‘

‘);
htp.print(‘

Publicado em ‘ ||
to_char(v_DATADEPUBLICACAO, ‘DD/MM/YYYY’) || ‘

‘);

end if;
— DBMS_OUTPUT.PUT_LINE(trim(v_tema));

end loop;

close cCursor;

else
htp.print(‘Não foram encontrados registros em sua busca, favor especifique novos valores.’);

end if;
end if;

exception
when others then
htp.print(‘Error in Search Execution!’);
dbms_output.put_line(‘Error in Search Execution!’);
dbms_output.put_line(sqlerrm);

end;

Consultar se os indices estao na tablespace correta

Precisei de uma consulta pra ver se estava com as tabelas na tablespace de dados, indices na tablespace de indice … E ai o que eu fiz ? Fiz logicamente a consulta que me veio a cabeca:

Fui na dba_tables e verifiquei a tablespace … ai peguei essa consulta que foi muito melhor:

select owner, segment_name,segment_type from dba_segmentswhere tablespace_name=’INDXL’ and segment_type ‘INDEX’;

Onde INDXL e a minha tablespace de indices. Depois fiz o mesmo para os dados …

Curso Forms 10G Move to WEB

Ministrei o curso do forms 10G onde usamos a infra estrutura completa da oracle: Aplication server, com Oracle Forms e Reports e o Portal e Java. Bom a principio, sou meio suspeito gosto muito das aplicacoes desenvolvidas com o forms e reports e digo que quem participou gostou bastante. Muita novidade junta as vezes pode confundir, principalmente porque mistura infra estrutura com desenvolvimento. A turma estava bem dividida: Pessoal da infra com muito pouca instrucao no forms e reports, desenvolvedores forms 3 (sem nunca terem trabalhado na interface grafica do forms) e outros ja com experiencia no forms 6i. No geral, gostei de todos os alunos e aproveitei pra ir na Sta efigenia umas duas vezes onde eu sempre chegava tarde e nao dava pra comprar nada, la somente vi o preco do XBOX360, e comprei um pen drive de 4GB.

Pra quem nunca viu Portal, Java, Enterprise Manager, Servidor de aplicacao o curso adicionou varias informacoes uteis.

Bom a migracao e vista de varios aspectos, usando desde linha de comando, a conversao mano a mano. O legal que mostra sempre algumas facetas interessantes que mesmo no forms 10G no dia a dia agente nao utiliza no desenvolvimento mas que estao disponiveis para o uso do pessoal da Infra. Assim que possivel colocarei algumas das dicas dos manuais aqui para referencia.

O Treinamento foi na SeedTs tem uma otima estrutura com salas bem equipadas.