多个bapi连续调用,
简单的就是直接 wait up 10 seconds?
优化下,循环查询多次累计。这样某个循环满足了就可以直接退出不用每次就是最大时间。
下面是是一个简单的事例,仅供参考。
DATA: l_kalnr TYPE keko-kalnr,
sel_counter TYPE i.
DATA: lt_keph TYPE STANDARD TABLE OF keph,
lw_keph TYPE keph.
退出条件判断 l_kalnr 是否取到数据
* 取数据返回
* WHILE l_kalnr IS INITIAL.
* IF sel_counter IS INITIAL.
* WAIT UP TO 4 SECONDS.
* ELSE.
* WAIT UP TO 1 SECONDS.
* ENDIF.
SELECT SINGLE kalnr feh_sta cpudt cputime
INTO (l_kalnr,feh_sta,cpudt,cputime)
FROM keko
WHERE vbeln = vbeln
AND posnr = posnr
AND matnr = matnr.
* ADD 1 TO sel_counter.
* IF sel_counter > 5.
* EXIT.
* ENDIF.
* ENDWHILE.
DATA: l_kalnr TYPE keko-kalnr,
sel_counter TYPE i.
DATA: lt_keph TYPE STANDARD TABLE OF keph,
lw_keph TYPE keph.
* 最大尝试次数,可根据实际情况调整
CONSTANTS: max_attempts TYPE i VALUE 5.
* 初始等待时间(单位:秒),可根据预估首次获取数据的合理时长等情况调整
CONSTANTS: initial_wait_time TYPE i VALUE 4,
* 后续每次等待时间(单位:秒),同样可按需调整
subsequent_wait_time TYPE i VALUE 1.
sel_counter = 0.
DO max_attempts TIMES.
SELECT SINGLE kalnr feh_sta cpudt cputime
INTO (l_kalnr,feh_sta,cpudt,cputime)
FROM keko
WHERE vbeln = vbeln
AND posnr = posnr
AND matnr = matnr.
IF l_kalnr IS NOT INITIAL.
EXIT. "如果已经取到数据,直接退出循环
ENDIF.
IF sel_counter = 0.
WAIT UP TO initial_wait_time SECONDS.
ELSE.
WAIT UP TO subsequent_wait_time SECONDS.
ENDIF.
ADD 1 TO sel_counter.
ENDDO.
首先定义了两个常量 max_attempts
用于指定最大尝试获取数据的次数,initial_wait_time
表示首次查询数据后等待的时间,subsequent_wait_time
表示后续每次查询数据后等待的时间,这些常量都可以根据实际业务场景中期望的等待情况以及数据获取的预估时间等因素进行合理调整。使用 DO...ENDDO
循环结构来替代原来的WHILE
循环,循环次数设定为最大尝试次数max_attempts
。在每次循环中执行SELECT SINGLE
语句去尝试从keko
表中获取数据。如果通过 SELECT SINGLE
语句成功获取到了l_kalnr
的数据(即l_kalnr IS NOT INITIAL
),就直接通过EXIT
语句退出循环,不再继续等待和查询,这样就避免了无意义的等待,只要满足条件就可以提前结束获取数据的过程。根据当前已经循环的次数 sel_counter
来决定本次循环后等待的时间,如果是第一次循环(sel_counter = 0
)就按照initial_wait_time
设定的时间等待,后续循环(sel_counter > 0
)则按照subsequent_wait_time
设定的时间等待,每次循环结束后会将sel_counter
自增 1。
通过这样的优化方式,相比原来的代码逻辑更加清晰和灵活,并且可以根据实际数据获取情况更合理地控制等待时间以及及时结束循环操作,减少不必要的等待开销。
我是老周,如果你喜欢我的文字,请记得点击⬇️关注我。
码字不易,文章下拉,右边点个【赞】和【在看】吧!!
猜您还喜欢合集:
猜您还喜欢文章: