PDA

Ver la Versión Completa : Ayuda con count


stormshadow
13/06/08, 18:56:24
Que tal, un saludo a toda la gente de este foro, soy nuevo me acabo de registrar, y apenas me estoy enseñando a programar en abap, es un lenguaje interesante solo que se m hace algo complejo, pues bien me gustaría saber si alguién me podría ayudar con un problemilla que tengo, resulta que hay en una tabla registros que se repiten, y yo quiero hacer en un reporte, que me muestre los registros repetidos de ese mismo campo, este es mi programa:

* REPORT .
REPORT ZSD_PEDIDOSREPETIDOS1.

************************************************************************
* Log de Modificaciones
************************************************************************
* Fecha Nombre ID de Cambio Nro.Orden Descripcion
************************************************************************

************************************************************************
* TYPE POOLS
************************************************************************

************************************************************************
* PROGRAMAS INCLUIDOS
************************************************************************


************************************************************************
* TABLAS
************************************************************************
TABLES: vbak.
************************************************************************
* ESTRUCTURAS
************************************************************************
DATA: BEGIN OF t_pedidos OCCURS 0,
bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
* ernam LIKE vbak-ernam, "NOMBRE
END OF t_pedidos.
************************************************************************
* TABLAS INTERNAS
************************************************************************

************************************************************************
* VARIABLES
************************************************************************

************************************************************************
* CONSTANTES
************************************************************************

************************************************************************
* PARAMETERS
************************************************************************

************************************************************************
* SELECT-OPTION
************************************************************************

************************************************************************
* AT SELECTION-SCREEN
************************************************************************

************************************************************************
* INICIALIZATION
************************************************************************

************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
SELECT
vbak~bstnk "CLAVE DEL PEDIDO
* vbak~ernam
FROM vbak
INTO TABLE t_pedidos.
************************************************************************
* END-OF-SELECTION
************************************************************************
END-OF-SELECTION.

*SE ESCRIBE CADA LINEA

LOOP AT t_pedidos.

SELECT
vbak~bstnk
* vbak~ernam
FROM vbak
INTO t_pedidos
GROUP BY
vbak~bstnk.
* HAVING vbak~bstnk > 1.
ENDSELECT.

ENDLOOP.

write t_pedidos.
************************************************************************
* FORMS

Pues bien, mi problema es el siguiente, en el loop en la parte del select quiero poner COUNT, para que me tome todos mis registros, porque ahorita como esetá solamente me muestra un registro, y yo quiero que me ponga todos!, y pues si lo pongo así:

LOOP AT t_pedidos.

SELECT COUNT (*)
vbak~bstnk
* vbak~ernam
FROM vbak
INTO t_pedidos
GROUP BY
vbak~bstnk.
* HAVING vbak~bstnk > 1.
ENDSELECT.

ENDLOOP.

Como creo yo que va la consulta, pues me tira este error:
Unknown column name "COUNT". not determined until runtime, you cannot specify a field list.
No entiendo el error, sé lo que dice pero no lo entiendo... porfavor si alguién me podría ayudar le estaría enternamente agradecido.
Igual gracias por tomarse el tiempo de leer mi tema!

ic_man_777
13/06/08, 19:07:04
Te marca unknown column porque... cree que COUNT es un campo de la tabla a la que quieres acceder... y esto es porque dejaste un espacio entre COUNT y el paréntesis...

prueba juntándolos....

nachosds
16/06/08, 10:48:03
Hola.

Si lo que quieres es mostrar todos los registros de la tabla t_pedidos, debes hacer un loop de ésta y dentro del loop hacer el write del campo de la t_pedidos.

Saludos!

stormshadow
16/06/08, 15:43:43
Bien que tal de nuevo yo jeje, pues si gracias por responder y tenías razon ic_man_777 era por el espacio... ahora ya me lo toma en cuenta el count, pero ahora tengo otro problema, nachosds si quiero mostrar los registros de la tabla interna que es t_pedidos, pero no me muestra nada, les pondré ahora como está mi código y haber si pueden ver mi error:

* REPORT .
REPORT ZSD_PEDIDOSREPETIDOS1.

************************************************************************
* Log de Modificaciones
************************************************************************
* Fecha Nombre ID de Cambio Nro.Orden Descripcion
************************************************************************

************************************************************************
* TYPE POOLS
************************************************************************

************************************************************************
* PROGRAMAS INCLUIDOS
************************************************************************


************************************************************************
* TABLAS
************************************************************************
TABLES: vbak.
************************************************************************
* ESTRUCTURAS
************************************************************************
DATA: BEGIN OF t_pedidos OCCURS 0,
bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
ernam LIKE vbak-ernam, "NOMBRE
END OF t_pedidos.

************************************************************************
* TABLAS INTERNAS
************************************************************************

************************************************************************
* VARIABLES
************************************************************************

************************************************************************
* CONSTANTES
************************************************************************

************************************************************************
* PARAMETERS
************************************************************************

