Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

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

1 Solution

Accepted Solutions
Not applicable
Author

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;

View solution in original post

1 Reply
Not applicable
Author

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;