|
//通過代碼更改資料視窗對象的方法
string error_syntaxfromSQL, error_create
string new_sql, new_syntax
new_sql = 'SELECT emp_data.emp_id,emp_data.emp_name from emp_data ' &
+ 'WHERE emp_data.emp_salary>45000'
new_syntax = SQLCA.SyntaxFromSQL(new_sql,'Style(Type=Form)', error_syntaxfromSQL)
IF Len(error_syntaxfromSQL) > 0 THEN // Display errors
mle_sfs.Text = error_syntaxfromSQL
ELSE // Generate new DataWindow
dw_new.Create(new_syntax, error_create)
IF Len(error_create) > 0 THEN
mle_create.Text = error_create
END IF
END IF
dw_new.SetTransObject(SQLCA)
dw_new.Retrieve()
//開啟動態視窗的方法:
window newarray[3]
string win[3]
int i
win[1] = "w_employee"
win[2] = "w_customer"
win[3] = "w_sales"
for i = 1 to 3
Open(newarray[i], win[i])
next
//顯示一個與Windows作業系統風格一致的About對話方塊。 首先聲明如下外部函數:
function int ShellAboutA(ulong al_hWnd, string as_szApp, string as_szOtherStuff, ulong hIcon) library "shell32"
ShellAboutA(handle(parent),"關於...#擺渡人工作室","歡迎光臨擺渡人工作室",0)
//如何將COLUMN的顯示風格在EDIT、DDDW、DDLB之間相互切換:
(1)切換成DDDW:
dw_1.Modify("#1.dddw.Name='dddw_jg'")
dw_1.Modify("#1.dddw.DisplayColumn='name_jg'")
dw_1.Modify("#1.dddw.DataColumn='id_jg'")
(2)切換成DDLB:
dw_1.Modify("#1.ddlb.case='any'")
dw_1.Object.#1.Values ="red~t1/white~t2"
(3)切換成EDIT:
dw_1.Modify("#1.edit.case='any'")
dw_1.Modify("#1.edit.AutoSelect='Yes'")
(4)擷取當前風格:
dw_1.Describe("#1.Edit.Style")
(5)如果還不行,可能得要如下操作:
dw_1.Modify("#1.dddw.Name=''")一下;
//在dw_1中選定想要列印的幾條記錄
long ll_pos
dataStore lds_ds
lds_ds = create dataStore
lds_ds.dataObject = dw_1.dataObject
for ll_pos = 1 to dw_1.rowCount()
if dw_1.IsSelected(ll_pos) then
dw_1.RowsCopy(ll_pos,ll_pos,Primary!,lds_ds,lds_ds.rowCount()+1,Primary!)
end if
next
lds_ds.print()
//實現在迴圈時可以通過點擊按鈕終止迴圈
integer n
//sb_interrupt 是共用變數
sb_interrupt=false
for n=1 to 3000
yield()
if sb_interrupt then //sb_interrupt的值在"取消”按紐的Clicked事件中修改為true
MessageBox("我不幹了","你真壞!")
sb_interrupt=false
exit
else //其它處理,在單行編輯器中顯示當前n值
sle_1.text = string(n)
end if
next
//SQL語句調用規範
INTEGER li_customer_id = 1
STRING ls_city_code = '501'
PREPARE SQLSA FROM "DELETE bb_customer_info_t WHERE city_code =? AND customer_id = ?" ;
EXECUTE SQLSA USING :ls_city_code,:li_customer_id;
//通過modify函數來同時修改多個表
1、建立一個資料視窗d_grid_dep_emp,它的Select語句為
SELECT department.dept_id,
department.dept_name,
employee.emp_id,
employee.emp_fname,
employee.emp_lname
FROM department, employee
WHERE employee.dept_id = department.dept_id
2、設定資料視窗d_grid_dep_emp的屬性,將列的taborder改為非0值;並點擊菜單Rows——>Update
Properties,設定此資料視窗Allow Updates,Table to Update設為department,Updateable Columns為
department.dept_id,department.dept_name。
3、在視窗中更新資料視窗按鈕的clicked事件編寫指令碼:
long ll_rtn
// 修改Department表(Department表在第2步已設定為可更新)
ll_rtn = dw_1.update(true, false)
If ll_rtn = 1 then
//關閉對Department表的修改
dw_1.Modify("department_dept_name.Update = 'No'")
dw_1.Modify("department_dept_id.Update = 'No'")
dw_1.Modify("department_dept_id.Key = 'No'")
//設定Employee表成為新的可修改表
dw_1.Modify("DataWindow.Table.UpdateTable = 'employee'")
dw_1.Modify("employee_emp_id.Update = 'Yes'")
dw_1.Modify("employee_emp_fname.Update = 'Yes'")
dw_1.Modify("employee_emp_lname.Update = 'Yes'")
dw_1.Modify("employee_emp_id.Key = 'Yes'")
//修改Employee表
ll_rtn = dw_1.Update()
IF ll_rtn = 1 THEN
COMMIT USING SQLCA;
dw_1.retrieve()
messagebox('提示資訊','更新成功!')
ELSE
ROLLBACK USING SQLCA;
MessageBox('提示資訊', '更新失敗!')
END IF
//重設修改標誌
dw_1.Modify("department_dept_name.Update = 'Yes'")
dw_1.Modify("department_dept_id.Update = 'Yes'")
dw_1.Modify("department_dept_id.Key = 'Yes'")
dw_1.Modify("DataWindow.Table.UpdateTable = 'department'")
dw_1.Modify("employee_emp_id.Update = 'No'")
dw_1.Modify("employee_emp_fname.Update = 'No'")
dw_1.Modify("employee_emp_lname.Update = 'No'")
dw_1.Modify("employee_emp_id.Key = 'No'")
ELSE
ROLLBACK USING SQLCA;
MessageBox('提示資訊', '更新失敗!')
END IF
//可以將以上功能作成一個函數,在必要的時候調用即可。
//單擊編輯框選中其中內容
getfocus事件中書寫代碼:this.selecttext(1,len(this.text))。儲存後運行,卻得不到我們想要的
效果。想到了一個另類辦法:以pbm_bnclicked為事件ID,建立單行編輯框的自訂事件ue_clicked,
代碼是:this.selecttext(1,len(this.text)),
getfocus事件的代碼改為:This.Post Event ue_clicked()。儲存後運行,效果出來了!
//怎樣得到字串中漢字的個數
For i = 1 to Len(aString)
ls_ch = Mid(aString,i,1)
If Asc(ls_ch) >= 128 then //是漢字
li_num++
i = i+1
End if
Next
//最後,li_num就是漢字的個數了
//DW支援雙擊標題進行排序
String ls_old_sort,ls_column,ls_name,ls_criteria
Char lc_sort
IF Right(dwo.Name,2) = '_t' THEN //取得是否是欄位標題名
ls_column = LEFT(dwo.Name, LEN(String(dwo.Name)) - 2)
ls_old_sort = this.Describe("Datawindow.Table.sort")
IF ls_column = LEFT(ls_old_sort,LEN(ls_old_sort) - 2) THEN
lc_sort = RIGHT(ls_old_sort,1)
IF lc_sort = 'A' THEN
lc_sort = 'D'
ELSE
lc_sort = 'A'
END IF
this.SetSort(ls_column + " " + lc_sort)
ELSE
ls_criteria = ls_column + " A"
this.SetSort(ls_criteria)
END IF
this.Sort()
END IF
//DW支援單擊按Ctrl或Shift進行多選
int il_last_row //il_last_row為執行個體變數,記錄上次單擊的行
int li_current_row //當前單擊行
int li_row //中間變數
//未選擇就返回
if row = 0 then
return
else
li_current_row = row
end if
if keydown(keyshift!) then //按下SHIFT鍵
if il_last_row = 0 then
this.selectRow(row,true)
il_last_row = li_current_row
else
this.selectRow(0,false)
if li_current_row > il_last_row then
for li_row = il_last_row to li_current_row
this.selectrow(li_row,true)
end for
else
for li_row = il_last_row to li_current_row step -1
this.selectrow(li_row,true)
end for
end if
end if
else //未按下SHIFT鍵
il_last_row = li_current_row
if keydown(keycontrol!) then //按下CTRL鍵
if this.isSelected(li_current_row) then
this.selectrow(li_current_row,false)
else
this.selectrow(li_current_row,true)
end if
else //無CTRL鍵或SHIFT鍵按下
this.selectrow(0,false)
this.selectrow(li_current_row,true)
end if
end if
//改變DW的查詢條件陳述式
string ls_select,ls_filter
ls_select = dw_1.getSqlSelect()
ls_select = mid(ls_select,1,pos(upper(ls_select),'FROM ')+30)
ls_filter="WHERE service_kind=" + vi_service_kind + " ORDER BY FEE_ID ASC "
ls_select = ls_select + ls_filter
dw_1.Reset()
dw_1.SetTransObject(SQLCA)
dw_1.SetSQLSelect(ls_select)
dw_1.Retrieve()
//資料視窗的closeQuery事件:提示儲存資料
dw_1.AcceptText()
IF dw_1.ModifiedCount() + dw_1.DeletedCount() > 0 THEN
CHOOSE CASE MessageBox("操作提示","資料已經發生變化,是否儲存?",Question!,YesNoCancel!,1)
CASE 1
cb_save.TriggerEvent(clicked!)
CASE 2
Return 0 //不做任何操作直接關閉視窗
CASE 3
Return 1 //不會運行Close Event,維持原來的情況
END CHOOSE
END IF
//提示:請選擇要刪除的記錄
if dw_2.GetSelectedRow(0)= 0 then
MessageBox("提示資訊","請選擇要刪除的記錄!")
return
end if
//按某欄位進行排序
IF dwo.name = "fee_id_t" THEN
this.setSort("fee_id a")
this.sort()
elseif dwo.name = "fee_position_t" then
this.setsort("fee_position a, fee_id a")
this.sort()
END IF
//控制DATAWINDOW裡每頁顯示的行數
1、在Datawindow中增加一個計算域,起名為:ceil_page,此計算域必須放在Detail段中,
Expression中輸入 ceiling(getrow()/25) 25表示每頁列印25行,也可以是一個參數。
2、分組,選擇菜單Rows/Create Group,選擇ceil_page
按ceil_page分組,並選中New Page On Group Break(意思是新組開始時換頁)。
3、將此計算域設為隱藏(在屬性頁面中的expression頁中在visible屬性中寫0)。
4、補空行:
在視窗的open事件中寫如下代碼:
long li_count,li_i
li_count=dw_1.retrieve()
if mod(li_count,25)<>0 then
for li_i=1 to 25 - mod(li_count,25)
dw_1.insertrow(0)
next
end if
//如何?資料視窗資料的自動折行
1) 在DataWindow Painter中開啟此DataWindow對象。
2) 在需設定自動折行的列上雙擊滑鼠, 彈開此列的屬性視窗。
3) 選擇Position標籤, 選中Autosize Height 多選框。
4) 選擇Edit標籤, 不選中Auto Horz Scroll多選框。
5) 單擊OK按鈕, 儲存所做的修改。
6) 點中Detail Band (即寫有Detail的灰色長帶), 單擊滑鼠右鍵, 選擇 Properties... 功能表項目。
7) 選中Autosize Height多選框。
8) 單擊OK按鈕, 儲存所做的修改。
9) 儲存此DataWindow。
注意:連在一起的漢字(中間沒有標點或空格分隔), 系統將認為是一個單詞, 不會自動進行折行,
英文也是如此……DW視窗折行如果有漢字的話就必需中間加空格才會折行,否則怎樣設定都不行。例如你
如果想在第20位折行,就先判斷第20位是否是個漢字,如不是就在第20位後加空格,如果是漢字就在
第19位加空格。判斷是否是漢字可以用它的ASCII碼是否大於127來判斷。
//按條件對某行資料進行顏色區分
case(cj when is >= 90 then rgb(255,0,0) when is < 60 then rgb(0,255,0) else rgb(0,0,255)))
//PB中同時串連多個資料庫,如串連SQLServer2000和Oracle8
string ls_startupfile
ls_startupfile='hisini.ini'
sqlca.DBMS = ProfileString(ls_startupfile, "database", "dbms", "")
sqlca.database = ProfileString(ls_startupfile, "database", "database", "")
sqlca.userid = ProfileString(ls_startupfile, "database", "userid", "")
sqlca.dbpass = ProfileString(ls_startupfile, "database", "dbpass", "")
sqlca.logid = ProfileString(ls_startupfile, "database", "logid", "")
sqlca.logpass = ProfileString(ls_startupfile, "database", "LogPassWord", "")
sqlca.servername = ProfileString(ls_startupfile, "database", "servername", "")
sqlca.dbparm = ProfileString(ls_startupfile, "database", "dbparm", "")
remote_trans= CREATE transaction
remote_trans.DBMS = ProfileString(ls_startupfile, "Database_remote", "dbms", "")
remote_trans.database = ProfileString(ls_startupfile, "Database_remote", "database", "")
remote_trans.userid = ProfileString(ls_startupfile, "database_remote", "userid", "")
remote_trans.dbpass = ProfileString(ls_startupfile, "database_remote", "dbpass", "")
remote_trans.logid = ProfileString(ls_startupfile, "database_remote", "logid", "")
remote_trans.logpass = ProfileString(ls_startupfile, "database_remote", "LogPassWord", "")
remote_trans.servername = ProfileString(ls_startupfile, "database_remote", "servername", "")
remote_trans.dbparm = ProfileString(ls_startupfile, "database_remote", "dbparm", "")
//附hisini.ini
[Database]
DBMS=MSS Microsoft SQL Server 6.x
Database=his
UserId=
DatabasePassword=
ServerName=.
LogId=sa
Lock=
Prompt=0
computer='11'
ocx= 0
use0='之住院管理'
cfprint='1'
[Database_remote]
DBMS = "O84 Oracle8/8i(8.x.4+)"
ServerName = "oracle8"
LogId = "dba"
Database=zx
UserId=
DatabasePassword=
Lock=
Prompt=0
computer='11'
ocx= 0
cfprint='1'
//PB6.5串連Oracle8i和9i的情況
SQLCA.DBMS = "O84 Oracle8/8i (8.x.4+)"
SQLCA.LogPass = "test"
SQLCA.ServerName = "myora"
SQLCA.LogId = "test"
SQLCA.AutoCommit = False
SQLCA.DBParm = "TableCriteria=',test,''TABLE'',''VIEW'''"
//在檢索的資料行上再加上一行記錄
dataWindowChild dwc
dw_service.getchild('svcid',dwc)
dwc.settransobject(sqlca)
dwc.retrieve()
dwc.insertrow(1)
dwc.setitem(1,'svcid','00')
dwc.setitem(1,'svcname','不區分')
dw_service.setTransObject(sqlca)
dw_service.Retrieve()
//資料視窗中按enter鍵實現tab功能(在資料視窗的Enter事件中)
send(handle(this),256,9,long(0,0))
return 1
//send用法:Send(handle,message#,lowword,long)
//This statement scrolls the window w_emp up one page:
Send(Handle(w_emp), 277, 2, 0)
//Both of the following statements click the CommandButton cb_OK:
Send(Handle(Parent), 273, 0, Handle(cb_OK))
cb_OK.TriggerEvent(Clicked!)
//minimizes the DataWindow:
Send(Handle(dw_1), 274, 61472, 0)
//maximizes the DataWindow:
Send(Handle(dw_1), 274, 61488, 0)
//returns the DataWindow to its normal, defined size:
Send(Handle(dw_1), 274, 61728, 0)
//重設資料視窗的檢索語句
ls_accept_city = gs_citycode
ld_beg_date = datetime(date(em_assign_beg_date.text),time('00:00:00'))
ld_end_date = datetime(date(em_assign_end_date.text),time('23:59:59'))
ls_where = " WHERE b.assign_date >= :id_begin_date &
AND b.assign_date <= :id_end_date &
AND a.register_number = b.register_number &
AND a.accept_city = :is_accept_city &
AND a.action = 6 AND current_action = 1 AND status IN(1,-1) "
ls_sql = dw_wp.Describe("DataWindow.Table.Select")
if pos(ls_sql,'WHERE') <> 0 then
ls_sql = mid(ls_sql,1,pos(ls_sql,'WHERE') - 1)
end if
ls_sql = 'DataWindow.Table.Select=" ' + ls_sql + ls_where + '"'
ls_err_info = dw_wp.modify(ls_sql)
if ls_err_info <> "" then
messagebox('提示資訊','查詢異常,請核查' + ls_err_info)
return
end if
af_connect()
dw_wp.settransobject(sqlca)
dw_wp.retrieve(ld_beg_date,ld_end_date,ls_accept_city)
af_disconnect()
|