• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Compile error

Status
Niet open voor verdere reacties.

linkav

Gebruiker
Lid geworden
13 jun 2007
Berichten
465
Beste,

Ik krijg een compile-error "only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound function" op de 'gele' regel.
Wat kan de reden hiervan zijn?

Code:
Private Type MDXTable
     MDXFilters As String
     SelectionName As String
     Exclude As Boolean
End Type

Sub testSP()
    tmpAantalTabs = 2 'Wb.Sheets(Wb.Sheets.Count)
    
    ReDim MyVar(tmpAantalTabs) As MDXTable
    
    MyVar(0).MDXFilters = "{{[Customer].[Last Name].&[Peters], [Customer].[Last Name].&[ Peters]} * {[Profile General].[Age class (per 10j)].&[UNKNOWN],[Profile General].[Age class (per 10j)].&[80-90]}}"
    MyVar(0).SelectionName = "Selectie1"
    MyVar(0).Exclude = False

    MyVar(1).MDXFilters = "{{[Customer].[Last Name].&[Van Buggenhout], [Customer].[Last Name].&[Peters]} * {[Profile General].[Age class (per 10j)].&[UNKNOWN],[Profile General].[Age class (per 10j)].&[80-90]}}"
    MyVar(1).SelectionName = "Selectie2"
    MyVar(1).Exclude = True

    'Debug.Print "MyVar: " & MyVar(0).MDXFilters & " " & MyVar(0).SelectionName & " " & MyVar(0).Exclude
    'Debug.Print "MyVar: " & MyVar(1).MDXFilters & " " & MyVar(1).SelectionName & " " & MyVar(1).Exclude
    
    Set cnnSaveML = New ADODB.Connection
    Set cmdSaveML = New ADODB.Command
    
    GetGeneralSettings
    
    cnnStrSaveML = "Provider=SQLOLEDB;Data Source=" & cnnSaveML_Srvr & ";Initial Catalog=" & cnnSaveML_Cat & ";Trusted_Connection=No;"
    cnnStrSaveML = cnnStrSaveML & "User ID=" & cnnSaveML_User & ";Password=" & cnnSaveML_PssWrd
    'dit is de connectie naar de server waar de stored procedure opstaat
    cnnSaveML.Open cnnStrSaveML
    
'    CREATE PROCEDURE MST_Query
'    (@MDXFilters as MDXTable READONLY,
'    @Division as varchar(50),
'    @Channel as varchar(50),
'    @MLType as varchar(50),
'    @IsUnique bit)
    
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@MDXFilters", adArray, adParamInput, -1, MyVar())
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@Division", adVarChar, adParamInput, 50, "MGL")
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@Channel", adVarChar, adParamInput, 50, "TM")
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@MLType ", adVarChar, adParamInput, 50, "TM30dnA")
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@IsUnique", adVarBinary, adParamInput, 1, True)
    
    cmdSaveML.CommandText = "MST_Query"
    cmdSaveML.ActiveConnection = cnnSaveML
    
    cmdSaveML.CommandType = adCmdStoredProc
    cmdSaveML.Execute
    cnnSaveML.Close
    

End Sub
 
Hallo Jan Karel,

Ik krijg de foutmelding op de volgende regel en meer bepaald is MyVar geselecteerd

Code:
cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@MDXFilters", adArray, adParamInput, -1, MyVar())
[B][/C[/B]ODE]
cmdSaveML=cmd staat voor command en SaveML voor Save Marketing List
Het s een naam van een variabele
 
Precies, het is een object(?) dat niet in je code die je hebt geplaatst staat.
 
Private Type MDXTable


only user-defined types defined in public
 
Beste Wampier,

Bedankt voor uw reactie, maar ik krijg dezelfde foutmelding als ik van PRIVATE, PUBLIC maak..
 
de functie of methode cmdsaveml laat je niet zien, daar zit het hem waarschijnlijk ergens in.
 
Beste Jan Karel,

cmdsaveml is een variabele die gezet word met het commando
Code:
Set cmdSaveML = New ADODB.Command
 
O ja, had ik totaal overheen gekeken. Ik heb wat af ge-Googled, maar kon niets aan voorbeelden vinden. Wel noemden een aantal bronnen dat dit niet mogelijk is met ADO (het type adArray). Maar erlders stond dat het wel kan maar lastig is, zonder voorbeelden te noemen. Geen idee dus.
 
Maak de UDT na in een Klasse en probeer het nog eens, wellicht werkt het dan wel
 
Zet je code in een nieuwe class module.

Gebruik dan elders:

Code:
Sub M_snb()
   Set pr = New Class1
   
   pr.testSP
End Sub

NB. zet een apostrof voor ' GetGeneralSettings, want die macro ontbreekt.
 
Beste Eric en snb,

Bedankt voor jullie reactie. Ga ik vanavond uittesten.
 
Beste SNB,

Ik heb het UDT aangemaakt in een class en heb je macro toegevoegd aan mijn code, maar hoe kan ik deze nu gebruiken?

Hoe kan ik de table die ik aangemaakt heb vullen?
 
Tot nog toe heb je alleen VBA getoond. Een 'table' is een nieuw gegeven.
Misschien wordt het tijd te vertellen waarmee je bezig bent, waar je de code vandaan hebt en wat je wil realiseren.
 
Beste SNB,

De bedoeling is om een stored procedure (SQL-server) aan te roepen met een aantal parameters. Als eerste parameter verwacht de SP een datatable, parameter 2 moet een string zijn en de laatste parameter moet een boolean zijn. Een string en een boolean meegeven als parameter lukt mij (al vaker gedaan).
Met de eerste parameter een datatable heb ik problemen.

Op de SQL-verver heb ik het volgende:

Code:
CREATE Type MDXTable as Table
(
       MDXFilters varchar(max),
       SelectionName varchar(max),
       Exclude bit
)

DECLARE @MDXFilterVariable as MDXTable  '

INSERT @MDXFilterVariable
SELECT '{{[Customer].[Last Name].&[Peters], [Customer].[Last Name].&[ Peters]} * {[Profile General].[Age class (per 10j)].&[UNKNOWN],[Profile General].[Age class (per 10j)].&[80-90]}}', 'Selectie1', 0
UNION 
SELECT '{{[Customer].[Last Name].&[Van Buggenhout], [Customer].[Last Name].&[Peters]} * {[Profile General].[Age class (per 10j)].&[UNKNOWN],[Profile General].[Age class (per 10j)].&[80-90]}}', 'Selectie2', 1

EXEC MST_Query @MDXFilterVariable, 'MGL', 'TM', 'TM30dnA', 1

En dat werkt.

Graag had ik nu die SP aangeroepen vanuit Excel (vba).
 
probeer eens:

maak een Klasse aan en noem deze: MDXTable
zet hierin:
Code:
Private pMDXFilters As String
Private pSelectionName As String
Private pExclude As Boolean

Public Sub FillMDX(MDXFilters As String, SelectionName As String, Exclude As Boolean)
    pMDXFilters = MDXFilters
    pSelectionName = SelectionName
    pExclude = Exclude
End Sub

In een gewone module deze aangepaste code:
Code:
Public myVar() As Variant
Sub testSP()

Dim mVar As MDXTable
tmpAantaltabs = 2 'Wb.Sheets(Wb.Sheets.Count)
ReDim myVar(0 To tmpAantaltabs - 1)
       
         Set mVar = New MDXTable
         mVar.FillMDX "{{[Customer].[Last Name].&[Peters], [Customer].[Last Name].&[ Peters]} * {[Profile General].[Age class (per 10j)].&[UNKNOWN],[Profile General].[Age class (per 10j)].&[80-90]}}", "Selectie1", False
         Set myVar(0) = mVar
         Set mVar = New MDXTable
         mVar.FillMDX "{{[Customer].[Last Name].&[Van Buggenhout], [Customer].[Last Name].&[Peters]} * {[Profile General].[Age class (per 10j)].&[UNKNOWN],[Profile General].[Age class (per 10j)].&[80-90]}}", "Selectie2", True
         Set myVar(1) = mVar

    'Debug.Print "MyVar: " & MyVar(0).MDXFilters & " " & MyVar(0).SelectionName & " " & MyVar(0).Exclude
    'Debug.Print "MyVar: " & MyVar(1).MDXFilters & " " & MyVar(1).SelectionName & " " & MyVar(1).Exclude
    
   ' Set cnnSaveML = New ADODB.Connection
   ' Set cmdSaveML = New ADODB.Command
    
   ' GetGeneralSettings
    
    cnnStrSaveML = "Provider=SQLOLEDB;Data Source=" & cnnSaveML_Srvr & ";Initial Catalog=" & cnnSaveML_Cat & ";Trusted_Connection=No;"
    cnnStrSaveML = cnnStrSaveML & "User ID=" & cnnSaveML_User & ";Password=" & cnnSaveML_PssWrd
    'dit is de connectie naar de server waar de stored procedure opstaat
'    cnnSaveML.Open cnnStrSaveML
    
'    CREATE PROCEDURE MST_Query
'    (@MDXFilters as MDXTable READONLY,
'    @Division as varchar(50),
'    @Channel as varchar(50),
'    @MLType as varchar(50),
'    @IsUnique bit)
    
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@MDXFilters", adArray, adParamInput, -1, myVar())
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@Division", adVarChar, adParamInput, 50, "MGL")
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@Channel", adVarChar, adParamInput, 50, "TM")
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@MLType ", adVarChar, adParamInput, 50, "TM30dnA")
    cmdSaveML.Parameters.Append cmdSaveML.CreateParameter("@IsUnique", adVarBinary, adParamInput, 1, True)
    
    cmdSaveML.CommandText = "MST_Query"
    cmdSaveML.ActiveConnection = cnnSaveML
    
    cmdSaveML.CommandType = adCmdStoredProc
    cmdSaveML.Execute
    cnnSaveML.Close

End Sub

Edit: Loop er even eruitgehaald omdat er tweemaal dezelfde filters werden geladen
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan