6 Replies Latest reply: Mar 11, 2012 7:53 AM by Maria Quintero RSS

Separar cadena de caracteres

Maria Quintero
Currently Being Moderated

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

 

  • Re: Separar cadena de caracteres
    David Manuel Vera
    Currently Being Moderated

    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!

     

  • Re: Separar cadena de caracteres
    Carlos Javier Perez
    Currently Being Moderated

    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

  • Re: Separar cadena de caracteres
    David Manuel Vera
    Currently Being Moderated

    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

     

    • Re: Separar cadena de caracteres
      David Manuel Vera
      Currently Being Moderated

      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!!

       

    • Re: Separar cadena de caracteres
      Maria Quintero
      Currently Being Moderated

      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.

       

Actions