************************************************************************
* SELECT-OPTION
************************************************************************

************************************************************************
* AT SELECTION-SCREEN
************************************************************************

************************************************************************
* INICIALIZATION
************************************************************************

************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
SELECT
vbak~bstnk "CLAVE DEL PEDIDO
vbak~ernam
FROM vbak
INTO TABLE t_pedidos.
************************************************************************
* END-OF-SELECTION
************************************************************************
END-OF-SELECTION.

*SE ESCRIBE CADA LINEA

LOOP.

SELECT COUNT(*)
* vbak~vbeln "NUMERO PEDIDO
* vbak~erdat "FECHA CREACION
vbak~bstnk "REFERENCIA DEL PEDIDO
vbak~ernam
INTO TABLE t_pedidos
FROM vbak
GROUP BY
vbak~bstnk vbak~ernam.
* HAVING vbak~bstnk > 1.
ENDLOOP.

write t_pedidos.

Es el código tal cual lo tengo en abap, y no me imprime nada, ya no me marca errores pero no me muestra nada :( espero me puedan ayudar! gracias de nuevo.

ic_man_777
16/06/08, 16:30:13
El write debes aplicarlo al campo de la tabla interna... no a la tabla interna por completo... para eso necesitarías el loop. Que no se realmente que es lo que quieres mostrar... pero pues, un loop así sería de la siguiente manera:

LOOP AT t_pedidos.
WRITE:/ t_pedidos-ernam.
ENDLOOP.

El loop anterior imprime todos los valores en el campo ernam de la tabla interna pedidos...

no entiendo muy bien lo que quieres hacer:

resulta que hay en una tabla registros que se repiten, y yo quiero hacer en un reporte, que me muestre los registros repetidos de ese mismo campo

stormshadow
16/06/08, 16:42:37
Ok deja te explico mi dilema, mira mi tarea es:
El campo bstnk, almacena la clave del registro del pedido, bien pues hay registros repetidos, y lo que tengo que hacer es imprimir en pantalla esos registros que se repiten, te pongo un ejemplo:
el registro AOL001 está dos veces, a pues lo que yo tengo que hacer es que me muestre en pantalla el AOL001 dos veces...
no sé si me expliqué bien, si no pues me dices, y ya inserté el loop como lo pusiste y ya me imprime todos los registros, pero yo solo requiero imprimir los que se repiten nadamas...
bueno muchas gracias por tú atención bro! espero la respuesta...

ic_man_777
16/06/08, 17:42:30
Y si se repite más de 2 veces también vd?.


* REPORT .
REPORT z_practica_abap.

************************************************** **********************
* Log de Modificaciones
************************************************** **********************
* Fecha Nombre ID de Cambio Nro.Orden Descripcion
************************************************** **********************

************************************************** **********************
* TYPE POOLS
************************************************** **********************

************************************************** **********************
* PROGRAMAS INCLUIDOS
************************************************** **********************


************************************************** **********************
* TABLAS
************************************************** **********************
TABLES: vbak.
************************************************** **********************
* ESTRUCTURAS
************************************************** **********************
DATA: BEGIN OF t_pedidos OCCURS 0,
bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
ernam LIKE vbak-ernam, "NOMBRE
END OF t_pedidos.

DATA: t_ped_tmp LIKE t_pedidos OCCURS 0 with header line.

DATA: veces TYPE I.

DATA: bstnk_tmp LIKE vbak-bstnk.

************************************************** **********************
* TABLAS INTERNAS
************************************************** **********************

************************************************** **********************
* VARIABLES
************************************************** **********************

************************************************** **********************
* CONSTANTES
************************************************** **********************

************************************************** **********************
* PARAMETERS
************************************************** **********************

************************************************** **********************
* SELECT-OPTION
************************************************** **********************

************************************************** **********************
* AT SELECTION-SCREEN
************************************************** **********************

************************************************** **********************
* INICIALIZATION
************************************************** **********************

************************************************** **********************
* START-OF-SELECTION
************************************************** **********************
START-OF-SELECTION.

SELECT
vbak~bstnk "CLAVE DEL PEDIDO
vbak~ernam
FROM vbak
INTO TABLE t_pedidos.

*SELECT COUNT( * )
*INTO total
*FROM vbak
*GROUP BY
*vbak~bstnk vbak~ernam.
*
*ENDSELECT.


LOOP AT t_PEDIDOS
WHERE bstnk = ''.
DELETE t_pedidos.
ENDLOOP.

t_ped_tmp[] = t_pedidos[].


DELETE ADJACENT DUPLICATES FROM t_ped_tmp.



SORT t_pedidos By bstnk.

LOOP AT t_ped_tmp.
veces = 0.
LOOP AT t_pedidos
WHERE bstnk = t_ped_tmp-bstnk.
veces = veces + 1.
ENDLOOP.
if veces = 1.
LOOP AT t_pedidos
WHERE bstnk = t_ped_tmp-bstnk.
DELETE t_pedidos.
ENDLOOP.
ENDIF.
ENDLOOP.

LOOP AT t_pedidos.
WRITE:/ t_pedidos-bstnk.
ENDLOOP.



*SE ESCRIBE CADA LINEA

*LOOP.

* HAVING vbak~bstnk > 1.

frankmerlos
16/06/08, 18:00:55
Hola

Create otra tabla interna.

DATA: BEGIN OF t_pedidos2 OCCURS 0,
bstnk LIKE vbak-bstnk, "CLAVE PEDIDO
contador type i.
END OF t_pedidos2.

ahora has un loop a t_pedidos.

clear t_pedidos2.
refresh t_pedidos2.
loop at t_pedidos.
move-corresponding t_pedidos to t_pedidos2
contador = 1
collect t_pedidos2.
endloop.

En la variable contador se guardara cuantas veces se encuentra cada bstnk.

ahora solo queda mostrar lo datos

loop at t_pedidos2 where contador > 1.
write : t_pedidos2-bstnk.
endloop.

saludos.

stormshadow
16/06/08, 18:08:22
oraleee carnal, le atinaste!!, eso es exactamente lo que quería, ya lo probe y funciona a la perfección, estaba muy lejos de lograr lo que quería! :( :( , pero weno ya iré entendiendo bien el código...
Oye un ultimo favorsito, m podrías explicar algo de este código? mira por ejemplo:

LOOP AT t_PEDIDOS
WHERE bstnk = ''.
DELETE t_pedidos.
ENDLOOP.

Allí mi campo de la clave del pedido me lo dejas en blanco no? bstnk = '', y eso que función hace?

Aquí igualas las tablas internas, pero despues le eliminas los registros duplicados de la t_ped_tmp, para que?

t_ped_tmp[] = t_pedidos[].

DELETE ADJACENT DUPLICATES FROM t_ped_tmp.

Y para finalizar en esta parte:

LOOP AT t_ped_tmp.
veces = 0.
LOOP AT t_pedidos
WHERE bstnk = t_ped_tmp-bstnk.
veces = veces + 1.
ENDLOOP.
if veces = 1.
LOOP AT t_pedidos
WHERE bstnk = t_ped_tmp-bstnk.
DELETE t_pedidos.
ENDLOOP.
ENDIF.
ENDLOOP.

Para que sirve el veces, y porque borras t_pedidos antes de finalizar su loop y el if??
LOOP AT t_pedidos
WHERE bstnk = t_ped_tmp-bstnk.
DELETE t_pedidos.
ENDLOOP.

Bueno espero m puedas explicar, muchas gracias por las molestias hermano..

ic_man_777
16/06/08, 18:33:06
Bueno, eso que ves es lo que se me ocurrió pero posiblemente se puede hacer de una forma mejor.


Explico:

LOOP AT t_PEDIDOS
WHERE bstnk = ''.
DELETE t_pedidos.
ENDLOOP.

Lo que pasa es que en mis datos me aparecían muchos registros en los cuales el campo BSTNK está vacío... lo que hice fué borrarlos, no se si a ti te son útiles. Entonces, lo que hace el código es SELECCIONAR DE LA TABLA INTERNA t_pedidos DONDE bstnk ESTÁ VACÍO Y BORRARLOS.

Como te digo, la forma que se me ocurrió para hacer lo que tu pedías fué, crear otra tabla interna que me ayudara:

t_ped_tmp

En la tabla de ayuda borré duplicados, porque, lo que quiero hacer es, buscar duplicados en la tabla t_pedidos, si tuviera registros duplicados en la tabla auxiliar no podría hacerlo tardaría mucho más...

Entonces, ya al final en t_ped_tmp solo tendré registros que no se repiten...

Entonces hago un recorrido a t_ped_tmp, busco cada registro que tengo (los cuales son unicos, no se repiten) en la tabla t_pedidos. Si lo encuentra una vez veces valdrá 1, si lo encuentra una vez no nos sirve, entonces lo buscamos y lo borramos:

if veces = 1.
LOOP AT t_pedidos
WHERE bstnk = t_ped_tmp-bstnk.
DELETE t_pedidos.
ENDLOOP.

Al final la tabla t_pedidos solo cuenta con registros que se repiten 2 o más veces...

Espero que te haya servido un poco mi explicación...



Yo también soy nuevo en Abap y pues, también mi forma de resolver este tipo de cosas es muy... básica, por eso digo que bien puede solucionarse de una mejor manera...

stormshadow
16/06/08, 18:39:44
oyeee que bien, muchas gracias man, de verdad que pues aún no entiendo mucho esto, pero me está comenzando a gustar, solo es cuestión de práctica, y eso creo que va a ser a diario, pues es mi trabajo jejeje, muchas gracias y espero que no te molesten tanto mis dudas, y si no porque voy a seguir preguntado jejeje gracias bro!

ic_man_777
16/06/08, 18:52:14
Me da gusto el poderte ayudar aunque sea un poco...
Y si, SAP y Abap son muy interesantes....

te vas a divertir =]