SAP ABAP 批导函数(封装版)

EXCEL批导函数相信大家熟悉的不能再熟悉了,但是特殊场景不同函数对工作的影响真的很大。

整理本篇文章是因为公司电脑统一使用了加密系统,通过先前的统一函数无法直接上传,每次都要先另存为TEXT文本后上传,用户体验非常差,使用起来属实不便。后来偶然的发现,函数 ALSM_EXCEL_TO_INTERNAL_TABLE 对 加密的EXCEL 同样可以丝滑读取,所以重新封装了下,在这里做个记录。(同时,新封装函数不但可以输出数据,还可以输出首行列名,在列名变化的需求中常用)。

废话不多说,直接上代码。(如果代码臃肿,自行精简)

FUNCTION zz_excel_to_internal_table.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_FILENAME) TYPE  RLGRAP-FILENAME
*"     REFERENCE(IV_SKIP) TYPE  AS4FLAG DEFAULT 'X'
*"     REFERENCE(IV_SKIP_TO) TYPE  I OPTIONAL
*"     REFERENCE(IV_END_COL) TYPE  I OPTIONAL
*"     REFERENCE(IV_END_ROW) TYPE  I DEFAULT '65000'
*"  TABLES
*"      T_DATA TYPE  STANDARD TABLE
*"      T_TITLE TYPE  STANDARD TABLE OPTIONAL
*"      T_RETURN TYPE  BAPIRET2_T OPTIONAL
*"----------------------------------------------------------------------
*&——————————————————————————————————————"注意事项:"1、默认跳过第一行,则第一行作为抬头行接收,如果不跳过,则不作为抬头行"2、结束列数 作为读取文件的最大列数,如果不设置,默认以传入内表的列数为准"3、结束行数 默认值为65000行,数值过大系统本身就无法处理,导致卡顿"4、函数逻辑 以通用的顺序作为判断依据,需自行识别接收表和模板字段的匹配顺序,应严格保持一致
*&——————————————————————————————————————
*Global data declarationsTYPE-POOLS: truxs.DATA: cxroot            TYPE REF TO cx_root,lv_file           TYPE rlgrap-filename,lv_string         TYPE string, "文件地址lv_file_name      TYPE string, "文件名称(含地址)lv_file_type      TYPE string, "文件类型(后缀)lv_message        TYPE string,lt_intern         TYPE TABLE OF zst_mm03_alsmex_tabline WITH HEADER LINE , "alsmex_tablinels_intern         TYPE zst_mm03_alsmex_tabline, "alsmex_tabline,lv_skip_to        TYPE i,lv_end_col        TYPE i,lv_end_row        TYPE i,ref_tdescr        TYPE REF TO cl_abap_typedescr,ref_tdescr_title  TYPE REF TO cl_abap_typedescr,ref_sdescr        TYPE REF TO cl_abap_structdescr,ref_sdescr_title  TYPE REF TO cl_abap_structdescr,ref_cx            TYPE REF TO cx_root,ref_data          TYPE REF TO data,ref_data_title    TYPE REF TO data,ls_new_line       TYPE REF TO data,ls_new_line_title TYPE REF TO data,ls_comp           TYPE abap_compdescr,ls_fcat           TYPE lvc_s_fcat,lt_fcat           TYPE lvc_t_fcat,lt_fcat_title     TYPE lvc_t_fcat,lt_raw            TYPE truxs_t_text_data,lt_file           TYPE STANDARD TABLE OF string.FIELD-SYMBOLS: <lfs_table>       TYPE STANDARD TABLE,<lfs_table_title> TYPE STANDARD TABLE,<lfs_struc>       TYPE any,<lfs_struc_title> TYPE any,<lfs_field>       TYPE any,<lfs_value>       TYPE any,<lfs_value_title> TYPE any,<lfs_intern>      TYPE zst_mm03_alsmex_tabline. "alsmex_tabline."检查文件路径IF iv_filename IS INITIAL.CLEAR: lv_message.lv_message = |File path is null,please check!|.PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDIF."解析数据内表CALL METHOD cl_abap_structdescr=>describe_by_dataEXPORTINGp_data      = t_dataRECEIVINGp_descr_ref = ref_tdescr.TRY.ref_sdescr ?= ref_tdescr.CATCH cx_root INTO ref_cx.CLEAR: lv_message.lv_message = ref_cx->get_text( ).PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDTRY."组装字段名,用于生成新的动态内表CLEAR:lv_end_col.LOOP AT ref_sdescr->components INTO ls_comp.CLEAR: ls_fcat.ls_fcat-fieldname = ls_comp-name.ls_fcat-ref_table = 'DOCS'.ls_fcat-ref_field = 'LINES'.APPEND ls_fcat TO lt_fcat.lv_end_col = lv_end_col + 1.ENDLOOP.IF iv_end_col IS NOT INITIAL.lv_end_col = iv_end_col.ENDIF.IF iv_end_row IS NOT INITIAL.lv_end_row = iv_end_row.ELSE.lv_end_row = '65000'.ENDIF."生成动态内表CALL METHOD cl_alv_table_create=>create_dynamic_tableEXPORTINGit_fieldcatalog           = lt_fcatIMPORTINGep_table                  = ref_dataEXCEPTIONSgenerate_subpool_dir_full = 1.IF sy-subrc <> 0 OR ref_data IS NOT BOUND.CLEAR: lv_message.lv_message = |Dynamic table creation failed|.PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDIF.ASSIGN ref_data->* TO <lfs_table>.IF iv_skip = 'X'."跳过首行,默认将首行作为抬头行输出IF t_title IS SUPPLIED."解析数据内表CALL METHOD cl_abap_structdescr=>describe_by_dataEXPORTINGp_data      = t_titleRECEIVINGp_descr_ref = ref_tdescr_title.TRY.ref_sdescr_title ?= ref_tdescr_title.CATCH cx_root INTO ref_cx.CLEAR: lv_message.lv_message = ref_cx->get_text( ).PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDTRY.LOOP AT ref_sdescr_title->components INTO ls_comp.CLEAR: ls_fcat.ls_fcat-fieldname = ls_comp-name.ls_fcat-ref_table = 'DOCS'.ls_fcat-ref_field = 'LINES'.APPEND ls_fcat TO lt_fcat_title.ENDLOOP.CALL METHOD cl_alv_table_create=>create_dynamic_tableEXPORTINGit_fieldcatalog           = lt_fcat_titleIMPORTINGep_table                  = ref_data_titleEXCEPTIONSgenerate_subpool_dir_full = 1.IF sy-subrc <> 0 OR ref_data_title IS NOT BOUND.CLEAR: lv_message.lv_message = |Dynamic table for title creation failed|.PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDIF.ASSIGN ref_data_title->* TO <lfs_table_title>.ENDIF.ENDIF.CLEAR:lv_string,lv_file_name,lv_file_type .lv_string = iv_filename."根据文件地址获取文件后缀名,防止文件路径中多次出现文件类型,只取最后一个有效文件类型lv_file_type = iv_filename.WHILE lv_file_type CS '.'.SPLIT lv_file_type AT '.' INTO lv_file_name lv_file_type.ENDWHILE.TRANSLATE lv_file_type TO LOWER CASE."兼容Excel 和 TXT 文本CASE lv_file_type.WHEN 'xls' OR 'xlsx'.CLEAR:lt_intern[].CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE' "'ALSM_EXCEL_TO_INTERNAL_TABLE'EXPORTINGfilename                = iv_filenamei_begin_col             = 1i_begin_row             = 1i_end_col               = lv_end_coli_end_row               = lv_end_rowTABLESintern                  = lt_internEXCEPTIONSinconsistent_parameters = 1upload_ole              = 2OTHERS                  = 3.IF sy-subrc <> 0.CLEAR: lv_message.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .RETURN.ENDIF.CREATE DATA ls_new_line LIKE LINE OF <lfs_table>.ASSIGN ls_new_line->* TO <lfs_struc>.IF <lfs_table_title> IS ASSIGNED.CREATE DATA ls_new_line_title LIKE LINE OF <lfs_table_title>.ASSIGN ls_new_line_title->* TO <lfs_struc_title>.ENDIF.LOOP AT lt_intern ASSIGNING <lfs_intern>.IF iv_skip EQ abap_true .IF <lfs_intern>-row = 1."首行数据根据顺序依次填入结构中IF <lfs_struc_title> IS ASSIGNED.UNASSIGN <lfs_value_title>.ASSIGN COMPONENT <lfs_intern>-col OF STRUCTURE <lfs_struc_title> TO <lfs_value_title>.IF <lfs_value_title> IS ASSIGNED.TRY.<lfs_value_title> = <lfs_intern>-value.CATCH cx_root INTO cxroot.CLEAR: lv_message.lv_message = cxroot->get_text( ).PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDTRY.ENDIF.ELSE.CONTINUE.ENDIF.ELSEIF <lfs_intern>-row = 2."在读取第二行第一列的时候将抬头数据 参入参数中IF <lfs_intern>-col = 1 AND <lfs_struc_title> IS ASSIGNED.MOVE-CORRESPONDING <lfs_struc_title> TO t_title.APPEND t_title.CLEAR: <lfs_struc_title>.ENDIF.ENDIF.ENDIF."防止因为要抬头行,没有跳过IF iv_skip EQ abap_true  AND <lfs_intern>-row = 1.CONTINUE.ENDIF."如果需要跳过多行,根据行号判断IF iv_skip_to <> 0.IF <lfs_intern>-row <= iv_skip_to.CONTINUE.ENDIF.ENDIF.ASSIGN COMPONENT <lfs_intern>-col OF STRUCTURE <lfs_struc> TO <lfs_value>.IF <lfs_value> IS ASSIGNED.CONDENSE <lfs_intern>-value NO-GAPS.TRY.<lfs_value> = <lfs_intern>-value.CATCH cx_root INTO cxroot.CLEAR: lv_message.lv_message = cxroot->get_text( ).PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDTRY.ENDIF.AT END OF row.MOVE-CORRESPONDING <lfs_struc> TO t_data.APPEND t_data.CLEAR: <lfs_struc>.ENDAT.ENDLOOP.WHEN 'txt'.CALL METHOD cl_gui_frontend_services=>gui_uploadEXPORTINGfilename                = lv_stringfiletype                = 'ASC'has_field_separator     = cl_abap_char_utilities=>horizontal_tabCHANGINGdata_tab                = <lfs_table>EXCEPTIONSfile_open_error         = 1file_read_error         = 2no_batch                = 3gui_refuse_filetransfer = 4invalid_type            = 5no_authority            = 6unknown_error           = 7bad_data_format         = 8header_not_allowed      = 9separator_not_allowed   = 10header_too_long         = 11unknown_dp_error        = 12access_denied           = 13dp_out_of_memory        = 14disk_full               = 15dp_timeout              = 16not_supported_by_gui    = 17error_no_gui            = 18.IF sy-subrc <> 0.CLEAR: lv_message.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .RETURN.ENDIF.IF iv_skip EQ abap_true.IF <lfs_struc_title> IS ASSIGNED.READ TABLE <lfs_table> ASSIGNING <lfs_struc> INDEX 1.TRY.MOVE-CORRESPONDING <lfs_struc> TO t_title.CATCH cx_root INTO ref_cx.CLEAR: lv_message.lv_message = ref_cx->get_text( ).PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .CLEAR: lv_message.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .RETURN.ENDTRY.ENDIF.DELETE <lfs_table> INDEX 1.ENDIF.IF iv_skip_to > 1.CLEAR:lv_skip_to.IF iv_skip EQ abap_true."因为LV_INDEX = 'X',已经将第一行删除,故少删除一行lv_skip_to = iv_skip_to - 1.ELSE.lv_skip_to = iv_skip_to.ENDIF.DELETE <lfs_table> FROM 1 TO lv_skip_to .ENDIF.LOOP AT  <lfs_table> ASSIGNING <lfs_struc>.TRY.MOVE-CORRESPONDING <lfs_struc> TO t_data.CATCH cx_root INTO ref_cx.CLEAR: lv_message.lv_message = ref_cx->get_text( ).PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .CLEAR: lv_message.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .RETURN.ENDTRY.APPEND t_data.ENDLOOP.WHEN OTHERS.CLEAR: lv_message.lv_message = |The file type { lv_file_type } is not supported|.PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .RETURN.ENDCASE.
ENDFUNCTION.

补上消息处理的子例程.

*&---------------------------------------------------------------------*
*& Form frm_append_message
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> T_RETURN
*&      --> LV_MSG_ID
*&      --> LV_MSG_NUM
*&      --> LV_MSG_TYPE
*&      --> LV_MSG
*&---------------------------------------------------------------------*
FORM frm_append_message  TABLES   pt_return STRUCTURE bapiret2USING    pv_msg_idpv_msg_numpv_msg_typepv_msg.DATA: ls_msg TYPE bapiret2.CLEAR: ls_msg.ls_msg-id         = '00'.ls_msg-type       = 'E'.ls_msg-number     = 001.ls_msg-message    = pv_msg.APPEND ls_msg to pt_return.
ENDFORM.

另外,由于函数 ALSM_EXCEL_TO_INTERNAL_TABLE 中 接收数据的 VALUE字段只有50个字符,完全无法满足通用场景,故复制一版,使用ZST_ALSMEX_TABLINE 替换了原先的 ALSMEX_TABLINE,除了结构替换(包括子例程用到该结构的都要替换),其他代码保持一致即可。

当然,原先的封装逻辑也是很好的,同时支持excel,csv,text等,不分好坏,只是场景适不适合而已。

FUNCTION ZZZZ_UPLOAD_FILE.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_FILENAME) TYPE  RLGRAP-FILENAME
*"     REFERENCE(IV_SKIP) TYPE  AS4FLAG DEFAULT 'X'
*"     REFERENCE(IV_INDEX) TYPE  I OPTIONAL
*"  TABLES
*"      T_DATA TYPE  STANDARD TABLE
*"      T_RETURN TYPE  BAPIRET2_T OPTIONAL
*"----------------------------------------------------------------------*Global data declarationsTYPE-POOLS: truxs.DATA: lv_seqno   TYPE n LENGTH 5,lv_str1    TYPE string,lv_str2    TYPE string,lv_file    TYPE rlgrap-filename,lv_count   TYPE i,ref_tdescr TYPE REF TO cl_abap_typedescr,ref_sdescr TYPE REF TO cl_abap_structdescr,ref_cx     TYPE REF TO cx_root,ref_data   TYPE REF TO data,ls_comp    TYPE abap_compdescr,ls_fcat    TYPE lvc_s_fcat,lt_fcat    TYPE lvc_t_fcat,lt_raw     TYPE truxs_t_text_data,lt_file    TYPE STANDARD TABLE OF string.FIELD-SYMBOLS: <lfs_table> TYPE STANDARD TABLE,<lfs_struc> TYPE any,<lfs_field> TYPE any.CALL METHOD cl_abap_structdescr=>describe_by_dataEXPORTINGp_data      = t_dataRECEIVINGp_descr_ref = ref_tdescr.TRY.ref_sdescr ?= ref_tdescr.CATCH cx_root INTO ref_cx.lv_str1 = ref_cx->get_text( )."###¡§#######¨®#¡ì¡ã###& & & &CLEAR: t_return.t_return-id         = '00'.t_return-type       = 'E'.t_return-number     = 001.t_return-message_v1 = TEXT-001.REPLACE FIRST OCCURRENCE OF '&' IN t_return-message_v1 WITH 'T_DATA'.t_return-message_v2 = lv_str1.MESSAGE ID t_return-idTYPE t_return-typeNUMBER t_return-numberINTO t_return-messageWITH t_return-message_v1 t_return-message_v2.APPEND t_return.RETURN.ENDTRY.lv_seqno = 1.LOOP AT ref_sdescr->components INTO ls_comp.CLEAR: ls_fcat.ls_fcat-fieldname = ls_comp-name.ls_fcat-ref_table = 'DOCS'.ls_fcat-ref_field = 'LINES'.APPEND ls_fcat TO lt_fcat.ADD 1 TO lv_seqno.ENDLOOP.CALL METHOD cl_alv_table_create=>create_dynamic_tableEXPORTINGit_fieldcatalog           = lt_fcatIMPORTINGep_table                  = ref_dataEXCEPTIONSgenerate_subpool_dir_full = 1.IF sy-subrc <> 0 OR ref_data IS NOT BOUND."处理消息CLEAR: t_return.t_return-id         = '00'.t_return-type       = 'E'.t_return-number     = 001.t_return-message_v1 = TEXT-002.REPLACE FIRST OCCURRENCE OF '&' IN t_return-message_v1WITH ref_sdescr->absolute_name.MESSAGE ID t_return-idTYPE t_return-typeNUMBER t_return-numberINTO t_return-messageWITH t_return-message_v1.APPEND t_return.RETURN.ENDIF.ASSIGN ref_data->* TO <lfs_table>."获取最终的文件类型lv_str2 = iv_filename.WHILE lv_str2 CS '.'.SPLIT lv_str2 AT '.' INTO lv_str1 lv_str2.ENDWHILE.TRANSLATE lv_str2 TO LOWER CASE."根据文件类型分别读取CASE lv_str2.WHEN 'xls' OR 'xlsx'.CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'EXPORTINGi_tab_raw_data       = lt_rawi_filename           = iv_filenameTABLESi_tab_converted_data = <lfs_table>EXCEPTIONSconversion_failed    = 1.IF sy-subrc <> 0.MESSAGE ID sy-msgidTYPE sy-msgtyNUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4RAISING file_convert_failed.ENDIF.WHEN 'csv'.lv_str1 = iv_filename.CALL METHOD cl_gui_frontend_services=>gui_uploadEXPORTINGfilename                = lv_str1filetype                = 'DAT'CHANGINGdata_tab                = lt_fileEXCEPTIONSfile_open_error         = 1file_read_error         = 2no_batch                = 3gui_refuse_filetransfer = 4invalid_type            = 5no_authority            = 6unknown_error           = 7bad_data_format         = 8header_not_allowed      = 9separator_not_allowed   = 10header_too_long         = 11unknown_dp_error        = 12access_denied           = 13dp_out_of_memory        = 14disk_full               = 15dp_timeout              = 16not_supported_by_gui    = 17error_no_gui            = 18.IF sy-subrc <> 0.MESSAGE ID sy-msgidTYPE sy-msgtyNUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4RAISING file_convert_failed.ENDIF.LOOP AT lt_file INTO lv_str1.APPEND INITIAL LINE TO <lfs_table> ASSIGNING <lfs_struc>.lv_count = 1.WHILE lv_str1 CS ','.ADD 1 TO lv_count.SPLIT lv_str1 AT ',' INTO lv_str2 lv_str1.ASSIGN COMPONENT sy-index OF STRUCTURE <lfs_struc> TO <lfs_field>.IF sy-subrc EQ 0.MOVE lv_str2 TO <lfs_field>.ELSE.EXIT.ENDIF.ENDWHILE.ADD 1 TO lv_count.IF lv_str1 IS NOT INITIAL.ASSIGN COMPONENT lv_count OF STRUCTURE <lfs_struc> TO <lfs_field>.IF sy-subrc EQ 0.MOVE lv_str1 TO <lfs_field>.ELSE.ENDIF.ENDIF.ENDLOOP.WHEN 'txt'.lv_str1 = iv_filename.CALL METHOD cl_gui_frontend_services=>gui_uploadEXPORTINGfilename                = lv_str1filetype                = 'ASC'has_field_separator     = cl_abap_char_utilities=>horizontal_tabCHANGINGdata_tab                = <lfs_table>EXCEPTIONSfile_open_error         = 1file_read_error         = 2no_batch                = 3gui_refuse_filetransfer = 4invalid_type            = 5no_authority            = 6unknown_error           = 7bad_data_format         = 8header_not_allowed      = 9separator_not_allowed   = 10header_too_long         = 11unknown_dp_error        = 12access_denied           = 13dp_out_of_memory        = 14disk_full               = 15dp_timeout              = 16not_supported_by_gui    = 17error_no_gui            = 18.IF sy-subrc <> 0.MESSAGE ID sy-msgidTYPE sy-msgtyNUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4RAISING file_convert_failed.ENDIF.WHEN OTHERS.CLEAR: t_return.t_return-id         = '00'.t_return-type       = 'E'.t_return-number     = 001.t_return-message_v1 = TEXT-003.t_return-message_v2 = lv_str2.MESSAGE ID t_return-idTYPE t_return-typeNUMBER t_return-numberINTO t_return-messageWITH t_return-message_v1.APPEND t_return.ENDCASE.IF iv_skip EQ abap_true.IF iv_index = ''.DELETE <lfs_table> INDEX 1.ELSE.DELETE <lfs_table> FROM 1 TO iv_index .ENDIF.ENDIF.LOOP AT <lfs_table> ASSIGNING <lfs_struc>.TRY.MOVE-CORRESPONDING <lfs_struc> TO t_data.CATCH cx_root INTO ref_cx."¡Á#####&#¡ì¡ã###&CLEAR: t_return.t_return-id         = '00'.t_return-type       = 'E'.t_return-number     = 001.t_return-message_v1 = TEXT-004.t_return-message_v2 = sy-tabix.CONDENSE t_return-message_v2 NO-GAPS.REPLACE FIRST OCCURRENCE OF '&' IN t_return-message_v1WITH t_return-message_v2.t_return-message_v2 = ref_cx->get_text( ).MESSAGE ID t_return-idTYPE t_return-typeNUMBER t_return-numberINTO t_return-messageWITH t_return-message_v1t_return-message_v2.APPEND t_return.RETURN.ENDTRY.APPEND t_data.ENDLOOP.READ TABLE t_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.IF sy-subrc EQ 0.CLEAR: t_data.ENDIF.ENDFUNCTION.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持续集成01--Git版本管理及基础应用实践

