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
Sem repetição em bloco tabular
-
- 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
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
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
- NightSpy
- 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
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
-
- 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
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í..
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í..
- NightSpy
- 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...
-
- 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
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!
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!
- NightSpy
- 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.
Obrigado e já agradeço a paciência dispensada.
-
- 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
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.
Caso contrário, ele será resetado todas as vezes.
- NightSpy
- 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:
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:
cur_rec seria o valor da linha do meu bloco tabular.
Estou colocando valores nela assim:
lista.lista_item(cont) := :id_item
estrutura do loop:
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;
- NightSpy
- 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:
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.
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;
Obrigado mesmo, show de bola este fórum.
-
- 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
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:
Na hora de popular é só usar:
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+
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;
vCont := vCont + 1;
Package.vControle(vCont).id_controle := valor;
Package.vControle(vCont).status := valor;
Você manipularia o campo status alterando ele conforme precisasse.
Bom, espero ter sido claro... hehe
T+
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 9 visitantes