VB Function to return array to ASP

R

Raj

I need a VB function to return array of collections like

Private Type Employee
empname as string
address as string
salary as integer
deptno as integer
End Type

dim employees() as Employee

Public Function getEmployees() as Employee()
getEmployees=employees
End Function

I will call that function in ASP.

This was not working any other method is welcomed.

Regards,

Raj.
 
R

Raj

Thanx indeed for the valuable input, but I still have problems:

Here's what I did:

Have created a standard exe project with two classes:

Employee:
Public empname As String
Public address As String
Public salary As Integer
Public deptno As Integer

Company:
Dim employess() As Employee
Dim mlCount As Long

Public Property Get Count() As Long
Count = mlCount
End Property

I had a form with Command Button. On it's click event I wrote like:

Private Sub Command1_Click()
Dim cmp1 As New Company

cmp1.Item(1) = New Employee
cmp1.Item(1).deptno = "10"
cmp1.Item(1).empname = "Raj"

cmp1.Item(2) = New Employee
cmp1.Item(2).deptno = "20"
cmp1.Item(2).empname = "Ram"

Print cmp1.Count
End Sub

Then I got a compile error at:
Public Property Get Item(ByVal Index As Long) As Employee
Set Item = employees(Index)
End Property

Error Message: Sub or Function not defined.

It seems I am missing something.

Please let me know.

Thank you very much.

Regards,

Raj.


----- Original Message -----
From: "Anthony Jones" <[email protected]>
Newsgroups: microsoft.public.inetserver.asp.general
Sent: Friday, March 23, 2007 4:32 AM
Subject: Re: VB Function to return array to ASP
 
A

Anthony Jones

Raj said:
I need a VB function to return array of collections like

Private Type Employee
empname as string
address as string
salary as integer
deptno as integer
End Type

dim employees() as Employee

Public Function getEmployees() as Employee()
getEmployees=employees
End Function

I will call that function in ASP.

This was not working any other method is welcomed.

Regards,

Raj.

First off the code above doesn't compile. You can't expose a private type
as a return value of a public member. You would need make the Employee type
public to get it to compile. Unfortunately that still doesn't help a great
deal with ASP.

ASP only has one data type, the variant (or two if you count an array of
variants as a type). Now whilst it is possible to re-arrange the VB code to
pass a reference to User-Defined type into a variant and thus into VBScript
you can't access the members of the type. The VBScript parsing doesn't
allow for the 'type.member' notation to work both for objects and for UDTs
as it does in VB6.

If the ASP merely needs to hold reference to a type that is passed to
another component then that is possible as long as appropriate measures are
taken to ensure the interfaces are compatible with Script in this way (I.E.
takes a variant ByRef).

If you need the ASP code to be able to access the members of the type then
you will need to use a class instead:-

'Class Employee
Public empname as string
Public address as string
Public salary as integer
Public deptno as integer


'Your class

Dim employees() as Variant ' Actuall contains employess objects

Public Function getEmployees() As Variant
getEmployees = employees
End Public

However that can get expensive. It may be better to turn your class into a
form of a collection. E.g.,

Dim employess() as Employee
Dim mlCount as Long

Public Property Get Item(ByVal Index As Long) As Employee
Set Item = employees(Index)
End Property

Public Property Get Count() as Long
Count = mlCount
End Property
 
A

Anthony Jones

Raj said:
Thanx indeed for the valuable input, but I still have problems:

Here's what I did:

Have created a standard exe project with two classes:

Employee:
Public empname As String
Public address As String
Public salary As Integer
Public deptno As Integer

Company:
Dim employess() As Employee
Dim mlCount As Long

Public Property Get Count() As Long
Count = mlCount
End Property

I had a form with Command Button. On it's click event I wrote like:

Private Sub Command1_Click()
Dim cmp1 As New Company

cmp1.Item(1) = New Employee
cmp1.Item(1).deptno = "10"
cmp1.Item(1).empname = "Raj"

cmp1.Item(2) = New Employee
cmp1.Item(2).deptno = "20"
cmp1.Item(2).empname = "Ram"

Print cmp1.Count
End Sub

Then I got a compile error at:
Public Property Get Item(ByVal Index As Long) As Employee
Set Item = employees(Index)
End Property

Error Message: Sub or Function not defined.

It seems I am missing something.

Please let me know.

Thank you very much.

Regards,

Raj.

Yeah you spelt employees wrong in the Dim. However here is a more complete
solution:-

Company:
Private maoEmployees() As Employee
Private mlCount As Long

Public Property Get Count() As Long
Count = mlCount
End Property

Public Function AddEmployee() as Employee

If mlCount = UBound(maoEmployees) Then
ReDim Preserve maoEmployess(mlCount * 2) As Employee
End If

mlCount = mlCount + 1

Set AddEmployee = New Employess

Set maoEmployees(mlCount) = AddEmployee

End Function

Public Function Item(ByVal Index as Long) As Employee
Set Item = maoEmployees(Index)
End Public

Private Sub Class_Initialise()

ReDim maoEmployees(16) As Employee

End Sub

Now you populate with:-

Dim cmp1 As New Company

With cmp1.AddEmployee
.deptno = "10"
.empname = "Raj"
End With

With cmp1.AddEmployee
.deptno = "20"
.empname = "Ram"
End With

My question now is why VB6?
Why not just use VBScripts own Classes etc?
 
R

Raj

With cmp1.AddEmployee
.deptno = "20"
.empname = "Ram"
End With

Putting ? cmp1.Count return Subscript out of range error at line:

If mlCount = UBound(maoEmployees) Then
 
A

Anthony Jones

Raj said:
With cmp1.AddEmployee
.deptno = "20"
.empname = "Ram"
End With

Putting ? cmp1.Count return Subscript out of range error at line:

If mlCount = UBound(maoEmployees) Then

You need to fix my spelling mistake; this :-

ReDim Preserve maoEmployess(mlCount * 2) As Employee

Should be this:-

ReDim Preserve maoEmployees(mlCount * 2) As Employee

You should also ensure that all your modules start with the line:-

Option Explicit
 
R

Raj

I did that already
Anthony Jones said:
You need to fix my spelling mistake; this :-

ReDim Preserve maoEmployess(mlCount * 2) As Employee

Should be this:-

ReDim Preserve maoEmployees(mlCount * 2) As Employee

You should also ensure that all your modules start with the line:-

Option Explicit
 
A

Anthony Jones

Raj said:
It seems the Class_Initialize event of the Company class is never triggered.

Another spelling error I used the english Class_Initialise.

Your spelling above is correct is that what your code is using?
 
R

Raj

That's working fantastically.

Thanx indeed.

Anthony Jones said:
Another spelling error I used the english Class_Initialise.

Your spelling above is correct is that what your code is using?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top