GARANTIR DESCONTO

Fórum Erro: At beginning of table. Vamos discutir... #350879

20/12/2007

0

Pessoal o erro: [b:96c4c3bab1]At beginning of table[/b:96c4c3bab1] está me tirando o sono, porque ele acontece? segue a minha estrutura: [i:96c4c3bab1](obs: uso Delphi 2006, FireBird 2.0 e DbExpress)[/i:96c4c3bab1]
Tenho duas tabelas [b:96c4c3bab1]Pessoa (master)[/b:96c4c3bab1] e [b:96c4c3bab1][i:96c4c3bab1]Cliente (Detal)[/i:96c4c3bab1][/b:96c4c3bab1]
[b:96c4c3bab1][i:96c4c3bab1]Estruturas:[/i:96c4c3bab1][/b:96c4c3bab1]
[b:96c4c3bab1] Pessoa:[/b:96c4c3bab1]
- ID_Pessoa integer primary key
- Nome varchar(80)
- Telefone varchar(14)
- etc...
[b:96c4c3bab1] Cliente:[/b:96c4c3bab1]
- ID_Cliente integer primaey key
- ID_Pessoa integer foreign key (relaciona com a primary key de pessoa)
- LimiteCredito float
- Valor float
- etc...

Os componentes usados no delphi são Para:
[b:96c4c3bab1] Pessoa:[/b:96c4c3bab1]
[i:96c4c3bab1][b:96c4c3bab1] - ds_Pessoa:[/b:96c4c3bab1][/i:96c4c3bab1] TDataSource
- AutoEdit := False;
- DataSet := cds_Pessoa;
[i:96c4c3bab1][b:96c4c3bab1] - cds_Pessoa:[/b:96c4c3bab1][/i:96c4c3bab1] TClientDataSet
- IndexFieldNames := Nome;
- ProviderName := dsp_Pessoa;
[i:96c4c3bab1][b:96c4c3bab1] - dsp_Pessoa:[/b:96c4c3bab1][/i:96c4c3bab1] TDataSetProvider
- DataSet := sq_Pessoa;
- Options := [poPropogateChanges,poAllowCommandText,poUseQuoteChar];
- UpdateMode := upWhereKeyOnly;
[i:96c4c3bab1][b:96c4c3bab1] - sq_Pessoa:[/b:96c4c3bab1][/i:96c4c3bab1] TSqlQuery
- SQL := ´SELECT
P.ID_PESSOA,
P.NOME,
P.TELEFONE,
P.ECT...
FROM PESSOA P
INNER JOIN CLIENTE C ON (P.ID_PESSOA = C.ID_PESSOA)´;
- SQLConnection := sc_conexao: TSqlConnection;(obs: o sc_conexao está devidamente direcionado para uma base *.fdb)

[b:96c4c3bab1] Cliente:[/b:96c4c3bab1]
[i:96c4c3bab1][b:96c4c3bab1] - ds_Cliente:[/b:96c4c3bab1][/i:96c4c3bab1] TDataSource
- AutoEdit := False;
- DataSet := cds_Cliente;
[i:96c4c3bab1][b:96c4c3bab1] - cds_Cliente:[/b:96c4c3bab1][/i:96c4c3bab1] TClientDataSet
- [color=red:96c4c3bab1]DataSetField[/color:96c4c3bab1] := cds_pessoasq_cliente;
[i:96c4c3bab1][b:96c4c3bab1] - ds_Master:[/b:96c4c3bab1][/i:96c4c3bab1] TDataSource
- AutoEdit := False;
- DataSet := sq_Pessoa;
[i:96c4c3bab1][b:96c4c3bab1] - sq_Cliente:[/b:96c4c3bab1][/i:96c4c3bab1] TSqlQuery
- SQL := ´SELECT
C.ID_CLIENTE,
C.ID_PESSOA,
C.LIMITECREDITO,
C.VALOR,
C.ETC...
FROM PESSOA P
WHERE(
(C.ID_PESSOA = :ID_PESSOA)
)
- SQLConnection := sc_conexao: TSqlConnection;(obs: o sc_conexao está devidamente direcionado para uma base *.fdb)

Dai quando eu localizo um cliente que já existe altero os dados e gravo blz tudo normal, mas, se eu estiver cadastrando um cliente que não exista nem em cliente ném em pessoa, dai gera o bendito erro: [b:96c4c3bab1]At beginning of table[/b:96c4c3bab1], já tentei gravar primeiro no cds_cliente e depois cds_pessoa, já gravei primeiro em cds_pessoa e depois em cds_cliente, já gravei só em cds_pessoa já usei somente ApplyUpdates somente em pessoa, tudo dá erro.

Eu cheguei a conclusão que o componentes está tentando gravar primeiro os Details (a cds_cliente) como o ID de pessoa ainda naum existe no banco gera o erro. mas, não tenho certeza dessa conclusão.

Se alguém já passou por isso ou tem outra forma de resolver isso posta ai pra que possamos compartilhar da solução.

lembrando que as tabelas estão relacionadas no banco de dados e pela configuração dos componentes que citei acima da pra ver que estão relacionados também.

[b:96c4c3bab1][color=red:96c4c3bab1][size=18:96c4c3bab1]Agradeço a todos que se disposerem pelo menos a LER.[/size:96c4c3bab1][/color:96c4c3bab1][/b:96c4c3bab1]


Delphijean

Delphijean

Responder

Posts

20/12/2007

Rickpeixinho

Refaça o datamodule!!!!!


Responder

Gostei + 0

20/12/2007

Delphijean

Refaça o datamodule!!!!!


Não andianta refazer.

Mas, Obrigado!


Responder

Gostei + 0

20/12/2007

Ulisses_sjardim

O mestre-detalhe implementado por você, que é feito no dbx, exige que para cadastrar um registro na tabela detalhe, o mesmo esteja vinculado a um registro mestre, senão ocorre o erro que você notificou.
Se quiser cadastrar da forma que falou utilize Stored Procedures. Ou faça na mão. Ou ainda garanta que o usuário cadastre primeiro pessoa para depois cadastrar o cliente.

Espero ter ajudado!


Responder

Gostei + 0

21/12/2007

Delphijean

Caro ulisses_sjardim,
Obrigado pela atenção.

Percebir que quando estamos usando o master/detalhe que configurei acima, quando aplicamos um APPEND na meste a detalhe fica internamemente em modo BROWSER e só vai pra INSERT quando digitamos alguma tecla num DBGrid por exemplo, dai ele gera o novo registro, entao se esarmos um dbEdit só vamos conseguir o mesmo resultado caso a propriedade AutoEdit do DataSource esteja True.

Então, conseguir resolver meu problema assim.

Obrigado pela atenção de todos.


Responder

Gostei + 0

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

Aceitar