Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Eduardo-V-A

Usando a clausula Try

Recommended Posts

OLÁ AMIGOS DELPHIANOS

 

tenho a seguinte situação...

 

Estou gravando umas informações em uma tabela

onde tenho as seguintes chaves

data

hora

carro

Quando faco a digitação da hora que é o ultimo campo da tabela

ele testa o horario de modo a padronizar ele para conferencia posterior

por exemplo

'07:00' da manha vira 09:30

'11:00' da manha vira 15:30

na hora de gravar na tabela

isso tudo ocorre no evento exit da DBedit do campo Hora.

 

Em casos mais raros eu tenho a situação de um carro entrar e abastecer no mesmo turno

ou seja eu vou jogar duas vezes ele no horario igual, o que me ocasiona um erro de chave duplicada

Como poderia sanar essa situação?

Resp: jogo a data pré definida -1 quando o erro acontecer.

por exemplo

ele entra as 07:00 e abastece vira 09:30 na gravação

ele abastece de novo as 08:00 vira 09:30 tb , dai dá o erro 'duplica'

 

como eu faço um try ou outra forma para que ele teste o registro e no caso

grave

ele entra as 07:00 e abastece vira 09:30 na gravação

ele abastece de novo as 08:00 vira 09:29 por que já tem um as 09:30

 

Alguem pode me ajudar????

 

agradeço a todos ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bm dia.

mais porque você deixou este campo "Hora" como chave primaria ? Nao entendi ...

na verdade temos dois grandes sistemas aqui na empresa

um trabalha o administrativo e outro os carros

 

temos então a tarefa de comunicar o sistema dos carros com o sistema de administrativo

fazemos isso via Delphi 5

então o que ocorre.

o sistema administrativo tem essa tabela e chaves definidas por eles não temos como altera-las

o que fazemos é uma tabela dentro de nosso banco proprio que usamos para gerar arquivos TXT

que serão importados pelo sist. administrativo, esses dados são oriundos do outro sistema que

é com BD sql server e a gente vai passar para o adm que é oracle

 

por isso não tenho a opção de criar mais um indice por exemplo auto num.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste o trecho do código dessa proc pra darmos uma olhada.

ESTE É O CÓDIGO QUE EU ESTOU USANDO

MAS ELE NÃO EVITA A MSG DE ERRO.

ELE ABRE A TELA DE ERRO EU CLICO OK E ELE

CONTINUA A EXECUTAR O SCRIPT ATÉ A MSG ABAIXO

 

O CASO É QUE VOU TROCAR O SHOWMESSAGE POR UM CÓDIGO QUE PEGA

O CAMPO HORA E DIMINUI 1 MINUTO DELE PARA PARAR A DUPLICIDADE

 

 

procedure TF_Cad_Abastecimento.BTNGravarClick(Sender: TObject);

begin

v_Operador_A := DBEditOperador.Text;

V_Data_A := strtodate(DBEditData.text);

V_Bomba_A := DBEditBomba.text;

DM.T_AbastecimentoDATAHDIGITACAO.asdatetime := now;

V_Hora_A := DBEditHora.text;

 

try

DM.T_Abastecimento.Post;

except

on e : exception do

begin

s := e.message;

if Pos('unique constraint',s) > 0 then

ShowMessage('Oi Chave duplicada');

end;

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, agora entendi melhor o que você precisa lendo seu post anterior.

 

Já que você vai gravar isso e depois gerar um txt, porque você não cria um outro campo PK na sua base SQL Server?

Na hora de exportar você para o txt você só formata para que esse campo não apareça e boas.

Cria uma sequence no SQL Server e grava o valor dele em um outro campo PK.

 

Garanto que isso vai dimiuir pela metade a sua dor de cabeça com o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, agora entendi melhor o que você precisa lendo seu post anterior.

 

Já que você vai gravar isso e depois gerar um txt, porque você não cria um outro campo PK na sua base SQL Server?

Na hora de exportar você para o txt você só formata para que esse campo não apareça e boas.

Cria uma sequence no SQL Server e grava o valor dele em um outro campo PK.

 

Garanto que isso vai dimiuir pela metade a sua dor de cabeça com o problema.

 

oi , então amigos

pode considerar resolvido a questão

eu a a analista aqui da empresa chegamos a esse código

ele faz tudo o que estava-mos precisando

 

copia os campos regravaveis

testa a chave primaria sem mostrar erro na tela

em caso de duplicidade extrai um minuto da hora nova

______________código______________________________________

procedure TF_Cad_Abastecimento.BTNGravarClick(Sender: TObject);

begin

v_Operador_A := DBEditOperador.Text;

V_Data_A := strtodate(DBEditData.text);

V_Bomba_A := DBEditBomba.text;

DM.T_AbastecimentoDATAHDIGITACAO.asdatetime := now;

V_Minuto_A := copy(DBEditHora.text,4,2);

 

v_gravacao_OK := False;

while not v_gravacao_OK do

begin

try

DM.T_Abastecimento.Post;

except

on e : exception do

begin

s := e.message;

if Pos('unique constraint',s) > 0 then

begin

V_Minuto_A := inttostr((strtoint(V_Minuto_A) - 1));

v_hora_A := copy(DBEditHora.text,1,3) + v_minuto_A;

DBEditHora.text := v_hora_A;

end

else v_gravacao_OK := TRUE;

end;

end;

end;

DM.T_Abastecimento.insert;

LimpaCampos;

DBEditPrefix.setfocus;

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.