Fórum Como controlar DBGrid #286960

05/07/2005

0

Bom dia a todos,

nunca precisei usar a dbgrid, agora em um sistema aqui estou precisando usa-la e me deparei com os seguintes problemas, como faco pra manter o usuario ´preso´ em uma coluna enquanto ele nao inserir um valor valido?Como faco pra nao inserir um novo registro ou editar um existente enquanto o usuario nao preencher correntamente o atual?Como faco pro enter valer como tab dentro das celulas da dbgrid?


Agradecimento


Skywalker

Skywalker

Responder

Posts

05/07/2005

Sremulador

que tal utilizar o onexit


Responder

Gostei + 0

05/07/2005

Skywalker

Primeiramente muito obrigado pela sugestao, mas tentei usar o onexit, mas ele so funciona quando o dbgrid perde o foco, ou seja, se o usuario mudar de uma coluna pra outra ou de uma linha pra outra o evento nao e chamando, teria outra sugestao?



Agradecimentos


Responder

Gostei + 0

05/07/2005

Bruno Belchior

o evento OnValidate do Field correspondente (gere uma exceção)...


Responder

Gostei + 0

05/07/2005

Jairroberto

Olá, skywalker!

As regras de negócios que envolvem a validação de campos e registros devem sempre que possível colocadas no DataSet e não nos controles visuais, assim, uma mesma regra vai valer quando se usa DBEdit ou DBGrid. Para isso, os componentes de acesso a dados possuem propriedades e eventos específicos:

[u:b0fe1c7574]TField:[/u:b0fe1c7574]
- propriedades CustomConstraint e ConstraintErrorMessage
Table1Field1.CustomConstraint := ´x > 0 and x < 100´;
Table1Field1.ConstraintErrorMessage := ´O campo Field1 deve conter um valor entre 1 e 99´;


- evento OnValidate
procedure TForm1.Table1Field1Validate(Sender: TField);
begin
  if (Sender.AsInteger < 1) or (Sender.AsInteger > 99) then
    DatabaseError(´O campo Field1 deve conter um valor entre 1 e 99´);
end;


- propriedade Required (quando True, o campo não pode ser nulo)

[u:b0fe1c7574]TDataSet:[/u:b0fe1c7574]
- propriedade Constraints
semelhante ao ´CustomConstraint´ do TField, porém com a possibilidade de incluir vários campos na cláusula SQL de validação. Ex.: (Field1 > 0) and (Field2 in (´´D´´, ´´C´´))
- evento OnBeforePost
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
  if DataSet.FieldByName(´Field1´).AsInteger <= 0 then
    DatabaseError(´Field1 precisa ser maior que zero´);
  if not AnsiContainsText(´DC´, DataSet.FieldByName(´Field2´).AsString) then
    DatabaseError(´Field2 deve ser "D" ou "C"´);
end;



Um abraço,
Jair


Responder

Gostei + 0

05/07/2005

Silviogs

Olá skywalker

desenvolvi um sistema de pedidos e consegui controlar o dbgrid lá vai os fontes:

procedure TFmCadPedidos.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Case Key Of
Vk_Return ,
Vk_Down : if not (ActiveControl is TDBGrid) then
Perform(Wm_NextDlgCtl,0,0);
Vk_Up : if not (ActiveControl is TDBGrid) then
Perform(Wm_NextDlgCtl,1,0);
Vk_Insert : if (ActiveControl is TDBGrid) then
BBtnNovoItem.Click;
Vk_F10 : if (ActiveControl is TDBGrid) then
BBtnGravarItem.Click;
Vk_Delete : if (ActiveControl is TDBGrid) then
BBtnExcluirItem.Click;
Vk_F6 : if (ActiveControl is TDBGrid) then
BBtnCancelaItems.Click;
Vk_F2 : if (ActiveControl is TDBGrid) then
BBtnAtualizaItems.Click;
Vk_F4 : if (ActiveControl is TDBGrid) then
SBCancelPedido.Click
else
MessagedlgDef(´Voce precisa primeiro cancelar os items!´+#13+´para em seguida cancelar o pedido´,mtconfirmacao,[mbOk], mrSim,0,´Sair Sistema´,´´,´1´);
Vk_F12 : if (ActiveControl is TDBGrid) then
SBFechaPedido.Click;
end;
end;

procedure TFmCadPedidos.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = 13 then begin
if not (ActiveControl is TDBGrid) then begin
Key := 0;
Perform(WM_NEXTDLGCTL, 0, 0);
end
else
if DBGrid1.SelectedIndex = 0 then begin
if DbGrid1.SelectedField.AsInteger = 0 then begin
with TFmMostraProduto.create(self) do
try showmodal;
DataModule1.Items.Edit;
DbGrid1.SelectedField.AsFloat := mcodigo;
finally free;
end;
end;
DataModule1.Items.Edit;
if not DataModule1.Produtos.Findkey([DbGrid1.SelectedField]) then begin
messagebeep(0);
// messagedlg(´Produto não Cadastrado ?´,mtError,[mbOk],0);
MessagedlgDef(´Produto não Cadastrado ?´,mterror,[mbOk], mrSim,0,´Sair Sistema´,´´,´1´);
DBGrid1.SetFocus;
DBGrid1.SelectedIndex := 0;
DBGrid1.SelectedField.Name :=´ProdutoID´;
end
else begin
mcodigo := DbGrid1.SelectedField.AsFloat;
if DataModule1.Items.Findkey([DataModule1.PedidosPedidoID.Value+mcodigo]) then begin
// Messagedlg(´Item já Cadastrado para este pedido !´,mtError,[mbOk],0);
MessagedlgDef(´Item já Cadastrado para este pedido !´,mterror,[mbOk], mrSim,0,´Sair Sistema´,´´,´1´);
BBtnNovoItem.Default := true;
ActiveControl := BBtnNovoitem;
end
else begin
DataModule1.Items.Edit;
DataModule1.ItemsDescricao.Value := DataModule1.ProdutosDescricao.Value;
DataModule1.ItemsUnidade.Value := DataModule1.ProdutosUnidade.Value;
DataModule1.ItemsPrecoUnitario.Value := DataModule1.ProdutosPrecoUnitario.Value;
DBGrid1.SelectedIndex := 4;
end
end
end
else
if DBGrid1.SelectedIndex = 1 then begin
DataModule1.ItemsDescricao.Value := DataModule1.ProdutosDescricao.Value;
DataModule1.ItemsUnidade.Value := DataModule1.ProdutosUnidade.Value;
DataModule1.ItemsPrecoUnitario.Value := DataModule1.ProdutosPrecoUnitario.Value;
DBGrid1.SelectedIndex := 4;
end
else
if DBGrid1.SelectedIndex = 4 then begin
if DataModule1.ItemsQuantidade.Value = 0 then
// Messagedlg(´Você precisa digitar a Quantidade´,mtError,[mbOk],0)

else begin
if DataModule1.ProdutosQuantidade.Value = 0 then
// Messagedlg(´Estoque Zerado, favor reabastecer o Estoque!´,mtWarning,[mbOk],0)
else
if (DataModule1.ItemsQuantidade.Value) > DataModule1.ProdutosQuantidade.Value then begin
// Messagedlg(´Quantidade maoir que a contida no Estoque!´,mtWarning,[mbOk],0);
DBGrid1.SelectedIndex := 4;
end
else begin
if (DataModule1.ProdutosQuantidade.Value - DataModule1.ItemsQuantidade.Value) <= DataModule1.ProdutosEstMin.Value then
// Messagedlg(´Você atingiu o Estoque Mímino´,mtWarning,[mbOk],0);
DataModule1.ItemsValorTotal.Value := (DataModule1.ItemsPrecoUnitario.Value * DataModule1.ItemsQuantidade.Value);
with TDBGrid(ActiveControl) do
if selectedindex < (fieldcount -1) then
selectedindex := selectedindex +1
else
selectedindex := 0
end
end
end
else
if DBGrid1.SelectedIndex = 5 then begin
if DataModule1.ItemsDesconto.Value <> 0 then begin
DataModule1.ItemsValorTotal.Value := (DataModule1.ItemsPrecoUnitario.Value * DataModule1.ItemsQuantidade.Value);
DataModule1.ItemsValorTotal.Value := DataModule1.ItemsValorTotal.Value - DataModule1.ItemsDesconto.Value;
end
else
DataModule1.ItemsDesconto.Value := 0.00;
if messagedlg(´Confirma o Item para o Pedido ?´,mtconfirmation,[mbyes,mbno],0) = idyes then begin
BBtnGravarItemClick(Sender);
BBtnNovoItem.Default := true;
DBGrid1.SelectedIndex := 0;
end
end
else
with TDBGrid(ActiveControl) do
if selectedindex < (fieldcount -1) then
selectedindex := selectedindex +1
else
selectedindex := 0
end;
end;

procedure TFmCadPedidos.Volta_Campo(Sender: TObject);
begin
if (ActiveControl is TDBGrid) then
DbGrid1.selectedindex := DbGrid1.selectedindex - 1;
end;


Atenciosamente

Silvio Guedes


Responder

Gostei + 0

05/07/2005

Skywalker

Ola gente, muito obrigado hein galera foi muito boa as dicas de voce, fiquei ate emocionado :cry: com tamanha atencao, hehehehe, obrigado a todos :wink:



Agradecimentos


Responder

Gostei + 0

07/07/2005

Marco Salles

[b:d74be320be]Bom.....[/b:d74be320be]

Olá, skywalker! As regras de negócios que envolvem a validação de campos e registros devem sempre que possível colocadas no DataSet e não nos controles visuais, assim, uma mesma regra vai valer quando se usa DBEdit ou DBGrid. Para isso, os componentes de acesso a dados possuem propriedades e eventos específicos: TField: - propriedades CustomConstraint e ConstraintErrorMessage Código: Table1Field1.CustomConstraint := ´x > 0 and x < 100´; Table1Field1.ConstraintErrorMessage := ´O campo Field1 deve conter um valor entre 1 e 99´; - evento OnValidate Código: procedure TForm1.Table1Field1Validate(Sender: TField); begin if (Sender.AsInteger < 1) or (Sender.AsInteger > 99) then DatabaseError(´O campo Field1 deve conter um valor entre 1 e 99´); end; - propriedade Required (quando True, o campo não pode ser nulo) TDataSet: - propriedade Constraints semelhante ao ´CustomConstraint´ do TField, porém com a possibilidade de incluir vários campos na cláusula SQL de validação. Ex.: (Field1 > 0) and (Field2 in (´´D´´, ´´C´´)) - evento OnBeforePost Código: procedure TForm1.Table1BeforePost(DataSet: TDataSet); begin if DataSet.FieldByName(´Field1´).AsInteger <= 0 then DatabaseError(´Field1 precisa ser maior que zero´); if not AnsiContainsText(´DC´, DataSet.FieldByName(´Field2´).AsString) then DatabaseError(´Field2 deve ser ´D´ ou ´C´´); end; Um abraço,



Responder

Gostei + 0

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

Aceitar