文档章节

Tiptop GP中Excel的控制方法

买个ZIPPO点蚊香
 买个ZIPPO点蚊香
发布于 2015/08/25 17:30
字数 1761
阅读 108
收藏 0
点赞 0
评论 0

相信许多公司虽然用上了tiptop erp系统,但是Excel在表格制作或者数据分析方面仍然起着举足轻重的作用。鼎新有自己的产生excel文件的方式,就是产生xml格式的excel文件,这种方式复杂,不直观,而且格式也不是微软默认的二进制格式的文件,要从excel文件中导入数据到tiptop数据库中就更无从谈起。

       那么有没有其他的办法呢?

       经过笔者对GDC的分析并且参考了4js官方提供的GDC手册,找到了实现的方法。通常在其他开发工具中(例如VB,Delphi),我们可以使用COM的方式来跟excel application进行通讯,那么,GDC也是透过同样的方式来实现。

       因为GDC是一个客户端的工具,所以实现COM完全没有问题。它通过ui,interface.frontcall()这个函数来实现,此函数以下的几种调用方法:

1:CALL ui.interface.frontcall("WinCOM","CreateInstance",[program],[handle]   ##创建COM实例

   1.program参数是在系统中注册的COM对象的类名。

   2.handle是一个整型变量,用来接收函数返回的状态值。

   3.如果函数调用时产生错误,则handle返回-1,如果没有错误,则此值可以在后续的API函数中使用。

2:CALL ui.interface.frontcall("WinCOM","CallMethod",[handle,method,arg1,...],[result]) OR [handle,method(arg1,...)],[result])  #调用对象指定的方法

   1.handle是其他前端调用函数返回的句柄(比如:CreateInstance,CallMethod,GetProperty)。

   2.method是调用的函数名字。

   3.arg1...这些是传递给此方法的参数,对于我们本文说的excel来说,可以用宏的方式来确定参数是否正确,这个后面还会述及。

   4.result是一个返回值,如果值为-1,表示有错误。

