Crystal Reports - Kör rapporter från VB
Förord
Att kunna köra en rapport från Crystal Reports och automatiskt fylla i parametrar kan vid vissa tillfällen vara ett krav vid utveckling av program. Själv har jag gjort ett program liknande detta för att köra CR-rapporter från ett Java-program. Problemet med detta är att det inte är väldokumenterat och varför uppfinna hjulet två gånger? Så här går det tillInnehåll
Relaterade artiklar
» Crystal Reports - enkla rapporter del #1Det finns två sätt att skapa Crystal Reports objekt i Visual basic, ett sätt är genom API genom "Crystal Reports Wrapper dll" (CRWRAP32.DLL) men enligt Seagate Software så är denna inte att rekommendera då alla rapport-funktioner inte är tillgängliga genom API pga VBs egna begränsningar. Det andra sättet är att använda Crystal Reports Engine # Object Library (cpeaut32.dll), det är detta sätt jag kommer att gå igenom i denna artikeln.
För att börja rapportkörandet; skapa ett nytt (eller använd ett befintligt VB-projekt) och lägg till en referens till Crystal Reports Engine # Object Library (cpeaut32.dll) problemet med denna dll är att den inte alltid är korrekt registrerad, vad du får göra då är att registrera den med regsvr32, filen ligger normalt i system-katalogen.
För att köra rapporten i VB och ev. skicka in parametrar i rapporten behöver du ett "Crystal Reports Application"-objekt och ett "Crystal Reports Report"-objekt. Du kan skapa dessa genom att deklarera eller använda dig av "CreateObject". Det första man skall göra är att skapa ett Application-objekt.
alternativt:
Nästa steg är att logga in på din databas, detta görs med "LogOnServer" som är en metod i Application-objektet, i detta fallet är det en ODBC-källa som skall användas.
P2SODBC.DLL = Den "databas-tolk" som rapporten använder.
Server = Namnet på ODBC-källan (Case sensitive!)
UIN = Användarnamnet på servern
PWD = Lösenordet på servern
Det finns många databas-tolkar som följer med Crystal Reports, här är några:
p2sora7.dll = Oracle 7
p2soledb.dll = OLE DB
p2ssql.dll = SQL Native (MSSQL-server, Access)
För att ta reda på vilken dll fil din rapport använder, välj "Convert Database Driver…" i "Database"-menyn i Crystal Reports. Ruten du får upp ser ut så här:
Ett problem med att använda den dll som står här, kan vara att den inte fungerar. Det finns två sorters databas-tolkar, de som heter pds*.dll och de som heter p2s*.dll. Pröva dig fram för att hitta den du skall använda. Om pdsodbc.dll inte fungerar så pröva med p2sodbc.dll.
När du är har skapat application-objektet och loggat in på din datakälla är det dags att skapa ett report-objekt. För att göra detta måste du deklarera ett report -objekt:
För att knyta ditt report -objekt till den rapport du vill köra skall du använda "OpenReport" metoden i application-objektet:
Nästa sak du skall göra är att skicka in de parametrar som rapporten behöver (om den behöver några), dessa hittar du i "ParameterFields" i report-objektet, för att hantera dessa på ett snyggt sätt:
Koppla sedan crpParameterFields till de parametrar som finns i report-objektet:
Koppla sedan parametrarna till crpParameterField, i samlingen crpParameterFields.Item() finns alla parmetrarna, för att än en gång lösa det på ett snyggt sätt lägger vi över parametrarna en i taget i " crpParameterField ":
Nu skall du börja skicka in dina parametrar i "crpParameterField", detta gör du med:
Beroende på vilken datatyp parametern kräver får du konvertera i VB så att du skickar in den datatypen som CR vill ha. Bygger man detta programmet för en rapport så är det inga problem, ibland vill man göra ett program för att skapa flera rapporter, då får man ta reda på vad parametern vill ha för datatyp, denna egenskap hittar du i:
För att göra en enkel if-sats som tar hand om detta, kolla vad ValueType har för värde och konvertera din parameter efter detta:
De olika datatyperna är:
crBitmapField - 17
crBlobField - 15
crBooleanField - 9
crChartField - 21
crCurrencyField - 8
crDateField - 10
crDateTimeField - 16
crIconField - 18
crInt16sField - 3
crInt16uField - 4
crInt32sField - 5
crInt32uField - 6
crInt8sField - 1
crInt8uField - 2
crNumberField - 7
crOleField - 20
crPersistentMemoField - 14
crPictureField - 19
crStringField - 12
crTimeField - 11
crTransientMemoField - 13
crUnknownField - 22
Nu har du gjort allt som behövs för att köra rapporten, du kan skriva ut:
eller förhandsgranska:
Nu ska vi fimpa alla objekt för att frigöra resurser:
För att börja rapportkörandet; skapa ett nytt (eller använd ett befintligt VB-projekt) och lägg till en referens till Crystal Reports Engine # Object Library (cpeaut32.dll) problemet med denna dll är att den inte alltid är korrekt registrerad, vad du får göra då är att registrera den med regsvr32, filen ligger normalt i system-katalogen.
För att köra rapporten i VB och ev. skicka in parametrar i rapporten behöver du ett "Crystal Reports Application"-objekt och ett "Crystal Reports Report"-objekt. Du kan skapa dessa genom att deklarera eller använda dig av "CreateObject". Det första man skall göra är att skapa ett Application-objekt.
Dim crpApplication As CRPEAuto.Application
Set crpApplication = CreateObject("Crystal.CRPE.Application")
alternativt:
Dim crpApplication As New CRPEAuto.Application
Nästa steg är att logga in på din databas, detta görs med "LogOnServer" som är en metod i Application-objektet, i detta fallet är det en ODBC-källa som skall användas.
crpApplication.LogOnServer "P2SODBC.DLL", "Server", "DB", "UIN", "PWD"
P2SODBC.DLL = Den "databas-tolk" som rapporten använder.
Server = Namnet på ODBC-källan (Case sensitive!)
UIN = Användarnamnet på servern
PWD = Lösenordet på servern
Det finns många databas-tolkar som följer med Crystal Reports, här är några:
p2sora7.dll = Oracle 7
p2soledb.dll = OLE DB
p2ssql.dll = SQL Native (MSSQL-server, Access)
För att ta reda på vilken dll fil din rapport använder, välj "Convert Database Driver…" i "Database"-menyn i Crystal Reports. Ruten du får upp ser ut så här:
Ett problem med att använda den dll som står här, kan vara att den inte fungerar. Det finns två sorters databas-tolkar, de som heter pds*.dll och de som heter p2s*.dll. Pröva dig fram för att hitta den du skall använda. Om pdsodbc.dll inte fungerar så pröva med p2sodbc.dll.
När du är har skapat application-objektet och loggat in på din datakälla är det dags att skapa ett report-objekt. För att göra detta måste du deklarera ett report -objekt:
Dim crpReport As CRPEAuto.Report
För att knyta ditt report -objekt till den rapport du vill köra skall du använda "OpenReport" metoden i application-objektet:
Set crpReport = crpApplication.OpenReport()
Nästa sak du skall göra är att skicka in de parametrar som rapporten behöver (om den behöver några), dessa hittar du i "ParameterFields" i report-objektet, för att hantera dessa på ett snyggt sätt:
Dim crpParameterFields As CRPEAuto.ParameterFieldDefinitions
Dim crpParameterField As CRPEAuto.ParameterFieldDefinition
Koppla sedan crpParameterFields till de parametrar som finns i report-objektet:
Set crpParameterFields = crpReport.ParameterFields
Koppla sedan parametrarna till crpParameterField, i samlingen crpParameterFields.Item() finns alla parmetrarna, för att än en gång lösa det på ett snyggt sätt lägger vi över parametrarna en i taget i " crpParameterField ":
Set crpParameterField = crpParameterFields.Item([Integer som anger vilken parameter du skall jobba med])
Nu skall du börja skicka in dina parametrar i "crpParameterField", detta gör du med:
crpParameterField.SetCurrentValue (värde)
Beroende på vilken datatyp parametern kräver får du konvertera i VB så att du skickar in den datatypen som CR vill ha. Bygger man detta programmet för en rapport så är det inga problem, ibland vill man göra ett program för att skapa flera rapporter, då får man ta reda på vad parametern vill ha för datatyp, denna egenskap hittar du i:
crpParameterField.ValueType
För att göra en enkel if-sats som tar hand om detta, kolla vad ValueType har för värde och konvertera din parameter efter detta:
If crpParameterField.ValueType = 7 Then
värde = CInt(Trim())
Else
värde = CStr(Trim())
End If
crpParameterField.SetCurrentValue (värde)
De olika datatyperna är:
crBitmapField - 17
crBlobField - 15
crBooleanField - 9
crChartField - 21
crCurrencyField - 8
crDateField - 10
crDateTimeField - 16
crIconField - 18
crInt16sField - 3
crInt16uField - 4
crInt32sField - 5
crInt32uField - 6
crInt8sField - 1
crInt8uField - 2
crNumberField - 7
crOleField - 20
crPersistentMemoField - 14
crPictureField - 19
crStringField - 12
crTimeField - 11
crTransientMemoField - 13
crUnknownField - 22
Nu har du gjort allt som behövs för att köra rapporten, du kan skriva ut:
crpReport.PrintOut
eller förhandsgranska:
crpReport.Preview
Nu ska vi fimpa alla objekt för att frigöra resurser:
crpApplication.LogOffServer "P2SODBC.DLL", "server", "db", "uin", "pwd"
Set crpReport = Nothing
Set crpApplication = Nothing
Set crpParameterField = Nothing
Set crpParameterFields = Nothing
0 Kommentarer