Herança de Formulário com Interbase (Delphi) Erro...
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
Posts
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.
15/06/2020
Rubens Pena
https://youtu.be/sQnVIeZt5lg
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).
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.
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.
Clique aqui para fazer login e interagir na Comunidade :)