GARANTIR DESCONTO

Fórum SQL de Consulta e Atualizacao #49717

07/03/2005

0

Olá,

estou com um problema de utilizacao de 2 sql´s para consultar e atualizar.
O meu caso é o seguinte, tenho um relatório de conhecimentos, ele sempre q é impresso deve ser atualizado em seu cadastro como Já Impresso, para nao ser impresso normalmente por acidente, entao na impressao eu faço um select (TSQLQuery) q me retorna todos os dados para impressao de todos os conhecimentos, e em cada final de impressao eu tenho uma outra TSQLQuery q atualiza o status do conhecimento q acabou de ser impresso como já impresso, mas ele me retorna um erro sempre q ele chega nesse ponto:

EDatabaseError: Cannot perform this operation on a open dataset.

Sendo q nesse relatório tenho outra TSQLQuery (de selecao que retorna as notas do conhecimento em questao e funciona normal)

Como faço pra fazer essa atualização ?
Alguem pode me dar uma dica ou uma outra opção?

Abraços
Julio


Tuskinhu

Tuskinhu

Responder

Posts

07/03/2005

Fsflorencio

Colega,

pelo jeito vc está tentando fazer alguma coisa com o dataset aberto quando ele deveria estar fechado.

Antes de fazer seu update, coloque um breakpoint e veja qual dataset está dando erro e dê um comando pra fechá-lo antes de executar o update.


Responder

Gostei + 0

07/03/2005

Tuskinhu

É eu sei que está aberto, é o dataset externo q controla a selecao de quais conhecimentos vao ser impressos (por ex. cto 0001, 0002...ate 00010)..
e ao final da impressao de cada um eu abro o outro Query para atualizar o conhecimento q esta na selecao com um novo valor, nao sei se vc entendeu, mas qq coisa eu colo o codigo


Responder

Gostei + 0

07/03/2005

Fsflorencio

É, tá um pouco confuso, se vc colar um código resumido e indicar em que ponto ocorre o erro, talvez ajudaria.


Responder

Gostei + 0

07/03/2005

Tuskinhu

Ai vai o codigo:

  Qry := TSQLQuery.Create(nil);
  Qry.SQLConnection := BD.BD;
  Qry.Close;
  Qry.SQL.Clear;
  Qry.SQL.Text := ´Select CliRem.UF as ....´;  // select principal

  QryNF := TSQLQuery.Create(nil);
  QryNF.SQLConnection := Bd.BD;
  QryNF.Close;
  QryNF.SQL.Clear;
  QryNF.SQL.Text := ´Select CTONOTAS.NOTAFISCAL... ;  // Select q é feito a cada conhecimento para pegar as nf´s digitadas nele

  // Query p/ atualizacao do conhecimento impresso
  QryAtualiza := TSQLQuery.Create(nil);
  QryAtualiza.SQLConnection := BD.BD;
  QryAtualiza.Close;
  QryAtualiza.SQL.Clear;
  QryAtualiza.SQL.Text := ´Update CONHECIMENTOS Set ´ +
                          ´JA_IMPRESSO = ´ + QuotedStr(´S´) + ´ ´ +
                          ´WHERE (SERIE = :SerieCto)´;

  try
    try
      Qry.ParamByName(´Data´).AsDate := edtData.Date;
      Qry.ParamByName(´IniCto´).AsInteger := StrToIntDef(Copy(cmbIni.Text, 1, 6), 0);
      Qry.ParamByName(´FimCto´).AsInteger := StrToIntDef(Copy(cmbIni.Text, 1, 6), 0);
      Qry.Open;
      if not Qry.IsEmpty then
      begin
        // Inicia o Documento
        VDODmPrinter1.BeginDoc;
        VDODmPrinter1.Font.Size := fsCondensed;
        while not Qry.Eof do
        begin
          with VDODmPrinter1, Qry do
          begin
            // Detalhes do Conhecimento
            SomaQtde := 0;
            SomaPesoR := 0.00;
            SomaPesoC := 0.00;
            SomaCubagem := 0;
            SomaNF := 0.00;
            TemSecLinha := False;

            {-=-} Print(000, ´´, True);
            {-=-} Print(000, ´´, True);
            Print(100, ´TRANSPORTE DE CARGAS´, True);
            Print(100, FieldByName(´COD_TRANSPORTE´).AsString, True);
            Print(100, FieldByName(´EMISSAO´).AsString, True);
            ...
           {-=-} Print(000, ´´, True);

            // Ini NF  (selecao das notas fiscais do conhecimento
            QryNF.ParamByName(´SerieCto´).AsInteger := Qry.FieldByName(´SERIE´).AsInteger;
            Open;
            try
              try
                while not QryNF.Eof do
                begin
                     // Detalhes da NF
                end;  // while eof
              except
                on E:Exception do
                begin
                  MsgError(´Erro na consulta de NF para os Conhecimentos´);
                end;
              end;  // try..except
            finally
              QryNF.Close;
            end;  // try..finally
            // Fim NF

            // Atualiza Cto como já impresso
            // O erro quando dá em tempo de execucao pega a exceção deste try
            try
              try
                QryAtualiza.Close;
                QryAtualiza.SQL.Clear;
                QryAtualiza.SQL.Text := ´Update CONHECIMENTOS Set ´ +
                          ´JA_IMPRESSO = ´ + QuotedStr(´S´) + ´ ´ +
                          ´WHERE (SERIE = :SerieCto)´;
                QryAtualiza.ParamByName(´SerieCto´).AsInteger :=
                                   Qry.FieldByName(´SERIE´).AsInteger;
                ExecSQL;
              except
                on E:Exception do
                begin
                  MsgError(´Erro na atualização do Status de impressão.´);
                end;
              end;  // try..except
            finally
              QryAtualiza.Close;
            end;  // try..finally
            Next;  // Vai para o Proximo Conhecimento
          end;  // VDODmPrinter1, Qry
        end; // While Eof
        // Finaliza a Impressão
        VDODmPrinter1.Font.Size := fsDefault;
        VDODmPrinter1.EndDoc(False);
      end
      else
      begin
        MsgWarn(´Sem Conhecimentos para imprimir´);
      end;  // if Qry.IsEmpty
    except
      on E:Exception do
      begin
        ShowMessage(´Erro na recuperação dos conhecimento para imprimir.´ + #1313 +
                    ´SQL: ´ + Qry.SQL.Text + 13 +
                    ´Erro Compilador: ´ + E.Message);
      end;
    end;  // try..except
  finally
    Qry.Close;
    QryNF.Close;
    FreeAndNil(Qry);
    FreeAndNil(QryNF);
  end;  // try..finally



Responder

Gostei + 0

08/03/2005

Fsflorencio

Olhando por cima, não ví nada que pudesse estar fazendo dar este erro, mas faço agora uma pergunta que é pra matar a charada:

Em qual linha exatamente está ocorrendo o erro?


Responder

Gostei + 0

08/03/2005

Afarias

Veja o ExecSQL :

|QryAtualiza.ParamByName(´SerieCto´).AsInteger :=
| Qry.FieldByName(´SERIE´).AsInteger;
|ExecSQL;


deveria estar

QryAtualiza.ExecSQL;

vc está tentando fazer o ExecSQL em Qry (que está no WITH) e não em QryAtualiza


T+


Responder

Gostei + 0

08/03/2005

Tuskinhu

Eu reparei isso ontem logo depois de eu ter postado o codigo, mas ainda tinha uns outros erros iguas a esse no codigo!

Mesmo assim obrigadao pela ajuda !!!

Abraços!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar