Array Global

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Ju
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 24
Registrado em: Qui, 29 Mai 2008 5:21 pm
Localização: sc

como declarar um array global. E como utiliza-lo dentro do forms.

Obrigado. :D
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

É possível declarar variáveis dentro de um PACKAGE SPEC.
Daí essa variável pode ser visível durante toda a sessão. (não é bem "global", mas uma "global por sessão")

Talvez essa informação ajude.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Ju, vou postar aqui um exemplo onde gosto de trabalhar com esse tipo de funcionalidade....

Criação do array global da sessão

Selecionar tudo

PACKAGE pkg_array IS

/* um Cursor é necessário para criar a "Table Of Cursor%ROWTYPE", mesmo que não seja usado, pois o tipo a ser criado deve se basear em uma tabela ou um cursor*/

  CURSOR cArray IS
       SELECT coluna
          FROM owner.tabela;
 
-->> Tipo: Coleção de registros
  TYPE tArray Is Table Of cArray%Rowtype index by binary_integer;
-->> Variável do tipo coleção
  vArray tArray;
 
/*Variável para os valores do cursor (não se pode atribuir diretamente um registro do cursor à variável da coleção)*/

  vRec cArray%rowtype;
  -->> índice do array
  i integer;

END;
Trabalhando com o Array no Forms

Selecionar tudo

/*Verificando os elementos armazenados se é maior que zero*/
IF nvl(pkg_array.vArray.count,0) > 0 THEN
  /*Varre o array todo*/
    FOR j IN 1..nvl(pkg_array.varray.last,0) LOOP
  /*compara o valor do array de acordo com o indice e checa se é verdadeiro*/
    IF pkg_Array.vArray(j).coluna = ValorTeste THEN
    /*Se passou na condição, execute algo desejado*/
      Rotina desejada;
    END IF;
  END LOOP;
END IF;
Lembre que sempre que tabalha com array de memoria, é necessário limpar a memoria ou, no decorrer do dia, a maquina terá sua memoria cada vez mais utilizada até travar geral...

Rotina para limpar o array (memoria)

Selecionar tudo

PROCEDURE Limpa_Pkg_Array IS
BEGIN
  FOR j IN 1..nvl(PKG_ARRAY.vArray.last,0) LOOP
/*Compara o código do aviso de cirurgia com o aviso de cirurgia do cursor*/
    pkg_array.vrray.delete(j);
  END LOOP;
/*Fim do Loop para verificar os agendamentos localizados*/
END;
Joga essa procedure de limpa array quando você ver que não vai mais utilizar os valores em memoria...

Espero ter ajudado...
mprocha
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Sex, 11 Jul 2008 11:14 am
Localização: Campinas - SP
Marcos Pinheiro da Rocha
Desenvolvedor Java/Forms/PL-SQL

Só complementando ....

"Valores de um mesmo Array compartilhado por dois FORMS diferentes":

- você pode criar esta package com o array em uma PLL , depois você atacha essa PLL em dois forms, form1 e no form2 ...
- daí ao executar o FORM1, popule o array e chame o form2 com o comando CALL_FORM passando o parametro SHARE_LIBRARY_DATA.
- Após abrir o form2, ele vai visualizar todos os dados do array populados no form1 e ainda poderá inserir ou alterar nesse mesmo array, e quando fechar o form2 você vai ver que o form1 irá enchegar tambem todos os dados alterados no form2.
- com isso você deixa o array global a nivel de sistema sem precisar criar a package no banco.
- porém, se suas rotinas de banco precisarem ler esse array, então você tem que criar esse array em uma package no Banco, para que elas possam enchergar

espero ter sido claro para ajudar
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes