Jump to content

Erro 'Cannot perform this operation on a closed dataset' ao fechar tela do PDV no Delphi 7


Postagens Recomendadas

boa tarde equipe casa do desenvolvedor. gente como me inscrevi  no site.

dizendo que sou aprendiz de desenvolvedor, estou com uma dificuldade muito grande em resolver

um problema que estou tendo n o delphi 7 quanto tento fechar a tela do pdv clicando com a tecla esc

pra aparecer um imputbox pra digitar uma senha pra fechar a tela aparece a seguinte mensagem.

cannot perform this operation on a closed dataset. e isto acontece quando cancela uma venda no pdv

na parte de pagamentos e também quando finalizo uma venda que quando clico em imprimir a nota

fiscal. que em seguida volta pra tela do pdv que e quando aperto a tecla esc. que poder me ajudar eu agradeço.

se precisar irei disponibilizar o algoritmo do programa.

Link to comment
Compartilhe em outros sites

  • Douglas Garcia mudou o título para Erro 'Cannot perform this operation on a closed dataset' ao fechar tela do PDV no Delphi 7

Boa noite gobeti.junior ! aqui abaixo esta o código do formulário de pdv

unit UPdv;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Mask, DBCtrls, Grids, DBGrids, Buttons;

type
  TfrmPdv = class(TForm)
    PanelDescricao: TPanel;
    PanelCaixa: TPanel;
    Label1: TLabel;
    EditCodigoBarras: TEdit;
    Label2: TLabel;
    EditQtde: TEdit;
    DBEdit1: TDBEdit;
    Label3: TLabel;
    Label4: TLabel;
    DBEdit2: TDBEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText3: TDBText;
    LabelConsumidor: TLabel;
    LabelNumeroNota: TLabel;
    produtosfotos: TImage;
    EditDigitos: TEdit;
    EditCodigos: TEdit;
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
    procedure EditCodigoBarrasKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure NovaVenda;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure EditCodigosChange(Sender: TObject);
    procedure GerarNumeroNota;
    procedure ProdutosAdd;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure AlterarQuantidade;
    procedure RemoverProdutos;
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
  Senha :String [6];
      { Private declarations }
  public
  TAM:Integer;
  Codigos,Digitos:String;
  PRO,QTDE:Integer;
  TotalNota:Double;
  Quantidade:Integer;
    { Public declarations }
  end;

var
  frmPdv: TfrmPdv;

implementation

uses Udm_dados, ADODB, DB, U_funcoes, UConsultasdeProdutos, UFinalizarVendas,
UPagamentos;

{$R *.dfm}

procedure TfrmPdv.EditCodigoBarrasKeyPress(Sender: TObject; var Key: Char);
begin
    if Key = #13 then
begin
      with dm_dados.sql_vendasconsultas do
 begin
      close;
       SQL.Clear;
        SQL.Add('select*from tbl_produtos');
         SQL.Add('where prod_codigo_barras Like :Codigos');
         Parameters.ParamByName('Codigos').Value := EditCodigoBarras.Text;
         Open;
       if recordcount > 0 then
 begin
       ProdutosAdd;
       PanelDescricao.Caption := dm_dados.sql_vendasconsultasprod_produtos.Value;
       produtosfotos.Picture.LoadFromFile(dm_dados.sql_vendasconsultasprod_fotos.Value);
 end
 else
       ShowMessage('Produto nao Cadastrado');
 end;
      EditCodigoBarras.Clear;
      EditCodigoBarras.SetFocus;
end;
end;

procedure TfrmPdv.FormShow(Sender: TObject);
begin
      PanelDescricao.Caption := 'Caixa Aberto - Aguardando Clientes';
      PanelCaixa.Caption := 'Tecle F2 para uma nova Vendas';
      LabelConsumidor.Caption := '';
end;