前言 本系列文章旨在深入探讨持续集成/持续部署&#xff08;Continuous Integration/Continuous Deployment, CI/CD&#xff09;流程中的各个环节&#xff0c;而本篇将聚焦于Git版本管理及其基本应用。通过本文&#xff0c;读者将了解到Git的基本原理、安装配置、基本命令以及如…

GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新

先配置mybatis分页&#xff1a; 品牌管理增加模糊查询&#xff1a; 品牌管理关联分类&#xff1a; 一个品牌可以有多个分类 一个分类也可以有多个品牌 多对多的关系&#xff0c;用中间表 涉及的类&#xff1a; 方法都比较简单&#xff0c;就不贴代码了

无线物联网新时代,RFID拣货标签跟随潮流

拣选技术的演变历程&#xff0c;本质上是从人力操作向自动化、智能化转型的持续进程。近期&#xff0c;“货寻人”技术成为众多企业热烈追捧的对象&#xff0c;它可以根据企业的特定需求&#xff0c;从众多拣选方案中选出最优解。那么&#xff0c;在采用“货到人”拣选技术时&a…

【python】OpenCV—Scanner

文章目录 1、需求描述2、代码实现3、涉及到的库函数cv2.arcLengthcv2.approxPolyDPskimage.filters.threshold_localimutils.grab_contours 4、完整代码5、参考 1、需求描述 输入图片 扫描得到如下的结果 用OpenCV构建文档扫描仪只需三个简单步骤: 1.边缘检测 2.使用图像中…

VS code配置docker远程连接

一 前置条件 1、本地已安装docker 2、服务端docker已配置Docker配置远程连接 二 VScode安装docker扩展 三 执行docker命令 1、切换到远程docker节点 docker context create remote-docker --docker "hosthttp://192.168.6.9:2375" 2、使用远程节点 docker cont…

PyTorch 深度学习实践-逻辑斯蒂回归

视频指路 参考博客笔记 参考笔记二 用来分类的模型 说明&#xff1a;1、 逻辑斯蒂回归和线性模型的明显区别是在线性模型的后面&#xff0c;添加了激活函数(非线性变换) ​ 2、分布的差异&#xff1a;KL散度&#xff0c;cross-entropy交叉熵 现在损失函数衡量不是距离而是分布…

学习react-环境手脚架页面路由

1. 搭建环境 安装node和npm 在下面网址下载node&#xff0c;并安装 https://nodejs.cn/ #检测是否ok node -v npm -v安装react npm install -g create-react-app2. 创建手脚架&#xff08;TypeScript&#xff09; create-react-app my-app --template typescript cd my-a…

昇思25天学习打卡营第15天|两个分类实验

打卡 目录 打卡 实验1&#xff1a;K近邻算法实现红酒聚类 数据准备 模型构建--计算距离 计算演示 模型预测 实验2&#xff1a;基于MobileNetv2的垃圾分类 任务说明 数据集 参数配置&#xff08;训练/验证/推理&#xff09; 数据预处理 MobileNetV2模型搭建 Mobile…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之三 [无标注数据] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习 (Few-shot Learning) 1、零样本学…

钡铼分布式 IO 系统 OPC UA边缘计算耦合器BL205

深圳钡铼技术推出的BL205耦合器支持OPC UA Server功能&#xff0c;以服务器形式对外提供数据。符合IEC 62541工业自动化统一架构通讯标准&#xff0c;数据可以选择加密&#xff08;X.509证书&#xff09;、身份验证方式传送。 安全策略支持basic128rsa15、basic256、basic256s…

【Git远程操作】理解分布式管理 | 创建远程仓库

目录 1.理解分布式管理 多人协作开发 2.创建远程仓库 2.1仓库名&路径 2.2初始化仓库&设置模板 1.理解分布式管理 目前我们学习的所有内容都是在本地来完成的。&#xff08;add /commit /版本撤销回退/分支管理&#xff09; Git是一个分布式 的版本控制系统。 分支…

数据挖掘与分析部分实验与实训项目报告

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

算法工程师第十四天(找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树 )

参考文献 代码随想录 一、找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 层次遍历&#…

【hadoop大数据集群 2】

【hadoop大数据集群 2】 文章目录 【hadoop大数据集群 2】1. 虚拟机克隆2. 时间同步3. 环境变量配置、启动集群、关闭集群 1. 虚拟机克隆 克隆之后一定要重新生成新虚拟机唯一的MAC地址和UUID等&#xff0c;确保新虚拟机与源虚拟机在网络拓扑中不发生冲突。 注意1.生成新的MA…

