简单了解。
文章目录
1. TVARVC表的内容
由图可知,是个存放变量的表。
那这些变量么,肯定是要被程序使用的。
也就是说你在TVARVC表里面定义了变量,然后program或者function啦或者routine啦可以用你这个表里面的变量。
描述是table of variant variables : 变量表
看这个句型呢,variant是个形容词,不同的,多样的
variables 是个名词,变量
variable是形容词,加了s是名词。
可是我还是有点疑惑的,这个variant吧,也可以是名词变式。
这个variant的解释我有时候真是参不透,因为处理链里就有这个variant
我真是不懂了,为啥这个也叫variant。
我们这个里面吧,name下面是变量名,LOW是给的一个al11 application server下的一个文件地址。也就是说这个变量还能给文件地址,那这只能用在抽取数据上了。还有的给值的,给个固定值那多没意思,所以肯定是可以改的。
1.1 如何修改TVARVC表
STVARV 这个事务码进来修改。点眼镜笔,然后选中一条,再点笔来修改。修改变量名,变量值。低值高值都写的,那是限定范围的。
改完还可以传输,不过嫌麻烦的话,那就每个client都改。因为如果改一条,改起来比传起来快多了。(20240201更新,不要传输。直接在不同系统改。因为可能里面有application server的文件,在不同系统它的名字跟着系统client来的,会不一样)
改完保存下。
数据的更改记录在表DBTABLOG里。但是你传输过来的更改值是看不到的,只能是手动通过STVARVC更改的才能在这个log里看到。
这个log里还看不到具体更改的值。
要去看到具体更改了啥,去se38 RSTBHIST 去查看更改了啥。
2.TVARVC表的应用
都说呢,是在程序里面用的。
我们就来看看上面的两种情况的使用场景。
2.1 变量为文件地址
首先看一个例子:
这个变量肯定得在DTP里面用到。
看下DTP:
也就是运行DTP的时候,会从这个变量的值取文件。
那这也不需要啥程序的啊。毕竟al11里面有这个文件啊,我手动抽就好了啊。
这个变量对应的文件已经被我上载到al11里面了,我直接运行个DTP就好了啊。
为啥要多此一举搞个变量呢。
哈哈,原因如下:
有时候,ERP系统不能提供所有的数据的,其他系统的接口呢,又没有。那这时候咋办呢,只能准备个文本文件,定期发到BW系统里去,然后把数据再加载一下。
这整个流程,本来是要好多个人配合的,其他系统的人,发个文件给BW的人,BW的人上载文件到应用服务器,然后再用DTP抽取数据,最后展现在报表里。
现在我们来优化下这个流程:由其他系统的人,定期发个邮件到一个ftp地址,然后diskwrite到BW的application server,然后BW这边开发个程序,收到这个文件后。直接运行这个程序,检测文件是否存在,存在的话,跑DTP的处理链,然后删除这个文件。
以便下次再有新的文件进来。
实际上也就是两步:1.其他系统的人发个文件邮件,通知BW
2.BW去执行下程序
以上逻辑很完美,实际上也实现了。
如果原始文件加载的时候出错了,也就是文件本身有错,那就会删除文件。这也没什么问题。
好了,我们来看看BW这里的程序是啥样的,因为其他系统到BW的这段通路,不是咱设计的,咱也不知道怎么实现的。
(但是其实我们可以自己把文件加载到al11,以前的事务码不行了,但是有个report可以的。)
2.1.1 加载数据到al11的report
RSXSA_FILE_UPLOAD_DOWNLOAD
是的,就是这个自带的。其实挺简单的。看了的都知道。
但是前提你外部系统的人也有BW的权限才行。
行的,我今天又加载了一遍。
2.1.2 抽取变量数据并执行处理链的report
咱们这的程序还是很简单的。
前提条件是这个文件已经存在了,然后DTP的处理链也设置了。
看下report代码:
// An highlighted block
REPORT zfbi_file_exist.
***********************************************************************
* check wether file exist *
* if yes, a process chain will be executed *
* ****author, ****company *
***********************************************************************
* history *
* Version date user reason *
* &00 14.12.18 ******** creation *
* *
***********************************************************************
PARAMETERS: p_name TYPE rvari_vnam, //两个参数,一个是变量名,一个是处理链名
p_pc TYPE rspc_chain.
DATA: l_file TYPE rvari_val_255, //定义文件和消息
l_message(100) TYPE c.
START-OF-SELECTION.
* get file name from TVARVC
SELECT SINGLE low INTO l_file FROM tvarvc WHERE name = p_name. //通过变量名取变量值,在LOW这个字段里
IF sy-subrc = 0.
* check if file exists
OPEN DATASET l_file FOR INPUT IN BINARY MODE.
IF sy-subrc = 0.
close dataset l_file.
* if exists start process chain
CALL FUNCTION 'RSPC_API_CHAIN_START' //这个是se37可以打开的function,来跑处理链的
EXPORTING
i_chain = p_pc //处理链名也要输入的
* I_T_FOR_PROCESS =
* I_T_VARIABLES =
* I_SYNCHRONOUS =
* I_SIMULATE =
* I_NOPLAN =
* I_DONT_WAIT =
* I_POLL =
* IMPORTING
* E_LOGID =
* E_T_PROCESS_FAILED =
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
CONCATENATE 'Process Chain execution failed:' p_pc INTO l_message SEPARATED BY space.
WRITE: / l_message.
ELSE.
* deletion of file after successful load
DELETE DATASET l_file. //事实是就算没有成功加载,这个文件也会被删掉,这里有问题。
IF sy-subrc = 0.
CONCATENATE 'file was deleted:' l_file INTO l_message.
WRITE: / l_message.
ENDIF.
ENDIF.
ELSE.
CONCATENATE 'file not found:' l_file INTO l_message.
WRITE: / l_message.
ENDIF.
ENDIF.
看完也还算简单,就是去找下文件,有的话,就读取。然后执行处理链。
好的,我们再来看下这个处理链:
这个处理链就是个被触发的。它不是个子链,也没有JOB来执行,就是通过刚才那个report来执行的。
report的执行界面长这样,里面功能自己写的就是一个读取文件变量值,然后调用了一个执行处理链的function。
当然你设置了处理链是外部触发的。我们也可以直接se37用这个function:
直接跑这个处理链,因为我们手动执行不了这个处理链。。。
2.2 变量为值或值范围
看另外一个情况:
这个变量值是个范围。而且是个DTP的过滤值。
这个还是挺有用的。这个值是可以改的。
当你有N个数据源,而且需要抽取不同年份的数据。那你最好设置个filter变量。不然得重复建好多DTP。关键还得区分。
我们来看看这个filter里面的变量设置。
看到这里,问题来了,为啥这两个名字不一样?涉及到我知识盲区了。
唉,一天天的,哪里都是我知识盲区。
而且这里显示的还是一个BEx Variable.这是基于这个信息对象的变量。这个还是在query里面建的吧。
不管了,来看这个字段的变量。
还是个客户出口来的。
到se80下面找找:
原来在这里:
这一圈,都给我绕晕了。
我要在DTP里用这个字段的变量来过滤,那我在这个字段下面定义一个变量,这个变量要代码写的,好了,我写了一个客户出口。
这是步骤一,我得在query里面定义这个变量,给个变量名字A,是个客户出口。
其次,我在TVARVC这个表里,定义了一个变量B,其实这个名字没啥,主要是值可以改的。
最后,代码里,变量A的方法method,去取B的值。当然,B和A的名字一样,也没关系。的吧。。😂