現在客戶要做一個介面,需要每天將sqlsever中幾張視圖新發生的業務資料匯入到一個oracle資料庫的幾張表中,關鍵還要每天定時自動運行,要能做到無人值守……之前的想法是先將視圖匯出成xml或者txt,然后再匯入,但是不知道怎么才能做到自動運行,開發要用pb9.0,有哪些合適的函式可以用呢?
或者大神們給點其它建議,只要可以達到客戶的要求就好!
uj5u.com熱心網友回復:
主程式設定定時間隔time(num),定間隔執行在PB視窗的timer事件中,寫上倒sqlinsert into B select * from A等之類如果是sql 資料庫,可以在后臺用job做
uj5u.com熱心網友回復:
windows計劃任務然后就是Timer()
然后就是比較時間了
不行就不用計劃任務,直接定時開機,開機自動運行,完事直接自動關機就是了
uj5u.com熱心網友回復:
主程式設定定時間隔time(num),定間隔執行在PB視窗的timer事件中,寫上倒sqlinsert into B select * from A等之類如果是sql 資料庫,可以在后臺用job做
uj5u.com熱心網友回復:
如果SQL和ORACLE可以互相連接,為什么不用JOB?uj5u.com熱心網友回復:
sqlsever 資料庫和oracle沒法互相連接,我還在嘗試使用timer定時執行從sqlsever查出指定資料,然后寫入txt或者存在一個類似于C#的dataset里,然后再連接oracle寫入,亞馬遜上買到一本pb書,看到pb里有個datastore,應該可以存查出來的資料吧。一共有31張表……
uj5u.com熱心網友回復:
PB用不同的事務連接2個不同的資料庫,通過timer()事件控制事件的觸發時間,然后把需要的資料檢索出來到datasotre,再寫入到連接oracel資料datastore,然后再保存資料。
uj5u.com熱心網友回復:
是啊,PB寫程式,兩個事務連接,A連接SQL,B連接ORACLE
然后,做二個資料視窗,A資料視窗連到SQL,B資料視窗連到ORACLE
程式啟動后,A資料視窗提取資料,然后向B資料視窗寫入資料,最后B資料視窗UPDATE。
然后程式退出
在WINDOWS中,使用計劃任務定時執行程式即可
uj5u.com熱心網友回復:
哈哈謝謝哈,我試試看
uj5u.com熱心網友回復:
大神,現在我已經將兩個資料庫都連好,而且已經把需要檢索的資料檢索出來放到一個datastore里,又遇到兩個問題,datastore怎么寫到到另一個datastroe中去,然后怎么寫人呢?我用Bdatastore=Adatastore,但是后面不知道怎么更新了
uj5u.com熱心網友回復:
查看 RowsCopy() 函式
uj5u.com熱心網友回復:
呵呵已經成功了~多謝哈
uj5u.com熱心網友回復:
每天將sqlsever中幾張視圖新發生的業務資料匯入到一個oracle資料庫在 sqlsever 建個任務就直接做完了,需要PB干什么
非整個PB的exe 惡心人?還是不想讓用戶感覺太簡單?
uj5u.com熱心網友回復:
如果是自動運行的,根本不需要pb,直接在Oracle或sqlserver上做自動作業,定時提取資料就可以了。運行效率又高,腳本修改也方便。uj5u.com熱心網友回復:
sqlserver 用 自動執行管理任務(SQL Server 代理);如果是oracle,用dbms_job包;
uj5u.com熱心網友回復:
不用這么費勁吧,可以創建兩個連接,同時連兩個資料庫,然后用代碼寫吧,有什么的難的啊我自己以前寫過的 參考參考吧
string sql1,nfyf
string sb_rq,sb_rq1
int i
sb_rq=string(today(),'yyyy-mm-dd')
date sj1
sj1= RelativeDate(date(sb_rq),-3)
sb_rq1 = string(sj1,'yyyy-mm-dd')
string orabz1,net_flog1,sername1,username1,ora1
string orabz2,net_flog2,sername2,username2,ora2
orabz1= profilestring("hs_imp.ini","sys_loca","ora_ver" ,"")
net_flog1= profilestring("hs_imp.ini","sys_loca","net_flog" ,"")
sername1=profilestring("hs_imp.ini","sys_loca","sername" ,"")
username1=profilestring("hs_imp.ini","sys_loca","username" ,"")
if orabz1='' or isnull(orabz1) then
messagebox('對不起','連接本地服務器沒有進行系統初始化!')
halt;
end if
choose case orabz1
case '1'
ora1="O73 ORACLE 7.3"
case '2'
ora1="O84 Oracle8/8i (8.x.4+)"
case '3'
ora1="O90 Oracle9i (9.0.1)"
case '4'
ora1="O84 Oracle8/8i (8.x.4+)"
end choose
SQLCA.DBMS = ora1
if net_flog1='1' then
SQLCA.ServerName =sername1
end if
SQLCA.LogPass = username1
SQLCA.LogId = username1
SQLCA.AutoCommit = False
SQLCA.DBParm = "PBCatalogOwner='"+username1+"'"
Connect using sqlca;
/////////////////////////////////////////////
orabz2= profilestring("hs_imp.ini","sys_net","ora_ver" ,"")
net_flog2= profilestring("hs_imp.ini","sys_net","net_flog" ,"")
sername2=profilestring("hs_imp.ini","sys_net","sername" ,"")
username2=profilestring("hs_imp.ini","sys_net","username" ,"")
if orabz2='' or isnull(orabz2) then
messagebox('對不起','連接遠程服務器沒有進行系統初始化!')
halt;
end if
choose case orabz2
case '1'
ora2="O73 ORACLE 7.3"
case '2'
ora2="O84 Oracle8/8i (8.x.4+)"
case '3'
ora2="O90 Oracle9i (9.0.1)"
case '4'
ora2="O84 Oracle8/8i (8.x.4+)"
end choose
TransAction ltra_source
ltra_source = Create TransAction
ltra_source.dbms = ora2
if net_flog2='1' then
ltra_source.ServerName =sername2
end if
ltra_source.LogPass = username2
ltra_source.LogId = username2
ltra_source.DBParm = "PBCatalogOwner='"+username2+"'"
Connect using ltra_source;
///////////////////////// /////////////////////////
sql1='select max(syearmonth) from rmdict_ccrecord'
DECLARE my_cursor DYNAMIC CURSOR FOR sqlsa ;
PREPARE sqlsa FROM :sql1 using ltra_source;
OPEN DYNAMIC my_cursor ;
if ltra_source.sqlcode = 0 then
fetch my_cursor into :nfyf;
end if
close my_cursor;
string ERRORS, sql_syntax
string presentation_str, dwsyntax_str
string table[],del_tql,sql_tql
table[1]=" from rmbss_dept"
table[2]=" from rmbss_outboundmain where smakedate='"+nfyf+"'"
table[3]=" from rmbss_outbounddetail where smakedate='"+nfyf+"'"
table[4]=" from rmdict_depot where sunitcode='2SY0071078'"
table[5]=" from rmdict_equipment where to_char(dusedate,'yyyy-mm-dd') >='"+sb_rq1+"'"
//messagebox('',table[5])
for i=1 to 5
st_2.text='正在洗掉本地'+table[i]+"資料!"
del_tql="delete "+table[i]
EXECUTE IMMEDIATE :del_tql using sqlca;
commit using sqlca;
next
for i=1 to 5
st_2.text='正在下載遠程'+table[i]+"資料!"
sql_syntax = "SELECT * "+table[i]
presentation_str = "style(type=grid)"
dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, &
presentation_str, ERRORS)
IF Len(ERRORS) > 0 THEN
MessageBox("Caution", &
"SyntaxFromSQL caused these errors: " + ERRORS)
RETURN
END IF
dw_1.Create( dwsyntax_str, ERRORS)
dw_1.object.datawindow.readonly=true
dw_1.SetTransObject(sqlca)
dw_1.Retrieve( )
///////
sql_syntax = "SELECT * "+table[i]
presentation_str = "style(type=grid)"
dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, &
presentation_str, ERRORS)
IF Len(ERRORS) > 0 THEN
MessageBox("Caution", &
"SyntaxFromSQL caused these errors: " + ERRORS)
RETURN
END IF
dw_2.Create( dwsyntax_str, ERRORS)
dw_2.object.datawindow.readonly=true
dw_2.SetTransObject(ltra_source)
dw_2.Retrieve( )
if dw_2.rowcount() > 0 then
dw_2.RowsCopy(1, dw_2.RowCount(), Primary!, dw_1, 1, Primary!)
dw_1.update()
commit using sqlca;
end if
next
sql_tql="update rmdict_equipment set sefferflag='1' where to_char(dusedate,'yyyy-mm-dd')<='"+sb_rq1+"'"
// messagebox('',sql_tql)
EXECUTE IMMEDIATE :sql_tql using ltra_source;
commit using ltra_source;
//
st_2.text=string(today(),'yyyy-mm-dd hh:mm:ss')+"完成遠程資料下載!"
uj5u.com熱心網友回復:
把上面的代碼 弄到timer事件里,每天定時做一次,就行了uj5u.com熱心網友回復:
明顯是直接建個作業方便。uj5u.com熱心網友回復:
作業不會就用,資料管道吧,也不錯,很方便uj5u.com熱心網友回復:
注意欄位型別以及重復資料導致主鍵沖突;我以前做過從別的公司系統匯入到我們系統;uj5u.com熱心網友回復:
方法有很多:舉一個你能實作的,建資料管道,定時執行就能解決的你問題,如果不OK,請聯系我,包你搞定
uj5u.com熱心網友回復:
sqlserver 用 自動執行管理任務(SQL Server 代理);如果是oracle,用dbms_job包;
uj5u.com熱心網友回復:
單獨用PB建一個程式(用于倒資料的),在服務器中作為常駐程式運行,定時執行。程式中可以使用pipeline即可。uj5u.com熱心網友回復:
定時呼叫pipeline轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/49767.html
標籤:腳本語言
