vscode安装完continue插件调用deepseek R1的详细示例

时间: 2025-04-04 10:06:03 浏览: 49
### 调用 DeepSeek R1 模型的详细示例 在 VSCode 中通过 Continue 插件调用 DeepSeek R1 模型的过程可以分为几个核心部分:环境配置、插件集成以及实际调用方法。以下是详细的实现方式。 #### 1. 配置 API 密钥 为了使 Continue 插件能够访问 DeepSeek 的功能,需先获取并配置 DeepSeek 提供的 API 密钥。具体操作如下: - 登录到 DeepSeek 官方网站或管理平台,创建账户并申请专属 API 密钥。 - 将该密钥复制到本地环境中,在 VSCode 的 `settings.json` 文件中添加以下字段: ```json { "continue.apiKey": "your-deepseek-api-key-here" } ``` 此步骤确保了 Continue 插件可以通过网络请求连接到远程 DeepSeek 模型服务[^2]。 #### 2. 设置 Continue 插件参数 Continue 插件允许开发者自定义其行为以适配不同类型的 AI 模型。对于 DeepSeek R1 特定需求,可以在 `.continue/config.json` 文件中指定模型名称及相关超参: ```json { "model": "deepseek/r1", "temperature": 0.7, "maxTokens": 512, "topP": 0.9 } ``` 上述配置文件中的 `"model"` 字段指定了要使用的模型版本为 DeepSeek R1;其他参数则控制生成文本的质量与多样性。 #### 3. 实际调用代码片段 完成以上准备工作之后,即可利用 Continue 插件的功能来触发 DeepSeek R1 模型的任务执行。下面是一个简单的 Python 示例程序展示如何向模型提问并接收返回的结果: ```python import continue_sdk as sdk def query_deepseek(prompt): client = sdk.ContinueClient() response = client.generate_text( prompt=prompt, model="deepseek/r1", max_tokens=512, temperature=0.7 ) return response.text if __name__ == "__main__": result = query_deepseek("解释一下卷积神经网络的工作原理") print(result) ``` 在此脚本里,我们导入了官方提供的 SDK 并实例化了一个客户端对象用于发送 HTTP 请求给远端服务器上的 DeepSeek R1 模型。函数接受一个字符串形式的问题作为输入,并将其传递给 generate_text 方法处理后得到最终答案。 --- ### 注意事项 虽然本文提供了基本的操作流程指导,但在实践过程中可能还会遇到一些额外的技术挑战,比如性能瓶颈或者兼容性问题等。因此建议始终关注最新文档和技术社区动态以便及时调整解决方案[^1]。
阅读全文

相关推荐

import time import requests from rest_framework.decorators import api_view from rest_framework.response import Response import logging logger = logging.getLogger(__name__) @api_view(['POST']) def ai_answer_api(request): query = request.data.get("query") if not query: logger.error("问题为空") return Response({"success": False, "error": "问题不能为空"}, status=400) try: payload = { "query": query, "model": "deepseek-r1:1.5b" # 根据实际部署的模型名称调整 } max_attempts = 10 # 尝试次数 attempt = 0 answer = "" while attempt < max_attempts: try: response = requests.post("http://127.0.0.1:11434/api/chat", json=payload, timeout=10) except requests.exceptions.RequestException as req_ex: logger.exception("请求异常,尝试次数:%s", attempt) # 如果发生网络异常,等待后重试 time.sleep(2) attempt += 1 continue logger.info("Deepseek attempt %s: status=%s", attempt, response.status_code) logger.info("Deepseek attempt %s: content=%s", attempt, response.text) if response.status_code == 200: try: data = response.json() except Exception as ex: logger.exception("解析 JSON 失败") return Response({"success": False, "error": "解析 Deepseek 返回 JSON 失败"}, status=500) answer = data.get("message", {}).get("content", "") if answer.strip(): break else: # 回答为空时,等待后再试 time.sleep(2) attempt += 1 else: error_msg = f"Deepseek 错误, 状态码:{response.status_code}, 内容:{response.text}" logger.error(error_msg) return Response({"success": False, "error": error_msg}, status=500) if not answer.strip(): answer = "暂无回答,请稍后

int __fastcall sub_1004(int a1, int a2, int a3) { int v3; // r3 int v5; // r2 int v6; // r1 int v7; // r2 int v8; // r3 int v9; // r0 int v10; // r1 int v11; // r5 int v12; // r2 int v13; // r3 int v14; // r1 int v15; // r2 int v16; // r3 int i; // r0 int v18; // r1 int v19; // r2 _DWORD v21[7]; // [sp+4h] [bp-1Ch] BYREF v21[1] = a3; v3 = 0; v21[0] = 0; v5 = 0x40000000; do { if ( (v3 & 1) != 0 ) v6 = v5; else v6 = ~v5; ++v3; *(_DWORD *)v5 = v6; v5 += 4; } while ( v3 != 64 ); v21[0] = MEMORY[0x1C62000]; sub_368(v21, 3840, 1536); sub_368(v21, 12, 0); v7 = 11; MEMORY[0x1C62000] = v21[0] & 0xFFFF7F0F | 0xF0; while ( 2 ) { v8 = 0x40000000; v9 = 0; while ( 1 ) { v10 = (v9 & 1) != 0 ? v8 : ~v8; if ( v10 != *(_DWORD *)(v8 + (1 << (v7 + 11))) ) break; ++v9; v8 += 4; if ( v9 == 64 ) { v21[0] = v10; goto LABEL_16; } } if ( ++v7 != 17 ) continue; break; } v21[0] = v10; v7 = 16; LABEL_16: v11 = a1 + 16; sub_368(v11, 267386880, v7 << 20); sub_1DD4(10); v21[0] = MEMORY[0x1C62000]; sub_368(v21, 240, 160); sub_368(v21, 12, 4); sub_368(v21, 3840, 1536); v12 = 0; MEMORY[0x1C62000] = v21[0]; v13 = 0x40000000; do { if ( (v12 & 1) != 0 ) v14 = v13; else v14 = ~v13; if ( v14 != *(_DWORD *)(v13 + 2048) ) break; ++v12; v13 += 4; } while ( v12 != 64 ); v21[0] = v14; sub_368(v11, -268435456, (v12 != 64) << 28); sub_1DD4(10); v21[0] = MEMORY[0x1C62000]; sub_368(v21, 240, 160); sub_368(v21, 12, 0); sub_368(v21, 3840, 2560); v15 = 9; MEMORY[0x1C62000] = v21[0]; LABEL_23: v16 = 0x40000000; for ( i = 0; i != 64; ++i ) { if ( (i & 1) != 0 ) v18 = v16; else v18 = ~v16; if ( v18 != *(_DWORD *)(v16 + (1 << v15)) ) { if ( ++v15 != 14 ) goto LABEL_23; v21[0] = v18; LOBYTE(v15) = 13; goto LABEL_32; } v16 += 4; } v21[0] = v18; if ( v15 != 9 ) { LABEL_32: v19 = 1 << (v15 - 10); return sub_368(v11, 983040, v19 << 16); } v19 = 0; return sub_368(v11, 983040, v19 << 16); }这段伪代码的作用是什么?

#include<bits/stdc++.h> #define ll long long using namespace std; struct Node{ int v,p,sz; unsigned ll he; Node *cl,*cr; Node(int x):v(x),p(rand()),sz(1),he(x),cl(nullptr),cr(nullptr){} ~Node(){ delete cl; delete cr; } friend int siz(Node *x){ if(x==nullptr)return 0; return x->sz; } void push_up(){ sz=1; he=v*(1u<<siz(cl)); if(cl!=nullptr){ sz+=cl->sz; he+=cl->he; } if(cr!=nullptr){ sz+=cr->sz; he+=(1ull<<(siz(cl)+1))*cr->he; } } friend Node* merge(Node *x,Node *y){ if(x==nullptr)return y; if(y==nullptr)return x; if(x->p<y->p){ x->cr=merge(x->cr,y); x->push_up(); return x; }else{ y->cl=merge(x,y->cl); y->push_up(); return y; } } friend Node* split(Node *&x,int r){ if(x==nullptr)return nullptr; if(siz(x->cl)>=r){ Node *t=split(x->cl,r); swap(t,x->cl); x->push_up(); swap(t,x); return t; }else{ Node *t=split(x->cr,r-siz(x->cl)-1); x->push_up(); return t; } } friend void change(Node *&h,int x,Node w){ Node *wr=split(h,x),*dq=split(h,x-1); delete dq; h=merge(h,merge(new Node(w),wr)); } friend void add(Node *&h,int x,Node w){ Node *wr=split(h,x); h=merge(h,merge(new Node(w),wr)); } }; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin>>s; Node *tr1=nullptr,*tr2=nullptr; for(int i=0;i<s.size();++i){ tr1=merge(tr1,new Node(s[i]-'a'+1)); tr2=merge(tr2,new Node(s[i]-'a'+1)); } int T; cin>>T; while(T--){ char op; cin>>op; if(op=='Q'){ int x,y; cin>>x>>y; Node *r1=split(tr1,x-1),*r2=split(tr2,y-1); int ans=0; for(int i=20;i>=0;--i){ if(ans+(1<<i)>min(siz(r1),siz(r2)))continue; Node *rr1=split(r1,ans+(1<<i)),*rr2=split(r2,ans+(1<<i)); if(r1->he==r2->he)ans+=1<<i; merge(r1,rr1); merge(r2,rr2); } cout<<ans<<endl; tr1=merge(tr1,r1); tr2=merge(tr2,r2); }else if(op=='R'){ int x; char c; cin>>x>>c; change(tr1,x,Node(c-'a'+1)); change(tr2,x,Node(c-'a'+1)); }else{ int x; char c; cin>>x>>c; add(tr1,x,Node(c-'a'+1)); add(tr2,x,Node(c-'a'+1)); } } delete tr1; delete tr2; return 0; }debug # P4036 [JSOI2008] 火星人 ## 题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀。 比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号: 序号 1 2 3 4 5 6 7 8 9 10 11 字符 m a d a m i m a d a m 现在,火星人定义了一个函数 $LCQ(x, y)$,表示:该字符串中第 $x$ 个字符开始的字串,与该字符串中第 $y$ 个字符开始的字串,两个字串的公共前缀的长度。比方说,$LCQ(1, 7) = 5, LCQ(2, 10) = 1, LCQ(4, 7) = 0$ 在研究 $LCQ$ 函数的过程中,火星人发现了这样的一个关联:如果把该字符串的所有后缀排好序,就可以很快地求出 $LCQ$ 函数的值;同样,如果求出了 $LCQ$ 函数的值,也可以很快地将该字符串的后缀排好序。 尽管火星人聪明地找到了求取 $LCQ$ 函数的快速算法,但不甘心认输的地球人又给火星人出了个难题:在求取 $LCQ$ 函数的同时,还可以改变字符串本身。具体地说,可以更改字符串中某一个字符的值,也可以在字符串中的某一个位置插入一个字符。地球人想考验一下,在如此复杂的问题中,火星人是否还能够做到很快地求取 $LCQ$ 函数的值。 ## 输入格式 第一行给出初始的字符串。第二行是一个非负整数 $M$ ,表示操作的个数。接下来的M行,每行描述一个操作。操作有 $3$ 种,如下所示 1. 询问。语法:$Q$ $x$ $y$ ,$x$ ,$y$ 均为正整数。功能:计算 $LCQ(x,y)$ 限制:$1$ $\leq$ $x$ , $y$ $\leq$ 当前字符串长度 。 2. 修改。语法:$R$ $x$ $d$,$x$ 是正整数,$d$ 是字符。功能:将字符串中第 $x$ 个数修改为字符 $d$ 。限制:$x$ 不超过当前字符串长度。 3. 插入:语法:$I$ $x$ $d$ ,$x$ 是非负整数,$d$ 是字符。功能:在字符串第 $x$ 个字符之后插入字符 $d$ ,如果 $x=0$,则在字符串开头插入。限制:$x$ 不超过当前字符串长度 ## 输出格式 对于输入文件中每一个询问操作,你都应该输出对应的答案。一个答案一行。 ## 输入输出样例 #1 ### 输入 #1 madamimadam 7 Q 1 7 Q 4 8 Q 10 11 R 3 a Q 1 7 I 10 a Q 2 11 ### 输出 #1 5 1 0 2 1 ## 说明/提示 1. 所有字符串自始至终都只有小写字母构成。 2. $M\leq150,000$ 3. 字符串长度L自始至终都满足$L\leq100,000$ 4. 询问操作的个数不超过 $10,000$ 个。 对于第 $1$,$2$ 个数据,字符串长度自始至终都不超过 $1,000$ 对于第 $3$,$4$,$5$ 个数据,没有插入操作。 2024/07/40 更新一组 hack。

$NOMOD51 $INCLUDE (8051.MCU) ; 硬件定义 DAT BIT P2.0 ; DS18B20数据通信口 BUZZER BIT P3.2 ; 蜂鸣器控制引脚 DIG1 BIT P1.0 ; 数码管1位选 DIG2 BIT P1.1 ; 数码管2位选 ; 定时器常量 swpH EQU 0d2H ; 定时器高位初值 swpL EQU 0ffH ; 定时器低位初值 ; 变量定义 WDLSB DATA 30H ; 读出的温度低字节 WDMSB DATA 31H ; 读出的温度高字节 TEMP DATA 40H ; 温度整数值存储 ALARM_FLAG BIT 20H.0 ; 报警标志位 ALARM_COUNT_L DATA 50H ; 报警计时计数器低字节 ALARM_COUNT_H DATA 51H ; 报警计时计数器高字节 ; 常量定义 ALARM_DUR_L EQU 0B2H ; 434的低字节 (5秒报警) ALARM_DUR_H EQU 01H ; 434的高字节 (5秒报警) DIG_SELECT BIT 21H ; 数码管选择标志位 ; 程序入口 ;*************************************************************** ORG 0000H LJMP MAIN ORG 000BH LJMP TMR0_ISR ; 定时器0中断入口 ;******************************************************** ; 定时器T0中断服务程序 - 数码管显示和报警计时 TMR0_ISR: ; 重装定时器初值 MOV TH0, #swpH MOV TL0, #swpL ; 关闭所有数码管 SETB DIG1 SETB DIG2 ; 数码管选择显示 JB DIG_SELECT, DISPLAY_UNIT ; 显示十位 MOV P0, 42H CLR DIG1 ; 选中第一个数码管 SJMP DISPLAY_DONE DISPLAY_UNIT: ; 显示个位 MOV P0, 43H CLR DIG2 ; 选中第二个数码管 DISPLAY_DONE: CPL DIG_SELECT ; 切换数码管选择 ; 报警计时处理 JNB ALARM_FLAG, NO_ALARM_TIMING ; 不在报警状态则跳过 ; 16位计数器递增 INC ALARM_COUNT_L MOV A, ALARM_COUNT_L JNZ NO_HIGH_INC ; 低字节未溢出则跳过 INC ALARM_COUNT_H ; 低字节溢出时增加高字节 NO_HIGH_INC: ; 检查是否达到5秒报警时长 MOV A, ALARM_COUNT_L CJNE A, #ALARM_DUR_L, NO_ALARM_TIMING MOV A, ALARM_COUNT_H CJNE A, #ALARM_DUR_H, NO_ALARM_TIMING ; 达到5秒,关闭报警 CLR ALARM_FLAG SETB BUZZER ; 关闭蜂鸣器 MOV ALARM_COUNT_L, #0 ; 重置计数器 MOV ALARM_COUNT_H, #0 NO_ALARM_TIMING: RETI ;******************************************************** ; 主程序 MAIN: ; 初始化系统 CLR EA ; 关中断 MOV TMOD, #01H ; 定时器0模式1 MOV TH0, #swpH ; 定时器初值 MOV TL0, #swpL SETB EA ; 开中断 SETB ET0 ; 允许定时器0中断 SETB TR0 ; 启动定时器0 ; 初始化变量 MOV R2, #2 MOV R0, #42H INIT_LOOP: MOV @R0, #00H ; 清零显示缓冲区 INC R0 DJNZ R2, INIT_LOOP ; 初始化蜂鸣器(关闭) SETB BUZZER ; 初始化报警标志和计数器 CLR ALARM_FLAG MOV ALARM_COUNT_L, #0 MOV ALARM_COUNT_H, #0 CLR DIG_SELECT ; 初始选择十位数码管 ; 主循环 MAIN_LOOP: LCALL READ_TEMP ; 读取温度 ; 检查是否需要报警 JNB ALARM_FLAG, CHECK_ALARM ; 当前未报警则检查 SJMP LOOP_CONTINUE ; 已在报警中,跳过检测 CHECK_ALARM: ; 检查温度是否≥37℃ MOV A, TEMP CJNE A, #37, CHECK_TEMP ; 比较温度 CHECK_TEMP: JC LOOP_CONTINUE ; 温度<37℃,继续循环 ; 温度≥37℃,触发报警 SETB ALARM_FLAG ; 设置报警标志 CLR BUZZER ; 开启蜂鸣器 MOV ALARM_COUNT_L, #0 ; 重置计数器 MOV ALARM_COUNT_H, #0 LOOP_CONTINUE: LCALL DELAY10 ; 适当延时 SJMP MAIN_LOOP ; 继续主循环 ;********************************************************** ; 读取温度值 READ_TEMP: LCALL DS18B20_RESET ; 复位DS18B20 JNB F0, READ_END ; 复位失败则退出 ; 发送跳过ROM命令 MOV R0, #0CCH LCALL SEND_BYTE ; 发送温度转换命令 MOV R0, #44H LCALL SEND_BYTE ; 等待温度转换完成 SETB EA MOV 48H, #1 ; 约1秒延时 WAIT_CONVERSION: MOV 49H, #255 WAIT_LOOP1: MOV 4AH, #255 WAIT_LOOP0: DJNZ 4AH, WAIT_LOOP0 DJNZ 49H, WAIT_LOOP1 DJNZ 48H, WAIT_CONVERSION CLR EA ; 再次复位DS18B20 LCALL DS18B20_RESET JNB F0, READ_END ; 发送跳过ROM命令 MOV R0, #0CCH LCALL SEND_BYTE ; 发送读取温度命令 MOV R0, #0BEH LCALL SEND_BYTE ; 读取温度值 LCALL READ_BYTE MOV WDLSB, A ; 温度低字节 LCALL READ_BYTE MOV WDMSB, A ; 温度高字节 ; 转换温度值 LCALL CONVERT_TEMP READ_END: SETB EA RET ;********************************************************** ; 温度转换程序(取整数部分) CONVERT_TEMP: ; 提取温度整数部分 MOV A, WDLSB ANL A, #0F0H MOV R1, A MOV A, WDMSB ANL A, #0FH ORL A, R1 SWAP A ; 保存温度值用于报警判断 MOV TEMP, A ; 转换为十进制 MOV B, #10 DIV AB MOV 42H, A ; 十位数 MOV 43H, B ; 个位数 ; 转换为七段码 MOV DPTR, #SEG_TABLE MOV A, 42H MOVC A, @A+DPTR MOV 42H, A MOV A, 43H MOVC A, @A+DPTR MOV 43H, A RET ; 七段数码管编码表 (共阳极) SEG_TABLE: DB 0C0H ; 0 DB 0F9H ; 1 DB 0A4H ; 2 DB 0B0H ; 3 DB 099H ; 4 DB 092H ; 5 DB 082H ; 6 DB 0F8H ; 7 DB 080H ; 8 DB 090H ; 9 ;************************************************* ; DS18B20复位程序 DS18B20_RESET: SETB DAT NOP NOP CLR DAT MOV R6, #250 DJNZ R6, $ MOV R6, #50 DJNZ R6, $ SETB DAT MOV R6, #15 DJNZ R6, $ CALL CHECK_PRESENCE MOV R6, #60 DJNZ R6, $ SETB DAT RET ; 检查DS18B20存在脉冲 CHECK_PRESENCE: MOV C, DAT JC NO_DS18B20 SETB F0 ; 存在DS18B20 SJMP PRESENCE_END NO_DS18B20: CLR F0 ; 未检测到DS18B20 PRESENCE_END: RET ;************************************************* ; 发送一个字节程序 SEND_BYTE: MOV A, R0 MOV R5, #8 SEND_BIT: CLR C RRC A JC SEND_1 LCALL WRITE_0 ; 发送0 SJMP NEXT_BIT SEND_1: LCALL WRITE_1 ; 发送1 NEXT_BIT: DJNZ R5, SEND_BIT RET ;************************************************* ; 读一个字节程序 READ_BYTE: MOV R5, #8 MOV A, #0 READ_BIT: LCALL READ_DS18B20 RRC A DJNZ R5, READ_BIT MOV R0, A RET ;************************************************* ; 写0时序 WRITE_0: CLR DAT MOV R6, #30 DJNZ R6, $ SETB DAT RET ;************************************************* ; 写1时序 WRITE_1: CLR DAT NOP NOP NOP NOP NOP SETB DAT MOV R6, #30 DJNZ R6, $ RET ;************************************************* ; 读一位数据程序 READ_DS18B20: SETB DAT ; 释放总线 NOP NOP CLR DAT ; 启动读时序 NOP NOP SETB DAT ; 准备采样 NOP NOP NOP NOP NOP NOP NOP MOV C, DAT ; 读取数据位 MOV R6, #23 DJNZ R6, $ RET ;************************************************* ; 10ms延时子程序 DELAY10: MOV R4, #20 DELAY_LOOP2: MOV R5, #250 DELAY_LOOP1: DJNZ R5, DELAY_LOOP1 DJNZ R4, DELAY_LOOP2 RET END帮我新添加lcd显示功能并且上电后能正确运行程序

SAP abap程序名称report znmmr037. report znmmr037. include znmmx037ta. include znmmx037sa.include znmmx037fa.INITIALIZATION. MOVE '@2L@ Download the Excel template' TO BTN. AT SELECTION-SCREEN ON VALUE-REQUEST FOR GV_FILE. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING DEF_FILENAME = '*.*' DEF_PATH = GV_FILE MASK = ',*.*.' MODE = 'O' TITLE = 'Choose input file' IMPORTING FILENAME = GV_FILE EXCEPTIONS INV_WINSYS = 1 NO_BATCH = 2 SELECTION_CANCEL = 3 SELECTION_ERROR = 4 OTHERS = 5. AT SELECTION-SCREEN. CASE sy-ucomm. WHEN 'BTN1'. PERFORM FRM_DOWN_TEMPLATE. ENDCASE. *END ADD AT SELECTION-SCREEN OUTPUT . PERFORM FRM_MOD_SCREEN. start-of-selection. *modify by songjiaru 20200516 IF R1 = 'X'. PERFORM FRM_MAINTAIN_EMAIL."邮箱维护 ENDIF. IF R2 = 'X'. PERFORM FRM_QUERY. ENDIF. IF R3 = 'X'. PERFORM frm_check. perform frm_get_data. perform frm_output_data. ENDIF.*&---------------------------------------------------------------------* *& 包含 ZNMMX037TA *&---------------------------------------------------------------------* TABLES:NAST,EKKO,ZNMMT037. * MODIFY BY SONGJIARU 20200516 TABLES : LFA1 ,EKPO . *END MODFIY DATA:GS_LAYOUT TYPE LVC_S_LAYO, GS_FCAT TYPE LVC_S_FCAT, GT_FCAT TYPE LVC_T_FCAT. DATA:BEGIN OF GS_DATA, LIFNR LIKE EKKO-LIFNR, EBELN LIKE EKKO-EBELN, EKORG LIKE EKKO-EKORG, EKGRP LIKE EKKO-EKGRP, WERKS LIKE EKPO-WERKS, BEDAT LIKE EKKO-BEDAT, BUKRS LIKE EKKO-BUKRS, NAME1 LIKE LFA1-NAME1, MCOD1 LIKE LFA1-MCOD1, ADRNR LIKE LFA1-ADRNR, SPRAS LIKE NAST-SPRAS, SMTP_ADDR LIKE ADR6-SMTP_ADDR, BOX TYPE C, ICON TYPE ICON-NAME, MESSAGE TYPE C LENGTH 120, ERDAT TYPE ZNMMT037-ERDAT, *add by songjiaru 20200519 FLAG TYPE C, *end add END OF GS_DATA. DATA:GT_DATA LIKE GS_DATA OCCURS 0, GS_DATA2 LIKE LINE OF GT_DATA. DATA:BEGIN OF GS_MAIL, ADRNR LIKE LFA1-ADRNR, SMTP_ADDR LIKE ADR6-SMTP_ADDR, END OF GS_MAIL. DATA:GT_MAIL LIKE GS_MAIL OCCURS 0. *ADD BY SONGJIARU 20200516 DATA: V_EXCEL TYPE OLE2_OBJECT, V_SHEET TYPE OLE2_OBJECT, V_BOOK TYPE OLE2_OBJECT, V_CELL TYPE OLE2_OBJECT, V_RANGE TYPE OLE2_OBJECT, V_FONT TYPE OLE2_OBJECT, V_COLOR TYPE OLE2_OBJECT, V_COLUMN TYPE OLE2_OBJECT, BORDERS TYPE OLE2_OBJECT. DATA : BEGIN OF GS_ITEM , LIFNR LIKE LFA1-LIFNR, EKORG LIKE EKKO-EKORG, WERKS LIKE EKPO-WERKS, EKGRP LIKE EKKO-EKGRP, EMAIL LIKE ADR6-SMTP_ADDR, END OF GS_ITEM. DATA : GT_ITEM LIKE TABLE OF GS_ITEM. DATA : BEGIN OF GS_LFA1, LIFNR LIKE LFA1-LIFNR, NAME1 LIKE LFA1-NAME1, END OF GS_LFA1. DATA : GT_LFA1 LIKE TABLE OF GS_LFA1. DATA : BEGIN OF GS_EMAIL_ALV, LIFNR LIKE LFA1-LIFNR, NAME1 LIKE LFA1-NAME1, EKORG LIKE EKKO-EKORG, WERKS LIKE EKPO-WERKS, EMAIL LIKE ADR6-SMTP_ADDR, UNAME TYPE STRING, MESSAGE TYPE STRING, END OF GS_EMAIL_ALV. DATA : GT_EMAIL_ALV LIKE TABLE OF GS_EMAIL_ALV. DATA:GT_ALSM TYPE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE. FIELD-SYMBOLS:<GFS_DATA> TYPE ANY. DATA : GT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : GS_ZNMMT037A LIKE LINE OF GT_ZNMMT037A. DATA BEGIN OF GS_QUERY_ALV. INCLUDE TYPE ZNMMT037A. DATA : BOX TYPE C. DATA END OF GS_QUERY_ALV. DATA : GT_QUERY_ALV LIKE TABLE OF GS_QUERY_ALV. TYPES BEGIN OF GS_STRUCTURE . INCLUDE STRUCTURE GS_ZNMMT037A. TYPES FLAG TYPE C. TYPES END OF GS_STRUCTURE. DATA : GS_MESSAGE TYPE GS_STRUCTURE. DATA : GT_MESSAGE LIKE TABLE OF GS_MESSAGE. DEFINE GMRC_INITIAL_FIELD. "定义宏 GS_FIELDCAT-SELTEXT_L = &1. GS_FIELDCAT-SELTEXT_M = &1. GS_FIELDCAT-SELTEXT_S = &1. GS_FIELDCAT-FIELDNAME = &2. GS_FIELDCAT-FIX_COLUMN = &3. APPEND GS_FIELDCAT TO GT_FIELDCAT. END-OF-DEFINITION. DATA : GS_LAYOUT1 TYPE SLIS_LAYOUT_ALV, GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, GS_FIELDCAT LIKE LINE OF GT_FIELDCAT. DATA : GT_EVENTS TYPE SLIS_T_EVENT, GS_EVENTS TYPE SLIS_ALV_EVENT. DATA : BEGIN OF GS_WERKS, WERKS LIKE T001L-WERKS, FLAG TYPE C, END OF GS_WERKS. DATA : GT_WERKS LIKE TABLE OF GS_WERKS. data:begin of gt_detailtab2 occurs 0, info(999) type c, end of gt_detailtab2. data:lv_content_text type string. *END ADD&---------------------------------------------------------------------* *& 包含 ZNMMX037SA *&---------------------------------------------------------------------* *selection-screen begin of block bl1 with frame title text-001. *MODIFY BY SONGJIARU 20200516 PARAMETERS : R1 RADIOBUTTON GROUP G1 USER-COMMAND G1. PARAMETERS:GV_FILE LIKE RLGRAP-FILENAME MODIF ID M1 MEMORY ID PID. SELECTION-SCREEN PUSHBUTTON /35(45) BTN USER-COMMAND BTN1 MODIF ID M1. PARAMETERS : R2 RADIOBUTTON GROUP G1 . SELECT-OPTIONS : S_LIFNR1 FOR LFA1-LIFNR MODIF ID M2. SELECT-OPTIONS : S_EKORG1 FOR EKKO-EKORG MODIF ID M2. SELECT-OPTIONS : S_EKGRP1 FOR EKKO-EKGRP MODIF ID M2. SELECT-OPTIONS : S_WERKS FOR EKPO-WERKS MODIF ID M2. PARAMETERS : R3 RADIOBUTTON GROUP G1 DEFAULT 'X'. select-options:s_ebeln for ekko-ebeln MODIF ID M3, s_lifnr for ekko-lifnr MODIF ID M3, s_ekorg for ekko-ekorg MODIF ID M3, s_ekgrp for ekko-ekgrp MODIF ID M3, s_werks1 for ekpo-werks MODIF ID M3, s_bsart for ekko-bsart MODIF ID M3, s_bedat for ekko-bedat MODIF ID M3, s_spras for nast-spras MODIF ID M3. *END MODIFY *selection-screen end of block bl1. PARAMETERS:ck_wfs as CHECKBOX, c_multi as CHECKBOX. "多附件发送 *&---------------------------------------------------------------------* *& 包含 ZNMMX037FA *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_GET_DATA . *modify by songjiaru 20200519 SQL 性能优化 及 更改收件人邮箱取数逻辑 这里默认的是一个PO 只会存在一个工厂的数据 *不然没办法按照采购部的供应商+采购组织+工厂取ZNMMT037A来取数了 SELECT EKKO~EBELN , EKKO~BEDAT , EKKO~EKGRP , EKKO~LIFNR , EKKO~BUKRS , NAST~SPRAS , EKKO~EKORG , EKPO~WERKS INTO CORRESPONDING FIELDS OF TABLE @GT_DATA FROM EKKO INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN JOIN NAST ON NAST~OBJKY = EKKO~EBELN WHERE EKKO~EBELN IN @S_EBELN AND EKKO~LIFNR IN @S_LIFNR AND EKKO~EKORG IN @S_EKORG AND EKKO~EKGRP IN @S_EKGRP AND EKKO~BSART IN @S_BSART AND EKKO~BEDAT IN @S_BEDAT AND EKPO~WERKS IN @S_WERKS1 AND EKKO~FRGKE = '7' AND NAST~SPRAS IN @S_SPRAS. SORT GT_DATA BY EBELN. DELETE ADJACENT DUPLICATES FROM GT_DATA COMPARING EBELN. * LOOP AT GT_DATA INTO GS_DATA . * SELECT SINGLE * FROM ZNMMT037 * WHERE EBELN = GS_DATA-EBELN. * IF SY-SUBRC = 0. * IF CK_WFS = 'X'. * DELETE GT_DATA. * CONTINUE. * ENDIF. * GS_DATA-ICON = '@08@'. * GS_DATA-MESSAGE = '已有发送记录'. * GS_DATA-ERDAT = ZNMMT037-ERDAT. * ENDIF. * * SELECT SINGLE NAME1 MCOD1 ADRNR * INTO (GS_DATA-NAME1,GS_DATA-MCOD1,GS_DATA-ADRNR) * FROM LFA1 * WHERE LIFNR = GS_DATA-LIFNR. * * READ TABLE GT_MAIL INTO GS_MAIL WITH KEY ADRNR = GS_DATA-ADRNR BINARY SEARCH. * IF SY-SUBRC NE 0. * SELECT ADDRNUMBER SMTP_ADDR APPENDING TABLE GT_MAIL * FROM ADR6 * WHERE ADDRNUMBER = GS_DATA-ADRNR. * SORT GT_MAIL BY ADRNR. * ENDIF. * * LOOP AT GT_MAIL INTO GS_MAIL WHERE ADRNR = GS_DATA-ADRNR. * IF GS_DATA-SMTP_ADDR IS INITIAL. * GS_DATA-SMTP_ADDR = GS_MAIL-SMTP_ADDR. * ELSE. * GS_DATA-SMTP_ADDR = GS_DATA-SMTP_ADDR && ';' && GS_MAIL-SMTP_ADDR. * ENDIF. * ENDLOOP. * * MODIFY GT_DATA FROM GS_DATA. * ENDLOOP. DATA : LV_TABIX LIKE SY-TABIX. IF GT_DATA IS INITIAL. MESSAGE S322(ZMM) DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. SELECT * FROM ZNMMT037 FOR ALL ENTRIES IN @GT_DATA WHERE ZNMMT037~EBELN = @GT_DATA-EBELN INTO TABLE @DATA(LT_ZNMMT037). SORT LT_ZNMMT037 BY EBELN. DATA : LS_ZNMMT037 LIKE LINE OF LT_ZNMMT037. SELECT LFA1~LIFNR , LFA1~NAME1 , LFA1~MCOD1 FROM LFA1 WHERE LFA1~LIFNR IN @S_LIFNR INTO TABLE @DATA(LT_LFA1). SORT LT_LFA1 BY LIFNR. DATA : LS_LFA1 LIKE LINE OF LT_LFA1. SELECT ZNMMT037A~LIFNR , ZNMMT037A~EKORG , ZNMMT037A~WERKS ,ZNMMT037A~EKGRP,ZNMMT037A~EMAIL FROM ZNMMT037A FOR ALL ENTRIES IN @GT_DATA WHERE ZNMMT037A~LIFNR = @GT_DATA-LIFNR AND ZNMMT037A~EKORG = @GT_DATA-EKORG INTO TABLE @DATA(LT_ZNMMT037A) . SORT LT_ZNMMT037A BY LIFNR EKORG WERKS EKGRP . DATA : LS_ZNMMT037A LIKE LINE OF LT_ZNMMT037A. LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<LFS_DATA>). *------------填充发送记录---------------* CLEAR LS_ZNMMT037. READ TABLE LT_ZNMMT037 INTO LS_ZNMMT037 WITH KEY EBELN = <LFS_DATA>-EBELN BINARY SEARCH. IF SY-SUBRC = 0. IF CK_WFS = 'X'. <LFS_DATA>-FLAG = 'X'. CONTINUE. ENDIF. <LFS_DATA>-ICON = '@08@'. <LFS_DATA>-MESSAGE = TEXT-002. <LFS_DATA>-ERDAT = LS_ZNMMT037-ERDAT. ENDIF. *-----------填充供应商信息名字等等--------* CLEAR LS_LFA1. READ TABLE LT_LFA1 INTO LS_LFA1 WITH KEY LIFNR = <LFS_DATA>-LIFNR BINARY SEARCH. IF SY-SUBRC = 0. <LFS_DATA>-NAME1 = LS_LFA1-NAME1. <LFS_DATA>-MCOD1 = LS_LFA1-MCOD1. ENDIF. *--------填充供应商对应的邮件地址---------* *先根据供应商采购组织工厂采购员找,再根据供应商采购组织工厂找,如果找不到,就根据供应商采购组织找 CLEAR LS_ZNMMT037A. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = <LFS_DATA>-WERKS EKGRP = <LFS_DATA>-EKGRP BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = <LFS_DATA>-WERKS AND LS_ZNMMT037A-EKGRP = <LFS_DATA>-EKGRP. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ELSE. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = <LFS_DATA>-WERKS BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = <LFS_DATA>-WERKS. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ELSE. CLEAR LS_ZNMMT037A. READ TABLE LT_ZNMMT037A INTO LS_ZNMMT037A WITH KEY LIFNR = <LFS_DATA>-LIFNR EKORG = <LFS_DATA>-EKORG WERKS = '' BINARY SEARCH. IF SY-SUBRC = 0. LOOP AT LT_ZNMMT037A INTO LS_ZNMMT037A FROM SY-TABIX. IF LS_ZNMMT037A-LIFNR = <LFS_DATA>-LIFNR AND LS_ZNMMT037A-EKORG = <LFS_DATA>-EKORG AND LS_ZNMMT037A-WERKS = ''. IF <LFS_DATA>-SMTP_ADDR IS INITIAL. <LFS_DATA>-SMTP_ADDR = LS_ZNMMT037A-EMAIL && '/'. ELSE. CONCATENATE <LFS_DATA>-SMTP_ADDR LS_ZNMMT037A-EMAIL '/' INTO <LFS_DATA>-SMTP_ADDR. ENDIF. ELSE. EXIT. ENDIF. ENDLOOP. ENDIF. ENDIF. ENDIF. ENDLOOP. *end modify ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_OUTPUT_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_OUTPUT_DATA . DEFINE MAC_FCAT. CLEAR gs_fcat. gs_fcat-fieldname = &1. gs_fcat-coltext = &2. gs_fcat-key = &3. gs_fcat-ref_field = &4. gs_fcat-ref_table = &5. gs_fcat-just = &6. * IF &6 = 'R'. * gs_fcat-no_zero = 'X'. * ENDIF. if &1 = 'ICON'. gs_fcat-icon = 'X'. endif. APPEND gs_fcat TO gt_fcat. END-OF-DEFINITION. CLEAR GT_FCAT. IF SY-LANGU EQ '1'. MAC_FCAT 'EBELN' '采购订单号' '' 'EBELN' 'EKKO' ''. MAC_FCAT 'LIFNR' '供应商' '' 'LIFNR' 'LFA1' ''.. MAC_FCAT 'NAME1' '供应商名称' '' '' '' ''.. MAC_FCAT 'BEDAT' '凭证日期' ' ' '' '' ''. MAC_FCAT 'EKGRP' '采购组' ' ' '' '' ''. MAC_FCAT 'MCOD1' '简称' ' ' '' '' ''. MAC_FCAT 'SPRAS' '语言' ' ' 'SPRAS' 'NAST' ''. MAC_FCAT 'SMTP_ADDR' '供应商邮件' ' ' '' '' ''. MAC_FCAT 'ICON' '发送状态' ' ' '' '' ''. MAC_FCAT 'ERDAT' '发送日期' ' ' '' '' ''. MAC_FCAT 'MESSAGE' '消息' ' ' '' '' ''. ELSE. MAC_FCAT 'EBELN' 'PO' '' 'EBELN' 'EKKO' ''. MAC_FCAT 'LIFNR' 'Supplier' '' 'LIFNR' 'LFA1' ''.. MAC_FCAT 'NAME1' 'Supplier Name' '' '' '' ''.. MAC_FCAT 'BEDAT' 'Date' ' ' '' '' ''. MAC_FCAT 'EKGRP' 'Purchase Group' ' ' '' '' ''. MAC_FCAT 'MCOD1' 'Name For Short' ' ' '' '' ''. MAC_FCAT 'SPRAS' 'Language' ' ' 'SPRAS' 'NAST' ''. MAC_FCAT 'SMTP_ADDR' 'Email' ' ' '' '' ''. MAC_FCAT 'ICON' 'Status' ' ' '' '' ''. MAC_FCAT 'ERDAT' 'Send Date' ' ' '' '' ''. MAC_FCAT 'MESSAGE' 'Message' ' ' '' '' ''. ENDIF. GS_LAYOUT-ZEBRA = 'X'. GS_LAYOUT-CWIDTH_OPT = 'X'. GS_LAYOUT-BOX_FNAME = 'BOX'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = SY-REPID IS_LAYOUT_LVC = GS_LAYOUT IT_FIELDCAT_LVC = GT_FCAT I_SAVE = 'U' I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' TABLES T_OUTTAB = GT_DATA 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. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. DATA:LV_ANSWER TYPE C. DATA LR_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA : LV_CLSS TYPE C . "X 代表发送给供应商和采购员 ''代表发送给采购员 CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' " IMPORTING E_GRID = LR_GRID. CALL METHOD LR_GRID->CHECK_CHANGED_DATA. CASE R_UCOMM. WHEN 'EMAIL'. "保存事件 LV_CLSS = 'X'. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X' AND ICON NE '@08@'. IF GS_DATA-SMTP_ADDR IS NOT INITIAL. PERFORM FRM_SEND_MAIL USING GS_DATA-EBELN GS_DATA-SPRAS GS_DATA-EKGRP GS_DATA-MCOD1 GS_DATA-BUKRS GS_DATA-SMTP_ADDR LV_CLSS CHANGING GS_DATA-ICON GS_DATA-MESSAGE GS_DATA-ERDAT. ELSE. GS_DATA-ICON = '@0A@'. GS_DATA-MESSAGE = TEXT-003 ." ENDIF. MODIFY GT_DATA FROM GS_DATA. ENDLOOP. *ADD BY SONGJIARU 20200519 增加只发送给采购员 WHEN 'EMAIL1'. LV_CLSS = ''. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X' AND ICON NE '@08@'. * IF GS_DATA-SMTP_ADDR IS NOT INITIAL. PERFORM FRM_SEND_MAIL USING GS_DATA-EBELN GS_DATA-SPRAS GS_DATA-EKGRP GS_DATA-MCOD1 * GS_DATA-ADRNR GS_DATA-BUKRS GS_DATA-SMTP_ADDR LV_CLSS CHANGING GS_DATA-ICON GS_DATA-MESSAGE GS_DATA-ERDAT. * ELSE. * GS_DATA-ICON = '@0A@'. * GS_DATA-MESSAGE = '邮件为空,不能发送' ." * ENDIF. MODIFY GT_DATA FROM GS_DATA. ENDLOOP. WHEN 'DOWN'. LOOP AT GT_DATA INTO GS_DATA WHERE BOX = 'X'. PERFORM FRM_DOWN_PDF USING GS_DATA-EBELN GS_DATA-SPRAS. ENDLOOP. WHEN '&IC1'. IF RS_SELFIELD-FIELDNAME = 'EBELN'. READ TABLE GT_DATA INTO GS_DATA INDEX RS_SELFIELD-TABINDEX. IF SY-SUBRC = 0. SET PARAMETER ID 'BES' FIELD GS_DATA-EBELN. CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN. ENDIF. ENDIF. WHEN OTHERS. ENDCASE. RS_SELFIELD-REFRESH = 'X'."刷新ALV报表 RS_SELFIELD-COL_STABLE = 'X'. RS_SELFIELD-ROW_STABLE = 'X'. ENDFORM. "FRM_USER_COMMAND *&---------------------------------------------------------------------* *& Form frm_set_pf_status2 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->RT_EXTAB text *----------------------------------------------------------------------* FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'PF_STATUS'. ENDFORM. "FRM_SET_PF_STATUS *&---------------------------------------------------------------------* *& Form FRM_SEND_MAIL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> GS_DATA_EBELN *& --> GS_DATA_SPRAS *& <-- GS_DATA_ICON *& <-- GS_DATA_MESSAGE *& <-- ELSE *&---------------------------------------------------------------------* FORM FRM_SEND_MAIL USING P_EBELN P_SPRAS P_EKGRP P_MCOD1 P_BUKRS P_EMAIL P_CLSS CHANGING P_ICON P_MESSAGE P_ERDAT. DATA:LS_ZT37 LIKE ZNMMT037. DATA:LV_BUTXT LIKE T001-BUTXT. DATA:LT_CONTENT_BIN TYPE SOLIX_TAB. DATA: CL_SEND_REQUEST TYPE REF TO CL_BCS, CL_DOCUMENT TYPE REF TO CL_DOCUMENT_BCS, CL_BCS_EXCEPTION TYPE REF TO CX_BCS, CL_SENDER TYPE REF TO IF_SENDER_BCS, CL_RECIPIENT TYPE REF TO IF_RECIPIENT_BCS. DATA: LT_MAIN_TEXT TYPE BCSY_TEXT, LS_MAIN_TEXT LIKE LINE OF LT_MAIN_TEXT, LV_TITLE TYPE SO_OBJ_DES, LV_BOOL TYPE OS_BOOLEAN. DATA:LV_PATH TYPE STRING. DATA:LT_BIN TYPE TABLE OF TBL1024. DATA LV_CONTENT TYPE XSTRING. DATA LV_VLINE TYPE I. DATA : BEGIN OF LS_RECIEVE, EMAIL TYPE AD_SMTPADR, END OF LS_RECIEVE. DATA : LT_RECIEVE LIKE TABLE OF LS_RECIEVE. DATA : LV_INDEX1 TYPE I. DATA : LV_INDEX2 TYPE I. DATA : LV_INDEX3 TYPE I. LV_PATH = 'C:\PO\' && P_EBELN && '_' && SY-UZEIT && '.PDF'. PERFORM FRM_GET_PDF USING P_EBELN P_SPRAS LV_PATH CHANGING P_ICON P_MESSAGE. IF P_ICON IS INITIAL. CALL FUNCTION 'GUI_UPLOAD' EXPORTING FILENAME = LV_PATH FILETYPE = 'BIN' IMPORTING FILELENGTH = LV_VLINE TABLES DATA_TAB = LT_BIN[]. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING INPUT_LENGTH = LV_VLINE IMPORTING BUFFER = LV_CONTENT TABLES BINARY_TAB = LT_BIN EXCEPTIONS FAILED = 1 OTHERS = 2. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING BUFFER = LV_CONTENT IMPORTING OUTPUT_LENGTH = LV_VLINE TABLES BINARY_TAB = LT_CONTENT_BIN. TRY. * 创建发送请求 CL_SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ). SELECT SINGLE BUTXT INTO LV_BUTXT FROM T001 WHERE BUKRS = P_BUKRS. **处理标题头内容 CONCATENATE LV_BUTXT P_EBELN P_MCOD1 P_EKGRP INTO LV_TITLE SEPARATED BY SPACE. **处理邮件内容 *DG01 要求加上客制化描述 * IF P_BUKRS EQ 'DG01'. * IF SY-LANGU EQ '1'. * LS_MAIN_TEXT = * '附件是东莞长城开发新订单,请收到订单后邮件回复确认给采购员,并于3个工作日内在供应商平台上确认订单交期。供应商平台网址:https://sp.kaifa.cn '. * ELSE. * DATA(LV_STR) = 'The attachment is the new PO of Dongguan Kaifa Technology Co.,Ltd,' * && 'Please reply to the buyer after receiving the PO, and confirm the order delivery date on the supplier portal within 3 working days.' * && 'Supplier portal website(URL): https://sp.kaifa.cn '. * LS_MAIN_TEXT = LV_STR. * ENDIF. * APPEND LS_MAIN_TEXT TO LT_MAIN_TEXT. * ENDIF. * 创建整理发送内容 CL_DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT( I_TYPE = 'RAW' I_TEXT = LT_MAIN_TEXT I_SUBJECT = LV_TITLE ). * 添加附件 DATA:L_OBJTP TYPE SOODK-OBJTP. DATA:L_OBJDES TYPE SOOD-OBJDES. L_OBJTP = 'PDF'. * l_objdes = p_ebeln && p_mcod1. CONCATENATE LV_BUTXT P_EBELN P_MCOD1 P_EKGRP INTO L_OBJDES SEPARATED BY SPACE. CALL METHOD CL_DOCUMENT->ADD_ATTACHMENT EXPORTING I_ATTACHMENT_TYPE = L_OBJTP I_ATTACHMENT_SUBJECT = L_OBJDES I_ATT_CONTENT_HEX = LT_CONTENT_BIN. * 添加邮件内容到发送请求 CL_SEND_REQUEST->SET_DOCUMENT( CL_DOCUMENT ). * 指定邮件发件人为采购员邮箱 * data:lv_sendtype type SX_ADDRTYP value '*', * lv_address_string type string value '[email protected]', * lv_address_name type string value 'Yuli'. * cl_sender->ADDRESS_TYPE( lv_sendtype ). * cl_sender->ADDRESS_STRING( EXPORTING result = lv_address_string ). * cl_sender->ADDRESS_NAME( EXPORTING result = lv_address_name ). * cl_send_request->set_sender( cl_sender ). * data: sender type ref to cl_sapuser_bcs, * lv_uname type sy-uname value 'DTANG.IS'. * sender = cl_sapuser_bcs=>create( lv_uname ). * call method cl_send_request->set_sender * exporting * i_sender = sender. *modify by songjiaru 20200519 *----------------指定发件人----------------------------* CLEAR GS_MAIL-SMTP_ADDR. SELECT SINGLE SMTP_ADDR INTO GS_MAIL-SMTP_ADDR FROM T024 WHERE EKGRP = P_EKGRP. DATA(LO_SENDER) = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( I_ADDRESS_STRING = GS_MAIL-SMTP_ADDR I_ADDRESS_NAME = GS_MAIL-SMTP_ADDR ). CALL METHOD CL_SEND_REQUEST->SET_SENDER EXPORTING I_SENDER = LO_SENDER. * "指定邮件接收人 * LOOP AT GT_MAIL INTO GS_MAIL WHERE ADRNR = P_ADRNR. * CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( GS_MAIL-SMTP_ADDR ). * CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). * ENDLOOP. IF GS_MAIL-SMTP_ADDR IS NOT INITIAL. CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( GS_MAIL-SMTP_ADDR ). CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). ENDIF. IF P_CLSS = 'X'. * CLEAR GS_MAIL-SMTP_ADDR. * SELECT SINGLE SMTP_ADDR INTO GS_MAIL-SMTP_ADDR * FROM T024 * WHERE EKGRP = P_EKGRP. LV_INDEX1 = 0. LV_INDEX2 = 0. LV_INDEX3 = 1. CLEAR LT_RECIEVE. WHILE ( LV_INDEX3 <= STRLEN( P_EMAIL ) ). LV_INDEX2 = LV_INDEX2 + 1. LV_INDEX3 = LV_INDEX3 + 1. IF P_EMAIL+LV_INDEX1(LV_INDEX2) CA '/'. LV_INDEX2 = LV_INDEX2 - 1 . LS_RECIEVE-EMAIL = P_EMAIL+LV_INDEX1(LV_INDEX2). APPEND LS_RECIEVE TO LT_RECIEVE. CLEAR LS_RECIEVE. LV_INDEX1 = LV_INDEX3 - 1. LV_INDEX2 = 0. ENDIF. ENDWHILE. LOOP AT LT_RECIEVE INTO LS_RECIEVE. CL_RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LS_RECIEVE-EMAIL ). CL_SEND_REQUEST->ADD_RECIPIENT( CL_RECIPIENT ). ENDLOOP. ENDIF. ** 正式发送并提交作业 CLEAR LV_BOOL. "将邮件置于发件箱,可以在工作台outbox查看邮件的发送状态及内容 CL_SEND_REQUEST->SEND_REQUEST->SET_LINK_TO_OUTBOX( 'X' ). CALL METHOD CL_SEND_REQUEST->SEND_REQUEST->SETU_REQUESTED_STATUS EXPORTING I_REQUESTED_STATUS = 'N'. CALL METHOD CL_SEND_REQUEST->SEND_REQUEST->SETU_STATUS_MAIL EXPORTING I_STATUS_MAIL = 'A'. CL_SEND_REQUEST->SET_SEND_IMMEDIATELY( 'X' ). LV_BOOL = CL_SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X'). IF LV_BOOL = 'X'. COMMIT WORK. * submit rsconn01 with mode = 'INT' and return. IF LT_CONTENT_BIN IS INITIAL. P_ICON = '@0A@'. P_MESSAGE = TEXT-004. "默认导入成功 ELSE. P_ICON = '@08@'. P_MESSAGE = TEXT-005. "默认导入成功 P_ERDAT = SY-DATUM. CLEAR LS_ZT37. LS_ZT37-EBELN = P_EBELN. LS_ZT37-ERDAT = SY-DATUM. LS_ZT37-ERTIM = SY-UZEIT. LS_ZT37-ERNAM = SY-UNAME. MODIFY ZNMMT037 FROM LS_ZT37. ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-006. "默认导入成功 ROLLBACK WORK. ENDIF. CATCH CX_BCS INTO CL_BCS_EXCEPTION. P_ICON = '@0A@'. P_MESSAGE = TEXT-006 && CL_BCS_EXCEPTION->ERROR_TYPE.. "默认导入成功 ENDTRY. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOWN_PDF *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> GS_DATA_EBELN *& --> GS_DATA_SPRAS *& --> GS_DATA_TDSPOOLID *&---------------------------------------------------------------------* FORM FRM_DOWN_PDF USING P_EBELN P_SPRAS. DATA:LV_ICON TYPE ICON-NAME, LV_MESSAGE TYPE C LENGTH 120. PERFORM FRM_GET_PDF USING P_EBELN P_SPRAS '' CHANGING LV_ICON LV_MESSAGE. IF LV_ICON NE ''. LV_MESSAGE = P_EBELN && LV_MESSAGE. MESSAGE LV_MESSAGE TYPE 'E' . ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_PDF *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_EBELN *& --> P_SPRAS *& <-- P_ICON *& <-- P_MESSAGE *&---------------------------------------------------------------------* FORM FRM_GET_PDF USING P_EBELN P_SPRAS P_PATH CHANGING P_ICON P_MESSAGE. DATA:LT_PDF LIKE TLINE OCCURS 0 WITH HEADER LINE, LS_PDF LIKE TLINE. DATA:LS_NAST LIKE NAST, LV_SUBRC TYPE SY-SUBRC, LV_VLINE TYPE I, LV_SMARTFORM_NAME TYPE RS38L_FNAM VALUE 'ZPO_FORM', " 请替换为实际的Smart Form名称 LV_TEMPLATE TYPE STXH-TDNAME VALUE 'ZPO_FORM'. " 请替换为实际的模板名称 FIELD-SYMBOLS <FS_VALUE> TYPE ITCPP. SELECT SINGLE * INTO LS_NAST FROM NAST WHERE OBJKY = P_EBELN AND SPRAS = P_SPRAS. CALL FUNCTION 'WFMC_MESSAGE_SINGLE' EXPORTING PI_NAST = LS_NAST IMPORTING PE_RCODE = LV_SUBRC. IF LV_SUBRC = 0. ASSIGN ('(SAPLMEDRUCK)RESULT') TO <FS_VALUE>. IF <FS_VALUE>-TDSPOOLID IS NOT INITIAL. CLEAR LT_PDF. " 使用Smart Forms函数替代原函数 CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING FORMNAME = ZPO_FORM IMPORTING FM_NAME = LV_FM_NAME EXCEPTIONS NO_FORM = 1 NO_FUNCTION_MODULE = 2 OTHERS = 3. IF SY-SUBRC <> 0. P_ICON = '@0A@'. P_MESSAGE = '获取Smart Forms函数失败'. EXIT. ENDIF. " 动态调用Smart Forms函数 CALL FUNCTION LV_FM_NAME EXPORTING EXPORTING = 'X' TEMPLATE = LV_TEMPLATE OUTPUT_OPTIONS = LS_OUTPUT_OPTIONS IMPORTING JOB_OUTPUT_INFO = LS_JOB_OUTPUT_INFO TABLES LINES = LT_PDF EXCEPTIONS FORMATTING_ERROR = 1 INTERNAL_ERROR = 2 SEND_ERROR = 3 USER_CANCELED = 4 OTHERS = 5. IF SY-SUBRC <> 0. P_ICON = '@0A@'. P_MESSAGE = '执行ZPO_FORM函数失败'. EXIT. ENDIF. " 计算PDF字节数 LV_VLINE = LINES( LT_PDF ). IF LT_PDF[] IS NOT INITIAL. "先下载到本地,再上载做为附件 IF P_PATH IS NOT INITIAL. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING BIN_FILESIZE = LV_VLINE FILENAME = P_PATH FILETYPE = 'BIN' TABLES DATA_TAB = LT_PDF EXCEPTIONS FILE_WRITE_ERROR = 1 NO_BATCH = 2 GUI_REFUSE_FILETRANSFER = 3 INVALID_TYPE = 4 NO_AUTHORITY = 5 UNKNOWN_ERROR = 6. ELSE. DATA:LV_FILE TYPE STRING. PERFORM FRM_GET_PATH USING LV_FILE. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING BIN_FILESIZE = LV_VLINE FILENAME = LV_FILE FILETYPE = 'BIN' TABLES DATA_TAB = LT_PDF EXCEPTIONS FILE_WRITE_ERROR = 1 NO_BATCH = 2 GUI_REFUSE_FILETRANSFER = 3 INVALID_TYPE = 4 NO_AUTHORITY = 5 UNKNOWN_ERROR = 6. ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-007. "默认导入成功 ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-008. "默认导入成功 ENDIF. ELSE. P_ICON = '@0A@'. P_MESSAGE = TEXT-009. "默认导入成功 ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_PATH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> LV_PATH *&---------------------------------------------------------------------* FORM FRM_GET_PATH USING P_FILE. DATA: L_V_FILE_FILTER TYPE STRING. DATA: L_V_FILETABLE TYPE FILE_TABLE, L_T_FILETABLE TYPE FILETABLE. DATA: L_V_RC TYPE I. DATA: L_V_USER_ACTION TYPE I. * l_v_file_filter = '(*.xlsx;*.xls)|*.xlsx;*.xls|'. L_V_FILE_FILTER = '(*.PDF)|*.PDF|'. CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG( EXPORTING WINDOW_TITLE = '选择文件' FILE_FILTER = L_V_FILE_FILTER CHANGING FILE_TABLE = L_T_FILETABLE RC = L_V_RC USER_ACTION = L_V_USER_ACTION ). CHECK L_V_USER_ACTION EQ 0. CHECK L_T_FILETABLE[] IS NOT INITIAL. READ TABLE L_T_FILETABLE INTO L_V_FILETABLE INDEX 1. P_FILE = L_V_FILETABLE-FILENAME. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_MOD_SCREEN *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_MOD_SCREEN . LOOP AT SCREEN. IF SCREEN-GROUP1 = 'M1'. IF R1 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. IF SCREEN-GROUP1 = 'M2'. IF R2 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. IF SCREEN-GROUP1 = 'M3'. IF R3 = 'X'. SCREEN-ACTIVE = 1. ELSE. SCREEN-ACTIVE = 0. ENDIF. ENDIF. MODIFY SCREEN. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DOWN_TEMPLATE *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DOWN_TEMPLATE . CREATE OBJECT V_EXCEL 'EXCEL.APPLICATION'. SET PROPERTY OF V_EXCEL 'VISIBLE' = 1. CALL METHOD OF V_EXCEL 'WORKBOOKS' = V_BOOK . CALL METHOD OF V_BOOK 'ADD'. IF SY-LANGU EQ '1'. PERFORM FRM_FILL_CELL USING: 1 1 '供应商代码(必填)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 2 '采购组织(必填)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 3 '工厂(选填)' 40 0 10, 1 4 '采购员(选填)' 40 0 10, 1 5 '订单发送邮箱(必填)' 40 0 10. ELSE. PERFORM FRM_FILL_CELL USING: 1 1 'Vendor Code(Required)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 2 'Purchase Organization(Required)' 40 0 10, "行号,列号,值,单元格颜色,是否加粗,字体尺寸" 1 3 'Plant' 40 0 10, 1 4 'Buyer.Code' 40 0 10, " add buyer code 20210413 wahkenlee 1 5 'Email' 40 0 10. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> P_1 *& --> P_1 *& --> P_ *& --> P_40 *& --> P_0 *& --> P_10 *&---------------------------------------------------------------------* FORM FRM_FILL_CELL USING FU_ROW FU_COLUMN FU_VALUE FU_COLOR FU_BOLD FU_SIZE. DATA: L_CELL TYPE OLE2_OBJECT, L_COLOR TYPE OLE2_OBJECT, L_BOLD TYPE OLE2_OBJECT, L_COLUMN TYPE OLE2_OBJECT. CALL METHOD OF V_EXCEL 'CELLS' = L_CELL EXPORTING #1 = FU_ROW #2 = FU_COLUMN. SET PROPERTY OF L_CELL 'Value' = FU_VALUE. "赋值。" * call method of L_CELL 'INTERIOR' = int. GET PROPERTY OF L_CELL 'Interior' = L_COLOR. SET PROPERTY OF L_COLOR 'ColorIndex' = FU_COLOR. "根据值 显示对应的颜色。 GET PROPERTY OF L_CELL 'Font' = L_BOLD. SET PROPERTY OF L_BOLD 'Bold' = FU_BOLD. "1是加粗,0是不加粗" SET PROPERTY OF L_BOLD 'SIZE' = FU_SIZE. "设置字体大小。" CALL METHOD OF V_EXCEL 'Columns' = L_COLUMN " 选定列 EXPORTING #1 = FU_COLUMN . SET PROPERTY OF L_COLUMN 'ColumnWidth' = 20. " 定义列宽 SET PROPERTY OF L_COLUMN 'rowheight' = 24. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_MAINTAIN_EMAIL *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_MAINTAIN_EMAIL . PERFORM FRM_CHECK_AUTH. PERFORM FRM_UPLOAD_DATA. PERFORM FRM_CHECK_DATA. PERFORM FRM_UPDATE_DATA. PERFORM FRM_ALV. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_UPLOAD_DATA . CLEAR : GS_ITEM ,GT_ITEM. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = GV_FILE I_BEGIN_COL = 1 I_BEGIN_ROW = 2 I_END_COL = 5 I_END_ROW = 65535 TABLES INTERN = GT_ALSM EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE S000(ZMM) WITH TEXT-010 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. * 转换数据 LOOP AT GT_ALSM. ASSIGN COMPONENT GT_ALSM-COL OF STRUCTURE GS_ITEM TO <GFS_DATA>. TRANSLATE GT_ALSM-VALUE TO UPPER CASE. <GFS_DATA> = GT_ALSM-VALUE. AT END OF ROW. APPEND GS_ITEM TO GT_ITEM. CLEAR GS_ITEM. ENDAT. ENDLOOP. LOOP AT GT_ITEM ASSIGNING FIELD-SYMBOL(<LFS_ITEM>). CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = <LFS_ITEM>-LIFNR IMPORTING OUTPUT = <LFS_ITEM>-LIFNR. ENDLOOP. IF GT_ITEM IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-011 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK_DATA . DATA LV_NAME TYPE STRING . data:ls_email_stru type SX_ADDRESS, ls_email_stru_out type SX_ADDRESS. *前面已经判断过gt_item 不为空 SELECT LFA1~LIFNR , LFA1~NAME1 INTO TABLE @GT_LFA1 FROM LFA1 FOR ALL ENTRIES IN @GT_ITEM WHERE LFA1~LIFNR = @GT_ITEM-LIFNR. SORT GT_LFA1 BY LIFNR . SELECT T024E~EKORG , T001K~BWKEY FROM T024E INNER JOIN T001K ON T024E~BUKRS = T001K~BUKRS FOR ALL ENTRIES IN @GT_ITEM WHERE T024E~EKORG = @GT_ITEM-EKORG INTO TABLE @DATA(LT_T024E). SELECT T024~EKGRP FROM T024 FOR ALL ENTRIES IN @GT_ITEM WHERE T024~EKGRP = @GT_ITEM-EKGRP INTO TABLE @DATA(LT_T024). SORT LT_T024E BY EKORG BWKEY. SORT LT_T024 BY EKGRP. DATA LS_T024E LIKE LINE OF LT_T024E. DATA LS_T024 LIKE LINE OF LT_T024. LOOP AT GT_ITEM INTO GS_ITEM. MOVE-CORRESPONDING GS_ITEM TO GS_MESSAGE. CLEAR GS_LFA1. READ TABLE GT_LFA1 INTO GS_LFA1 WITH KEY LIFNR = GS_ITEM-LIFNR BINARY SEARCH . IF SY-SUBRC <> 0. GS_MESSAGE-MESSAGE = TEXT-012. GS_MESSAGE-FLAG = 'X'. ELSE. GS_MESSAGE-NAME1 = GS_LFA1-NAME1. ENDIF. IF GS_ITEM-EKORG IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-013 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. IF GS_ITEM-WERKS IS NOT INITIAL AND GS_ITEM-EKORG IS NOT INITIAL. CLEAR LS_T024E. READ TABLE LT_T024E INTO LS_T024E WITH KEY EKORG = GS_ITEM-EKORG BWKEY = GS_ITEM-WERKS BINARY SEARCH. IF SY-SUBRC <> 0. CONCATENATE GS_MESSAGE-MESSAGE TEXT-014 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. ENDIF. IF GS_ITEM-EMAIL IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE '' INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ELSE. "校验导入邮箱的格式 ls_email_stru-type = 'INT'. ls_email_stru-address = gs_item-email. CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL' EXPORTING ADDRESS_UNSTRUCT = ls_email_stru IMPORTING ADDRESS_NORMAL = ls_email_stru_out EXCEPTIONS ERROR_ADDRESS_TYPE = 1 ERROR_ADDRESS = 2 ERROR_GROUP_ADDRESS = 3 OTHERS = 4. if ls_email_stru is INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-025 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. endif. ENDIF. CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. IF LV_NAME IS INITIAL. CONCATENATE GS_MESSAGE-MESSAGE TEXT-016 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ELSE. GS_MESSAGE-UNAME = LV_NAME. ENDIF. IF GS_ITEM-EKGRP IS NOT INITIAL. CLEAR:LS_T024. READ TABLE LT_T024 INTO LS_T024 WITH KEY EKGRP = GS_ITEM-EKGRP. IF SY-SUBRC <> 0. CONCATENATE GS_MESSAGE-MESSAGE TEXT-024 INTO GS_MESSAGE-MESSAGE. GS_MESSAGE-FLAG = 'X'. ENDIF. ENDIF. IF GS_MESSAGE-FLAG <> 'X'. CONCATENATE TEXT-017 SY-DATUM+0(4) '/' SY-DATUM+4(2) '/' SY-DATUM+6(2) TEXT-018 SYST-UZEIT+0(2) ':' SYST-UZEIT+2(2) ':' SYST-UZEIT+4(2) INTO GS_MESSAGE-MESSAGE. ENDIF. APPEND GS_MESSAGE TO GT_MESSAGE. CLEAR GS_MESSAGE. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPDATE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_UPDATE_DATA . DATA : LT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : LS_ZNMMT037A LIKE LINE OF LT_ZNMMT037A. LOOP AT GT_MESSAGE INTO GS_MESSAGE WHERE FLAG <> 'X'. MOVE-CORRESPONDING GS_MESSAGE TO LS_ZNMMT037A. APPEND LS_ZNMMT037A TO LT_ZNMMT037A. CLEAR LS_ZNMMT037A. ENDLOOP. IF LT_ZNMMT037A IS NOT INITIAL. MODIFY ZNMMT037A FROM TABLE LT_ZNMMT037A. IF SY-DBCNT <> 0. COMMIT WORK. ENDIF. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_ALV . CLEAR GT_FIELDCAT. CLEAR GS_FIELDCAT. CLEAR GT_EVENTS. CLEAR GS_EVENTS. CLEAR GS_LAYOUT1. MOVE-CORRESPONDING GT_MESSAGE TO GT_EMAIL_ALV. IF SY-LANGU EQ '1'. GMRC_INITIAL_FIELD '供应商代码' 'LIFNR' 'X'. GMRC_INITIAL_FIELD '供应商名称' 'NAME1' 'X'. GMRC_INITIAL_FIELD '采购组织' 'EKORG' 'X'. GMRC_INITIAL_FIELD '工厂' 'WERKS' 'X'. GMRC_INITIAL_FIELD '采购员' 'EKGRP' 'X'. GMRC_INITIAL_FIELD '订单发送邮箱' 'EMAIL' 'X'. GMRC_INITIAL_FIELD '用户域名' 'UNAME' 'X'. GMRC_INITIAL_FIELD '信息' 'MESSAGE' ''. ELSE. GMRC_INITIAL_FIELD 'Supplier Code' 'LIFNR' 'X'. GMRC_INITIAL_FIELD 'Supplier Name' 'NAME1' 'X'. GMRC_INITIAL_FIELD 'Purchase Organization' 'EKORG' 'X'. GMRC_INITIAL_FIELD 'Plant' 'WERKS' 'X'. GMRC_INITIAL_FIELD 'Buyer.Code' 'EKGRP' 'X'. GMRC_INITIAL_FIELD 'Email' 'EMAIL' 'X'. GMRC_INITIAL_FIELD 'Domain' 'UNAME' 'X'. GMRC_INITIAL_FIELD 'Message' 'MESSAGE' ''. ENDIF. GS_LAYOUT1-COLWIDTH_OPTIMIZE = 'X'. GS_LAYOUT1-ZEBRA = 'X'. MOVE 'PF_STATUS_SET' TO GS_EVENTS-NAME. MOVE 'FRM_SET_PF_STATUS1' TO GS_EVENTS-FORM. APPEND GS_EVENTS TO GT_EVENTS. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = SY-REPID * I_CALLBACK_PF_STATUS_SET = '' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND2' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = IS_LAYOUT = GS_LAYOUT1 IT_FIELDCAT = GT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = I_DEFAULT = 'X' * I_SAVE = 'A ' * IS_VARIANT = IT_EVENTS = GT_EVENTS * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * O_PREVIOUS_SRAL_HANDLER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = GT_EMAIL_ALV 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. ENDFORM. FORM FRM_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS'0100' . ENDFORM. FORM FRM_SET_PF_STATUS1 USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS'0200' . ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_QUERY *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_QUERY . CLEAR : GT_QUERY_ALV. CLEAR : GS_QUERY_ALV. CLEAR GT_FIELDCAT. CLEAR GS_FIELDCAT. CLEAR GT_EVENTS. CLEAR GS_EVENTS. CLEAR GS_LAYOUT1. SELECT ZNMMT037A~LIFNR , ZNMMT037A~NAME1 , ZNMMT037A~EKORG , ZNMMT037A~WERKS , ZNMMT037A~EMAIL , ZNMMT037A~UNAME , ZNMMT037A~MESSAGE , ZNMMT037A~EKGRP FROM ZNMMT037A WHERE ZNMMT037A~LIFNR IN @S_LIFNR1 AND ZNMMT037A~EKORG IN @S_EKORG1 AND ZNMMT037A~WERKS IN @S_WERKS INTO TABLE @DATA(LT_ZNMMT037A) . MOVE-CORRESPONDING LT_ZNMMT037A TO GT_QUERY_ALV. IF SY-LANGU EQ '1'. GMRC_INITIAL_FIELD '供应商代码' 'LIFNR' 'X'. GMRC_INITIAL_FIELD '供应商名称' 'NAME1' 'X'. GMRC_INITIAL_FIELD '采购组织' 'EKORG' 'X'. GMRC_INITIAL_FIELD '工厂' 'WERKS' 'X'. GMRC_INITIAL_FIELD '采购员' 'EKGRP' 'X'. GMRC_INITIAL_FIELD '订单发送邮箱' 'EMAIL' 'X'. GMRC_INITIAL_FIELD '用户域名' 'UNAME' 'X'. GMRC_INITIAL_FIELD '信息' 'MESSAGE' ''. ELSE. GMRC_INITIAL_FIELD 'Supplier Code' 'LIFNR' 'X'. GMRC_INITIAL_FIELD 'Supplier Name' 'NAME1' 'X'. GMRC_INITIAL_FIELD 'Purchase Organization' 'EKORG' 'X'. GMRC_INITIAL_FIELD 'Plant' 'WERKS' 'X'. GMRC_INITIAL_FIELD 'Buyer.Code' 'EKGRP' 'X'. GMRC_INITIAL_FIELD 'Email' 'EMAIL' 'X'. GMRC_INITIAL_FIELD 'DOMAIN_NAME' 'UNAME' 'X'. GMRC_INITIAL_FIELD 'Message' 'MESSAGE' ''. ENDIF. GS_LAYOUT1-COLWIDTH_OPTIMIZE = 'X'. GS_LAYOUT1-ZEBRA = 'X'. GS_LAYOUT1-BOX_FIELDNAME = 'BOX'. MOVE 'PF_STATUS_SET' TO GS_EVENTS-NAME. MOVE 'FRM_SET_PF_STATUS' TO GS_EVENTS-FORM. APPEND GS_EVENTS TO GT_EVENTS. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = SY-REPID * I_CALLBACK_PF_STATUS_SET = '' I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND1' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = IS_LAYOUT = GS_LAYOUT1 IT_FIELDCAT = GT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = I_DEFAULT = 'X' * I_SAVE = 'A ' * IS_VARIANT = IT_EVENTS = GT_EVENTS * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * O_PREVIOUS_SRAL_HANDLER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = GT_QUERY_ALV 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. ENDFORM. FORM FRM_USER_COMMAND1 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'BACK' OR 'CANCEL' OR 'EXIT'. DATA : LV_SELTAB TYPE TABLE OF RSPARAMS. CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' "获取当前的选择屏幕元素 EXPORTING CURR_REPORT = SY-REPID * IMPORTING * SP = TABLES SELECTION_TABLE = LV_SELTAB * SELECTION_TABLE_255 = EXCEPTIONS NOT_FOUND = 1 NO_REPORT = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. "使用获取到的屏幕元素跳转初始界面 SUBMIT ZNMMR037 WITH SELECTION-TABLE LV_SELTAB VIA SELECTION-SCREEN. WHEN 'DELETE'. IF R2 = 'X'. PERFORM FRM_DELETE_DATA. ENDIF. WHEN OTHERS. ENDCASE. ENDFORM. FORM FRM_USER_COMMAND2 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. CASE R_UCOMM. WHEN 'BACK' OR 'CANCEL' OR 'EXIT'. LEAVE TO SCREEN 0. WHEN OTHERS. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DELETE_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_DELETE_DATA . DATA : LS_COUNT TYPE I VALUE 0."删除记录的条数 DATA : LT_ZNMMT037A TYPE TABLE OF ZNMMT037A. DATA : LS_ZNMMT037A TYPE ZNMMT037A. DATA : LT_ALV LIKE GT_QUERY_ALV. DATA : LS_ALV LIKE LINE OF LT_ALV. CLEAR : LT_ZNMMT037A, LS_ZNMMT037A, LT_ALV, LS_ALV. LOOP AT GT_QUERY_ALV INTO GS_QUERY_ALV. IF GS_QUERY_ALV-BOX EQ 'X'. MOVE-CORRESPONDING GS_QUERY_ALV TO LS_ALV. APPEND LS_ALV TO LT_ALV. CLEAR LS_ALV. LS_ZNMMT037A-LIFNR = GS_QUERY_ALV-LIFNR. LS_ZNMMT037A-EKORG = GS_QUERY_ALV-EKORG. LS_ZNMMT037A-WERKS = GS_QUERY_ALV-WERKS. LS_ZNMMT037A-EMAIL = GS_QUERY_ALV-EMAIL. LS_ZNMMT037A-EKGRP = GS_QUERY_ALV-EKGRP. APPEND LS_ZNMMT037A TO LT_ZNMMT037A. CLEAR LS_ZNMMT037A. ENDIF. ENDLOOP. IF LT_ZNMMT037A IS INITIAL. MESSAGE E322(ZMM) DISPLAY LIKE 'W'. ENDIF. DELETE ZNMMT037A FROM TABLE LT_ZNMMT037A. IF SY-SUBRC EQ 0. COMMIT WORK AND WAIT. LOOP AT LT_ALV INTO LS_ALV. DELETE TABLE GT_QUERY_ALV FROM LS_ALV. LS_COUNT = LS_COUNT + 1. ENDLOOP. MESSAGE S104(ZMM) WITH LS_COUNT. DATA: LV_REF_GRID TYPE REF TO CL_GUI_ALV_GRID, LV_VALID TYPE C. IF LV_REF_GRID IS INITIAL. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING E_GRID = LV_REF_GRID. ENDIF. IF NOT LV_REF_GRID IS INITIAL. LV_REF_GRID->CHECK_CHANGED_DATA( IMPORTING E_VALID = LV_VALID ). ENDIF. IF LV_VALID IS NOT INITIAL. LV_REF_GRID->REFRESH_TABLE_DISPLAY( ) . ENDIF. ELSE. ROLLBACK WORK. MESSAGE E105(ZMM). ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK_AUTH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK_AUTH . DATA LV_NAME TYPE STRING . CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. SELECT SINGLE ZNMMT037B~DOMAIN_USER INTO @DATA(LV_DOMAIN) FROM ZNMMT037B WHERE ZPROGRAM = 'ZNMMR037' AND DOMAIN_USER = @LV_NAME. SELECT SINGLE ZNMMT037B~UNAME INTO @DATA(LV_UNAME) FROM ZNMMT037B WHERE ZPROGRAM = 'ZNMMR037' AND UNAME = @SY-UNAME. IF LV_DOMAIN IS INITIAL AND LV_UNAME IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-019 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CHECK *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM FRM_CHECK . DATA: LV_STRING TYPE STRING. DATA : LV_NAME TYPE STRING. FIELD-SYMBOLS : <LFS_WERKS> LIKE GS_WERKS. CLEAR GT_WERKS. CLEAR GS_WERKS. IF S_WERKS1[] IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-023. LEAVE LIST-PROCESSING. ELSE. CALL FUNCTION 'ZMM_GET_DOMAIN' IMPORTING DOMAIN_NAME = LV_NAME. SELECT ZME2M_PLANT~UNAME , ZME2M_PLANT~USER_DOMAIN ,ZME2M_PLANT~WERKS_LIST FROM ZME2M_PLANT WHERE ZME2M_PLANT~USER_DOMAIN = @LV_NAME INTO TABLE @DATA(LT_PLANT). SORT LT_PLANT BY WERKS_LIST. SELECT T001W~WERKS FROM T001W WHERE T001W~WERKS IN @S_WERKS1 INTO CORRESPONDING FIELDS OF TABLE @GT_WERKS. SORT GT_WERKS BY WERKS. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-022 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING. ENDIF. IF LT_PLANT IS NOT INITIAL."在单点登录权限里面的用户在需要检查,不在里面的不需要检查 LOOP AT LT_PLANT INTO DATA(LS_PLANT). READ TABLE GT_WERKS WITH KEY WERKS = LS_PLANT-WERKS_LIST TRANSPORTING NO FIELDS BINARY SEARCH. IF SY-SUBRC <> 0. DELETE GT_WERKS WHERE WERKS = LS_PLANT-WERKS_LIST. ENDIF. ENDLOOP. ENDIF. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-021. LEAVE LIST-PROCESSING . ENDIF. LOOP AT GT_WERKS ASSIGNING <LFS_WERKS> . AUTHORITY-CHECK OBJECT 'M_BEST_WRK' ID 'ACTVT' FIELD '03' ID 'WERKS' FIELD <LFS_WERKS>-WERKS. IF SY-SUBRC <> 0. <LFS_WERKS>-FLAG = 'X'. ENDIF. ENDLOOP. DELETE GT_WERKS WHERE FLAG = 'X'. IF GT_WERKS IS INITIAL. MESSAGE S000(ZMM) WITH TEXT-020 DISPLAY LIKE 'W'. LEAVE LIST-PROCESSING . ENDIF. ENDIF. CLEAR S_WERKS1[]. CLEAR S_WERKS1. LOOP AT GT_WERKS INTO GS_WERKS. S_WERKS1-SIGN = 'I'. S_WERKS1-OPTION = 'EQ'. S_WERKS1-LOW = GS_WERKS-WERKS. APPEND S_WERKS1. CLEAR S_WERKS1. ENDLOOP. ENDFORM.需优化为SAP Smartform模式,

最新推荐

recommend-type

新版青岛奥博软件公司营销标准手册.docx

新版青岛奥博软件公司营销标准手册.docx
recommend-type

网站安全管理制度(1).doc

网站安全管理制度(1).doc
recommend-type

500强企业管理表格模板大全

在当今商业环境中,管理表格作为企业运营和管理的重要工具,是确保组织高效运作的关键。世界500强企业在管理层面的成功,很大程度上得益于它们的规范化和精细化管理。本文件介绍的“世界500强企业管理表格经典”,是一份集合了多种管理表格模板的资源,能够帮助管理者们更有效地进行企业规划、执行和监控。 首先,“管理表格”这个概念在企业中通常指的是用于记录、分析、决策和沟通的各种文档和图表。这些表格不仅仅局限于纸质形式,更多地是以电子形式存在,如Excel、Word、PDF等文件格式。它们帮助企业管理者收集和整理数据,以及可视化信息,从而做出更加精准的决策。管理表格可以应用于多个领域,例如人力资源管理、财务预算、项目管理、销售统计等。 标题中提及的“世界500强”,即指那些在全球范围内运营且在《财富》杂志每年公布的全球500强企业排行榜上出现的大型公司。这些企业通常具备较为成熟和先进的管理理念,其管理表格往往经过长时间的实践检验,并且能够有效地提高工作效率和决策质量。 描述中提到的“规范化”是企业管理中的一个核心概念。规范化指的是制定明确的标准和流程,以确保各项管理活动的一致性和可预测性。管理表格的使用能够帮助实现管理规范化,使得管理工作有据可依、有章可循,减少因个人经验和随意性带来的风险和不确定性。规范化管理不仅提高了企业的透明度,还有利于培养员工的规则意识,加强团队之间的协调与合作。 “经典”一词在这里强调的是,这些管理表格模板是经过实践验证,能够适用于大多数管理场景的基本模式。由于它们的普适性和高效性,这些表格模板被广泛应用于不同行业和不同规模的企业之中。一个典型的例子是SWOT分析表,它可以帮助企业识别内部的优势(Strengths)、弱点(Weaknesses)以及外部的机会(Opportunities)和威胁(Threats)。SWOT分析表就是一个在世界500强企业中普遍使用的管理表格。 标签中的“表格模板”则是对上述管理工具的具体描述。这些模板通常是预先设计好的,能够帮助企业管理者快速开始工作,无需从零开始制作新的表格。它们包含了一些必备的字段和格式,用户可以根据自己的具体需求对模板进行调整和填充。 文件名称列表中的“index.html”可能是压缩包内的一个网页文件,用于展示管理表格的索引或介绍。如果这是一个在线资源,它将允许用户通过网页界面访问和下载各种表格模板。而“menu”可能是一个导航文件,用来帮助用户在多个表格模板之间进行选择。“data”文件夹可能包含了实际的表格模板文件,它们可能以Excel、Word等格式存在。 总的来说,管理表格是企业成功管理不可或缺的工具。通过使用世界500强企业所采纳的管理表格模板,其他企业可以借鉴这些顶级企业的管理经验,帮助自己在管理实践中达到更高的效率和质量。通过规范化和模板化的管理表格,企业可以确保其管理活动的一致性和标准化,这对于保持竞争力和实现长期发展至关重要。
recommend-type

YOLOv8目标检测算法深度剖析:从零开始构建高效检测系统(10大秘诀)

# 1. YOLOv8目标检测算法概述 ## 1.1 YOLOv8的简介与定位 YOLOv8(You Only Look Once version 8)作为一种前沿的目标检测算法,是由YOLO系列算法演化而来。该算法特别强调快速与准确的平衡,它被设计用于实时图像识别
recommend-type

mclmcrrt9_8.dll下载

<think>我们正在处理用户关于"mclmcrrt9_8.dll"文件的下载请求。根据引用内容,这个文件是MATLAB运行时库的一部分,通常与特定版本的MATLABRuntime相关联。用户需求:下载mclmcrrt9_8.dll的官方版本。分析:1.根据引用[2]和[3],mclmcrrt9_0_1.dll和mclmcrrt9_13.dll都是MATLABRuntime的文件,版本号对应MATLAB的版本(如9_0对应R2016a,9_13对应2022b)。2.因此,mclmcrrt9_8.dll应该对应于某个特定版本的MATLAB(可能是R2016b?因为9.8版本通常对应MATLABR
recommend-type

林锐博士C++编程指南与心得:初学者快速提能

首先,这份文件的核心在于学习和提高C++编程能力,特别是针对初学者。在这个过程中,需要掌握的不仅仅是编程语法和基本结构,更多的是理解和运用这些知识来解决实际问题。下面将详细解释一些重要的知识点。 ### 1. 学习C++基础知识 - **基本数据类型**: 在C++中,需要熟悉整型、浮点型、字符型等数据类型,以及它们的使用和相互转换。 - **变量与常量**: 学习如何声明变量和常量,并理解它们在程序中的作用。 - **控制结构**: 包括条件语句(if-else)、循环语句(for、while、do-while),它们是构成程序逻辑的关键。 - **函数**: 理解函数定义、声明、调用和参数传递机制,是组织代码的重要手段。 - **数组和指针**: 学习如何使用数组存储数据,以及指针的声明、初始化和运算,这是C++中的高级话题。 ### 2. 林锐博士的《高质量的C++编程指南》 林锐博士的著作《高质量的C++编程指南》是C++学习者的重要参考资料。这本书主要覆盖了以下内容: - **编码规范**: 包括命名规则、注释习惯、文件结构等,这些都是编写可读性和可维护性代码的基础。 - **设计模式**: 在C++中合理使用设计模式可以提高代码的复用性和可维护性。 - **性能优化**: 学习如何编写效率更高、资源占用更少的代码。 - **错误处理**: 包括异常处理和错误检测机制,这对于提高程序的鲁棒性至关重要。 - **资源管理**: 学习如何在C++中管理资源,避免内存泄漏等常见错误。 ### 3. 答题与测试 - **C++C试题**: 通过阅读并回答相关试题,可以帮助读者巩固所学知识,并且学会如何将理论应用到实际问题中。 - **答案与评分标准**: 提供答案和评分标准,使读者能够自我评估学习成果,了解哪些方面需要进一步加强。 ### 4. 心得体会与实践 - **实践**: 理论知识需要通过大量编程实践来加深理解,动手编写代码,解决问题,是学习编程的重要方式。 - **阅读源码**: 阅读其他人的高质量代码,可以学习到许多编程技巧和最佳实践。 - **学习社区**: 参与C++相关社区,比如Stack Overflow、C++论坛等,可以帮助解答疑惑,交流心得。 ### 5. 拓展知识 - **C++标准库**: 学习C++标准模板库(STL),包括vector、map、list、algorithm等常用组件,是构建复杂数据结构和算法的基础。 - **面向对象编程**: C++是一种面向对象的编程语言,理解类、对象、继承、多态等概念对于写出优雅的C++代码至关重要。 - **跨平台编程**: 了解不同操作系统(如Windows、Linux)上的C++编程差异,学习如何编写跨平台的应用程序。 - **现代C++特性**: 学习C++11、C++14、C++17甚至C++20中的新特性,如智能指针、lambda表达式、自动类型推导等,可以提高开发效率和代码质量。 ### 总结 学习C++是一个系统工程,需要从基础语法开始,逐步深入到设计思想、性能优化、跨平台编程等领域。通过不断的学习和实践,初学者可以逐步成长为一个具有高代码质量意识的C++程序员。而通过阅读经典指南书籍,参与测试与评估,以及反思和总结实践经验,读者将更加扎实地掌握C++编程技术。此外,还需注意编程社区的交流和现代C++的发展趋势,这些都对于保持编程技能的前沿性和实用性是必不可少的。
recommend-type

线性代数方程组求解全攻略:直接法vs迭代法,一文搞懂

# 摘要 线性代数方程组求解是数学和工程领域中的基础而重要的问题。本文首先介绍了线性方程组求解的基础知识,然后详细阐述了直接法和迭代法两种主要的求解策略。直接法包括高斯消元法和LU分解方法,本文探讨了其理论基础、实践应用以及算法优化。迭代法则聚焦于雅可比和高斯-赛德尔方法,分析了其原理、实践应用和收敛性。通过比较分析,本文讨论了两种方法在
recommend-type

怎么下载mysql8.0.33版本

<think>我们正在处理用户关于下载并安装MySQL8.0.33版本的问题。根据引用[1]和引用[2],我们可以提供两种方法:一种是使用RPM包在CentOS上安装,另一种是使用ZIP包在Windows上安装。另外,引用[3]提到了安装过程中需要注意Python环境,但根据MySQL官方文档,Python并不是必须的,除非使用某些特定功能(如MySQLShell的Python模式)。因此,我们主要关注下载和安装步骤。用户没有明确操作系统,因此我们将分别介绍Windows和CentOS(Linux)下的安装方法。步骤概述:1.下载MySQL8.0.332.安装(根据系统不同步骤不同)3.初始化
recommend-type

C#学籍管理系统开发完成,信管专业的福音

标题中提到的“C#设计的学籍系统”涉及到几个重要的知识点。首先是“C#”,这是微软公司开发的一种面向对象的、运行在.NET框架上的高级编程语言。C#语言广泛用于开发Windows应用程序、游戏开发、分布式组件和客户端服务器应用程序等。在该标题中,它被用于构建一个学籍系统,这意味着系统的核心逻辑和功能是通过C#语言实现的。 其次是“学籍系统”,这通常是指用于管理学生个人信息、成绩、课程和学籍状态等数据的软件应用系统。学籍系统能够帮助教育机构高效地维护和更新学生档案,实现学生信息的电子化管理。它通常包括学生信息管理、成绩管理、课程安排、毕业资格审核等功能。 从描述中我们可以得知,这个学籍系统是“专门为信管打造”的。这里的“信管”很可能是对“信息管理”或者“信息系统管理”专业的简称。信息管理是一个跨学科领域,涉及信息技术在收集、存储、保护、处理、传输和安全地管理和开发信息资源方面的应用。这个系统可能是针对该专业学生的实际需求来定制开发的,包括一些特有的功能或者界面设计,以便更好地满足专业学习和实践操作的需要。 描述中还提到“请大家积极下载”,这可能意味着该学籍系统是一个开源项目,或者至少是一个允许公众访问的软件资源。由于开发者提出了“如有不足之处请大家多多包涵”,我们可以推断这个系统可能还处于测试或早期使用阶段,因此可能还不是完全成熟的版本,或者可能需要使用者反馈意见以便进行后续改进。 标签中的“C#的啊,大家注意,嘻嘻哈哈”表达了开发者轻松的态度和对C#语言的特定提及。这个标签可能是在一个非正式的交流环境中发布的,所以用词带有一定的随意性。尽管如此,它还是说明了该学籍系统是基于C#语言开发的,并提醒用户对这一点给予关注。 关于压缩包子文件的文件名称列表中,“学生成绩管理系统”直接指出了这个软件系统的主要功能之一,即管理学生的成绩。这通常包括录入成绩、查询成绩、统计分析成绩、成绩报告等功能。一个优秀的学生成绩管理系统可以让教师和学校管理人员更加高效地处理学生的成绩数据,同时也能让学生本人了解自己的学业进展。 综合以上信息,我们可以提炼出以下知识点: 1. C#语言:是一种面向对象的编程语言,适用于.NET框架,用于开发各种类型的应用程序。 2. 学籍系统:是管理学生基本信息、成绩、课程和学籍状态的软件应用系统,目的是实现学生信息的电子化管理。 3. 信息系统管理专业:该系统可能是针对信息系统管理专业的学生或教师的需求设计和开发的。 4. 开源项目或公众访问资源:鼓励用户下载使用,并接受用户的反馈和建议。 5. 学生成绩管理系统:是学籍系统的一个重要组成部分,专注于管理学生的成绩数据。 在开发一个C#设计的学籍系统时,开发者需要考虑的因素很多,比如系统的用户界面设计、数据库设计、数据安全、网络通信等。此外,系统还应该有良好的扩展性和易用性,以便未来可以根据用户反馈和新需求进行升级和优化。
recommend-type

特征值与特征向量速成课:理论精讲与7种高效算法

# 摘要 本文系统地介绍了特征值与特征向量的基本概念、理论深度剖析、高效特征值算法以及这些数学工具在实际问题中的应用。首先从定义与性质出发,详细解释了特征值与特征向量的