FoxPro/Visual FoxPro - Sigo con problemas de agrupar datos

   
Vista:
Imágen de perfil de Willy

Sigo con problemas de agrupar datos

Publicado por Willy (259 intervenciones) el 05/11/2007 15:56:54
Hola Francisco.

Sigo con el problema de agrupar los datos, la respuesta que enviaste realiza otro trabajo,

El problema es el siguiente, se tiene una tabla con los Sgtes. datos:
item - Nombre - Temas (campos)
100 - jose - tema1 . . . . . (Registro 1)
100 - jose - tema2 . . . . . (Reg 2)
100 - jose - tema3 . . . . . (Reg 3)
800 - maria - tema9 . . . . . (Reg 4)
400 - luis - tema3 . . . . . (Reg 5)
400 - luis - tema5 . . . . . (Reg 6)

Luego de la selección debo obtener :

item - Nombre - Temas . . . . . . . . . . . (Campos)
100 - jose - tema1,tema2,tema3. . . . . (Reg 1)
800 - maria - tema9 . . . . . . . . . . . . . . . . . (Reg 2)
400 - luis - tema3,tema5 . . . . . . . . . . . (Reg 3)

Los 3 primeros registros se agrupan en uno solo, prero en el campo: Temas no se pierde ningun dato, mas bien se concatenan (tema1,tema2,tema3). Si un registro como el cuarto no tiene mas de un dato en el campoo temas, entonces ese registro no se agrupa ni se concatena con nada.
El campo Item no debe ordenarse.

Espero sus respuestas.

Gracias por todo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Sigo con problemas de agrupar datos

Publicado por sergio (697 intervenciones) el 05/11/2007 19:56:11
Hola
Create un cursor temporal con los campos que necesita
pero el campo donde concatenas crealo de char de 254, (esto estudialo bien por si soberepasa esta cantidad de caracteres lo vas a tener que crear como memo para mas seguridad)
Luego create un corte de control por item (para hacer esto los vas a tener que tener ordenados por item, vas barriendo registro a registro y guardando en ekl cursor cada vez que hagas el corte.
Espero haber sido claro, no se me ocurre otra forma
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Sigo con problemas de agrupar datos

Publicado por enrique (1041 intervenciones) el 05/11/2007 20:25:26
Lo he intentado con Select y por el momento no pude resolverlo pero te envio un codigo alternativo

use tu_tabla
copy stru to c_cursor
close table all
use c_cursor excl
alter table c_cursor alter column temas c(100)
index on item to xc_cursor

use tu_tabla in 0

selec tu_tabla
go top
do while !eof("tu_tabla")
if indexseek(tu_tabla.item,.t.,"c_cursor","xc_cursor")
replace c_cursor.temas with allt(c_cursor.temas)+", "+allt(tu_tabla.temas)
else
appen blank in c_cursor
replace c_cursor.temas with tu_tabla.temas
replace c_cursor.item with tu_tabla.item
replace c_cursor.nombre with tu_tabla.nombre
endif
skip in tu_tabla
enddo

sele c_cursor
set index to

espero te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Aleluya

Publicado por Luighi (105 intervenciones) el 06/11/2007 09:20:03
alguna vez han oido decir: la union hace la fuerza?... bueno yo si
select siempre ayuda... pero no siempre es la solucion
asi que... que el resto tambien trabaje

sea el archivo: tabla.dbf
cuya estructura es:
item n 10
nombre c 10
tema c 10

crea un prg y anexa el siguiente codigo:

****
if set('talk')='ON' && bueno, tengo la mala costumbre de hacer siempre lo mismo
set talk off
cTalk='ON'
else
cTalk='OFF'
endif
cDele=set('dele') && es que luego me gusta dejar las cosas en su lugar
set dele on && por si las moscas, me gusta tener el camino despejado
clos data
crea curs temporal (item n(10), nombre c(10), temas c(254)) && temas puede ser memo
sele 0
use tabla
do while !eof()
nItem=item
cNombre=nombre
cTemas='' && empezamos con nada
do while !eof() and item=nItem && haremos esto mientras sea el mismo item
cTemas=cTemas+allt(tema)+', ' && concatenamos, concatenamos y concatenamos
skip && adivina que hace esto
enddo
cTemas=left(cTemas,len(cTemas)-2) && al final me sobro algo, lo quito pues
sele temporal
appe blan
repl item with nItem, nombre with cNombre, temas with cTemas && paciencia, ya casi
sele tabla
enddo
sele temas
brow
clos data
set dele &cDele
set talk &cTalk
****

ejecuta el prg, tendras lo que necesitas

pero queria acotar algo:
el codigo anterior resuelve el problema, pero si y solo si los datos de origen se presentan como los muestras.

pero y que tal si aparecen de la siguiente forma:

1 - jose-- tema1
1 - jose-- tema2
1 - jose-- tema3
8 - maria- tema5
4 - luis-- tema8
4 - luis-- tema9
8 - maria- tema6
8 - maria- tema7
1 - jose-- tema4

si es asi entonces si que seria un problemita
dado que al final solicitas que la tabla resultante no debe ser ordenada

ante ello habria que trabajar nuevamente y dejar las cosas asi:

1 - jose-- tema1
1 - jose-- tema2
1 - jose-- tema3
1 - jose-- tema4
8 - maria- tema5
8 - maria- tema6
8 - maria- tema7
4 - luis-- tema8
4 - luis-- tema9

hecho eso, todos contentos
pero...
eso ya es parte de otra historia
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Willy

Datos concatenados

Publicado por Willy (259 intervenciones) el 06/11/2007 15:36:36
Hola Luighi.

Buena tu respuesta, no te preocupes de las instrucciones de Fox, las conozco casi todas, especialmente de la version6 hacia atrás.

Tienes razón en tu comentario, en este momento se me ha presentado dicho problema, o sea tengo una tabla así.

1 - jose - tema1
1 - jose - tema2
1 - jose - tema3
8 - maria - tema5
4 - luis - tema8
4 - luis - tema9
8 - maria - tema6
8 - maria - tema4
1 - jose - tema4 , tema1
8 - maria - tema4

Podría ordenar de acuerdo al orden que aparecen como tu lo mecionas, pero, surge otro problema, veras que el penúltimo registro jose tiene un tema4, que se concatenará a tema1,tem2 y tem3, hast ahí muy bien, luego tema1 será concatenado, lo que no debe ocurrir, pues tema1 ya existe. Lo mismo pasa con el último registro donde maria - tema4 ya existe.

Que opinas al respecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Datos concatenados

Publicado por enrique (1041 intervenciones) el 06/11/2007 15:57:07
corre este proceso y contame

use tu_tabla
copy stru to c_cursor
close table all
use c_cursor excl
alter table c_cursor alter column temas c(100)
index on item to xc_cursor

use tu_tabla in 0

selec tu_tabla
go top
do while !eof("tu_tabla")
if indexseek(tu_tabla.item,.t.,"c_cursor","xc_cursor")
if allt(tu_tabla.temas)$c_cursor.temas
else
replace c_cursor.temas with allt(c_cursor.temas)+", "+allt(tu_tabla.temas)
endif
else
appen blank in c_cursor
replace c_cursor.temas with tu_tabla.temas
replace c_cursor.item with tu_tabla.item
replace c_cursor.nombre with tu_tabla.nombre
endif
skip in tu_tabla
enddo

sele c_cursor
set index to
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Willy

RE:Datos concatenados

Publicado por Willy (259 intervenciones) el 06/11/2007 18:47:08
Hola Enrique.

Bueno muy tu proceso, es realmente lo que necesitaba, funciona de maravilla.

Gracias por la ayuda.

Saludos Willy.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Willy

RE:Datos concatenados

Publicado por Willy (259 intervenciones) el 06/11/2007 19:10:23
Gracias por la ayuda Enrique.

Todo estaba bien, hasta que revisé los datos agrupados y el campo que deseché resulta que también existen datos que deben ser agrupados, osea.

1 - jose - tema1 - A
1 - jose - tema2 - A
1 - jose - tema3 - B
8 - maria - tema5 - B
4 - luis - tema8 -C
4 - luis - tema9 - D
8 - maria - tema6 - A
8 - maria - tema4 - C
1 - jose - tema4 , tema1 - D
8 - maria - tema4 - A

debe ser asi:
1 - jose - tema1, tema2,tema3,tem4 - A, B,D
8 - maria - tema5,tema6,tema4 - B,A,C
4 - luis - tema8,tema9 - C,D

Espero no ser latoso, pero mis jefes decidieron a último momento incluir este otro campo en la consulta.

Gracias por todo.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Datos concatenados

Publicado por enrique (1041 intervenciones) el 06/11/2007 19:26:59
De nada, aca te paso el arreglo para lo ultimo que te pidieron
solo cambia donde dice abc por el cuarto campo que agregas

use tu_tabla
copy stru to c_cursor
close table all
use c_cursor excl
alter table c_cursor alter column temas c(100)
alter table c_cursor alter column abc c(10)
index on item to xc_cursor

use tu_tabla in 0

selec tu_tabla
go top
do while !eof("tu_tabla")
if indexseek(tu_tabla.item,.t.,"c_cursor","xc_cursor")
if allt(tu_tabla.temas)$c_cursor.temas
else
replace c_cursor.temas with allt(c_cursor.temas)+", "+allt(tu_tabla.temas)
endif
if allt(tu_tabla.abc)$c_cursor.abc
else
replace c_cursor.abc with allt(c_cursor.abc)+", "+allt(tu_tabla.abc)
endif
else
appen blank in c_cursor
replace c_cursor.temas with tu_tabla.temas
replace c_cursor.item with tu_tabla.item
replace c_cursor.nombre with tu_tabla.nombre
replace c_cursor.abc with tu_tabla.abc
endif
skip in tu_tabla
enddo

sele c_cursor
set index to
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Datos concatenados

Publicado por Luighi (105 intervenciones) el 06/11/2007 16:01:59
1 - jose - tema1
1 - jose - tema2
1 - jose - tema3
8 - maria - tema5
4 - luis - tema8
4 - luis - tema9
8 - maria - tema6
8 - maria - tema4
1 - jose - tema4 , tema1
8 - maria - tema4

porque el penultimo registro aparece asi?, asi lo ingresaron o es el resultado de algun programa?
quizas deba aparecer asi

1 - jose - tema1
1 - jose - tema2
1 - jose - tema3
8 - maria - tema5
4 - luis - tema8
4 - luis - tema9
8 - maria - tema6
8 - maria - tema4
1 - jose - tema4
1 - jose - tema1
8 - maria - tema4

ahora porque el registro
8 - maria - tema 4
se repite?, eso no parece valido
me parece que antes de hacer lo que haya que hacerse
hay que depurar los datos

solo cuando el terreno este llano y claro podremos confiar de que un programa arroje los resultados deseados
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Willy

RE:Datos concatenados

Publicado por Willy (259 intervenciones) el 06/11/2007 18:28:33
Hola Luighi.

Bueno el registro no está repetido, lo que pasa es que existe otro campo Sector, donde el dato es diferente, pero es un campo si relativa importancia, los registros están bien así, solo que se debe evitar duplicar la imformación, pero antes ordenar, pero no en orden alfabético, sino en el orden de aparición.

Gracias por todo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar