前 言
當前windods 上的編程工具日新月異,推陳出新;然而因unix運用的局限性,其編程工
具十分貧乏。在unix上要做畫面、菜單、查詢、輸入,編程者往往要從底層入手,重復勞動
,效率極低。筆者為了解決這個問題而盡點力,將本系統介紹給您,如您能讀完本文,收獲
一定不少。
編者:王光紅
email: [email protected]
[email protected]
軟件下載:
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 數據庫(指定遠程數據庫),形式[email protected]
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 服務進程超過限定的數目。