MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Problema Con Select Single (foro/showthread.php?t=71734)

aaron alfonso 27/05/14 00:15:17

Problema Con Select Single
 
Hola Necesito Dejar De Usar El Select Single Por que Solo Me Trae Un Solo Registro Pero He Intentado Pero No He Podido Alguien Me Puede Apoyar Con Un Ejemplo O Algun Comentario Se Lo Agradeceria Mucho.

Select Single Bukrs Belnr Gjahr Bldat Budat Xblnr Bktxt Blart
From Bkpf Into (t_datos-bukrs , T_datos-belnr , T_datos-gjahr , T_datos-bldat , T_datos-budat , T_datos-xblnr , T_datos-bktxt , T_datos-blart)
Where Bukrs Eq P_bukrs
And Belnr In S_belnr
And Gjahr In S_gjahr.

Select Single Sgtxt Prctr
Into (t_datos-sgtxt , T_datos-prctr)
From Bseg
Where Bukrs Eq T_datos-bukrs
And Belnr Eq T_datos-belnr
And Gjahr Eq T_datos-gjahr.

Loop At T_datos.
Select Single Sgtxt Prctr
Into (t_datos-sgtxt , T_datos-prctr)
From Bseg
Where Bukrs Eq T_datos-bukrs
And Belnr Eq T_datos-belnr
And Gjahr Eq T_datos-gjahr.
Endloop.

Append T_datos.

Endform.

Desmoquattro 27/05/14 02:49:06


types: begin of ty_bkpf,
bukrs type bkpf-bukrs,
belnr type bkpf-belnr,
gjahr type bkpf-gjahr,
bldat type bkpf-bldat,
budat type bkpf-budat,
xblnr type bkpf-xblnr,
bktxt type bkpf-bktxt,
blart type bkpf-blart,
end of ty_bkpf.

types: begin of ty_bseg,
bukrs type bseg-bukrs,
belnr type bseg-belnr,
gjahr type bseg-gjahr,
buzei type bseg-buzei,
sgtxt type bseg-sgtxt,
prctr type bseg-prctr,
end of ty_bseg.

types: begin of ty_datos,
bukrs type bkpf-bukrs,
belnr type bkpf-belnr,
gjahr type bkpf-gjahr,
buzei type bseg-buzei,
bldat type bkpf-bldat,
budat type bkpf-budat,
xblnr type bkpf-xblnr,
bktxt type bkpf-bktxt,
blart type bkpf-blart,
Sgtxt type bseg-sgtxt,
Prctr type bseg-prctr,
end of ty_datos.

data: t_datos type standard table of ty_datos,
t_bkpf type standard table of ty_bkpf,
t_bseg type standard table of ty_bseg.

data: wa_bkpf type ty_bkpf,
wa_bseg type ty_bseg,
wa_datos type ty_datos.

** También podrías llenar t_datos directamente
Select Bukrs Belnr Gjahr Bldat Budat Xblnr Bktxt Blart
From Bkpf
Into table t_bkpf
Where Bukrs Eq P_bukrs
And Belnr In S_belnr
And Gjahr In S_gjahr.

if t_bkpf[] is not initial.
Select bukrs belnr gjahr buzei Sgtxt Prctr
From Bseg
Into table t_bseg
for all entries in t_bkpf
Where Bukrs Eq T_bkpf-bukrs
And Belnr Eq T_bkpf-belnr
And Gjahr Eq T_bkpf-gjahr.

endif.

Loop At T_bkpf into wa_bkpf.
** Movés los campos de wa_bkpf a wa_datos.
loop at t_bseg into wa_bseg
where bukrs eq wa_bkpf-bukrs
and belnr eq wa_bkpf-belnr
and gjahr eq wa_bkpf-gjahr.
** Movés los campos de wa_bseg a wa_datos.
append wa_datos to t_datos.
clear wa_datos.
endloop.
Endloop.

Básicamente sería eso... después hay varias cosas para mejorar si necesitás performance (tablas sorted, loopear la bseg directo y un read a bkpf si cambió el valor, usar índices, etc etc)


Saludos!

awas90 27/05/14 15:38:53

No estaras haciendo un select single de campos no clave no?

aaron alfonso 28/05/14 17:44:00

Desmoquattro
 
HOLA PUES AMIGO PARECE QUE SI ES CORRECTO TODO LO UNICO QUE NO ENTIENDO ES QUE AL MOMENTO DE CHECAR NO TRAE NADA .
SUPONGO SEA POR DONDE COLOCASTE EL APPEND DENTRO DEL LOOP.
PERO YA LO SAQUE NO ME MANDA NADA AL ALV.
CREO QUE TENGO COLOCARE TODO MI CODIGO ESPERO ESTE ENTENDIBLE.

