f_rpt_gdw.srf 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. $PBExportHeader$f_rpt_gdw.srf
  2. $PBExportComments$由SQL语句产生dw并取出字段信息--函数
  3. global type f_rpt_gdw from function_object
  4. end type
  5. forward prototypes
  6. global function string f_rpt_gdw (string fsql, ref datawindow fdw, transaction ft, string fs, string ftable)
  7. end prototypes
  8. global function string f_rpt_gdw (string fsql, ref datawindow fdw, transaction ft, string fs, string ftable);string ls[]
  9. datastore lds
  10. int li,lj,lk
  11. boolean lb
  12. lb=ft.AutoCommit//取出原来属性
  13. lds=create datastore
  14. ft.AutoCommit=True
  15. ls[1]=ft.SyntaxFromSQL(fsql,"style(type=Grid )",ls[9])//用"select * from table"生成动态dw语法
  16. ft.AutoCommit=lb
  17. if ls[9]>'' then goto myerr
  18. lds.Create(ls[1],ls[9])
  19. if ls[9]>'' then goto myerr
  20. li=long(lds.describe('DataWindow.Column.Count'))//字段总数
  21. for lj=1 to li
  22. ls[1]=lds.describe("#"+string(lj)+'.name')//字段英文名
  23. ls[2]=lds.describe(ls[1]+'_t.text')//字段中文名
  24. if left(ls[2],1)='"' and right(ls[2],1)='"' then
  25. ls[2]=mid(ls[2],2,len(ls[2]) -2)//在access数据库下且字段名为英文注释时发现多加双引号"的情况
  26. end if
  27. ls[3]=lds.describe(ls[1]+'.coltype')//字段类型
  28. if lower(ls[3]) = 'char' then ls[3] = 'char(1000)'
  29. ls[4]=lds.describe(ls[1]+'.dbname')//表英文名.字段名
  30. ls[2]=fs+ls[2]//fs为w_rpt_sql的A中文表名.中文字段名
  31. ls[5]=lds.describe(ls[1]+'.initial')
  32. ls[6]=lds.describe(ls[1]+'.key')
  33. ls[7]=lds.describe(ls[1]+'.update')
  34. // if ii_tables>=2 then ls[1]=left(ls[6]+'_'+ls[1],40)//表英文名_字段名,PB的columnname时只能处理40位
  35. lk=fdw.insertrow(0)
  36. fdw.setitem(lk,'cname',ls[1])
  37. fdw.setitem(lk,'ctag',ls[2])
  38. fdw.setitem(lk,'ctype',ls[3])
  39. fdw.setitem(lk,'cdbname',ls[4])
  40. fdw.setitem(lk,'cinitial',ls[5])
  41. fdw.setitem(lk,'ckey',ls[6])
  42. fdw.setitem(lk,'cupdate',ls[7])
  43. fdw.setitem(lk,'clen1',long(ls[2]))
  44. fdw.setitem(lk,'clen2',f_clen(ls[3]))
  45. next
  46. destroy lds
  47. return ''
  48. myerr:
  49. //为了兼容表中含有PB不能处理的字段(如blob类型),而又不想建立视图时读取字段名的办法,但如果在MSSQL建表后没有在PB中加过字段信息,则此方法也取不到字段名
  50. if ftable>'' then
  51. long l[]
  52. fsql="select pbc_cnam,pbc_labl from pbcatcol where pbc_tnam='"+ftable+"'"
  53. ft.AutoCommit=True
  54. ls[1]=ft.SyntaxFromSQL(fsql,"style(type=grid)",ls[9])//用"select * from table"生成动态dw语法
  55. ft.AutoCommit=lb
  56. if ls[9]>'' then goto myerr
  57. lds.Create(ls[1],ls[9])
  58. if ls[9]>'' then goto myerr
  59. lds.settransobject(ft)
  60. lds.retrieve()
  61. l[1]=lds.rowcount()
  62. for lj=1 to l[1]
  63. ls[1]=trim(lds.getitemstring(lj,1))//字段英文名
  64. ls[2]=trim(lds.getitemstring(lj,1))//字段中文名
  65. ls[4]=ftable+'.'+ls[1]//表英文名.字段名
  66. // if ii_tables>=2 then s[1]=left(s[6]+'_'+s[1],40)//表英文名_字段名,PB的columnname时只能处理40位
  67. ls[2]=fs+ls[2]//fs为w_rpt_sql的A中文表名.中文字段名
  68. lk=fdw.insertrow(0)
  69. fdw.setitem(lk,'cname',ls[1])
  70. fdw.setitem(lk,'ctag',ls[2])
  71. fdw.setitem(lk,'cdbname',ls[4])
  72. next
  73. end if
  74. destroy lds
  75. return ls[9]
  76. end function