Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Transact Codigo nemotecnico

13 views
Skip to first unread message

Marcos Espinosa

unread,
Jul 5, 2000, 3:00:00 AM7/5/00
to
Cordial saludo:

Tengo un caso que quiero comentar por si alguien sabe como hacerlo:

Debo construir un scrip en transact que me permite tomar de una cadena que
puede contener más de una palabra un código nemotecnico de tres letras, por
ejemplo:

Tengo el nombre: FINANCIERA PODER Y DINERO
El código podria ser : FPD, debe excluir todos los articulos (el, lo, la y,
etc) el criterio deber ser el siguiente:

Tomar la primera letra de la primera palabra, la primera letra de la segunda
y la primera de la tercera en caso de que tenga tres o mas palabras sin
tener en cuenta los articulos (la,el,lo, de, y , etc) y si es de una palabra
es fácil porque solo debe tomar las tres primeras letras, se debe válidar
que no este repetido y si lo esta debe empezar a buscar otras alternativas
como la primera letra es la primera de la primera palabra y la segunda de la
segunda y la segunda de la tercera y asi sucesivamente.

Mil gracias,
Marcos Espinosa


Fernando G. Guerrero

unread,
Jul 6, 2000, 3:00:00 AM7/6/00
to

Aquí tienes un script que he creado para resolver tu problema. Utilizo el
archivo de ruido utilizado por MSSearch para eliminar palabras innecesarias,
pero puedes editar el archivo para adaptarlo a tus necesidades (de hecho
MSSearch considera la palara Poder como ruido). Es un poco largo, para que
sea lo más general posible, pero ha funcionado en las pruebas que he hecho.

Para probarlo, puedes ejecutar:

declare @tla char(3)

exec CreaTLA 'FINANCIERA PODERIO Y DINERO', @tla output

SELECT @TLA


Espero que te sirva.


create table Ruido(
Palabra varchar(20) PRIMARY KEY)
go

CREATE TABLE TLA(
TLA CHAR(3) PRIMARY KEY)
GO

/*
Importar el fichero de ruido de MSSearch
Cambia los parámetros a tus necesidades
*/
exec master.dbo.xp_cmdshell 'bcp den0.dbo.ruido in
d:\mssql7\ftdata\sqlserver\config\noise.esn -STuServidor -Usa -t\r -w -P'
GO

CREATE procedure CreaTLA
@Frase varchar(100), @TLA char(3) OUTPUT
AS
DECLARE @pos int
DECLARE @palabra varchar(100)
DECLARE @resto varchar(100)

CREATE TABLE #TLA(
ID int PRIMARY KEY IDENTITY(1,1),
Palabra varchar(100))

SET @resto = ltrim(rtrim(@Frase))

SET @Pos = CHARINDEX(' ', @resto)

WHILE @Pos <> 0
BEGIN
SET @Palabra = SUBSTRING(@Resto, 1, @pos-1)

Insert #tla
select upper(@Palabra)

set @Resto = substring(@Resto, @pos + 1, 100)

SET @Pos = CHARINDEX(' ', @resto)
END

INSERT #tla
select UPPER(@Resto)

DELETE #tla
FROM #Tla JOIN Ruido
ON Ruido.Palabra = #tla.Palabra

DECLARE @NTLA int

SET @NTLA = (SELECT Count(*) FROM #Tla)

IF @Ntla = 1
BEGIN

EXEC CreaTLA1 @TLA OUTPUT

IF @TLA IS NULL
BEGIN
UPDATE #tla
SET Palabra = Palabra + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

EXEC CreaTLA1 @TLA OUTPUT
END

END
ELSE IF @NTLA = 2
BEGIN
EXEC CreaTLA2 @TLA OUTPUT

IF @TLA IS NULL
BEGIN
UPDATE #tla
SET Palabra = Palabra + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

EXEC CreaTLA2 @TLA OUTPUT
END
END
ELSE
BEGIN
EXEC CreaTLA3 @TLA OUTPUT

IF @TLA IS NULL
BEGIN
UPDATE #tla
SET Palabra = Palabra + '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

EXEC CreaTLA3 @TLA OUTPUT
END

END

GO


CREATE procedure CreaTLA1
@TLA char(3) OUTPUT
AS
DECLARE @I1 int, @I2 int, @I3 int
DECLARE @Palabra varchar(100)

SET @Palabra = (SELECT TOP 1 Palabra
FROM #TLA)

SET @i1 = 1
SET @i2 = 2
SET @i3 = 3

WHILE 1=1
BEGIN
SET @TLA = SUBSTRING(@Palabra, @i1, 1) +
SUBSTRING(@Palabra, @i2, 1) +
SUBSTRING(@Palabra, @i3, 1)

IF EXISTS(SELECT * FROM TLA
WHERE TLA = @TLA)
BEGIN
IF @i3 < LEN(@Palabra)
SET @i3 = @i3 + 1
ELSE IF @i2 < LEN(@Palabra) - 1
BEGIN
SET @i2 = @i2 + 1
SET @i3 = @i2 + 1
END
ELSE IF @i1 < LEN(@Palabra) - 2
BEGIN
SET @i1 = @i1 + 1
SET @i2 = @i1 + 1
SET @i3 = @i2 + 1
END
ELSE
BEGIN
SET @TLA = NULL
BREAK
END
END
ELSE
BEGIN
INSERT TLA
SELECT @TLA

BREAK
END

END
GO


CREATE procedure CreaTLA2
@TLA char(3) OUTPUT
AS
DECLARE @I1 int, @I2 int, @I3 int
DECLARE @Palabra1 varchar(100)
DECLARE @Palabra2 varchar(100)

SET @Palabra1 = (SELECT TOP 1 Palabra
FROM #TLA
ORDER BY ID ASC)

SET @Palabra2 = (SELECT TOP 1 Palabra
FROM #TLA
WHERE Palabra <> @Palabra1
ORDER BY ID ASC)

SET @i1 = 1
SET @i2 = 2
SET @i3 = 1

WHILE 1=1
BEGIN
SET @TLA = SUBSTRING(@Palabra1, @i1, 1) +
SUBSTRING(@Palabra1, @i2, 1) +
SUBSTRING(@Palabra2, @i3, 1)

IF EXISTS(SELECT * FROM TLA
WHERE TLA = @TLA)
BEGIN
IF @i3 < LEN(@Palabra2)
SET @i3 = @i3 + 1
ELSE IF @i2 < LEN(@Palabra1)
BEGIN
SET @i2 = @i2 + 1
SET @i3 = 1
END
ELSE IF @i1 < LEN(@Palabra1) - 1
BEGIN
SET @i1 = @i1 + 1
SET @i2 = @i1 + 1
SET @i3 = 1
END
ELSE
BEGIN
SET @TLA = NULL
BREAK
END
END
ELSE
BEGIN
INSERT TLA
SELECT @TLA

BREAK
END

END
GO


CREAE procedure CreaTLA3
@TLA char(3) OUTPUT
AS
DECLARE @I1 int, @I2 int, @I3 int
DECLARE @Palabra1 varchar(100)
DECLARE @Palabra2 varchar(100)
DECLARE @Palabra3 varchar(100)

SET @Palabra1 = (SELECT TOP 1 Palabra
FROM #TLA
ORDER BY ID ASC)

SET @Palabra2 = (SELECT TOP 1 Palabra
FROM #TLA
WHERE Palabra <> @Palabra1
ORDER BY ID ASC)

SET @Palabra3 = (SELECT TOP 1 Palabra
FROM #TLA
WHERE Palabra <> @Palabra1
AND Palabra <> @Palabra2
ORDER BY ID ASC)

SET @i1 = 1
SET @i2 = 1
SET @i3 = 1

WHILE 1=1
BEGIN
SET @TLA = SUBSTRING(@Palabra1, @i1, 1) +
SUBSTRING(@Palabra2, @i2, 1) +
SUBSTRING(@Palabra3, @i3, 1)

IF EXISTS(SELECT * FROM TLA
WHERE TLA = @TLA)
BEGIN
IF @i3 < LEN(@Palabra3)
SET @i3 = @i3 + 1
ELSE IF @i2 < LEN(@Palabra2)
BEGIN
SET @i2 = @i2 + 1
SET @i3 = 1
END
ELSE IF @i1 < LEN(@Palabra1)
BEGIN
SET @i1 = @i1 + 1
SET @i2 = 1
SET @i3 = 1
END
ELSE
BEGIN
SET @TLA = NULL
BREAK
END
END
ELSE
BEGIN
INSERT TLA
SELECT @TLA

BREAK
END

END

GO


--
Fernando G. Guerrero
MCDBA, MCSD, MCT, MCSE+Internet
QA Group Ltd., UK
Share what you know, learn what you don't

(please reply only to the newsgroup)

"Marcos Espinosa" <maesp...@firstcom.com.co> wrote in message
news:eNRaArs5$GA.197@cppssbbsa05...

Alejo

unread,
Jul 6, 2000, 3:00:00 AM7/6/00
to
Tambien puedes usar el sistema bancario, que consiste en usar las tres
primeras letras de cada palabra. El sistema es bueno, muy bueno, lo usan los
bancos, y es casi imposible que coincidan dos codigos, por ejemplo, mi
hermano y yo nos apellidamos igual, pero el se llama Alfredo y yo Alejandro.
Aunque coinciden los apellidos, mis tres primeras letras del nombre (ale)
son distintas (alf) aunque solo por una letra.

Un saludo.

Marcos Espinosa <maesp...@firstcom.com.co> escribió en el mensaje de
noticias eNRaArs5$GA.197@cppssbbsa05...

0 new messages