Erro de Gravação

17/05/2003

1

Estou com um grande prblema, estou trabalhando com CLIENTDATASET, de forma mestre-detalhe, sendo um cdsFORNECEDOR, tabela de FORNECEDORES, e um cdsMAQ, de uma tabela de MAQUINAS, está relacionado de forma correta, no ONCLICK do botão NOVO o código é o seguinte:

DM.cdsFORN.INSERT;
DM.cdsMAQ.INSERT; ==> ESTE COLOCADO POSTERIORMENTE, PARA VER SER CONTINUA COM A MSG DE ERRO!

E o botão GRAVAR, com o seguinte código:

DM.cdsFORN.POST;
DM.cdsMAQ.POST;
DM.cdsFORN.APPLYUPDATES(0);

A MSG DE ERRO É A SEGUINTE, ´´ cdsMAQ: DATASET NOT IN EDIT OR INSERT MODE.´´

SERÁ QUE É NO CÓDIGO QUE ESTA ACONTECENDO ISSO, ONDE ESTOU ERRANDO.

JÁ TENTEI COM O PARADOX, DEU O MESMO ERRO, ESTOU TRABALHANDO COM O INTERBASE>


Responder

Posts

17/05/2003

Rmfb

:D Amigo... Isto é muito fácil de resolver... Primeiro, vamos tentar entender o seguinte:

1 - Os TdataSet (Table, query....) possuem diversos modos que, dentre eles, podemos destacar:

1.1 - Modo de Alteração: É quando uma tabela ou query está sendo alterada. dsEdit

1.2 - Modo de Inclusão: É quando uma tabela está sendo inserida de um registro. dsInsert

1.3: Modo de Navegação: É quando o usuário está apenas navengando nos registros. dsBrowse


Então, você não pode chegar e dá um ´post´ em uma tabela ou query. Se a tabela ou query estiver no mode de Alteração (dsEdit) ou no modo de Inclusão (dsInsert), nada irá ocorrer e o post irá funcionar. Entretanto, se você der um post em uma tabela ou query e ela estiver no modo de Navegação (dsBrowse), irá ocorrer um erro (é o que está acontecendo com você).

Para verificar em qual modo uma tabela ou query se encontra, basta você implementar o seguinte código apenas para testar:

No DataSource que está ligado a sua tabela, tem um evento chamado ´OnChangeState´. Esse evento será sempre executado quando a tabela mudar de modo. Para você testar e não errar mais, tente o seguinte:
No evento OnChangeState do DataSource digite:

If(DataSource.DataSet.State = dsInsert) Then
Showmessage(´A tabela está no modo de Inclusão´)
Else
If(DataSource.DataSet.State = dsEdit) Then
Showmessage(´A tabela está no modo de Alteração´)
Else
If(DataSource.DataSet.State = dsBrowse) Then
Showmessage(´A tabela está no modo de Navegação´);

Pronto, agora que você já entendeu, basta implementar o seguinte código no evento do botão que grava na tabela:

If(DataSource.DataSet.State In[dsInsert,dsEdit])Then
Table.Post;

{Como já sabemos que o ´post´ retorna um erro se a tabela estiver no modo de navegação, estão, basta criticarmos para aque o ´post´ só seja executado se a tabela estiver no modo de Edição ou Alteração}

Espero ter ajudado....

[color=red:affeb12e74]OBS: Modo de Navegação (BROWSER OU BROWSE)..Não lembro direito.[/color:affeb12e74]


Responder

17/05/2003

Cruz

Qual a primeira mensagem de erro... ???


Responder