GARANTIR DESCONTO

Fórum Insert ou Edit #387226

25/09/2010

0

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

Fernando Ramos

Responder

Posts

25/09/2010

Marco Salles

Vc tem que trabalhar com Container ou com Herança   Parece que se trata de dois DataSets Diferentes ( Apesar do mesmo Nome )
Responder

Gostei + 0

26/09/2010

Wesley Batista

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

 
Responder

Gostei + 0

26/09/2010

Fernando Ramos

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:      
       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!
Responder

Gostei + 0

26/09/2010

Marco Salles

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     
Responder

Gostei + 0

26/09/2010

Fernando Ramos

Marco, Boa tarde.       Desculpe a pergunta básica. Se não definir antes de abrir o FORMB, como proceder então?     abraços!
Responder

Gostei + 0

26/09/2010

William Galleti


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:
 
   

       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!
Responder

Gostei + 0

26/09/2010

Marco Salles

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;      
Responder

Gostei + 0

26/09/2010

Fernando Ramos

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!
Responder

Gostei + 0

27/09/2010

Marco Salles

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;
Responder

Gostei + 0

03/10/2010

Fernando Ramos

Marco Antonio, Boa tarde.      Usei dessa forma. Valeu!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar