cancel
Showing results for 
Search instead for 
Did you mean: 

Separar cadena de caracteres

Former Member
0 Kudos

Hola a todos,

Hemos creado un campo de usuario de tipo Apunte (U_Seriales) en la Factura de Clientes que muestra los seriales de producto facturado, separados por un espacio, deseamos crear una consulta que nos muestre cada uno de esas cadenas de caracteres por separado. Cada cadena puede tener N cantidad de seriales.

Actualmente en las tabla la información se muestra de la siguiente forma:

*DocNum | ItemCode | U_Seriales *

123 | ABC | WERT3 WERT4 WERT5 WERT6 WERT7

La Consulta se requiere de esta manera:

*DocNum | ItemCode | U_Seriales *

123 | ABC | WERT3

123 | ABC | WERT4

123 | ABC | WERT5

123 | ABC | WERT6

123 | ABC | WERT7

Alguna idea?

Gracias de antemano por su ayuda.

Saludos Cordiales

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Después de pensarlo un rato, llegué a la conclusión de que si es posible hacer esa separación, pero requeriría programación más allá de T-SQL, ya que, como el campo es de texto, es difícil definir las reglas que rigen al campo. (sólo una serie de iteraciones y cálculos de losngitudes de palabras, pero no suena muy práctico)

¿Has probado a gestionar tu producto por medio de numeros de serie? eso te libraría del problema de tener que capturarlos manualmente en un campo de usuario, pero por otro lado, requeriría un mayor control sobre inventarios,

Saludos!

Answers (2)

Answers (2)

Former Member
0 Kudos

Aquí va el ejemplo.

Antes que nada, lo siguiente lo que va a hacer es crear una función dentro de tu Base de fatos. Realmente no sé si las funciones sean soportadas sin agredir al contrato de soporte, sería viable que primero investigues eso.

El código es el siguiente, se ejecuta una sola vez:

CREATE FUNCTION dbo.fnSplit(

@sInputList VARCHAR(8000) -- List of delimited items

, @sDelimiter VARCHAR(8000) = ' ' -- delimiter that separates items

) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN

DECLARE @sItem VARCHAR(8000)

WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0

BEGIN

SELECT

@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),

@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

IF LEN(@sItem) > 0

INSERT INTO @List SELECT @sItem END

IF LEN(@sInputList) > 0

INSERT INTO @List SELECT @sInputList -- Put the last item in

RETURN

END

go

Esto le da capacidad a la base de datos a tener una función que corta cadenas de caracteres dado 1 caracter comodín (en tu caso un espacio en blanco)

una vez ejecutado, se manda a llamar así

select * from fnSplit('casa verde grande colorada como mis pantalones', ' ')

El texto 'casa verde grande colorada como mis pantalones' entonces es cortado por los espacios.

A eso me refería con la complejidad de tu requerimiento.

Espero te sirva

Saludos

Former Member
0 Kudos

Esa era la primera forma.

hay una segunda que podría ser así.

DECLARE @S varchar(max),

@Split char(1),

@X xml

SELECT @S = 'casa grande verde colorada como mis pantalones',

@Split = ' '

SELECT @X = CONVERT(xml,'')

SELECT = T.c.value('.','varchar(20)')

FROM @X.nodes('/root/s') T(c)

la que ocupes dependerá de la complejidad de tu consulta inicial.

psdt. tmb esta consulta incluye la sentencia 'Replace' que croe tmb no es soportada por SAP..

Primero investiga con tu partner si puedes usar cualquiera de las dos formas

Saludos!!

Former Member
0 Kudos

Hola,

Gracias por tu interés en mi pregunta, y por las respuestas suministradas.

Implemente la función, y efectivamente me divide la cadena de caracteres en filas, pero hay un detalle:

El dividir la cadena de caracteres del campo serial es requerida para realizar un reporte de venta mensual, por lo que al aplicar la función en todos los registros de la tabla Hija de Factura INV1.U_Seriales, pero el mismo da un error diciendo que el subquery retorna más de una valor, lo cual no es permitido.

Es decir, el mismo funciona solo para una sola línea de registro, si le digo que lo haga para un DocEntry en particular. Así como tú lo aplicaste para la frase de tu ejemplo.

¿Alguna idea de cómo dividir los caracteres de INV1.U_Seriales y agregarle el DocEntry y el ItemCode de varios registros (Facturas)?

Gracias de antemano,

Saludos Cordiales.

Former Member
0 Kudos

Mariaem haz probado hacerlo con SELECT DISTINCT o con CASE WHEN, me imagino que tu campo de usuario esta en la tabla INV1 y no en la OINV, por que si esta en la INV1 podrias hacer la prueba de utilizar estos comandos.

Saludos y espero te sea de ayuda.

Edited by: perezgrajeda on Mar 1, 2012 6:54 PM

Former Member
0 Kudos

Hola,

Gracias por sus respuestas.

¿Podrías explicar la sintaxis que he de utilizar para probar lo que planteas?.

Saludos.