I hope I have something for you.

初探WebFocus

Posted on By Panda Pan

不知道是哪根筋抽着了,博主最近竟然要去跟webfocus打交道,最近都被他整疯了。好记性不如烂笔头,学到的东西还是记下来比较好。

WebFocus 就博主目前的认知来看,就是一个报表的生成工具,依赖于数据库,将数据库中的数据经过相关的依赖或者手动的查询,生成一张一张的临时表,将表中的数据通过WebFocus展现出来。

WebFocus初始化

WebFocus的安装

  1. WebFocus因为是收费软件,所以一般用户是下载不了的,不过用户可以去WebFocus官网查看文档,联系和购买相关服务。
  2. 因为工作的关系,博主在这里只有安装包,激活码还是需要自行购买。读者可以在百度云网盘中自行下载。
  3. 在安装过程中需要输入相关激活信息,请自行购买。

数据库绑定

  1. WebFocus的开发者出了一些App Studio的使用教程,在购买相关产品时,进行相关的训练和培训。
  2. 一个服务器中至少需要一个admin,这样方便管理其他developer,admin可以给新用户创建角色等操作,这样开发人员就直接能根据账号密码进行登录和开发。
  3. 要进行开发,admin应该首先进行数据库的绑定等操作,其基本逻辑入下图所示。

  4. 在WebFocus的主界面上,用户可以点击Environments,选择localhost,点击Property按钮就会看到相应的配置信息。如下图所示。

用户进行相关的配置之后,链接到WebFocus的服务器,链接到DataBase,就可以进行相应的开发了。

创建Masterfile

WebFocus有自己的服务器,关联的dataBase中的表在WebFocus中并不能直接使用,需要创建相应的Matadata.类似于SQL中的临时表,将所有的数据复制并转移到WebFocus的服务器中,这样才能进行查询。

  1. 用户在展开Data Servers之后,会看到EDASERVE这个数据库的管理工具,在双击展开或者右键点击“Manage Adapters”之后,就可以选择相应的数据库,进行MasterFile的创建与管理。用户可根据自定义MasterFile的名字、前缀、后缀等信息。
  2. 一张表只能创建一个MasterFile,不过一个MasterFile能包含其他的MaterFile,并进行相应的关联,类似于两张表之间的关联关系(inner Join,Left Join,Right Join)等。MasterFIle的关系就类似于 select * from table_a a left join table_b b on a.id=b.id; 其中 join 的关系 和on 后面的关系根据情况的变化而变化。

创建一个Procedure

  • 用户创建了基本的MasterFile,就可以进行最基本的开发了。在LocalHost中创建文件夹,或者直接在某一个文件中创建一个Procedure,Procedure类似于一个存储过程,更类似于一个空白的画板,用户可以根据自己的需要include相应的东西。 为了方便,用户也可以直接新建一个report,在主页面的上面有一个report的按钮,点击或者右键文件夹–>New 也可以生成一个Report,在新建report的时候,需要用户选择dataSource,也就是刚刚建立的MasterFile,这样会有一个默认的选择列表,用户可以根据需要拖动对应的数据到画板上,这样能自动呈现出报表的样式。

拖拽的使用场景

在WebFocus中,左侧展示的数据是直接从数据库中生成中,用户可以直接将数据表导入到WebFocus,然后再通过WebFocus的逻辑去实现对应的逻辑。也可以在其他框架中通过后台逻辑将需要展示的数据生成临时表,再将临时表导入到MasterFile,通过拖拽进行相应的报表生成。 具体的使用情况可以参照参考文献中的文档进行学习和使用。

使用WebFocus进行开发

在博主的项目开发中,直接使用拖拽的时间少之又少,大部分都是靠着自己写逻辑,拼接表来展示数据。 WebFocus类似于C语言,在开发过程中,面向过程进行开发,在开发过程中,非常难调试和测试。

Function的用法

在WebFocus中,使用到function的地方还是比较的少,因为在WebFocus中,function中不能添加SQL语句等信息,只能写一个简单的逻辑判断,入判断字符串是否为空,判断数字是否等于0等行为。

  ISZERO(functionValue/ValueType)
    ISZERO/A5V=IF functionValue EQ 0 THEN 'T' ESLE 'F';
END

具体代码如上所示,在ISZERO这个function中,我们传入了一个叫functionValue的值,但还需要具体的指明这个Value的类型,如我们传了一个Number,则需要ValueType为I(number), I是值Integer,后面跟数字是指长度,I3值3个数字这么长。同理,A5V就是指5个字符串长度的vchar类型。

在此方法中,用户调用ISZERO这个function,传入一个数字,function会判断这个值是否为0,如果为0就返回‘T’不然就返回‘F’。

MasterFile的使用

在项目中,因为是根据需求还是比较明确的原因,所以在逻辑不是很复杂的情况下,我们可以直接建立MasterFile,其主要意义就是关联表与表之间的关系。如下代码所示

select * from table_a a,table_b b where a.id=b.id and a.cityid=b,valueId;

在MaterFile中,我们只需要选择对应的两张表,然后将where后面的语句拖过手写拖拽的方式,将关系建立在MasterFile中即可。

直接写SQL

在项目中,我们也可以直接把SQL语句写在代码里,代码如下所示:

SQL
SELECT
A.tablename,
B.tableValue
FROM TABLE_A A,TABLE_B B,
WHERE A.ID=B.ID
AND A.CODE_VALUE='PANDA'
;
TABLE
ON TABLE HOLD AS  GET_VALUE_TABLE
-RUN

在上述代码中,用户直接写了一个SQL查询出A表中的tablename和B表中的tableValue,放在了GET_VALUE_TABLE这个表里面,-RUN是指执行上述代码。所以在GET_VALUE_TABLE这个表里面,用户有TABLENAME和TABLEVALUE这两个字段可以使用。

读取TABLE的值

在WebFocus中,如果我们如上述那样创建了一个TABLE,那我们要怎么读取TABLE中的值呢。

-READFILE GET_VALUE_TABLE

这样我们就能读取 GET_VALUE_TABLE中第一行的值了,那如果我们要拿到TABLE中所有的数据,我们就应该:

SET  &Seria_num=0;
SET &TABEL_NUM=&LINES;
REPEAT END_TABEL_LOOP &TABEL_NUM TIMES;
SET &Seria_num=&Seria_num+1;
READFILE GET_VALUE_TABLE;
TYPE &TABLENAME
IF &Seria_num GE &TABEL_NUM THEN GOTO EXIT_TABLE_LOOP;
END_TABLE_LOOP
EXIT_TABLE_LOOP

在上述的代码中,设置了一个初始的值&Seria_num为0,这是为了方便循环的结束。-REPEAT代表着循环的开始,循环到END_TABLE_LOOP这个标志为止,在循环体重,我们一直在-READFILE GET_VALUE_TABLE (读取GET_VALUE_TABLE中的值),并-TYPE &TABLENAME(将GET_VALUE_TABLE中的TABLENAME打印出来)。

注:&LINES是值上一个查询出来的table中信息的条数。

DEFINE的使用

在查询出信息之后,有一些信息是需要经过加工和修改的。这个时候就要用到DEFINE了

DEFINE FILE GET_VALUE_TABLE
    OUTPUT_1/A10V=TABLENAME || '-' || TABLEVALUE;
    OUTPUT_2/A10V=IF TABLENAME IS MISSING AND TABLE     NAME EQ '' THEN 'NULL' ELSE IF TABLEVALUE EQ  '' AND ISZERO(TABLEVALUE) EQ  'T' THEN TABLENAME ELSE OUT_PUT_1;

END

在上述代码中,经过前面的查询,我们得到了GET_VALUE_TABLE这个table,但我们想要的并不是查询出来的东西,例如我们需要将两个字段中间加一个“-”组合在一个形成一个新的字段。或者我们要判断他是不是为空,如果为空就显示其他的东西。

表之间的关联

在运用中,我们有时候还会将两个TABLE联系在一起,这个时候我们有两种方法可以使用。先介绍第一种,使用MATCH方法。

MATCH的使用

代码如下:

MATCH FILE GET_VALUE_TABLE
PRINT *
OUTPUT_1
BY TABLEVALUE
RUN
FILE SQLRESULT
PRINT *
BY TABLEVALUE
AFTER MATCH HOLD AS GET_MATCHE_FILE_TABLE
END

在上述代码中,我们另外建了一张虚拟的表,叫SQLRESULT,用来被MATCH,需要注意的是,这里我们需要相同的一个字段叫TABLEVALUE,而且使用MATCH的话,两个字段的字段格式也需要相同,非常的具有局限性。

使用SQL进行关联

在使用的场景中,我们也查询出来的TABLE其实就相当于一个视图,可以直接使用,所以我们可以用到SQL来实现表与表之间的关联。

SQL
SELECT *
FROM GET_TABLE_VALUE A LEFT JOIN SQLRESULT B ON  A.TABLEVALUE=B.TABLEVALUE
;
TABLE 
ON TABLE HOLD AS GET_JOIN_TABLE
-RUN

在上述代码中,我们实现了与MATCH一样的效果,但是这种操作更加的方便和快捷,而且不限制的两个字段之间的格式。推荐使用 当然,我们也可以用另外一种SQL方式来实现它,代码如下:

SQL
SELECT *
FROM GET_VALUE_TABLE A,SQLRESULT B
WHERE A.TABLEVALUE=DB_EXPR(B.TABLEVALUE(+))
;
TABLE
ON TABLE HOLD AS GET_JOIN_TABLE
-RUN

两者的效果是一样的,但是(+)相当于是使用了SQL中的方法,在WebFocus中,使用到了SQL中的方法的话,是需要加上DB_EXPR()的。

输出配置

在WebFocus中,不过我们怎么样去配置数据,到最后都是需要打印出来的。

其在不指定输出类型是,是以HTML的形式打印在页面上。除了HTML的形式,我们呢还可以输出PDF和XLSX两种格式。

输出的格式一般如下所示:

TABLE FILE GET_VALUE_TABLE
PRINT 
    COMPUTE SN=IF TABLENAME EQ LAST TABLENAME THEN 1 ESLE SN+1; NOPRINT
    TABLENAME AS 'Table Name'
    OUTPUT_1 AS Name+Value
BY LOWEST SN AS 'S/No.'
HEADING
" <1><+0>Report ID:Test_Report"

ON TABLE SUBHEAD
"SUBHEAD"

ON TABLE SUBFOOT
"-------- No Records Found --------"
ON TABLE SET PAGE-NUM NOLEAD
ON TABLE SET ASNAMES ON
ON TABLE NOTOTAL
ON TABLE PCHOLD FORMAT XLSX
ON TABLE SET HTMLCSS ON
ON TABLE SET STYLE *
    INCLUDE = IBFS:/EDA/EDASERVE/_EDAHOME/ETC/enwarm.sty,$
    TYPE=REPORT, SIZE=10, FONT="Arial', HEADALIGN=BODY, WRAP=OFF, $
ENDSTYLE
END

上述代码的大致意思如下:

现在我们要打印GET_VALUE_TABLE这张表了。

打印的信息又 SN、TABLENAME、OUTPUT_1其中SN是我们最后通过计算的出来的,所以前面需要加上一个compute。

NOPRINT 是指不显示在页面上,但BY Lowest SN通过SN 从低到高的排序又显示在页面上了,而且在第一列。

heading是指打印的页面的头部信息,subhead指次于头部的信息,footing和subfoot是指页面底部显示的信息。

ON TABLE PCHOLD FORMAT XLSX表示了是通过XLSX(表格)的形式展示出来的。

*ON TABLE SET STYLE ** 页面的样式可以在这里定义。_TYPE=REPORT, SIZE=10, FONT=’Arial’, HEADALIGN=BODY, WRAP=OFF,_这里是指,这个reprot中,字体大小统一为10号字体,‘Arial’字体格式,宽度自适应等。

当然,我们也可以输入PDF的格式,只需要将“XLSX”修改成“PDF”就可以了.

在HEADING中,<1>代表一个空格,<+0>代表了表格中的单元格的分割。

Conpound的使用

在WebFocus中,Conpound属于比较高级的使用方法了,博主还没有琢磨透彻,先将我了解的先PO出来。

简单的ConPound

使用Conpound需要遵循规律,在第一个要打印的TABLE中,设置Conpound为Open。在打印中过程的表,要一直处于NoBreak的阶段,在打印的最后一张表中要及时的关闭。

实例如下:

-SET &COMPOUNDSTATUS =IF &Serial_Num EQ 1 THEN 'OPEN' ELSE IF  &Serial_Num LT &Class_Num-1 THEN 'NOBREAK' ELSE IF &Serial_Num EQ &Class_Num THEN 'CLOSE ELSE '';
TABLE FILE GET_VALUE_TABLE 
...
ON TABLE SET PAGE-NUM NOLEAD
ON TABLE SET ASNAMES ON
ON TABLE NOTOTAL
ON TABLE PCHOLD FORMAT PDF &COMPOUNDSTATUS
ON TABLE SET HTMLCSS ON
ON TABLE SET STYLE *
    INCLUDE = IBFS:/EDA/EDASERVE/_EDAHOME/ETC/enwarm.sty,$
    TYPE=REPORT, SIZE=10, FONT='Arial', HEADALIGN=BODY, WRAP=OFF, $
ENDSTYLE
END

在上述代码中,我们先设置了一个&COMPOUNDSTATUS的值,当他是一个 则在后面接上 OPEN 之间的我们在后面接上了 NOBREAK,在最后一个的时候我们接上了CLOSE。这样在循环中,打印多张GET_TABLE_VALUE时,并不会使打印中断。目前博主只是在PDF中,使用到了这种方法。

2017-09-11,未完待续

#关于Decode冲突的问题

在WebFocus中,不能直接调用sql中的decode方法,例如:

decode(tableValue,1,'t',2,'f')

相对简单的应用,我们可以转换为Case When方法来做,转换成如下所示:

CASE WHEN tableValue=1 THEN 't'
	 WHEN tableValue=2 THEN 'f'
END  这种方法能解决相对简单的应用,但稍微复杂的应用就不行了,例如:
tablename in (decode(tableValue,4,3,3,3,2,1),decode(tableValue,3,2,2,1),decode(tableValue,2,1))

像这种比较复杂的应用,CASE WHEN 已经不能解决了,这个时候就应该使用到DEFINE FILE去做,具体代码如下所示:

DEFINE FILE GET_VALUE_TABLE
	CHECK_VALUE/A1V= IF tableValue EQ 4 AND tablename EQ 3 THEN 'Y' ELSE IF tableValue EQ 3 AND (tablename EQ 3 OR tablename EQ 2) THEN 'Y' ELSE IF tableValue EQ 2 AND tablename EQ 1 THEN 'Y' ELSE 'N';
END 然后我们在TABLE FILE 中过滤信息。

TABLE FILE GET_VALUE_TABLE
PRINT CHECK_VALUE
WHERE CHECK_VALUE EQ 'Y'
END  **WHERE CHECK_VALUE EQ 'Y'**相当于说就是再查询了一遍,再过滤了一次信息。
2017-09-12,未完待续

#输入的样式

##以字段分页:

ON TABLE_VALUE PAGE_BREAK ##样式设置 所有的样式都设置在**ON TABLE SET STYLE ***中,代码如下 ```
TYPE=SUBHEAD,BY=1,LINE=1,ITEM=1,STYLE=BOLD+UNDERLINE,BORDER=1.0,BORDER-COLOR=RGB(0,0,0),$
TYPE=SUBFEAD,BACKGROUND-COLOR='WHITE',$
TYPE=HEADING,COLOR=RGB(10,200,123),SIZE=20,STYLE=BOLD+UNDERLINE,$ ```
2017-09-19,未完待续

Compound Layout的使用

Compound Layout就是把多个Table连在一起打印出来。我们看着代码来解释就通俗易懂了:

    ...

写在最后

  1. WebFocus有自己的论坛,读者有其他的疑惑可以去论坛上发帖询问。地址是:http://forums.informationbuilders.com/groupee](http://forums.informationbuilders.com/groupee
  2. 当然,读者也可以用Email询问博主,Email为:pandapanzhu@163.com
  3. 用户需要参考文献,也可以通过邮件联系我。
  4. WebFocus有专门的文档,用户可以点击进去看[http://infocenter.informationbuilders.com/wf80/index.jsp?topic=%2Fpubdocs%2FDashboard%2Fsource%2Fcs_bidhelp_parm.htm]

参考文献

  1. Hyperion_SQR_Guide

  2. WebFOCUS Bootcamp - Student Guide
  3. Bootcamp Exercises
  4. Webfocus 8.2 Function
  5. Webfocus 8.2 Create Report Language
  6. AppStudio_user_guide_8201M