Pytorch学习笔记day3——用神经网络学习一组函数

好的&#xff0c;我们开始吧。首先第一个问题&#xff0c;神经网络的本质是什么&#xff1f;是古典主义的人类的神经元吗&#xff1f;绝对不是&#xff0c;他只是一个优化函数 y f θ ( x ) y f_{\theta}(x) yfθ​(x) 这和小学学到的线性函数拟合并无本质区别。只是其中参数…

uniapp form表单校验

公司的一个老项目&#xff0c;又要重新上架&#xff0c;uniapp一套代码&#xff0c;打包生成iOS端发布到App Store&#xff0c;安卓端发布到腾讯应用宝、OPPO、小米、华为、vivo&#xff0c;安卓各大应用市场上架要求不一样&#xff0c;可真麻烦啊 光一个表单校验&#xff0c;…

云手机结合自主ADB命令接口 提升海外营销效率

现在&#xff0c;跨境电商直播已经成为在线零售的重要渠道&#xff0c;在大环境下&#xff0c;确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口&#xff0c;为电商直播营销提供了技术支持&#xff0c;使得应用开发、测试、优化和运维更加高效。 什么是A…

【sklearn | 7】:scikit-learn项目实战指南

引言 在数据科学和机器学习领域&#xff0c;Python以其简洁的语法和强大的库支持&#xff0c;成为了许多开发者和研究者的首选语言。而在众多Python机器学习库中&#xff0c;scikit-learn以其易用性、灵活性和强大的算法集合&#xff0c;成为了最受欢迎的库之一。本文将深入探…

【驱动程序】霍尔编码器电机_CubeMX_HAL库

【驱动程序】霍尔编码器电机_CubeMX_HAL库 电机型号&#xff1a;MG310 霍尔编码器电机 驱动模块&#xff1a;L298N 接线 注&#xff1a; L298N 12V接线柱位置可以接50V~5V当跳线帽接入时&#xff0c;5V接线柱为5V输出&#xff0c;可以给驱动板供电当跳线帽拔出时&#xff0…

内部类+图书管理系统

内部类图书管理系统 1. 实例内部类1.1 实例内部类的结构1.2 实例内部类的一些问题1.2.1 如何在main中创建实例内部类对象&#xff1f;1.2.2 内部类成员变量被static修饰问题&#xff1f;1.2.3 内部类和外部类变量重名的调用问题&#xff1f;1.2.4 外部类访问内部类变量的问题 2…