f_rpt_gdw_lwl.srf 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. $PBExportHeader$f_rpt_gdw_lwl.srf
  2. $PBExportComments$由SQL语句产生dw并取出字段信息--函数
  3. global type f_rpt_gdw_lwl from function_object
  4. end type
  5. forward prototypes
  6. global function string f_rpt_gdw_lwl (string fsql, ref datawindow fdw, transaction ft, string fs, string ftable)
  7. global function string f_rpt_gdw_lwl (datastore lds, ref datawindow fdw, transaction ft, string fs, string ftable)
  8. end prototypes
  9. global function string f_rpt_gdw_lwl (string fsql, ref datawindow fdw, transaction ft, string fs, string ftable);string ls[]
  10. datastore lds
  11. int li,lj,lk
  12. boolean lb
  13. lb=ft.AutoCommit//取出原来属性
  14. lds=create datastore
  15. ft.AutoCommit=True
  16. ls[1]=ft.SyntaxFromSQL(fsql,"style(type=Grid )",ls[9])//用"select * from table"生成动态dw语法
  17. ft.AutoCommit=lb
  18. if ls[9]>'' then goto myerr
  19. lds.Create(ls[1],ls[9])
  20. if ls[9]>'' then goto myerr
  21. li=long(lds.describe('DataWindow.Column.Count'))//字段总数
  22. for lj=1 to li
  23. ls[1]=lds.describe("#"+string(lj)+'.name')//字段英文名
  24. ls[2]=lds.describe(ls[1]+'_t.text')//字段中文名
  25. if left(ls[2],1)='"' and right(ls[2],1)='"' then
  26. ls[2]=mid(ls[2],2,len(ls[2]) -2)//在access数据库下且字段名为英文注释时发现多加双引号"的情况
  27. end if
  28. ls[3]=lds.describe(ls[1]+'.coltype')//字段类型
  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
  77. global function string f_rpt_gdw_lwl (datastore lds, ref datawindow fdw, transaction ft, string fs, string ftable);string ls[]
  78. int li,lj,lk
  79. boolean lb
  80. lb=ft.AutoCommit//取出原来属性
  81. ft.AutoCommit=True
  82. ft.AutoCommit=lb
  83. li=long(lds.describe('DataWindow.Column.Count'))//字段总数
  84. for lj=1 to li
  85. ls[1]=lds.describe("#"+string(lj)+'.name')//字段英文名
  86. ls[2]=lds.describe(ls[1]+'_t.text')//字段中文名
  87. if left(ls[2],1)='"' and right(ls[2],1)='"' then
  88. ls[2]=mid(ls[2],2,len(ls[2]) -2)//在access数据库下且字段名为英文注释时发现多加双引号"的情况
  89. end if
  90. ls[3]=lds.describe(ls[1]+'.coltype')//字段类型
  91. if lower(ls[3]) = 'char' then ls[3] = 'char(1000)'
  92. ls[4]=lds.describe(ls[1]+'.dbname')//表英文名.字段名
  93. ls[2]=fs+ls[2]//fs为w_rpt_sql的A中文表名.中文字段名
  94. ls[5]=lds.describe(ls[1]+'.initial')
  95. ls[6]=lds.describe(ls[1]+'.key')
  96. ls[7]=lds.describe(ls[1]+'.update')
  97. // if ii_tables>=2 then ls[1]=left(ls[6]+'_'+ls[1],40)//表英文名_字段名,PB的columnname时只能处理40位
  98. lk=fdw.insertrow(0)
  99. fdw.setitem(lk,'cname',ls[1])
  100. fdw.setitem(lk,'ctag',ls[2])
  101. fdw.setitem(lk,'ctype',ls[3])
  102. fdw.setitem(lk,'cdbname',ls[4])
  103. fdw.setitem(lk,'cinitial',ls[5])
  104. fdw.setitem(lk,'ckey',ls[6])
  105. fdw.setitem(lk,'cupdate',ls[7])
  106. fdw.setitem(lk,'clen1',long(ls[2]))
  107. fdw.setitem(lk,'clen2',f_clen(ls[3]))
  108. next
  109. return ''
  110. end function