VA
Pegar ID do registro em uma DBCombo e gravar em seção
Fechado
Pessoal, tenho um form apenas com uma DBCombo e um botão Salvar.
Ao selecionar o registro na DbCombo, preciso pegar o ID do objeto selecionado e gravar na Session ao salvar, mas não estou conseguindo pegar o ID.
Tenho que fazer através do Onchange da DBCombo? Ou consigo apenas através de um atributo do objeto? Já tentei pegar pelos atributos, mas não aparece atributo ID e o objeto parece que chega vazio no método OnSave.
1154periodo = new TDBCombo('combo','dbcollegio','Periodo','idperiodo','descricao');
Agradeço se me derem alguma luz.
Ao selecionar o registro na DbCombo, preciso pegar o ID do objeto selecionado e gravar na Session ao salvar, mas não estou conseguindo pegar o ID.
Tenho que fazer através do Onchange da DBCombo? Ou consigo apenas através de um atributo do objeto? Já tentei pegar pelos atributos, mas não aparece atributo ID e o objeto parece que chega vazio no método OnSave.
1154periodo = new TDBCombo('combo','dbcollegio','Periodo','idperiodo','descricao');
Agradeço se me derem alguma luz.
Vanilson
O mais indicado é no onChange, onde é passado "$param" e você conseguirá capturar o conteúdo selecionado do TDBCombo.
Eu sempre faço desta maneira e dá certo.
Algum colega tem outra sugestão?
Abraços
Marcelo
Coloque o código pra gente avaliar porque pode ter vários motivos por não estar conseguindo, uma vez que essa ação é bem corriqueira no framework. Veja se não esqueceu de colocar o o objeto no form adequadamente, pois apenas o fato de aparecer na tela não significa que está funcional.
Segue o código.. nem coloquei em sessão ainda, pois quando tentei ver o resultado do objeto, os atributos não exibem nada.
Devo estar fazendo algo errado.
Você está com alguns problemas. Vou colocar o código alterado e onde estiver negrito foi minha alteração. Depois teste e poste o resultado:
Olá Eliezer,
Agradeço pela contribuição, mas:
O addfield que você comentou no código foi gerado pelo Studio, fiz a alteração que você sugeriu mas o resultado é o mesmo.
O código $object->combo exibe a posição selecionada na combo (1,2,3...). Já tinha testado com isso mas não me atende. Teria que ser o Id do objeto na tabela (10, 21, 124..).
Se não tiver como eu pegar o $object->id, vou tentar fazer pelo OnChange.
Valeu.
Bom ele está trazendo como resultado o campo 'idperiodo' que vc colocou no TDBCombo, se o campo do referido id tem outro nome na tabela então vc precisa substituir o 'idperiodo' por ele.
Como eu não conheço a estrutura de sua tabela não tem como eu te ajudar nesse sentido, apenas que o raciocínio está correto.
abs
Vanilson,
Acho que estamos com um problema de comunicação somente.
Cada campo colocado no formulário gera uma posição no objeto do onSave(),
então o comportamento está conforme o esperado, não existem erros.
Não poderia haver uma posição ->id pois não existe um campo no formulário
com esse nome. A ideia do TDBCombo é passar o ID do objeto selecionado,
o que é representado pelo quarto parâmetro, conforme você pode ver.
No seu caso, está montando uma combo de períodos a partir da tabela
de períodos. Deveria haver somente um campo de ID, por que tem mais
de um? id e idperiodo? Qual desses é a chave primária? A partir da
chave primária identificada, passe ela no quarto parâmetro:
Se isso não puder ser feito dessa maneira, então talvez você tenha
um erro conceitual de modelagem em seu banco de dados.
Att,
Pablo
Olá Pablo,
Não é questão de modelagem.
Deixa eu contextualizar para você entender.
Tenho uma aplicação que rodando em desktop que estou convertendo para web.
Estou gerando os modelos de classe a partir do Studio (assistente de modelos).
Na tabela de períodos, minha chave primária é IdPeriodo.
Criei um form com a combo e o botão Save.
No método OnSave quero apenas pegar o IdPeriodo da seleção da combo e gravar na session.
Segue a classe gerada no Studio.
Obrigado.
Então Vanilson é mais simples do que pensamos :-)
Os valores são obtidos no post pelos seus nomes.
Veja que você criou o objeto com o nome "combo" (primeiro parâmetro):
Agora, para obtê-lo, basta usar o getData() e logo em seguida acessar a posição $object->combo. Neste caso não é necessário passar nada como parâmetro para a getData(), você estava passando "Periodo", mas nesse caso você estaria forçando o retorno a ser da classe "Periodo", mas a classe "Periodo" nem ao menos tem um atributo chamado "combo" como o que você criou no form ;-)
Se você quiser que o atributo tenha outro nome que não $object->combo, basta alterar o primeiro parâmetro do construtor do objeto.
Att,
Pablo
Pablo e demais amigos,
Consegui fazer funcionar da forma abaixo.
Talvez tenha rodeado demais para fazer a mesma coisa, mas deu certo.
Tentei fazer mais simplificado, sem o evento onChangeAction da combo, mas não consegui.
Obrigado a todos.
Abraço!
Vanilson,
Você não precisa do changeAction. É um evento javascript desnecessário neste cenário.
Você só precisa trocar o nome do campo.
De:
new TDBCombo('combo_periodo', ...
para:
new TDBCombo('idperiodo', ...
Att,
Pablo
Valeu, Pablo.
Segue a versão simplificada.