 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Dom Jan 06, 2008 11:25 pm Assunto: Key Violation |
|
|
Olá pessoal.
Resolvi portar meu aplicativo para Multi-Camadas, só que tá dando esse erro ao incluir o segundo registro: "Key Violation."
Meu procedimento para aplicar os dados é bem simples e o mesmo está escrito na camada cliente.
| Código: |
procedure TdmDados.Aplicar(DataSet: TDataSet);
var CDataSet: TClientDataSet;
begin
CDataSet := TClientDataSet( DataSet );
if CDataSet.ChangeCount > 0 then
begin
CDataSet.ApplyUpdates( -1 );
FormPrincipal.Informa( 'Registro gravado com sucesso.' );
end;
CDataSet.Close;
end;
|
Quando eu fecho o ClientDataSet depois de aplicar as alterações, e depois reabro para inserir um novo registro, funciona normal.
Mais se eu manter o ClientDataSet aberto e tentar inserir um novo registro, a hora que eu clicar em salvar, ou seja, quando eu dar um Post ele dá o erro: "Key Violation."
Alguém sabe o que tenho que fazer para evitar de ter que fechar o ClientDataSet e apenas fecha-lo junto com o form ?
Logicamente as alterações seriam aplicadas antes dele ser fechado.
Agradeço antecipadamente a ajuda dos colegas. |
|
| Voltar ao Topo |
|
 |
wolverinefarah Colaborador

Registrado: Sábado, 17 de Junho de 2006 Mensagens: 1770
|
Enviada: Seg Jan 07, 2008 1:47 am Assunto: Re: Key Violation |
|
|
| CarneiroDelphi escreveu: | Olá pessoal.
Resolvi portar meu aplicativo para Multi-Camadas, só que tá dando esse erro ao incluir o segundo registro: "Key Violation."
Meu procedimento para aplicar os dados é bem simples e o mesmo está escrito na camada cliente.
| Código: |
procedure TdmDados.Aplicar(DataSet: TDataSet);
var CDataSet: TClientDataSet;
begin
CDataSet := TClientDataSet( DataSet );
if CDataSet.ChangeCount > 0 then
begin
CDataSet.ApplyUpdates( -1 );
FormPrincipal.Informa( 'Registro gravado com sucesso.' );
end;
CDataSet.Close;
end;
|
Quando eu fecho o ClientDataSet depois de aplicar as alterações, e depois reabro para inserir um novo registro, funciona normal.
Mais se eu manter o ClientDataSet aberto e tentar inserir um novo registro, a hora que eu clicar em salvar, ou seja, quando eu dar um Post ele dá o erro: "Key Violation."
Alguém sabe o que tenho que fazer para evitar de ter que fechar o ClientDataSet e apenas fecha-lo junto com o form ?
Logicamente as alterações seriam aplicadas antes dele ser fechado.
Agradeço antecipadamente a ajuda dos colegas. |
amigo, esse erro acontece qdo ocorre uma duplicidade de chave primaria... de uma olhada...
bye _________________ Fernando Farah
PROGRAMADOR PROGRESS
PROGRAMADOR DELPHI + FIREBIRD |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Seg Jan 07, 2008 4:45 pm Assunto: |
|
|
Olá amigo wolverinefarah.
Realmente ocorre dessa forma, mais não entendo porque depois que fecho o ClientDataSet com um Close, e depois reabro novamente, o mesmo funciona normal. É estranho, pois queria mantê-lo aberto, fazer todas as alterações necessárias e depois enviar para o banco de dados tudo de uma só vez.
Se alguém sabe porque acontece isso e puder me ajudar eu agradeço. |
|
| Voltar ao Topo |
|
 |
wolverinefarah Colaborador

Registrado: Sábado, 17 de Junho de 2006 Mensagens: 1770
|
Enviada: Seg Jan 07, 2008 5:21 pm Assunto: |
|
|
| CarneiroDelphi escreveu: | Olá amigo wolverinefarah.
Realmente ocorre dessa forma, mais não entendo porque depois que fecho o ClientDataSet com um Close, e depois reabro novamente, o mesmo funciona normal. É estranho, pois queria mantê-lo aberto, fazer todas as alterações necessárias e depois enviar para o banco de dados tudo de uma só vez.
Se alguém sabe porque acontece isso e puder me ajudar eu agradeço. |
amigo está usando que banco de dados e qual é seu componente de conexao com o banco ?
bye _________________ Fernando Farah
PROGRAMADOR PROGRESS
PROGRAMADOR DELPHI + FIREBIRD |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Seg Jan 07, 2008 6:51 pm Assunto: |
|
|
Amigo, uso o MySQL com o dbExpress.
Funciona tudo perfeitamente em um aplicativo comun.
Além do mais os drivers dele são os originais.
Só mais um detalhe: O campo no banco de dados é AutoInc, mais no DataSetProvider resolvi oculta-lo da camada client setando a propriedade provider flags do campo ID da seguinte forma:
| Código: |
ClientDataSetID.FieldByName('ID').ProviderFlags := [pfInWhere, pfInKey, pfHidden];
|
Esse seria o código em forma escrita, mais no meu caso, fiz essa configuração diretamente no ObjectInspector pelos campos persistentes do SQLTable, além dessa configuração, setei a propriedade Required desse campo como false, apesar de ser exigido pelo banco, pois pensei na possibilidade do próprio banco de dados resolver o problema, pois como disse, o campo é autoInc.
Essas são as configurações, que eu acredito que sejam as mais significativas, penso que estão corretas.
Mais se estiverem erradas, por favor me avisem.
Além do código postado no tópico principal, o restante é bem básico e acredito que não seja a causa do problema.
Mais em se tratando do problema, decidi aqui, postar o código do meu form padrão.
| Código: |
unit UFormCadPadrao;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, StdCtrls, Buttons, DB, dbClient, dbxpress, sqlExpr,
MConnect, UFormPesqPadrao;
type
TFormCadPadrao = class( TForm )
Panel1: TPanel;
Panel2: TPanel;
btnNovo: TBitBtn;
btnAlterar: TBitBtn;
btnSalvar: TBitBtn;
btnCancelar: TBitBtn;
btnFechar: TBitBtn;
dbnPadrao: TDBNavigator;
dsPadrao: TDataSource;
btnExcluir: TBitBtn;
btnLocalizar: TBitBtn;
lbTitulo: TLabel;
Label1: TLabel;
Label2: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnFecharClick(Sender: TObject);
procedure btnExcluirClick(Sender: TObject);
procedure btnCancelarClick(Sender: TObject);
procedure btnSalvarClick(Sender: TObject);
procedure btnAlterarClick(Sender: TObject);
procedure btnNovoClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
CDataSet: TClientDataSet;
FControlePrincipal: TWinControl;
procedure SetFocusControlePrincipal;
procedure OpenDataSet;
procedure CloseDataSet;
procedure UpdateDataSource;
public
procedure CreateForm( FormClass: TFormPesqPadraoClass; var Reference );
property ControlePrincipal: TWinControl read FControlePrincipal write FControlePrincipal;
end;
var
FormCadPadrao: TFormCadPadrao;
implementation
uses udmDados, uFormPrincipal;
{$R *.dfm}
procedure TFormCadPadrao.CloseDataSet;
begin
if Assigned( Self.CDataSet ) then
if Self.CDataSet.Active then
Self.CDataSet.Close;
end;
procedure TFormCadPadrao.CreateForm( FormClass: TFormPesqPadraoClass; var Reference );
var Instance: TFormPesqPadrao;
begin
Instance := TFormPesqPadrao( FormClass.NewInstance );
TFormPesqPadrao( Reference ) := Instance;
try
Instance.Create( Self );
except
TFormPesqPadrao( Reference ) := nil;
raise;
end;
if ( Instance is TFormPesqPadrao ) then
TFormPesqPadrao( Instance ).HandleNeeded;
end;
procedure TFormCadPadrao.btnAlterarClick(Sender: TObject);
begin
Self.OpenDataSet;
if Assigned( Self.CDataSet ) then
begin
if CDataSet.State in [dsEdit, dsInsert] then Exit;
CDataSet.Edit;
Self.UpdateDataSource;
end;
Self.SetFocusControlePrincipal;
end;
procedure TFormCadPadrao.btnCancelarClick(Sender: TObject);
begin
if Assigned( Self.CDataSet ) then
begin
if not (CDataSet.State in [dsEdit, dsInsert]) then Exit;
CDataSet.Cancel;
Self.UpdateDataSource;
end;
btnNovo.SetFocus;
end;
procedure TFormCadPadrao.btnExcluirClick(Sender: TObject);
begin
if Assigned( Self.CDataSet ) then
begin
if CDataSet.State in [dsEdit, dsInsert] then Exit;
if FormPrincipal.PergExcluirRegistro then
CDataSet.Delete;
Self.UpdateDataSource;
end;
btnNovo.SetFocus;
end;
procedure TFormCadPadrao.btnFecharClick(Sender: TObject);
begin
Self.Close;
end;
procedure TFormCadPadrao.btnNovoClick(Sender: TObject);
begin
Self.OpenDataSet;
if Assigned( Self.CDataSet ) then
begin
if CDataSet.State in [dsEdit, dsInsert] then Exit;
Self.CDataSet.Insert;
Self.UpdateDataSource;
end;
Self.SetFocusControlePrincipal;
end;
procedure TFormCadPadrao.btnSalvarClick(Sender: TObject);
begin
if Assigned( Self.CDataSet ) then
begin
if not (CDataSet.State in [dsEdit, dsInsert]) then Exit;
CDataSet.Post;
Self.UpdateDataSource;
end;
btnNovo.SetFocus;
end;
procedure TFormCadPadrao.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.CloseDataSet;
Action := caFree;
end;
procedure TFormCadPadrao.FormCreate(Sender: TObject);
begin
Self.CDataSet := TClientDataSet( Self.dsPadrao.DataSet );
Self.OpenDataSet;
Self.UpdateDataSource;
end;
procedure TFormCadPadrao.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = Chr(13) then
begin
Perform( WM_NEXTDLGCTL, 0, 0 );
Key := Chr( 0 );
Exit;
end;
end;
procedure TFormCadPadrao.OpenDataSet;
begin
if Assigned( Self.CDataSet ) then
if not Self.CDataSet.Active then
Self.CDataSet.Open;
end;
procedure TFormCadPadrao.SetFocusControlePrincipal;
begin
if Assigned( FControlePrincipal ) then
ControlePrincipal.SetFocus;
end;
procedure TFormCadPadrao.UpdateDataSource;
begin
Self.dsPadrao.DataSet := Self.CDataSet;
end;
end.
|
Esse código, representa o meu form de cadastro padrao, serve apenas como form de cadastro por enquanto, mais futuramente, pretendo incrementá-lo para poder usá-lo também como form master-detail.
O próximo código, representa o form de entrada de contas a pagar, ue no caso deriva do meu form padrao.
| Código: |
unit UFormContasPagar;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UFormCadPadrao, DB, DBCtrls, StdCtrls, Buttons, ExtCtrls, Grids,
DBGrids, Mask, DBClient;
type
TFormContasPagar = class( TFormCadPadrao )
dbDataVenc: TDBEdit;
dbIDFornecedor: TDBEdit;
dbHistorico: TDBEdit;
Label3: TLabel;
Label4: TLabel;
dbValor: TDBEdit;
dbFornecedor: TDBText;
dbrgStatus: TDBRadioGroup;
Label5: TLabel;
Label6: TLabel;
procedure dbValorExit(Sender: TObject);
procedure btnFecharClick(Sender: TObject);
procedure btnLocalizarClick(Sender: TObject);
procedure btnExcluirClick(Sender: TObject);
procedure btnCancelarClick(Sender: TObject);
procedure btnSalvarClick(Sender: TObject);
procedure btnAlterarClick(Sender: TObject);
procedure btnNovoClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormContasPagar: TFormContasPagar;
implementation
uses udmDados, UFormPesqContasPagar;
{$R *.dfm}
procedure TFormContasPagar.btnAlterarClick(Sender: TObject);
begin
inherited btnAlterarClick( Sender );
end;
procedure TFormContasPagar.btnCancelarClick(Sender: TObject);
begin
inherited btnCancelarClick( Sender );
end;
procedure TFormContasPagar.btnExcluirClick(Sender: TObject);
begin
inherited btnExcluirClick( Sender );
end;
procedure TFormContasPagar.btnFecharClick(Sender: TObject);
begin
inherited btnFecharClick( Sender );
end;
procedure TFormContasPagar.btnLocalizarClick(Sender: TObject);
begin
inherited;
Self.CreateForm( TFormPesqContasPagar, FormPesqContasPagar );
end;
procedure TFormContasPagar.btnNovoClick(Sender: TObject);
begin
inherited btnNovoClick( Sender );
end;
procedure TFormContasPagar.btnSalvarClick(Sender: TObject);
begin
inherited btnSalvarClick( Sender );
end;
procedure TFormContasPagar.dbValorExit(Sender: TObject);
begin
inherited;
btnSalvar.SetFocus;
end;
procedure TFormContasPagar.FormCreate(Sender: TObject);
begin
Self.dsPadrao.DataSet := dmDados.cdsContasPagar;
inherited FormCreate( Sender );
Self.ControlePrincipal := Self.dbDataVenc;
end;
end.
|
O código desse form é mais básico ainda, pois apenas é uma ligação ao form principal, no entanto, para que o mesmo funcione, é preciso ligar o DataSource dsPadrao ao ClientDataSet, caso contrário, não haverá ligação entre o ClientDataSet e os controles conscientes de dados do form. Além do mais, os controles conscientes de dados são ligados ao dsPadrao por meio da propriedade DataSource, e ligado aos campos por meio da propriedade DataField.
Pensei em criar um form dessa forma, pelo fato de que é bem mais simples para executar as operações dentro do cadastro, apenas clicando no botao correspondente, automaticamente ele executa o procedimento necessário. |
|
| Voltar ao Topo |
|
 |
wolverinefarah Colaborador

Registrado: Sábado, 17 de Junho de 2006 Mensagens: 1770
|
Enviada: Seg Jan 07, 2008 9:15 pm Assunto: |
|
|
| CarneiroDelphi escreveu: | Amigo, uso o MySQL com o dbExpress.
Funciona tudo perfeitamente em um aplicativo comun.
Além do mais os drivers dele são os originais.
Só mais um detalhe: O campo no banco de dados é AutoInc, mais no DataSetProvider resolvi oculta-lo da camada client setando a propriedade provider flags do campo ID da seguinte forma:
| Código: |
ClientDataSetID.FieldByName('ID').ProviderFlags := [pfInWhere, pfInKey, pfHidden];
|
Esse seria o código em forma escrita, mais no meu caso, fiz essa configuração diretamente no ObjectInspector pelos campos persistentes do SQLTable, além dessa configuração, setei a propriedade Required desse campo como false, apesar de ser exigido pelo banco, pois pensei na possibilidade do próprio banco de dados resolver o problema, pois como disse, o campo é autoInc.
Essas são as configurações, que eu acredito que sejam as mais significativas, penso que estão corretas.
Mais se estiverem erradas, por favor me avisem.
Além do código postado no tópico principal, o restante é bem básico e acredito que não seja a causa do problema.
Mais em se tratando do problema, decidi aqui, postar o código do meu form padrão.
| Código: |
unit UFormCadPadrao;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, StdCtrls, Buttons, DB, dbClient, dbxpress, sqlExpr,
MConnect, UFormPesqPadrao;
type
TFormCadPadrao = class( TForm )
Panel1: TPanel;
Panel2: TPanel;
btnNovo: TBitBtn;
btnAlterar: TBitBtn;
btnSalvar: TBitBtn;
btnCancelar: TBitBtn;
btnFechar: TBitBtn;
dbnPadrao: TDBNavigator;
dsPadrao: TDataSource;
btnExcluir: TBitBtn;
btnLocalizar: TBitBtn;
lbTitulo: TLabel;
Label1: TLabel;
Label2: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnFecharClick(Sender: TObject);
procedure btnExcluirClick(Sender: TObject);
procedure btnCancelarClick(Sender: TObject);
procedure btnSalvarClick(Sender: TObject);
procedure btnAlterarClick(Sender: TObject);
procedure btnNovoClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
CDataSet: TClientDataSet;
FControlePrincipal: TWinControl;
procedure SetFocusControlePrincipal;
procedure OpenDataSet;
procedure CloseDataSet;
procedure UpdateDataSource;
public
procedure CreateForm( FormClass: TFormPesqPadraoClass; var Reference );
property ControlePrincipal: TWinControl read FControlePrincipal write FControlePrincipal;
end;
var
FormCadPadrao: TFormCadPadrao;
implementation
uses udmDados, uFormPrincipal;
{$R *.dfm}
procedure TFormCadPadrao.CloseDataSet;
begin
if Assigned( Self.CDataSet ) then
if Self.CDataSet.Active then
Self.CDataSet.Close;
end;
procedure TFormCadPadrao.CreateForm( FormClass: TFormPesqPadraoClass; var Reference );
var Instance: TFormPesqPadrao;
begin
Instance := TFormPesqPadrao( FormClass.NewInstance );
TFormPesqPadrao( Reference ) := Instance;
try
Instance.Create( Self );
except
TFormPesqPadrao( Reference ) := nil;
raise;
end;
if ( Instance is TFormPesqPadrao ) then
TFormPesqPadrao( Instance ).HandleNeeded;
end;
procedure TFormCadPadrao.btnAlterarClick(Sender: TObject);
begin
Self.OpenDataSet;
if Assigned( Self.CDataSet ) then
begin
if CDataSet.State in [dsEdit, dsInsert] then Exit;
CDataSet.Edit;
Self.UpdateDataSource;
end;
Self.SetFocusControlePrincipal;
end;
procedure TFormCadPadrao.btnCancelarClick(Sender: TObject);
begin
if Assigned( Self.CDataSet ) then
begin
if not (CDataSet.State in [dsEdit, dsInsert]) then Exit;
CDataSet.Cancel;
Self.UpdateDataSource;
end;
btnNovo.SetFocus;
end;
procedure TFormCadPadrao.btnExcluirClick(Sender: TObject);
begin
if Assigned( Self.CDataSet ) then
begin
if CDataSet.State in [dsEdit, dsInsert] then Exit;
if FormPrincipal.PergExcluirRegistro then
CDataSet.Delete;
Self.UpdateDataSource;
end;
btnNovo.SetFocus;
end;
procedure TFormCadPadrao.btnFecharClick(Sender: TObject);
begin
Self.Close;
end;
procedure TFormCadPadrao.btnNovoClick(Sender: TObject);
begin
Self.OpenDataSet;
if Assigned( Self.CDataSet ) then
begin
if CDataSet.State in [dsEdit, dsInsert] then Exit;
Self.CDataSet.Insert;
Self.UpdateDataSource;
end;
Self.SetFocusControlePrincipal;
end;
procedure TFormCadPadrao.btnSalvarClick(Sender: TObject);
begin
if Assigned( Self.CDataSet ) then
begin
if not (CDataSet.State in [dsEdit, dsInsert]) then Exit;
CDataSet.Post;
Self.UpdateDataSource;
end;
btnNovo.SetFocus;
end;
procedure TFormCadPadrao.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.CloseDataSet;
Action := caFree;
end;
procedure TFormCadPadrao.FormCreate(Sender: TObject);
begin
Self.CDataSet := TClientDataSet( Self.dsPadrao.DataSet );
Self.OpenDataSet;
Self.UpdateDataSource;
end;
procedure TFormCadPadrao.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = Chr(13) then
begin
Perform( WM_NEXTDLGCTL, 0, 0 );
Key := Chr( 0 );
Exit;
end;
end;
procedure TFormCadPadrao.OpenDataSet;
begin
if Assigned( Self.CDataSet ) then
if not Self.CDataSet.Active then
Self.CDataSet.Open;
end;
procedure TFormCadPadrao.SetFocusControlePrincipal;
begin
if Assigned( FControlePrincipal ) then
ControlePrincipal.SetFocus;
end;
procedure TFormCadPadrao.UpdateDataSource;
begin
Self.dsPadrao.DataSet := Self.CDataSet;
end;
end.
|
Esse código, representa o meu form de cadastro padrao, serve apenas como form de cadastro por enquanto, mais futuramente, pretendo incrementá-lo para poder usá-lo também como form master-detail.
O próximo código, representa o form de entrada de contas a pagar, ue no caso deriva do meu form padrao.
| Código: |
unit UFormContasPagar;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UFormCadPadrao, DB, DBCtrls, StdCtrls, Buttons, ExtCtrls, Grids,
DBGrids, Mask, DBClient;
type
TFormContasPagar = class( TFormCadPadrao )
dbDataVenc: TDBEdit;
dbIDFornecedor: TDBEdit;
dbHistorico: TDBEdit;
Label3: TLabel;
Label4: TLabel;
dbValor: TDBEdit;
dbFornecedor: TDBText;
dbrgStatus: TDBRadioGroup;
Label5: TLabel;
Label6: TLabel;
procedure dbValorExit(Sender: TObject);
procedure btnFecharClick(Sender: TObject);
procedure btnLocalizarClick(Sender: TObject);
procedure btnExcluirClick(Sender: TObject);
procedure btnCancelarClick(Sender: TObject);
procedure btnSalvarClick(Sender: TObject);
procedure btnAlterarClick(Sender: TObject);
procedure btnNovoClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormContasPagar: TFormContasPagar;
implementation
uses udmDados, UFormPesqContasPagar;
{$R *.dfm}
procedure TFormContasPagar.btnAlterarClick(Sender: TObject);
begin
inherited btnAlterarClick( Sender );
end;
procedure TFormContasPagar.btnCancelarClick(Sender: TObject);
begin
inherited btnCancelarClick( Sender );
end;
procedure TFormContasPagar.btnExcluirClick(Sender: TObject);
begin
inherited btnExcluirClick( Sender );
end;
procedure TFormContasPagar.btnFecharClick(Sender: TObject);
begin
inherited btnFecharClick( Sender );
end;
procedure TFormContasPagar.btnLocalizarClick(Sender: TObject);
begin
inherited;
Self.CreateForm( TFormPesqContasPagar, FormPesqContasPagar );
end;
procedure TFormContasPagar.btnNovoClick(Sender: TObject);
begin
inherited btnNovoClick( Sender );
end;
procedure TFormContasPagar.btnSalvarClick(Sender: TObject);
begin
inherited btnSalvarClick( Sender );
end;
procedure TFormContasPagar.dbValorExit(Sender: TObject);
begin
inherited;
btnSalvar.SetFocus;
end;
procedure TFormContasPagar.FormCreate(Sender: TObject);
begin
Self.dsPadrao.DataSet := dmDados.cdsContasPagar;
inherited FormCreate( Sender );
Self.ControlePrincipal := Self.dbDataVenc;
end;
end.
|
O código desse form é mais básico ainda, pois apenas é uma ligação ao form principal, no entanto, para que o mesmo funcione, é preciso ligar o DataSource dsPadrao ao ClientDataSet, caso contrário, não haverá ligação entre o ClientDataSet e os controles conscientes de dados do form. Além do mais, os controles conscientes de dados são ligados ao dsPadrao por meio da propriedade DataSource, e ligado aos campos por meio da propriedade DataField.
Pensei em criar um form dessa forma, pelo fato de que é bem mais simples para executar as operações dentro do cadastro, apenas clicando no botao correspondente, automaticamente ele executa o procedimento necessário. |
coloca um refresh no botao salvar e veja se funciona...
bye _________________ Fernando Farah
PROGRAMADOR PROGRESS
PROGRAMADOR DELPHI + FIREBIRD |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Ter Jan 08, 2008 6:52 pm Assunto: |
|
|
Amigo, fiz como disse, mais infelizmente ocorreu outro erro:
"Must apply updates before refreshing data"
Visto que o codigo do botao salvar ficou assim:
| Código: |
if Assigned( Self.CDataSet ) then
begin
if not (CDataSet.State in [dsEdit, dsInsert]) then Exit;
Self.CDataSet.Post;
Self.CDataSet.Refresh;
end;
btnNovo.SetFocus;
|
Preciso salvar os dados com o ApplyUpdates, somente depois de ter tudo na tabela, e então envio os dados alterados para o servidor.
A questão é simples, só assim evito tráfego desnecessário na rede, pois se tiver que enviar cada registro por vez, e ainda por cima ter que fechar o ClientDataSet e depois Abrilo novamente, não vai ficar nem um pouco viavel.
Qualquer outra sugestão será muito bem vinda.
E por enquanto, agradeço por sua atenção. |
|
| Voltar ao Topo |
|
 |
wolverinefarah Colaborador

Registrado: Sábado, 17 de Junho de 2006 Mensagens: 1770
|
Enviada: Ter Jan 08, 2008 11:28 pm Assunto: |
|
|
| CarneiroDelphi escreveu: | Amigo, fiz como disse, mais infelizmente ocorreu outro erro:
"Must apply updates before refreshing data"
Visto que o codigo do botao salvar ficou assim:
| Código: |
if Assigned( Self.CDataSet ) then
begin
if not (CDataSet.State in [dsEdit, dsInsert]) then Exit;
Self.CDataSet.Post;
Self.CDataSet.Refresh;
end;
btnNovo.SetFocus;
|
Preciso salvar os dados com o ApplyUpdates, somente depois de ter tudo na tabela, e então envio os dados alterados para o servidor.
A questão é simples, só assim evito tráfego desnecessário na rede, pois se tiver que enviar cada registro por vez, e ainda por cima ter que fechar o ClientDataSet e depois Abrilo novamente, não vai ficar nem um pouco viavel.
Qualquer outra sugestão será muito bem vinda.
E por enquanto, agradeço por sua atenção. |
amigo, no Firebird estava com o mesmo problema resolvi da seguinte forma...
DM.CDS.Post;
DM.CDS.ApplyUpdates(0);
DM.CDS.Refresh;
e funcionou perfeitamente...espero que ajude...
bye _________________ Fernando Farah
PROGRAMADOR PROGRESS
PROGRAMADOR DELPHI + FIREBIRD |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Qua Jan 09, 2008 7:00 pm Assunto: |
|
|
Amigo, e se eu quizer enviar as atualizações somente antes de fechar o form ?
Quero isso por evitar enviar os dados a cada novo registro.
Já pensou se eu tiver numa venda e tiver que cancelar ela toda ?
Ou seja, se ela não tiver sido enviada ainda, é só não enviar nada, mais se ela já tiver no banco de dados e no módulo de contas a receber caso fosse venda a prazo ?
Ai o bixo pegaria, pois teria que apagar o registro no modulo de contas, depois teria que apagar nos itens do pedido e por fim apagar o pedido, o que no caso vai gerar trafego desnecessário pela rede.
O mesmo aconteceria se um determinado cliente desistir de comprar um determinado item naquele momento, pois se o item já tiver sido enviado, tenho que ir até o banco de dados para apagá-lo, mais se ele ainda tiver na memória, fica fácil, pois é só apagar no próprio micro cliente, evitando assim tráfego pela rede.
Existem várias outras situações, mais o que me veio agora foram essas, que de certa forma explica muito bem o porque de não dar um applyUpdates nesse momento.
Mais de qualquer forma, vou usá-lo de forma provisória, até que eu encontre uma solução melhor. |
|
| Voltar ao Topo |
|
 |
AlexSousa Colaborador


Registrado: Sexta-Feira, 12 de Novembro de 2004 Mensagens: 1879 Localização: São luís - MA
|
Enviada: Qua Jan 09, 2008 7:16 pm Assunto: |
|
|
blz CarneiroDelphi,
quer uma dica amigo, faça um break point no seu codigo e veja se descobre o por que do erro...blz
abraços, _________________ "Guarda com toda a diligência o teu coração, porque dele procedem as fontes da vida....Prov. 4:23" |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Qua Jan 09, 2008 7:40 pm Assunto: |
|
|
Amigo Alex.
Creio que tenha acompanhado o tópico desde o inicio.
Por parte de código-fonte tá tudo em ordem, não tenho muita dúvida de que o erro principal é devido a alguma configuração do DataSetProvider ou do ClientDataSet, de qualquer forma agradeço sua dedicação.
Mais se algum amigo tiver esperiencia em ClientDataSet e DataSetProvider no modelo multi-camadas e puder me ajudar com alguma dica sobre tais componentes, eu agradeço, pois creio que vou encontrar o problema neles, só que infelizmente, ainda não encontrei nada na net a respeito desses componentes, encontrei apenas configurações básicas sobre tal, preciso e configurações e informações avançadas sobre esses componentes.
Qualquer ajuda será muito bem vinda. |
|
| Voltar ao Topo |
|
 |
wolverinefarah Colaborador

Registrado: Sábado, 17 de Junho de 2006 Mensagens: 1770
|
Enviada: Qua Jan 09, 2008 9:20 pm Assunto: |
|
|
| CarneiroDelphi escreveu: | Amigo Alex.
Creio que tenha acompanhado o tópico desde o inicio.
Por parte de código-fonte tá tudo em ordem, não tenho muita dúvida de que o erro principal é devido a alguma configuração do DataSetProvider ou do ClientDataSet, de qualquer forma agradeço sua dedicação.
Mais se algum amigo tiver esperiencia em ClientDataSet e DataSetProvider no modelo multi-camadas e puder me ajudar com alguma dica sobre tais componentes, eu agradeço, pois creio que vou encontrar o problema neles, só que infelizmente, ainda não encontrei nada na net a respeito desses componentes, encontrei apenas configurações básicas sobre tal, preciso e configurações e informações avançadas sobre esses componentes.
Qualquer ajuda será muito bem vinda. |
cara, qdo vc fecha e abre o sistema ele aparece registrado certo ?
entao se for isso ele nao esta atualizando a tabela, faça o seguinte...
vá ao ClientDataSet no object inspector propriedade UpdateMode UpWhereKeyOnly, ative essa opção, e veja se funciona...
bye _________________ Fernando Farah
PROGRAMADOR PROGRESS
PROGRAMADOR DELPHI + FIREBIRD |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Qui Jan 10, 2008 6:26 am Assunto: |
|
|
Amigo, ele registra normalmente, mais quando eu fecho o ClientDataSet e abro novamente ai eu consigo o que eu quero, só que eu não quero fechá-lo para cada registro.
Você também disse para ir no ClientDataSet mudar a propriedade UpdateMode, certo ? Não seria no DataSetProvider ? De qualquer forma, no Provider já se encontra desse modo, mais vou tentar de outras formas e ver no que dá. |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Qui Jan 10, 2008 6:42 am Assunto: |
|
|
Amigo, agradeço antecipadamente por sua atenção e lhe peço desculpas por tanta encheção que devo estar causando aqui, pois já tentei várias alternativas, mais até agora, não encontrei nada na net.
Tentei as outras tres alternativas, mais nenhuma delas funcionou.
Explicando novamente: O que acontece é que o primeiro Post funciona normalmente, mais o segundo post da "Key Violation." mesmo o campo código sendo autoInc.
Outra coisa, no FieldEditor do SQLDataSet, no campo código tem uma propriedade chamada AutoGeneratedValue que está em "arNone", será que "arAutoInc" não daria certo ? Quais suas opiniões ? De qualquer forma estarei testando.
Outra propriedade no meu FieldEditor é ProviderFlags, que se encontra assim: "[pfInWhere,pfInKey,pfHidden]".
É necessário transferir o Campo código até a camada cliente ?
Por que no meu caso, optei por ocultá-la, e assim ela deixa de ser transferida até a camada Client. Será que isso não pode ser a causa do problema ?
Desculpe por tanto incoveniente e mais uma vez, muito agradecido por suas ajudas. |
|
| Voltar ao Topo |
|
 |
CarneiroDelphi Experiente

Registrado: Sexta-Feira, 5 de Agosto de 2005 Mensagens: 417
|
Enviada: Sex Jan 11, 2008 6:47 pm Assunto: |
|
|
| Ainda to sem solução. |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|