Presentation is loading. Please wait.

Presentation is loading. Please wait.

倍力資訊 羅慶祖 第一事業部 協理.

Similar presentations


Presentation on theme: "倍力資訊 羅慶祖 第一事業部 協理."— Presentation transcript:

1 倍力資訊 羅慶祖 第一事業部 協理

2 PowerBuilder Strategic Direction

3 State of the Development Tools Market
8,000 7,000 6,000 5,000 4,000 3,000 2,000 1,000 $ Millions 4GLs Web Professional Development Tools Software Construction Components 3GLS Analysis/Model/ Design/ Construction Source: IDC, 2003

4 Primary Approaches to Application Development
Other 13% 3GLs 4GL/RAD 23% 36% OO 3GLs Source: IDC 28%

5 % responding “extremely” or “highly” likely
Priority: What Are the Strategic Application Development Initiatives for End Users? Rank each of the following strategic business initiatives Maintain/enhance existing applications Integrate internal applications Build, deploy, customize new applications Increase productivity of development process Build e-commerce solutions Integrate applications with external suppliers Build and deploy mobile/handheld applications Utilize open source solutions Integrate applications with online exchange 0% 20% 40% 60% 80% % responding “extremely” or “highly” likely Source: IDC, SW Strategies & Investment Survey, Final, Users, Fall 2001, n = 218

6 Uses for PowerBuilder: Today and in the Future
80% Client-Server Only Some Web Projects 17% Most Web Projects 3% PowerBuilder Future Client-Server Only 50% Some Web Projects 42% Most Web Projects 8% Source: Novalys Inc.; 3,400 Respondents; 101 Countries

7 What is Important to Your Organization Today?
Protect your existing technology investment Stay current with industry trends and new technology Gain a competitive advantage Incorporate new technology into existing applications Minimize costs Protect your existing people investment Utilize their existing skills Give them a platform for the future

8 PB and .Net - Phased Implementation
1 4 Web Services Simplified .NET Objects PowerBuilder 3 2 PB’s .NET Compiler DataWindow.NET & DataStore.NET

9 PB and J2EE PowerBuilder 8.0: PowerBuilder 9.0: Future: EAServer EASI
Web Services Toolkit PowerBuilder 9.0: EJB Clients PB Web Services RAD Java Server Pages Future: NVO’s in 3rd Party Application Servers

10 Development in Heterogeneous Environments
Web Services .NET Accessing components in .NET framework in PB IDE .NET Compiler DataWindow.NET DataStore.NET Enhanced Web DW 4GL JSP support Build, access, and consume Web services DataWindow XML XML services Access EJBs in major application servers Access to web services in powerscript will be via web service proxies and the new PBNI SoapConnection class. Access to web services in JSP targets will be through custom tags that the PowerBuilder developer creates using a wizard. On the second slide, it's not clear to me what is meant by "call PowerBuilder from any application server" in 2004. Deploy NVO’s directly to major application servers Continue enhancing JSP authoring and XML capabilities J2EE Today -> 2003 2004+

11 Summary Sybase pioneered 4GL and will continue to lead in application development through IDE2, giving you “Exponential Power” with the 4GL+ Sybase is strongly committed to PowerBuilder; version 9.0 is available today and planning is underway for 9.5, 10.0 and beyond Customer needs span from client-server to next-generation, to best development practices and PB will meet these requirements Sybase will extend RAD for enterprise applications to RAD for mobile applications with Pocket PowerBuilder for handheld devices; release in 2003

12 PowerBuilder 9.0 New Features
RAD Java Server PagesTM (JSPTM) Authoring XML (Extensible Markup Language) DataWindow (Export and Import) PB DOM (XML Parsing in PowerScript) PowerBuilder Native Interface (PBNI) EJB Client Support Web Services Support

13 Creating JSP Web Applications with PowerBuilder
RAD JSP Creating JSP Web Applications with PowerBuilder

14 Introduction to JSP Technology
JSP is… A technology for delivering dynamic content Based upon Java Servlet technology JavaServer Pages Contain standard HTML Can contain Custom tags Can contain JSP elements JSP Actions JSP Directives Scripting Elements At run time, are compiled into Servlets

15 Why use PowerBuilder to create JSPs?
Integrated development environment for creating and deploying web applications Leverage the power of JSP language Standard Portable Stable Easy to learn Incorporate the power of the DataWindow into your web applications

16 PowerBuilder JSP Features
PowerBuilder 9.0 Provides the following JSP features: JSP Web Target Wizard JSP Web Services Proxy Wizard JSP Page Authoring JSP Web Target Object Model Custom Tag Library for the Web DataWindow JSP Deployment Configuration

17 JSP Web Target Wizard This wizard creates a JSP target that has build and source folders and a deployment configuration.

18 JSP Web Services Proxy Wizard
This wizard creates a custom tag library with the information necessary for calling a Web service in a JSP .

19 JSP Deployment Configuration
When you deploy the JSP target, PowerBuilder builds a Web Archive (WAR) file in the deployment configuration folder created by the JSP Web Target wizard Deployment Target EAServer’s JSP Container Apache Tomcat Command Line Deployment The Web application is automatically deployed to the server you selected in the target wizard

20 JSP Authoring in PowerBuilder
Allows developers to create JSPs using any of the page wizards WYSIWYG editing of JSP pages Builds upon the existing Web Targets User Interface New Wizard - JSP Target Extensions to the Page Editor System Tree Additions Full access to the page source through the editor

21 Seeing the Technology in Action
RAD JSP Seeing the Technology in Action

22 Importing and Exporting XML with the DataWindow
XML DataWindow Importing and Exporting XML with the DataWindow

23 Review of XML Extensible Markup Language
Extends the ability to represent data Metadata language=tags and layout can be customized Data can be hierarchically structured with nesting Easily parsed across applications, platforms, enterprises, and Web for data interchange World Wide Web Consortium (W3C) XML 1.0 Recommendation at

24 XML Document Well-Formed if structure follows XML syntax rules
Contains one or more elements Element is a tree containing start-tag, content, end-tag Start-tag is a name, enclosed by angle brackets, with optional attributes Attribute names must be unique for element; order insignificant Attribute values must be quoted One root; all element tags properly nested Parsed element cannot contain recursive reference to itself Valid if structure conforms to a DTD or Schema DTD defines grammar for XML document Subset can be internal or external

25 XML Document Example <?xml version="1.0" encoding="UTF-8"?>
<tag_name>  root element <tag_name2 attribute="female"> <name> <emp_fname>Fran</emp_fname>  text content <emp_lname>Whitney</emp_lname> </name> <empty_element></empty_element>  empty element <another_empty_element/>  alternative notation </tag_name2> </tag_name>

26 XML Parsing DOM Parser DOM provides API access to XML tree model
Useful if manipulating or re-traversing the document SAX Parser Event-driven Useful if extracting data once in single traversal Core Interfaces Specified by W3C Extensions denoted by ‘DOM Level 2’, ‘DOM Level 3’

27 Why use PowerBuilder and XML?
Easily generate XML for your data through the DataWindow Import XML data into your application through the DataWindow (apply validations, etc.) Process XML in PowerScript without having to write low level code

28 XML DataWindow XML generated by PowerBuilder is compliant with the XML 1.0 specification XML generated by PowerBuilder is well-formed and can be processed by an XML Parser PowerBuilder lets you use Template to define the mapping between values from a DataWindow and XML

29 XML DataWindow Generated using:
Save Rows As (DataWindow Painter – XML! SaveAs type) dwcontrol.SaveAs() method in PowerScript (XML! SaveAs type) dwcontrol.Object.Data.XML (dot notation in PowerScript)

30 XML DataWindow PowerScript Support
New DataWindow object properties Export.XML.UseTemplate Export.XML.MetaDataType Export.XML.SaveMetaData Data access dwcontrol.Object.Data.XML dwcontrol.Object.Data.XMLSchema dwcontrol.Object.Data.XMLDTD

31 Seeing the Technology in Action
XML DataWindow Seeing the Technology in Action

32 Manipulating XML in PowerBuilder with PBDOM
XML Services Manipulating XML in PowerBuilder with PBDOM

33 What is DOM ? DOM. DOM stands for Document Object Model.
DOM is a W3C standard. A standard way of representing the contents of an XML document as a tree of interconnected objects. The next slide demonstrates this.

34 What is DOM ? Document root child_1 child_2 child_3 Text_1 Text_2

35 What is PBDOM ? High-level DOM Management API.
A complete API set to create, read, write and manipulate XML documents. A large collection of non-visual classes. Classes are hierarchical in nature and allow for polymorphic usage.

36 PBDOM Overview PBDOM is supported in Wintel as well as Unix platforms
Parsers like MSXML primarily expose the low-level W3C DOM APIs which are hard to learn and master PBDOM presents a much higher-level set of functions which incurs a shorter learning curve and provides a much greater level of productivity

37 PBDOM Overview PBDOM lays out a standard set of PowerBuilder objects with properties and functionalities that allow for XML document navigation and content manipulation It does this by presenting a view of the contents of an XML document as an interconnected collection of objects which can be searched for, read, modified, appended to and deleted from a document

38 PBDOM Overview pbdom_builder pbdom_exception pbdom_object
pbdom_attribute pbdom_characterdata pbdom_comment pbdom_text pbdom_cdata pbdom_doctype pbdom_document pbdom_element pbdom_entityreference pbdom_processinginstruction

39 PBDOM Classes The PBDOM_BUILDER
The following code fragment is an example of building a PBDOM_DOCUMENT from a file.

40 PBDOM Classes The PBDOM_BUILDER
The following code fragment is an example of building a PBDOM_DOCUMENT from a string.

41 PBDOM Classes

42 PBDOM Classes The PBDOM_ATTRIBUTE

43 Seeing the Technology in Action
XML Services Seeing the Technology in Action

44 Using the PowerBuilder Native Interface to Extend Your Applications
PBNI Using the PowerBuilder Native Interface to Extend Your Applications

45 Three Questions Have you ever asked the following questions?
Is it possible to call C/C++ functions from PowerScript? Is it possible to call external components, such as EJBs, WebServices, Java classes, and so on, from PowerScript? Is it possible to call PowerScript from C++/Java? I don’t know if you have asked the three questions. The questions boil down to one question, is it possible to make PowerBuilder more open, so that third parties can extend the functionality of PowerBuilder?

46 Extending PowerScript
PowerBuilder can call external C functions from PowerScript But there are some limitations with external functions: It is not possible to declare an external function that requires a callback function. E.g. BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam); Some C data types cannot be mapped to PB data types, such as double* An external function cannot callback into the PBVM. Using external functions is not object-oriented

47 What is PBNI? PBNI (PowerBuilder Native Interface) is a standard interface that allows third parties to extend the functionalities of PowerBuilder. PBNI opens two doors from PowerBuilder to outside world PBNI is a standard programming interface for writing PowerBuilder Extensions (or PB extension), and embedding the PowerBuilder virtual machine in C++ applications. PBNI opens two doors from PowerBuilder to outside world. You can write PB extensions that can be used as normal PowerBuilder visual or non-visual objects. You can also embed PowerBuilder virtual machine into your C++ applications in order to call PowerScript functions. C++/Java Application IPB_VM PBVM IPB_Session PB Extension IPB_Session IPBX_NonVisualObject

48 What can be done with PBNI?
With PBNI, you can Write PB non-visual extensions and use them in PB just as normal NVOs Write PB visual extensions and use them just as custom user objects Write PB marshaler extensions to call external components and use them in PB just like what you do with Jaguar components Embed the PBVM in external C++ applications to call PowerScript functions

49 Generating the PBD file
Run pbx2pbd90.exe in Command console Example: Pbx2pbd90 simplext.pbd simplext.dll What Happens? pbx2pbd90.exe loads the simplext.dll calls the PBX_GetDescription() function parses the description and generates a PBD file holding the class definition for the simpleExt class

50 Using a PB extension Add the PBD file in the library list of the PB target Put the DLL file in the directory that is in the PATH Using the native class as a normal NVO or custom user object

51 Embedding the PBVM With PBNI, it is possible to embed the PBVM in an external C++ application in order to call PowerScript functions to perform certain jobs, e.g. showing a DataWindow, updating a database, or printing a DataStore Through JNI (Java Native Interface) and PBNI, a Java application can call PowerScript functions

52 Seeing the Technology in Action
PBNI Seeing the Technology in Action

53 Accessing Enterprise Java Beans from a PowerBuilder Client
EJB Clients Accessing Enterprise Java Beans from a PowerBuilder Client

54 Definitions - Enterprise Java
EJB -- Enterprise JavaBeans Stateful Session Beans Stateless Session Beans Entity Beans Message-driven Beans JNDI -- Java Naming and Directory Interface JTS -- Java Transaction Service JDBC -- Java Database Connectivity RMI -- Remote Method Invocation

55 EJB Client Support in PowerBuilder 9.0
Provides the ability to call components in 3rd party EJB servers Uses Java Native Interface (JNI) for interoperability Supports 1.0, 1.1, and 2.0 EJBs Supports client-managed transactions Supports system and application exception handling Implementation will be through a PBNI DLL Supplemented by EJB Proxy Generator PowerBuilder IDE EJB2PB90 command line utility Java data types will be mapped to PowerBuilder data types

56 EJB Client Support – Data Type Exchange
Java Type PB Type Byte char Short int Int long Long longlong (to be added) Float real Double double char (16bit unsigned) char? Boolean boolean String string Java/util/Date datetime Array of primitive type Array of primitive type for parameters, ANY for return value Array of String, Date, Time objects Array of string, date, time for parameters, ANY for return value Array of Arrays any*(not map to PB type) Java Classes return from EJBObject (EJBs) or taken as parameters powerobject Others any

57 Take advantage of EJB Client
EJB Client makes PowerBuilder glue with any application server - J2EE compliant Development cycle with EJB client is much shorter than using Java(short time-to-market) Reuse the source code written in PB and attach the PB strong power in manipulating DB

58 Overview of EJB Client Implementation
EJB Client PowerBuilder Native Interface(PBNI) implementation PowerBuilder Java VM Service Creates and manages a Java Virtual Machine(VM) within its own process space and communicate with Java objects PowerBuilder proxy Objects

59 Definitions - EJB Proxy
EJB Proxy In PowerBuilder 9 A PB object to represent the remote EJB Interface and local Java class It includes: All public functions exposed by EJB interface&local Java class and their signature Exceptions that Java method throws Java class name that PB proxy represents as instance property

60 EJB Client PBNI implementation
EJB Client provides a bridge from PowerBuilder into EJB EJB Client PBEJBCLIENT90.DLL PBEJBCLIENT90.PBD PBEJBCLIENT90.JAR Java VM PowerBuilder VM JNI PBNI EJB NVO NVO Java Object

61 EJB Client PBNI Classes
JavaVM load or attach to a Java VM work with Java interface and class hierarchies EJBConnection connect to the J2EE server locate EJB via JNDI instantiate other Java classes EJBTransaction Manage the transaction

62 Coding a PowerBuilder EJB Client Application
Setting up your environment Adding the EJB client implementation to your target Generating proxies Basic client coding steps Initialize the Java VM Connect to the EJB Server Lookup an EJB Invoke methods on the EJB Disconnect from the EJB Server

63 Coding a PowerBuilder EJB Client Application
Adding the EJB Client implementation to your target Include PBEJBCLIENT90.PBD in your target’s library list

64 Coding a PowerBuilder EJB Client Application
Generating proxies Use EJB Client Proxy Wizard

65 Coding a PowerBuilder EJB Client Application
Initialize the Java VM TRY g_JavaVM = CREATE JavaVM CHOOSE CASE g_JavaVM.CreateJavaVM(is_ClassPath, false) CASE 0 // JVM just loaded CASE 1 // JVM was already loaded, is_ClassPath ignored CASE -1 // failure, likely due to not finding JVM.DLL CASE -2 // failure, do to not finding EJBLocator class END CHOOSE CATCH (PBXRuntimeError prte) // catch any exception raised in PBNI extension END TRY

66 Coding a PowerBuilder EJB Client Application
Connect to the EJB Server TRY g_EJBConn = CREATE EJBConnection // set initial context properties ls_props[1] = "javax.naming.Context.INITIAL_CONTEXT_FACTORY=" + & "com.sybase.ejb.InitialContextFactory“ ls_props[2] = "javax.naming.Context.PROVIDER_URL=iiop://localhost:9000" ls_props[3] = "javax.naming.Context.SECURITY_PRINCIPAL=jagadmin“ ls_props[4] = "javax.naming.Context.SECURITY_CREDENTIALS=“ // connect to EJB server g_EJBConn.connectToServer(ls_props) CATCH (NamingException ne) END TRY

67 Coding a PowerBuilder EJB Client Application
Lookup an EJB TRY g_HelloHome = g_EJBConn.lookup("HelloHome", "PB9/Hello", "pb9.HelloHome") g_hello = g_helloHome.create() CATCH (NamingException ne) // raised if EJB not located CATCH (CreateException ce) // raised if problem in instantiating EJB CATCH (RemoteException re) // raised whenever there is a unchecked exception on server CATCH (PBXRuntimeError prte) // raised whenever there is an exception in the PBNI extension END TRY

68 Coding a PowerBuilder EJB Client Application
Invoke methods on the EJB TRY MessageBox("Hello", g_hello.sayHello()) CATCH (YourCustomException yce) // handle user-defined exception raised by EJB CATCH (RemoteException re) // raised whenever there is a unchecked exception on server CATCH (PBXRuntimeError prte) // raised whenever there is an exception in the PBNI extension END TRY

69 Coding a PowerBuilder EJB Client Application
Disconnect from the EJB server TRY g_EJBConn.disconnectServer() CATCH (NamingException ne) // naming exception is unlikely here, but could be thrown by underlying Java InitialContext object CATCH (PBXRuntimeError prte) // raised whenever there is an exception in the PBNI extension END TRY

70 Seeing the Technology in Action
EJB Clients Seeing the Technology in Action

71 Creating and Consuming Web Services with PowerBuilder 9.0
Web Services and .Net Creating and Consuming Web Services with PowerBuilder 9.0

72 Web Services Web Services allow applications written in different programming languages to communicate with each other Web Services are: Platform independent Language independent Based on XML

73 Introduction to Web Service Client
How Web Services work Client Side Server Side 5. Create WS proxy from WSDL 6. Use proxy to invoke Web Services 1. Create Server Side components 2. Wrap to WS 3. Generate WSDL 4. Publish 3 WSDL Files PowerScript 5 NVO or Other components 2 1 6 Invoke Web service Proxy Web service Stub Data

74 Web Services Support PowerBuilder 9.0 supports access to web services using SOAP through HTTP Allows developers to integrate web services into PowerBuilder applications quickly Hides much of the complexity of: WSDL XML grammar SOAP development

75 Standards Used In PB Web Service Client
Standards supported in PB 9 XML Schema 1.1 WSDL 1.1 SOAP 1.1 over HTTP

76 Web Services Support High level process: Create web service proxy
Import SOAP connection class Use SOAP connection and proxy in PowerScript

77 Seeing the Technology in Action
Web Services and .Net Seeing the Technology in Action

78 Developing Applications for Pocket PC Devices
Pocket PowerBuilder Developing Applications for Pocket PC Devices

79 新的行動時代 新的商業規則 Mobile Phone and PDA 3G Mobile Media Video Conference
eMobile Enterprise eMobile Managerment 說明有那些新的3G mobile device,如何衝擊舊有的商業規則

80 Mobile Database 市場趨勢 無線網際網路環境
“目前在美國約有8000萬無線設備使用者. 至 2003, 增至1億4600萬使用者.” Cahners In-Stat Group “至2003年,雙向無線網際網路服務爆増至6,150萬使用者, 而1999年不過740萬使用者.” IDC “目前有23%的企業用戶在遠端連接其總公司的資料庫, 這個比例預期在兩年內增加至35%.” Forrester Research “行動設備的市場將以接近桌上型裝置兩倍的速度持續成長.” GIGA Group

81 Sybase為行動運算資料庫市場 領導者 1996 行動運算資料庫市場領導者: SYBASE
在2000年,市場佔有率由 61% 提昇至 68% *來源: Norma Schroder, "Overview of 1999 DBMS Market Size, Vendor Shares and Forecast," GartnerGroup’s Dataquest.

82 Current difficult in developing mobile applications
缺乏功能完整或是開發介面強大的開發工具 若使用J2ME,門檻較高,而且生產力不高 Page Layout和傳統開發Windows程式不同 行動裝置上的資料庫不一定是關連式資料庫,增加開發困難 必須考慮行動裝置和後端資料庫的整合 必須開發同步系統解決資料同步的問題

83 Pocket PowerBuilder Core Features
高生產力與低學習門檻的4GL整合開發環境  延伸PowerBuilder DataWindow於行動商務應用上  與行動資料庫領導品牌SQL Anywhere Studio緊密結合 企業資料庫同步整合支援(MobiLink Server)  精靈導引開發環境  PowerBuilder應用移植 Note: PocketBuilder – no Win98 support. Note: Device – means handheld like PocketPC, HPC Pro, iPaq etc. Note: No support for version 2.11 of WinCE. Tested on iPaq, Jornada 540, Jornada handheld (720). PocketPC 2000 and PocketPC 2002 are WinCE based, so should work on these platforms. XScale should work, we will try it soon. Typically XScale is 400MHz compared to 206MHz for other ARM and SH3 chips. Deploy to all 3 targets for this demo. Trim the IDE – On PocketPC we use a lite version of the PowerBuilder runtime environment. WinCE is a subset of Windows. PocketBuilder is a subset of PowerBuilder.

84 Pocket PowerBuilder environment
Pocket PowerBuilder is supported on Windows 2000 and Windows XP Target devices are PocketPC and HPC Professional Target operating system WinCE 3.0 or later Supported processors ARM and Xscale Support Unicode No Pocket PowerBuilder runtime licenses Develop using the same PowerBuilder IDE format Deploy to desktop, device or emulator Support Microsoft Pocket PC, Pocket PC 2002 and Pocket PC 2003 emulator Note: PocketBuilder – no Win98 support. Note: Device – means handheld like PocketPC, HPC Pro, iPaq etc. Note: No support for version 2.11 of WinCE. Tested on iPaq, Jornada 540, Jornada handheld (720). PocketPC 2000 and PocketPC 2002 are WinCE based, so should work on these platforms. XScale should work, we will try it soon. Typically XScale is 400MHz compared to 206MHz for other ARM and SH3 chips. Deploy to all 3 targets for this demo. Trim the IDE – On PocketPC we use a lite version of the PowerBuilder runtime environment. WinCE is a subset of Windows. PocketBuilder is a subset of PowerBuilder.

85 Windows and Controls Controls are similar to desktop
Checkbox Radiobutton Listbox Pushbutton Datawindow Etc… No mouse, no cursors Usually the only available cursor is the wait-cursor Most Datawindow Presentation Style Freeform, Graph, Grid, Group, Tabular Differences are more visual than action. Usually no mouse, so no cursor support, except “Wait”. We will change the way we build and display menus. PocketPC uses MenuBar, others devices use CommandBar. Popup menu is handled differently, there is no Right Mouse Button. Use a timer/delay/tremble factor.

86 Database Synchronization
ODBC Handheld ASA Database or Connection to Enterprise DB as ‘Always Connected’ MobiLink ASA Databases The DBMLSYNC application on the device manages the synchronization of data between the desktop and the device Use Sybase Central to define the synchronization operation Although ActiveSync allows import/export of (almost) any odbc source, synchronization only seems to work with MDB files. This may be a Microsoft bug, or a limitation on the ActiveSync manager.

87 MobiLink Server資料同步技術
MS SQL SVR Oracle Sybase IBM DB2 Other DBs Sybase MobiLink Server ODBC Driver Bi-directional & Transactional Data Synchronization

88 MobiLink Server資料同步之重要特性
雙向資料交換 遠端行動設備上的資料可以與後端企業內部資料做雙向的資料交換 專屬資料處理 每位使用者只處理屬於自己的資料 資料衝突偵測及解決 多人同時修改相同資料時即產生資料衝突,當衝突發生時的偵測及解決方法將由Mobilink Server所提供 安全性 資料交換的過程中使用128 bit加解密功能 優異的效能 只針對修改過的資料與後端資料庫做資料交換 一個Server可同時支援6,000使用者上線

89 Post Pocket PowerBuilder 1.0: Possible Enhancements
XML Support for DataWindows and PowerScript More Database Support IR Support Wireless .Net Much of this will become clearer after initial user testing and feedback. XML support as in PowerBuilder (DataWindows and PowerScript). Some graphics DataWindow capability is a must. Other database support e.g. Microsft SQL Server CE Some support for UDO’s not sure what, needs feedback/research Infrared access from a PocketBuilder application would be nice. Wireless access from PocktBuilder app maybe. I’m not sure what this means or if it would conflict with other communications functionality. Dot Net considerations, whatever that means…..


Download ppt "倍力資訊 羅慶祖 第一事業部 協理."

Similar presentations


Ads by Google