Operação de várias etapas gerou erros
31/10/2008
0
Estou ficando de cabelo em pé com uma mensagem que vem aparecendo, sem contudo, apesar do que parece, deixar de atuar sobre a tabela que está recebendo o Post, ou seja, a tabela é atualizada, porém a execução do programa segue para a primeira linha dentro do except. A mensagem de erro também é exibida quando tento recuperar a informação de um campo desta tabela.
Para início de conversa estou usando Delphi 7, acessando MS Sql com ADO (ADOConnection; ADOQuery; ADOCommand; etc...).
Os trechos que apresentam o problema estão destacados pelo texto
{{{{Aqui NÃO ocorre a mensagem}}}} ou {{{{Aqui ocorre a mensagem}}}}.
Duas procedures InclusaoDeVendaParaMesa e InclusaoDeVendaParaEntrega. A primeira, quando chamada funciona perfeitamente e a segunda apresenta o erro acima descrito.
Abaixo o corpo das procedures:
procedure TfrmPrincipal.InclusaoDeVendaParaMesa;
Var
rcCliente : RCliente;
Begin
If Not PodeRealizarOperacoes then
Exit;
Screen.Cursor := crHourGlass;
dtsGenerico.DataSet := DMEstoque.qryVendas;
MensagemDeStatus(´Preparando módulo de venda para mesa...´, 0);
//Carrega dados da venda
CarregaVendas( 0, 0, ´´ );
CarregaTiposDeOperacoes( sTipoDeOperacao );
CarregaContrato( dEstabelecimento );
CarregaUnidades;
CarregaModelosDeNotasFiscais;
CarregaSeriesDeNotasFicais;
//Inicia inclusão de nova operação de venda
DMEstoque.qryVendas.Insert;
If Not Vazio( dbeCodigoDoAtendente.Text, False) Then
DmEstoque.qryVendas.FieldByName(´CodigoDoVendedor´).AsFloat :=
StrToInt(dbeCodigoDoAtendente.Text )
Else
DmEstoque.qryVendas.FieldByName(´CodigoDoVendedor´).AsFloat := 0;
If Not Vazio( dbeCodigoDoCliente.Text, False ) Then
DmEstoque.qryVendas.FieldByName(´CodigoDoCliente´).AsFloat :=
StrToInt( dbeCodigoDoCliente.Text )
Else
DmEstoque.qryVendas.FieldByName(´CodigoDoCliente´).AsFloat := 0;
If Not DMEstoque.qryTiposDeOperacoes.FieldByName(´NaoMovimenta´).AsBoolean Then
Begin
If Vazio(DmEstoque.qryVendas.FieldByName(´DataDaEmissao´).AsString, False) Then
DmEstoque.qryVendas.FieldByName(´DataDaEmissao´).AsDateTime := dtData;
If Vazio(DmEstoque.qryVendas.FieldByName(´DataDeRecebimento´).AsString, False) Then
DmEstoque.qryVendas.FieldByName(´DataDeRecebimento´).AsDateTime := dtData;
End;
If Vazio(DmEstoque.qryVendas.FieldByName(´Caixa´).AsString, False) Then
DmEstoque.qryVendas.FieldByName(´Caixa´).AsFloat := dFechamento;
NumeroDoPedidoDeVenda;
AcertaData;
Try
DmEstoque.qryVendas.Post;
If dtsLocaisAlocados.DataSet.State in [dsInsert, dsEdit] Then
Begin
dtsLocaisAlocados.DataSet.FieldByName(´Orcamento´).AsFloat :=
DmEstoque.qryVendas.FieldByName(´NumeroDoPedido´).AsFloat;
dtsLocaisAlocados.DataSet.FieldByName(´CentroDeCusto´).AsFloat :=
DmEstoque.qryVendas.FieldByName(´CentroDeCusto´).AsFloat;
dtsLocaisAlocados.DataSet.FieldByName(´TipoDeOperacao´).AsString :=
DmEstoque.qryVendas.FieldByName(´TipoDeOperacao´).AsString;
Try
{{{{Aqui NÃO ocorre a mensagem}}}}
dtsLocaisAlocados.DataSet.Post;
{{{{Aqui NÃO ocorre a mensagem}}}}
Except
On e : Exception Do
Begin
MensagemDeAviso(´Não foi possível alocar novo local: ´ + e.Message);
End;
End;
Try
dtsLocaisAlocados.DataSet.Edit;
Except
On e : Exception Do
Begin
MensagemDeAviso(´Não foi possível colocar o local em estado de alte´ +
// ´ração: ´ + e.Message);
End;
End;
End;
Except
End;
End;
/////////////////////////////////////////////////////////////////////////////////////
procedure TfrmPrincipal.InclusaoDeVendaParaEntrega;
Var
rcCliente : RCliente;
Begin
If Not PodeRealizarOperacoes then
Exit;
Screen.Cursor := crHourGlass;
dtsGenerico.DataSet := DMEstoque.qryVendas;
MensagemDeStatus(´Preparando módulo de venda para entrega...´, 0);
//Carrega dados da venda
CarregaVendas( 0, 0, ´´ );
CarregaTiposDeOperacoes( sTipoDeOperacao );
CarregaContrato( dEstabelecimento );
CarregaUnidades;
CarregaModelosDeNotasFiscais;
CarregaSeriesDeNotasFicais;
//Inicia inclusão de nova operação de venda
DMEstoque.qryVendas.Insert;
If Not Vazio( dbeCodigoDoAtendente.Text, False) Then
DmEstoque.qryVendas.FieldByName(´CodigoDoVendedor´).AsFloat :=
StrToInt(dbeCodigoDoAtendente.Text )
Else
DmEstoque.qryVendas.FieldByName(´CodigoDoVendedor´).AsFloat := 0;
If Not Vazio( dbeCodigoDoCliente.Text, False ) Then
DmEstoque.qryVendas.FieldByName(´CodigoDoCliente´).AsFloat :=
StrToInt( dbeCodigoDoCliente.Text )
Else
DmEstoque.qryVendas.FieldByName(´CodigoDoCliente´).AsFloat := 0;
If Not DMEstoque.qryTiposDeOperacoes.FieldByName(´NaoMovimenta´).AsBoolean Then
Begin
If Vazio(DmEstoque.qryVendas.FieldByName(´DataDaEmissao´).AsString, False) Then
DmEstoque.qryVendas.FieldByName(´DataDaEmissao´).AsDateTime := dtData;
If Vazio(DmEstoque.qryVendas.FieldByName(´DataDeRecebimento´).AsString, False) Then
DmEstoque.qryVendas.FieldByName(´DataDeRecebimento´).AsDateTime := dtData;
End;
If Vazio(DmEstoque.qryVendas.FieldByName(´Caixa´).AsString, False) Then
DmEstoque.qryVendas.FieldByName(´Caixa´).AsFloat := dFechamento;
NumeroDoPedidoDeVenda;
AcertaData;
Try
DmEstoque.qryVendas.Post;
If dtsLocaisAlocados.DataSet.State in [dsInsert, dsEdit] Then
Begin
dtsLocaisAlocados.DataSet.FieldByName(´Posicao´).AsInteger :=
ProximaEntregaDisponivel( dtData );
dtsLocaisAlocados.DataSet.FieldByName(´Orcamento´).AsFloat :=
DmEstoque.qryVendas.FieldByName(´NumeroDoPedido´).AsFloat;
dtsLocaisAlocados.DataSet.FieldByName(´CentroDeCusto´).AsFloat :=
DmEstoque.qryVendas.FieldByName(´CentroDeCusto´).AsFloat;
dtsLocaisAlocados.DataSet.FieldByName(´TipoDeOperacao´).AsString :=
DmEstoque.qryVendas.FieldByName(´TipoDeOperacao´).AsString;
edtPosicao.Text :=
dtsLocaisAlocados.DataSet.FieldByName(´Posicao´).AsString;
Try
{{{{Aqui ocorre a mensagem}}}}
dtsLocaisAlocados.DataSet.Post;
{{{{Aqui ocorre a mensagem}}}}
Except
On e : Exception Do
Begin
MensagemDeAviso(´Não foi possível alocar novo local: ´ + e.Message);
End;
End;
Try
dtsLocaisAlocados.DataSet.Edit;
Except
On e : Exception Do
Begin
MensagemDeAviso(´Não foi possível colocar o local em estado de alte´ +
´ração: ´ + e.Message);
End;
End;
End;
Except
End;
End;
Como podem notar o código é idêntico. Abaixo, o trecho do código em que tento recuperar a informação da mesma tabela que FOI atualizada, contudo, apresenta a mesma mensagem. A situação é agravada, pois, aqui, o sistema deixa de executar as linhas restantes e com isso acaba por não imprimir a operação:
Function TfrmPrincipal.Cabecalho( bComTotalizacao : Boolean ) : SmallInt;
begin
With impMatric Do
Begin
textolc(1, 1, ´=======================================´);
textolc(2, 1, Copy(dtsContratos.DataSet.FieldByname(´Descricao´).AsString, 1, 39));
textolc(3, 1, ´=======================================´);
TextoE( 4, 1, ´Data: ´ + FormatDateTime(´dd/mm/yyyy´, dtData) +
´-´ + IntToStr(iTurno) + ´ Caixa.: ´ + Copy(dbtAtendente.Caption, 1, 12) );
If sTipoDeOperacao = sCPVMe Then
Begin
TextoE( 5, 1, ´Ped.: ´ + FormatFloat(´000000´,
dtsLocaisAlocados.DataSet.FieldByName(´Orcamento´).AsFloat) + ´-M´ +
FormatFloat(´0000´, dtsLocaisAlocados.DataSet.FieldByName(´Posicao´).AsFloat) +
´ Garcom: ´ + Copy(dbtGarcom.Caption, 1, 12));
textolc(6, 1, ´=======================================´);
If bComTotalizacao Then
textolc(7, 1, ´ DESCRICAO QTD TOTAL ´)
Else
textolc(7, 1, ´ QTD DESCRICAO ´);
textolc(8, 1, ´=======================================´);
Result := 9;
End;
If sTipoDeOperacao = sCPVDe Then
Begin
{{{{Aqui ocorre a mensagem}}}}
TextoE( 5, 1, ´Hr.Pedido: ´ +
FormatDateTime(´HH:MM´, dtsLocaisAlocados.DataSet.FieldByName(´HoraDeEntrada´).AsDateTime) +
´ Hr.Saida: ´ +
FormatDateTime(´HH:MM´, dtsLocaisAlocados.DataSet.FieldByName(´HoraDeSaida´).AsDateTime));
{{{{Aqui ocorre a mensagem}}}}
TextoE( 6, 1, ´Ped.: ´ + FormatFloat(´000000´,
dtsLocaisAlocados.DataSet.FieldByName(´Orcamento´).AsFloat) + ´-E´ +
FormatFloat(´0000´, dtsLocaisAlocados.DataSet.FieldByName(´Posicao´).AsFloat) +
´ Engdr.: ´ + Copy(dbtEntregador.Caption, 1, 13));
textolc(7, 1, ´=======================================´);
If bComTotalizacao Then
textolc(8, 1, ´ DESCRICAO QTD TOTAL ´)
Else
textolc(8, 1, ´ QTD DESCRICAO ´);
textolc(9, 1, ´=======================================´);
Result := 10;
End;
End;
end;
Ficaria muito grato se alguém pudesse me dar uma luz.
Marciodossantosprog
Post mais votado
24/04/2011
Juarez Mendes
Mais Posts
31/10/2008
Marciodossantosprog
Agradeço desde já quem possa lançar alguma luz ao problema.
31/10/2008
Emerson Nascimento
e quanto aos campos data? O campo na tabela é datahora, certo?
tente, ao invés de .AsDate, usar .AsSQLTimeStamp em conjunto com a função DateTimeToSQLTimeStamp(), que está na unit SqlTimSt.
02/11/2008
Marciodossantosprog
Como tinha muita urgência em resolver a questão e, como não encontrava uma explicação e principalmenente a SOLUÇÃO, para não deixar de atender ao cliente, decidi seguir por outro caminho. Claro, perdi um tempo refazendo a rotina, pois deixei de trabalhar com os métodos nativos da classe TADOQuery para manipulação de registros ( Insert, Edit, Post, etc... ) e passei a fazer uso de scripts (Insert Into..., Update X Set...). Na verdade consegui, inclusive, reduzir as linhas de códigos e ao mesmo tempo deixá-lo mais legível.
Mesmo sem testar, posso dizer que você me deu a LUZ que buscava. Agora estou numa correria danada, mas assim que for possível, vou aplicar sua sugestão e retorno para dizer o que aconteceu.
De qualquer forma, Muitííííííííííííííííííííssimo obrigado pela ajuda.
Um grande abraço.
28/04/2011
Marcio Santos
Obrigado, por apesar de tanto tempo, ter dado atenção ao tópico.
Cometi aqui um grande pecado. Fiquei de voltar para dar mais detalhes sobre a solução encontrada e não o fiz. Por outro lado, como a solução encontrada, como citei anteriormente foi reescrever o código e mudar a técnica utilizada, imaginei que não traria contribuição ao tema.
O mais importante, destaco, é a sua iniciativa: Mesmo após tanto tempo do tópico iniciado fez questão de postar a solução por ti encontrada.
Espetacular. Parabéns!
Grande abraço.
22/03/2019
Paulo Horlle
Obrigado, por apesar de tanto tempo, ter dado atenção ao tópico.
Cometi aqui um grande pecado. Fiquei de voltar para dar mais detalhes sobre a solução encontrada e não o fiz. Por outro lado, como a solução encontrada, como citei anteriormente foi reescrever o código e mudar a técnica utilizada, imaginei que não traria contribuição ao tema.
O mais importante, destaco, é a sua iniciativa: Mesmo após tanto tempo do tópico iniciado fez questão de postar a solução por ti encontrada.
Espetacular. Parabéns!
Grande abraço.
22/03/2019
Paulo Horlle
Obrigado, por apesar de tanto tempo, ter dado atenção ao tópico.
Cometi aqui um grande pecado. Fiquei de voltar para dar mais detalhes sobre a solução encontrada e não o fiz. Por outro lado, como a solução encontrada, como citei anteriormente foi reescrever o código e mudar a técnica utilizada, imaginei que não traria contribuição ao tema.
O mais importante, destaco, é a sua iniciativa: Mesmo após tanto tempo do tópico iniciado fez questão de postar a solução por ti encontrada.
Espetacular. Parabéns!
Grande abraço.
11 anos depois... passei pelo mesmo problema e a razao deste erro é porque o dataset é alterado no banco, ou por um trigger ou por campo default, qdo o dataset volta para o delphi ele possui um conteudo diferente do que havia anteriormente causando este erro.
Clique aqui para fazer login e interagir na Comunidade :)