:confused: :confused: :confused:

aaron alfonso 28/05/14 17:44:54

Codigo
 
:confused: :confused: :confused:
REPORT ZCONSULTA_DOCFI.

TABLES:BKPF,BSEG.
TYPES: BEGIN OF TY_BKPF,
BUKRS TYPE BKPF-BUKRS,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF-GJAHR,
BLDAT TYPE BKPF-BLDAT,
BUDAT TYPE BKPF-BUDAT,
XBLNR TYPE BKPF-XBLNR,
BKTXT TYPE BKPF-BKTXT,
BLART TYPE BKPF-BLART,
END OF TY_BKPF.

TYPES: BEGIN OF TY_BSEG,
BUKRS TYPE BSEG-BUKRS,
BELNR TYPE BSEG-BELNR,
GJAHR TYPE BSEG-GJAHR,
SGTXT TYPE BSEG-SGTXT,
PRCTR TYPE BSEG-PRCTR,
END OF TY_BSEG.

TYPES: BEGIN OF TY_DATOS,
BUKRS TYPE BKPF-BUKRS,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF-GJAHR,
BLDAT TYPE BKPF-BLDAT,
BUDAT TYPE BKPF-BUDAT,
XBLNR TYPE BKPF-BKTXT,
BKTXT TYPE BKPF-bktxt,
BLART TYPE BKPF-BLART,
SGTXT TYPE BSEG-SGTXT,
PRCTR TYPE BSEG-PRCTR,
END OF TY_DATOS.

DATA:e_layout TYPE lvc_s_layo,
t_fcat TYPE lvc_t_fcat,
fldtext TYPE char50.

DATA: T_DATOS TYPE STANDARD TABLE OF TY_DATOS,
T_BKPF TYPE STANDARD TABLE OF TY_BKPF,
T_BSEG TYPE STANDARD TABLE OF TY_BSEG.

DATA: WA_BKPF TYPE TY_BKPF,
WA_BSEG TYPE TY_BSEG,
WA_DATOS TYPE TY_DATOS.

" FILTROS DE BUSQUEDA DE CAMPOS
SELECT-OPTIONS:
S_BELNR FOR BKPF-BELNR,
S_BLDAT FOR BKPF-BLDAT,
S_GJAHR FOR BKPF-GJAHR,
S_BUDAT FOR BKPF-BUDAT,
S_XBLNR FOR BKPF-XBLNR,
S_BLART FOR BKPF-BLART.
PARAMETERS:
P_BUKRS LIKE BKPF-BUKRS OBLIGATORY.
*&--------------------------------------------------------------------*
START-OF-SELECTION."Ejecuta sub-rutinas
PERFORM PIDE_DATOS. "Sub-rutina paso 1
PERFORM REPORTE_ALV."Sub-rutina paso 2
*&--------------------------------------------------------------------*
FORM PIDE_DATOS.
SELECT BUKRS BELNR GJAHR BLDAT BUDAT XBLNR BKTXT BLART
FROM BKPF INTO TABLE T_BKPF
WHERE BUKRS EQ P_BUKRS
AND BELNR IN S_BELNR
AND GJAHR IN S_GJAHR.

IF T_BKPF[] IS NOT INITIAL.
SELECT BUKRS BELNR GJAHR SGTXT PRCTR
FROM BSEG INTO TABLE T_BSEG
FOR ALL ENTRIES IN T_BKPF
WHERE BUKRS EQ T_BKPF-BUKRS
AND BELNR EQ T_BKPF-BELNR
AND GJAHR EQ T_BKPF-GJAHR.
ENDIF.

LOOP AT T_BKPF INTO WA_BKPF.
** Movés los campos de wa_bkpf a wa_datos.
LOOP AT T_BSEG INTO WA_BSEG
WHERE BUKRS EQ WA_BKPF-BUKRS
AND BELNR EQ WA_BKPF-BELNR
AND GJAHR EQ WA_BKPF-GJAHR.
** Movés los campos de wa_bseg a wa_datos.
ENDLOOP.
ENDLOOP.

APPEND WA_DATOS TO T_DATOS.
CLEAR WA_DATOS.
ENDFORM.
*&--------------------------------------------------------------------*
*REPORTE_ALV.- "SUBRUTINA" (SI AHI DATOS EMPIEZA)SI HAY DATOS,CARGA LOS DATOS Y EL CATALOGO.
*SI NO(NO PRESENTA DATOS)
*&--------------------------------------------------------------------*
FORM REPORTE_ALV.
CHECK NOT T_DATOS[] IS INITIAL." REVISA SI REALMENTE AHI DATOS EN (TAB.INT.) T_DATOS
PERFORM catalogo_fcat.
e_layout-zebra = 'X'.
e_layout-sel_mode = 'D'.
e_layout-no_rowmove = 'X'.
e_layout-col_opt = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' "LLAMADO DE FUNCION ALV.
EXPORTING
i_callback_program = sy-repid
i_callback_html_top_of_page = 'MY_HTML_TOP_PAGE'
is_layout_lvc = e_layout
it_fieldcat_lvc = t_fcat
TABLES
t_outtab = T_DATOS
EXCEPTIONS
program_error = 1.

IF SY-TCODE ='ZCONSULTA_DOCFI'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
* CATALOGO.- COLOCA LAS CABECERAS DEL ALV
*&---------------------------------------------------------------------*
FORM catalogo_fcat.
PERFORM agrega_campos USING:
'BUKRS' 'BUKRS' 'BKPF' space space,
'BELNR' 'BELNR' 'BKPF' space space,
'GJAHR' 'GJAHR' 'BKPF' space space,
'BLDAT' 'BLDAT' 'BKPF' space space,
'BUDAT' 'BUDAT' 'BKPF' space space,
'XBLNR' 'XBLNR' 'BKPF' space space,
'BKTXT' 'BKTXT' 'BKPF' space space,
'BLART' 'BLART' 'BKPF' space space,
'SGTXT' 'SGTXT' 'BSEG' space space,
'PRCTR' 'PRCTR' 'BSEG' space space.
ENDFORM. " CATALOGO_FCAT
*&---------------------------------------------------------------------*
* AGREGA CAMPOS
*&---------------------------------------------------------------------*
FORM agrega_campos USING
value(p1) value(p2) value(p3) value(p4) value(p5).
DATA l_fcat TYPE lvc_s_fcat.
l_fcat-fieldname = p1.
l_fcat-ref_field = p2.
l_fcat-ref_table = p3.
l_fcat-coltext = p4.
l_fcat-inttype = p5.
l_fcat-col_opt = 'X'.
IF p5 NE space.
l_fcat-intlen = 20.
l_fcat-decimals = 2.
l_fcat-decimals_o = 2.
ENDIF.
APPEND l_fcat TO t_fcat.
ENDFORM. " finliza agrega_campos
*&---------------------------------------------------------------------*
*&Form MY_USER_COMMAND
*&---------------------------------------------------------------------*
FORM my_user_command USING p_ucomm TYPE sy-ucomm
p_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'REGR' OR 'SALI'.
p_selfield-exit = abap_true.
ENDCASE.

ENDFORM. " MY_USER_COMMAND
*-----------------------------------------------------------------------*

Ripper87 28/05/14 18:21:40

Puedes hacer todo en un solo INNER JOIN:


Por razones de rendimiento, no deberias hacer un SELECT dentro de un LOOP, imaginate que tengas 1000 registros en el LOOP vas a realizar 1000 consultas a la base de datos, cuando puedes hacer una sola consulta que te traiga toda la data.

aaron alfonso 28/05/14 18:56:13

Ripper
 
me parece buena tu observación ripper pero el problema es la tabla bseg

:confused: :confused: :confused:
*Para tablas pool, tablas cluster y vistas de supresión no se permite JOIN:BSEG

Ripper87 28/05/14 19:20:57

Tienes razón, se me olvidó...

Entonces hay que hacerlo como te lo colocó el amigo más arriba, solo te faltaría hacer el APPEND a la tabla, y yo agregaría el campo BUZEI a las consultas y condiciones, ya que es un campo clave que identifica la posición del documento, si un documento tiene varias posiciones y no verificas ese campo puedes estar mezclando datos de posiciones diferentes y traerte data erronea.


xtralex89 28/05/14 22:15:14



Cuando usas un SELECT SINGLE la consulta solo te regresa un registro, si lo que quieres es obtener mas registros debes quitar la palabra SINGLE y poner que reciba los datos en una tabla de la misma estructura con los datos que estas consultando, usando INTO TABLE.


Select Bukrs Belnr Gjahr Bldat Budat Xblnr Bktxt Blart
From Bkpf
Into TABLE (t_datos-bukrs , T_datos-belnr , T_datos-gjahr , T_datos-bldat, T_datos-budat , T_datos-xblnr , T_datos-bktxt , T_datos-blart)
Where Bukrs Eq P_bukrs
And Belnr In S_belnr
And Gjahr In S_gjahr.

