$PBExportHeader$f_rpt_gdw.srf $PBExportComments$由SQL语句产生dw并取出字段信息--函数 global type f_rpt_gdw from function_object end type forward prototypes global function string f_rpt_gdw (string fsql, ref datawindow fdw, transaction ft, string fs, string ftable) end prototypes global function string f_rpt_gdw (string fsql, ref datawindow fdw, transaction ft, string fs, string ftable);string ls[] datastore lds int li,lj,lk boolean lb lb=ft.AutoCommit//取出原来属性 lds=create datastore ft.AutoCommit=True ls[1]=ft.SyntaxFromSQL(fsql,"style(type=Grid )",ls[9])//用"select * from table"生成动态dw语法 ft.AutoCommit=lb if ls[9]>'' then goto myerr lds.Create(ls[1],ls[9]) if ls[9]>'' then goto myerr li=long(lds.describe('DataWindow.Column.Count'))//字段总数 for lj=1 to li ls[1]=lds.describe("#"+string(lj)+'.name')//字段英文名 ls[2]=lds.describe(ls[1]+'_t.text')//字段中文名 if left(ls[2],1)='"' and right(ls[2],1)='"' then ls[2]=mid(ls[2],2,len(ls[2]) -2)//在access数据库下且字段名为英文注释时发现多加双引号"的情况 end if ls[3]=lds.describe(ls[1]+'.coltype')//字段类型 if lower(ls[3]) = 'char' then ls[3] = 'char(1000)' ls[4]=lds.describe(ls[1]+'.dbname')//表英文名.字段名 ls[2]=fs+ls[2]//fs为w_rpt_sql的A中文表名.中文字段名 ls[5]=lds.describe(ls[1]+'.initial') ls[6]=lds.describe(ls[1]+'.key') ls[7]=lds.describe(ls[1]+'.update') // if ii_tables>=2 then ls[1]=left(ls[6]+'_'+ls[1],40)//表英文名_字段名,PB的columnname时只能处理40位 lk=fdw.insertrow(0) fdw.setitem(lk,'cname',ls[1]) fdw.setitem(lk,'ctag',ls[2]) fdw.setitem(lk,'ctype',ls[3]) fdw.setitem(lk,'cdbname',ls[4]) fdw.setitem(lk,'cinitial',ls[5]) fdw.setitem(lk,'ckey',ls[6]) fdw.setitem(lk,'cupdate',ls[7]) fdw.setitem(lk,'clen1',long(ls[2])) fdw.setitem(lk,'clen2',f_clen(ls[3])) next destroy lds return '' myerr: //为了兼容表中含有PB不能处理的字段(如blob类型),而又不想建立视图时读取字段名的办法,但如果在MSSQL建表后没有在PB中加过字段信息,则此方法也取不到字段名 if ftable>'' then long l[] fsql="select pbc_cnam,pbc_labl from pbcatcol where pbc_tnam='"+ftable+"'" ft.AutoCommit=True ls[1]=ft.SyntaxFromSQL(fsql,"style(type=grid)",ls[9])//用"select * from table"生成动态dw语法 ft.AutoCommit=lb if ls[9]>'' then goto myerr lds.Create(ls[1],ls[9]) if ls[9]>'' then goto myerr lds.settransobject(ft) lds.retrieve() l[1]=lds.rowcount() for lj=1 to l[1] ls[1]=trim(lds.getitemstring(lj,1))//字段英文名 ls[2]=trim(lds.getitemstring(lj,1))//字段中文名 ls[4]=ftable+'.'+ls[1]//表英文名.字段名 // if ii_tables>=2 then s[1]=left(s[6]+'_'+s[1],40)//表英文名_字段名,PB的columnname时只能处理40位 ls[2]=fs+ls[2]//fs为w_rpt_sql的A中文表名.中文字段名 lk=fdw.insertrow(0) fdw.setitem(lk,'cname',ls[1]) fdw.setitem(lk,'ctag',ls[2]) fdw.setitem(lk,'cdbname',ls[4]) next end if destroy lds return ls[9] end function