Fórum Herança de Formulário com Interbase (Delphi) Erro... #611333
14/06/2020
0
Primeira vez que trabalho com herança de formulário. Estou tento um problema no meu formulário "FILHO", quando clico no botão [NOVO], da a seguinte mensagem
abaixo:
Project Cardigan.exe raised exception class EDatabaseError with message 'ibQryAposataPai: Cannot modify a read-only dataset'.
Abaixo segue todas as linhas de código inseridas no Formulário "PAI" e Apos todas as linhas de código inseridas no Formulário "FILHO".
E os demais botoes [EDITA],[CANCELAR],[EXCLUIR],[GRAVAR], não funcionam.
Gostaria da vossa ajudar para que meu projeto funcione.
Link com a imagem do formulário Pai:
http://prntscr.com/szrw7w
Link com a imagem do formulário Filho:
http://prntscr.com/szrxbi
Formulario PAI ==============================================
unit uFrmApostasPai;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.Buttons,
Data.DB, IBX.IBCustomDataSet, IBX.IBQuery, Vcl.StdCtrls, Vcl.Mask, Vcl.Grids,
Vcl.DBGrids, System.ImageList, Vcl.ImgList, IBX.IBStoredProc, Vcl.DBActns,
System.Actions, Vcl.ActnList;
type
TfrmApostaPai = class(TForm)
ibQryAux1Pai: TIBQuery;
ibQryAux2Pai: TIBQuery;
dsAuxPai1: TDataSource;
dsAuxPai2: TDataSource;
ibQryApostaPai: TIBQuery;
dsApostaPai: TDataSource;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure SpeedButtonBotaoSairClick(Sender: TObject);
procedure EditReferenciaExit(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnNovoClick(Sender: TObject);
procedure btnGravarClick(Sender: TObject);
procedure btnEditarClick(Sender: TObject);
procedure btnCancelarClick(Sender: TObject);
procedure btnDeletarClick(Sender: TObject);
procedure btnSairClick(Sender: TObject);
procedure btnDeletarMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmApostaPai: TfrmApostaPai;
implementation
{$R *.dfm}
uses dmDados;
procedure TfrmApostaPai.btnCancelarClick(Sender: TObject);
begin
dsApostaPai.DataSet.Cancel;
btnNovo .Enabled := True;
btnEditar .Enabled := True;
btnCancelar .Enabled := False;
btnDeletar .Enabled := True;
btnGravar .Enabled := False;
btnSair .Enabled := True;
end;
procedure TfrmApostaPai.btnDeletarClick(Sender: TObject);
begin
if DBGridAposta.DataSource.DataSet.RecordCount=0 then
begin
Application.MessageBox ('Não existe registro no Bando de Dados para ser Deletado?' , 'Excluir Registro' , MB_ICONINFORMATION + MB_OK);
end;
if DBGridAposta.DataSource.DataSet.RecordCount<>0 then
begin
case Application.MessageBox('Deseja Excluir?' , Pchar ('Excluir Registro'),MB_YESNO + MB_ICONINFORMATION) of
IDYES:
begin
dsApostaPai.DataSet.Delete;
Dados.IBTransBanco.CommitRetaining;
btnNovo .Enabled := True;
btnEditar .Enabled := True;
btnCancelar .Enabled := False;
btnDeletar .Enabled := True;
btnGravar .Enabled := False;
btnSair .Enabled := True;
dsApostaPai.DataSet.Close;
end;
IDNO:
begin
btnNovo .Enabled := True;
btnEditar .Enabled := False;
btnCancelar .Enabled := False;
btnDeletar .Enabled := False;
btnGravar .Enabled := False;
btnSair .Enabled := True;
abort;
end;
end;
end
else //se nao tiver registro no banco
begin
btnNovo .Enabled := True;
btnEditar .Enabled := False;
btnCancelar .Enabled := False;
btnDeletar .Enabled := False;
btnGravar .Enabled := False;
btnSair .Enabled := True;
Abort;
end;
end;
procedure TfrmApostaPai.btnDeletarMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
;
end;
procedure TfrmApostaPai.btnEditarClick(Sender: TObject);
begin
dsApostaPai.DataSet.Edit;
btnNovo .Enabled := False;
btnEditar .Enabled := False;
btnCancelar .Enabled := True;
btnDeletar .Enabled := False;
btnGravar .Enabled := True;
btnSair .Enabled := False;
end;
procedure TfrmApostaPai.btnGravarClick(Sender: TObject);
begin
dsApostaPai.DataSet.Post;
Dados.IBTransBanco.CommitRetaining;
btnNovo .Enabled := True;
btnEditar .Enabled := True;
btnCancelar .Enabled := False;
btnDeletar .Enabled := True;
btnGravar .Enabled := False;
btnSair .Enabled := True;
Application.MessageBox('Registro Gravado com Sucesso.','Cardigan',MB_ICONINFORMATION+MB_OK);
DBGridAposta.SetFocus;
end;
procedure TfrmApostaPai.btnNovoClick(Sender: TObject);
begin
dsApostaPai.DataSet.Append;
btnNovo .Enabled := False;
btnEditar .Enabled := False;
btnCancelar .Enabled := True;
btnDeletar .Enabled := False;
btnGravar .Enabled := True;
btnSair .Enabled := False;
end;
procedure TfrmApostaPai.btnSairClick(Sender: TObject);
begin
Close;
end;
procedure TfrmApostaPai.EditReferenciaExit(Sender: TObject);
begin
{ if Length(Trim(EditReferencia.Text))<8 then
begin
Application.MessageBox('O Campo Referencia, tem que ter 8 digitos', 'Cardigan', + MB_ICONINFORMATION + MB_OK);
EditReferencia.Clear;
EditReferencia.SetFocus;
end; }
end;
procedure TfrmApostaPai.FormShow(Sender: TObject);
begin
dsApostaPai.DataSet.Open;
end;
procedure TfrmApostaPai.SpeedButtonBotaoSairClick(Sender: TObject);
begin
Close;
end;
end.Formulário FILHO ==============================================
unit uFrmApostaNormal_1; //FILHO
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uFrmApostasPai, Data.DB,
IBX.IBCustomDataSet, System.ImageList, Vcl.ImgList, IBX.IBQuery, Vcl.Grids,
Vcl.DBGrids, Vcl.StdCtrls, Vcl.DBCtrls, Vcl.Mask, Vcl.ExtCtrls,
IBX.IBStoredProc, Vcl.DBActns, System.Actions, Vcl.ActnList;
type
TfrmApostaNormal_1 = class(TfrmApostaPai)
ibQryAux2PaiID_CORES: TIntegerField;
ibQryAux2PaiCOR_DESCRICAO: TIBStringField;
ibQryAux1PaiID_APOSTA_TIPO: TIntegerField;
ibQryAux1PaiAPOS_DESCRICAO: TIBStringField;
ibQryAux1PaiAPOS_ABREVIACAO: TIBStringField;
ibQryApostaPaiID_APOSTA1: TIntegerField;
ibQryApostaPaiAPOS1_REFERENCIA: TIntegerField;
ibQryApostaPaiIDAPOSTA_TIPO: TIntegerField;
ibQryApostaPaiIDCORES: TIntegerField;
procedure btnNovoClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure EditReferenciaChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmApostaNormal_1: TfrmApostaNormal_1;
implementation
{$R *.dfm}
uses dmLookupComboBox, dmDados;
procedure TfrmApostaNormal_1.btnNovoClick(Sender: TObject);
begin
inherited;
EditReferencia.SetFocus;
dsAuxPai1.DataSet.Open; //dblook tipo
dsAuxPai2.DataSet.Open; //dblook cor
end;
procedure TfrmApostaNormal_1.FormShow(Sender: TObject);
begin
inherited;
EditReferencia.SetFocus;
end;
end.
Rubens Pena
Curtir tópico
+ 0Posts
15/06/2020
Emerson Nascimento
De qualquer modo, sempre usei os componentes dbExpress (TSQLConnection, TSQLDataset, TSQLQuery, TSQLStoredProc, TSQLClientDataset).
Avalie a possibilidade de trocar os componentes.
Gostei + 0
15/06/2020
Rubens Pena
https://youtu.be/sQnVIeZt5lg
Gostei + 0
15/06/2020
Emerson Nascimento
Porque teoricamente, o form frmApostaNormal_1 deveria fazer a ligação entre os componentes contidos nele.
E o form frmApostasPai deveria abstrair tudo, utilizando o dataset a partir do datasource (isto aparentemente está correto).
Gostei + 0
15/06/2020
Rubens Pena
De qualquer modo, sempre usei os componentes dbExpress (TSQLConnection, TSQLDataset, TSQLQuery, TSQLStoredProc, TSQLClientDataset).
Avalie a possibilidade de trocar os componentes.
Aqui é a tabela do formulário que estou utilizando e abaixo as tabelas estrangeiras
No TIBQuery estou usando a seguinte SQL: select id_aposta1, apos1_referencia, idaposta_tipo, idcores from aposta_normal1
CREATE TABLE APOSTA_NORMAL1
(
ID_APOSTA1 INTEGER NOT NULL, //PK
APOS1_REFERENCIA NUMERIC(8,0),
APOS1_COR1 VARCHAR(20),
IDCORES INTEGER, //Aqui é uma das chaves extrangeiras (tabela Cores)
IDAPOSTA_TIPO INTEGER //Aqui é a outra chaves extrangeira (tabela Aposta_Tipo)
);No TIBQuery estou usando a seguinte SQL: select * from CORES order by cor_descricao asc
CREATE TABLE CORES
(
ID_CORES INTEGER NOT NULL, //PK
COR_DESCRICAO VARCHAR(100)
);No TIBQuery estou usando a seguinte SQL: select * from APOSTA_TIPO order by apos_abreviacao asc
CREATE TABLE APOSTA_TIPO
(
ID_APOSTA_TIPO INTEGER NOT NULL, //PK
APOS_DESCRICAO VARCHAR(15),
APOS_ABREVIACAO VARCHAR(2)
);Não tem nenhum join.
Gostei + 0
15/06/2020
Rubens Pena
Deu certo, fiz apenas uma alteração no meu form Pai.
Troquei a IBQuery por um IBTable (para fazer o cadastro) e mantive as 02 IBQuery para auxiliar na utilização dos LookupComboBox.
Obrigado por tentar me ajudar Emerson Nascimento.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)