Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103696622
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-04-08 16:01:34

出处:csdn 
前     言

    当前WINDODS 上的编程工具日新月异,推陈出新;然而因UNIX运用的局限性,其编程工
具十分贫乏。在UNIX上要做画面、菜单、查询、输入,编程者往往要从底层入手,重复劳动
,效率极低。笔者为了解决这个问题而尽点力,将本系统介绍给您,如您能读完本文,收获
一定不少。
                              
      编者:王光红

                   EMAIL:       wgh166@hotmail.com
                                wghsoftware@hotmail.com
 
软件下载:  




    一。系统介简

(一)实现功能∶
    用于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(黑色)
                                    具体色彩参数见 

  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 服务进程超过限定的数目。
阅读(433) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~