Ir para conteúdo

Arquivado

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

Joe_m

[Resolvido] Firebird

Recommended Posts

Estou precisando do seguinte

tenho uma aplicação onde a chave primaria de uma tabela é 0800001 do tipo varchar

onde os dois primeiros digitos referem -se ao ano e o restante é um sequencial

no afterpost preciso checar se essa chave existe caso exista presiso gerar outra gostaria de fazer usando trigger ou stored procedure

algeum tem alguma ideia de como fazer isso

 

Desde já agradeço a que ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou precisando do seguinte

tenho uma aplicação onde a chave primaria de uma tabela é 0800001 do tipo varchar

onde os dois primeiros digitos referem -se ao ano e o restante é um sequencial

no afterpost preciso checar se essa chave existe caso exista presiso gerar outra gostaria de fazer usando trigger ou stored procedure

algeum tem alguma ideia de como fazer isso

 

Desde já agradeço a que ajudar

OLá Joe,

 

você pode usar Trigger + Generator.

CREATE TRIGGER LOG_BI FOR TABELALOG
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.CODIGO_LOG IS NULL) THEN
	NEW.CODIGO_LOG = substring(Cast(extract(year from NOW) as VARCHAR(4)) from 3 for 2 )||
	 cast(lpad(GEN_ID(GEN_LOG_ID,1), 7, '0') as Varchar(7));
END
Não sei se funciona do jeito que você quer...

 

Se der certo, avisa ae !

 

[]s

Jeronimo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive que fazer algumas modificações mas deu certo para o que eu precisava porem estou com o seguinte problema agora

 

number = LPAD(cast((cast(number as integer) + 1) as varchar(5)),5,'0')

 

An error was found in the application program input parameters for the SQL statement.

Dynamic SQL Error.

SQL error code = -804.

Function unknown.

LPAD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa tarde pessoal

 

Consegui solucionar o meu caso da seguinte maneira

 

CODE
CREATE TRIGGER NEWKEY FOR DMORC

ACTIVE BEFORE INSERT POSITION 0

AS

declare variable number varchar(5);

begin

/* Trigger text */

execute procedure countdmorc new.num returning_values :number;

while (number<>'') do begin

new.num=substring(Cast(extract(year from current_date) as VARCHAR(4)) from 3 for 2 )||number;

execute procedure countdmorc new.num returning_values :number;

end

end

CODE
CREATE PROCEDURE COUNTDMORC (

NUM VARCHAR(7))

RETURNS (

ORC VARCHAR(7))

AS

DECLARE VARIABLE NUMBER VARCHAR(7);

DECLARE VARIABLE NI INTEGER;

begin

/* Procedure Text */

Select count(*) from dmorc where num=:num into ni;

if (ni > 0) then begin

Number = substring(num from 3 for 5);

number = cast((cast(number as integer)+1)as varchar(5));

execute procedure len number returning_values :nI;

while (ni < 5) do begin

number='0'||number;

ni=ni+1;

end

orc=number;

end

suspend;

end^

CODE
CREATE PROCEDURE LEN (

STR VARCHAR(100))

RETURNS (

NI INTEGER)

AS

DECLARE VARIABLE PAT VARCHAR(100);

begin

/* Procedure Text */

ni = null;

IF (str IS NULL) THEN EXIT;

pat = '';

ni = 0;

WHILE (NOT str LIKE pat) DO BEGIN

pat = pat || '_';

ni = ni + 1;

END

suspend;

end^

 

Com essas duas stored procedure e a trigger pode ter inumeros usuarios tentando inserir ao mesmo tempo que nunca vai dar chave duplicada

 

Valew pela ajuda jeronimoks

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.