procedure TfrmPdv.NovaVenda;
begin
     GerarNumeroNota;
     dm_dados.tbl_vendas.Insert;
     dm_dados.tbl_vendasven_numero_nota.Value := Codigos;
     dm_dados.tbl_vendasven_data_venda.Value:= Date;
     dm_dados.tbl_vendasven_hora_venda.Value:= Time;
     dm_dados.tbl_vendasfunc_id.Value:= dm_dados.sql_acessofunc_id.Value;
     dm_dados.tbl_vendascli_id.Value:= 1;
     EditCodigoBarras.Enabled := true;
     EditCodigoBarras.SetFocus;
     LabelConsumidor.Caption := 'Consumidor';
     PanelDescricao.Caption := 'Venda Iniciada - Inserindo Produtos';
     PanelCaixa.Caption := 'F5 Alterar Qtde - F7 Excluir Produtos - F8 Consutar Produtos - F11 Pagamentos - F12 Finalizar';
end;

procedure TfrmPdv.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
       if Key = VK_F2 then
       if EditCodigoBarras.Enabled = True then
       ShowMessage('Venda ja Iniciada')
else
begin
     NovaVenda;
end
else
begin
     if key = VK_F5 then
     if EditCodigoBarras.Enabled = false then
     ShowMessage('Inicie uma venda Antes')
else
begin
      AlterarQuantidade;
end
else
begin
      if Key = VK_F7 then
begin
      if dm_dados.sql_carrinhos.RecordCount < 1 then
      ShowMessage('Nao ha produtos no Pdv')
 else
begin
         Senha := InputBox('Codigo', #31 + 'Digite a senha para Excluir', '');
     if(Senha <> 'JESUS') and (Senha <> 'jesus') then
         ShowMessage('Senha Incorreta')
     else
begin
          RemoverProdutos;
     end;
 end;
     end
     else
begin
         if Key = VK_F8 then
begin
         try
              Application.CreateForm(TfrmConsultasdeProdutos,frmConsultasdeProdutos);
              frmConsultasdeProdutos.ShowModal;
      finally
              freeandnil(frmConsultasdeProdutos);
end;
end;

begin
      if Key = VK_F12 then
      if dm_dados.sql_carrinhos.RecordCount < 1 then
      ShowMessage('Nao há produtos no Pdv')
 else
begin
      try
              Application.CreateForm(TfrmFinalizarVendas,frmFinalizarVendas);
              frmFinalizarVendas.ShowModal;
      finally
              freeandnil(frmFinalizarVendas);
end;
 end;
 end;
end;
end;
end;
end;

procedure TfrmPdv.EditCodigosChange(Sender: TObject);
begin
      TAM := Length(EditCodigos.Text);
     if TAM = 12 then
begin
     Codigos := EditCodigos.Text;
     Digitos := Codigos;
     Codigos := Codigos + EAN13(Digitos);
     LabelNumeroNota.Caption := Codigos;
     EditDigitos.Text := EAN13(Digitos);
end;
end;

procedure TfrmPdv.GerarNumeroNota;
begin
      EditCodigos.Text := FormatDateTime('yymmdd',Date)+FormatDateTime('hhmmss',Time);
end;

procedure TfrmPdv.ProdutosAdd;
begin
PRO := dm_dados.sql_vendasconsultasprod_idi.Value;
QTDE := StrToInt(EditQtde.Text);
////////////////////////////////////////////
with dm_dados.sql_carrinhos do
begin
      Close;
       SQL.Clear;
        SQL.Add('select*from tbl_carrinhos c , tbl_produtos p');
         SQL.Add('where c.car_produtos = p. prod_idi');
          SQL.Add('and c.car_produtos = :Produto');
           Parameters.ParamByName('Produto').Value := PRO;
           Open;
end;
/////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
if dm_dados.sql_carrinhos.RecordCount = 0 then
begin
with dm_dados.sql_ProdutosAdd do
begin
      Close;
       SQL.Clear;
        SQL.Add('insert into tbl_carrinhos');
         SQL.Add('(car_produtos , car_qtde)');
          SQL.Add('values(:Produto , :Qtd)');
           Parameters.ParamByName('Produto').Value := PRO;
           Parameters.ParamByName('Qtd').Value := QTDE;
           ExecSQL;
     end;
   end
 else
begin
        with dm_dados.sql_ProdutosAdd do
begin
      Close;
       SQL.Clear;
        SQL.Add('update tbl_carrinhos set car_qtde = car_qtde + :Qtd');
         SQL.Add('where car_produtos = :Produto');
           Parameters.ParamByName('Produto').Value := PRO;
           Parameters.ParamByName('Qtd').Value := QTDE;
           ExecSQL;
   end;
end;

/////Remove do Estoque
begin
with dm_dados.sql_estoque do
begin
      Close;
       SQL.Clear;
        SQL.Add('update tbl_produtos set prod_qtde = prod_qtde - :Qtd');
         SQL.Add('where prod_idi = :Codigos');
           Parameters.ParamByName('Codigos').Value := PRO;
           Parameters.ParamByName('Qtd').Value := QTDE;
           ExecSQL;
   end;

///////////////////////////////////////////////////////////////
with dm_dados.sql_carrinhos do
begin
      Close;
       SQL.Clear;
        SQL.Add('select*from tbl_carrinhos c , tbl_produtos p');
         SQL.Add('where c.car_produtos = p. prod_idi');
         Open;
end;
EditQtde.Text := '1';


////////Somar Total da nota
dm_dados.sql_carrinhos.First;
TotalNota := 0;
while not dm_dados.sql_carrinhos.Eof do
begin
     TotalNota := TotalNota + dm_dados.sql_carrinhoscar_subtotal.Value;
     dm_dados.sql_carrinhos.Next;
end;
dm_dados.tbl_vendasven_total_venda.Value := TotalNota;
end;
end;
procedure TfrmPdv.FormClose(Sender: TObject; var Action: TCloseAction);
begin
      with dm_dados.sql_carrinhos do
begin
      Close;
      Open;
      if RecordCount > 0 then
begin
      First;
      while not dm_dados.sql_carrinhos.Eof do
begin
      with dm_dados.sql_estoque do
begin
      Close;
       SQL.Clear;
        SQL.Add('update tbl_produtos set prod_qtde = prod_qtde + :Qtd');
         SQL.Add('where prod_idi = :Codigos');
           Parameters.ParamByName('Qtd').Value := dm_dados.sql_carrinhoscar_qtde.Value;
           Parameters.ParamByName('Codigos').Value := dm_dados.sql_carrinhoscar_produtos.Value;
           ExecSQL;
      end;
           Next;
      end;
           with dm_dados.sql_carrinhos do
    begin
           close;
           Open;
           sql.Clear;
           SQL.Add('delete from tbl_carrinhos');
           ExecSQL;
    end;
           dm_dados.tbl_vendas.Close;
    end;
  end;
end;

procedure TfrmPdv.FormCreate(Sender: TObject);
begin
      dm_dados.tbl_vendas.Open;
      dm_dados.tbl_vendas.Last;
      EditCodigoBarras.Enabled := False;
      EditQtde.Text := '1';
end;

procedure TfrmPdv.AlterarQuantidade;
begin
Quantidade := StrToInt(InputBox('Alterar Qtde' ,'Digite a Qtde' , '1'));
EditQtde.Text := IntToStr(Quantidade);
end;
//////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////
procedure TfrmPdv.RemoverProdutos;
begin
PRO := dm_dados.sql_carrinhoscar_produtos.Value;
QTDE := StrToInt(InputBox('Remover Produto' , 'Digite a Qtde' , '1'));
////////////////////////////////////////////////

begin
     if QTDE > dm_dados.sql_carrinhoscar_qtde.Value then
begin
     QTDE := dm_dados.sql_carrinhoscar_qtde.Value;
end;

////////////////////////////////////////////////////
begin
with dm_dados.sql_ProdutosAdd do
begin
      Close;
       SQL.Clear;
        SQL.Add('update tbl_carrinhos set car_qtde = car_qtde - :Qtd');
         SQL.Add('where car_produtos = :Produto');
           Parameters.ParamByName('Produto').Value := PRO;
           Parameters.ParamByName('Qtd').Value := QTDE;
           ExecSQL;

///////////////////////////////////////////////////////////////////
with dm_dados.sql_estoque do
begin
      Close;
       SQL.Clear;
        SQL.Add('update tbl_produtos set prod_qtde = prod_qtde + :Qtd');
         SQL.Add('where prod_idi = :Codigos');
           Parameters.ParamByName('Codigos').Value := PRO;
           Parameters.ParamByName('Qtd').Value := QTDE;
           ExecSQL;
     end;

     Close;
       SQL.Clear;
        SQL.Add('delete from tbl_carrinhos');
         SQL.Add('where car_qtde = 0');
         ExecSQL;
         dm_dados.sql_carrinhos.Close;
         dm_dados.sql_carrinhos.Open;
         EditCodigoBarras.SetFocus;
         //dm_dados.Projeto_Pdv.CommitTrans;
     end;
   end;
  end;

////////Atualizar Total da nota
dm_dados.sql_carrinhos.First;
TotalNota := 0;
while not dm_dados.sql_carrinhos.Eof do
begin
     TotalNota := TotalNota + dm_dados.sql_carrinhoscar_subtotal.Value;
     dm_dados.sql_carrinhos.Next;
end;
dm_dados.tbl_vendasven_total_venda.Value := TotalNota;
end;
procedure TfrmPdv.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
      if Key = VK_F11 then
 begin
      try
              Application.CreateForm(TfrmPagamentos,frmPagamentos);
              frmPagamentos.ShowModal;
      finally
              freeandnil(frmPagamentos);
 end;
end;
end;

procedure TfrmPdv.FormKeyPress(Sender: TObject; var Key: Char);
begin
      if Key = #27 then
      if dm_dados.sql_carrinhos.RecordCount > 0 then
     ShowMessage('Finalize ou Cancele a venda Antes de Sair do Pdv')
else
begin
       Senha := InputBox('Codigo', #31 + 'Digite a senha para Sair', '');
      if(Senha <> 'JESUS') and (Senha <> 'jesus') then
       ShowMessage('Senha Incorreta')
else
begin
      Close;
end;
end;
end;

procedure TfrmPdv.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
      //if (dm_dados.sql_carrinhosprod_validade.Value = date + 75) then
//begin
        //DBGrid1.Canvas.Brush.Color := clPurple;
        //DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
//      if (dm_dados.sql_carrinhosprod_validade.Value = date + 74) then
//begin
        //DBGrid1.Canvas.Brush.Color := clPurple;
        //DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
//      if (dm_dados.sql_carrinhosprod_validade.Value = date + 73) then
//begin
        //DBGrid1.Canvas.Brush.Color := clPurple;
        //DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
      //if (dm_dados.sql_carrinhosprod_validade.Value = date + 72) then
//begin
  //      DBGrid1.Canvas.Brush.Color := clPurple;
   //     DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
   //   if (dm_dados.sql_carrinhosprod_validade.Value = date + 71) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clPurple;
    //    DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
     // if (dm_dados.sql_carrinhosprod_validade.Value = date + 70) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clGreen;
     //   DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
     // if (dm_dados.sql_carrinhosprod_validade.Value = date + 69) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clGreen;
   //     DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
  //    if (dm_dados.sql_carrinhosprod_validade.Value = date + 68) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clWhite;
    //    DBGrid1.Canvas.Font.Color := clblack;
//end
//else
   //   if (dm_dados.sql_carrinhosprod_validade.Value = date + 67) then
//begin
   //     DBGrid1.Canvas.Brush.Color := clGreen;
   //     DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
//      if (dm_dados.sql_carrinhosprod_validade.Value = date + 66) then
//begin
 //       DBGrid1.Canvas.Brush.Color := clGreen;
  //      DBGrid1.Canvas.Font.Color := clWhite;
//end
//else
 //     if (dm_dados.sql_carrinhosprod_validade.Value = date + 65) then
//begin
 //       DBGrid1.Canvas.Brush.Color := clyellow;
  //      DBGrid1.Canvas.Font.Color := clblack;
//end
//else
   //   if (dm_dados.sql_carrinhosprod_validade.Value = date + 64) then
//begin
  //      DBGrid1.Canvas.Brush.Color := clyellow;
  //      DBGrid1.Canvas.Font.Color := clblack;
//end
//else
 //     if (dm_dados.sql_carrinhosprod_validade.Value = date + 63) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clyellow;
    //    DBGrid1.Canvas.Font.Color := clblack;
//end
//else
   //   if (dm_dados.sql_carrinhosprod_validade.Value = date + 62) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clyellow;
    //    DBGrid1.Canvas.Font.Color := clblack;
//end
//else
   //   if (dm_dados.sql_carrinhosprod_validade.Value = date + 61) then
//begin
    //    DBGrid1.Canvas.Brush.Color := clyellow;
     //   DBGrid1.Canvas.Font.Color := clblack;
//end
//else
 //     if (dm_dados.sql_carrinhosprod_validade.Value <= date + 60) then
//begin
  //      DBGrid1.Canvas.Brush.Color := clRed;
  //      DBGrid1.Canvas.Font.Color := clwhite;
//end;
    //    DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end.

Link to comment
Compartilhe em outros sites

Pelo que entendi, pode estar dando erro quando passa nesse código:

if Key = #27 then
      if dm_dados.sql_carrinhos.RecordCount > 0 then
     ShowMessage('Finalize ou Cancele a venda Antes de Sair do Pdv')

uma solução seria vc testar se o dataset está aberto:

if Key = #27 then
   if (dm_dados.sql_carrinhos.active) and (dm_dados.sql_carrinhos.RecordCount > 0) then
     ShowMessage('Finalize ou Cancele a venda Antes de Sair do Pdv')

Da uma olhada também se o dataset não foi fechado indevidamente.

  • Curtir 1
Link to comment
Compartilhe em outros sites

por padrao, nao falando sobre alguns componentes adaptados, somente o comando "SELECT" retorna  "recordset" (conjunto de registro/dados). os demais comandos, "UPDATE e  DELETE" nao retornam informacao.

desta maneira, apos um deste dois ultimos comandos, vc pode executar o componente com o seu "SELECT" para rever o "recordCount" novamente. Naturalmente, podera ser necessario fazer um "Refresh" para atualiza-lo.

portanto, seria mais adequado vc ter um componente ou um objeto-Query criado on-demand somente para este tipo de acao.

ex:

minhaQryDeTrabalho.Text := 'update ......';

minhaQryDeTrabalho.Exec....

minhaQryDeTrabalho.Text := 'select .....';

if minhaQryDeTrabalho.RecordCount > 0 then ....

por outro lado, se usando FireDAC vc poderia contar com algumas outras facilidades deste framwork... como o "retorno de registros afetados em alguns comandos SQL", por exemplo

Editado por backupnumberum
Link to comment
Compartilhe em outros sites

Como eu disse acima, somente o "SELECT" fornece um retorno de informações, no caso, o "conjunto de registros" que foram encontrados na tabela. Ja o "Update/Delete" não retornam nenhuma informação, por padrão! Apenas o comando é executado ou não, caso haja algum erro durante o processo.

vc poderia tentar algo desta maneira, caso não possua componentes que faça algo parecido de maneira mais performatica.

NOTE: aqui estou usando uma forma um pouco mais didatica para demostrar a ideia, porém, o FireDAC permite maneira mais facilitadas de executar os comandos abaixo!

Somente uma ideia, voce poderia fazer de muitas outras maneiras:

// estou usando o FireDAC componentes: FDConnection e FDQUery que estão nas edições
// mais recentes do RAD Studio!
// voce pode usar quaisquer outros, como:
// TQuery, TIBQuery, TADOQuery, TSQLQuery, TUniQuery, etc...
implementation

{$R *.dfm}

function MyRecountAposUmUpdateOrDelete(
  AConnection: TFDConnection; ACommand: string; 
  ASelectRecordCount: string; out AErro: string): integer;
var
  LQuery: TFDQuery;
begin
  result := 0;
  //
  if (AConnection = nil) or  { }
    (Trim(ACommand) = '') or { }
    (Trim(ASelectRecordCount) = '') then
    exit;
  //
  LQuery := TFDQuery.Create(nil); // query de trabalho temporario...
  try
    try
      LQuery.Connection := AConnection;
      LQuery.SQL.Text   := ACommand;
      LQuery.ExecSQL;
      //
      LQuery.SQL.Text := ASelectRecordCount;
      LQuery.Open;
      result := LQuery.RecordCount;
      LQuery.Close;
    except
      on E: Exception do
        AErro := E.Message;
    end;
  finally
    LQuery.Free;
  end;
end;

// usando o banco de dados de exemplo do RAD Studio 11:
// "Employee", e a tabela "Country"

procedure TForm1.Button1Click(Sender: TObject);
var
  LErro       : string;
  LRecordCount: integer;
begin
  // EmployeeConnection = TFDConnection (do FireDAC)
  //
  LRecordCount := MyRecountAposUmUpdateOrDelete(                            { }
    EmployeeConnection,                                                     { }
    'insert into COUNTRY(country,currency) values(''Brasil'', ''Real'')', { }
    'select country from COUNTRY',                                          { }
    LErro                                                                   { }
    );
  //
  if (LErro <> '') then
    ShowMessage('Ocorreu um erro durante o processo do comando: ' + LErro)
  else
    ShowMessage('Total de registros na tabela apos o comando: ' + 
                LRecordCount.ToString);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // CountryTable = TFDQuery (do fireDAC)
  //
  CountryTable.Refresh; // re-lendo os registro da tabela...
  //
  ShowMessage('Total de registros na tabela apos o comando: ' + 
              CountryTable.RecordCount.ToString);
end;

 

Editado por backupnumberum
  • Curtir 1
Link to comment
Compartilhe em outros sites

Uma dica para sua vida de programador:

  • o "WITH" (palavra reservada do Delphi) foi introduzido no início da linguagem por questões de padrões da época. Ele vinha suprir as necessidades da época.
  • Atualmente, o uso ainda é permitido e perfeitamente usual em muitos casos de uso!
  • Porém, quando usado em demasia, apenas para economizar a digitação, é visto como um dos grandes fatores de produção de "bugs" quando o projeto se torna grande.
  • Então, tente evitar ao máximo o seu uso, uma vez que você ainda não se encontra na qualidade de "MASTER em programação"... você terá muitos anos pela frente para se divertir com esta "palavra-chave".
  • não tenha preguiça de digitar algumas linhas a mais de código... por fim, isso fará de você mais pró-ativo e responsável pelo seu código profissionalmente!
Link to comment
Compartilhe em outros sites

meu exemplo usando "Button1" foi so para demostrar cada fase do exemplo. vc tem que olhar como cada parte do exemplo foi realizado, nao o exemplo como algo definitivo, afinal de conta, vc tem que adaptar o exemplo a sua necessidade.

se vc usa o framework ADO, entao, sim: ADOQuery e ADOConnection.

para criar um objeto "Query" usando o ADO:

var  LQuery : TADOQuery;

.....

  LQuery := TADOQuery.Create( nil );

    ... etc.... veja o resto do meu exemplo

Link to comment
Compartilhe em outros sites

21 horas atrás, backupnumberum disse:

meu exemplo usando "Button1" foi so para demostrar cada fase do exemplo. vc tem que olhar como cada parte do exemplo foi realizado, nao o exemplo como algo definitivo, afinal de conta, vc tem que adaptar o exemplo a sua necessidade.

se vc usa o framework ADO, entao, sim: ADOQuery e ADOConnection.

para criar um objeto "Query" usando o ADO:

var  LQuery : TADOQuery;

.....

  LQuery := TADOQuery.Create( nil );

    ... etc.... veja o resto do meu exemplo

nao consigo ver o resto do teu exemplo.

Link to comment
Compartilhe em outros sites

23 horas atrás, backupnumberum disse:

Como eu disse acima, somente o "SELECT" fornece um retorno de informações, no caso, o "conjunto de registros" que foram encontrados na tabela. Ja o "Update/Delete" não retornam nenhuma informação, por padrão! Apenas o comando é executado ou não, caso haja algum erro durante o processo.

vc poderia tentar algo desta maneira, caso não possua componentes que faça algo parecido de maneira mais performatica.

NOTE: aqui estou usando uma forma um pouco mais didatica para demostrar a ideia, porém, o FireDAC permite maneira mais facilitadas de executar os comandos abaixo!

Somente uma ideia, voce poderia fazer de muitas outras maneiras:

// estou usando o FireDAC componentes: FDConnection e FDQUery que estão nas edições
// mais recentes do RAD Studio!
// voce pode usar quaisquer outros, como:
// TQuery, TIBQuery, TADOQuery, TSQLQuery, TUniQuery, etc...
implementation

{$R *.dfm}

function MyRecountAposUmUpdateOrDelete(
  AConnection: TFDConnection; ACommand: string; 
  ASelectRecordCount: string; out AErro: string): integer;
var
  LQuery: TFDQuery;
begin
  result := 0;
  //
  if (AConnection = nil) or  { }
    (Trim(ACommand) = '') or { }
    (Trim(ASelectRecordCount) = '') then
    exit;
  //
  LQuery := TFDQuery.Create(nil); // query de trabalho temporario...
  try
    try
      LQuery.Connection := AConnection;
      LQuery.SQL.Text   := ACommand;
      LQuery.ExecSQL;
      //
      LQuery.SQL.Text := ASelectRecordCount;
      LQuery.Open;
      result := LQuery.RecordCount;
      LQuery.Close;
    except
      on E: Exception do
        AErro := E.Message;
    end;
  finally
    LQuery.Free;
  end;
end;

// usando o banco de dados de exemplo do RAD Studio 11:
// "Employee", e a tabela "Country"

procedure TForm1.Button1Click(Sender: TObject);
var
  LErro       : string;
  LRecordCount: integer;
begin
  // EmployeeConnection = TFDConnection (do FireDAC)
  //
  LRecordCount := MyRecountAposUmUpdateOrDelete(                            { }
    EmployeeConnection,                                                     { }
    'insert into COUNTRY(country,currency) values(''Brasil'', ''Real'')', { }
    'select country from COUNTRY',                                          { }
    LErro                                                                   { }
    );
  //
  if (LErro <> '') then
    ShowMessage('Ocorreu um erro durante o processo do comando: ' + LErro)
  else
    ShowMessage('Total de registros na tabela apos o comando: ' + 
                LRecordCount.ToString);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // CountryTable = TFDQuery (do fireDAC)
  //
  CountryTable.Refresh; // re-lendo os registro da tabela...
  //
  ShowMessage('Total de registros na tabela apos o comando: ' + 
              CountryTable.RecordCount.ToString);
end;

 

 

Link to comment
Compartilhe em outros sites

16 horas atrás, Carlos1234 disse:

mensagem de erro.

você deve estar usando um ADOCommand para executar seus SQL commands, porém, normalmente este componente/classe é usado para executar comandos (DDL) que "modificar a estrutura do Database ou Tabelas dele", não para executar comandos (DML) para "gerenciar dados de registros nas tabelas".

para gerenciar os dados de registros (Select,Update,Delete) use: ADOQuery, ADOTable, ADODataset, ADOStoredProcedure!!!

os comandos DDL (drop, create table, etc..) use "ADOCommand"

 

ADOQueryUpdates.SQL.Text :=            { }
        Format('delete from %s where ID=%d', { }
        [Tabela,                             { tabela }
        CampoID                              { where ID=? }
        ]);
//
LRegistrosAfetados := ADOQueryUpdates.ExecSQL;

Project1_QOIgC8qHki.gif

Editado por backupnumberum
  • Curtir 1
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...