新闻详情

新闻详情

首页 / 资讯中心 / 详情

ABAP后台JOB全解析:从SM36建作业到代码调度与排错实战

发布时间:2026/9/26 11:10:49来源:尧图网络
ABAP后台JOB全解析:从SM36建作业到代码调度与排错实战
ABAP实现后台JOB从建作业到写代码再到排错一篇讲透干了这么多年ABAP开发我越来越觉得后台JOB这玩意儿是SAP顾问的隐形基本功。你写一个报表、写一个批量程序顶多影响一个人一个部门。但当程序挂到后台JOB上定期跑起来它就变成了业务流程的齿轮——月底结账靠它、订单批量处理靠它、库存重估也靠它。齿轮什么时候转、转多久、卡住了响不响警报全都是JOB规划的责任。而且有个特别容易踩的误解很多人以为后台JOB是BASIS的活儿跟开发没关系。我在好几个项目都见过——开发把程序写得漂亮但压根没考虑这个程序会被后台调度执行结果程序在对话进程里跑得欢一上后台就出幺蛾子。要么是屏幕输出一大堆、Spool文件爆掉要么是逻辑里带上了前台交互操作根本没考虑后台执行场景要么是压根不知道JOB跑没跑、跑成功了没有、数据量到底处理了多少。这篇文章就把这件事讲透。从需求场景的判断、SM36手工建作业到用ABAP代码创建调度Job再到后台程序里必须注意的开发细节和排查链路全部过一遍。适合刚接触SAP开发的人建立整体认知也适合有一定经验的顾问回头检查自己的JOB设计有没有埋雷。1. 后台JOB到底是什么搞清楚调度逻辑再动手1.1 前台执行、后台执行、作业调度之间的三角关系先说基础概念。你平时SE38执行一个程序、F8跑一个报表这叫前台执行Dialog Execution。程序跑的时候跟你坐在终端前交互是绑定的——你等着它出结果它等着你输入选择条件。这种模式适合小数据量、即时、分析型场景。后台执行就在另一个赛道了。JOB进入系统以后由系统底层的调度器Scheduler根据你设定的时间条件找一个后台工作进程Background Work Process来运行。注意它跟你离不离线没关系。你把电脑关了、网络断了JOB照样按计划启动。这也是SAP支持24小时无人值守业务的根基。那作业调度Job Scheduling又是什么很多人以为SM36建个JOB就完事了其实SM36只是登记和定义真正的调度是系统里那套事件机制在起作用——包括日期时间触发、周期循环触发、以及上一个JOB结束之后触发After Job、甚至外部OP系统通过ALE/批处理接口触发。搞清楚这三层关系后面排问题就快得多。我记得有一次同事来问我为什么他凌晨跑的JOB没出来然后我说你先查JOB状态是不是Released、有没有释放成功再查SM37里机器名对不对结果果然是JOB状态停在Scheduled没被人释放。这个例子后面细讲但你先建立这个框架创建≠释放释放≠开始开始≠成功。1.2 什么场景必须用后台JOB什么场景其实不该用后台JOB不是万能的我更倾向于说它是批量数据处理的专用通道。什么场景优先考虑后台JOB我总结下来就三类第一数据处理量大的程序或者运行时间超过5-10分钟的程序一定不要在前台跑。前台跑是把工作和输出都绑在屏幕进程上用户什么都做不了干等着。你让他开着电脑等半小时不管业务多急这个体验都是灾难。第二定时执行的业务逻辑比如每日凌晨同步主数据、每月末自动重估库存、每周发送报表邮件。这种天然具备周期性、无人值守属性的作业后台JOB就是标准解。第三需要串联多个步骤的批处理流程。比如先导出数据、再执行一个BAPI批量处理、最后打印或发送邮件——每个步骤之间有先后依赖。你可以用After Job的触发方式把它们串成一条链也可以在程序内部用函数包着跑效果都行取决于你要不要被SM37统一监控。但反过来也有不适合用后台JOB的场景交互性强的程序比如带屏幕选择、需要用户确认、会弹出P_OBLIGATORY类型错误消息让你点击确认的就不适合后台。后台进程没有屏幕谁去点那个确认按钮系统会把这类交互消息直接当作错误挂起然后整个JOB就这么卡着不动了。此外实时性和时效性要求高的操作比如用户在前台点单即时过账你非要包装成后台JOB反而增加了复杂度不划算。2. 创建第一个后台JOBSM36手工配置与三种运行周期的选择2.1 通过SM36定义JOB的三个最小要素打开SM36你会看到一长串要填的东西但真正不可跳过的核心只有三个JOB名称、程序/变式、开始条件。JOB名称Job Name是JOB在系统中的唯一标识。起名这件事我建议形成规范——比如Z_DAILY_ORDER_BATCH、Z_MONTH_END_PRICE_REVAL看到名字就知道是干嘛的、大体什么节奏。不规范的命名在JOB多的时候会让你自己都找不到更别说跨项目交接了。第二步是关键选完程序之后必须为它指定变式Variant。后台程序无法弹选择屏幕你只能通过变式把运行的参数提前固化。这一步是后台JOB和前台执行的本质区别。一个小细节如果程序里参数是可选的最好提前建一个默认变式如果某些字段在变式里是必填的千万别留空否则JOB启动了还会因为参数校验不通过直接报错退出。第三步是步数Step。你在JOB步骤里可以放多个程序它们会按顺序执行。但我的建议是一个JOB里默认只放一个程序最多放一串关系紧密的小工具。JOB步骤越多排查链路越长任何一个步骤挂了都会阻塞后续步骤到最后你都不知道问题出在哪一步。填完这三个要素记得把JOB Class选一下。JOB Class决定了这个JOB运行时的优先级A类最高、B类普通、C类最低。大多数情况选B就行。但不是说你查出来某个JOB占用率高、拖慢了系统就调成A——那个需要跟BASIS一起评估当前的进程分配不是开发人员自己拍脑袋决定的。2.2 周期规划日、周、月的正确设置方法复现频率这块是很多人翻车的地方。SM36里有个周期值区你可以设置按天、按周、按月循环。别看界面简单里面很多细节。按天设置时你既可以设定从某天开始每N天跑一次也可以直接指定每个星期日/一跑一次。这两种写法执行出来的结果完全不同不要混着用。我见过有人想实现每三天跑一次结果把日期条件设成了具体的日历日期因为忘了看日历导致JOB恰好在非预期日期触发数据少算了两天这种事出了真不好向业务交代。按周设置同样有坑有些云环境的时区设置跟本地不一致你以为设定的周六凌晨0点到系统里自动变成了北京时间周六下午3点。所以凡是客户强调随时段敏感的JOB我都会建议他们额外加一条SYSTEM日志核对开始时间别只看选择屏幕上的数字。按月光靠SM36也可以实现——设定一个相对于某月的第几个工作日SAP是支持这类月度偏移的。不过要注意的是跨月时如果遇到法定节假日或供应商假期比如月末结账撞上了周五不能只用纯粹的日历周期得把节假日日历Factory Calendar挂上不然日付条件会误触。这块属于非开发配置但作为顾问你必须知道有这回事。2.3 手动释放与立即执行的区别SM36定义好JOB它只是计划中Scheduled的状态还没有真正排进调度表。要让它生效或者说让它马上跑要点释放Release按钮。很多初学者以为定义好了就完了实际根本不是——不释放的JOB就永远停在Scheduled状态调度的时钟不会碰它。而所谓的立即执行其实还是一个JOB只是你把开始条件的日期时间设定为立刻、或者JOB被释放后在下一次调度周期马上启动。听起来和前台执行差不多但本质还是后台进程跑只是不需要你手动去等。这个区别在测试时尤其有用你可以快速验证JOB程序本身的逻辑而不必等整个周期跑完。测试JOB时还有一个细节值得提把JOB先设成只跑一次Do Not Repeat确认逻辑没问题之后再改成周期性的。否则你一边调试一边改JOB变式半夜里JOB自己启动了把测试数据又涂了一遍第二天业务看到数据不对可能先找BASIS吵起来了。3. 程序内控制JOB用ABAP代码创建、释放、监控后台作业3.1 用JOB_OPEN、JOB_SUBMIT、JOB_CLOSE三个函数串起整个生命周期刚才讲的都是SM36手工建JOB但很常见的情况是——业务要求JOB要动态生成或者要由某个主程序自动触发一系列JOB或者某个逻辑在指定的时间节点“前一个JOB结束后、后一个JOB才开始”运行。这时候就需要ABAP代码出场了。SAP提供了一组标准的RFC函数模块用来创建JOBJOB_OPEN打开一个JOB拿到Jobcount、JOB_SUBMIT往JOB里提交程序步骤、JOB_CLOSE关闭JOB并释放它。逻辑链是固定的先OPEN得到一个唯一的Jobcount然后SUBMIT把程序塞进去最后CLOSE设置开始条件并确认释放。下面给一段简化但可运行的参考写法实际项目请按规范处理返回值DATA: lv_jobname TYPE tbtcjob-jobname, lv_jobcount TYPE tbtcjob-jobcount, lv_jobclass TYPE tbtcjob-jobclass VALUE B. lv_jobname Z_BATCH_DEMO. CALL FUNCTION JOB_OPEN CHANGING jobname lv_jobname jobcount lv_jobcount. CALL FUNCTION JOB_SUBMIT EXPORTING jobname lv_jobname jobcount lv_jobcount report Z_BATCH_PROGRAM variant VARIANT_DEFAULT authority_check X EXCEPTIONS job_submit_error 1. CALL FUNCTION JOB_CLOSE EXPORTING jobname lv_jobname jobcount lv_jobcount sdlun sy-datum sdluz sy-uzeit CHANGING jobcount lv_jobcount.这里面有几个点必须关注第一JOB_SUBMIT的report参数是唯一的别传错了。你可以在一个JOB里多次调用JOB_SUBMIT来塞多个程序步骤但这意味着你要自己维护好步骤顺序和容错否则后续步骤会因为前面步骤失败而傻乎乎开跑。第二释放时间的设置要靠JOB_CLOSE里的sdlun开始日期和sdluz开始时间。如果你希望JOB马上执行就用当前日期时间如果要定时就传对应的日期和时间。千万别忘了传不然后台作业都不知道自己该什么时候跑。第三每个JOB对系统资源是有消耗的。如果你在一个循环里反复建JOB比如传一张Excel表对每一行建一个JOB务必在最后控制JOB数量或者干脆改成一个大JOB里循环处理数据别把系统JOB表塞爆了。我见过有人在增强里干这事结果一周后系统都快跑不动了JOB表膨胀到要BASIS手工清理那场面可不好收拾。3.2 用代码判断JOB运行状态别再靠肉眼盯SM37开发和运维岗位经常要写一个监控程序。JOB到底匹配了没有有没有成功完成失败的话失败码是什么这些都是可以通过标准表查出来的。最常用的表是TBTCOJOB头表里面存了JOB的名字、状态、开始时间、结束时间等信息。另外TBTCP存的是每个JOB步骤的请求列表和返回结果比如步骤返回码、Cause of Error、调用程序名等。配合使用效果最好。判断JOB是否运行中可以看TBTCO里的状态S表示Scheduled计划中、R表示Released已释放、A表示Running运行中、F表示Finished成功完成、C表示Canceled已取消。在ABAP里用程序查标准的逻辑大概是SELECT SINGLE jobname, status, enddate, endtime FROM tbtco INTO DATA(ls_job) WHERE jobname lv_jobname AND jobcount lv_jobcount. IF sy-subrc 0 AND ls_job-status F. WRITE: / JOB已完成. ELSEIF ls_job-status C. WRITE: / JOB已取消请检查SM37. ENDIF.不过要注意状态为F不一定代表结果全对。它只代表系统层面这个JOB“正常结束”了程序内部有没有漏数据、有没有逻辑错误、有没有异常被CATCH掉单从状态看不出来。所以成熟的监控JOB不仅查状态还要把程序事先写好的自定义日志表查一遍比如处理了几条、错误了几条两相对照才能确认这次运行是真正健康的。3.3 后台程序里必写的运行环境判断逻辑有经验的ABAP开发都会在程序开头写一段“是否后台执行”的判断。这一步本身很简单——就是检查sy-batch这个系统字段。如果程序被后台JOB启动sy-batch为X如果是前台手动执行就不是。为什么要写这个我举一个具体例子有些程序在前台跑用户可能直接输入条件然后回车到了后台变式里的条件有时候是空的程序就抛错或者拒绝执行。你可以通过判断sy-batch在后一种情况下强制走默认变式、补充默认参数或者干脆拒绝后台执行并写到日志里。另一个更关键的场景是输出重定向。后台作业里的WRITE语句不会显示在屏幕上它会进Spool打印假脱机。如果你用的是WRITE输出又不想每次运行都产生一个Spool文件那要么调用NEW-PAGE PRINT ON来控制要么全部用ALV导出到文件后再发邮件不要在Program里遗留大段无意义的屏幕输出。我见过一个糟糕的事故一个JOB程序内部有个循环对每行数据都在WRITE输出状态信息数据有几百万条当天夜里JOB跑完直接生成100多页的Spool填满了打印服务器第二天整个系统打印任务全堵了。这个错不在JOB设计而在程序开发时没考虑输出量。后台JOB程序里能写表不写屏幕能汇总输出不逐行输出这个习惯要从一开始就养起来。还可以用GET TIME这类系统语句在程序里记录关键时间节点来估算JOB某段逻辑的耗时。这在优化JOB时非常有用。我记得做FICO类JOB时经常要记录从数据抽取到BAPI过账的累计耗时只靠系统日志是看不到这一步的必须在程序里埋点记录。4. 让JOB程序跑得稳的五个开发细节4.1 输出进Spool而不是屏幕数据不上屏幕上一节提到了输出管理这里再展开说说。很多从SD或MM顾问转型做ABAP开发的人写程序时习惯性用WRITE做临时调试。这在后台JOB里是极其不推荐的。SPOOL有三个参数系统会考虑优先权、输出设备、打印份数。如果不处理后台JOB默认会按系统设定的逻辑给作业自动分配Spool请求然后你会在SM37里看到一行输出点进去全是一大堆日志——对监控没任何帮助还占存储。我常用的手段是正式逻辑里完全不让它输出所有运行的中间状态、错误信息、处理条数写进一张自定义表比如ZJOB_LOG。SM37本身的系统日志只能告诉我结束了但自定义表能告诉我结束了并且状态如何。然后我再写一个读取这条表的报表或者直接在JOB之后安排发一封邮件把这天的运行摘要发出来。这样既干净又可控。4.2 记录运行时间GET TIME的实际价值后台JOB最常见的优化需求就是太慢了怎么办。优化之前你得先把慢的环节定位出来。SAP提供了GET TIME这个ABAP语句能够取到当前时间配合时间戳算法可以非常方便地埋点记录某个代码块的运行时长。拿一个后台JOB处理订单创建的例子来演示思路DATA: lv_start_ts TYPE timestampl, lv_end_ts TYPE timestampl, lv_cost_sec TYPE i. GET TIME STAMP FIELD lv_start_ts. 这里调用 BAPI_SALESORDER_CREATEFROMDAT2 处理订单 CALL FUNCTION BAPI_SALESORDER_CREATEFROMDAT2 EXPORTING order_header_in ls_order_header TABLES return lt_return. GET TIME STAMP FIELD lv_end_ts. CONVERT TIME STAMP lv_end_ts TIME ZONE sy-zonlo INTO DATE DATA(lv_end_date) TIME DATA(lv_end_time). CONVERT TIME STAMP lv_start_ts TIME ZONE sy-zonlo INTO DATE DATA(lv_start_date) TIME DATA(lv_start_time). lv_cost_sec ( lv_end_ts - lv_start_ts ) / 1000.这个时间数据完全可以跟业务数据一起写到日志表里。跑了两周之后你查看日志一眼就能看出哪个凌晨JOB的耗时从20分钟涨到了2小时再顺藤摸瓜去查是不是数据量增加、是不是有索引缺失、是不是某个BAPI开始变慢了。没有这个埋点你只能等业务投诉然后一脸懵地拿SM37的记录猜原因效率差得太远。顺带提一句不同系统的时间戳单位可能不同你最好在代码里统一换算成秒或者毫秒再存到表中避免在报表里计算时出现数量级不对这种莫名其妙的问题。4.3 权限检查与用户分配JOB不是谁建的就以谁身份跑这里有个既基础又常被忽略的细节后台JOB被释放后真正跑的时候是使用JOB创建者或你指定的用户的身份权限去执行的。也就是说如果A用户创建了JOB那么JOB运行时的权限校验就是按A的用户名来做的。问题来了A可能只是个普通的AP根本没权限调用某个函数模块或更新某张表那JOB就会在权限检查处报错中断。有经验的方案是在JOB定义或代码层面指定一个专用用户通常是系统里一个服务账号拥有专门的批处理权限集所有JOB都用这个统一身份跑。你可以在JOB步骤里改“作业用户”也可以在程序里通过权限检查对象设计成后台程序自动放行某种权限但后者属于比较绕的写法不做推荐。另一个点改用专用用户后会带来一个隐形现象——日志里记录的用户名全是服务账号一旦业务有人问“这个数据是谁改的”你得能解释清楚。所以强烈建议在你的程序日志里额外记录一句真实的触发来源信息比如原始的用户名、JOB名、进程号这样既能满足审计又能帮自己排查。4.4 事务处理和Commit控制JOB里的数据一致性后台JOB里最怕的事情之一就是中间逻辑出错结果前面处理了100条后面处理到第57条发现数据有问题这时候到底提交还是不提交大量客户场景是不希望部分成功的——要么全处理要么全不处理。正确做法是要么全部走完统一COMMIT WORK要么每处理一小批就COMMIT WORK一次。这个取决于你的业务容错粒度。我的经验是大程序一般按批次提交比如每50条或者每100条提交一次。这样万一中途挂掉重新跑的时候可以从上一批次末尾接着处理不至于浪费全量时间。这里还有个SAP特有的坑后台更新往往走的是UPDATE TASK机制BAPI里的BAPI_TRANSACTION_COMMIT会把更新模块的请求一起提交。如果你只用了COMMIT WORK而没调用BAPI自己的提交函数单据有时候不会真正落库但JOB已经显示成功了。这种问题极隐蔽排查时往往要翻到程序里去看有没有漏掉COMMIT。另外如果是涉及生产订单、物料价格重估或货物过账这类后台批处理建议在程序里加上再次读取数据的二次校验逻辑防止多个JOB并行时发生资源冲突。别小看并发问题——经常两个JOB在凌晨同时启动一个在改物料价格一个在跑MIGO过账底层锁直接冲突轻则等待重则死锁导致数据不一致。4.5 报错收集与通知机制让JOB自己把问题喊出来后台JOB运行失败时系统默认的行为是状态变成F或C然后你自己去SM37翻。你的监控完全是被动的。成熟的运维思路是让JOB帮你把问题和报警送到眼前。最简单的方式是在程序结尾写一段发送邮件的逻辑。邮件内容可以包含运行日期、处理总条数、成功条数、失败条数、以及错误信息列表。这个邮件发给谁最好通过配置表定制而不是硬编码在代码里——否则换一个人接收你还得改代码重传太被动。如果项目统一有监控平台比如SAP Solution Manager或者第三方监控你也可以在程序里主动调用相关函数来推送JOB状态而不是靠外部轮询去抓SM37状态。这种“主动上报”比“被动检查”靠谱得多也符合运维自动化的大趋势。5. 从监控数据反推JOB问题状态、日志、Spool的排查链路5.1 JOB状态码速查别一看到红色就慌了在SM37里每个JOB都会有状态行。C代表运行中R代表释放S代表已计划F代表完成Y代表已完成但系统异步任务仍有未完成的包。还有P代表暂停Z代表未知K代表被杀。最容易被误判的是Y状态——它告诉你JOB结束了但有一个或多个更新请求Update Request没有完成数据可能没真正落库。这时候你去查SM13更新模块管理会看到这个JOB相关的更新条目卡在open状态。很多顾问看到JOB完成、数据却没变化第一个反应是程序有问题其实是更新任务卡住了。另外一个常见坑状态F但程序内错误。这通常是程序代码自己捕获了异常没有向外抛出所以系统层面的状态是成功的。解决思路就是我前面说的额外写程序日志别依赖SM37那一个状态位。5.2 日志分析技巧不能只看报错要看报错前的上下文排查后台JOB最核心的是把JOB的运行日志从步骤层面拆出来。每个JOB步骤都会记录一些技术信息比如处理该步骤的工作进程号、更新的请求号、数据库操作类型、运行时间和结束状态。在SM37里双击一个JOB步骤有多个页签其中作业日志和过程/输出页签最有用。我排查慢JOB的经验是先把整个JOB的总耗时拿到再用各个步骤的耗时占比去定位瓶颈。如果某个步骤本身只有几秒但等了很久基本可以判断是锁等待或资源等待需要去查前一个JOB是不是还在跑有没有锁被未释放的事务卡住。如果步骤本身执行时间很长那大概率是SQL效率、数据量或者代码逻辑问题需要进一步用ST05、ST22或者性能报表来定位。5.3 我踩过的几个典型后台JOB坑讲几个真实碰到过的案例帮你少走弯路。第一个JOB依赖另一个JOB的数据。A JOB每天晚上10点跑B JOB凌晨2点跑业务认为B跑的时候A肯定早就跑完了。结果有几天A程序因为数据量大跑到凌晨4点多B凌晨2点照常启动用的却是昨天甚至前天的数据。等到月底结账财务对不上账才发现。后来我们在B程序开头强制检查A的最近成功结束时间不满足条件就发警报并终止从此再没出过这种问题。第二个变式参数被后人改了。建好的JOB一直正常突然某天晚上输出文件里的条件多了一个公司代码限制业务数据少了一半。查来查去是别的高手在调试时顺手改了变式没有还原。这种问题单靠纪律约束不如靠配置规范定期用权限控制JOB变式改动的权限或者把变式和JOB命名绑定避免被顺手改掉。第三个JOB跑完了但是速度越来越慢且没有明显报错。这种问题十有八九是数据库统计信息过期或索引失效。后台JOB一般都要处理大量数据哪天突然从10分钟涨到1小时优先检查新增的索引是不是因为大批量程序产生了大量DB LUW导致优化器选错了执行计划。这种问题不是ABAP代码能解决的需要跟数据库管理员一起排。5.4 与JOB强相关的一些增强适配问题后台JOB里跑的往往不只是普通报表还有BAPI、BADI增强以及各种业务自定义逻辑。所以排查时你不能忽略“增强逻辑对JOB的影响”。举个例子物料价格变更可能用到BAPI_MATVAL_PRICE_CHANGE销售订单创建可能用到BAPI_SALESORDER_CREATEFROMDAT2。这些BAPI在后台调用和前台调用表面上参数逻辑一样但有些增强点只在前台触发有些后台也会触发。如果你的增强代码里对前台环境有依赖比如读取用户参数、调用某次交互式ALV的输出那JOB里很可能静默失败或者直接报错。我记得做过一个生产订单结算规则增强的维护某个BADI写的时候没考虑JOB场景直接用了用户别名去取权限结果前台一切正常后台跑就权限报错。排查了两天才定位到。现在我做增强都会同步考虑这个增强会不会被后台批处理触发然后写对应的分支判断。同样如果你在JOB程序里调用了带有F4帮助的ALV函数像REUSE_ALV_GRID_DISPLAY这类界面对话式函数它在后台是没有意义的还可能把JOB挂起等待用户输入。所以在后台程序里做输出前一定要判断当前是不是后台模式是的话就换用无界面的输出方式或者直接把数据写到文件。写在实操边界之外从SM36第一个手工JOB到用ABAP代码动态创建和释放JOB再到后台程序的开发规范、日志埋点、监控排查这篇文章基本上把后台JOB从活到稳再到快的全过程讲了一遍。最后再分享一个实际项目里的体会凡是上个项目让我吃过亏的点我都会在下个项目开始前就写成JOB设计自查清单。比如程序在后台模式下是否有输出重定向是否在日志表里记录了关键处理节点是否考虑了JOB之间的依赖关系JOB失败时有没有通知机制。别觉得这些小事繁琐后台JOB最大的特点就是你不在现场它也要跑无人值守的可靠性全靠你事先把细节想周全。如果你刚开始接触这块最好的练习方式是拿一个自己写过的报表程序改造成支持后台运行的版本再分别用SM36和代码两种方式各建一次JOB把JOB生命周期完整跑通一遍。跑个两周再回头看这篇文章提到的细节你会发现自己已经能独立撑起一条批处理链路了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

通信型CRM实战:DeskcommCRM部署落地与踩坑记录 2026/9/26 12:05:14

通信型CRM实战:DeskcommCRM部署落地与踩坑记录

做客户管理这事,做久了都会有一种焦虑:客户说过什么、跟到哪一步、上次谁跟进过,这些问题不靠系统,光靠人脑和Excel基本撑不过一百个客户。我第一次接触DeskcommCRM,就是因为在团队里同时管着销售和客服两摊事&#xf…

阅读更多 →
编写你的第一个nexu技能:SKILL.md规范、技能目录机制与热加载原理 2026/9/26 12:05:14

编写你的第一个nexu技能:SKILL.md规范、技能目录机制与热加载原理

编写你的第一个nexu技能:SKILL.md规范、技能目录机制与热加载原理 【免费下载链接】nexu The simplest desktop client for OpenClaw 🦞 — bridge your Agent to WeChat, Feishu, Slack & Discord in one click. Works with Claude Code, Codex &am…

阅读更多 →
网盘资源聚合搜索站挑选指南:索引库、失效检测与移动端适配 2026/9/26 12:05:14

网盘资源聚合搜索站挑选指南:索引库、失效检测与移动端适配

1. 网盘资源检索的底层逻辑与现状拆解1.1 为什么“聚合搜索”成了刚需先聊一个很现实的问题:为什么大家不直接在网盘平台自带的搜索框里找东西,非要绕一圈去用第三方的资源搜索站?答案其实不复杂——平台自带的搜索,本质上搜的是“…

阅读更多 →
通信孤岛式选型复盘:为什么我们最终选定了DeskcommCRM 2026/9/26 12:05:08

通信孤岛式选型复盘:为什么我们最终选定了DeskcommCRM

1. 为什么我们最终选定了DeskcommCRM:一次通信孤岛式选型复盘很多人听到CRM的第一反应是"又一个客户信息表格"。但真正在销售、客服、实施交付混过几年的人都会明白,传统CRM最大的问题往往不是"能不能记录客户",而是&quo…

阅读更多 →
lmbench-3.0微基准测试实战:定位系统性能瓶颈与避坑指南 2026/9/26 12:05:02

lmbench-3.0微基准测试实战:定位系统性能瓶颈与避坑指南

简介:lmbench-3.0 是一款由 Larry McVoy 编写的多平台开源性能基准测试工具,面向系统管理员、内核与驱动开发者以及硬件评测工程师,用于评估系统综合性能,尤其在内存带宽与内存延时测试方面表现突出。资源包共 225 个文件&#xf…

阅读更多 →
从技术报告看 OpenGuardrails:一个真正统一的开源大模型安全护栏 2026/9/26 12:05:02

从技术报告看 OpenGuardrails:一个真正统一的开源大模型安全护栏

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