RAISERROR x SQL SERVER 2008 R2

Delphi

19/05/2013

Prezados, estou com o seguinte problema o aplicativo não esta retornando o erro quando é cadastrado as informações no banco.
Segue abaixo informações

SP - Script - SQL

CREATE PROC LAN_MEDIDAS_I(
@MED_DATA DATETIME,
@MED_TAG VARCHAR(50),
@MED_POSICAO VARCHAR(50),
@MED_FOGO NUMERIC(9,0),
@MED_INSPETOR VARCHAR(50),
@MED_HORIMETRO NUMERIC(9,1),
@MED_JUSTIFICATIVA VARCHAR(255),
@MED_DESC_ANE VARCHAR(50),
@MED_EXTERNO NUMERIC(9,1),
@MED_INTERNO NUMERIC(9,1))
AS
DECLARE @DATA DATETIME
DECLARE @TAG VARCHAR(50)
DECLARE @POSICAO VARCHAR(50)
DECLARE @FOGO NUMERIC(9,0)
DECLARE @INSPETOR VARCHAR(50)
DECLARE @HORIMETRO NUMERIC(9,1)
DECLARE @JUSTIFICATIVA VARCHAR(255)
DECLARE @DESC_ANE VARCHAR(255)
DECLARE @PROF_MM NUMERIC(9,1)
DECLARE @EXTERNO NUMERIC(9,1)
DECLARE @INTERNO NUMERIC(9,1)

DECLARE @HOR_ULT NUMERIC(9,1)

--VARIAVEL CALC HORIMETRO
DECLARE @CAL_HOR_IN numeric(9,1)
DECLARE @CAL_HOR_FIN numeric(9,1)
DECLARE @CAL_HOR_TOL numeric(9,1)
BEGIN
--CALCULA HORAS TRABALHADA
SET @CAL_HOR_IN=(SELECT MAX(MED_HORIMETRO)FROM LAN_MEDIDAS WHERE MED_TAG=@MED_TAG)
SELECT @CAL_HOR_FIN=@MED_HORIMETRO
SELECT @CAL_HOR_TOL=@CAL_HOR_FIN - @CAL_HOR_IN
SELECT @CAL_HOR_TOL

--SELECIONA O VALOR MAXIMO DO HORIMETRO
SET @HOR_ULT=(SELECT MAX(MED_HORIMETRO) FROM LAN_MEDIDAS WHERE MED_TAG=@MED_TAG AND MED_FOGO=@MED_FOGO)

IF (@MED_HORIMETRO < @HOR_ULT)
raiserror 50001 'HORIMETRO ESTA MENOR QUE ANTERIOR'
ELSE IF (@CAL_HOR_TOL > 100)
raiserror 50001 'HORIMETRO ACIMA DE 100HT'
ELSE
BEGIN
INSERT INTO LAN_MEDIDAS (MED_DATA,MED_TAG,MED_POSICAO,MED_FOGO,
MED_INSPETOR,MED_HORIMETRO,MED_JUSTIFICATIVA,MED_DESC_ANE,MED_EXTERNO,
MED_INTERNO)
VALUES (
@MED_DATA,
@MED_TAG,
@MED_POSICAO,
@MED_FOGO,
@MED_INSPETOR,
@MED_HORIMETRO,
@MED_JUSTIFICATIVA,
@MED_DESC_ANE,
@MED_EXTERNO,
@MED_INTERNO)
END
END;

--Botão Salvar--

procedure TfrmMed.actsalvarExecute(Sender: TObject);
var r,c:integer;
begin
try
with DMsql.spLanMedidas do
//Salva o conteudo das linhas do StringGrid...
begin
c:=1;
for r := 0 to Sgrid.RowCount - 1 do

parameters.ParamByName('@MED_DATA').Value:=eddata.Text;
parameters.ParamByName('@MED_TAG').Value:=Sgrid.Cells[1,c];
parameters.ParamByName('@MED_POSICAO').Value:=Sgrid.Cells[2,c];
parameters.ParamByName('@MED_FOGO').Value:=Sgrid.Cells[3,c];
parameters.ParamByName('@MED_INSPETOR').Value:=edinspetor.Text;
parameters.ParamByName('@MED_HORIMETRO').Value:=edhorimetro.Text;
parameters.ParamByName('@MED_JUSTIFICATIVA').Value:=edjustificativa.Text;
parameters.ParamByName('@MED_DESC_ANE').Value:=eddesc.Text;
parameters.ParamByName('@MED_EXTERNO').Value:=Sgrid.Cells[4,c];
parameters.ParamByName('@MED_INTERNO').Value:=Sgrid.Cells[5,c];
ExecProc;
c:=c+1;
Messagedlg('Pronto! Todos os dados foram salvos com sucesso.',mtinformation,[mbok],0);
DMsql.AdoQryLanMedidas.Close;
DMsql.AdoQryLanMedidas.Open;
end;
Except
on e:EDatabaseError do
begin
ShowMessage(e.Message);
Criar;
end
end;
end;

Desde já agradeço a analise...

Atenciosamente...
Fábio Roell

Fábio Roell

Curtidas 0

Respostas

Guilherme Wiethaus

Guilherme Wiethaus

19/05/2013

Saudações Colega!

Eu utilizo o código abaixo, e funciona perfeitamente
(SQL Server 2005 ao SQL Server 2012) em uma Trigger (gatilho):

Ajuste ao seu código em uma Trigger AFTER ou INSTEAD OF

BEGIN TRY

	SET NOCOUNT ON;
		
	IF EXISTS(SELECT TOP (1) Inserted.* FROM inserted WHERE inserted.Percentual > 100)
	BEGIN
	   RAISERROR ('Erro 001: Percentual > 100%.', 16, 1);
	   RETURN;
	END;

END TRY
BEGIN CATCH
	DECLARE @ErrorMessage NVARCHAR(4000);
	DECLARE @ErrorSeverity INT;
	DECLARE @ErrorState INT;

	SELECT @ErrorMessage = ERROR_MESSAGE();
	SELECT @ErrorSeverity = ERROR_SEVERITY();
	SELECT @ErrorState = ERROR_STATE();

        -- Desfaz a Transacao

	ROLLBACK TRAN;

	RAISERROR (	@ErrorMessage, -- Message text.
				@ErrorSeverity, -- Severity.
				@ErrorState -- State. 
				);
	PRINT 'ERROR_MESSAGE: ' + @ErrorMessage + ' ERROR_SEVERITY ' + CAST(@ErrorSeverity AS VARCHAR(50)) + 
              ' ERROR_STATE: ' + @ErrorState;
	RETURN;
END CATCH

GOSTEI 0
Guilherme Wiethaus

Guilherme Wiethaus

19/05/2013

Outra maneira é ter que retornar um valor que indica uma não correspondência de sua validação na Stored Proc. Voce pode retornar um valor numérico usando RETURN (Value). Precisará declara o parâmetro como uma saída de dados de seu procediemnto armazenado. Pode tanto escapar através de um RAISEERROR como simplesmente entrar na condição e dar RETURN com seu valor, por exemplo 0=sucesso, 1=Erro. Pelo lado, no seu código delphi, ao ler a saiída da Stored vcoe faz a condição que foi sucesso ou erro e exibe a mensagem que queira. Se não souber como fazer, num momento oportuno, vou colocar o código aqui.

Abraços
GOSTEI 0
Fábio Roell

Fábio Roell

19/05/2013

Desculpa a demora...

Seria interessante se me manda-se o código para eu analisar e estuda-lo!

Desde já agradeço...!

Att,. Fabio Roell
GOSTEI 0
POSTAR