Avatar billede shjdsi Nybegynder
17. december 2003 - 14:52 Der er 19 kommentarer og
1 løsning

retunere et 2 dimentionelt array

For dem der har fulgt lidt med i tråden er dette en ongoing ting for mig :-)

jeg har denne funktion i et alm. modul
Function testCheckQueue(QueueName() As String)
   

    Dim Conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim StoppedQueues() As MyQueue
   
    Dim x
   
    Set Conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    strConn = "Driver={SQL Server}; Server=SOVS; Option=16834; Database=mosaic;"
   
    Conn.Open strConn, "mosaic", "nopasswd"
    Dim testQueue As Byte
    ReDim StoppedQueues(UBound(QueueName))
    For i = 0 To UBound(QueueName)
    sqlstr = "select name,id,state from Queue" _
    & " where name = '" & QueueName(i) & "'"
   
          Debug.Print sqlstr
    rs.Open sqlstr, Conn
    Do While Not rs.EOF
       
          testQueue = rs!State
          If testQueue = 4 Then
            StoppedQueues(x).MyState = 4
          Else
          testQueue = 0
          End If
            StoppedQueues(x).MyQueue = rs!Name
            x = x + 1

                       
            rs.MoveNext
            DoEvents
       
        Loop
        rs.Close
    Next i
    ReDim Preserve StoppedQueues(x, x)
    testCheckQueue = StoppedQueues()

    End Function

i toppen af modulet har jeg defineret typen

Public Type MyQueue
        MyQueue As String
        MyState As Integer
End Type


Når jeg kalder funktionen fra en sub i en form får jeg følgende fejl

Only user-defined types defined in public object modules can be coerced to or from a variant or passwd to late-bound functions

funktionen for et alm string array som param men det har jo ikke noet med det andet st gøre :-)
Avatar billede helmet Nybegynder
17. december 2003 - 15:41 #1
Du skal vel have en retur type på din function.
Avatar billede shjdsi Nybegynder
17. december 2003 - 15:48 #2
hmmm hvordan får jeg det ...
Avatar billede helmet Nybegynder
17. december 2003 - 15:50 #3
Function testCheckQueue(QueueName() As String) as MyQueue eller sådan noget.

Hvad er grunden til at du pludselig skal have lavet StoppedQueues om til et 2. dimensional array?
Avatar billede shjdsi Nybegynder
17. december 2003 - 15:58 #4
forklaring følger :-)
brugeren vælger nogle queue i en list box som han gerne vil have overvåget. Disse queues hiver jeg ud i et array og sender dem til omtalte funktion. ud fra dette bliver der selected i databasen. nu vil jeg gerne retunere både queue navn og state således at jeg grafisk kan vise på en form hvad status er. er den f.eks 4 er den rød etc.....
Avatar billede helmet Nybegynder
17. december 2003 - 16:01 #5
Jo jo, men du har jo lige fyldt et type objekt ind i et array, så er der vel ikke nogen grund til at lave det 2. dimensionel, type objektet kan jo indeholde de 2 værdier for dig. Du fylder jo også ind i arrayet mens det kun er i en dimension.
Avatar billede shjdsi Nybegynder
17. december 2003 - 16:03 #6
Jeg tror faktisk der er noget grundlæggende omkring typer jeg ikke har fattet, nu virker den faktisk, men får så efterfølgende fejl når jeg vil læse dette array som jo åbenbsrt ikke længere er et srrsy men min type..
Avatar billede helmet Nybegynder
17. december 2003 - 16:05 #7
Hvordan har du defineret det objekt som funktionen returnerer til, det skal  også være et array() as MyQueue
Avatar billede shjdsi Nybegynder
17. december 2003 - 16:06 #8
her kalder jeg funktionen of forsøger st læse men det går gslt

Dim tst As MyQueue
'tst = mosFunction.CheckQueue(Queue)
tst = generalFunctions.testCheckQueue(Queue)
End
For i = 0 To UBound(tst.MyQueue)
        If Not tst(i).MyQueue = "" Then
            MsgBox "Denne kø ikke kører:" & tst(i)
        End If
Next i

tror ikke man kan bruge lbound med en type
Avatar billede helmet Nybegynder
17. december 2003 - 16:09 #9
Du skal lige sætte () på tst, eller er der jo ikke et array.
Avatar billede helmet Nybegynder
17. december 2003 - 16:15 #10
Sådan skal det nok se ud hvis det skal virke.

Dim tst() As MyQueue
tst = generalFunctions.testCheckQueue(Queue)

For i = 0 To UBound(tst)
        If Not tst(i).MyQueue = "" Then
            MsgBox "Denne kø ikke kører:" & tst(i)
        End If
Next i
Avatar billede shjdsi Nybegynder
17. december 2003 - 16:17 #11
det virker bare stadig ikke når jeg bsre kalder funktionen uden at forsøge st læse retur værdien bsgefer kommer der endnu en fejl. 

ved  testCheckQueue = StoppedQueues()

type mismatch...

hmmmmm...... er ved at køre en smule træt i det der type shit.... det virkede fint da jeg bare kørte med et enkelt array....
Avatar billede shjdsi Nybegynder
17. december 2003 - 16:19 #12
Når jeg prøver med dit eksempel siger den følgende
Dim tst() As MyQueue
tst() = generalFunctions.testCheckQueue(Queue)

"can't assign array" ØV
Avatar billede helmet Nybegynder
17. december 2003 - 16:21 #13
Kan du så ikke vise det kode du har nu så?
Avatar billede helmet Nybegynder
17. december 2003 - 16:22 #14
Også mit fejl den skal jo står as MyQueue() efter function :(
Avatar billede helmet Nybegynder
17. december 2003 - 16:24 #15
Det går godt med at stave..
Men altså Function testCheckQueue(QueueName() As String) as MyQueue()
Avatar billede shjdsi Nybegynder
17. december 2003 - 16:30 #16
her er funktionen ,derefter den sub der kalder den :-)


Function testCheckQueue(QueueName() As String) As MyQueue
   

    Dim Conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim StoppedQueues() As MyQueue
   
    Dim x
   
    Set Conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    strConn = "Driver={SQL Server}; Server=SOVS; Option=16834; Database=mosaic;"
   
    Conn.Open strConn, "mosaic", "nopasswd"
    Dim testQueue As Byte
    ReDim StoppedQueues(UBound(QueueName))
    For i = 0 To UBound(QueueName)
    sqlstr = "select name,id,state from Queue" _
    & " where name = '" & QueueName(i) & "'"
   
          Debug.Print sqlstr
    rs.Open sqlstr, Conn
    Do While Not rs.EOF
       
          testQueue = rs!State
          If testQueue = 4 Then
            StoppedQueues(x).MyState = 4
          Else
          testQueue = 0
          End If
            StoppedQueues(x).MyQueue = rs!Name
            x = x + 1

                       
            rs.MoveNext
            DoEvents
       
        Loop
        rs.Close
    Next i
    'ReDim Preserve StoppedQueues(x, x)
    testCheckQueue = StoppedQueues()

    End Function


*********************************************************************
Denne funktion bliver kaldt her

public Sub

Dim i As Integer
Dim Queue() As String
Dim queueCnt As Integer

queueCnt = lstQueueSelected.ListCount
ReDim Queue(lstQueueSelected.ListCount)
    For i = 0 To UBound(Queue)
        Queue(i) = lstQueueSelected.List(i)
       
    Next i

Dim tst() As MyQueue
tst() = generalFunctions.testCheckQueue(Queue)
   


For i = 0 To UBound(tst)
        If Not tst(i).MyQueue = "" Then
            MsgBox "Denne kø ikke kører:" & tst(i)
        End If
Next i
End Sub
Avatar billede helmet Nybegynder
17. december 2003 - 17:18 #17
Jep, umiddelbart er det du mangler er som jeg skrev tidligere at lave din function returtype om fra MyQueue til MyQueue().
Avatar billede shjdsi Nybegynder
18. december 2003 - 10:33 #18
Hej! ja nu virker det manglede () i min funktions definering. Ja så blev det vel til at jeg returnere at array af typen myqueue og ikke et 2 dimentionelt array. Dette er også meget smartere.
Men :-)

Efter st jeg fik det til st virke i mit modul proøvede jeg at lave det i min klasse. Og her brokker den sig over

"cannot define a public user-defined type within a private object module"
typen er deklareret i general declarations og jeg har både prøvet med private public m.m
hmmm nogen forklaring eller løsning på dette

Jeg tror det er fordi jeg også anvender typen uden for klassen i min form og så er hele ideen med klasse moduler vel væk hvis man kunne det. ?
Avatar billede helmet Nybegynder
18. december 2003 - 11:35 #19
Det er fordi type kan kun oprettes i modules du får fejlen, hvorfor de kun kan oprettes i modules ved jeg ikke præcist.
Avatar billede shjdsi Nybegynder
17. juni 2005 - 10:44 #20
lukkes
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester