SelectManyCheckbox em uma transação?

Forum sobre a ferramenta Oracle JDeveloper, ADF, OAF, etc. (Não é destinado ao aprendeziado da Linguagem Java em geral)
Responder
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Como crio um cadastro exemplo:
- Funcionários para muitos departamentos, onde nesta tela gravará na tabela funcionário e também na tabela departamentoFuncionarios os seus respectivos id.
- Uso Trigger para gravar o id de funcionario o qual terá que ser gravado 1º, para daí gravar este mesmo id na tabela departamentoFuncionarios. Gostaria que isso fosse realizado em uma única transação? Isso é Possível? Como ficaria o metodo do botão gravar?

Atenciosamente...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

se você tivesse um relacionamento do tipo 1 funcionario para 1 departamento seria simples na tabela de funcionario você gravaria a PK do departamento como FK e tudo resolvido porem você tem 1 para N logo precisará de uma outra tabela para fazer isso.. essas tabela associativa guadará a chave do seu funcionario mais a chave de um departamento assim você poderá ter um fucionario com mais de um departamento pois cada registro dessa tabela sera uma associçao dessa entre func e dep, por isso o nome dela e associativa.

com relaçao a sua duvida tecnica você tem que dar mais dados..
se você esta usadno BC basta implementar um metodo chamdo postChange no EO da entidade principal (func) e no EO de departamento refreshKey... (não me lembro o nome direito agora) assim você poderá salvar a entidade pai e filha na mesma transação..

se você quiaser fazer isso na mao e mais facil... basta colocar a trigger nessa nova tabela..

para o botao.. preciso saber qual framework esta usando

espero ter ajudado... senao esclareça melhor que tentarei ajuda-lo

abraço
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Victor:

Estou usando ADF no jdeveloper 11g com bd oracle e gostaria de implentar isso na mão mesmo, na hora de executar o botao salvar. Já tenho o jspx com o cadastro de funcionário e os checkbok com os departamentos, porém gostaria de estar lendo os checbok dos departamentos selecionados e gravalos na tabela funcionarioDepartamento com este id do funcionario salvo e isso na mesmo transação.

Esta outra solução que comentou" não entendi quando escreveu: "basta colocar a trigger nessa nova tabela" Seria implementar tudo isso direto no banco?

Obrigado,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

assumindo que seu modelo esteja certo..

não vejo problemas em fazer dois commits pois o ADF Bussines Components tem seus aplications modules justamente para você não se preocupar com questões de transações de banco..

entenda seu problema.. você tem a criação de um funcionario que quando é criado ganha um id negativo temporario e antes de dar o commit, onde a trigger entrará em ação para alimentar o id verdadeiro gerado pela sequence desta tabela, você quer usar este id para inserir em outra tabela (funcDep) como FK... sim.. da pra fazer mas fica uma m***a..

você querendo eu posso te postar mais tarde esses metodos que seriam implementados nos EOs para atualizar essa pk negativa temporaria e poder atualilzar a sua outra tabela, mas te adianto que, por de tras dos panos, você vai estar fazendo a mesma coisa que dar o seu DbTrasaction.commit()

tem essa outra forma tambem que achei...
http://one-size-doesnt-fit-all.blogspot ... reate.html

no metodo create() do EO que é acionado quando você da um creatInsert no seu VO, ele já vai no banco ler o valor da sequence e já seta o valor real do id do funcionario novo logo e so pegar e salvar na sua tabela associativa

qualquer coisa estamos ai
espero ter ajudado
abraço
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Victor:
Fazendo dois commit tenho medo de estar gravando na 1ª tabela(Func) e no momento der outro commit dar uma queda de energia, etc e não gravar na 2ª tabela (funcDep). Se possível me manda esses metodos implementados nos EOs, concordo que daquela forma vai ficar uma m***a ...


Atenciosamente,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

esses são os metodos q te falei...

http://download.oracle.com/docs/html/B2 ... sthref2515


não esqueca que essa entidade funcionarioDepartamento tera de estar devidamente figurada no seu sistema atraves EO, AO, VO e VL
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Victor:
Fiz todos os métodos, estou com dificuldade pra receber os valores dos checkbox selecionados, através de uma action no meu bem.
No jspx está assim:

Selecionar tudo

<af:selectManyCheckbox value="#{bindings.DepView1.inputValue}"
                                   label="#{bindings.DepView1.label}"
                                   binding="#{backingBeanScope.backing_untitled1.smc2}"
                                   id="smc2">
              <f:selectItems value="#{bindings.DepView1.items}"
                             binding="#{backingBeanScope.backing_untitled1.si3}"
                             id="si3"/>
            </af:selectManyCheckbox>
Atenciosamente,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

qual dificuldade?
gera alguém erro?
os valores não estao chegando no seu metodo?

assim de cara..

1 - tenta colocar no teu componente

Selecionar tudo

valuePassThru=true
2 -

Selecionar tudo

binding="#{backingBeanScope.backing_untitled1.smc2}"
você tem os valores selecionado atraves desse atributo q foi criado no seu managedBean (ou backingBean)
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Victor:

Consequi fazer o que eu queria: gravar em 2 tabelas na mesma transação 01 Funcionário para vários Departamentos; isso graças aos métodos que você tinha passado os links, vou postar o código que acho que pode ser melhorado:
No meu checkbox de departamentos atribuo o valor que vem da seguinte array do backingBean:

private Integer[] departamentosSelecionados;

no jspx:

Selecionar tudo

<af:selectManyCheckbox value="backingBeanScope.backing_untitled1.departamentosSelecionados}"
No backingBean criei este método que é disparado na action do botão gravar:

Selecionar tudo

 public String gravar() {
        DCBindingContainer bc = getDCBindingContainer();
        DCIteratorBinding iterDep = bc.findIteratorBinding("DepView1Iterator");
        DCIteratorBinding iterFuncionario = bc.findIteratorBinding("FuncView1Iterator");
        DCIteratorBinding iterDepFunc =   bc.findIteratorBinding("FuncdepView1Iterator");

        Row newRowFuncionario = iterFuncionario.getCurrentRow();
        oracle.jbo.domain.DBSequence idfunc =(oracle.jbo.domain.DBSequence)newRowFuncionario.getAttribute("Idfunc");
        for (int i : getDepartamentosSelecionados()) {
           // aqui o valor de i retorna sempre um indice começando do 0,1,2... Gostaria que já receber o valor da chave 
  	   // para não necessitar fazer a pesquisa abaixo?

            iterDep.setCurrentRowIndexInRange(i);
            Row newRow = iterDep.getCurrentRow();
            oracle.jbo.domain.DBSequence iddep = (oracle.jbo.domain.DBSequence)newRow.getAttribute("Iddep");
         
           // aqui é uma gambi..  inclui um botão CreateInsert1 de FuncdepView1Iterator para poder aqui
           // incluir um novo registro; deve ter outra maneira de fazer isso?
            OperationBinding InsertFuncDepOper =   bc.getOperationBinding("CreateInsert1");
            InsertFuncDepOper.execute();
            Row newRowDepFuncionario = iterDepFunc.getCurrentRow();
            newRowDepFuncionario.setAttribute("Funcid", idfunc);
            newRowDepFuncionario.setAttribute("Depid", iddep);

        }
        oracle.binding.OperationBinding operationBinding =  bc.getOperationBinding("Commit");
        operationBinding.execute();

        return null;
    }
Como estou estudando está ferramenta para iniciar em produção de sistema como poderia melhorar este este método acima
Atenciosamente,
Rohling
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

em termos da tecnologia e dificil opinar pos existem varias maneiras de usar isso então a sua maneira e mais uma maneira e não esta "errada"...

o que vejo q pode ser melhorado e a questao de OO e padroes de projeto no caso MVC..

na parte em que você cria a row de Dep você poderia estar fazendo isso dentro do seu AM logo cahamdas do tipo

Selecionar tudo

        DCBindingContainer bc = getDCBindingContainer();
        DCIteratorBinding iterDep = bc.findIteratorBinding("DepView1Iterator");
seriam eliminadas e tambem caso seja necessario você validar se aquele funcionario já existe para aquele departamento você fara isso ai no seu Controler (Backing Bean) e dai não ficara muito coerente..

separe isso em mais metodos melhores definidos tipo setDepartamentoPorFuncionario e outro gravar e não esqueca do seu validar

as chamadas de operationbinding devem ser usadas tambem para chamadas de metodos customizados la do seu AM e devem ser incluidas no seu pageDef traves de um methodAction

espero ter ajudado
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante