Problema com a query
Tipo na hora que aperto o botão pra atualizar a tabela de produto,aparece erro:"qryncm:Cannot perform this operation on a closed dataset"....O que eu poderia fazer pra resolver???Muito Obrigado
Alan
Curtidas 0
Melhor post
Raimundo Pereira
21/12/2016
Eis o problema
procedure TFrmimportarncm.BitBtn1Click(Sender: TObject);
begin
qryNCM.Close; // >> Aqui você fecha a qryNCM
qryNCM.FetchAll; // >> Aqui com a qry fechada você tenta carregar todos os registros
qryNCM.First; // >> Aqui com a qry fechada você tenta ir para o inicio
Então depois de
qryNCM.Close;
qryNCM.open; // aqui você abre a query e segue
qryNCM.FetchAll;
qryNCM.First;
procedure TFrmimportarncm.BitBtn1Click(Sender: TObject);
begin
qryNCM.Close; // >> Aqui você fecha a qryNCM
qryNCM.FetchAll; // >> Aqui com a qry fechada você tenta carregar todos os registros
qryNCM.First; // >> Aqui com a qry fechada você tenta ir para o inicio
Então depois de
qryNCM.Close;
qryNCM.open; // aqui você abre a query e segue
qryNCM.FetchAll;
qryNCM.First;
GOSTEI 1
Mais Respostas
Raimundo Pereira
21/12/2016
Post sua rotina completa inclusive o conteúdo do button para atualizar
GOSTEI 0
Alan
21/12/2016
Function Atualizar_Alq(Comando_SQL:string):boolean;
function XlsToStringGrid(XStringGrid: TStringGrid; xFileXLS: string): Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Frmimportarncm: TFrmimportarncm;
implementation
{$R *.dfm}
uses ufrmPrincipal;
Function Tfrmimportarncm.Atualizar_Alq(Comando_SQL:string):boolean;
begin
QryUpdate.Close;
QryUpdate.sql.Clear;
QryUpdate.sql.Text:=Comando_SQL;
try
QryUpdate.ExecSQL;
Result:=true;
except
Result:=False;
end;
end;
procedure TFrmimportarncm.BitBtn1Click(Sender: TObject);
begin
qryNCM.Close;
qryNCM.FetchAll;
qryNCM.First;
//Iniciamos um for na tabela ncm e ao mesmo tempo vamos atualizando
if not qryNCM.Eof then
repeat
//TODOS OS PRODUTOS CUJO NCM SEJA O ATUAL DA TABELA NCM SERÁ ATUALIZADO
Atualizar_Alq('UPDATE PRODUTOS SET ALIQUOTA_IMP='''+qryNCM.FieldByName('ALIQUOTAIMPOSTO').AsString+''' WHERE NCM_SH ='''+qryNCM.FieldByName('NCM').AsString+'''');
qryNCM.Next;
until qryNCM.Eof;
ShowMessage('Atualização finalizada');
end;
procedure TFrmimportarncm.bSalvarClick(Sender: TObject);
var
x:integer;
begin
//query.execsql;
for x:=1 to dbimportarncm.RowCount-1 do
begin
TRY
//dtsimportar.Close;
dtsimportar.Insert;
//dtsimportar['CODIGO'] := StrToInt(dbimportarncm.Cells[0,x]);
dtsimportar['NCM'] :=dbimportarncm.Cells[0,x];
dtsimportar['EX'] :=dbimportarncm.Cells[3,x];
dtsimportar['TABELA'] :=dbimportarncm.Cells[2,x];
dtsimportar['DESCRICAO'] := dbimportarncm.Cells[1,x];
dtsimportar['ALIQUOTANACIONAL'] :=StringReplace((dbimportarncm.Cells[4,x]), '.', ',', [rfReplaceAll]);
dtsimportar['ALIQUOTAIMPOSTO'] := StringReplace((dbimportarncm.Cells[5,x]), '.', ',', [rfReplaceAll]);
dtsimportar.Post;
//dtsimportar.Open;
finally
end;
end;
end;
procedure TFrmimportarncm.btncancelarClick(Sender: TObject);
begin
CLOSE;
end;
procedure TFrmimportarncm.btnCarregarClick(Sender: TObject);
begin
if OpenDialog1.Execute then
XlsToStringGrid(dbimportarncm,OpenDialog1.FileName)
end;
procedure TFrmimportarncm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dtsimportar.Close;
end;
procedure TFrmimportarncm.FormShow(Sender: TObject);
begin
dtsimportar.Open;
qrylimpa.Close;
qrylimpa.Open;
QRYZERAGENERATOR.Close;
QRYZERAGENERATOR.Open;
end;
function Tfrmimportarncm.XlsToStringGrid(XStringGrid: TStringGrid;
xFileXLS: string): Boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLSAplicacao, AbaXLS: OLEVariant;
RangeMatrix: Variant;
x, y, k, r: Integer;
begin
Result := False;
// Cria Excel- OLE Object
XLSAplicacao := CreateOleObject('Excel.Application');
try
// Esconde Excel
XLSAplicacao.Visible := False;
// Abre o Workbook
XLSAplicacao.Workbooks.Open(xFileXLS);
{Selecione aqui a aba que você deseja abrir primeiro - 1,2,3,4....}
XLSAplicacao.WorkSheets[1].Activate;
{Selecione aqui a aba que você deseja ativar - começando sempre no 1 (1,2,3,4) }
AbaXLS := XLSAplicacao.Workbooks[ExtractFileName(xFileXLS)].WorkSheets[1];
AbaXLS.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Pegar o número da última linha
x := XLSAplicacao.ActiveCell.Row;
// Pegar o número da última coluna
y := XLSAplicacao.ActiveCell.Column;
// Seta xStringGrid linha e coluna
XStringGrid.RowCount := x;
XStringGrid.ColCount := y;
// Associaca a variant WorkSheet com a variant do Delphi
RangeMatrix := XLSAplicacao.Range['A1', XLSAplicacao.Cells.Item[x, y]].Value;
// Cria o loop para listar os registros no TStringGrid
k := 1;
repeat
for r := 1 to y do
XStringGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[k, r];
Inc(k, 1);
until k > x;
RangeMatrix := Unassigned;
finally
// Fecha o Microsoft Excel
if not VarIsEmpty(XLSAplicacao) then
begin
XLSAplicacao.Quit;
XLSAplicacao := Unassigned;
AbaXLS := Unassigned;
Result := True;
end;
end;
end;
ta tudo ai p2,o button que atualiza é o bitbtn1!!!Vê se você consegui me ajudar por favor
function XlsToStringGrid(XStringGrid: TStringGrid; xFileXLS: string): Boolean;
{ Private declarations }
public
{ Public declarations }
end;
var
Frmimportarncm: TFrmimportarncm;
implementation
{$R *.dfm}
uses ufrmPrincipal;
Function Tfrmimportarncm.Atualizar_Alq(Comando_SQL:string):boolean;
begin
QryUpdate.Close;
QryUpdate.sql.Clear;
QryUpdate.sql.Text:=Comando_SQL;
try
QryUpdate.ExecSQL;
Result:=true;
except
Result:=False;
end;
end;
procedure TFrmimportarncm.BitBtn1Click(Sender: TObject);
begin
qryNCM.Close;
qryNCM.FetchAll;
qryNCM.First;
//Iniciamos um for na tabela ncm e ao mesmo tempo vamos atualizando
if not qryNCM.Eof then
repeat
//TODOS OS PRODUTOS CUJO NCM SEJA O ATUAL DA TABELA NCM SERÁ ATUALIZADO
Atualizar_Alq('UPDATE PRODUTOS SET ALIQUOTA_IMP='''+qryNCM.FieldByName('ALIQUOTAIMPOSTO').AsString+''' WHERE NCM_SH ='''+qryNCM.FieldByName('NCM').AsString+'''');
qryNCM.Next;
until qryNCM.Eof;
ShowMessage('Atualização finalizada');
end;
procedure TFrmimportarncm.bSalvarClick(Sender: TObject);
var
x:integer;
begin
//query.execsql;
for x:=1 to dbimportarncm.RowCount-1 do
begin
TRY
//dtsimportar.Close;
dtsimportar.Insert;
//dtsimportar['CODIGO'] := StrToInt(dbimportarncm.Cells[0,x]);
dtsimportar['NCM'] :=dbimportarncm.Cells[0,x];
dtsimportar['EX'] :=dbimportarncm.Cells[3,x];
dtsimportar['TABELA'] :=dbimportarncm.Cells[2,x];
dtsimportar['DESCRICAO'] := dbimportarncm.Cells[1,x];
dtsimportar['ALIQUOTANACIONAL'] :=StringReplace((dbimportarncm.Cells[4,x]), '.', ',', [rfReplaceAll]);
dtsimportar['ALIQUOTAIMPOSTO'] := StringReplace((dbimportarncm.Cells[5,x]), '.', ',', [rfReplaceAll]);
dtsimportar.Post;
//dtsimportar.Open;
finally
end;
end;
end;
procedure TFrmimportarncm.btncancelarClick(Sender: TObject);
begin
CLOSE;
end;
procedure TFrmimportarncm.btnCarregarClick(Sender: TObject);
begin
if OpenDialog1.Execute then
XlsToStringGrid(dbimportarncm,OpenDialog1.FileName)
end;
procedure TFrmimportarncm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dtsimportar.Close;
end;
procedure TFrmimportarncm.FormShow(Sender: TObject);
begin
dtsimportar.Open;
qrylimpa.Close;
qrylimpa.Open;
QRYZERAGENERATOR.Close;
QRYZERAGENERATOR.Open;
end;
function Tfrmimportarncm.XlsToStringGrid(XStringGrid: TStringGrid;
xFileXLS: string): Boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLSAplicacao, AbaXLS: OLEVariant;
RangeMatrix: Variant;
x, y, k, r: Integer;
begin
Result := False;
// Cria Excel- OLE Object
XLSAplicacao := CreateOleObject('Excel.Application');
try
// Esconde Excel
XLSAplicacao.Visible := False;
// Abre o Workbook
XLSAplicacao.Workbooks.Open(xFileXLS);
{Selecione aqui a aba que você deseja abrir primeiro - 1,2,3,4....}
XLSAplicacao.WorkSheets[1].Activate;
{Selecione aqui a aba que você deseja ativar - começando sempre no 1 (1,2,3,4) }
AbaXLS := XLSAplicacao.Workbooks[ExtractFileName(xFileXLS)].WorkSheets[1];
AbaXLS.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Pegar o número da última linha
x := XLSAplicacao.ActiveCell.Row;
// Pegar o número da última coluna
y := XLSAplicacao.ActiveCell.Column;
// Seta xStringGrid linha e coluna
XStringGrid.RowCount := x;
XStringGrid.ColCount := y;
// Associaca a variant WorkSheet com a variant do Delphi
RangeMatrix := XLSAplicacao.Range['A1', XLSAplicacao.Cells.Item[x, y]].Value;
// Cria o loop para listar os registros no TStringGrid
k := 1;
repeat
for r := 1 to y do
XStringGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[k, r];
Inc(k, 1);
until k > x;
RangeMatrix := Unassigned;
finally
// Fecha o Microsoft Excel
if not VarIsEmpty(XLSAplicacao) then
begin
XLSAplicacao.Quit;
XLSAplicacao := Unassigned;
AbaXLS := Unassigned;
Result := True;
end;
end;
end;
ta tudo ai p2,o button que atualiza é o bitbtn1!!!Vê se você consegui me ajudar por favor
GOSTEI 0
Alan
21/12/2016
E na queryupdate nao tem nada nela so ta conectada com o banco!!!
GOSTEI 0
Alan
21/12/2016
Como faço quando ncm do produto nao tiver na tabela de ncm,a aliquota da tela de produto fica com valor de "0"?Me ajudem por favor!!!
GOSTEI 0
Raimundo Pereira
21/12/2016
Neste caso, teria que fazer o inverso a invés de realizar a verificação dos ncm e ir realizando a atualização.
Você terá que analisar todo cadastro de produtos, na verificação você tentará localizar o ncm na tabela de ncm
Se o ncm do produto consta na tabela de ncm >> Atualiza o cadastro do produto para aliq_icms contido na tabela de ncm
Se não encontrar, atualiza o cadastro de produtos para 0
Acredito que essa era a ideia inicial, como falei se você tiver muitos registro na tabela de produtos talvez fique um pouco lento.
Sucesso
Você terá que analisar todo cadastro de produtos, na verificação você tentará localizar o ncm na tabela de ncm
Se o ncm do produto consta na tabela de ncm >> Atualiza o cadastro do produto para aliq_icms contido na tabela de ncm
Se não encontrar, atualiza o cadastro de produtos para 0
Acredito que essa era a ideia inicial, como falei se você tiver muitos registro na tabela de produtos talvez fique um pouco lento.
Sucesso
GOSTEI 0