En la parte del INTO TABLE puedes generar un types y posteriormente una workarea con esa estructura y su tabla interna .

TYPES: BEGIN OF ty_wa,
Bukrs type bukrs,
Belnr type belnr_d,
Gjahr type gjahr,
Bldat type bldat,
Budat type budat,
Xblnr type xblnr,
Bktxt type bktxt,
Blart type blart,
END OF ty_wa.

data: it_tabla type table of ty_wa,
wa_tabla type ty_wa.

quedaría la consulta así:

Select Bukrs Belnr Gjahr Bldat Budat Xblnr Bktxt Blart
From Bkpf
Into table it_tabla
Where Bukrs Eq P_bukrs
And Belnr In S_belnr
And Gjahr In S_gjahr.

Saludos.

aaron alfonso 02/06/14 17:42:40

problema con las modificaciones propuestas
 
hola
he estado trando de entender sus opiniones encuanto alo que debo de hacer
pero mi programa con alv no funciona no me trae los datos debuggie y no inserta , espero puedan seguirme ayudando para solucionar mi problema.
saludos .!le dejo lo que hasta el momento llevo

*&---------------------------------------------------------------------*
*&Report ZVERCONSULTA
*&---------------------------------------------------------------------*
*&Analisis de Documentos FI
*&---------------------------------------------------------------------*
REPORT ZCONSULTA_DOCFI.

TABLES:BKPF,BSEG.
TYPES: BEGIN OF TY_BKPF,
BUKRS TYPE BKPF-BUKRS,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF-GJAHR,
BLDAT TYPE BKPF-BLDAT,
BUDAT TYPE BKPF-BUDAT,
XBLNR TYPE BKPF-XBLNR,
BKTXT TYPE BKPF-BKTXT,
BLART TYPE BKPF-BLART,
END OF TY_BKPF.

TYPES: BEGIN OF TY_BSEG,
BUKRS TYPE BSEG-BUKRS,
BELNR TYPE BSEG-BELNR,
GJAHR TYPE BSEG-GJAHR,
SGTXT TYPE BSEG-SGTXT,
PRCTR TYPE BSEG-PRCTR,
END OF TY_BSEG.

TYPES: BEGIN OF TY_DATOS,
BUKRS TYPE BKPF-BUKRS,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF-GJAHR,
BLDAT TYPE BKPF-BLDAT,
BUDAT TYPE BKPF-BUDAT,
XBLNR TYPE BKPF-XBLNR,
BKTXT TYPE BKPF-BKTXT,
BLART TYPE BKPF-BLART,
SGTXT TYPE BSEG-SGTXT,
PRCTR TYPE BSEG-PRCTR,
END OF TY_DATOS.

DATA:e_layout TYPE lvc_s_layo,
t_fcat TYPE lvc_t_fcat,
fldtext TYPE char50.

DATA: T_DATOS TYPE STANDARD TABLE OF TY_DATOS,
T_BKPF TYPE STANDARD TABLE OF TY_BKPF,
T_BSEG TYPE STANDARD TABLE OF TY_BSEG.

DATA: WA_BKPF TYPE TY_BKPF,
WA_BSEG TYPE TY_BSEG,
WA_DATOS TYPE TY_DATOS.

" FILTROS DE BUSQUEDA DE CAMPOS
SELECT-OPTIONS:
S_BELNR FOR BKPF-BELNR,
S_BLDAT FOR BKPF-BLDAT,
S_GJAHR FOR BKPF-GJAHR,
S_BUDAT FOR BKPF-BUDAT,
S_XBLNR FOR BKPF-XBLNR,
S_BLART FOR BKPF-BLART.
PARAMETERS:
P_BUKRS LIKE BKPF-BUKRS OBLIGATORY.
*&--------------------------------------------------------------------*
START-OF-SELECTION."Ejecuta sub-rutinas
PERFORM PIDE_DATOS. "Sub-rutina paso 1
PERFORM REPORTE_ALV."Sub-rutina paso 2
*&--------------------------------------------------------------------*
FORM PIDE_DATOS.
SELECT BUKRS BELNR GJAHR BLDAT BUDAT XBLNR BKTXT BLART
FROM BKPF INTO TABLE T_BKPF
WHERE BUKRS EQ P_BUKRS
AND BELNR IN S_BELNR
AND GJAHR IN S_GJAHR.

IF T_BKPF[] IS NOT INITIAL.

SELECT BUKRS BELNR GJAHR SGTXT PRCTR
FROM BSEG INTO TABLE T_BSEG
FOR ALL ENTRIES IN T_BKPF
WHERE BUKRS EQ T_BKPF-BUKRS
AND BELNR EQ T_BKPF-BELNR
AND GJAHR EQ T_BKPF-GJAHR.
ENDIF.

LOOP AT T_BKPF INTO WA_BKPF.

WA_DATOS-BUKRS = WA_BKPF-BUKRS.
WA_DATOS-BELNR = WA_BKPF-BELNR.
WA_DATOS-GJAHR = WA_BKPF-GJAHR.
WA_DATOS-XBLNR = WA_BKPF-XBLNR.
WA_DATOS-BKTXT = WA_BKPF-BKTXT.
WA_DATOS-BLART = WA_BKPF-BLART.
WA_DATOS-BUDAT = WA_BKPF-BUDAT.
WA_DATOS-BLDAT = WA_BKPF-BLDAT.

READ TABLE T_BKPF INTO WA_BKPF
WITH KEY BUKRS = WA_BKPF-BUKRS
BELNR = WA_BKPF-BELNR
GJAHR = WA_BKPF-GJAHR.

IF SY-SUBRC EQ 0.
WA_DATOS-SGTXT = WA_BSEG-SGTXT.
WA_DATOS-PRCTR = WA_BSEG-PRCTR.
ENDIF.

APPEND WA_DATOS TO T_DATOS.
CLEAR WA_DATOS.
ENDLOOP.

ENDFORM.
*&--------------------------------------------------------------------*
*REPORTE_ALV.- "SUBRUTINA" (SI AHI DATOS EMPIEZA)SI HAY DATOS,CARGA LOS DATOS Y EL CATALOGO.
*SI NO(NO PRESENTA DATOS)
*&--------------------------------------------------------------------*
FORM REPORTE_ALV.
CHECK NOT T_DATOS[] IS INITIAL." REVISA SI REALMENTE AHI DATOS EN (TAB.INT.) T_DATOS
PERFORM catalogo_fcat.
e_layout-zebra = 'X'.
e_layout-sel_mode = 'D'.
e_layout-no_rowmove = 'X'.
e_layout-col_opt = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' "LLAMADO DE FUNCION ALV.
EXPORTING
i_callback_program = sy-repid
i_callback_html_top_of_page = 'MY_HTML_TOP_PAGE'
is_layout_lvc = e_layout
it_fieldcat_lvc = t_fcat
TABLES
t_outtab = T_DATOS
EXCEPTIONS
program_error = 1.

IF SY-TCODE ='ZCONSULTA_DOCFI'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
* CATALOGO.- COLOCA LAS CABECERAS DEL ALV
*&---------------------------------------------------------------------*
FORM catalogo_fcat.
PERFORM agrega_campos USING:
'BUKRS' 'BUKRS' 'BKPF' space space,
'BELNR' 'BELNR' 'BKPF' space space,
'GJAHR' 'GJAHR' 'BKPF' space space,
'BLDAT' 'BLDAT' 'BKPF' space space,
'BUDAT' 'BUDAT' 'BKPF' space space,
'XBLNR' 'XBLNR' 'BKPF' space space,
'BKTXT' 'BKTXT' 'BKPF' space space,
'BLART' 'BLART' 'BKPF' space space,
'SGTXT' 'SGTXT' 'BSEG' space space,
'PRCTR' 'PRCTR' 'BSEG' space space.
ENDFORM. " CATALOGO_FCAT
*&---------------------------------------------------------------------*
* AGREGA CAMPOS
*&---------------------------------------------------------------------*
FORM agrega_campos USING
value(p1) value(p2) value(p3) value(p4) value(p5).
DATA l_fcat TYPE lvc_s_fcat.
l_fcat-fieldname = p1.
l_fcat-ref_field = p2.
l_fcat-ref_table = p3.
l_fcat-coltext = p4.
l_fcat-inttype = p5.
l_fcat-col_opt = 'X'.
IF p5 NE space.
l_fcat-intlen = 20.
l_fcat-decimals = 2.
l_fcat-decimals_o = 2.
ENDIF.
APPEND l_fcat TO t_fcat.
ENDFORM. " finliza agrega_campos
*&---------------------------------------------------------------------*
*&Form MY_USER_COMMAND
*&---------------------------------------------------------------------*
FORM my_user_command USING p_ucomm TYPE sy-ucomm
p_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'REGR' OR 'SALI'.
p_selfield-exit = abap_true.
ENDCASE.

ENDFORM. " MY_USER_COMMAND
*-----------------------------------------------------------------------*:confused: :confused: :confused:


Husos Horarios son GMT. La hora en este momento es 21:37:48.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web