<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="sc_ScDataPilotFieldObj" script:language="StarBasic">


'*************************************************************************
'
'  Licensed to the Apache Software Foundation (ASF) under one
'  or more contributor license agreements.  See the NOTICE file
'  distributed with this work for additional information
'  regarding copyright ownership.  The ASF licenses this file
'  to you under the Apache License, Version 2.0 (the
'  "License"); you may not use this file except in compliance
'  with the License.  You may obtain a copy of the License at
'  
'    http://www.apache.org/licenses/LICENSE-2.0
'  
'  Unless required by applicable law or agreed to in writing,
'  software distributed under the License is distributed on an
'  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
'  KIND, either express or implied.  See the License for the
'  specific language governing permissions and limitations
'  under the License.
'
'*************************************************************************





' Be sure that all variables are dimensioned:
option explicit


' REQUIRED VARIABLES for interface/service tests:

' Requiered for  com.sun.star.container.XNamed
 Global cNameToSet As String ' "fixed" if name is fixed


Sub CreateObj()

'*************************************************************************
' COMPONENT: 
' sc.ScDataPilotFieldObj
'*************************************************************************
On Error Goto ErrHndl
    Dim oFields As Variant
    Dim oSheet As Object
    Dim i,j As Integer
    Dim oDataPilotTable, oDataPilotDescriptor As Object
    Dim sCellRangeAddress As New com.sun.star.table.CellRangeAddress
    Dim sCellAddress As New com.sun.star.table.CellAddress


    oDoc = utils.createDocument("scalc", cObjectName)
    oSheet = oDoc.Sheets.getByIndex(0)
    Out.Log("Filling a table...")

    for i = 1 to 5
        oSheet.getCellByPosition(0, i).String = "Row" &amp; i
        oSheet.getCellByPosition(i, 0).String = "Col" &amp; i
    next i

    for i = 1 to 5
        for j = 1 to 5
            oSheet.getCellByPosition(i, j).Value = 2.5 * j + i
        next j
    next i

    sCellRangeAddress.Sheet = 0
    sCellRangeAddress.StartColumn = 0
    sCellRangeAddress.StartRow = 0
    sCellRangeAddress.EndColumn = 5
    sCellRangeAddress.EndRow = 5

    sCellAddress.Sheet = 0
    sCellAddress.Column = 7
    sCellAddress.Row = 8

    oDataPilotTable = oSheet.getDataPilotTables
    oDataPilotDescriptor = oDataPilotTable.createDataPilotDescriptor()
    oDataPilotDescriptor.setSourceRange(sCellRangeAddress)
    oDataPilotTable.insertNewByName(cObjectName, sCellAddress, oDataPilotDescriptor)

    oFields = oDataPilotDescriptor.getDataPilotFields()
    oObj = oFields.getByIndex(0)

    cNameToSet = cObjectName

Exit Sub
ErrHndl:
    Test.Exception()
End Sub
</script:module>
