Edit_grid--编辑一个grid的步骤和分析(二)

对于tabs,widget/tabs.phtml,

<?php

/**

* Magento

*

* NOTICE OF LICENSE

*

* This source file is subject to the Academic Free License (AFL 3.0)

* that is bundled with this package in the file LICENSE_AFL.txt.

* It is also available through the world-wide-web at this URL:

* http://opensource.org/licenses/afl-3.0.php

* If you did not receive a copy of the license and are unable to

* obtain it through the world-wide-web, please send an email

* to license@magentocommerce.com so we can send you a copy immediately.

*

* DISCLAIMER

*

* Do not edit or add to this file if you wish to upgrade Magento to newer

* versions in the future. If you wish to customize Magento for your

* needs please refer to http://www.magentocommerce.com for more information.

*

* @category design

* @package default_default

* @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)

* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)

*/

?>

<?php if($this->getTitle()): ?>

<h3><?php echo $this->getTitle() ?></h3>

<?php endif ?>

<?php if(!empty($tabs)): ?>

//1

<ul id="<?php echo $this->getId() ?>" class="tabs">

<?php foreach ($tabs as $_tab): ?>

<?php if (!$this->canShowTab($_tab)): continue; endif; ?>

<li <?php if($this->getTabIsHidden($_tab)): ?> style="display:none"<?php endif; ?>>

<a href="<?php echo $this->getTabUrl($_tab) ?>" id="<?php echo $this->getTabId($_tab) ?>" name="<?php echo $this->getTabId($_tab, false) ?>" title="<?php echo $this->getTabTitle($_tab) ?>" class="tab-item-link <?php echo $this->getTabClass($_tab) ?><?php if (preg_match('//s?ajax/s?/', $_tab->getClass())) {?> notloaded<?php }?>">

<span><span class="changed" title="<?php echo $this->__('The information in this tab has been changed.') ?>"></span><span class="error" title="<?php echo $this->__('This tab contains invalid data. Please solve the problem before saving.') ?>"></span><?php echo $this->getTabLabel($_tab); ?></span>

</a>

<div id="<?php echo $this->getTabId($_tab) ?>_content" style="display:none;"><?php echo $this->getTabContent($_tab) ?></div>

</li>

<?php endforeach; ?>

</ul>

/////####

<script type="text/javascript">

<?php echo $this->getJsObjectName() ?> = new varienTabs('

//2

<?php echo $this->getId() ?>',

//3

'<?php echo $this->getDestElementId() ?>',

//4

'<?php echo $this->getActiveTabId() ?>',

//5

<?php echo $this->getAllShadowTabs()?>);

</script>

<?php endif; ?>

这个文件就是tabs显示的文件,分析如下

1$this->getId()方法。

1.1

这个是用来做tabs点击区域的css标示,js就是通过这个id号来进行取得标示,

这个值的设置是在

Profile_Block_Adminhtml_Profile_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs

中,定义

$this->setId('profiles_tabs');

1.2

然后在//1这个位置将ul的id名字设置为$this->getId();,

1.3

然后再js代码段(/////####位置处),的//2将该ID做为参数传入varienTabs()函数中,

2

getDestElementId()

2.1

$this->getDestElementId()

这个是form的ID

在class RichardMason_Profile_Block_Adminhtml_Profile_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs

{$this->setDestElementId('edit_form');

设置destElenentId的值,

2.2

在:RichardMason_Profile_Block_Adminhtml_Profile_Edit_Form extends Mage_Adminhtml_Block_Widget_Form处

$form = new Varien_Data_Form(array('id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post', 'enctype' => 'multipart/form-data'));

$form->setUseContainer(true);

$this->setForm($form);

在构造form的时候将css标示ID写入其中array中的id的值就是edit_form,

2.3

<script type="text/javascript">

<?php echo $this->getJsObjectName() ?> = new varienTabs('

//2

<?php echo $this->getId() ?>',

//3

'<?php echo $this->getDestElementId() ?>',

将其值写入js函数里面。

3

<?php echo $this->getAllShadowTabs()?>);

通过在xml文件中的配置情况,可以加载内嵌的block。

小结:

总体来说,

1.在tabs.PHP文件里面写入,id ,destElementId,的值,通过set()方法。

2.在phtml段,

tabs,是在tabs.phtml文件中,通过get()方法得到值

DestElementId是在Profile_Block_Adminhtml_Profile_Edit_Form,通过方法:

$form = new Varien_Data_Form(array('id' => 'edit_form'直接写入。

form的css标示ID

3.在js段通过get()方法将id,destElementId的值写入js函数 varienTabs()

额外说明:

profile/edit/form.php

profile/edit/tab/main.php

profile/edit/tab/meta.php

使用的前台页面都是widgt/form.php!

public function getFormHtml()

{

if (is_object($this->getForm())) {

return $this->getForm()->getHtml();

}

return '';

}

/**

* Get form object

*

* @return Varien_Data_Form

*/

public function getForm()

{

return $this->_form;

}

在2.2中队form的定义:

$form

故执行:$this->getForm()->getHtml();

public function getHtml()

{

return $this->toHtml();

}

profile/edit/form.php,虽然和main.php,meta.php使用的同一个模板,但是他没有

$fieldset = $form->addFieldset('base_fieldset', array('legend'=>Mage::helper('profile')->__('Content')));

//profile_id

if ($model->getProfileId()) {

$fieldset->addField('profile_id', 'hidden', array(

'name' => 'profile_id',

))

使用这个方法给自己加载attribute,故,他是空的,没有属性集合。

profile/edit/tab/main.php

profile/edit/tab/meta.php

到此为止,grid的编辑部分基本摸清!!!

REPORT zfind_edit_update. TABLES: zmard_copy. DATA: ok_code LIKE sy-ucomm, save_ok LIKE sy-ucomm, g_container TYPE scrfname VALUE 'ALV_CONTAINER', g_grid TYPE REF TO cl_gui_alv_grid, g_custom_container TYPE REF TO cl_gui_custom_container, gs_layout TYPE lvc_s_layo, gt_outtab TYPE TABLE OF zmard_copy, gt_original TYPE TABLE OF zmard_copy. " 用于保存原始数据副本 " 删除选择屏幕定义 *SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN. *SELECTION-SCREEN END OF SCREEN 100. " 直接调用屏幕100 CALL SCREEN 100 STARTING AT 1 1. MODULE pbo OUTPUT. SET PF-STATUS 'MAIN100' EXCLUDING ''. SET TITLEBAR 'MAIN100'. IF g_custom_container IS INITIAL. CREATE OBJECT g_custom_container EXPORTING container_name = g_container. CREATE OBJECT g_grid EXPORTING i_parent = g_custom_container. gs_layout-edit = 'X'. " 启用编辑模式 gs_layout-sel_mode = 'A'. " 允许选择行 SELECT * FROM zmard_copy INTO TABLE gt_outtab UP TO 1000 ROWS. gt_original = gt_outtab. " 保存原始数据副本 CALL METHOD g_grid->set_table_for_first_display EXPORTING i_structure_name = 'zmard_copy' is_layout = gs_layout CHANGING it_outtab = gt_outtab. CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ENDIF. ENDMODULE. MODULE pai INPUT. save_ok = ok_code. CLEAR ok_code. CASE save_ok. WHEN 'EXIT'. LEAVE PROGRAM. WHEN 'SWITCH'. PERFORM switch_edit_mode. WHEN 'SAVE'. " 新增保存按钮处理 PERFORM save_data. ENDCASE. ENDMODULE. FORM switch_edit_mode. IF g_grid->is_ready_for_input( ) EQ 0. CALL METHOD g_grid->set_ready_for_input( 1 ). ELSE. CALL METHOD g_grid->set_ready_for_input( 0 ). ENDIF. ENDFORM. FORM save_data. DATA: lv_tabix TYPE sy-tabix. " 确保界面数据同步到内表 CALL METHOD g_grid->check_changed_data. " 比较当前数据与原始数据 LOOP AT gt_outtab ASSIGNING FIELD-SYMBOL(<fs_line>). lv_tabix = sy-tabix. " 检查当前行是否有修改 READ TABLE gt_original INDEX lv_tabix ASSIGNING FIELD-SYMBOL(<fs_orig>). IF <fs_line> <> <fs_orig>. " 更新数据库 UPDATE zmard_copy FROM <fs_line>. IF sy-subrc = 0. " 更新原始数据副本 <fs_orig> = <fs_line>. ELSE. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. ENDLOOP. COMMIT WORK AND WAIT. IF sy-subrc = 0. MESSAGE '数据保存成功' TYPE 'S'. " 刷新ALV显示 CALL METHOD g_grid->refresh_table_display. ENDIF. ENDFORM. 基于此代码,增加功能:默认状态下禁止编辑编辑状态下只有lgpbe可以编辑,其他字段(mandt,matnr,werks,lgort)均为主键且不可编辑
08-06
在我的程式做修改,讓DROP DOWN可以出現兩筆銀行代碼,REPORT zz . TABLES: ekko. TYPES: BEGIN OF ty_ekpo, ebeln TYPE ekpo-ebeln, lifnr TYPE ekko-lifnr, bankn TYPE lfbk-bankn, END OF ty_ekpo. DATA: lt_ekpo TYPE STANDARD TABLE OF ty_ekpo, ls_ekpo TYPE ty_ekpo. DATA: lt_bank_data TYPE STANDARD TABLE OF lfbk, ls_bank_data TYPE lfbk. SELECT-OPTIONS s_aedat FOR ekko-aedat. START-OF-SELECTION. SELECT ebeln lifnr INTO CORRESPONDING FIELDS OF TABLE lt_ekpo FROM ekko WHERE aedat IN s_aedat. SELECT lifnr bankn INTO CORRESPONDING FIELDS OF TABLE lt_ekpo FROM lfbk FOR ALL ENTRIES IN lt_ekpo WHERE lifnr = lt_ekpo-lifnr. DATA: lt_fcat TYPE lvc_t_fcat, ls_fcat TYPE lvc_s_fcat. ls_fcat-fieldname = 'EBELN'. ls_fcat-coltext = 'PO'. ls_fcat-datatype = 'CHAR'. ls_fcat-outputlen = '10'. APPEND ls_fcat TO lt_fcat. ls_fcat-fieldname = 'LIFNR'. ls_fcat-coltext = 'VENDOR'. ls_fcat-datatype = 'CHAR'. ls_fcat-outputlen = '10'. APPEND ls_fcat TO lt_fcat. ls_fcat-fieldname = 'BANKN'. ls_fcat-coltext = 'Bank Account'. ls_fcat-datatype = 'CHAR'. ls_fcat-outputlen = '20'. ls_fcat-drdn_hndl = '1'. ls_fcat-edit = 'X'. APPEND ls_fcat TO lt_fcat. DATA lo_grid TYPE REF TO cl_gui_alv_grid. *dropdown DATA:gt_dropdown TYPE lvc_t_drop, gs_dropdown TYPE lvc_s_drop. DATA: gt_event TYPE TABLE OF slis_alv_event, gs_event TYPE slis_alv_event. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid it_fieldcat_lvc = lt_fcat i_callback_user_command = 'ALV_USER_COMMAND' TABLES t_outtab = lt_ekpo EXCEPTIONS program_error = 1 OTHERS = 2. if sy-subrc <> 0. message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. *&---------------------------------------------------------------------* *& Form ALV_USER_COMMAND *&---------------------------------------------------------------------* form alv_user_command using rs_ucomm like sy-ucomm rs_selfield type slis_selfield. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lo_grid. CALL METHOD lo_grid->set_drop_down_table EXPORTING it_drop_down = gt_dropdown. CALL METHOD lo_grid->check_changed_data. endform.
07-31
REPORT zppr105. TABLES:afpo,aufk,afko,ztwm008,zppt085,makt,zppt086,tj02t. *定义全局变量 TYPE-POOLS: slis. DATA:gt_fcat TYPE lvc_t_fcat. DATA:gs_lout TYPE lvc_s_layo. DATA:t_status TYPE TABLE OF jstat WITH HEADER LINE. TYPES:BEGIN OF ty_alv, matnr TYPE afpo-matnr, "物料编码 objnr TYPE aufk-objnr, "对象号 zdjcs TYPE zppt085-zdjcs, "登记次数 plnbez TYPE afko-plnbez, "订单物料编码 plnbez1 TYPE afko-plnbez, "订单物料编码 maktx TYPE makt-maktx, "订单物料描述 werks TYPE aufk-werks, "工厂 auart TYPE aufk-auart, "生产订单类型 aufnr TYPE aufk-aufnr, "生产订单号 aufnr1 TYPE aufk-aufnr, "生产订单号 gamng TYPE afko-gamng, "订单数量 gstrp TYPE afko-gstrp, "开始日期 gltrp TYPE afko-gltrp, "结束日期 zmph TYPE ztwm008-zmph, "铭牌号 zcsry TYPE zppt085-zcsry, "测试人员 zryxm TYPE zppt086-zryxm, "人员姓名 zrybm TYPE zppt086-zrybm, "部门 zcsrq TYPE zppt085-zcsrq, "测试日期 zcsjg TYPE zppt085-zcsjg, "测试结果 zdjrq TYPE zppt085-zdjrq, "登记日期 date TYPE string, zbhgy TYPE zppt085-zbhgy, "不合格描述 txt30 TYPE tj02t-txt30, "生产订单状态 autyp TYPE aufk-autyp, "订单类别 loekz TYPE aufk-loekz, "删除标记 istat TYPE tj02t-istat, "系统状态 sel TYPE c, END OF ty_alv. DATA:gs_alv TYPE ty_alv, gt_alv TYPE TABLE OF ty_alv, go_grid TYPE REF TO cl_gui_alv_grid, gs_alv1 TYPE zppt085, gt_alv1 TYPE TABLE OF zppt085, gs_alv2 TYPE ty_alv. DATA: gt_fieldcat TYPE lvc_t_fcat, gs_layout TYPE lvc_s_layo, gs_grid_settings TYPE lvc_s_glay, gs_fieldcat TYPE lvc_s_fcat. DEFINE add_fieldcat. CLEAR:gs_fieldcat. gs_fieldcat-fieldname = &1. gs_fieldcat-scrtext_l = &2. gs_fieldcat-scrtext_m = &2. gs_fieldcat-scrtext_s = &2. gs_fieldcat-coltext = &2. gs_fieldcat-ref_table = &3. gs_fieldcat-ref_field = &4. gs_fieldcat-cfieldname = &5. gs_fieldcat-currency = &6. gs_fieldcat-quantity = &7. gs_fieldcat-qfieldname = &8. gs_fieldcat-decimals = &9. IF gs_fieldcat-fieldname = 'SEL'. gs_fieldcat-checkbox = 'X'. gs_fieldcat-edit = 'X'. ENDIF. IF gs_fieldcat-fieldname = 'ZCSRY' OR gs_fieldcat-fieldname = 'ZCSRQ' OR gs_fieldcat-fieldname = 'ZCSJG' OR gs_fieldcat-fieldname = 'ZBHGY'. gs_fieldcat-edit = 'X'. ENDIF. APPEND gs_fieldcat TO gt_fieldcat. END-OF-DEFINITION. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000. SELECT-OPTIONS: p_matnr FOR afpo-matnr NO INTERVALS."订单物料编码 SELECT-OPTIONS: p_werks FOR aufk-werks NO INTERVALS OBLIGATORY."工厂 SELECT-OPTIONS: p_aufnr FOR aufk-aufnr NO INTERVALS."生产订单号 SELECT-OPTIONS: p_gstrp FOR afko-gstrp."开始日期 SELECT-OPTIONS: p_gltrp FOR afko-gltrp."结束日期 SELECT-OPTIONS: p_auart FOR aufk-auart NO INTERVALS."订单类型 SELECT-OPTIONS: p_zmph FOR ztwm008-zmph NO INTERVALS."铭牌号 SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002. PARAMETERS: p_ch TYPE c AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK b2. AT SELECTION-SCREEN. * 检查权限(Check Author) * PERFORM frm_check_author. *&---------------------------------------------------------------------* *& START-OF-SELECTION *&---------------------------------------------------------------------* START-OF-SELECTION. * 赋值(get data) PERFORM frm_get_data. *&---------------------------------------------------------------------* *& END-OF-SELECTION *&---------------------------------------------------------------------* END-OF-SELECTION. *设置ALV输出格式(set layout) PERFORM frm_set_layout CHANGING gs_layout. * 设置ALV输出字段(set fieldacat) PERFORM frm_set_fieldcat. * ALV展示(display ALV) PERFORM frm_display_alv. FORM frm_get_data. DATA:number TYPE string. DATA:lv_where TYPE string. DATA: lv_year TYPE char4, "年份 lv_month TYPE char2, "月份 lv_day TYPE char2, "日期 lv_date TYPE char10. "格式化后的日期 "获取系统当前日期 DATA(lv_current_date) = sy-datum. "提取日期各部分 lv_year = lv_current_date(4). "取前4位作为年份 lv_month = lv_current_date+4(2). "从第5位开始取2位作为月份 lv_day = lv_current_date+6(2). "从第7位开始取2位作为日期 "使用CONCATENATE函数拼接 CONCATENATE lv_year '.' lv_month '.' lv_day INTO lv_date. SELECT b~matnr, a~werks, a~auart, a~aufnr, d~gamng, d~plnbez, c~maktx, e~zmph, a~objnr FROM aufk AS a INNER JOIN afko AS d ON d~aufnr = a~aufnr INNER JOIN afpo AS b ON b~matnr = d~plnbez AND b~aufnr = d~aufnr INNER JOIN makt AS c ON c~matnr = d~plnbez INNER JOIN ztwm008 AS e ON e~aufnr = a~aufnr WHERE a~autyp = 10 AND c~spras = 1 AND a~loekz <> 'X' AND b~matnr IN @p_matnr AND a~werks IN @p_werks AND a~aufnr IN @p_aufnr AND d~gstrp IN @p_gstrp AND d~gltrp IN @p_gltrp AND a~auart IN @p_auart AND e~zmph IN @p_zmph INTO TABLE @DATA(lt_form). LOOP AT lt_form INTO DATA(ls_form). MOVE-CORRESPONDING ls_form TO gs_alv. SELECT a~zdjcs,a~plnbez,a~maktx ,a~werks,a~auart,a~aufnr,a~gamng,c~zmph,a~zcsry,b~zryxm,b~zrybm,a~zcsrq,a~zcsjg,a~zdjrq,a~zbhgy FROM zppt085 AS a LEFT OUTER JOIN zppt086 AS b ON a~zcsry = b~zrygh LEFT OUTER JOIN ztwm008 AS c ON c~zmph = @gs_alv-zmph WHERE a~werks = @gs_alv-werks AND a~aufnr = @gs_alv-aufnr AND A~ZMPH = @GS_ALV-ZMPH INTO TABLE @DATA(lt_form2). "判断查询出的表是否为空,不为空,直接将数据插入alv内表中 IF lt_form2 IS NOT INITIAL. LOOP AT lt_form2 INTO DATA(ls_form2). MOVE-CORRESPONDING ls_form2 TO gs_alv2. gs_alv2-plnbez1 = gs_alv2-plnbez. gs_alv2-aufnr1 = gs_alv2-aufnr. SHIFT gs_alv2-plnbez1 LEFT DELETING LEADING '0'. SHIFT gs_alv2-aufnr1 LEFT DELETING LEADING '0'. "获取系统当前日期 CLEAR:lv_current_date,lv_year,lv_month,lv_day. lv_current_date = gs_alv2-zdjrq. "提取日期各部分 lv_year = lv_current_date(4). "取前4位作为年份 lv_month = lv_current_date+4(2). "从第5位开始取2位作为月份 lv_day = lv_current_date+6(2). "从第7位开始取2位作为日期 "使用CONCATENATE函数拼接 CONCATENATE lv_year '.' lv_month '.' lv_day INTO lv_date. gs_alv2-date = lv_date. APPEND gs_alv2 TO gt_alv. CLEAR gs_alv2. ENDLOOP. ELSE. IF gs_alv-zdjcs = 0. gs_alv-zdjcs = 1. ENDIF. "获取系统当前日期 CLEAR:lv_current_date,lv_year,lv_month,lv_day. lv_current_date = sy-datum. "提取日期各部分 lv_year = lv_current_date(4). "取前4位作为年份 lv_month = lv_current_date+4(2). "从第5位开始取2位作为月份 lv_day = lv_current_date+6(2). "从第7位开始取2位作为日期 "使用CONCATENATE函数拼接 CONCATENATE lv_year '.' lv_month '.' lv_day INTO lv_date. gs_alv-date = lv_date. gs_alv-zdjrq = lv_current_date. "结果存放在STATUS表中 CALL FUNCTION 'STATUS_READ' EXPORTING client = sy-mandt objnr = gs_alv-objnr TABLES status = t_status EXCEPTIONS object_not_found = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. number = '0'. LOOP AT t_status. IF p_ch = 'X'. IF ( t_status-stat = 'I0001' AND t_status-inact IS INITIAL ) OR ( t_status-stat = 'I0045' AND t_status-inact IS INITIAL ). number = '1'. ENDIF. ELSEIF t_status-stat = 'I0001' AND t_status-inact IS INITIAL. number = '1'. ENDIF. ENDLOOP. gs_alv-plnbez1 = gs_alv-plnbez. gs_alv-aufnr1 = gs_alv-aufnr. SHIFT gs_alv-plnbez1 LEFT DELETING LEADING '0'. SHIFT gs_alv-aufnr1 LEFT DELETING LEADING '0'. IF number <> '1'. APPEND gs_alv TO gt_alv. ENDIF. CLEAR:gs_alv. ENDIF. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_SET_LAYOUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_set_layout CHANGING p_layout TYPE lvc_s_layo. p_layout-zebra = 'X'. p_layout-sel_mode = 'D'. p_layout-cwidth_opt = 'X'. "自适应宽度(Adaptive width) ENDFORM. "frm_set_layout FORM frm_set_fieldcat. REFRESH gt_fieldcat. add_fieldcat: 'SEL ' '选择 ' '' '' '' '' '' '' '' , ' ' '消息类型 ' '' '' '' '' '' '' '' , ' ' '消息文本 ' '' '' '' '' '' '' '' , 'ZDJCS ' '登记次数 ' '' '' '' '' '' '' '' , 'PLNBEZ1 ' '订单物料编码 ' '' '' '' '' '' '' '' , 'MAKTX ' '订单物料描述 ' '' '' '' '' '' '' '' , 'WERKS ' '工厂 ' '' '' '' '' '' '' '' , 'AUART ' '生产订单类型 ' '' '' '' '' '' '' '' , 'AUFNR1 ' '生产订单号 ' '' '' '' '' '' '' '' , 'GAMNG ' '订单数量 ' '' '' '' '' '' '' '' , 'ZMPH ' '铭牌号 ' '' '' '' '' '' '' '' , 'ZCSRY' '测试人员 ' 'ZPPT086' 'ZRYGH' '' '' '' '' '' , 'ZRYXM ' '人员姓名 ' '' '' '' '' '' '' '' , 'ZRYBM ' '部门 ' '' '' '' '' '' '' '' , 'ZCSJG ' '测试结果 ' '' '' '' '' '' '' '', 'DATE ' '登记日期 ' '' '' '' '' '' '' '' , 'ZBHGY ' '不合格描述 ' '' '' '' '' '' '' '' . * GS_LOUT-BOX_FNAME = 'SEL'. gs_lout-zebra = 'X'. gs_lout-cwidth_opt = 'X'. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_display_alv. DATA:lt_events TYPE slis_t_event, ls_events TYPE slis_alv_event. gs_grid_settings-edt_cll_cb = 'X'. "回车后直接修改内表数据 ls_events-name = slis_ev_data_changed . ls_events-form = 'FRM_DATA_CHANGED'. APPEND ls_events TO lt_events. CLEAR:ls_events. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'FRM_SET_STATUS' "控制GUI i_callback_user_command = 'FRM_USER_COMMAND' "控制用户请求 i_grid_settings = gs_grid_settings " is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat i_save = 'A' it_events = lt_events TABLES t_outtab = gt_alv EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE s006(zfi_msg) DISPLAY LIKE 'E'. ENDIF. IF go_grid IS INITIAL. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. ENDIF. ENDFORM. FORM frm_data_changed USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol. DATA: ls_stable TYPE lvc_s_stbl. ls_stable-row = 'X'. ls_stable-col = 'X'. " 在事件处理中获取网格实例 IF go_grid IS NOT BOUND. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. ENDIF. FIELD-SYMBOLS: <f_data>, <f_value> TYPE lvc_s_modi-value, <f_field> TYPE any. DATA: ls_modi TYPE lvc_s_modi, lv_matnr TYPE mara-matnr, lv_value TYPE lvc_s_modi-value. LOOP AT er_data_changed->mt_mod_cells INTO DATA(ls_mod). ENDLOOP. LOOP AT er_data_changed->mt_good_cells INTO ls_modi . lv_value = ls_modi-value. SHIFT lv_value LEFT DELETING LEADING space. "去掉空格 IF ls_modi-fieldname = 'ZCSRY'. READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) INDEX ls_modi-row_id. IF sy-subrc = 0. ASSIGN COMPONENT ls_modi-fieldname OF STRUCTURE <fs_alv> TO <f_field>. IF sy-subrc = 0. <f_field> = lv_value. ENDIF. SELECT SINGLE zryxm zrybm INTO (<fs_alv>-zryxm,<fs_alv>-zrybm) FROM zppt086 WHERE zrygh = lv_value. IF sy-subrc <> 0. CLEAR:<fs_alv>-zryxm,<fs_alv>-zrybm. ENDIF. ENDIF. ENDIF. ENDLOOP. " 只有在网格实例有效时才刷新 IF go_grid IS BOUND. "确保布局设置中启用了自适应列宽 gs_layout-cwidth_opt = 'X'. " 刷新显示 CALL METHOD go_grid->refresh_table_display EXPORTING is_stable = ls_stable. ELSE. " 如果无法获取网格实例,使用其他方式刷新 MESSAGE '数据已更新,请手动刷新显示' TYPE 'S'. ENDIF. ENDFORM. FORM frm_set_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'STANDARD'. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_user_command USING r_ucomm LIKE sy-ucomm ##CALLED rs_selfield TYPE slis_selfield. DATA: e_lo_grid TYPE REF TO cl_gui_alv_grid. * 设置刷新模式,行列保持不变 rs_selfield-refresh = 'X'. rs_selfield-col_stable = 'X'. rs_selfield-row_stable = 'X'. IF go_grid IS INITIAL.. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. ENDIF. CALL METHOD go_grid->check_changed_data. * CALL METHOD go_grid->get_filtered_entries * IMPORTING * et_filtered_entries = lt_filt. "筛选数据的定义 DATA: lo_grid TYPE REF TO cl_gui_alv_grid. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lo_grid. CASE r_ucomm. WHEN '&SAVE'. " 打印 READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'. IF sy-subrc <> 0. MESSAGE '请选择要保存的数据' TYPE 'E'. ENDIF. PERFORM frm_save_smartforms. WHEN '&COPY'. PERFORM copy_selected_rows. WHEN OTHERS. ENDCASE. CALL METHOD go_grid->refresh_table_display."刷新alv ENDFORM. FORM copy_selected_rows. DATA: lt_selected TYPE TABLE OF ty_alv, ls_selected TYPE ty_alv, lv_max_zdjcs TYPE zppt085-zdjcs, lt_group_data TYPE STANDARD TABLE OF ty_alv, lv_count TYPE i. "检查数据变更 CALL METHOD go_grid->check_changed_data. READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'. IF sy-subrc <> 0. MESSAGE '请选择要复制的数据' TYPE 'E'. ENDIF. "遍历内表查找选中行 CLEAR gs_alv. CLEAR gs_alv2. "获取所有选中的行数据 LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'. APPEND gs_alv TO lt_selected. ENDLOOP. LOOP AT lt_selected INTO ls_selected. CLEAR lt_group_data. LOOP AT gt_alv INTO DATA(ls_temp) WHERE werks = ls_selected-werks AND aufnr = ls_selected-aufnr AND zmph = ls_selected-zmph. " 替换为实际铭牌号字段 APPEND ls_temp TO lt_group_data. ENDLOOP. " 获取组内最大登记次数 lv_max_zdjcs = 1. LOOP AT lt_group_data INTO DATA(ls_group). IF ls_group-zdjcs > lv_max_zdjcs. lv_max_zdjcs = ls_group-zdjcs. ENDIF. ENDLOOP. ls_selected-zdjcs = lv_max_zdjcs + 1. ls_selected-zdjrq = sy-datum. ls_selected-sel = ''. APPEND ls_selected TO gt_alv. ENDLOOP. "刷新ALV显示 CALL METHOD go_grid->refresh_table_display. "显示成功消息 lv_count = lines( lt_selected ). MESSAGE |已成功复制 { lv_count } 行数据| TYPE 'S'. ENDFORM. FORM frm_save_smartforms. CLEAR gs_alv. CLEAR gs_alv1. LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'. gs_alv1-zdjcs = gs_alv-zdjcs. gs_alv1-plnbez = gs_alv-plnbez. gs_alv1-maktx = gs_alv-maktx . gs_alv1-werks = gs_alv-werks. gs_alv1-auart = gs_alv-auart. gs_alv1-aufnr = gs_alv-aufnr. gs_alv1-gamng = gs_alv-gamng. gs_alv1-zmph = gs_alv-zmph. gs_alv1-zcsry = gs_alv-zcsry. gs_alv1-zryxm = gs_alv-zryxm. gs_alv1-zrybm = gs_alv-zrybm. gs_alv1-zcsrq = gs_alv-zcsrq. gs_alv1-zcsjg = gs_alv-zcsjg. gs_alv1-zdjrq = gs_alv-zdjrq. gs_alv1-zbhgy = gs_alv-zbhgy. APPEND gs_alv1 TO gt_alv1. CLEAR gs_alv. CLEAR gs_alv1. ENDLOOP. * MODIFY zppt085 FROM TABLE gt_alv1 . MODIFY zppt085 FROM TABLE gt_alv1. IF sy-subrc = 0. COMMIT WORK. MESSAGE '保存成功' TYPE 'I'. ELSE. ROLLBACK WORK. MESSAGE '保存失败' TYPE 'E'. ENDIF. ENDFORM. 根据上述完整代码添加功能:给测试结果字段添加下拉框:OK、NG
最新发布
11-30
REPORT zfind_edit_update. TABLES: zmard_copy. DATA: ok_code LIKE sy-ucomm, save_ok LIKE sy-ucomm, g_container TYPE scrfname VALUE ‘ALV_CONTAINER’, g_grid TYPE REF TO cl_gui_alv_grid, g_custom_container TYPE REF TO cl_gui_custom_container, gs_layout TYPE lvc_s_layo, gt_outtab TYPE TABLE OF zmard_copy, gt_original TYPE TABLE OF zmard_copy, " 存储原始数据用于比较 lv_modified TYPE abap_bool. " 标记是否有修改 CALL SCREEN 100 STARTING AT 1 1. MODULE pbo OUTPUT. SET PF-STATUS ‘MAIN100’. SET TITLEBAR ‘MAIN100’. IF g_custom_container IS INITIAL. CREATE OBJECT g_custom_container EXPORTING container_name = g_container. CREATE OBJECT g_grid EXPORTING i_parent = g_custom_container. gs_layout-edit = 'X'. SELECT * FROM zmard_copy INTO TABLE gt_outtab UP TO 1000 ROWS. " 保存原始数据用于后续比较 gt_original = gt_outtab. CALL METHOD g_grid->set_table_for_first_display EXPORTING i_structure_name = 'zmard_copy' is_layout = gs_layout CHANGING it_outtab = gt_outtab. CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ENDIF. ENDMODULE. MODULE pai INPUT. save_ok = ok_code. CLEAR ok_code. CASE save_ok. WHEN ‘EXIT’. PERFORM exit_program. WHEN ‘SWITCH’. PERFORM switch_edit_mode. WHEN ‘SAVE’. " 保存按钮处理 PERFORM save_data. WHEN OTHERS. " 处理其他事件 ENDCASE. ENDMODULE. FORM exit_program. LEAVE PROGRAM. ENDFORM. ---------------------------------------------------------------------- FORM switch_edit_mode. IF g_grid->is_ready_for_input( ) EQ 0. CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ELSE. CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 0. ENDIF. ENDFORM. ---------------------------------------------------------------------- 保存数据的子过程(兼容版本) ---------------------------------------------------------------------- FORM save_data. DATA: gs_outtab TYPE zmard_copy, gs_original TYPE zmard_copy, lv_lines TYPE i. " 从ALV控件获取最新数据到内表 CALL METHOD g_grid->check_changed_data. " 检查是否有数据被修改 lv_modified = abap_false. LOOP AT gt_outtab INTO gs_outtab. READ TABLE gt_original INTO gs_original INDEX sy-tabix. IF gs_outtab <> gs_original. lv_modified = abap_true. EXIT. " 找到第一个修改就退出 ENDIF. ENDLOOP. IF lv_modified = abap_true. " 更新数据库 UPDATE zmard_copy FROM TABLE gt_outtab. IF sy-subrc = 0. COMMIT WORK. " 更新原始数据缓存 gt_original = gt_outtab. MESSAGE ‘数据已成功保存’ TYPE ‘S’. ELSE. ROLLBACK WORK. MESSAGE ‘数据保存失败’ TYPE ‘E’. ENDIF. ELSE. MESSAGE ‘没有数据被修改’ TYPE ‘I’. ENDIF. ENDFORM. 基于以上代码,增加如下要求,默认状态下禁止编辑编辑状态下只有lgpbe可以编辑,其他字段(mandt,matnr,werks,lgort)均为主键始终为不可编辑状态
08-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值