Operação de várias etapas gerou erros

31/10/2008

14

Olá a todos!

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.


Responder

Post mais votado

24/04/2011

Eu passei por este problema ontem e descobri a solução, para ajudar quem passar por ele tambem, é simples, um componente com 2 casas decimais tentando salvar os dados em um campo com 3 casas decimais, imagino que este erro deva ocorrer para qualquer divergência de dados utilizando ADO.


Responder

Mais Posts

Alguém teria alguma sugestão ou idéia de onde possa estar o problema? Pesquisando na Net, li que o problema poderia estar na divergência de tipos, tamanhos e etc... De fato, os campos CodigoDoCliente, CodigoDoAtendente, CodigoDoGarcom, todos Integer, estavam recebendo valores Double. Mesmo corrigindo os tipos, o problema permanece.

Agradeço desde já quem possa lançar alguma luz ao problema.


Responder
certo... então nos campos onde você usava .AsFloat você passou a usar .AsInteger, certo?
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.


Responder
Olá, Emerson.

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.


Responder

28/04/2011

Marcio Santos

Olá, Juarez.
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.
Responder

22/03/2019

Paulo Horlle

Olá, Juarez.

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.
Responder

22/03/2019

Paulo Horlle

Olá, Juarez.

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.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar