分享
 
 
 

UNIX系统下informix自制开发工具构思介绍

王朝system·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

前 言

当前WINDODS 上的编程工具日新月异,推陈出新;然而因UNIX运用的局限性,其编程工

具十分贫乏。在UNIX上要做画面、菜单、查询、输入,编程者往往要从底层入手,重复劳动

,效率极低。笔者为了解决这个问题而尽点力,将本系统介绍给您,如您能读完本文,收获

一定不少。

编者:王光红

EMAIL: wgh166@hotmail.com

wghsoftware@hotmail.com

软件下载:

http://www.csdn.net/cnshare/soft/16/16735.shtm

http://www.ccrun.com/program/down.asp?id=10

一。系统介简

(一)实现功能∶

用于UNIX上做画面、菜单、查询、输入、修改;可操作数据库。

(二)设计思路∶

将人机对话,可分为基本的输入与输出两大类,在此前提下,为了不同的需要把域分作

多种类型;对涉及数据库的域指明有关的表名、字段名,以进行数据库的读写。将这些

不同功能的域有机的组合在一个FORM中,来实现一个功能模块。将FORM编号,按一定的

结构以二进制的形式存入文件,在使用时,系统按编号读入FORM的数据,按步实现预定

的功能。

(三)软件环境∶

1.操作系统SCO UNIX OpenServer 5.0、SCO UNIX OpenServer 3.0、SCO UNIX 3.0。

2.编程语言 C、INFORMIX/ESQL。

说明∶笔者的工作条件仅限于以上环境,如能提供其他的UNIX、SQL数据库(如ORACLE、

SYBASE等), 系统只需略加修改。

二。系统的文件与库

(一)集成开发器执行程序∶

/usr/wform/bin/mkform FORM的定制工具

/usr/wform/bin/netform FORM的定制工具(网络版)

/usr/wform/bin/net_server FORM的数据服务器

(二)配置文件∶

FORM的配置文件的路径由环境变量CONFIGPATH指定,缺省为/usr/wform/etc/form.cfg

文本文件

它规定UNIX编辑器、FORM参数文件的路径;菜单的格式;存储变量的多少;

特殊键的键值。

(三)FORM参数文件∶

FORM参数文件的路径在配置文件中声明。

二进制文件

存放Dialog结构FORM的数据,系统读此文件,按步执行。

mkform(netform)的画面的参数文件是 /usr/wform/etc/form.bin.sys

(四)帮助信息文件:

帮助信息文件的路径由环境变量MSGPATH指定,缺省为 /usr/wform/etc/form_msg.dat

文本文件

(五)系统说明文件:

系统说明文件 /usr/wform/etc/readme.frm

(六)程序库:

/usr/wform/lib/libsetform.a 在SCO UNIX OpenServer 5.0上生成。

/usr/wform/lib/libnetform.a 在SCO UNIX OpenServer 5.0上生成(网络版)。

(七)演示例程∶

1.两个FORM参数文件∶

/usr/wform/data/demo.form

/usr/wform/data/test.form

2.菜单式演示程序∶

/usr/wform/menu/menu

/usr/wform/menu/menu.ec

/usr/wform/menu/print.c

/usr/wform/menu/errhandle.c

/usr/wform/menu/makefile

/usr/wform/menu/mknet 链接libnetform.a的makefile

3.交易式演示程序∶

/usr/wform/trade/trade

/usr/wform/trade/trade.ec

/usr/wform/trade/makefile

/usr/wform/trade/mknet 链接libnetform.a的makefile

4.两个数据库∶

/usr/wform/demo.exp

/usr/wform/test.exp

说明:演示程序menu、trade使用的数据库是test,form参数文件是test.form。

三。系统的基本概念及用途

(一)FORM的结构:

typedef struct _item_st_ {

char flag; //数据类型(或标志)

char len; //数据长度

char seat_y; //纵坐标

short seat_x; //横坐标

char fun; //FORM中嵌入的函数指针编号

char field[41]; //复合域

}Item;

typedef struct tagOfDialog {

unsigned long form_id; //交易号

unsigned long link_form; //连接交易

char mode; //驱动方式

char key; //索引项

short num; //以下Item的个数

Item *f; //FORM中域的结构

}Dialog;

(二)基本概念及用途

1.[交易号] (Dialog.form_id)

FORM的编号,以此为索引。

2.[连接交易] (Dialog.link_form)

FORM结束后调用的另一个FORM的交易号,此值=0,则不调用。

3.[驱动方式] (Dialog.mode)

以确定FORM的性质。

M∶菜单

P∶打印

B∶浏览

E∶结束清域

D∶结束删除WINDOW

S∶屏幕滚动

C∶综合查询

4.[索引项] (Dialog.key)

指定查询条件的字段数, 其值是对应于[序],序号小于等于该值的字段为查询条

件。 仅对查询类FORM有效。

以下为FORM中域的结构(Dialog.f),域的数量可变。

5.[类型] (Dialog.Item->flag)

标志符 用 途 数据类型 SQLDateType

(1) 输入输出项

C、c 普通字符串 char char

H 汉字 char char

R 日期(对字符串进行日期合法性检查) char char

A 帐号(对字符串有复制功能) char char

P 密码(不回显) char char

G 选项 char char

F 帮助项 char char

D、d 日期(自1899.12.31起至今的天数) long char

M、m 金额 double money, float

N、n 数值 long intger, smallint

以上大写的字符是输入项、小写的字符是输出项。

可在复合区指明表名和字段名, 形如table.field

(2) 杂项

t 提示

f 菜单格式

B 值域检查(对上一项值进行检查)

b 数据库(指定远程数据库),形式database@host

l 标题

i 菜单条目

x 执行 SQL语句

- 连接符

| 划线符

# 画背景符

W

当无需指定表和字段时, 复合区前四位存入坐标, 后面的字符可作标题

类型为 'l', 坐标=0, 则作表头用。

6.[长度]

对输出输出项而言是数据长度;对杂项'|','#'是代表颜色。

字符串数据长度<=128。

金额的长度 <=16∶长度是小数点前和小数点后位数总数,小数点后定为二位。

例∶长度=14,

小数点前12位,小数点后2位。

金额的长度 >=20∶

个位是小数点后位数, 个位前是小数点前的位数。

例∶长度=125,

小数点前12位,小数点后5位。

金额的长度 >=17and<20非法.

7.[坐标]

对一般的FORM后二位是横坐标。前面是纵坐标;纵坐标<24。

对于浏览器的坐标有特别规定:

当坐标值大于2499∶ 后三位是横坐标,前面是纵坐标。

横坐标的最大值512.

例∶坐标值5150表示∶ 横坐标=150,纵坐标=5。

8.[嵌入函数]

FORM中嵌入的函数指针编号,当程序执行完该域后,调用一个特定的函数,函数

指针须初始化符值。

9.[复合域]

是多用途的域,可用作写标题、SQL语句、数据库表名、字段名等。

四。实例讲解(略)

五。本系统的函数及运用

(一) 系统的定义∶

宏及FORM结构 wform.h

变量定义 wvai.h

嵌套函数指针 fun.h

(二) 系统函数的调用:

1. 菜单的调用: int SetMenu(long id)

id是主菜单的编号。

返回值是反映程序执行到菜单第几层的第几项,祥见菜单制作.

2. FORM的调用: int SetupForm(long id, short wincode)

id是FORM的编号。

wincode 是窗口的编号(0-9).

如同时用多个窗口,窗口编号须不同,否则会覆盖。

返回值:

0 取消 (即按[ESCAPE]退出)

1 正常 (即按[ENTER] 退出)

>1 按热键或自定义键返回

对某些特殊键和自定义键,即退出FORM,返回值如下∶

键 名 返回码

借方键 DEBIT

贷方键 CREDIT

向前键 PREVIOES

向后键 NEXT

热键 HOTKEY

发送键 FINISHKEY

自定义键 键值+2000

3. 其他函数∶

(1) int MsgBox(char type, const char *fmt, .../* args */);

用途∶信息提示。信息长度小于80在屏幕底线显示,否则在当前光标下组成BOX.

type∶MSGERR(0) 错误 MSGPROM(1) 提示 MSGWAIT(2) 等待 MSGWARN(3) 警告

用法同printf函数。

(2) void SetFormPara(short mode, short para);

用途∶设FORM参数。

mode:

宏 数值 作 用

WINFRAME 0 para:1 窗口画框 0 窗口无框 缺省值 0

F_COLOR 1 设定前景色 缺省值COLOR_WHITE(白色)

B_COLOR 2 设定背景色 缺省值COLOR_BLACK(黑色)

具体色彩参数见 <tinfo.h>

DISPLAYMODE 3 para:1 预显示原值

0 不显示

缺省值 0

FIELDBOUND 4 para:1 对输入项划定界符 "[......]"

0 不划

缺省值 1

DISPLAYBOLD 5 para:1 显示的字符为高亮

缺省值 0

ENTERDEFAULT 6 para:1 输入项只按[ENTER],复制成原值。

缺省值 0

LINETYPE 7 para:1 双线

0 单线

缺省值 1

PATTERNFRONT 8 para:1 运行菜单时,输入的字符与菜单选项的

第一个字符相同,能选中并自动回车。

0 不能自动回车。

缺省值 1

(3) void TouchForm(short wincode)

用途∶重显被覆盖的FORM.

(4) int SqlMsg(short sqlcode)

用途∶能提供错误信息,反映程序执行到何处(那个文件的那一行)。

通常用于SQL执行错误返回。

(5) void DelDlgwin(short wincode)

用途∶删除FORM.

(6) int SkipDomain(short step)

用途∶跳过若干个域(step)。用于嵌入函数。

(7) void Rfmtdate(date i_date, char *fmt, char *result)

用途∶将INFORMIX中的date转成char.

例∶

1899.12.31至1999.12.4的天数是36132.

Rfmtdate(36132, "mm-dd-yyyy", result);

result="12-04-1998"

Rfmtdate(36132, "mm-dd-yy", result);

result="12-04-98"

Rfmtdate(36132, "日期: YYYY年MM月DD日", result);

result="日期: 一九九八年十二月四日".

(8) void Rfmtdouble(double money, char *fmt, char *result)

用途∶将double转成char.

例∶

double a=-9030236.035;

Rfmtdate(a, "---,---,--9.999", result);

result=" -9,030,236.035"

(9) char *DoubleToStr(double money, const char *fmt);

用途∶将double转成char返回(char *).

(10) void PrintForm(short wincode, short lin, short col, char *fmt, ...);

用途∶向FORM输送字符.

(11) int RunFunction(int (*fun)(), char *msg);

用途∶运行函数fun时,在屏幕底显示信息msg,隔一秒钟跳动字符 '>'。

例∶

见menu.ec的280行。

RunFunction(DeleteDetail, "正在清理数据");

如果函数DeleteDetail()不在menu.ec中,

必须声明extern int DeleteDEtail();

(12) int CallFunction(int (*fun)(), char *msg);

用途∶同RunFunction(),不跳动字符。

(13) char *PntName();

用途∶获得打印输出的设备名。

在主控台上得到"/dev/lp0",在终端上得到相应的终端号"/dev/tty???"

(14) void Draws(WINDOW *w, int b_y, int b_x, int e_y, int e_x)

用途∶在指定的窗口画线。

起点坐标(b_x, b_y) 终点坐标(e_x, e_y)

b_x=e_x 画垂直线。

b_y=e_y 画水平线。

b_x!=e_x b_y!=e_y 画矩形。

(15) int FormPath(char *path);

用途∶

调用该函数设置FORM的参数的路径, 确省路径在配置文件中设定。

(16) InsetFun(n, fun);

用途∶

函数指针初始化。

n 是函数指针的编号,fun是函数名.

(三) 关于嵌入函数的使用:

作用∶当FORM执行到某一域时调用的函数.

我们通过menu.ec这个程序来说明嵌入函数的运用。

****注意∶以下是test.form中的 110号form.

[命令] g [交易号] 110 [连接交易] 0 [驱动方式] E [索引项] 0

[序] [类型][长度][坐标][嵌入函数] [ 复 合 域 ]

0 C 3 1237 0 bank.exchno

1 c 20 1337 0 bank.officename

2 R 8 1537 1

3 t 0 0 0 日期须本日前一星期内

4 A 7 1737 0

5 M 10 1937 0

6 B 0 0 0

7 i 0 0 0 62.50

8 i 0 0 0 999999.99

9 C 1 2137 0

10 B 0 0 0

11 i 0 0 0 [1,4]

12 l 0 1226 2 受 理 行

13 l 0 1326 0 行 名∶

14 l 0 1526 0 凭证日期

15 l 0 1726 0 号 码

16 l 0 1926 0 金 额

17 l 0 2126 0 联 次

18 l 0 2224 0

第 2、12域有嵌入函数∶1、2是函数指针的编号,分别代表函数CheckDate()、Pattern().

函数指针初始化∶

InsetFun(1, CheckDate);

InsetFun(2, Pattern);

见menu.ec中第217、218行。

当程序执行完第 2域(即输入日期),系统就调用函数CheckDate(),以检查日期

是否本日至前一星期内,如日期正确函数返回 0,程序继续执行; 如日期错误函

数返回-1, 程序仍停止在第 2域。如函数返回-3程序退回到第 0域。

设SN为程序执行的序号.

ret=Fun[n]();

SN +=ret;

你可根据需要函数返回值,如返回值为2,就会跳过2个域。

当程序执行完第11域,系统就调用函数Pattern(),进行凭证配对。

(四)关于FORM的值∶

1.类型.

类 型 变量名 宿主变量名 FORM编辑器的代名

字符(char) Chars(n) $INFString[n] $Cn

整型(long) Number[n] $Number[n] $Nn

金额(double) Money[n] $Money[n] $Mn

日期(long) Date[n] $Date[n] $Dn

注∶

n是顺序号

Chars(n)是宏,C语言中Chars(n)、INFString[n]都可用;

SQL语言中只能用INFString[n],不能用宏Chars(n);

2.值的配置.

系统根据配置动态申请内存,按你的需要调整系统配置(或修改form.cfg),

确定值的个数.

3.值的顺序.

用下例来说明∶

[序] [类型][长度][坐标] 对应的变量 注 解

0 C 3 1237 Chars(0) 'C'字符型第 1 次出现

1 c 20 1337 Chars(1) 'c'字符型第 2 次出现

2 H 8 1537 Chars(2) 'H'字符型第 3 次出现

3 A 7 1737 Chars(3) 'A'字符型第 4 次出现

4 M 10 1937 Money[0] 'M'金额型第 1 次出现

5 B 0 0 控制类与变量无关

6 i 0 0 控制类与变量无关

7 i 0 0 控制类与变量无关

8 c 11 2120 Chars(4) 'c'字符型第 5 次出现

9 B 0 0 控制类与变量无关

10 i 0 0 控制类与变量无关

11 m 12 2126 Money[1] 'm'金额型第 2 次出现

12 F 1 2146 Chars(5) 'F'字符型第 6 次出现

13 i 0 0 控制类与变量无关

14 i 0 0 控制类与变量无关

15 N 6 2170 Number[0] 'N'长整型第 1 次出现

六。使用FORM的用户环境

用户可设置以下环境变量

(1)CONFIGPATH: FORM的配置文件的路径。缺省为 /usr/wform/etc/form.cfg

FORM的参数的路径在配置文件中设定。

用户的程序中可在启动FORM前,调用FormPath(char *path)设定路径。

(2)MSGPATH: 帮助项信息文件路径。缺省为 /usr/wform/etc/form_msg.dat

(3)NETCONFIGFILE:通讯的配置文件,适用于本系统网络版,客户及服务端都

需要,缺省为 /usr/wform/etc/sys.net

七。FORM生成器(mkform、netform)的使用

_.----..__.'

_ / -._

__ ``-._ ) | ||..\\\ .\ \`-

-'_ `-._ /( `-.\ / // | /-'' ``-._| \`-. .`. / | |\ \\ | | /_.---.__.| `_/``' `-..-'_/_/ /_/ |//\ _..--'/ /' -._ .'"(@ ` @`/-._ \ ( ' /\ `-.` `(| _' ;`-. ` `_ `.

/ / ``-._ _.'| _ ` ,' '_.-` .'

/ /-------- ``'-~-' `;`~'`` . '

'._ \\ ` \\ / . '

```` --- .. -. \\ \'

`\ \ \\ \ `. | || . || ┏━━━━━选择━━━━━┓

\ . || .' `-|| ┃ V 全屏幕编辑_______(0)┃

\ `||' ;|| ┃ T 交易式演示程序___(1)┃

;|| '// ┃ M 菜单式演示程序___(2)┃

_; || // [ ]┃ D 显示系统配置_____(3)┃

/.``||..__.-; ┃ A 调整系统配置_____(3)┃

.'` ``-._|_|.-| ┃ S 清理FORM_________(5)┃

/ ; ┃ P 改变FORM参数路径_(6)┃

; ; ┃ L 登记注册_________(7)┃

; ; ┃ E 退出_____________(8)┃

; ,' ┗━━━━━━━━━━━━┛

------------ 图10 --------------

(一)运行mkform(或netform)

mkform的用法∶mkform -d database -f filename

1.打开数据库∶ -d database 可省略(不访问数据库)。

2.指定FORM参数文件名∶-f filename 如省略则按系统配置文件中指定的路径。

mkform与netform的主要区别:mkform对远程数据库的访问是利用了informix本

身的功能,也就是由sqlexecd提供服务;netform访问数据库的服务程序(net_server)由

作者编写,在数据安全方面进行了控制,所以在运行netform的同时,必须启动net_server

服务程序。

(二)菜单功能

当你运行mkform时,就出现图10,下面就菜单的功能逐一介绍∶

1. V 全屏幕编辑

进入FORM的编辑、定制程序。(祥见以下关于FORM编辑的一章)。

2. T 交易式演示程序

演示以交易码驱动的程序。

3. M 交易式演示程序

演示以菜单驱动的程序。

4. D 显示系统配置(图11)

配置文件的路径由环境变量CONFIGPATH指定,缺省为 /usr/wform/etc/form.cfg

┏━━━━━━━━━━━ 系 统 配 置 ━━━━━━━━━━━┓

┃ 0. FORM参数路径: ../data/demo.form ┃

┃ 1. 编缉命令: /usr/bin/vi ┃

┃ ┃

┃ 2. 字符型(char)个数: 50 3. 数值型(long)个数: 10 ┃

┃ 4. 金额型(double)个数: 10 5. 日期型(date)个数: 8 ┃

┃ ┃

┃ 6. 菜单最大项数: 100 ┃

┃ 主菜单格式: ( 7. 2 8. 5 ) ┃

┃ 子菜单格式: ( 9. 12 10. 1 ) ┃

┃ ┃

┃ 11.双零键: 46 12.四零键: 47 ┃

┃ 13.五零键: 42 14.六零键: 45 ┃

┃ 15.借方键: 3 16.贷方键: 4 ┃

┃ 17.向前键: 91 18.向后键: 93 ┃

┃ 19.热 键: 26 20.发送键: 10 ┃

┃ ┃

┃ 选择: [ ] (Esc取销) ┃

┃ ┃

┃ ┃

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

------------ 图11 --------------

5. A 调整系统配置

只有root用户才能调整系统配置。

编缉命令: 编辑FORM所调用的文本编辑程序。

主菜单格式: ( 7. 2 8. 5 )

该项配置说明主菜单格式是 2行, 5列。

选择第 7项修改行数,选择第 8项修改列数。

子菜单格式: ( 9. 12 10. 1 )

该项配置说明主菜单格式是12行, 1列。

选择第 9项修改行数,选择第10项修改列数。

6. S 清理FORM

对作废和删除的FORM定期清理。

7. P 改变FORM参数路径

FORM参数路径在mkform启动时或系统配置文件中指定,如果你需要其他的FORM

参数文件可由此选项改变。

8. L 登记注册。

9. E 退出系统。

(三)关于FORM编辑

在图10中的菜单选第 0项,就进入图12。

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

┃ [命令] ┏━━━━━━━┓ [连接交易] 0 [驱动方式] [索引项] ┃

┃ [序] [类型┃a 进入___(00) ┃函数] [ 复 合 域 ]┃

┃ 0 ┃e 退出___(01) ┃ ┃

┃ 1 ┃g 取数___(02) ┃ ┃

┃ 2 ┃h 帮助___(03) ┃ ┃

┃ 3 ┃s 演示___(04) ┃ ┃

┃ 4 ┃u 恢复___(05) ┃ ┃

┃ 5 ┃d 设计___(06) ┃ ┃

┃ 5 ┃v 编辑___(07) ┃ ┃

┃ 6 ┃w 存盘___(08) ┃ ┃

┃ 7 ┃F 单选___(09) ┃ ┃

┃ 8 ┃D 删除___(10) ┃ ┃

┃ 9 ┗━━━━━━━┛ ┃

┃ 10 ┃

┃ 11 ┃

┃ 12 ┃

┃ 13 ┃

┃ 14 ┃

┃ 15 ┃

┃ 16 ┃

┃ 17 ┃

┃ 18 ┃

┃ 19 ┃

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

------------ 图12 ------------

图12中的命令菜单功能∶

1. a 进入本系统的FORM编辑器,编辑的窗口每屏是20项,共 5屏;

当光标到最后一行,再按↓键,就可翻到下一屏。

2. e 退出本编辑器。

3. g 取数

输入交易号就可读到此交易的FORM参数。

4. h 帮助

显示文本/usr/wform/etc/readme.frm.

5. s 演示FORM

输入交易号就可此交易的FORM框架,演示输入、查询的过程。

6. u 恢复被误删除的FORM.

7. d 设计

利用UNIX编辑工具,对FORM进行初步的定制。具体的方法详见FORM的定制。

7. v 编缉

利用UNIX编辑工具,对FORM的参数进行设定。具体的方法详见FORM的编辑。

9. w 存盘

将编辑或修改完的FORM存入文件。原来同号的FORM被作废,故需定期清理

FORM。

10. F 单选

可单独选出一个指定的FORM参数,文件名"./f????", ?表示FORM号。

作用∶有些FORM的功能通用,可移到其他用户的FORM参数文件中。

移值方法∶ cat f??? >> other.form

11. D 删除

对弃用的FORM进行删除。

(四)FORM的定制:

1. 利用UNIX编辑工具,对FORM进行初步的定制。

(1) 选命令 v,输入交易号,(假设交易号是88)。系统就调用UNIX编辑工具

(如vi),生成文本/tmp/form88,在文本在写的内容如下∶

序号 文 本 内 容

1

2

3

4

5 记 帐

6

7

8 帐 号∶ $A12

9

10 凭证号∶ $N6

11

12 摘 要∶ $C10

13

14 金 额∶ $M12

------------ 图13 ------------

在'$'符后的字符是类型,类型后的数字是长度。

将该文本存盘退出后,即返回系统画面,系统根据文本内容及各个域的

坐标,在内存生成结构为Dialog的FORM,见图14.

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

┃ [命令] g [交易号] 88 [连接交易] 0 [驱动方式] [索引项] 0 ┃

┃ [序] [类型][长度][坐标][嵌入函数] [ 复 合 域 ]┃

┃ 0 A 12 739 0 ┃

┃ 1 N 6 939 0 ┃

┃ 2 C 10 1139 0 ┃

┃ 3 M 12 1339 0 ┃

┃ 4 l 0 437 0 记 帐 ┃

┃ 5 l 0 730 0 帐 号∶ ┃

┃ 6 l 0 930 0 凭证号∶ ┃

┃ 7 l 0 1130 0 摘 要∶ ┃

┃ 8 l 0 1330 0 金 额∶ ┃

┃ 9 0 0 0 ┃

┃ 10 0 0 0 ┃

┃ 11 0 0 0 ┃

┃ 12 0 0 0 ┃

┃ 13 0 0 0 ┃

┃ 14 0 0 0 ┃

┃ 15 0 0 0 ┃

┃ 16 0 0 0 ┃

┃ 17 0 0 0 ┃

┃ 18 0 0 0 ┃

┃ 19 0 0 0 ┃

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

------------ 图14 ------------

用命令 w存盘,再用命令 s进行演示,见图15。如果对FORM不满意,可通过对

文本修改或直接修改FORM,直至满意。

┏━━━━━━━━━━━━━━┓

┃ 记 帐 ┃

┃ ┃

┃ ┃

┃帐 号∶[ ] ┃

┃ ┃

┃凭证号∶[ ] ┃

┃ ┃

┃摘 要∶[ ] ┃

┃ ┃

┃金 额∶[ ] ┃

┗━━━━━━━━━━━━━━┛

------------ 图15 ------------

(五)FORM的编辑:

用UNIX编辑只是FORM的初步定制,它只能对标题、数据的输入、显示域进行定义。

而对[连接交易]、[驱动方式]、[索引项]、[嵌入函数]以及菜单、数据库的表名、 字段名等等,需本系统提供的编辑功能或直接用vi编辑。

方法一____系统提供的编辑功能:

(1) 用命令 a进入,用光标键移到需改动的域。

(2) 行的复制功能.

把A 行开始的N 条复制到B 行上,方法如下∶

将光标移至A 行按F2键,再按要复制的条数N,再将光标移到B行按 F2键。

连续按两次F2,可在原行下复制一行。

(3) 行的插入功能.

按[Insert]键,可增加一行空行。

(4) 行的删除功能.

将删除行的类型改为空格,存盘时,会剔除该行。

(5) 复合域的编辑功能。

F1键向右移,[Backspace]键向左移。

命令切换键F3或[Delete],x删除字符,i插入字符,功能同vi.

方法二___利用vi编辑功能:

(1) 用命令 v进入、再输入form号。

(2) 如form是新建的,系统生成一个带有说明和一定格式的文本(见图16),由您

填写编辑。

如form已存在,系统生成一个带有原form参数的文本,由您修改。

[交易号] 120 [连接交易] 0 [驱动方式] B [索引项] 3

[类型][长度][坐标][嵌入函数] [ 复 合 域 ]

~~提示:以下值的横坐标必须在对应字段的区域内(以'[]'为界),否则无效!空缺值为零~~

------------ 图16 ------------

九。演示程序

演示程序menu、trade的功能相同;共用数据库test、FORM参数文件test.form.

你可阅读menu.ec、trade.ec中是如何调用本系统函数的;

你还可参考./menu/makefile、mknet ./trade/makefile、mknet;

十。有关网络版

所谓网络版就是在原版的基础上, 将程序分为前台程序(界面控制程序)和后台程序 (数据服

务器), 前台把FORM中涉及数据数据库的FORM, 组织成SQL语句通过网络传给后台, 后台把

SQL 的着执行结果返回前台, 如图16所示:

┏━━━━━┓ SQL语句送后台 ┏━━━━━━━━━┓

┃ ┃ ────────────→ ┃ ┃

┃ 前 台 ┃ ........TCP/IP........... ┃ 后台(net_server) ┃

┃ client ┃ ←──────────── ┃ server ┃

┗━━━━━┛ 查询、更新结果返回前台 ┗━━━━━━━━━┛

------图16-----

查询的核心代码:

Select(int tag, char *command)

{

$char *sel, Str[128];

$short flag;

$date Date;

$long Number, b_count, j;

$long prec;

$long type;

$long scale;

$double money;

$char result[128];

int ret, offset=0;

int i=0;

char fmt[32], Tag;

if(DisplayFlag) printf("tag=%c\nsql=%s\n", tag, command);

RetPacket.txcode=SELECT;

if(tag=='M'){

//多项查询

sel=getfield(command, &offset);

if(strlen(sel)<2) goto EXIT1;

Tag=sel[0];

}

else

Tag=tag;

sel=getfield(command, &offset);

if(tag=='M') ChangeCmd(sel);

if(strlen(sel)<10) goto EXIT1;

if((ret=ComposeBrowse(10, sel))<0){

SqlErrHandle(SQLCODE, SELECT);

goto EXIT0;

}

RetPacket.txcode=SELECT;

$get descriptor 'browsdesc' :b_count=count;

if(SQLCODE){

SqlErrHandle(SQLCODE, SELECT);

goto EXIT0;

}

$fetch BROWSE using sql descriptor 'browsdesc';

if(SQLCODE){

strcpy(RetPacket.data, "SELECT ERROR|");

SqlErrHandle(SQLCODE, SELECT);

goto EXIT0;

}

for(j=1;j<=b_count;j++){

$get descriptor 'browsdesc' value $j

$prec=precision, /*money、decimal*/

$scale=scale, /*money、decimal*/

$type=type;

if(SQLCODE){

strcpy(RetPacket.data, "SELECT ERROR|");

SqlErrHandle(SQLCODE, SELECT);

goto EXIT0;

}

switch(type){

case SQLFLOAT:

case SQLSMFLOAT:

case SQLDECIMAL:

case SQLMONEY:

if(prec)

sprintf(fmt, "%s%d.%df\0", "%",prec+1, scale);

else

strcpy(fmt, "%f");

$get descriptor 'browsdesc' value $j

$money=data;

sprintf(result, fmt, money);

if(SQLCODE==DATAISNULL) result[0]=0;

break;

default:

$get descriptor 'browsdesc' value $j

$result=data;

}//switch

DelTailSpace(result);

if(SQLCODE==DATAISNULL) SQLCODE=0;

if(SQLCODE){

strcpy(RetPacket.data, "SELECT ERROR|");

SqlErrHandle(SQLCODE, SELECT);

goto EXIT0;

}

strcat(RetPacket.data, result);

strcat(RetPacket.data, "|");

}//for

if(DisplayFlag) puts(RetPacket.data);

EXIT0:

$close BROWSE;

$free BROWSE;

$deallocate descriptor 'browsdesc';

EXIT1:

return TRUE;

}

(一)网络版的作用:

增强安全性。INFORMIX能访问远程数据库,但须建立对等关系,会造成不安全。

本版无须建立对等关系,克服了这个弱点。

(二)网络版的用法:

1. 网络通讯使用TCP/IP协议。

2. 前、后台程序也可在同台机器上.

3. FORM的定制、函数及功能不变.

4. 链接的程序库: /usr/wform/lib/libnetform.a。

5. 通讯的配置文件: $HOME/etc/sys.net的内容:

(1)数据库名:对后台而设

[Database]

Database=mobile

(2)后台机器名:前、后台须一致。/etc/hosts中存在,也可以直接写IP地址。

[ServerHost]

ServerHost=save01

(3)端口号:前、后台须一致。

[NetForm Tcp Port]

NetFormTcpPort=8168

(4)socket超时报警时间(秒),确省值60

[Socket Read & Write Time Out(s)]

SocketTimeOut=35

(5)查询超时报警时间(秒),确省值60, 仅对前台而设。

[Wgetch Time Out(s)]

WgetchTimeOut=30

(6)跟踪标志,仅对前台而设,0屏蔽,1开放。跟踪文件:$HOME/run/trace

[Trace Flag]

TraceFlag=0

(7)connect超时报警时间(秒) 仅对前台而设。

[Company Server Connect Time Out(s)]

ConnectTimeOut=8

(8) fork()服务子进程同时存在的最大数, 仅对后台而设。

[Max User Number]

UserNum=10

(9)显示部分服务程序接受和发送的数据。0屏蔽,1开放

[Display Server Data Flag]

DisplayFlag=1

6. 地址簿文件: $HOME/etc/hosts.equ 设在后台

记录允许访问数据库的前台机器的IP地址,未记录的机器不能访问。

设置方法:

(1)文件中加入all.hosts,对所有的客户开放。

(2)文件中加入网段地址(如13.7.5),对该网段开放。

(3)文件中加入完整的客户端IP地址(如12.17.23.76),对该客户机开放。

7. 服务器的启动:net_server

8. 服务器的停止:net_server stop

9. 返回值∶ 当sqlcode>-10时是本系统定义,含义如下∶

-1 收数据包出错: 如超时。

-2 拒绝服务∶ 地址簿无本机IP地址

-4 服务进程超过限定的数目。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有