Ayuda SAP

TUNEAME el código XD :)

Hola que tal, como lo había comentado. En otro post. Las buenas practicas de programación ABAP ignoro.
esto me servirá para ir aprendiendo las mejores practicas ABAP.

Así que el reporte que me ayudaron a hacer funciona pero no se si la forma de hacerlo fue la mas ortodoxa.

El asunto: El tipo que captura las facturas no sabe cuando un proveedor mañoso le dará la misma factura de fletes mas de una vez y el muy wey la capture, PIOR aun el de CXP también le pase MIRO.

El bombero: Un reporte que basado en los textos cabecera de la ME21N, donde se captura la referencia de la factura del fletista. Muestre si ya hay algún documento asociado a esa referencia.

El formato:

SOLICITUD DE COMPRA | REFERENCIA DE LA FACTURA | SALIDA DE EMBARQUES | FECHA FACTURA | NOMBRE DEL PROVEEDOR DE FLETES | FACTURA DE CXP | IMPORTE | MONEDA | IDENTIFICADOR DE DUPLICIDAD DE REFERENCAS |

El bosquejo:

EKKO | BSIK | VFKP | EKKO | LFA1 | BSIK | BSIK | EKKO
EBELN | ZUONR | REBEL | AEDAT | NAME1 | BELNR | WRBTR | WAERS

En algunos casos uso BSAK y sus correspondientes.

El código:

Aclaro que uso ZTB_TXTOCOM porque me sirve para otro reporte pero de BI. Por el momento se vacía cada vez que corren el reporte pero después haré otra cosa con esa tabla.

PURA COSA FEA!!! :frowning:

REPORT ZFLETES3.



TABLES: ekko.
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS s_fecha FOR ekko-aedat.
SELECTION-SCREEN: END OF BLOCK a1.

data:    lt_line TYPE STANDARD TABLE OF tline WITH HEADER LINE,
         line TYPE STANDARD TABLE OF tline WITH HEADER LINE,
         l_langu TYPE thead-tdspras,
         l_doc   TYPE tdobname,
         tdlinetxt type string,
         thead(50) type c,
         uno(20) TYPE C,
         dos(20) TYPE C,
         tres(20) TYPE C,
         cuatro(20) TYPE C,
         cinco(20) TYPE C,
         seis(20) TYPE C,
         siete(20) TYPE C,
         ocho(20) TYPE C,
         nueve(20) TYPE C,
         diez(20) TYPE C,
         once(20) TYPE C,
         doce(20) TYPE C,
         trece(20) TYPE C,
         catorce(20) TYPE C,
         quince(20) TYPE C,
         diesiseis(20) TYPE C,
         v_total type p decimals 2,
         iva type p decimals 2
         .

data: begin of gt_ca occurs 0,
ocpedido type EKKO-EBELN,
fecha type EKKO-AEDAT,
moneda type EKKO-WAERS,
provid type EKKO-LIFNR,
nombre type LFA1-NAME1,
tipo type EKKO-BSART,
statu type EKKO-STATU,
end of gt_ca.

data: begin of gt_vfk occurs 0,
embarque type VFKP-REBEL,
subtotal type VFKP-NETWR,
iva type VFKP-MWSBP,
total type VFKP-NETWR,
end of gt_vfk.

data: begin of gt_ekp occurs 0,
ocpedido  type EKBE-EBELN,
indicadoriva type EKBE-MWSKZ,
subtotal  type EKBE-WRBTR,
factura type EKBE-BELNR,
end of gt_ekp.

data: begin of gt_sik occurs 0,
referencia type BSIK-ZUONR,
factura type BSIK-BELNR,
importe type BSIK-WRBTR,
"subt type BSIK-SKFBT,
end of gt_sik.

data: begin of gt_sak occurs 0,
referencia type BSAK-ZUONR,
factura type BSAK-BELNR,
importe type BSAK-WRBTR,
"subt type BSIK-SKFBT,
end of gt_sak.

data: begin of gt_fin occurs 0,
ocpedido1 type EKKO-EBELN,
referencia1 type BSIK-ZUONR,
embarque1 type VFKP-REBEL,
fecha1 type EKKO-AEDAT,
nombre1 type LFA1-NAME1,
factura1 type BSIK-BELNR,
importe1 type BSIK-WRBTR,
moneda1 type EKKO-WAERS,
texto(70) TYPE C,
duplicado(10) TYPE C,
acumulador type BSIK-WRBTR,
end of gt_fin.

DATA :gt_cat TYPE slis_t_fieldcat_alv,
gs_cat LIKE LINE OF gt_cat.

DATA: pos type i value 1.  "Codigo agregado

START-OF-SELECTION.

  PERFORM zte_seleccion1.    "Codigo agregado
  perform zte_alv1.

*&---------------------------------------------------------------------
*& Form ZTE_SELECCION1
*&---------------------------------------------------------------------
* text
*----------------------------------------------------------------------
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------
FORM ZTE_SELECCION1.
  delete from ZTB_TXTOCOM.
  "message 'select' type 'I' .
  select a~EBELN a~AEDAT a~WAERS a~LIFNR d~NAME1 a~BSART a~STATU from EKKO as a
  join LFA1 as d ON a~LIFNR EQ d~LIFNR
  into table gt_ca
  where AEDAT IN s_fecha AND a~BSART = 'ZLIQ'. "a~AEDAT BETWEEN '20100101' AND '20160101'.
  REfresh gt_fin.
  if sy-subrc EQ 0.
    "message 'select2' type 'I' .
    LOOP at gt_ca.
      "clear gt_fin.
      at first.                               " Codigo agregado
        "message 'select3' type 'I' .
      endat.


      if gt_ca-statu EQ 'X'.   "FLETES PT"
      CLEAR gt_vfk.
      select B~REBEL B~NETWR B~MWSBP B~BASWR from VFKP as B into table gt_vfk
      where B~EBELN EQ gt_ca-ocpedido. "B~TDLNR EQ gt_ca-provid and
      gt_fin-acumulador =  0.
      if sy-subrc EQ 0.
        LOOP at gt_vfk.
          gt_fin-acumulador = gt_fin-acumulador + gt_vfk-subtotal + gt_vfk-iva.
          gt_fin-embarque1 = gt_vfk-embarque.
        ENDLOOP.
      endif.
      else.
                          "FLETES MP Y GASTOS"
        CLEAR gt_ekp. iva = '0.16'.
        select B~EBELN B~MWSKZ B~WRBTR B~BELNR from EKBE as B into table gt_ekp
        where B~BEWTP EQ 'Q' AND B~EBELN EQ gt_ca-ocpedido.
        gt_fin-acumulador =  0.
        if sy-subrc EQ 0.
          LOOP at gt_ekp.
             if gt_ekp-indicadoriva EQ 'W4'.
               gt_fin-acumulador = gt_fin-acumulador + gt_ekp-subtotal + ( gt_ekp-subtotal * iva ) .
             else.
               gt_fin-acumulador = gt_fin-acumulador + gt_ekp-subtotal.
             endif.
            "gt_fin-acumulador = gt_fin-acumulador + gt_vfk-subtotal + gt_vfk-iva.
            "gt_fin-embarque1 = gt_vfk-embarque.
          ENDLOOP.
        endif.
        gt_fin-embarque1 = gt_ca-ocpedido.

      endif.



        CLEAR gt_sik. CLEAR gt_sak.
        select c~ZUONR c~BELNR c~WRBTR from BSIK as c into table gt_sik
        where c~SKFBT EQ gt_fin-acumulador AND c~SHKZG EQ 'H' and c~BLART EQ 'RE' and c~LIFNR EQ gt_ca-provid.
        if sy-subrc EQ 0.
          LOOP at gt_sik.
            gt_fin-referencia1 = gt_sik-referencia.
            gt_fin-factura1 = gt_sik-factura.
            gt_fin-importe1 = gt_sik-importe.
          ENDLOOP.
        ELSE.
          select c~ZUONR c~BELNR c~WRBTR from BSAK as c into table gt_sak
          where c~SKFBT EQ gt_fin-acumulador AND c~SHKZG EQ 'H' and c~BLART EQ 'RE' AND c~LIFNR EQ gt_ca-provid.
          if sy-subrc EQ 0.
            LOOP at gt_sak.
              gt_fin-referencia1 = gt_sak-referencia.
              gt_fin-factura1 = gt_sak-factura.
              gt_fin-importe1 = gt_sak-importe.
            ENDLOOP.
          endif.
        endif.




      gt_fin-ocpedido1 = gt_ca-ocpedido.
      gt_fin-fecha1 = gt_ca-fecha.
      gt_fin-nombre1 = gt_ca-nombre.
      gt_fin-moneda1 = gt_ca-moneda.


*&---------------------------------------------------------------------*


      REFRESH lt_line.
      CLEAR l_doc.
*      CONCATENATE gt_ca-TMATNR gt_fin-TWERKS gt_fin-TVTWEG INTO l_doc RESPECTING BLANKS.
      l_doc  = gt_ca-ocpedido. "'4500000124'.
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          id                      = 'F01'
          language                = 'S'
          name                    = l_doc
          object                  = 'EKKO'
        TABLES
          lines                   = lt_line
        EXCEPTIONS
          id                      = 1
          language                = 2
          name                    = 3
          not_found               = 4
          object                  = 5
          reference_check         = 6
          wrong_access_to_archive = 7
          OTHERS                  = 8.

      CLEAR tdlinetxt.
      IF sy-subrc EQ 0.
        READ TABLE lt_line INTO line INDEX 1.
        LOOP AT lt_line INTO line.
          CONCATENATE tdlinetxt line-tdline
          INTO tdlinetxt SEPARATED BY space.
          "write: 'OK',tdlinetxt .
        ENDLOOP.
        "else.
        "MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
        "WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      gt_fin-texto = tdlinetxt.
      "write: / 'OK',gt_ca-REFERENCIA , gt_ca-TIPO , gt_ca-ESTATU , gt_ca-TEXTO  .
      "INSERT INTO ZTB_TXTOCOM VALUES gt_ca. "APPEND gt_fin.
      "MODIFY gt_ca2 FROM gt_ca.
      "write: 'ok',gt_fin.

*&---------------------------------------------------------------------*


      "write: / 'DATOS ',gt_fin-ocpedido1 ,gt_fin-referencia1 ,gt_fin-embarque1,gt_fin-fecha1 ,gt_fin-nombre1 ,gt_fin-factura1 ,gt_fin-importe1,gt_fin-moneda1.
      APPEND gt_fin. "inserta en la tabla




      data: gt_cd type table of ZTB_TXTOCOM with header line,
            gt_dp type table of ZTB_TXTOCOM with header line.
      data: begin of gt_dp2 occurs 0,
            REFERENCIA type ZTB_TXTOCOM-REFERENCIA,
            end of gt_dp2.


      SPLIT gt_fin-texto AT ',' INTO uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince diesiseis.
      "write: / 'split ',uno ,dos , tres, cuatro, cinco, seis, siete, ocho, nueve, diez, once, doce, trece, catorce, quince, diesiseis.

      if uno NE ''.
        CLEAR   gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = uno. CLEAR gt_dp. select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = uno.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if dos NE ''.
        CLEAR   gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = dos. CLEAR gt_dp. select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = dos.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if tres NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = tres. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = tres.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if cuatro NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu.gt_cd-TEXTO = cuatro. CLEAR gt_dp. select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = cuatro.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if cinco NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = cinco. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = cinco.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if seis NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = seis. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = seis.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if siete NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = siete.CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = siete.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if ocho NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = ocho. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = ocho.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if nueve NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = nueve.CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = nueve.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if diez NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = diez. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = diez.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if once NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = once. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = once.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if doce NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = doce. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = doce.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if trece NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = trece.CLEAR gt_dp. select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = trece.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if catorce NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = catorce.CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = catorce.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if quince NE ''.
        CLEAR  gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = quince. CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = quince.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.
      if diesiseis NE ''.
        CLEAR gt_cd. gt_cd-REFERENCIA = gt_ca-ocpedido. gt_cd-TIPO = gt_ca-tipo. gt_cd-TIPO = gt_ca-statu. gt_cd-TEXTO = diesiseis.CLEAR gt_dp.select * FROM ZTB_TXTOCOM INTO table gt_dp where TEXTO = diesiseis.
        if sy-subrc EQ 0.
          gt_cd-DUPLICS ='Duplicado'. LOOP at gt_dp. update ZTB_TXTOCOM set DUPLICS ='Duplicado' where REFERENCIA = gt_dp-REFERENCIA. ENDLOOP.
        endif.
        APPEND gt_cd. INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
      endif.


*      DO contador TIMES.
*      CLEAR gt_cd.
*      APPEND gt_cd.
*      INSERT INTO ZTB_TXTOCOM VALUES gt_cd.
*      ENDDO.

    ENDLOOP.
*&---------------------------------------------------------------------*
    "VERIFICAR DUPLICADOS




    REFRESH gt_dp.
    CLEAR gt_dp.
    select REFERENCIA from ZTB_TXTOCOM into table gt_dp2 where DUPLICS EQ 'Duplicado' GROUP BY REFERENCIA.
    if sy-subrc EQ 0.
      LOOP at gt_dp2.
        READ TABLE gt_fin WITH KEY ocpedido1 = gt_dp2-REFERENCIA.
        IF sy-subrc EQ 0.
          gt_fin-duplicado = 'Duplicado'. MODIFY gt_fin  INDEX  sy-tabix."gt_fin with key gt_dp2-REFERENCIA
          "APPEND gt_fin.
        ENDIF.

      ENDLOOP.
    endif.


*&---------------------------------------------------------------------*


* else.
* write: / 'no '.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  endif.
ENDFORM. " ZTE_SELECCION1

*&---------------------------------------------------------------------
*& Form ZTE_ALV1
*&---------------------------------------------------------------------
* text
*----------------------------------------------------------------------
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------
FORM ZTE_ALV1 .

  CHECK gt_fin IS NOT INITIAL.

  REFRESH gt_cat.

*CLEAR gs_cat.
  gs_cat-fieldname = 'OCPEDIDO1'.
  gs_cat-ref_fieldname ='EBELN'.
  gs_cat-SELTEXT_M  = 'OC'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='EKKO'.
  "gs_cat-emphasize = 'C411'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'REFERENCIA1'.
  gs_cat-ref_fieldname ='ZUONR'.
  gs_cat-SELTEXT_M  = 'REF'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='BSIK'.
  "gs_cat-emphasize = 'C411'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'EMBARQUE1'.
  gs_cat-ref_fieldname ='REBEL'.
  gs_cat-SELTEXT_M  = 'EMB'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='VFKP'.
  "gs_cat-emphasize = 'C411'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

*  CLEAR gs_cat.
  gs_cat-fieldname = 'FECHA1'.
  gs_cat-ref_fieldname ='AEDAT'.
  gs_cat-SELTEXT_M  = 'Fecha_'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='EKKO'.
  "gs_cat-emphasize = 'C601'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'NOMBRE1'.
  gs_cat-ref_fieldname ='NAME1'.
  gs_cat-SELTEXT_M  = 'PROV'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='LFA1'.
  "gs_cat-emphasize = 'C601'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'FACTURA1'.
  gs_cat-ref_fieldname ='BELNR'.
  gs_cat-SELTEXT_M  = 'FAC'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='BSIK'.
  "gs_cat-emphasize = 'C601'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'IMPORTE1'.
  gs_cat-ref_fieldname ='WRBTR'.
  gs_cat-SELTEXT_M  = 'IMP'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='BSIK'.
  "gs_cat-emphasize = 'C601'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

*  CLEAR gs_cat.
  gs_cat-fieldname = 'MONEDA1'.
  gs_cat-ref_fieldname ='WAERS'.
  gs_cat-SELTEXT_M  = 'Moneda_'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='EKKO'.
  "gs_cat-emphasize = 'C600'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'TEXTO'.
  gs_cat-ref_fieldname ='TEXTO'.
  gs_cat-SELTEXT_M  = 'TEXTO'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='ZTB_TXTOCOM'.
  "gs_cat-emphasize = 'C600'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.

  gs_cat-fieldname = 'DUPLICADO'.
  gs_cat-ref_fieldname ='DUPLICS'.
  gs_cat-SELTEXT_M  = 'DUPLICADOS'.
  gs_cat-tabname = 'GT_FIN_'.
  gs_cat-ref_tabname ='ZTB_TXTOCOM'.
  gs_cat-emphasize = 'C601'.
  ADD 1 TO pos.
  gs_cat-col_pos = pos.
  APPEND gs_cat TO gt_cat.



  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "llamado a la tabla de creacion en pantalla
  EXPORTING
  I_CALLBACK_PROGRAM = sy-repid
  IT_FIELDCAT = gt_cat[]
  TABLES
  T_OUTTAB = gt_fin[]
  EXCEPTIONS
  PROGRAM_ERROR = 1
  OTHERS = 2.
ENDFORM.

Mi pana, yo ahorita no tengo como ponerte o corregir algunas cosas directamente de workbench sino con mucho gusto y aqui tambien seguramente entre todos sacaremos buenas cosas, yo te voy a dar algunos consejos que alcanzo a ver:

line TYPE STANDARD TABLE OF tline WITH HEADER LINE – Esto es una practica vieja, funcional pero vieja

Actualmente se trabaja con tablas sin cabecera y se declara una estructura (work area) que no es mas que una estructura del mismo tipo de la tabla.

it_line TYPE  TABLE OF tline,  it = interna table
wa_line type tline.

data: begin of gt_sak occurs 0,
referencia type BSAK-ZUONR,
factura type BSAK-BELNR,
importe type BSAK-WRBTR,
"subt type BSIK-SKFBT,
end of gt_sak.

Esto yo lo haría con un types y luego declaro una tabla del tipo de types que creaste al igual que la estructura

types: begin of ty_gt_sak ,
referencia type BSAK-ZUONR,
factura type BSAK-BELNR,
importe type BSAK-WRBTR,
"subt type BSIK-SKFBT,
end of  ty_gt_sak. 

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

Normalmente cada programa Z tiene en su programa principal, 3 o mas includes

REPORT ZFLETES3.

include REPORT ZFLETES3_top = Declaras todas tus variables.
include REPORT ZFLETES3_e01 = Eventos.
Include REPORT ZFLETES3_ f01 = Subrutinas.

Yo lo uso asi pero la gran mayoria declara primero el include de las subrutinas y luego el de los eventos, ya queda depende de cada programador, yo he revisado y funciona igual…igual si alguien tiene aca alguna observacion o consejo, bienvenido sea !!

LOOP at gt_ca. — Esto es cuando trabajar tablas con cabeceras, es un poco mas lento

loop at gt_ca into wa_ca. = en el wa, se guarda cada registro, tambien te comento que con tablas con cabeceras tienes que estar pendiente porque siempre se va a quedar en la cabecera el ultimo registro del loop y tambien al hacer el update, modificas directo en la tabla.

Es lo que veo yo a simple vista, es mas dificil reconocer las cosas sin el editor del workbench pero espero te sirva de algo !!


Editado; recordar leer cómo formatear código

1 me gusta

yo te voy a dar un concejo de corazon:
-Continua tu aprendizajem, mete la pata y sigue aprendiendo. la presentacion del codigo es lo de menos, tu propia experiencia te hara tomar las mejores practicas, no quiero que estes programando y pensando como podria ser mejor, cuando lo importante es que funcione.

Primero has que funcione, y luego piensa en mejoras, y finalmente en optimizaciones.
Vas bien.

He impartido academia ABAP, asi que por experiencia te digo que sigas resolviendo y no te enfoques tanto en sacar lo mejor a la primera.

5 Me gusta

Soy un tirano de las buenas prácticas de código :smiling_imp:, me molesta mucho encontrarme con código ilegible o que no sigue el standard.

Primero y fundamental: cuando crees variables, tablas,… usa la debida nomenclatura.

uno(20) TYPE C,
dos(20) TYPE C,
tres(20) TYPE C,
...

debería ser (si es local, claro):

lv_uno(20) TYPE C,
lv_dos(20) TYPE C,
lv_tres(20) TYPE C,
...

Cuando tengas que repetir código haz una subrutina. En el perform ZTE_ALV1 estas repitiendo todo el rato el mismo código para rellenar la estructura gs_cat. En vez de eso crea una subrutina (FORM fill_cat_fields por ejemplo) a la que le pases la estructura gs_cat y los textos. Y dentro haz la asignación de valores.

Read table: Cuando tengas que utilizarlo intenta ordenar primero la tabla por los campos clave que vas a utilizar para y utiliza BINARY SEARCH. Con esto en vez de hacer una busqueda secuencia hace una busqueda binaria, que es bastante más rápida.

READ TABLE gt_fin WITH KEY ocpedido1 = gt_dp2-REFERENCIA.

Conviertelo en:

SORT gt_fin BY ocpedido1.
READ TABLE gt_fin BINARY SEARCH WITH KEY ocpedido1 = gt_dp2-REFERENCIA.

Eso sí, asegúrate de que esté ordenada, sino es bastante probable que no encuentre lo que busca.

Otro rato le daré otro repaso al código a ver que encuentro que sea mejorable.
Sigue practicando y mejorando poco a poco, la programación es un proceso de mejora continua; siempre se puede aprender algo nuevo que haga nuestro código más optimo, legible, robusto,…

2 Me gusta

Saludos,

Lamentablemente @smota ota tiene razón, no podrás hacer las cosas bien a la primera pero con previo conocimiento y estudio puedes mejorar mucho aunque te consideres a tí mismo como un junior o novato.

Por si te sirve de algo comparto contigo un documento de ABAP Coding Standards.

ABAP Coding Standards

2 Me gusta

Me agradan todos sus comentarios, los tomare en cuenta, precisamente me enfoque en que funcionara.
Are caso a los expertos que me han orientado en este tema y créanme que me parece interesante, siempre es arriba y adelante, programar es para mi algo natural solo me falta aprender esos puntos especiales en ABAP.

Seguro la voy a regar en algo jaja, ya me verán preguntando jja.

Saludos a todos y gracias por sus sugerencias. No creo que exista otro foro mas chipocles que este.

2 Me gusta

Para eso estaremos por aca, activo y dispuestos a colaborar.
Pase tu tema al limbo, para que este abierto y se pueda siempre realizar mas aporte al mismo.

3 Me gusta