3.CALL ui.interface.frontcall("WinCOM","GetProperty",[Handle,member],[result]   #获得属性

   1.handle意义同上。

   2.member是要获得的属性的名字。

   3.result意义同上。

4.CALL ui.interface.frontcall("WinCOM","SetProperty",[handle,member,value],[result]  #设置属性

   1.handle意义同上。

   2.member是要设置的属性的名字。

   3.value是属性的值。

   4.result意义同上。

5.CALL ui.interface.frontcall("WinCOM","GetError",[],[result]   #获取错误信息

   1.result是最后一次错误的描述。

   2.如果没有错误,则返回NULL值。

6.CALL ui.interface.frontcall("WinCOM","ReleaseInstance",[handle],[result])

   1.handle意义同上。

   2.result为-1表示调用有错误,没有错误时,其值为0。

简单介绍完以上的函数之后,我们以一个例子来说明,这些函数的用法,代码如下:

define xlapp    integer
define xlwb     integer
main
  define result    integer
  define str       string
  define filename  string
  
  let xlapp = -1
  let xlwb = -1
  
  #####  创建excel实例  #####
  call ui.interface.frontcall("WinCOM","CreateInstance",["Excel.Application"],[xlapp])
  call checkError(xlapp,__LINE__)
  
  #####  新建excel文件或者打开现有的excel文件  #####
  --call ui.interface.frontcall("WinCOM","CallMethod",[xlapp,"WorkBooks.Add"],[xlwb])  #新建
  let filename="c:\\temp\\test.xls"
  call ui.interface.frontcall("WinCOM","CallMethod",[xlapp,"WorkBooks.Open",filename],[xlwb])  #打开原来的
  call checkError(xlwb,__LINE__)
  
  #####  使excel实例可见  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"Visible",true],[result])
  call checkError(result,__LINE__)

  #####  设定sheet2为当前的sheet  #####
  call ui.interface.frontcall("WinCOM","CallMethod",[xlwb,'Sheets("Sheet2").Select'],[result])
  call checkError(result,__LINE__)

  #####  显示格线  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"ActiveWindow.DisplayGridlines",false],[result])
  call checkError(result,__LINE__)

  #####  填充单元格数据  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2").Value',"中国人民"],[result])
  call checkError(result,__LINE__)

  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Cells(3,2).Value',"方法1"],[result])
  call checkError(result,__LINE__)

  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Cells(4,2).Value',"方法2"],[result])
  call checkError(result,__LINE__)
  
  #####  单元格画线  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(7).LineStyle',1],[result])   #左边
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(7).Weight',-4138],[result])  #左边
  call checkError(result,__LINE__)

  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(8).LineStyle',1],[result])   #上边
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(8).Weight',-4138],[result])  #上边
  call checkError(result,__LINE__)
  
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(9).LineStyle',1],[result])   #下边
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(9).Weight',-4138],[result])  #下边
  call checkError(result,__LINE__)
  
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(10).LineStyle',1],[result])   #下边
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(10).Weight',-4138],[result])  #下边
  call checkError(result,__LINE__)
  
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(12).LineStyle',1],[result])   #内部水平线
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("B2:B4").Borders(12).Weight',2],[result])      #内部水平线
  call checkError(result,__LINE__)
  
  #####  单元格合并  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("D2").Value',"此处为合并单元格"],[result])
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("D2:F5").HorizontalAlignment',-4108],[result])
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("D2:F5").VerticalAlignment',-4108],[result])
  call checkError(result,__LINE__)
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Range("D2:F5").MergeCells',true],[result])
  call checkError(result,__LINE__)
  
  #####  设置列宽  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Columns("E:E").ColumnWidth',15],[result])
  call checkError(result,__LINE__)
  
  #####  设置行高  #####
  call ui.interface.frontcall("WinCOM","SetProperty",[xlwb,'activesheet.Rows("1:1").RowHeight',25],[result])
  call checkError(result,__LINE__)
  
  #####  获取单元格的值  #####
  call ui.interface.frontcall("WinCOM","GetProperty",[xlwb,'activesheet.Range("A1").Value'],[str])
  call checkError(str,__LINE__)
  display "content of the cell is :" || str
  
  #####  获取行数  #####
  call ui.interface.frontcall("WinCOM","GetProperty",[xlwb,'activesheet.UsedRange.Rows.Count'],[result])
  call checkError(result,__LINE__)
  display "Total Used Rows is :" || result
  
  #####  获取列数  #####
  call ui.interface.frontcall("WinCOM","GetProperty",[xlwb,'activesheet.UsedRange.Columns.Count'],[result])
  call checkError(result,__LINE__)
  display "Total Used Cols is :" || result
  
  call freeMemory()
end main

function freeMemory()
  define res  integer
  
  if xlwb != -1 then
    call ui.interface.frontcall("WinCOM","ReleaseInstance",[xlwb],[res])
  end if
  
  if xlapp != -1 then
    #call ui.interface.frontcall("WinCOM",'CallMethod',[xlapp,'Quit'],[res])  #退出
    call ui.interface.frontcall("WinCOM","ReleaseInstance",[xlapp],[res])
  end if
end function

function checkError(res,lin)
  define res     integer
  define lin     integer
  define mess    string
  
  if res = -1 then
    display "COM Error for call at line:", lin
    call ui.interface.frontcall("WinCOM","GetError",[],[mess])
    display mess
  
    call freeMemory()
    display "Exit with COM Error."
    exit program (-1)
  end if
end function

  以上代码只是一个简单的例子,抛砖引玉而已,你可以将其扩充一下,使其可以导出tiptop erp的业务数据,而且可以加入业务逻辑,使excel作为一个报表工具;或者把excel的数据导入tiptop中做进一步的分析,减少用户输入的时间。

    在控制excel的时候,有以下的说明供参考:

1.如何知道property的语法?

  有个简单的办法,打开一个excel文件,选择录制宏,然后做相应的操作,然后结束录制,查看宏代码,这里的代码虽然是VBA的,但是拿来参考基本上没有问题的。

2.VBA代码中的常量(比如:xlThin,xlMedium等),在BDL代码中不认识怎么办?

  可以去网上查,问问谷哥或者度娘,他们一定会告诉你的。

  或者也可以来问我,我有完整的文档。(我的是borland工程师整理的,原本是用在delphi中的),如果用的特别多的,也可以把这些常量放在一个4gl文件中,作为global的方式使用在代码中,这样就比较方便了。比如上例中的activesheet.Range("B2:B4").Borders(10),为什么是10呢?这个就是VBA代码中翻译过来的。


后记:

理论上讲,用GDC可以控制所有的COM对象,比如:Word,Outlook等。当然这个大多限于微软的系统,因为COM本身就是微软所倡导的技术。这里的GDC,也只限于GDC for Windows.以上代码在GDC 2.02.04,GP5环境下测试成功,其他环境无法保证。作者参考的官方网址:http://www.4js.com/online_documentation/fjs-gdc-manual-html/User/WinCOM.html 有兴趣的可以深入研究一下。


本文转载自:http://blog.csdn.net/bason/article/details/6949951

共有 人打赏支持
买个ZIPPO点蚊香
粉丝 0
博文 22
码字总数 1611
作品 0
程序员
如何在Genero(Tiptop)中调用WebServices?

什么是WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通讯的操作系统中实施运行,它是一种新的web应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过w...

买个ZIPPO点蚊香
2016/05/24
58
0
GPDB · 特性分析· Greenplum 备份架构

Greenplum是分布式数据库,这为备份带来了一些困难。其本身提供了一个工具是gpcrondump,对其二进制备份工具gpdump做了一些封装,而gpdump则是对pgdump做了封装,在每个节点上执行pgdump完成...

阿里云RDS-数据库内核组
2016/08/05
0
0
怎么计算施肥模型并生成一个有效的GP服务

本人在做一个测土配方施肥的项目,拥有的数据如下: 1、采样点信息(土壤中的碱解氮、速效钾、有效磷的数据值) 2、 excel(产量与施肥量的数据) 请问这个施肥模型怎么做?GP服务怎么生成?...

洋洋洒的幸福生活
2015/10/09
168
0
Greenplum中装载和卸载数据

装载和卸载数据 GP装载概述 关于外部表 1) 外部表允许用户像访问标准数据库表一样访问外部表 2) 结合GP的并行文件分配程序(gpfdist),外部表支持在装载和卸载数据时全并行化利用所有segment...

fortyone41
2016/07/21
0
0
ERP问题解决

1、Program stopped at 'cinaint340.4gl', line number 1121. FORMS statement error number -1338. The function 'clexe_rep' has not been defined in any module in the program. 解决办法......

wangxia279624
2017/06/06
0
0
greenplum维护中的一些技巧

1.如果能用greenplum3.3.X,就不要使用greenplum4.X。 原因: a. greenplum4.x看起当primary节点出现问题时,可以切换到mirror节点,继续提供服务,当mirror节点恢复后,可以做增量同步。增量...

supersyd
2017/06/27
0
0
电脑文件扩展名

常见文件的扩展名有.doc(Word文档)、.xls(Excel电子表格)、.ppt(Powerpoint演示文稿)、.txt(文本文档)、.rar(压缩文件)、.mp3(音乐)、.wma(音乐)、.wav(音乐)、.lrc(歌词文...

望夜的星空
2017/10/19
0
0
Greenplum中管理数据

1.管理数据 1.1.关于GP的并发控制 1) GP使用多版本控制模型(Mutltiversion Concurrency Control/MVCC)保持数据一致性; 可将MVCC看成行级别锁的一种妥协,它在许多情况下避免了使用锁,同时可...

fortyone41
2016/07/17
0
0
Greenplum中内存设置不合理导致的报错

声明:文中观点为作者的个人观点、不代表官方、如需更多帮助,请联系Pivotal官方·转载必须注明出处 针对Greenplum中主要的内存设置参数做如下说明(不涉及OS级别参数): statementmem: ERRO...

ChrisYuan
2016/04/01
782
0
Discuz! X2 下 URL 静态化的实现方法

在后台 => 全局 => SEO设置=> URL 静态化,开启各个页面的静态化后,在站点界面上,可以看到所有的链接都变成静态地址格式。下面我们看一下这个过程是怎么实现的。(以主题列表页为例) 众所...

啊和
2012/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PostgresSQL 查看当前schema下所有的函数/存储过程

selectroutine_name from information_schema.routineswhere routine_catalog = 'YourDBName'and routine_schema = 'YourSchemaName'order by routine_name;...

Leyxiao
3分钟前
0
0
去除bootstrapValidator 的校验结果

$("#form").data('bootstrapValidator').destroy();//会报没有这个方法,很奇怪 $('#form').data('bootstrapValidator',null); $('#form').bootstrapValidator();...

暗中观察
5分钟前
0
0
java环境安装

1、首先下载jdk安装包,一般去官网,官网需要登录才可以下载。 2、下载完成双击运行,想改路径改下路径,比较简单。安装jdk安装完,会弹出个窗口,提示开始安装jre的位置,我这里窗口比较奇葩...

朝如青丝暮成雪
6分钟前
0
0
Linux Command

Copy with progress rsync -r --progress source dest

Lyle_W
7分钟前
0
0
个灯数据营销,帮你找回被浪费的广告费

近日,个灯受邀出席被喻为广告营销业界的年度盛会——第八届梅花网传播业大展北京站的活动。 在展会上,个灯总经理严雯婷女士带来了《数据增能,营销智能》的主题演讲,以理论与实践相结合的...

个推
9分钟前
0
0
java的反射机制理解

一、概念说明 java的反射机制,是在运行状态下,可以动态获取任意一个类的属性和方法;可以动态调用一个对象任意方法; 二、反射相关类 java.lang.Class; //类 java.lang.re...

盼望明天
13分钟前
0
0
nginx反向代理-多端口映射

代码解释 1.1 http:www.baidu.test.com默认是80,访问“/”利用反向代理,然后访问本地8083; 1.2 8083代表本地的前端工程访问地址,前端需要访问后台数据,”/”,继续代理到后台地址9803; ...

lilugirl
14分钟前
0
0
Jfinal使用log4j2打印日志

1,添加maven配置 <properties><log4j2.version>2.11.0</log4j2.version><slf4j.version>1.7.25</slf4j.version></properties> <!--slf4j及log4j2日志 --><dependency> ......

iborder
15分钟前
0
0
如何在Rancher 2.0上快速部署Datadog

Datadog是一种流行的托管监控解决方案,用于聚合和分析分布式系统的指标和事件。从基础架构集成到协作仪表板,Datadog为用户提供了一个简洁的单一窗格视图,用户可以快速查看对其最重要的信息...

RancherLabs
18分钟前
0
0
Java示例演示Functor 和monad

This article was initially an appendix in our Reactive Programming with RxJavabook. However introduction to monads, albeit very much related to reactive programming, didn't suit......

Quan全
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部