Problema com a query

Delphi

21/12/2016

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

Alan

Curtidas 0

Melhor post

Raimundo Pereira

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;
GOSTEI 1

Mais Respostas

Raimundo Pereira

Raimundo Pereira

21/12/2016

Post sua rotina completa inclusive o conteúdo do button para atualizar
GOSTEI 0
Alan

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
GOSTEI 0
Alan

Alan

21/12/2016

E na queryupdate nao tem nada nela so ta conectada com o banco!!!
GOSTEI 0
Alan

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

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
GOSTEI 0
POSTAR