Herança de Formulário com Interbase (Delphi) Erro...

14/06/2020

6

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:
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.
Responder

Posts

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.
Responder

15/06/2020

Rubens Pena

Bom dia. Fiz um vídeo para que possam entender o que está acontecendo:

https://youtu.be/sQnVIeZt5lg
Responder
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).
Responder

15/06/2020

Rubens Pena

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ário

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.
Responder

15/06/2020

Rubens Pena

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.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar