Sem repetição em bloco tabular

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Olá, sou novo no fórum, espero poder ajudar e ser ajudado...

Pois bem, já venho com um a dúvida, e espero ter postado no lugar correto.

Tenho um bloco tabular, onde insiro dados na tabela relacionada ao bloco, mas não qualquer dados e sim os filtrados pelo lov em cada linha do bloco tabular.

Pois bem, gostaria de saber como não deixar inserir 2 elemnetos do lov neste bloco? Pensei em guardar, a cada dado inserido, em um array e depois ir percorrendo ele, tanto na inserção d eum novo dado, como no update que deixarei fazer e também na exclusão.

Nunca mexi com array dentro do forms, esta é minha grande dúvida, mas sei que pode haver outras possibilidades além desta que pensei, e ficaria muito grato em poder discutí-las ou aprender mais sobre o uso de array no forms.

No aguardo de qualquer tipo de ajuda.

Abraços

NightSpy
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Vamos ver se eu entendi... hehe
Você tem um bloco multi record e um campo que possui uma lov, sendo que o conteúdo é validado através da lov. Contudo, há na sua lov 2 carinhas que você não deseja inserir na tabela, certo ?

Se eu não entendi errado, você poderia validar esta informação na trigger WHEN-VALIDATE-ITEM do seu campo. Se o valor escolhido na lov for um destes 2 carinhas você pode exibir uma mensagem e dar um RAISE forçando o usuário a escolher outro dado da lov.

Não sei se seria o caso, mas você também poderia incluir alguma condição na sua lov pra ela não retornar estes 2 carinhas...

Se for isso que eu descrevi, nem seria necessário usar o array q você mencionou...

qualquer coisa posta ai
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Olá João Garcia, obrigado pela rápida resposta, infelizmente, acho q não fui totalmente claro, mil perdões.

Bom, neste meu Lov é listado vários itens, o que eu gostaria que fizesse é que:

- Ao escolher um item no lov e preenchesse a linha da tabela, quando eu fosse para a próxima linha e novamente chamasse o lov, ou não apareceria o item já inserido acima, ou quando escolhido desse um alerta avisando que já foi usado.

- o que ocorre é que tudo isso tem de ocorrer sem dar commit no banco, pensei em guardar o valor em um campo fora do canvas e depois compará-lo na segunda linha, mas isto falha ao levar em conta que o conteudo da tabela não tem valor pré-determinado, pode ter uma a N linhas, dai não tem como guardar o valor, visto que não quero repetir todos os valores, um exemplo: não poderia repetir os valores da linha 1 com a 2, assim como tambem, não poderia repetir o valor da linha 1 com a linha 5, entendeu??

pensei em sempre que inserisse uma linha, guardasse seu valo em um array, sua chave na verdade, e a cada inserção, update, ou exclusão da tabela, eu percorresse tal array, verificando se já existe a linha, assim fazendo o necessário.

Nossa...hehehe.. compliquei ou melhorei??? hehehe

Abraços
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

hahuaha... Bem diferente do que entendi inicialmente!

Neste caso, você poderia criar um Type que ficasse visível dentro de todo o forms. Daí, a cada registro inserido no seu bloco, você popularia o seu Type, enfim, você manipularia o Type em segundo plano e em todas as situações necessárias.

Pra isso, basta você criar uma package (somente as especification) dentro do seu forms lá em baixo no Program Units... e declarar o seu Type lá...

Pra usá-lo no forms seria:
nomedapackage.seutype(índice).campo

Você sabe como criar Type ?



Se alguém tiver outra idéia... Mande aí..
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Então João, estou justamente agora estudando sobre o type..hehehe...pensando no índice, q será váriavel e não fixo... to vendo se consigo colocar o rowid como índice ou outra forma, visto que os valores estão na tela e não no banco ainda...
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

O ideal é que o índice do seu type seja sequencial, ou seja, conforme você for populando você vai incrementando o índice em 1 (A manipulação do type fica fácil com indice sequencial).
Lembre-se que o type não é um array e sim uma tabela virtual...

Se você precisa de um valor que seja uma espécie de pk para você fazer suas comparações, então crie um campo no seu type.

Enfim, dá uma estudada melhor no funcionamento do mesmo. É sussu!
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

estou usando o type em um pos-change(como teste por enquanto, a idéia é usar no when-validate-item), mas declarei ele como você sugeriu, no program unit. Pergunto. a cada pos-change seu valor é resetado?

Obrigado e já agradeço a paciência dispensada.
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Se você criou ele dentro de uma especificação de package, a resposta é não.
Caso contrário, ele será resetado todas as vezes.
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Então joão, criei sim em uma package.

Estou colocando valores nela assim:

Selecionar tudo

lista.lista_item(cont) := :id_item
onde lista é o nome do type, lista_item da variavel do seu tipo e cont um contador q no momento vale 1. acontece que consigo adicionar valor no type, no indice que quero, mas na hora de percorrer ele, recebe o erro ora-01403, que quer dizer q não foram encontrados dados.

estrutura do loop:

Selecionar tudo

	loop
	  	if(lista.lista_item(cont) = :id_item) then
	  		message('Já existe este item na lista. Por favor escolha outro.');	
	  		message('Já existe este item na lista. Por favor escolha outro.');
	  	end if;
	   	cont := cont + 1;
	  	exit when cont = cur_rec - 1;
		end loop;
cur_rec seria o valor da linha do meu bloco tabular.
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Aeeeee...consegui, fazendo o teste de mesa descobri meu erro na lógica..meu loop ficou assim:

Selecionar tudo

	loop
	  	if(lista.lista_item(cont-1) = :id_item) then
	  		message('Já existe este item na lista. Por favor escolha outro.');	
	  		message('Já existe este item na lista. Por favor escolha outro.');
	  		raise form_trigger_failure;
	  	end if;
	   	cont := cont + 1;
	  	exit when cont = cur_rec;
		end loop;
Quero agradecer ao João Garcia pela ajuda, acabei , além de resolver o meu problema, a também usar esta estrutura type que desconhecia.

Obrigado mesmo, show de bola este fórum.
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Estou revendo o loop, pois quando deleto a linha ele se perde no valor do current record.
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Estive vendo e acho que a estrutura do seu type não é exatamente a que eu sugeri inicialmente. Vai então um exemplo:

Selecionar tudo

TYPE REC_CONTROLE IS RECORD (id_controle   NUMBER,
  							      status        VARCHAR2(20));  
--													
TYPE TAB_CONTROLE IS TABLE OF REC_CONTROLE INDEX BY BINARY_INTEGER;
--
vControle   TAB_CONTROLE;
Na hora de popular é só usar:

Selecionar tudo

vCont := vCont + 1;
Package.vControle(vCont).id_controle := valor; 
Package.vControle(vCont).status      := valor;
Desta forma, você não precisaria excluir a linha do type.
Você manipularia o campo status alterando ele conforme precisasse.

Bom, espero ter sido claro... hehe

T+
Responder
  • Informação
  • Quem está online

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