LT_INIT: command not found

本文介绍了解决在使用./configure时遇到的“LT_INIT: command not found”错误的方法,通过安装libtool, autoconf和automake,并执行特定命令来修复。同时,针对udevsupportrequestedbutlibudevheadernotinstalled的问题,提供了安装libudev-dev的解决方案。

./configure: line 3843: LT_INIT: command not found造成操作系统不支持的错误
解决办法:安装libtool autoconf automake,然后在目录上分别执行以下语句:aclocal;libtoolize --force;autoconf;autoheader;automake

udev support requested but libudev header not installed
sudo apt-get install libudev-dev

@echo off chcp 936 >nul 2>&1 setlocal enabledelayedexpansion set "CRASH_LOG=%temp%\vcs_tool_crash.log" echo 工具启动时间:%date% %time% > "!CRASH_LOG!" 2>&1 set "SELF_FILENAME=%~nx0" echo 脚本文件名:!SELF_FILENAME! >> "!CRASH_LOG!" 2>&1 set "CONFIG_FILE=.vcs_ignore_suffix.ini" set "IGNORE_SUFFIXES=vscode/o/d/htm/dep/lnp/_i/rar/zip/gitignore" set "FOLDER_CONFIG_FILE=.vcs_ignore_folders.ini" set "IGNORE_FOLDERS=bin/obj/temp/build/dist" if exist "!CONFIG_FILE!" ( set "loaded_suffixes=" for /f "delims=" %%s in (!CONFIG_FILE!) do ( set "loaded_suffixes=!loaded_suffixes!%%s" ) set "loaded_suffixes=!loaded_suffixes: =/!" if "!loaded_suffixes!" neq "" ( set "IGNORE_SUFFIXES=!loaded_suffixes!" ) echo 从配置文件加载忽略后缀:!IGNORE_SUFFIXES! >> "!CRASH_LOG!" 2>&1 ) else ( echo 未找到配置文件,使用默认忽略后缀:!IGNORE_SUFFIXES! >> "!CRASH_LOG!" 2>&1 ) if exist "!FOLDER_CONFIG_FILE!" ( set "loaded_folders=" for /f "delims=" %%s in (!FOLDER_CONFIG_FILE!) do ( set "loaded_folders=!loaded_folders!%%s" ) set "loaded_folders=!loaded_folders: =/!" if "!loaded_folders!" neq "" ( set "IGNORE_FOLDERS=!loaded_folders!" ) echo 从配置文件加载忽略文件夹:!IGNORE_FOLDERS! >> "!CRASH_LOG!" 2>&1 ) else ( echo 未找到文件夹配置文件,使用默认忽略文件夹:!IGNORE_FOLDERS! >> "!CRASH_LOG!" 2>&1 ) :edit_suffixes cls echo ====================== 忽略设置 ====================== echo 当前忽略的文件后缀:!IGNORE_SUFFIXES! echo 当前忽略的文件夹:!IGNORE_FOLDERS! echo ---------------------------------------------------------- echo 1. 添加忽略后缀 echo 2. 移除忽略后缀 echo 3. 清空后缀忽略列表 echo 4. 添加忽略文件夹 echo 5. 移除忽略文件夹 echo 6. 清空文件夹忽略列表 echo 7. 保存配置并继续(直接回车默认此项) ============================================================== set "SUFFIX_CHOICE=" set /p "SUFFIX_CHOICE=请选择操作(1-7,直接回车继续):" if "!SUFFIX_CHOICE!"=="" set "SUFFIX_CHOICE=7" if "!SUFFIX_CHOICE!"=="1" ( set "new_suffix=" set /p "new_suffix=请输入要忽略的后缀(无需输入".",例:txt):" set "new_suffix=!new_suffix:/=!" set "new_suffix=!new_suffix: =!" if "!new_suffix!" neq "" ( set "is_exist=0" set "temp_list=!IGNORE_SUFFIXES:/= !" for %%s in (!temp_list!) do ( if /i "%%s"=="!new_suffix!" ( set "is_exist=1" ) ) if !is_exist! equ 0 ( set "temp_suffixes=!IGNORE_SUFFIXES!" set "temp_suffixes=!temp_suffixes://=/!" if "!temp_suffixes!"=="" ( set "IGNORE_SUFFIXES=!new_suffix!" ) else ( set "IGNORE_SUFFIXES=!temp_suffixes!/!new_suffix!" ) echo 已添加忽略后缀:!new_suffix! ) else ( echo 该后缀已在忽略列表中 ) ) else ( echo 后缀不能为空 ) pause >nul goto edit_suffixes ) if "!SUFFIX_CHOICE!"=="2" ( set "remove_suffix=" set /p "remove_suffix=请输入要移除的后缀:" if "!remove_suffix!" neq "" ( for /f "delims=" %%a in (' powershell -Command "$list='!IGNORE_SUFFIXES:/= !'; $remove='!remove_suffix!'; $arr=$list -split ' ' | Where-Object { $_ -ne $remove }; $arr -join '/'" ') do set "IGNORE_SUFFIXES=%%a" echo 已移除:!remove_suffix! ) pause >nul goto edit_suffixes ) if "!SUFFIX_CHOICE!"=="3" ( set "confirm=" set /p "confirm=确定要清空后缀忽略列表吗?(Y/N):" if /i "!confirm!"=="Y" ( set "IGNORE_SUFFIXES=" echo 已清空后缀忽略列表 ) pause >nul goto edit_suffixes ) if "!SUFFIX_CHOICE!"=="4" ( set "new_folder=" set /p "new_folder=请输入要忽略的文件夹(例:bin):" set "new_folder=!new_folder:/=!" set "new_folder=!new_folder: =!" if "!new_folder!" neq "" ( set "is_exist=0" set "temp_list=!IGNORE_FOLDERS:/= !" for %%s in (!temp_list!) do ( if /i "%%s"=="!new_folder!" ( set "is_exist=1" ) ) if !is_exist! equ 0 ( :: 更新内存中的忽略列表 set "temp_folders=!IGNORE_FOLDERS!" set "temp_folders=!temp_folders://=/!" if "!temp_folders!"=="" ( set "IGNORE_FOLDERS=!new_folder!" ) else ( set "IGNORE_FOLDERS=!temp_folders!/!new_folder!" ) if /i "!VCS_TYPE!"=="Git" ( set "clean_folder=!new_folder!" if "!clean_folder:~-1!"=="/" set "clean_folder=!clean_folder:~0,-1!" set "rule1=/!clean_folder!/" set "rule2=/!clean_folder!/*" set "rule3=/**/!clean_folder!/" for %%r in ("!rule1!" "!rule2!" "!rule3!") do ( findstr /x /c:"%%~r" ".gitignore" >nul 2>&1 if !errorlevel! equ 1 ( echo %%~r >> ".gitignore" ) ) call :clean_gitignore_duplicates ) echo 已添加忽略文件夹:!new_folder! ) else ( echo 该文件夹已在忽略列表中 ) ) else ( echo 文件夹名不能为空 ) pause >nul goto edit_suffixes ) if "!SUFFIX_CHOICE!"=="5" ( set "remove_folder=" set /p "remove_folder=请输入要移除的文件夹:" if "!remove_folder!" neq "" ( :: 从内存变量中移除 for /f "delims=" %%a in (' powershell -Command "$list='!IGNORE_FOLDERS:/= !'; $remove='!remove_folder!'; $arr=$list -split ' ' | Where-Object { $_ -ne $remove }; $arr -join '/'" ') do set "IGNORE_FOLDERS=%%a" if /i "!VCS_TYPE!"=="Git" if exist ".gitignore" ( set "clean_folder=!remove_folder!" :: 处理文件夹名中的特殊字符 set "escaped_folder=!clean_folder:.=\.!" set "escaped_folder=!escaped_folder:?=\?!" set "escaped_folder=!escaped_folder:*=\*!" set "escaped_folder=!escaped_folder: =\ !" set "temp_file=%temp%\gitignore_temp.tmp" powershell -Command "$folder = [regex]::Escape('!clean_folder!'); $gitignore = '.gitignore'; $temp = '%temp_file%'; Get-Content $gitignore | Where-Object { $_ -notmatch '^\/' + $folder + '\/$' -and $_ -notmatch '^\/' + $folder + '\/\*$' -and $_ -notmatch '^\*\*\/' + $folder + '\/$' } | Set-Content $temp -Encoding default; Move-Item $temp $gitignore -Force" >nul 2>&1 del "!temp_file!" >nul 2>&1 echo 已同步清理.gitignore中关于"!remove_folder!"的规则 ) echo 已移除:!remove_folder! ) pause >nul goto edit_suffixes ) if "!SUFFIX_CHOICE!"=="6" ( set "confirm=" set /p "confirm=确定要清空文件夹忽略列表吗?(Y/N):" if /i "!confirm!"=="Y" ( set "IGNORE_FOLDERS=" :: 清空.gitignore中所有文件夹规则(Git专属) if /i "!VCS_TYPE!"=="Git" if exist ".gitignore" ( set "temp_file=%temp%\gitignore_temp.tmp" powershell -Command "$gitignore = '.gitignore'; $temp = '%temp_file%'; Get-Content $gitignore | Where-Object { $_ -notmatch '^\/.*\/$' -and $_ -notmatch '^\/.*\/\*$' -and $_ -notmatch '^\*\*\/.*\/$' } | Set-Content $temp -Encoding default; Move-Item $temp $gitignore -Force" >nul 2>&1 del "!temp_file!" >nul 2>&1 echo 已同步清空.gitignore中的文件夹规则 ) echo 已清空文件夹忽略列表 ) pause >nul goto edit_suffixes ) if "!SUFFIX_CHOICE!"=="7" ( set "IGNORE_SUFFIXES=!IGNORE_SUFFIXES://=/!" if "!IGNORE_SUFFIXES:~0,1!"=="/" set "IGNORE_SUFFIXES=!IGNORE_SUFFIXES:~1!" if "!IGNORE_SUFFIXES:~-1!"=="/" set "IGNORE_SUFFIXES=!IGNORE_SUFFIXES:~0,-1!" if "!IGNORE_SUFFIXES!"=="" ( echo. > "!CONFIG_FILE!" ) else ( echo !IGNORE_SUFFIXES:/= ! > "!CONFIG_FILE!" ) :: 保存文件夹配置 set "IGNORE_FOLDERS=!IGNORE_FOLDERS://=/!" if "!IGNORE_FOLDERS:~0,1!"=="/" set "IGNORE_FOLDERS=!IGNORE_FOLDERS:~1!" if "!IGNORE_FOLDERS:~-1!"=="/" set "IGNORE_FOLDERS=!IGNORE_FOLDERS:~0,-1!" if "!IGNORE_FOLDERS!"=="" ( echo. > "!FOLDER_CONFIG_FILE!" ) else ( echo !IGNORE_FOLDERS:/= ! > "!FOLDER_CONFIG_FILE!" ) echo 配置已保存 >> "!CRASH_LOG!" 2>&1 ) set "IGNORE_REGEX=" set "temp_suffixes=!IGNORE_SUFFIXES:/= !" for %%s in (!temp_suffixes!) do ( if "!IGNORE_REGEX!"=="" ( set "IGNORE_REGEX=\.%%s$" ) else ( set "IGNORE_REGEX=!IGNORE_REGEX!|\.%%s$" ) ) set "temp_folders=!IGNORE_FOLDERS:/= !" for %%f in (!temp_folders!) do ( set "escaped_folder=%%f" set "escaped_folder=!escaped_folder:.=\.!" set "escaped_folder=!escaped_folder:?=\?!" set "escaped_folder=!escaped_folder:*=\*!" if "!IGNORE_REGEX!"=="" ( set "IGNORE_REGEX=\\!escaped_folder!\\|/!escaped_folder!/" ) else ( set "IGNORE_REGEX=!IGNORE_REGEX!|\\!escaped_folder!\\|/!escaped_folder!/" ) ) if "!IGNORE_REGEX!"=="" ( set "IGNORE_REGEX=^$" ) echo 忽略正则表达式: !IGNORE_REGEX! >> "!CRASH_LOG!" 2>&1 :: ========================= 第一步:自动检测版本控制系统 ========================= set "AUTO_DETECTED_VCS=" if exist ".git" ( set "AUTO_DETECTED_VCS=Git" echo 自动检测到Git仓库 >> "!CRASH_LOG!" 2>&1 ) if exist ".svn" ( set "AUTO_DETECTED_VCS=SVN" echo 自动检测到SVN仓库 >> "!CRASH_LOG!" 2>&1 ) if "!AUTO_DETECTED_VCS!"=="" ( :auto_detect_failed cls echo ======================自动生成格式提交工具 ====================== echo 警告:未检测到Git或SVN仓库 echo 请手动选择版本控制系统: echo 1. Git(配合TortoiseGit) echo 2. SVN(配合TortoiseSVN) echo 3. 退出工具 echo ============================================================== set "VCS_CHOICE=" set /p "VCS_CHOICE=请输入选项(1/2/3):" if "!VCS_CHOICE!" neq "1" if "!VCS_CHOICE!" neq "2" if "!VCS_CHOICE!" neq "3" ( echo 输入错误,请重新选择! pause >nul goto auto_detect_failed ) if "!VCS_CHOICE!"=="3" ( echo 已退出工具 echo 用户选择退出工具 >> "!CRASH_LOG!" 2>&1 pause >nul del "!CRASH_LOG!" >nul 2>&1 exit /b 0 ) if "!VCS_CHOICE!"=="1" ( set "VCS_TYPE=Git" ) else ( set "VCS_TYPE=SVN" ) echo 用户手动选择VCS类型:!VCS_TYPE! >> "!CRASH_LOG!" 2>&1 ) else ( set "VCS_TYPE=!AUTO_DETECTED_VCS!" echo ====================== 自动生成格式提交工具工具 ====================== echo 自动检测到: !VCS_TYPE! 仓库 echo 正在启动提交流程... ) :: ========================= 第二步:通用初始化 ========================= set "COMMIT_MSG_FILE=%temp%\vcs_commit_msg.txt" echo. > "!COMMIT_MSG_FILE!" 2>&1 if not exist "!COMMIT_MSG_FILE!" ( echo 创建提交信息文件失败,可能权限不足! >> "!CRASH_LOG!" 2>&1 echo 创建提交信息文件失败,请以管理员身份运行! pause >nul exit /b 1 ) echo 提交信息文件创建成功:!COMMIT_MSG_FILE! >> "!CRASH_LOG!" 2>&1 set "FILE_COUNT=0" set "DEFAULT_TITLE_PREFIX=[feat][ARM]: " set "DEFAULT_TASKID_PREFIX=#TaskID: " set "SELECTED_COUNT=0" set "SELECTED_PATH[0]=" set "SELECTED_NAME[0]=" set "SELECTED_STATUS[0]=" :: ========================= 第三步:获取文件列表 ========================= set "EXCLUDE_FILES=!SELF_FILENAME! .vcs_tool_config.ini vcs_tortoise_path_git.txt vcs_tortoise_path_svn.txt" set "FILE_LIST_TMP=%temp%\vcs_filelist.tmp" del "!FILE_LIST_TMP!" >nul 2>&1 :: 重新生成忽略正则(确保包含文件夹过滤) set "IGNORE_REGEX=" set "temp_suffixes=!IGNORE_SUFFIXES:/= !" for %%s in (!temp_suffixes!) do ( if "!IGNORE_REGEX!"=="" ( set "IGNORE_REGEX=\.%%s$" ) else ( set "IGNORE_REGEX=!IGNORE_REGEX!|\.%%s$" ) ) set "temp_folders=!IGNORE_FOLDERS:/= !" for %%f in (!temp_folders!) do ( set "escaped_folder=%%f" set "escaped_folder=!escaped_folder:.=\.!" set "escaped_folder=!escaped_folder:?=\?!" set "escaped_folder=!escaped_folder:*=\*!" if "!IGNORE_REGEX!"=="" ( set "IGNORE_REGEX=\\!escaped_folder!\\|/!escaped_folder!/" ) else ( set "IGNORE_REGEX=!IGNORE_REGEX!|\\!escaped_folder!\\|/!escaped_folder!/" ) ) if "!IGNORE_REGEX!"=="" ( set "IGNORE_REGEX=^$" ) echo 忽略正则表达式: !IGNORE_REGEX! >> "!CRASH_LOG!" 2>&1 if /i "!VCS_TYPE!"=="Git" ( echo 开始获取Git文件列表(已应用忽略过滤) >> "!CRASH_LOG!" 2>&1 :: 确保.gitignore存在(首次使用时创建) if not exist ".gitignore" echo. > ".gitignore" :: 清理Git缓存(仅处理当前忽略列表中的文件夹) for %%f in (!temp_folders!) do ( set "clean_folder=%%f" if "!clean_folder:~-1!"=="/" set "clean_folder=!clean_folder:~0,-1!" if exist "!clean_folder!/" ( git rm -r --cached "!clean_folder!/" 2>> "!CRASH_LOG!" >nul 2>&1 git rm -r --cached "!clean_folder!/*" 2>> "!CRASH_LOG!" >nul 2>&1 ) ) :: 提交.gitignore变更 git add ".gitignore" 2>> "!CRASH_LOG!" :: 重新获取文件列表(此时.gitignore已生效) git status --porcelain 2>nul | powershell -Command "$ignoreRegex='!IGNORE_REGEX!'; $input | ForEach-Object { [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::Default.GetBytes($_)) } | Where-Object { $_ -notmatch $ignoreRegex } | Out-File -Encoding default '!FILE_LIST_TMP!'" :: 新增过滤逻辑:处理未跟踪文件(??状态)的特殊情况 type "!FILE_LIST_TMP!" | findstr /v /c:"?? 多项??" > "!FILE_LIST_TMP!.tmp" move /y "!FILE_LIST_TMP!.tmp" "!FILE_LIST_TMP!" >nul 2>&1 for /f "delims=" %%a in ('type "!FILE_LIST_TMP!"') do ( set "line=%%a" set "line=!line:"=!" set "status=!line:~0,2!" set "status=!status: =!" set "file_path=!line:~3!" :trim_git_path if "!file_path:~0,1!"==" " set "file_path=!file_path:~1!" & goto trim_git_path call :process_file "!status!" "!file_path!" ) ) else ( echo 开始获取SVN文件列表(已应用忽略过滤) >> "!CRASH_LOG!" 2>&1 svn status --non-interactive --recursive 2>nul | powershell -Command "$ignoreRegex='!IGNORE_REGEX!'; $input | Where-Object { $_ -notmatch $ignoreRegex } | Out-File -Encoding default '!FILE_LIST_TMP!'" for /r %%f in (*) do ( echo "%%f" | findstr /i /c:"\.svn\\" >nul 2>&1 if !errorlevel! equ 1 ( echo "%%f" | findstr /i /r "!IGNORE_REGEX!" >nul 2>&1 if !errorlevel! equ 1 ( set "is_new=1" for /f "tokens=2*" %%s in ('type "!FILE_LIST_TMP!"') do ( if "%%~f"=="%%~s%%t" set "is_new=0" ) set "is_excluded=0" for %%x in (!EXCLUDE_FILES!) do ( if /i "%%~nxf"=="%%x" set "is_excluded=1" ) if !is_new! equ 1 if !is_excluded! equ 0 ( echo ? "%%f" >> "!FILE_LIST_TMP!" ) ) else ( echo SVN扫描时忽略文件(后缀/文件夹匹配): %%f >> "!CRASH_LOG!" 2>&1 ) ) ) for /f "delims=" %%a in ('type "!FILE_LIST_TMP!"') do ( set "line=%%a" set "line=!line:"=!" set "status=!line:~0,1!" set "file_path=!line:~2!" :trim_svn_path if "!file_path:~0,1!"==" " set "file_path=!file_path:~1!" & goto trim_svn_path set "final_status=!" if "!status!"=="M" set "final_status=M" if "!status!"=="A" set "final_status=A" if "!status!"=="?" set "final_status=A" if "!status!"=="!" set "final_status=D" if "!status!"=="D" set "final_status=D" if not "!final_status!"=="" ( if not "!final_status!"=="D" ( if exist "!file_path!" ( if not exist "!file_path!\" ( call :process_file "!final_status!" "!file_path!" ) else ( echo 跳过目录: !file_path! >> "!CRASH_LOG!" 2>&1 ) ) else ( call :process_file "!final_status!" "!file_path!" ) ) ) ) ) del "!FILE_LIST_TMP!" >nul 2>&1 echo 获取文件列表完成,共!FILE_COUNT!个修改文件 >> "!CRASH_LOG!" 2>&1 :: ========================= 第四步:无修改文件处理 ========================= if !FILE_COUNT! equ 0 ( echo. echo 没有发现任何修改的文件 echo 请按任意键退出... echo 无修改文件,工具退出 >> "!CRASH_LOG!" 2>&1 pause >nul del "!COMMIT_MSG_FILE!" >nul 2>&1 del "!CRASH_LOG!" >nul 2>&1 exit /b 0 ) :: ========================= 第五步:显示文件列表 ========================= set "DUPLICATE_MARK=**" if /i "!VCS_TYPE!"=="Git" ( set "STATUS_DESC=Git: M=修改,A=新增,??=未跟踪" ) else ( set "STATUS_DESC=SVN: M=修改,A=新增,?=未跟踪" ) set "name_counts=" :: 存储 "文件名:出现次数" 的列表 for /l %%i in (1,1,!FILE_COUNT!) do ( call set "full_path=%%FILE_REL_PATH[%%i]%%" for %%f in ("!full_path!") do set "file_name=%%~nxf" :: 提取文件名 set "found=0" set "new_counts=" for %%c in (!name_counts!) do ( for /f "tokens=1,2 delims=:" %%n in ("%%c") do ( if "%%n"=="!file_name!" ( :: 已存在,次数+1 set /a new_count=%%o+1 set "new_counts=!new_counts! !file_name!:!new_count!" set "found=1" ) else ( :: 不存在,保留原记录 set "new_counts=!new_counts! %%c" ) ) ) if !found! equ 0 ( set "new_counts=!new_counts! !file_name!:1" ) set "name_counts=!new_counts:~1,-1!" ) for /l %%i in (1,1,!FILE_COUNT!) do ( call set "full_path=%%FILE_REL_PATH[%%i]%%" for %%f in ("!full_path!") do set "file_name=%%~nxf" set "is_duplicate=0" for %%c in (!name_counts!) do ( for /f "tokens=1,2 delims=:" %%n in ("%%c") do ( if "%%n"=="!file_name!" if %%o geq 2 ( set "is_duplicate=1" ) ) ) :: 保存标记结果 set "IS_DUPLICATE[%%i]=!is_duplicate!" ) echo. echo 本次修改的文件(!STATUS_DESC! **为重名文件): echo ---------------------------------------------------------- for /l %%i in (1,1,!FILE_COUNT!) do ( call set "STATUS=%%FILE_STATUS[%%i]%%" call set "REL_PATH=%%FILE_REL_PATH[%%i]%%" call set "is_duplicate=%%IS_DUPLICATE[%%i]%%" if "!is_duplicate!"=="1" ( echo %%i. [!STATUS!] !DUPLICATE_MARK! 路径: !REL_PATH! ) else ( echo %%i. [!STATUS!] 路径: !REL_PATH! ) ) echo ---------------------------------------------------------- echo. :: ========================= 第六步:自动暂存所有修改 ========================= echo 正在自动暂存所有修改... >> "!CRASH_LOG!" 2>&1 if /i "!VCS_TYPE!"=="Git" ( git add . 2>> "!CRASH_LOG!" if !errorlevel! equ 0 ( echo Git自动暂存完成 ) else ( echo Git暂存警告:部分文件可能未暂存(详见崩溃日志) ping -n 2 127.0.0.1 >nul 2>&1 ) ) else ( for /l %%i in (1,1,!FILE_COUNT!) do ( call set "STATUS=%%FILE_STATUS[%%i]%%" call set "FULL_PATH=%%FILE_FULL_PATH[%%i]%%" if "!STATUS!"=="A" ( svn add "!FULL_PATH!" 2>> "!CRASH_LOG!" ping -n 1 127.0.0.1 >nul 2>&1 ) ) echo SVN自动暂存完成 ) echo 暂存操作结束 >> "!CRASH_LOG!" 2>&1 :: ========================= 第七步:确认提交文件 ========================= echo. echo ====================== 确认提交文件 ====================== echo 请确认以下文件是否需要提交(输入 Y 提交,N 跳过,直接回车默认提交) echo ---------------------------------------------------------- set "current_file=1" :file_loop if !current_file! gtr !FILE_COUNT! goto end_file_loop call set "CUR_STATUS=%%FILE_STATUS[!current_file!]%%" call set "CUR_REL_PATH=%%FILE_REL_PATH[!current_file!]%%" call set "CUR_NAME=%%FILE_LIST[!current_file!]%%" :confirm_retry set "USER_CHOICE=" call set /p "USER_CHOICE=!current_file!. [%%CUR_STATUS%%] %%CUR_REL_PATH%% 是否提交?(Y/N/回车默认Y): " if "!USER_CHOICE!"=="" set "USER_CHOICE=Y" if /i "!USER_CHOICE!" neq "Y" if /i "!USER_CHOICE!" neq "N" ( echo 输入错误!仅支持 Y(提交)、N(跳过)或直接回车(默认提交),请重新输入。 goto confirm_retry ) if /i "!USER_CHOICE!"=="Y" ( set /a SELECTED_COUNT+=1 call set "SELECTED_PATH[!SELECTED_COUNT!]=%%CUR_REL_PATH%%" call set "SELECTED_NAME[!SELECTED_COUNT!]=%%CUR_NAME%%" call set "SELECTED_STATUS[!SELECTED_COUNT!]=%%CUR_STATUS%%" ) else ( echo 用户选择跳过:!CUR_REL_PATH! >> "!CRASH_LOG!" 2>&1 ) set /a current_file+=1 goto file_loop :end_file_loop if !SELECTED_COUNT! equ 0 ( echo. echo 未选择任何文件提交,即将退出工具... echo 未选中任何提交文件,工具退出 >> "!CRASH_LOG!" 2>&1 del "%COMMIT_MSG_FILE%" >nul 2>&1 for /l %%s in (3,-1,1) do ( echo 倒计时 %%s 秒... call :accurate_delay 1000 ) del "!CRASH_LOG!" >nul 2>&1 exit /b 0 ) echo. echo ---------------------------------------------------------- echo 本次确认提交的文件(共 !SELECTED_COUNT! 个): for /l %%i in (1,1,!SELECTED_COUNT!) do ( echo %%i. [!SELECTED_STATUS[%%i]!] !SELECTED_PATH[%%i]! ) echo ---------------------------------------------------------- echo 选中!SELECTED_COUNT!个文件待提交 >> "!CRASH_LOG!" 2>&1 :: ========================= 第八步:提交信息输入 ========================= :type_input echo 第一项(类型)可选:feat(新功能开发),fix(问题修复),docs(文档变更),style(代码格式调整),refactor(代码重构),perf(优化性能),init(初次提交),safety(安规变更),tag(归档软件),branch(创建分支) set "COMMIT_TYPE_INPUT=" set /p "COMMIT_TYPE_INPUT=请输入提交类型(例:feat): " set "temp_type=!COMMIT_TYPE_INPUT: =!" if "!temp_type!"=="" ( echo 提交类型不能为空,请重新输入! goto type_input ) set "valid_types=feat fix docs style refactor perf init safety tag branch test" set "is_valid=0" for %%t in (!valid_types!) do ( if /i "!temp_type!"=="%%t" set "is_valid=1" ) if "!is_valid!"=="0" ( echo 提交类型无效,请从可选项中选择! goto type_input ) echo 提交类型:!COMMIT_TYPE_INPUT! >> "!CRASH_LOG!" 2>&1 :module_input echo 第二项(模块)可选:ARM(ARM软件),DSP(DSP软件),BAT(电池软件),HMI(显示软件),AFCI(拉弧软件),BI(BI盒软件),PID(PID软件) set "COMMIT_MODULE_INPUT=" set /p "COMMIT_MODULE_INPUT=请输入所属模块(不区分大小写. 例:ARM): " set "temp_module=!COMMIT_MODULE_INPUT: =!" if "!temp_module!"=="" ( echo 所属模块不能为空,请重新输入! goto module_input ) set "valid_modules=ARM DSP BAT HMI AFCI BI PID" set "is_valid=0" for %%m in (!valid_modules!) do ( if /i "!temp_module!"=="%%m" set "is_valid=1" ) if "!is_valid!"=="0" ( echo 所属模块无效,请从可选项中选择! goto module_input ) echo 提交模块:!COMMIT_MODULE_INPUT! >> "!CRASH_LOG!" 2>&1 :desc_input echo 请选择提交模式: echo 1. 默认提交(需填写修改描述,任意输入或回车默认此项) echo 2. 跳过流程提交(初次提交或无内容,填充为无描述,跳过后续输入) set "commit_mode=" set /p "commit_mode=请选择(1/2):" if "!commit_mode!"=="" set "commit_mode=1" if "!commit_mode!"=="2" ( set "COMMIT_DESC_INPUT=本次为初次/省略上传提交文件" echo 已自动填充提交描述 >> "!CRASH_LOG!" 2>&1 ) else ( set "COMMIT_DESC_INPUT=" set /p "COMMIT_DESC_INPUT=请输入提交修改描述概要(至少10个字符.例:本次对主程序关键功能进行完善。): " set "temp_desc=!COMMIT_DESC_INPUT: =!" if "!temp_desc!"=="" ( echo 提交描述不能为空,请重新输入! goto desc_input ) if "!temp_desc:~10!"=="" ( echo 提交描述长度不足10个字符,请重新输入! goto desc_input ) ) echo 提交描述:!COMMIT_DESC_INPUT! >> "!CRASH_LOG!" 2>&1 set "COMMIT_TITLE=[!COMMIT_TYPE_INPUT!][!COMMIT_MODULE_INPUT!]: !COMMIT_DESC_INPUT!" powershell -Command "$text = '!COMMIT_TITLE!'; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" echo 提交标题写入完成 >> "!CRASH_LOG!" 2>&1 if "!commit_mode!"=="2" ( set "TASK_ID_INPUT=req-0" set "TASK_ID=!DEFAULT_TASKID_PREFIX!!TASK_ID_INPUT!" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n!TASK_ID!\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n#Description:\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" for /l %%i in (1,1,!SELECTED_COUNT!) do ( set "REL_PATH=!SELECTED_PATH[%%i]!" for %%f in ("!REL_PATH!") do set "PURE_FILENAME=%%~nxf" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n-%%i#.!PURE_FILENAME!:无描述\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" ) powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n#Test Suggestions:\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n- 无\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n#Self Testing Items:\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n- 无\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" goto call_tortoise ) :taskid_input set "TASK_ID_INPUT=" set /p "TASK_ID_INPUT=请输入TaskID内容(统一对象为禅道号,前缀:%DEFAULT_TASKID_PREFIX%,需以bug或req开头.例:req-1,直接回车默认req-0): " if "!TASK_ID_INPUT!"=="" ( echo 未输入TaskID,已自动填充默认值:req-0 set "TASK_ID_INPUT=req-0" ) else ( set "temp_taskid=!TASK_ID_INPUT!" for /f "delims=" %%i in ('powershell -Command "$input.ToLower()" ^<nul ^& echo !temp_taskid!') do set "temp_taskid_lower=%%i" if "!temp_taskid_lower:~0,3!" neq "bug" if "!temp_taskid_lower:~0,3!" neq "req" ( echo TaskID不符合规范,请重新输入! goto taskid_input ) ) set "TASK_ID=!DEFAULT_TASKID_PREFIX!!TASK_ID_INPUT!" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n!TASK_ID!\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n#Description:\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" for /l %%i in (1,1,!SELECTED_COUNT!) do ( set "REL_PATH=!SELECTED_PATH[%%i]!" set "DESC_TEMP_FILE=%temp%\desc_%%i.tmp" del "!DESC_TEMP_FILE!" >nul 2>&1 echo 请输入对 !REL_PATH! 的描述(分段式输入,空行回车结束输入,例:修改该文件的xx接口功能) call :read_robust_segment "!DESC_TEMP_FILE!" if exist "!DESC_TEMP_FILE!" ( for %%f in ("!REL_PATH!") do set "PURE_FILENAME=%%~nxf" powershell -Command "$content = (Get-Content '!DESC_TEMP_FILE!' -Raw) -replace '[\r\n\s]+', ''; $text = Get-Content '!COMMIT_MSG_FILE!' -Raw; $text += \"`r`n-%%i#.!PURE_FILENAME!:$content\"; Set-Content '!COMMIT_MSG_FILE!' -Value $text -Encoding UTF8" del "!DESC_TEMP_FILE!" >nul 2>&1 ) else ( for %%f in ("!REL_PATH!") do set "PURE_FILENAME=%%~nxf" powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n-%%i#.!PURE_FILENAME!:无描述\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" ) ) powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n#Test Suggestions:\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" set "TEST_SUGGESTION_TEMP=%temp%\test_suggestion.tmp" del "!TEST_SUGGESTION_TEMP!" >nul 2>&1 echo 请输入测试建议(非必填,可直接回车跳过,分段式输入,空行回车结束输入) call :read_robust_segment "!TEST_SUGGESTION_TEMP!" if exist "!TEST_SUGGESTION_TEMP!" ( powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $desc = [System.IO.File]::ReadAllText('!TEST_SUGGESTION_TEMP!', [System.Text.Encoding]::Default); $lines = $desc -split \"`r`n\"; foreach ($line in $lines) { if ($line -ne \"\") { $text += \"`r`n- $line\" } }; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" del "!TEST_SUGGESTION_TEMP!" >nul 2>&1 ) else ( powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n- 无\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" ) powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n#Self Testing Items:\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" set "SELF_TEST_TEMP=%temp%\self_test.tmp" del "!SELF_TEST_TEMP!" >nul 2>&1 echo 请输入自测项目(非必填,可直接回车跳过,分段式输入,空行回车结束输入) call :read_robust_segment "!SELF_TEST_TEMP!" if exist "!SELF_TEST_TEMP!" ( powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $desc = [System.IO.File]::ReadAllText('!SELF_TEST_TEMP!', [System.Text.Encoding]::Default); $lines = $desc -split \"`r`n\"; foreach ($line in $lines) { if ($line -ne \"\") { $text += \"`r`n- $line\" } }; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" del "!SELF_TEST_TEMP!" >nul 2>&1 ) else ( powershell -Command "$text = [System.IO.File]::ReadAllText('!COMMIT_MSG_FILE!', [System.Text.Encoding]::UTF8); $text += \"`r`n- 无\"; [System.IO.File]::WriteAllText('!COMMIT_MSG_FILE!', $text, [System.Text.Encoding]::UTF8)" ) :call_tortoise :: ========================= 第九步:调用Tortoise工具 ========================= if /i "!VCS_TYPE!"=="Git" ( set "TORTOISE_EXE=TortoiseGitProc.exe" set "TORTOISE_NAME=TortoiseGit" set "PATH_CACHE_FILE=%temp%\vcs_tortoise_path_git.txt" ) else ( set "TORTOISE_EXE=TortoiseProc.exe" set "TORTOISE_NAME=TortoiseSVN" set "PATH_CACHE_FILE=%temp%\vcs_tortoise_path_svn.txt" ) set "TORTOISE_PATH=" if exist "!PATH_CACHE_FILE!" ( set /p "TORTOISE_PATH_CACHED=" < "!PATH_CACHE_FILE!" if exist "!TORTOISE_PATH_CACHED!" ( set "TORTOISE_PATH=!TORTOISE_PATH_CACHED!" echo 使用上次记录的 !TORTOISE_NAME! 路径: !TORTOISE_PATH! ) ) if not exist "!TORTOISE_PATH!" ( if /i "!VCS_TYPE!"=="Git" ( set "REG_KEY=HKLM\SOFTWARE\TortoiseGit" ) else ( set "REG_KEY=HKLM\SOFTWARE\TortoiseSVN" ) for /f "tokens=2* skip=2" %%a in ('reg query "!REG_KEY!" /v "InstallPath" 2^>nul') do ( set "TORTOISE_PATH=%%b\bin\!TORTOISE_EXE!" ) if not exist "!TORTOISE_PATH!" ( if /i "!VCS_TYPE!"=="Git" ( set "REG_KEY=HKLM\SOFTWARE\Wow6432Node\TortoiseGit" ) else ( set "REG_KEY=HKLM\SOFTWARE\Wow6432Node\TortoiseSVN" ) for /f "tokens=2* skip=2" %%a in ('reg query "!REG_KEY!" /v "InstallPath" 2^>nul') do ( set "TORTOISE_PATH=%%b\bin\!TORTOISE_EXE!" ) ) if not exist "!TORTOISE_PATH!" ( if /i "!VCS_TYPE!"=="Git" ( set "TORTOISE_PATH=C:\Program Files\TortoiseGit\bin\!TORTOISE_EXE!" if not exist "!TORTOISE_PATH!" ( set "TORTOISE_PATH=C:\Program Files (x86)\TortoiseGit\bin\!TORTOISE_EXE!" ) ) else ( set "TORTOISE_PATH=C:\Program Files\TortoiseSVN\bin\!TORTOISE_EXE!" if not exist "!TORTOISE_PATH!" ( set "TORTOISE_PATH=C:\Program Files (x86)\TortoiseSVN\bin\!TORTOISE_EXE!" ) ) ) ) :path_input_loop if not exist "!TORTOISE_PATH!" ( echo. echo 提示:未找到 !TORTOISE_NAME! 安装路径 if exist "!PATH_CACHE_FILE!" ( echo 上次记录的路径已失效: !TORTOISE_PATH_CACHED! ) echo 请输入 !TORTOISE_EXE! 的完整路径(示例): if /i "!VCS_TYPE!"=="Git" ( echo C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe ) else ( echo C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe ) set "user_input_path=" set /p "user_input_path=请输入路径:" if "!user_input_path!"=="" ( echo 错误:路径不能为空,请重新输入! set "TORTOISE_PATH=" goto path_input_loop ) if not exist "!user_input_path!" ( echo 错误:路径不存在,请检查后重新输入! set "TORTOISE_PATH=" goto path_input_loop ) set "TORTOISE_PATH=!user_input_path!" echo !TORTOISE_PATH! > "!PATH_CACHE_FILE!" echo 已保存 !TORTOISE_NAME! 路径到缓存文件 ) if not exist "!PATH_CACHE_FILE!" ( echo !TORTOISE_PATH! > "!PATH_CACHE_FILE!" echo 已自动保存 !TORTOISE_NAME! 路径到缓存文件 ) :commit_attempt echo 正在打开 !TORTOISE_NAME! 提交界面... start /wait "" "!TORTOISE_PATH!" /command:commit /path:. /logmsgfile:"%COMMIT_MSG_FILE%" :: 检查提交结果并询问是否重试 echo. echo ============================================================== echo 检测到提交界面已关闭 echo 1. 不需要重新上传(直接回车默认此项) echo 2. 需要重新上传(再次打开提交界面) echo ============================================================== set "retry_choice=" set /p "retry_choice=请选择操作:" if "!retry_choice!"=="" set "retry_choice=1" if "!retry_choice!"=="2" ( echo 用户选择重新上传 >> "!CRASH_LOG!" 2>&1 goto commit_attempt ) else ( echo 用户选择不重新上传 >> "!CRASH_LOG!" 2>&1 ) :: ========================= 清理并退出 ========================= del "%COMMIT_MSG_FILE%" >nul 2>&1 echo. echo ============================================================== echo 操作完成,即将关闭程序... echo ============================================================== for /l %%s in (5,-1,1) do ( echo 倒计时 %%s 秒... call :accurate_delay 1000 ) endlocal exit /b 0 :: ========================= 子程序 ========================= :accurate_delay setlocal set "ms=%1" powershell -Command "$sw = [System.Diagnostics.Stopwatch]::StartNew(); while ($sw.ElapsedMilliseconds -lt %ms%) {}; $sw.Stop()" >nul 2>&1 endlocal exit /b 0 :read_robust_segment set "output_file=%~1" del "!output_file!" >nul 2>&1 set "segment_count=0" :robust_segment_loop set /a segment_count+=1 set "input_line=" set /p "input_line=第!segment_count!段: " if "!input_line!"=="" goto end_robust_segment if "!input_line!" neq "" ( if not exist "!output_file!" ( echo !input_line! > "!output_file!" ) else ( echo !input_line! >> "!output_file!" ) ) goto robust_segment_loop :end_robust_segment exit /b :clean_gitignore_duplicates :: 清理.gitignore中的重复行(保留顺序) if not exist ".gitignore" exit /b 0 set "temp_ignore=%temp%\gitignore_clean.tmp" powershell -Command "$content = Get-Content '.gitignore' | Where-Object { $_ -notmatch '^\s*$' }; $unique = @(); foreach ($line in $content) { if ($unique -notcontains $line) { $unique += $line } }; $unique | Set-Content '%temp_ignore%' -Encoding default" >nul 2>&1 move /y "%temp_ignore%" ".gitignore" >nul 2>&1 exit /b 0 :process_file set "status=%~1" set "file_path=%~2" if "!file_path!"=="" exit /b set "trimmed_path=!file_path!" :trim_left if "!trimmed_path:~0,1!"==" " set "trimmed_path=!trimmed_path:~1!" & goto trim_left :trim_right if "!trimmed_path:~-1!"==" " set "trimmed_path=!trimmed_path:~0,-1!" & goto trim_right if "!trimmed_path:~-1!"=="\" exit /b if exist "!trimmed_path!\" exit /b echo "!trimmed_path!" | findstr /i /r /c:"\\.svn\\" /c:"/.svn/" /c:"^.svn" >nul 2>&1 if !errorlevel! equ 0 ( echo 排除.svn相关文件:!trimmed_path! >> "!CRASH_LOG!" 2>&1 exit /b ) set "should_exclude=0" for %%f in (%EXCLUDE_FILES%) do ( if /i "!trimmed_path!"=="%%f" ( set "should_exclude=1" echo 排除文件:!trimmed_path! >> "!CRASH_LOG!" 2>&1 ) ) if "!should_exclude!"=="1" exit /b if "!status!"=="D" ( echo 跳过删除的文件:!trimmed_path! >> "!CRASH_LOG!" 2>&1 exit /b ) if /i "!VCS_TYPE!"=="SVN" ( if "!status!"=="?" set "status=A" ) set /a FILE_COUNT+=1 set "FILE_REL_PATH[!FILE_COUNT!]=!trimmed_path!" set "FILE_LIST[!FILE_COUNT!]=!trimmed_path!" set "FILE_STATUS[!FILE_COUNT!]=!status!" for %%p in ("!trimmed_path!") do ( if "%%~dp"=="" ( set "FILE_FULL_PATH[!FILE_COUNT!]=%cd%\%%~p" ) else ( set "FILE_FULL_PATH[!FILE_COUNT!]=%%~fp" ) ) echo 处理文件 [!FILE_COUNT!]: [!status!] !trimmed_path! >> "!CRASH_LOG!" 2>&1 exit /b 0我现在这个程序如果运行在SVN环境中,不能做到同git部分屏蔽文件夹名来跳过扫描整个文件夹及其子目录的功能,是否是因为SVN部分屏蔽所需条件不同,如果被SVN追踪的文件是否也会导致哪怕屏蔽名输入也被全部扫描到,我希望你实现和git完全相同的功能,采取针对SVN环境的实现方式,做到能通过输入文件夹名字来在扫描文件阶段直接跳过整个文件夹
最新发布
11-12
**&--------------------------------------------------------------------* **---------------------------------------------------------------------* ** PROGRAM ID :ZMMR0006 * ** DESCRIPTION :采购计划协议批导 * ** APPLICATION NAME :MM * ** TRANSACTION :N/A * ** DEVELOPMENT CLAS@5B@ :ZMIND001 * ** AUTHOR : * ** REQ DATE : * **---------------------------------------------------------------------* **=====================================================================* ** MODIFICATIONS * **---------------------------------------------------------------------* ** DATE CHANGE BY DESCRIPTION TR NO. * **---------------------------------------------------------------------* ** 20241229 采购计划协议批导 DS4K900065 * **---------------------------------------------------------------------* REPORT zmmr0006. *&---------------------------------------------------------------------* *& 包含 ZMMR0006_TOP *&---------------------------------------------------------------------* TYPE-POOLS: slis,icon,truxs. TABLES: sscrfields. DATA: functxt TYPE smp_dyntxt. *导入模板 DATA: BEGIN OF i_data, zxh(4) TYPE n, bsart TYPE string, "计划协议类型 ebeln TYPE string, "协议编号 bukrs TYPE string, "公司代码 * bstyp TYPE string, "凭证类别 lifnr TYPE string, "供应商 waers TYPE string, "货币 ekorg TYPE string, "采购组织 ekgrp TYPE string, "采购组 kdatb TYPE string, "有效起始日期 kdate TYPE string, "有效截至日期 aedat TYPE string, "协议日期 unsez TYPE string, " 我方参考 * ebelp TYPE string, "行项目 pstyp TYPE string, "项目类别 ematn TYPE string, "物料编码 txz01 TYPE string, "短文本 ktmng TYPE string, "目标数量 meins TYPE string, "订单单位 netpr TYPE string, "净价 peinh TYPE string, "价格单位 bprme TYPE string, "订单价格单位(采购) * matkl TYPE string, "物料组 werks TYPE string, "工厂 lgort TYPE string, "库存地点 * bstae TYPE string, "确认控制默认0001 uebtk TYPE string, "无限制过量交货 etfz1 TYPE string, "确定域 etfz2 TYPE string, "平衡域 kzstu TYPE string, "捆绑在MRP * loekz TYPE string , "删除标识 light(4) TYPE c, "执行情况 message TYPE string, "消息 END OF i_data. DATA: t_data LIKE TABLE OF i_data, "ALV显示 w_data LIKE LINE OF t_data. DATA: BEGIN OF l_data2 OCCURS 0, zxh(4) TYPE n, bsart TYPE ekko-bsart, "计划协议类型 ebeln TYPE ekko-ebeln, "协议编号 bukrs TYPE ekko-bukrs, "公司代码 * bstyp TYPE ekko-bstyp, "凭证类别 lifnr TYPE ekko-lifnr, "供应商 waers TYPE ekko-waers, "货币 ekorg TYPE ekko-ekorg, "采购组织 ekgrp TYPE ekko-ekgrp, "采购组 kdatb TYPE ekko-kdatb, "有效起始日期 kdate TYPE ekko-kdate, "有效截至日期 aedat TYPE ekko-aedat, "协议日期 unsez TYPE ekko-unsez, " 我方参考 * ebelp TYPE ekpo-ebelp, "行项目 pstyp TYPE ekpo-pstyp, "项目类别 ematn TYPE ekpo-ematn, "物料编码 txz01 TYPE ekpo-txz01, "短文本 ktmng TYPE ekpo-ktmng, "目标数量 meins TYPE ekpo-meins, "订单单位 netpr TYPE ekpo-netpr, "净价 peinh TYPE ekpo-peinh, "价格单位 bprme TYPE ekpo-bprme, "订单价格单位(采购) * matkl TYPE ekpo-matkl, "物料组 werks TYPE ekpo-werks, "工厂 lgort TYPE ekpo-lgort, "库存地点 * bstae TYPE ekpo-bstae, "确认控制默认0001 uebtk TYPE ekpo-uebtk, "无限制过量交货 etfz1 TYPE ekpo-etfz1, "确定域 etfz2 TYPE ekpo-etfz2, "平衡域 kzstu TYPE ekpo-kzstu, "捆绑在MRP * loekz TYPE ekpo-loekz , "删除标识 light(4) TYPE c, "执行情况 message TYPE string, "消息 END OF l_data2. DATA:ls_data2 LIKE l_data2, t_data_dl LIKE TABLE OF l_data2. "ALV显示 DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv, gd_repid LIKE sy-repid. DATA lv_c1(10) TYPE c. DATA lv_n1(2) TYPE n. DATA lv_ebelp TYPE ebelp. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-901. "单选按钮 PARAMETERS: p_dwload RADIOBUTTON GROUP ch DEFAULT 'X' USER-COMMAND a, p_upload RADIOBUTTON GROUP ch. SELECTION-SCREEN: FUNCTION KEY 1. PARAMETERS: p_file LIKE rlgrap-filename MODIF ID lo. "文件路径 SELECTION-SCREEN END OF BLOCK blk1. INITIALIZATION. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. PERFORM select_path. AT SELECTION-SCREEN OUTPUT. IF p_dwload = 'X'. LOOP AT SCREEN. IF screen-group1 = 'LO'. screen-active = '0'. ENDIF . IF screen-group1 = 'X'. screen-active = '0'. ENDIF. MODIFY SCREEN. ENDLOOP. ELSEIF p_upload = 'X'. LOOP AT SCREEN. IF screen-group1 = 'LO'. screen-active = '1'. ENDIF. IF screen-group1 = 'X'. screen-active = '1'. ENDIF. MODIFY SCREEN. ENDLOOP. ENDIF. START-OF-SELECTION. IF p_dwload = 'X'. * 下载模板 PERFORM temp_excel_get USING sy-repid. ELSE. IF NOT p_file IS INITIAL. CLEAR: t_data[]. * 数据导入 PERFORM upload_material_data. PERFORM get_data_pd. * FIELDCAT PERFORM build_fieldcatalog. * LAYOUT PERFORM build_layout. * ALV展示 PERFORM display_alv_report. ELSE. MESSAGE '请输入文件路径!' TYPE '@5B@' DISPLAY LIKE '@5C@'. LEAVE LIST-PROCESSING. ENDIF. ENDIF. *&---------------------------------------------------------------------* *& 包含 ZMMR0003_FORM *&---------------------------------------------------------------------* FORM temp_excel_get USING p_objid TYPE wwwdata-objid. "-----检查系统是否纯在模板 DATA: lv_objname TYPE wwwdata-objid. DATA: ls_objdata TYPE wwwdatatab. DATA:lv_ret TYPE abap_bool, lv_answer. "-----弹出选择存放的路径. DATA: lv_window_title TYPE string VALUE '文件下载', lv_default_extension TYPE string VALUE 'XLS', "缺省文件类型 lv_default_file_name TYPE string, lv_file_filter TYPE string VALUE 'EXCEL 文件 (*.XLS)|*.XLS|EXCEL 文件 (*.XLSX)|*.XLSX|所有文件 (*.*)|*.*|', lv_filename TYPE string, lv_path TYPE string, lv_fullpath TYPE string, lv_user_action TYPE i. DATA: lv_key TYPE wwwdatatab, lv_destination TYPE rlgrap-filename, lv_rc TYPE i, lv_temp TYPE c. "****---------------------------------------------- CLEAR:ls_objdata. *从SAP服务器中下载EXCEL模板 SELECT SINGLE relid objid text FROM wwwdata "存对象模板的表 INTO CORRESPONDING FIELDS OF ls_objdata WHERE srtf2 = 0 AND relid = 'MI' "有三种类型 HT MI IT AND objid = p_objid. "MONTLYSTOCK IF sy-subrc <> 0. MESSAGE 'EXCEL 模板不存在,请用TCODE:SMW0进行加载' TYPE '@5C@'. RETURN. ENDIF. IF ls_objdata-objid = space . MESSAGE 'EXCEL 模板不存在,请用TCODE:SMW0进行加载' TYPE '@5C@'. RETURN. ENDIF. lv_default_file_name = ls_objdata-text && sy-datum && '.XLS'."模板名称=系统中模板描述 "---检查模板是否存在 CALL METHOD cl_gui_frontend_services=>file_exist EXPORTING file = lv_default_file_name RECEIVING result = lv_ret EXCEPTIONS cntl_error = 1 error_no_gui = 2 wrong_parameter = 3 not_supported_by_gui = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING window_title = lv_window_title default_extension = lv_default_extension default_file_name = lv_default_file_name file_filter = lv_file_filter CHANGING filename = lv_filename "获得用户输入文件名 path = lv_path "获得用户所选路径 fullpath = lv_fullpath "路径加文件名 user_action = lv_user_action EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 invalid_default_file_name = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. IF lv_user_action = ( cl_gui_frontend_services=>action_ok ). * 下载模板 SELECT SINGLE * INTO CORRESPONDING FIELDS OF lv_key FROM wwwdata WHERE objid = p_objid . lv_destination = lv_fullpath. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING key = lv_key destination = lv_destination IMPORTING rc = lv_rc CHANGING temp = lv_temp. IF lv_rc <> 0. MESSAGE '下载EXCEL模板出错' TYPE '@5C@'. STOP. ENDIF. ELSE. MESSAGE '已取消选择下载文件!' TYPE '@5B@'. ENDIF. ENDIF. ENDFORM. " TEMP_EXCEL_GET FORM upload_material_data . DATA: lt_intern TYPE TABLE OF zalsmex_tabline, lw_intern TYPE zalsmex_tabline. DATA : ld_index TYPE i. FIELD-SYMBOLS: <fs>. *EXCEL导入 CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = p_file i_begin_col = 1 i_begin_row = 4 i_end_col = 26 i_end_row = 65535 TABLES intern = lt_intern EXCEPTIONS inconsistent_parameters = 1 upload_ole = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE 'EXCEL数据导入失败!' TYPE '@5C@'. ENDIF. * 数据保存到内表 LOOP AT lt_intern INTO lw_intern. MOVE lw_intern-col TO ld_index. ASSIGN COMPONENT ld_index OF STRUCTURE w_data TO <fs>. MOVE lw_intern-value TO <fs>. AT END OF row. APPEND w_data TO t_data. CLEAR w_data. ENDAT. ENDLOOP. LOOP AT t_data ASSIGNING FIELD-SYMBOL(<fs_t_data>). MOVE-CORRESPONDING <fs_t_data> TO ls_data2. APPEND ls_data2 TO l_data2. ENDLOOP. t_data_dl[] = l_data2[]. SORT t_data_dl BY zxh. DELETE ADJACENT DUPLICATES FROM t_data_dl COMPARING zxh. ENDFORM. FORM select_path . DATA v_matnr LIKE rlgrap-filename. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING mask = ',*.* ,*.*.' mode = 'O' title = '请选择要上传的信息文件' IMPORTING filename = v_matnr EXCEPTIONS inv_winsys = 1 no_batch = 2 selection_cancel = 3 selection_error = 4 OTHERS = 5. p_file = v_matnr. ENDFORM. " SELECT_PATH FORM build_fieldcatalog. CLEAR: fieldcatalog. DEFINE build_fieldcat. fieldcatalog-fieldname = &1. fieldcatalog-seltext_m = &2. fieldcatalog-outputlen = &3. IF fieldcatalog-fieldname = 'LIGHT'. fieldcatalog-key = 'X'. ENDIF. IF fieldcatalog-fieldname = 'MESSAGE'. fieldcatalog-emphasize = 'X'. fieldcatalog-key = 'X'. ENDIF. IF fieldcatalog-fieldname = 'EBELN'. fieldcatalog-key = 'X'. ENDIF. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. END-OF-DEFINITION. build_fieldcat 'ZXH' '序号' 10. build_fieldcat 'BSART' '计划协议类型' 10. build_fieldcat 'EBELN' '协议编号' 4. build_fieldcat 'BUKRS' '公司代码' 1. * build_fieldcat 'BSTYP' '凭证类别' 10. build_fieldcat 'LIFNR' '供应商' 4. build_fieldcat 'WAERS' '货币' 5. build_fieldcat 'EKORG' '采购组织' 4. build_fieldcat 'EKGRP' '采购组' 8. build_fieldcat 'KDATB' '有效起始日期' 8. build_fieldcat 'KDATE' '有效截至日期' 8. build_fieldcat 'AEDAT' '协议日期' 8. build_fieldcat 'UNSEZ' '我方参考' 8. * build_fieldcat 'EBELP' '行项目' 3. build_fieldcat 'PSTYP' '项目类别' 1. build_fieldcat 'EMATN' '物料编码' 40. build_fieldcat 'TXZ01' '短文本' 40. build_fieldcat 'KTMNG' '目标数量' 28. build_fieldcat 'MEINS' '订单单位' 3. build_fieldcat 'NETPR' '净价' 9. build_fieldcat 'PEINH' '价格单位' 4. build_fieldcat 'BPRME' '订单价格单位(采购)' 3. build_fieldcat 'WERKS' '工厂' 4. build_fieldcat 'LGORT' '库存地点' 4. * build_fieldcat 'BSTAE' '确认控制' 4. build_fieldcat 'UEBTK' '无限制过量交货' 1. build_fieldcat 'ETFZ1' '确定域' 3. build_fieldcat 'ETFZ2' '平衡域' 3. build_fieldcat 'KZSTU' '捆绑在MRP' 1. * build_fieldcat 'KZSTU' '捆绑在MRP' 1. build_fieldcat 'LIGHT' '执行情况' 1. build_fieldcat 'MESSAGE' '消息' 1. ENDFORM. "BUILD_FIELDCATALOG *&---------------------------------------------------------------------* *& FORM BUILD_LAYOUT *&---------------------------------------------------------------------* * LAYOUT *----------------------------------------------------------------------* FORM build_layout. gd_layout-colwidth_optimize = 'X'. gd_layout-zebra = 'X'. gd_layout-header_text = '库存期初批导'. ENDFORM. "BUILD_LAYOUT *&---------------------------------------------------------------------* *& FORM DISPLAY_ALV_REPORT *&---------------------------------------------------------------------* * ALV 展示 *----------------------------------------------------------------------* FORM display_alv_report. gd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid i_callback_pf_status_set = 'ALV_STATUS_SET' i_callback_user_command = 'FRM_USER_COMMAND' is_layout = gd_layout it_fieldcat = fieldcatalog[] i_save = 'A' TABLES t_outtab = l_data2[] EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. "DISPLAY_ALV_REPORT FORM alv_status_set USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'ZALV_STATUS' . ENDFORM. FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. "实时更新内表数据 DATA:ref_grid TYPE REF TO cl_gui_alv_grid. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = ref_grid. " 获取全局变量 CALL METHOD ref_grid->check_changed_data. " 获取响应事件 rs_selfield-refresh = 'X'. CASE r_ucomm. WHEN 'ZXZ'. PERFORM set_alv_data. ENDCASE. "刷新ALV CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = ref_grid. " 获取全局变量 CALL METHOD ref_grid->check_changed_data. " 获取响应事件 rs_selfield-refresh = 'X'. ENDFORM. FORM set_alv_data. TYPES: BEGIN OF ty_header, line(50) TYPE c, END OF ty_header. DATA: lv_filename TYPE string, lv_path TYPE string, lv_fullpath TYPE string, lv_destination LIKE rlgrap-filename, ls_objdata LIKE wwwdatatab, lv_objid TYPE wwwdatatab-objid, lv_fname TYPE string. DATA: lt_header TYPE STANDARD TABLE OF ty_header, " 内表 ls_header LIKE LINE OF lt_header. " 结构体 LOOP AT fieldcatalog ASSIGNING FIELD-SYMBOL(<fs_cat>). ls_header-line = <fs_cat>-seltext_m. APPEND ls_header TO lt_header. ENDLOOP. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING default_file_name = lv_fname window_title = '另存为:' default_extension = 'xls' "默认保存的类型 file_filter = '.xls' "选择要另存的文件类型 CHANGING filename = lv_filename path = lv_path fullpath = lv_fullpath EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. CALL FUNCTION 'GUI_DOWNLOAD' " 使用GUI_DOWNLOAD函数将内表数据导入到Excel文件中 EXPORTING filename = lv_filename filetype = 'DAT' TABLES data_tab = t_data fieldnames = lt_header EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 OTHERS = 22. ENDFORM. FORM get_file_name USING p_extension p_file_filter CHANGING p_fullpath. DATA: l_filename TYPE string, l_path TYPE string, l_fullpath TYPE string, l_titile TYPE string, l_init_dir TYPE string. CLEAR p_fullpath. l_titile = '采购计划协议批导'. l_init_dir = TEXT-t03. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING window_title = l_titile default_extension = '.XLSX' initial_directory = l_init_dir prompt_on_overwrite = 'X' file_filter = p_file_filter CHANGING filename = l_filename path = l_path fullpath = l_fullpath EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. p_fullpath = l_fullpath. ENDFORM. "GET_FILE_NAME FORM get_data_pd . DATA: ls_header TYPE bapimeoutheader, ls_headerx TYPE bapimeoutheaderx, ls_item TYPE bapimeoutitem, lt_item TYPE bapimeout_t_item, ls_itemx TYPE bapimeoutitemx, lt_itemx TYPE bapimeout_t_itemx, ls_item_con TYPE bapimeoutcondition, lt_item_con TYPE TABLE OF bapimeoutcondition, ls_item_conx TYPE bapimeoutconditionx, lt_item_conx TYPE TABLE OF bapimeoutconditionx, lt_validity TYPE TABLE OF bapimeoutvalidity, "条件的有效期间 ls_validity TYPE bapimeoutvalidity, lt_validityx TYPE TABLE OF bapimeoutvalidityx, "更改参数 - 条件的有效期间 ls_validityx TYPE bapimeoutvalidityx, ls_schedule TYPE bapimeoutschedule, lt_schedule TYPE bapimeout_t_schedule, ls_schedulex TYPE bapimeoutschedulex, lt_schedulex TYPE bapimeout_t_schedulex, l_ebeln TYPE bapimeoutheader-number, lt_return TYPE bapiret2_t, ls_return TYPE bapiret2. LOOP AT t_data_dl ASSIGNING FIELD-SYMBOL(<fs_dl>). ls_header-vendor = |{ <fs_dl>-lifnr ALPHA = IN } |."供应商 ls_header-number = <fs_dl>-ebeln. "采购凭证编号 ls_header-doc_type = <fs_dl>-bsart. "计划协议类型 ls_header-comp_code = <fs_dl>-bukrs. "公司代码 ls_header-purch_org = <fs_dl>-ekorg. "采购组织 ls_header-pur_group = <fs_dl>-ekgrp. "采购组 ls_header-vper_start = <fs_dl>-kdatb. "有效起始日期 ls_header-vper_end = <fs_dl>-kdate. "有效截至日期 ls_header-doc_date = <fs_dl>-aedat. "采购凭证日期 ls_header-our_ref = <fs_dl>-unsez. "我方参考 IF <fs_dl>-waers IS INITIAL. SELECT SINGLE lifnr,ekorg,waers FROM lfm1 INTO @DATA(ls_lfmi) WHERE lifnr = @<fs_dl>-lifnr. IF sy-subrc = 0. ls_header-currency = ls_lfmi-waers. "货币 ENDIF. ELSE. ls_header-currency = <fs_dl>-waers. "货币 ENDIF. ls_headerx-vendor = 'X'. "供应商 ls_headerx-doc_type = <fs_dl>-bsart. "公司代码 ls_headerx-number = 'X'. "采购凭证编号 ls_headerx-comp_code = 'X'. "公司代码 * ls_headerx-doc_type = 'X'. "采购凭证类型 ls_headerx-purch_org = 'X'. "采购组织 ls_headerx-pur_group = 'X'. "采购组 ls_headerx-vper_start = 'X'. "有效起始日期 ls_headerx-vper_end = 'X'. "有效截至日期 ls_headerx-doc_date = 'X'. "采购凭证日期 ls_headerx-our_ref = 'X'. "我方参考 ls_headerx-currency = 'X'. "货币 CLEAR: lt_item[],lt_itemx[],lt_schedule[],lt_schedulex[],ls_item_con,lt_item_con[]. CLEAR:lt_validityx,lt_validity. CLEAR: ls_item,ls_itemx. CLEAR: lv_c1, lv_n1,lv_ebelp. LOOP AT l_data2 ASSIGNING FIELD-SYMBOL(<fs_data2>) WHERE zxh = <fs_dl>-zxh. SELECT SINGLE matnr ,spras,maktx FROM makt INTO @DATA(ls_makt) WHERE matnr = @<fs_data2>-ematn AND spras = '1'. lv_ebelp = lv_ebelp + 10. "项目类别 ls_item-item_no = lv_ebelp. * IF sy-subrc = 0. lv_c1 = lv_c1 + 1. lv_n1 = lv_n1 + 1. CLEAR:ls_item_con,ls_item_conx. ls_item_con-item_no = lv_ebelp. ls_item_con-serial_id = lv_c1. ls_item_con-cond_count = lv_n1."'01'. ls_item_con-cond_type = 'PB00'. ls_item_con-cond_value = <fs_data2>-netpr."净价 ls_item_con-currency = ls_lfmi-waers."'RMB'."货币码 ls_item_con-cond_unit = <fs_data2>-meins."'EA'. ls_item_con-cond_p_unt = 1. ls_item_con-calctypcon = 'C'. APPEND ls_item_con TO lt_item_con. ls_item_conx-item_no = lv_ebelp. ls_item_conx-serial_id = lv_c1. ls_item_conx-cond_count = lv_n1."'01'. ls_item_conx-item_nox = 'X'. ls_item_conx-serial_idx = 'X'. ls_item_conx-cond_countx = 'X'. ls_item_conx-cond_type = 'X'. ls_item_conx-cond_value = 'X'. ls_item_conx-currency = 'X'. ls_item_conx-cond_unit = 'X'. ls_item_conx-cond_p_unt = 'X'. ls_item_conx-calctypcon = 'X'. APPEND ls_item_conx TO lt_item_conx. CLEAR:ls_validity,ls_validityx. ls_validity-item_no = lv_ebelp. ls_validity-serial_id = lv_c1. ls_validity-valid_from = <fs_dl>-kdatb. ls_validity-valid_to = <fs_dl>-kdate. APPEND ls_validity TO lt_validity. ls_validityx-item_no = lv_ebelp. ls_validityx-serial_id = lv_c1. ls_validityx-valid_from = 'X'. ls_validityx-valid_to = 'X'. APPEND ls_validityx TO lt_validityx. * ENDIF. ls_item-ematerial_long = <fs_data2>-ematn. "物料编号 ls_item-plant = <fs_data2>-werks. "工厂 ls_item-stge_loc = <fs_data2>-lgort. "存储地点 ls_item-net_price = <fs_data2>-netpr. "净价 ls_item-po_unit = <fs_data2>-meins. "采购订单计量单位 ls_item-short_text = ls_makt-maktx. "短文本 ls_item-target_qty = <fs_data2>-ktmng. "目标数量 ls_item-price_unit = <fs_data2>-peinh. "价格单位 ls_item-orderpr_un = <fs_data2>-bprme. "订单价格单位(采购) * ls_item-matl_group = <fs_data2>-matkl. "物料组 ls_item-item_cat = <fs_data2>-pstyp. "物料组 ls_item-conf_ctrl = '0001'. "确认控制 ls_item-unlimited_dlv = <fs_data2>-uebtk. "无限制过量交货 ls_item-firm_zone = <fs_data2>-etfz1. "确定的域 ls_item-trade_off = <fs_data2>-etfz2. "平衡区域 ls_item-binding_mrp = <fs_data2>-kzstu. "捆绑在MRP. * ls_item-delete_ind = <fs_input>-loekz. "删除标识. ls_item-info_upd = 'C'. "删除标识. APPEND ls_item TO lt_item. ls_itemx-item_no = lv_ebelp. "项目类别 ls_itemx-item_nox = 'X'. " ls_itemx-ematerial_long = 'X'. "物料编号 ls_itemx-plant = 'X'. "工厂 ls_itemx-stge_loc = 'X'. "存储地点 ls_itemx-net_price = 'X'. "净价 ls_itemx-po_unit = 'X'. "采购订单计量单位 ls_itemx-short_text = 'X'. "短文本 ls_itemx-target_qty = 'X'. "目标数量 ls_itemx-price_unit = 'X'. "价格单位 ls_itemx-orderpr_un = 'X'. "订单价格单位(采购) * ls_itemx-matl_group = 'X'. "物料组 ls_itemx-item_cat = 'X'. "采购凭证中的项目类别 ls_itemx-conf_ctrl = 'X'. "确认控制 ls_itemx-unlimited_dlv = 'X'. "无限制过量交货 ls_itemx-firm_zone = 'X'. "确定的域 ls_itemx-trade_off = 'X'. "平衡区域 ls_itemx-binding_mrp = 'X'. "捆绑在MRP. * ls_itemx-delete_ind = 'X'. "删除标识 ls_itemx-info_upd = 'X'. "删除标识 APPEND ls_itemx TO lt_itemx. ENDLOOP. IF <fs_dl>-ebeln IS INITIAL. IF l_data2-light NE '@5C@'. CALL FUNCTION 'BAPI_SAG_CREATE' EXPORTING header = ls_header headerx = ls_headerx IMPORTING purchasingdocument = l_ebeln TABLES return = lt_return item = lt_item itemx = lt_itemx item_cond_validity = lt_validity item_cond_validityx = lt_validityx item_condition = lt_item_con item_conditionx = lt_item_conx. ELSE. <fs_dl>-light = l_data2-light. <fs_dl>-message = l_data2-message. <fs_dl>-unsez = l_ebeln. ENDIF. ELSE. CALL FUNCTION 'BAPI_SAG_CHANGE' EXPORTING purchasingdocument = <fs_dl>-ebeln header = ls_header headerx = ls_headerx TABLES return = lt_return item = lt_item itemx = lt_itemx item_cond_validity = lt_validity item_cond_validityx = lt_validityx item_condition = lt_item_con item_conditionx = lt_item_conx. ENDIF. LOOP AT lt_return INTO ls_return WHERE type CA 'EA'. IF <fs_dl>-message IS INITIAL. <fs_dl>-message = ls_return-message. ELSE. <fs_dl>-message = |{ l_data2-message },{ ls_return-message }|. ENDIF. ENDLOOP. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. <fs_dl>-light = '@5C@'. ELSE. LOOP AT lt_return INTO ls_return . IF ls_return-type = 'S'. <fs_dl>-message = ls_return-message. ENDIF. ENDLOOP. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. <fs_dl>-light = '@5B@'. <fs_dl>-unsez = l_ebeln. ENDIF. CLEAR: ls_header,ls_headerx,l_ebeln,lt_return[],lt_item[],lt_itemx[],lt_validity[],lt_validityx[],lt_item_con[],lt_item_conx. ENDLOOP. SORT t_data_dl BY zxh. LOOP AT l_data2 ASSIGNING FIELD-SYMBOL(<fs_data>). READ TABLE t_data_dl INTO DATA(ls_data_dl) WITH KEY zxh = <fs_data>-zxh BINARY SEARCH. IF sy-subrc = 0. <fs_data>-unsez = ls_data_dl-unsez. <fs_data>-light = ls_data_dl-light. <fs_data>-message = ls_data_dl-message. ENDIF. ENDLOOP. ENDFORM.此代码中价格单位维护1000 但是me33l前台显示1 为什么 怎么解决
09-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值