é possível incrementar um contador no List???

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

galera, tava pensando aqui, tenho uma tela com um list, é possível utilizar esse list e incrementar um valor numa linha, sem que ele adicione uma nova?

dentro do loop eu fiz assim:

Selecionar tudo

vn_cont := vn_cont + 1;

--está, td bem, o próprio nome já diz que vai ADDicionar, mas tem como 'editar'?
Add_List_Element('b01.lc_1', 1, 'Efetuando importação...','%');
Add_List_Element('b01.lc_1', 2, '=======================','%');
Add_List_Element('b01.lc_1', 3, 'Registros: ' || vn_cont ,'%');
SYNCHRONIZE;
tentei dessa forma, mas ele acrescenta novas linhas, mesmo o índice estando fixo (1,2,3)!

isso é feito na importação de um arquivo texto, ou seja, a cada linha lida, eu incremento o contador e exibo no list mesmo, pro usuário ver que o processo está sendo feito, já que o arquivo pode ter tipo, 70 mil linhas como é meu caso


eu poderia fazer isso utilizando labels na tela e tals, mas acho que ficaria legal mostrar esse status num list

mas se for impossível, paciência...
valeu
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

ops, esqueci de colocar o loop

Selecionar tudo

LOOP

  vn_cont := vn_cont + 1;

  --está, td bem, o próprio nome já diz que vai ADDicionar, mas tem como 'editar'?
  Add_List_Element('b01.lc_1', 1, 'Efetuando importação...','%');
  Add_List_Element('b01.lc_1', 2, '=======================','%');
  Add_List_Element('b01.lc_1', 3, 'Registros: ' || vn_cont ,'%');
  SYNCHRONIZE; 

END LOOP;
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E ai Porva, beleza??

cara eu desconheço essa opção, mas e se você tentar excluir o item e criá-lo novamente, por exemplo :

Selecionar tudo

delete_List_Element('b01.lc_1', 2); 
Add_List_Element('b01.lc_1', 2, '--------------------','%'); 
[]'s
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

tenta adicionar o CLEAR_LIST

Selecionar tudo

LOOP 
  vn_cont := vn_cont + 1; 
  CLEAR_LIST('b01.lc_1');
  Add_List_Element('b01.lc_1', 1, 'Efetuando importação...','%'); 
  Add_List_Element('b01.lc_1', 2, '=======================','%'); 
  Add_List_Element('b01.lc_1', 3, 'Registros: ' || vn_cont ,'%'); 
  SYNCHRONIZE; 

END LOOP;
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

humm, é vero!

e vocês acham que esse tipo de coisa pode influênciar no desempenho?!

acho que sim né, já que ele fará milhares de chamadas a função Clear List/Add List!

será que compensa só pelo efeito estético, o que vocês com mais experiência aí acham?
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

então, referente a desempenho acredito que não influencie não, mas esteticamente talves, se seu contador estiver dentro de uma rotina de leitura muito rapida, onde o contador será incrementado muito rápido talvés de a impressao que a tela esteja piscando, ou o list esteja piscando... mas faz um teste ai e depois fala pra nós..

[]'s
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

eu não colocaria num item list...

colocaria em um item display mesmo...

dai não precisa fikar limpando elementos, e sim atribuir diretamente o valor pra o campo...


acho q nesse caso o synchronize vai pezar muito no client...


o que você pode fazer é mostrar por exemplo de 550 em 550 registros

Selecionar tudo

LOOP 
  vn_cont := vn_cont + 1; 
  if mod(vn_cont,550) = 0 then
    CLEAR_LIST('b01.lc_1'); 
    Add_List_Element('b01.lc_1', 1, 'Efetuando importação...','%'); 
    Add_List_Element('b01.lc_1', 2, '=======================','%'); 
    Add_List_Element('b01.lc_1', 3, 'Registros: ' || vn_cont ,'%'); 
    SYNCHRONIZE; 
  end if;
END LOOP; 
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Uma idéia bacana, aproveitando o q nosso amigo rodfbar disse, seria você não apresentar a quantidade de registros, mas sim a porcentagem de leitura, ex: 5%, 10%, 15%...
o unico problema é que antes da leitura você precisa saber a qtde total de linhas no seu arquivo...

[]'s
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

