certo le partite aperte aiutano ad analizzare la situazione contabile
ma se si è appena partiti con il sistema SAP, come fa l'utente a riconosce a chi appartiene la partita?
sul vecchio sistema era abituato ai codici del vecchio sistema, ma su SAP no.
un aiutino bisogna darglielo all'utente, quindi perchè non aggiungere il nome fornitore, cliente e conto co.ge. alla lista delle parite?
il nome aiuta anche a fare dei subtotali decenti
per le fatture da ricevere non ne parliamo: che bello avere la lista con i subtotali per nome fornitore, numero ordine di acquisto e posizione di acquisto

estendere il report è semplice. La nota oss 368310 lo spiega
un paio di miei appunti alla nota:
e ora un po' di codice
ecco il mio, che prende in considerazione anche il consignment stock
FUNCTION zzfi_lineitem_00001650.
*"----------------------------------------------------------------------
*"*"Interfaccia locale:
*" IMPORTING
*" VALUE(I_POSTAB) LIKE RFPOS STRUCTURE RFPOS
*" EXPORTING
*" VALUE(E_POSTAB) LIKE RFPOS STRUCTURE RFPOS
*"----------------------------------------------------------------------
*-------------- Initialize Output by using the following line ----------
e_postab = i_postab.
CASE i_postab-koart.
WHEN 'K'.
READ TABLE t_lfa1 WITH KEY lifnr = i_postab-konto.
IF sy-subrc = 0.
e_postab-zzname1 = t_lfa1-name1.
ELSE.
SELECT SINGLE name1 INTO e_postab-zzname1 FROM lfa1
WHERE lifnr = i_postab-konto.
t_lfa1-name1 = e_postab-zzname1.
t_lfa1-lifnr = i_postab-konto.
APPEND t_lfa1.
CLEAR t_lfa1.
ENDIF.
WHEN 'D'.
READ TABLE t_kna1 WITH KEY kunnr = i_postab-konto.
IF sy-subrc = 0.
e_postab-zzname1 = t_kna1-name1.
ELSE.
SELECT SINGLE name1 INTO e_postab-zzname1 FROM kna1
WHERE kunnr = i_postab-konto.
t_kna1-name1 = e_postab-zzname1.
t_kna1-kunnr = i_postab-konto.
APPEND t_kna1.
CLEAR t_kna1.
ENDIF.
WHEN 'S'.
READ TABLE t_skat WITH KEY saknr = i_postab-konto.
IF sy-subrc = 0.
e_postab-zzname1 = t_skat-txt50.
ELSE.
SELECT SINGLE txt20 INTO e_postab-zzname1 FROM skat
WHERE saknr = i_postab-konto
AND spras = sy-langu.
t_skat-txt50 = e_postab-zzname1.
t_skat-saknr = i_postab-konto.
APPEND t_skat.
CLEAR t_skat.
ENDIF.
* preparo i conti EM/EF
IF r_compensazione_em_ef[] IS INITIAL.
SELECT t030~konth INTO r_compensazione_em_ef-low
FROM t030 INNER JOIN t001 ON t030~ktopl = t001~ktopl
WHERE t030~ktosl = 'WRX'
AND t001~bukrs = i_postab-bukrs.
r_compensazione_em_ef-sign = 'I'.
r_compensazione_em_ef-option = 'EQ'.
APPEND r_compensazione_em_ef.
ENDSELECT.
ENDIF.
* se conto EM/EF estraggo dal documento contabile l'oda e poi ricavo il fornitore
IF i_postab-konto IN r_compensazione_em_ef.
SELECT SINGLE lfa1~name1 lfa1~lifnr
INTO ( e_postab-zznamepartner, e_postab-zzpartner )
FROM lfa1
INNER JOIN ekko ON lfa1~lifnr = ekko~lifnr
INNER JOIN bseg ON ekko~ebeln = bseg~ebeln
WHERE bseg~belnr = i_postab-belnr
AND bseg~buzei = i_postab-buzei.
IF e_postab-zzpartner IS INITIAL.
* Il documento può essere di consignmet stock
* recupero il fornitore dal movimento magazzino
DATA: _awtyp TYPE awtyp,
_awkey TYPE awkey,
BEGIN OF _doc_mat,
mblnr TYPE mblnr,
mjahr TYPE mjahr,
END OF _doc_mat
.
SELECT SINGLE awtyp awkey INTO ( _awtyp, _awkey )
FROM bkpf WHERE bukrs = i_postab-bukrs
AND belnr = i_postab-belnr
AND gjahr = i_postab-gjahr.
IF sy-subrc = 0 AND _awtyp = 'MKPF'. "movimento magazzino
_doc_mat = _awkey.
SELECT SINGLE lfa1~name1 lfa1~lifnr
INTO ( e_postab-zznamepartner, e_postab-zzpartner )
FROM lfa1
INNER JOIN mseg ON lfa1~lifnr = mseg~lifnr
WHERE mseg~mblnr = _doc_mat-mblnr
AND mseg~mjahr = _doc_mat-mjahr
AND mseg~zeile = '0001'.
ENDIF.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
FUNCTION-POOL zfilineitems. "MESSAGE-ID ..
DATA: BEGIN OF t_lfa1 OCCURS 1000,
lifnr TYPE lifnr,
name1 TYPE name1,
END OF t_lfa1.
DATA: BEGIN OF t_kna1 OCCURS 1000,
kunnr TYPE kunnr,
name1 TYPE name1,
END OF t_kna1.
DATA: BEGIN OF t_skat OCCURS 1000,
saknr TYPE kunnr,
txt50 TYPE name1,
END OF t_skat.
RANGES r_compensazione_em_ef FOR T030-KONTH.
* INCLUDE LZFILINEITEMSD... " Local class definition
FUNCTION-POOL zfilineitems. "MESSAGE-ID ..
DATA: BEGIN OF t_lfa1 OCCURS 1000,
lifnr TYPE lifnr,
name1 TYPE name1,
END OF t_lfa1.
DATA: BEGIN OF t_kna1 OCCURS 1000,
kunnr TYPE kunnr,
name1 TYPE name1,
END OF t_kna1.
DATA: BEGIN OF t_skat OCCURS 1000,
saknr TYPE kunnr,
txt50 TYPE name1,
END OF t_skat.
RANGES r_compensazione_em_ef FOR T030-KONTH.
* INCLUDE LZFILINEITEMSD... " Local class definition
un paio di appunti al codice
ma se si è appena partiti con il sistema SAP, come fa l'utente a riconosce a chi appartiene la partita?
sul vecchio sistema era abituato ai codici del vecchio sistema, ma su SAP no.
un aiutino bisogna darglielo all'utente, quindi perchè non aggiungere il nome fornitore, cliente e conto co.ge. alla lista delle parite?
il nome aiuta anche a fare dei subtotali decenti
per le fatture da ricevere non ne parliamo: che bello avere la lista con i subtotali per nome fornitore, numero ordine di acquisto e posizione di acquisto

estendere il report è semplice. La nota oss 368310 lo spiega
un paio di miei appunti alla nota:
- è necessario estendere sia la struttura RFPOS che RFPOSX con gli stessi campi, o il nome della stessa struttura append
- in BTE il function module è da aggiungere agli eventi, però attenzione che non troveri l'inserimento 00001650, quindi lo dovrai aggiungere come nuovo
e ora un po' di codice
ecco il mio, che prende in considerazione anche il consignment stock
FUNCTION zzfi_lineitem_00001650.
*"----------------------------------------------------------------------
*"*"Interfaccia locale:
*" IMPORTING
*" VALUE(I_POSTAB) LIKE RFPOS STRUCTURE RFPOS
*" EXPORTING
*" VALUE(E_POSTAB) LIKE RFPOS STRUCTURE RFPOS
*"----------------------------------------------------------------------
*-------------- Initialize Output by using the following line ----------
e_postab = i_postab.
CASE i_postab-koart.
WHEN 'K'.
READ TABLE t_lfa1 WITH KEY lifnr = i_postab-konto.
IF sy-subrc = 0.
e_postab-zzname1 = t_lfa1-name1.
ELSE.
SELECT SINGLE name1 INTO e_postab-zzname1 FROM lfa1
WHERE lifnr = i_postab-konto.
t_lfa1-name1 = e_postab-zzname1.
t_lfa1-lifnr = i_postab-konto.
APPEND t_lfa1.
CLEAR t_lfa1.
ENDIF.
WHEN 'D'.
READ TABLE t_kna1 WITH KEY kunnr = i_postab-konto.
IF sy-subrc = 0.
e_postab-zzname1 = t_kna1-name1.
ELSE.
SELECT SINGLE name1 INTO e_postab-zzname1 FROM kna1
WHERE kunnr = i_postab-konto.
t_kna1-name1 = e_postab-zzname1.
t_kna1-kunnr = i_postab-konto.
APPEND t_kna1.
CLEAR t_kna1.
ENDIF.
WHEN 'S'.
READ TABLE t_skat WITH KEY saknr = i_postab-konto.
IF sy-subrc = 0.
e_postab-zzname1 = t_skat-txt50.
ELSE.
SELECT SINGLE txt20 INTO e_postab-zzname1 FROM skat
WHERE saknr = i_postab-konto
AND spras = sy-langu.
t_skat-txt50 = e_postab-zzname1.
t_skat-saknr = i_postab-konto.
APPEND t_skat.
CLEAR t_skat.
ENDIF.
* preparo i conti EM/EF
IF r_compensazione_em_ef[] IS INITIAL.
SELECT t030~konth INTO r_compensazione_em_ef-low
FROM t030 INNER JOIN t001 ON t030~ktopl = t001~ktopl
WHERE t030~ktosl = 'WRX'
AND t001~bukrs = i_postab-bukrs.
r_compensazione_em_ef-sign = 'I'.
r_compensazione_em_ef-option = 'EQ'.
APPEND r_compensazione_em_ef.
ENDSELECT.
ENDIF.
* se conto EM/EF estraggo dal documento contabile l'oda e poi ricavo il fornitore
IF i_postab-konto IN r_compensazione_em_ef.
SELECT SINGLE lfa1~name1 lfa1~lifnr
INTO ( e_postab-zznamepartner, e_postab-zzpartner )
FROM lfa1
INNER JOIN ekko ON lfa1~lifnr = ekko~lifnr
INNER JOIN bseg ON ekko~ebeln = bseg~ebeln
WHERE bseg~belnr = i_postab-belnr
AND bseg~buzei = i_postab-buzei.
IF e_postab-zzpartner IS INITIAL.
* Il documento può essere di consignmet stock
* recupero il fornitore dal movimento magazzino
DATA: _awtyp TYPE awtyp,
_awkey TYPE awkey,
BEGIN OF _doc_mat,
mblnr TYPE mblnr,
mjahr TYPE mjahr,
END OF _doc_mat
.
SELECT SINGLE awtyp awkey INTO ( _awtyp, _awkey )
FROM bkpf WHERE bukrs = i_postab-bukrs
AND belnr = i_postab-belnr
AND gjahr = i_postab-gjahr.
IF sy-subrc = 0 AND _awtyp = 'MKPF'. "movimento magazzino
_doc_mat = _awkey.
SELECT SINGLE lfa1~name1 lfa1~lifnr
INTO ( e_postab-zznamepartner, e_postab-zzpartner )
FROM lfa1
INNER JOIN mseg ON lfa1~lifnr = mseg~lifnr
WHERE mseg~mblnr = _doc_mat-mblnr
AND mseg~mjahr = _doc_mat-mjahr
AND mseg~zeile = '0001'.
ENDIF.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFUNCTION.
** top include del function function group
FUNCTION-POOL zfilineitems. "MESSAGE-ID ..
DATA: BEGIN OF t_lfa1 OCCURS 1000,
lifnr TYPE lifnr,
name1 TYPE name1,
END OF t_lfa1.
DATA: BEGIN OF t_kna1 OCCURS 1000,
kunnr TYPE kunnr,
name1 TYPE name1,
END OF t_kna1.
DATA: BEGIN OF t_skat OCCURS 1000,
saknr TYPE kunnr,
txt50 TYPE name1,
END OF t_skat.
RANGES r_compensazione_em_ef FOR T030-KONTH.
* INCLUDE LZFILINEITEMSD... " Local class definition
FUNCTION-POOL zfilineitems. "MESSAGE-ID ..
DATA: BEGIN OF t_lfa1 OCCURS 1000,
lifnr TYPE lifnr,
name1 TYPE name1,
END OF t_lfa1.
DATA: BEGIN OF t_kna1 OCCURS 1000,
kunnr TYPE kunnr,
name1 TYPE name1,
END OF t_kna1.
DATA: BEGIN OF t_skat OCCURS 1000,
saknr TYPE kunnr,
txt50 TYPE name1,
END OF t_skat.
RANGES r_compensazione_em_ef FOR T030-KONTH.
* INCLUDE LZFILINEITEMSD... " Local class definition
estendere la visualizzazione delle partite non è una roba da poco perchè può comportare l'allungamento dell'elaborazione
ma, siccome tu sai che il function group quando viene "istanziato" mantiene i dati delle tabelle interne in memoria se le tabelle sono definite nel top include, puoi usle are questa caratteristica per crearti un buffer momentaneo per evitare delle continue letture in db
infine le join.... usale, usale, usale
sviluppando anche applicazioni web in altri linguaggi, l'sql ormai lo mastico come se fosse un tenero filetto :P.
le join riducono i tempi di lettura ed elaborazione. lascia fare al db il suo lavoro.
Commenti
Posta un commento