PDA

Ver la Versión Completa : Como Grabar ??


marva300
30/07/09, 17:39:33
Miren son soy nuevo en esto de Abap y me han dicho que agregue un campo a una dympro ya lo hice pero cuando busco una tabla interna para agregarle el campo nuevo no lo veo no entiendo el codigo de grabar el cual es este

FORM grabar .

DATA: l_lin(6) TYPE n,
l_cont(6) TYPE n,
l_budat TYPE d,
l_bldat TYPE d,
l_erfmg(15) TYPE c.
CLEAR: it_messtab, it_bdc_tab, l_budat, l_bldat.
REFRESH: it_messtab, it_bdc_tab.

DESCRIBE TABLE it_detalle LINES l_lin.

CONCATENATE g_budat+6(2) g_budat+4(2) g_budat(4) INTO l_budat.
CONCATENATE g_bldat+6(2) g_bldat+4(2) g_bldat(4) INTO l_bldat.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '0300',
' ' 'BDC_OKCODE' '=NFPL',
' ' 'MKPF-BLDAT' l_bldat,
' ' 'MKPF-BUDAT' l_budat,
' ' 'RM07M-BWARTWE' '101',
' ' 'XFULL' 'X',
' ' 'RM07M-XNAPR' 'X',
' ' 'RM07M-WVERS2' 'X',
' ' 'RM07M-XNUVO' 'X'.
* ' ' 'RM07M-AUFNR' g_aufnr.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '1301',
' ' 'BDC_OKCODE' '=SP',
' ' 'RM07M-BWARTWE' '101',
' ' 'RM07M-AUFNR(01)' g_aufnr,
' ' 'RM07M-AUFPS(01)' '0001'.


g_repid = sy-repid.
EXPORT g_repid TO MEMORY ID 'G_REPID_ID'. "'g_repid_id'.
EXPORT g_nrop TO MEMORY ID 'G_NROP_ID'. "'g_nrop_id'.
EXPORT g_nroc TO MEMORY ID 'G_NROC_ID'. "'g_nroc_id'.
EXPORT it_detalle TO MEMORY ID 'IT_TABLA'. "'it_tabla'.
EXPORT g_tipo TO MEMORY ID 'G_TIPO_ID'. "'g_tipo_id'.
LOOP AT it_detalle INTO w_detalle.

l_cont = l_cont + 1.

l_erfmg = w_detalle-erfmg.
CONDENSE l_erfmg.

IF l_cont EQ l_lin.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '0310',
' ' 'BDC_OKCODE' '=SEUB',
' ' 'MSEG-ERFMG' l_erfmg,
* ' ' 'MSEG-ERFME' w_detalle-erfme,
' ' 'MSEG-LGORT' g_lgort,
' ' 'MSEG-CHARG' w_detalle-charg,
' ' 'DM07M-HSDAT_INPUT' l_budat.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '0321',
' ' 'BDC_OKCODE' '=BU'.

ELSE.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '0310',
' ' 'BDC_OKCODE' '=SEUB',
' ' 'MSEG-ERFMG' l_erfmg,
* ' ' 'MSEG-ERFME' w_detalle-erfme,
' ' 'MSEG-LGORT' g_lgort,
' ' 'MSEG-CHARG' w_detalle-charg,
' ' 'DM07M-HSDAT_INPUT' l_budat.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '0321',
' ' 'BDC_OKCODE' '=NFPL'.

PERFORM bdc_dynpro USING :
'X' 'SAPMM07M' '1301',
' ' 'BDC_OKCODE' '=SP',
' ' 'RM07M-BWARTWE' '101',
' ' 'RM07M-AUFNR(01)' g_aufnr,
' ' 'RM07M-AUFPS(01)' '0001'.

ENDIF.

ENDLOOP.
* Batch Input CALL TRANSACTION
g_mode = 'N'.
* Llamada a Transaccisn Via Batch Input
CALL TRANSACTION 'MB31' USING it_bdc_tab
MODE g_mode
UPDATE g_update
MESSAGES INTO it_messtab.
* Error Durante Call Transaction
IF sy-subrc EQ 0 .
CLEAR: g_mensaje.
PERFORM g_message_transform USING g_mensaje.
MESSAGE g_mensaje TYPE 'I'.
ELSE.
CLEAR: g_mensaje.
PERFORM g_message_transform USING g_mensaje.
MESSAGE g_mensaje TYPE 'I'.
ENDIF.

ENDFORM.


espero que me puedan ayudar

