1 Reply Latest reply: Jan 21, 2013 11:31 AM by Juan Gerardo Cabeza Luque RSS

    Como leer varias veces un registro seleccionado

      Os pongo un ejemplo del problema que tengo:

       

      En la BBDD tenemos una tabla con la siguiente información:

       

      id

      mensaje

      campo A

      campo B

      100

      Mensaje #temaA que nos llega hoy #temaB al final del día

      A

      X

      101

      Mensaje numero 2

      B

      Y

      102

      #temaC se ha abierto como tema de conversación

      C

      Z

       

       

      Y queremos generar una tabla intermedia que quede de la forma siguiente y que será de la que saquemos el informe (si se puede hacer sin crear una tabla intermedia también vale):

       

      id

      mensaje

      tema

      campo A

      campo B

      100

      Mensaje #temaA que nos llega hoy #temaB al final del día

      #temaA

      A

      X

      100

      Mensaje #temaA que nos llega hoy #temaB al final del día

      #temaB

      A

      X

      101

      Mensaje numero 2

       

      B

      Y

      102

      #temaC se ha abierto como tema de conversación

      #temaC

      C

      Z

       

       

      Es decir, por cada registro que lee de la bbdd queremos contar el número de palabras que empiezan con el carácter ‘#’ en el campo mensaje, y generar una tabla o informe en el que el mensaje se repita n veces (tantas como nº de # se encuentren en el mensaje leído) y en un campo nuevo poner el valor de este campo #.

      El script que estoy intentando hacer es algo asi:

       

      MyTab:

      load

        Text as "Texto Mensaje"

      ,SubStringCount(Text,'#') as contador

      ;

       

      sql select  Text

                  from TablaA A, TablaC C, TablaD D

                  WHERE .....

      ............

      ;

       

      let contador = SubStringCount(Text,'#');

       

      IF contador <> 0 then   

                  do while contador <> 0

                      let posicion = FindOneOf(Text,'#');

                      let TemaEncontrado = Mid(Text, FindOneOf(Text,'#'));

                      let longTemaEncontrado = FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' ');

                      let Tema = Left(Mid(Text, FindOneOf(Text,'#')) , FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' '));

                      let Text = Mid(Mid(Text, FindOneOf(Text,'#')),FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' '));

                      load

                           SubStringCount(Text,'#') as contador,

                           FindOneOf(Text,'#') as posicion,

                           Mid(Text, FindOneOf(Text,'#')) as TemaEncontrado,

                           FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' ') as longTemaEncontrado,

                           Left(Mid(Text, FindOneOf(Text,'#')) , FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' ')) as Tema,

                           Text as mensaje

                           ;

                      let contador = SubStringCount(Text,'#');

                 loop

      END IF

        • Re: Como leer varias veces un registro seleccionado
          Juan Gerardo Cabeza Luque

          Hola Laura,

               Te propongo que utilices la función SubField(), que es muy útil en estos casos. Una buena solución sería utilizándola de forma que en una primera pasada separases todas las palabras, y en la segunda te quedaras solamente con las que empiezan con #. Creo que sería más fácil de mantener:

           

           

          //Tabla de ejemplo

          Cadenas_TMP:

          LOAD * INLINE [

                    id,          mensaje, campoA, campoB

                    100, Mensaje #temaA que nos llega hoy #temaB al final del día, A, X

                    101, Mensaje numero 2, B, Y

                    102, #temaC se ha abierto como tema de conversación, C, Z

          ];

           

           

          //Carga y desglose de los registros que contienen etiquetas con #

          Cadenas_TMP2:

          LOAD

                    *,

                    SubField(mensaje, ' ') AS Etiqueta

          Resident Cadenas_TMP

          Where Index(mensaje, '#') > 0;

           

           

          // Me quedo ahora solamente con las etiquetas que empiezan con #

          Cadenas:

          NoConcatenate

          LOAD *

          Resident Cadenas_TMP2

          Where Left(Etiqueta, 1) = '#';

           

           

          // Y añado los registros que no tienen ninguna etiqueta, con ese campo vacío

          Concatenate(Cadenas)

          LOAD

                    *,

                    '' AS Etiqueta

          Resident Cadenas_TMP

          Where Index(mensaje, '#') = 0;

           

           

          DROP Table Cadenas_TMP;

          DROP Table Cadenas_TMP2;