Insert ou Edit
Amigos,
Boa noite.
Estou trabalhando da seguinte forma.
Tenho um FORMA e um FORMB. No FORMB existe um AdoQuery. Porém através de um botão no FORMA eu defino ADOQuery1.insert e depois abro o FORMB. Quando clico no botão OK do FORMB que possui ADOQuery1.post, apresenta um erro informando que o AdoQuery1 não esté em Edit ou Insert.
Só funciona, se eu definir ADOQuery1.insert ou ADOQuery1.edit diretamente no FORMB. Fazendo como informado acima da erro.
Alguém saberia como resolver isso?
Fernando Ramos
Curtidas 0
Respostas
Marco Salles
25/09/2010
Vc tem que trabalhar com Container ou com Herança
Parece que se trata de dois DataSets Diferentes ( Apesar do mesmo Nome )
GOSTEI 0
Wesley Batista
25/09/2010
Olá amigo, bom dia.
Tira uma dúvida você tem dois Adoquery1 ?
FormA - Adoquery1FormB - AdoQuery1
É isso ? Se for realmente não vai funcionar pois para gravar(post) um registro, o DataSet precisa esta em modo de Edit ou Insert mode, na propriedade AdoQUery1.State, você sabe em que State seu DataSet se encontra para saber isso faça o seguinte
If Adoquery1.State in [dsInsert, dsEdit] then AdoQuery1.Postelse ShowMessage('Não esta em insert ou edit');
Então imagina só: você esta dando insert no FormA.AdoQuery1;você esta dando post no FormB.AdoQuery1;
Apesar do mesmo nome eles são Objetos(Componentes), diferentes concorda comigo ?
Sendo assim lhe recomendo utilizar um DataSet para cada situação que você queria trabalhar, se o dataset faz a mesma coisa que o outro, coloque eles em um lugar comum, assim fica mais fácil dar manutenção concorda ?
Sendo assim lhe recomendo criar um DataModulo, Menu; File;New;Other - Delphi Files / DataModule
Ele funciona como um Form, save o mesmo só que nele só pode ser colocado componentes não visuais, ou seja seu AdoQuery, o legal é renomear ele para DM por exemplo dai ao inves de você fazer
Adoquery1.Insert;
Ficará assim : DM.Adoquer1.Insert ( melhor ainda é renomear este AdoQuery1 para QryCliente), por exemplo, pois futuramente quando teu projeto crescer já era! Você terá vários Adoquery1,2,3,4, como vai saber quem é quem, quando for dar manutenção? Sacou ?
Um abraço
Wesley Batista
Tira uma dúvida você tem dois Adoquery1 ?
FormA - Adoquery1FormB - AdoQuery1
É isso ? Se for realmente não vai funcionar pois para gravar(post) um registro, o DataSet precisa esta em modo de Edit ou Insert mode, na propriedade AdoQUery1.State, você sabe em que State seu DataSet se encontra para saber isso faça o seguinte
If Adoquery1.State in [dsInsert, dsEdit] then AdoQuery1.Postelse ShowMessage('Não esta em insert ou edit');
Então imagina só: você esta dando insert no FormA.AdoQuery1;você esta dando post no FormB.AdoQuery1;
Apesar do mesmo nome eles são Objetos(Componentes), diferentes concorda comigo ?
Sendo assim lhe recomendo utilizar um DataSet para cada situação que você queria trabalhar, se o dataset faz a mesma coisa que o outro, coloque eles em um lugar comum, assim fica mais fácil dar manutenção concorda ?
Sendo assim lhe recomendo criar um DataModulo, Menu; File;New;Other - Delphi Files / DataModule
Ele funciona como um Form, save o mesmo só que nele só pode ser colocado componentes não visuais, ou seja seu AdoQuery, o legal é renomear ele para DM por exemplo dai ao inves de você fazer
Adoquery1.Insert;
Ficará assim : DM.Adoquer1.Insert ( melhor ainda é renomear este AdoQuery1 para QryCliente), por exemplo, pois futuramente quando teu projeto crescer já era! Você terá vários Adoquery1,2,3,4, como vai saber quem é quem, quando for dar manutenção? Sacou ?
Um abraço
Wesley Batista
GOSTEI 0
Fernando Ramos
25/09/2010
Wesley,
Boa tarde.
Tenhos dois AdoQuerys, mas com nomes diferentes e funções diferentes.
No FORMA tenho um AdoQuery chamado QryAlunos e no FORMB tenho o AdoQuery chamado QryAluno
No FORMA utilizo o QryAlunos para listar os alunos em uma GRID. Ao clicar em algum botão de editar faço:
Feito isso, ao abrir o FORMB ele aparece para edição do registro, porém ao clicar em OK onde está QryAluno.post aparece o erro, dizendo que o QryAluno não está em Insert ou Edit.
Abraços!
FORMB.QryAluno.Edit; FORMB.ShowModal;
GOSTEI 0
Marco Salles
25/09/2010
pq que vc tem que chamar o FORMB.QryAluno.Edit antes do ShowModal ???
Se vc trabalha com DataWare o que é muito provável pode ser que algo
esta deslocando o ponteiro e ele sai da edição
GOSTEI 0
Fernando Ramos
25/09/2010
Marco,
Boa tarde.
Desculpe a pergunta básica. Se não definir antes de abrir o FORMB, como proceder então?
abraços!
GOSTEI 0
William Galleti
25/09/2010
Wesley,
Boa tarde.
Tenhos dois AdoQuerys, mas com nomes diferentes e funções diferentes.
No FORMA tenho um AdoQuery chamado QryAlunos e no FORMB tenho o AdoQuery chamado QryAluno
No FORMA utilizo o QryAlunos para listar os alunos em uma GRID. Ao clicar em algum botão de editar faço:
Feito isso, ao abrir o FORMB ele aparece para edição do registro, porém ao clicar em OK onde está QryAluno.post aparece o erro, dizendo que o QryAluno não está em Insert ou Edit.
Abraços!
Boa tarde.
Tenhos dois AdoQuerys, mas com nomes diferentes e funções diferentes.
No FORMA tenho um AdoQuery chamado QryAlunos e no FORMB tenho o AdoQuery chamado QryAluno
No FORMA utilizo o QryAlunos para listar os alunos em uma GRID. Ao clicar em algum botão de editar faço:
FORMB.QryAluno.Edit; FORMB.ShowModal;
Feito isso, ao abrir o FORMB ele aparece para edição do registro, porém ao clicar em OK onde está QryAluno.post aparece o erro, dizendo que o QryAluno não está em Insert ou Edit.
Abraços!
Boa tarde!
Ve se ajuda esse código.
Antes de abrir o formb, vc precisa fazer alguns tratamentos... vou tentar simplificar...
Colocando em edição um dataset que nao esta formA.
try formB := tformB.create(application); tformB(formB).qryAluno.edit; formB.showmodal; finally freeandnil(formB); end;
Para verificar, utilize esse codigo no evendo OnShow do formB
if qryAluno.state = dsEdit then Showmessage('Em edição');Para facilitar, eu faço essa verificação de STATE no proprio DataSet. Uso o evento BEFOREPOST.
if qryAluno.state in [dsEdit,dsInsert] then qryAluno.post; else begin ShowMessage('Data set não está em modo de edição ou inserção'); qryAluno.cancel; end; Espero ter ajudado!
GOSTEI 0
Marco Salles
25/09/2010
Marco,
Boa tarde.
Desculpe a pergunta básica. Se não definir antes de abrir o FORMB, como proceder então?
abraços!
Isto vai depender se seu Form é instanciado por vc po pela aplicação
O Amigo ai de cima colocou uma forma de instanciar um form . Eu particularmente não
recomendo colocar a Applicacao como Owner , pois a responsabilidade de destruir este form
do jeito que foi exposto é sua.. Alem disso um detalhe importante sobre o bloco Try
é sempre fazer
formB := tformB.create(nil); // o proprieario é nil pois o tempo de vida do form é curto
try // Aqui entra o Try e não em cima
formB.showmodal;
finally
freeandnil(formB);
end;
No caso deste form que é instanciado por vc pode colocar no eventoOnShow
qryAluno.edit;
GOSTEI 0
Fernando Ramos
25/09/2010
William,
Boa noite.
O FORMB é criado pela aplicação mesmo. Então, não muda muito o que você indicou eu fazer e o que eu já faço.
Já faço o FORMB.QryAluno.Edit;
Mesmo assim, valeu pela ajuda.
Marco,
Boa noite.
O problema de colocar no eventoOnShow é que utilizo este mesmo FORMB para editar o registro e inserir um novo, quando passo QryAluno.Insert;
abraços!
GOSTEI 0
Marco Salles
25/09/2010
William,
Boa noite.
O FORMB é criado pela aplicação mesmo. Então, não muda muito o que você indicou eu fazer e o que eu já faço.
Já faço o FORMB.QryAluno.Edit;
Mesmo assim, valeu pela ajuda.
Marco,
Boa noite.
O problema de colocar no eventoOnShow é que utilizo este mesmo FORMB para editar o registro e inserir um novo, quando passo QryAluno.Insert;
abraços!
entendi ... Então , deve ter algo no seu evento onshow que esta deslocando o Ponteiro. Uma simples
pesqusa ja tira a query do modo de edit
Mas Vc pode fazer o seguinte
Crie um Tipo Numerado
TOperacao = (ftEdit,FtInsert)
var
Operacao:TOperacao
qnd for para Editar ao inves de QryAluno.Insert vc faz Operacao:=ftInsert
No Onshow do Form vc testa
case Operacao of
ftEdit: QryAluno.Edit;
ftInsert: QryAluno.Insert;
end;
GOSTEI 0
Fernando Ramos
25/09/2010
Marco Antonio,
Boa tarde.
Usei dessa forma. Valeu!
GOSTEI 0