Herança de Formulário com Interbase (Delphi) Erro...
Boa noite.
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:
Link com a imagem do formulário Filho:
Formulario PAI ==============================================
Formulário FILHO ==============================================
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
Curtidas 0
Respostas
Emerson Nascimento
14/06/2020
Pelo que eu entendi, os componentes IBQuery são somente-leitura. Não sei se é porque são unidirecionais ou porque há algum join na tua instrução.
De qualquer modo, sempre usei os componentes dbExpress (TSQLConnection, TSQLDataset, TSQLQuery, TSQLStoredProc, TSQLClientDataset).
Avalie a possibilidade de trocar os componentes.
De qualquer modo, sempre usei os componentes dbExpress (TSQLConnection, TSQLDataset, TSQLQuery, TSQLStoredProc, TSQLClientDataset).
Avalie a possibilidade de trocar os componentes.
GOSTEI 0
Rubens Pena
14/06/2020
Bom dia. Fiz um vídeo para que possam entender o que está acontecendo:
https://youtu.be/sQnVIeZt5lg
GOSTEI 0
Emerson Nascimento
14/06/2020
No teu frmApostasPai você tem o dataset ibQryApostaPai, e ali a propriedade DataSource está vazia (0"25'), mas no teu form frmApostaNormal_1, a mesma query está com a propriedade DataSource apontando para um dataset do datamodulo (7"16'). Isto está correto?
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).
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
Rubens Pena
14/06/2020
Pelo que eu entendi, os componentes IBQuery são somente-leitura. Não sei se é porque são unidirecionais ou porque há algum join na tua instrução.
De qualquer modo, sempre usei os componentes dbExpress (TSQLConnection, TSQLDataset, TSQLQuery, TSQLStoredProc, TSQLClientDataset).
Avalie a possibilidade de trocar os componentes.
Boa tarde Emerson. Todo meu projeto esta utilizando os componentes da palheta Interbase. Como eu tenho mais 16 formes (quase iguais) achei melhor criar um form pai, para agilizar o processo. Segue abaixo como estão as tabelas que estou utilizando nesse formulárioDe 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
Rubens Pena
14/06/2020
Boa noite.
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.
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