antes eu fazia desta forma... colocava ate aquela famosa barra de progresso.... depois que eu tirei que vi a diferença de desenpenho...


ele disse que o arquivo dele tem 70.000 linhas.... é muito grande para varrer ele todo....

eu não faria com porcentagem não... experiencia propria
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

então, depois de pensar um pouco, e ver a opinião de vocês, optei por fazer o contador apenas num Display Item mesmo, o que eu queria na verdade, era utilizar um mecanismo pra mostrar pro usuário que o processo está sendo feito, com o menor custo possível

já que ele pode achar que o programa está travado e ficar clicando na tela, aí sim o Forms vai travar mesmo!

a idéia é deixar o cursor como ampulheta no decorrer do processor e ir apenas incrementando o Display, mesmo que ele fique piscando, não tem problema (ou posso fazer uma rotina pra incrementar de N em N registros tb como foi sugerido)

talvez seja o mais viável para o caso né?
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Acho q a ideia do Rodfbar foi legal sim.. e com certeza não vai pesar não.

[]'s!
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Galera, está ficando bom o negócio aqui

mas aproveitando o mesmo tópico pra não ter que criar um novo..

é o seguinte, nesse mesmo caso do meu arquivão texto, eu quero fazer uma validação de layout para não permitir ao usuário, importar um outro arq texto que não tenha nada a ver

a dúvida é a seguinte, dá pra fazer a atribuíção da linha do arquivo a variável, mas pode 'voltar' a esse linha depois pra processar dentro do loop?

Selecionar tudo

LOOP
  Text_IO.Get_Line(ArqTxt, você_linha); --Atribui a linha do arquivo, à variável
END LOOP;
explico, como o arquivo é muito grande, eu não queria fazer a validação a cada iteração do loop, fazer apenas uma vez só, na primeira linha, e antes de entrar no loop, mas se eu usar o Text_IO.Get_Line ele já irá pra próxima posição, e minha leitura dentro do loop começará a partir da segunda linha, e isso não é certo!

ficou meio embolado a explicação, mas qualquer coisa eu tento explicar mais claramente :S

dá pra solucionar isso?
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

ah, só pra complementar, eu até pensei em atribuir o arquivo texto para uma outra variável, auxiliar no caso, só pra fazer essa verificação, mas como já falei, esse arquivo tem mais de 8 mb! imagino que não seria legal atribuir o mesmo arquivo em DUAS variáveis só pra fazer esse teste em uma linha! (na primeira no caso)
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Porva,

Você não poderia apenas mover a leitura da linha para depois do processamento?
Ex.:

Selecionar tudo

declare
  v varchar2(100);
  arquivo text_io.file_type;
  ... 
  -- declara demais variáveis
  ...
begin
  ... 
  -- abre o arquivo
  ...
  text_io.get_line(arquivo, v);
  ...
  -- validar o formato do arquivo
  ...
  loop
    begin
      text_io.get_line(arquivo, v); -- le uma linha
    exception
      when no_data_found then
        exit;
    end;

    ...
    -- processa a linha
    ...
  end loop;
exception
  ...
end;
Como você já está lendo a primeira linha antes do loop, basta realizar o processamento antes de ler a linha novamente.

Outra alternativa seria fechar o arquivo após verificar o layout e abrí-lo novamente para o loop, mas acho que não seja necessário usar uma solução tão "radical" assim =)
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Ops, no exemplo eu coloquei exatamente o inverso do que escrevi...
o correto é:

Selecionar tudo

declare 
  v varchar2(100); 
  arquivo text_io.file_type; 
  ... 
  -- declara demais variáveis 
  ... 
begin 
  ... 
  -- abre o arquivo 
  ... 
  text_io.get_line(arquivo, v); 
  ... 
  -- validar o formato do arquivo 
  ... 
  loop 

    ... 
    -- processa a linha 
    ... 

    begin 
      text_io.get_line(arquivo, v); -- le uma linha 
    exception 
      when no_data_found then 
        exit; 
    end; 

  end loop; 
exception 
  ... 
end; 
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

humm chará, pode ser

fazer o 'novo' GetLine após entrar no loop pela primeira vez, no final do loop, e não no início..

é, pode ser, boa sugestão, vou mudar aqui


valeu pela sugestão
Responder
  • Informação
  • Quem está online

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