stormshadow
30/07/09, 20:08:41
ammm ps debe de estar en un include, por eso no vez la definición de la tabla interna, pero igual en esta parte del código: DESCRIBE TABLE it_detalle LINES l_lin. dale doble click a it_detalle y te debe de mandar a la definición de la tabla, ya nadamas agregas lo que necesitas :p

Rodolfo SAP
30/07/09, 21:58:21
Haber compañero yo al igual que tu fui nuevo y pues com me hubiera gustado que alguien me explicara de la misma forma que ahora redacte el funcionamiento de todo el form que pones espero te sirva.

FORM grabar .

DATA: l_lin(6) TYPE n,
l_cont(6) TYPE n,
l_budat TYPE d,
l_bldat TYPE d,
l_erfmg(15) TYPE c.
CLEAR: it_messtab, it_bdc_tab, l_budat, l_bldat.
REFRESH: it_messtab, it_bdc_tab.

*****************1.1
*Este proceso lo que hace es entregarte el número de registros que contiene
*la tabla interna it_detalle en la variable l_lin.
*Ejemplo l_lin = 234 <-donde 234 es el total de registros de it_detalle
DESCRIBE TABLE it_detalle LINES l_lin.

*******************1.2
*Aqui lo que estas haciendo es una conversión de formato por ejemplo SAP
*maneja un formato de fecha interno aaaammmdd esto lo hace en el *almacenamiento si tu vas a algun registro de la se16 el registro se veria
*dd.mm.aaaa cierto pero real e internamente tiene un formato aaaammdd
*entonces es cuando entra en acción ciertas conversiones como esta.
*Ejemplo g_budat = 20090730
*g_budat+6(2) cuenta 6 posiciones y toma 2 que le siguen = 30
*g_budat+4(2) cuenta 4 posiciones y toma 2 que le siguen = 07
*g_budat(2) cuenta 0 posiciones y toma 4 que le siguen = 30
*y todo lo deja en el orden que lo tomo
*l_budat = 30072009.
*Checaste como lo unico que hizo fue mover de orden los valores.
CONCATENATE g_budat+6(2) g_budat+4(2) g_budat(4) INTO l_budat.
CONCATENATE g_bldat+6(2) g_bldat+4(2) g_bldat(4) INTO l_bldat.

*********************1.3
* Esto es código para llenas una tabla interna que se ejecutar para realizar
*un Call Transaction en alguna otra parte debes de tener un FORM llamando
*bdc_dynpro que seguro ira llenado una tabla llamada it_bdc_tab para
*ejecutar el Call Transaction.
PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '0300',
' ' 'BDC_OKCODE' '=NFPL',
' ' 'MKPF-BLDAT' l_bldat,
' ' 'MKPF-BUDAT' l_budat,
' ' 'RM07M-BWARTWE' '101',
' ' 'XFULL' 'X',
' ' 'RM07M-XNAPR' 'X',
' ' 'RM07M-WVERS2' 'X',
' ' 'RM07M-XNUVO' 'X'.

PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '1301',
' ' 'BDC_OKCODE' '=SP',
' ' 'RM07M-BWARTWE' '101',
' ' 'RM07M-AUFNR(01)' g_aufnr,
' ' 'RM07M-AUFPS(01)' '0001'.


g_repid = sy-repid.

***********************1.4
*Esto lo que hace es llevar a una parte en memoria el valor que contenga
*g_repid con un identificador G_REPID_ID ejemplo si
*g_repid = 'SAPLRHAS' ese valor se va memoria y para recogerlo necesitas
*una instruccion IMPORT <nombreid>
EXPORT g_repid TO MEMORY ID 'G_REPID_ID'. "'g_repid_id'.
EXPORT g_nrop TO MEMORY ID 'G_NROP_ID'. "'g_nrop_id'.
EXPORT g_nroc TO MEMORY ID 'G_NROC_ID'. "'g_nroc_id'.
EXPORT it_detalle TO MEMORY ID 'IT_TABLA'. "'it_tabla'.
EXPORT g_tipo TO MEMORY ID 'G_TIPO_ID'. "'g_tipo_id'.

******************1.5
*Aqui empiezas el recorrido de la tabla it_detalle y w_detalle funciona como
*su cabecera haz de cuenta que cuando tiene una tabla interna esta para ir
*recorriendo tiene que ir depositando el registro actual que tiene en una
*area de trabajo.
LOOP AT it_detalle INTO w_detalle.

l_cont = l_cont + 1.

l_erfmg = w_detalle-erfmg.
CONDENSE l_erfmg.

*****************1.6
*Esta parte condiciona el fin de ciclo por ejemplo retomando el 1.1 el valor
*de l_lin es de 234 entonces esta condicion entrara cuando este leyendo el
*registro 234.
IF l_cont EQ l_lin.

***********************1.7
*Aqui lo que estas haciendo es sobre los datos que estas leyendo
*seguir insertando datos a la tabla interna it_bdc_tab para realizer el
*call transaction
PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '0310',
' ' 'BDC_OKCODE' '=SEUB',
' ' 'MSEG-ERFMG' l_erfmg,
' ' 'MSEG-LGORT' g_lgort,
' ' 'MSEG-CHARG' w_detalle-charg,
' ' 'DM07M-HSDAT_INPUT' l_budat.

PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '0321',
' ' 'BDC_OKCODE' '=BU'.

ELSE.

PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '0310',
' ' 'BDC_OKCODE' '=SEUB',
' ' 'MSEG-ERFMG' l_erfmg,
' ' 'MSEG-LGORT' g_lgort,
' ' 'MSEG-CHARG' w_detalle-charg,
' ' 'DM07M-HSDAT_INPUT' l_budat.

PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '0321',
' ' 'BDC_OKCODE' '=NFPL'.

PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '1301',
' ' 'BDC_OKCODE' '=SP',
' ' 'RM07M-BWARTWE' '101',
' ' 'RM07M-AUFNR(01)' g_aufnr,
' ' 'RM07M-AUFPS(01)' '0001'.

ENDIF.
ENDLOOP.

*******************1.8
*Al final de todo realizas el Call Transaction que mmm en pocos terminos
*es una forma automatizada de ejecutar una transaccion osea por ejemplo
*si van a cargar datos osea un usuario estar tecleando no se 100 entradas se
*tardaria mucho a que si se corriera esto de forma automatica pues es mas
*rapido y con menor indice de error.
* Batch Input CALL TRANSACTION
g_mode = 'N'.

**************** 1.9
*Te explico aqui estas corriendo un call a la transaccion MB31 podrias
*decirle a tu funcional que te explique mas como trabaja esta trx.
* Llamada a Transaccisn Via Batch Input
CALL TRANSACTION 'MB31' USING it_bdc_tab
MODE g_mode
UPDATE g_update
MESSAGES INTO it_messtab.
* Error Durante Call Transaction
IF sy-subrc EQ 0 .
CLEAR: g_mensaje.

*******************2.0
*DEspues de ejecutarse todo pudo ver tenido error los cuales se regsitran
*en un log es almacenado en la tabla it_messtab donde te indica que
*tal registro no pudo ser porcesado por x o Y razon.
PERFORM g_message_transform USING g_mensaje.
MESSAGE g_mensaje TYPE 'I'.
ELSE.
CLEAR: g_mensaje.
PERFORM g_message_transform USING g_mensaje.
MESSAGE g_mensaje TYPE 'I'.
ENDIF.

ENDFORM.

Por ultimoy al fina de todo te hago las siguientes observaciones.

* Necesitas conocer mas sobre el funcionamiento de un CALL Transaction.

* Si conoces lo que se llaman grabaciones (SHDB) investiga ya que es lo que tu estas poniendo en la parte de
PERFORM bdc_dynpro USING : 'X' 'SAPMM07M' '1301', lo que esta en comillas sale de esa grabacion checalo.

* Una grabacion la realiza un Funcional pero acercate a el para que veas como la realiza.

* Seguna una trx estandar no puede ser modificada en Dynpros osea no agarras y pintas la cajita de texto asi tan facil a lo mejor lo unico que quieren es que un nuevo campo de la trx sea llenado en el call transaction, en este caso lo que debes hacer es preguntarle al funcional que nuevo campo es llenado y con que valor posiblemente lo unico que tiene que hacer es aumentar el campo en la tabla it_detalle, agregar su logica de busqueda y agregar la llamada al PERFORM bdc_dynpro USING <usando los valores para ese campo>.

Ejempo PERFORM bdc_dynpro USING: ' ' '<CAMPO TRANSACCION>' '<CAMPO TABLA INTERNA it_detalle-new_field>'.

* Si es antes de guardar o algo asi deberas buscar una llamada pero qeu contenga algo asi como
PERFORM bdc_dynpro USING : ' ' 'OK_CODE' '=SAVE' esto es como si oprimieras el botoncito de SAVE pero mediante un call.

Salu2

marva300
11/08/09, 15:00:47
Tengo este codigo que me obtiene el Stock de Materiales en un rango de fechas y cuando lo comparo con la MB5B en algunos casos falla y esto solo en Productivo en desarrollo nunca falla, escribo porque soy nuevo y es una de mis primeras tareas a cargo espero sus prontas respuestas de ayuda en donde creen que puede estar la falla


FORM organizar_datos .

DATA: l_st_lu TYPE mard-labst,
l_st_cc TYPE mard-labst,
l_st_bl TYPE mard-labst,
l_erfme TYPE mseg-erfme.


LOOP AT it_stock INTO w_stock WHERE flag_conv EQ 'X'.
CLEAR w_rep.

CLEAR w_mat.
READ TABLE it_mat INTO w_mat WITH KEY matnr = w_stock-matnr.

* IF NOT p_matkl IS INITIAL AND w_mat-matkl NE p_matkl.
IF NOT w_mat-matkl IN s_matkl.
CONTINUE.
ENDIF.

w_rep-werks = w_stock-werks.
w_rep-lgort = w_stock-lgort.

CLEAR w_cli.
READ TABLE it_cli INTO w_cli WITH KEY kunnr = w_mat-zzcodclient.

w_rep-matkl = w_mat-matkl.
w_rep-sortl = w_cli-sortl.

CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = w_stock-matnr
IMPORTING
output = w_rep-matnr.

w_rep-maktx = w_mat-maktx.

l_erfme = p_erfme.

IF l_erfme IS INITIAL.
l_erfme = w_mat-meins.
ENDIF.

* { Begin of Delete PDA14072008
* CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
* EXPORTING
* input = l_erfme
* IMPORTING
* output = w_rep-meins.
* End of Delete PDA14072008 }

WRITE l_erfme TO w_rep-meins. "I-PDA14072008

CLEAR w_uni.
READ TABLE it_uni INTO w_uni WITH KEY matnr = w_stock-matnr
meinh = l_erfme.
IF sy-subrc EQ 0.
w_rep-factor = w_uni-umrez / w_uni-umren.
ENDIF.

IF p_vislot EQ 'X'.
w_rep-charg = w_stock-charg.
ENDIF.

IF p_datum LT sy-datum.
CLEAR: l_st_lu, l_st_cc, l_st_bl.
* Buscamos los movimientos de mercancias
IF p_vislot EQ 'X'.
LOOP AT it_movcon INTO w_movcon WHERE matnr EQ w_stock-matnr AND
werks EQ w_stock-werks AND
lgort EQ w_stock-lgort AND
charg EQ w_stock-charg AND
flag_conv EQ 'X'.
CASE w_movcon-insmk.
WHEN 'X' OR '2'.
* l_st_cc = l_st_cc + w_movcon-erfmg.
l_st_cc = l_st_cc + w_movcon-menge.
WHEN 'S' OR '3'.
* l_st_bl = l_st_bl + w_movcon-erfmg.
l_st_bl = l_st_bl + w_movcon-menge.
WHEN ' ' OR 'F'.
* l_st_lu = l_st_lu + w_movcon-erfmg.
l_st_lu = l_st_lu + w_movcon-menge.
ENDCASE.
ENDLOOP.

ELSE.
LOOP AT it_movcon INTO w_movcon WHERE matnr EQ w_stock-matnr AND
werks EQ w_stock-werks AND
lgort EQ w_stock-lgort AND
flag_conv EQ 'X'.
CASE w_movcon-insmk.
WHEN 'X' OR '2'.
* l_st_cc = l_st_cc + w_movcon-erfmg.
l_st_cc = l_st_cc + w_movcon-menge.
WHEN 'S' OR '3'.
* l_st_bl = l_st_bl + w_movcon-erfmg.
l_st_bl = l_st_bl + w_movcon-menge.
WHEN ' ' OR 'F'.
* l_st_lu = l_st_lu + w_movcon-erfmg.
l_st_lu = l_st_lu + w_movcon-menge.
ENDCASE.
ENDLOOP.

ENDIF.

IF w_stock-st_lu > 0.

w_rep-st_lu = w_stock-st_lu - l_st_lu.

ENDIF.

IF w_stock-st_cc > 0.

w_rep-st_cc = w_stock-st_cc - l_st_cc.

ENDIF.

IF w_stock-st_bl > 0.

w_rep-st_bl = w_stock-st_bl - l_st_bl.

ENDIF.

w_rep-total = w_rep-st_lu + w_rep-st_cc + w_rep-st_bl.

ELSE.
w_rep-st_lu = w_stock-st_lu.
w_rep-st_cc = w_stock-st_cc.
w_rep-st_bl = w_stock-st_bl.
w_rep-total = w_rep-st_lu + w_rep-st_cc + w_rep-st_bl.
ENDIF.

APPEND w_rep TO it_rep.

ENDLOOP.

IF p_nozero EQ 'X'.
DELETE it_rep WHERE total EQ 0.
ENDIF.
ENDFORM.