---
title: "Räknare via komponent & SP"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/90599-räknare-via-komponent-sp"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "ironhead"
published: "2003-11-17T10:43:38.000Z"
updated: "2003-11-18T13:33:25.000Z"
replies: 33
views: 645
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/90599-räknare-via-komponent-sp"
---

# Räknare via komponent & SP

_Sida 1 av 2._

## #1 — ironhead, 2003-11-17T10:43Z

Halloj! Nu ere stillestånd i övre regionerna igen...hoppas på hjälp ;)

Jag anropar en VB komponent med 1 parameter:

```
test="hej"
Set CCol = Server.CreateObject("testa.testaCol")	
CCol.test=cstr(test)
CCol.mCountFM application("ConnectionStr"), application("provider")
```

 
Komponenten i sin tur anropar en SP med:

```
iDate = CStr(Format(Now, "yyyymmdd")) ' DagensDatum
lSQLStr = "sCountFM @iDate='" & iDate & "',@test='" & test & "'"
```

 
SP:n returnerar ("count") en siffra på antal funna matchningar.

Om jag kör SP:n i QueryAnalyzern får jag 2 träffar på "hej", så då funkar det som det ska, men hur returnerar jag antalet 2 i VBkomponenten till ASP-sidan?

Nån dom fattar ;) ?

Permalänk: https://www.webforum.nu/p/90599

## #2 — @nders, 2003-11-17T10:48Z

Jag saknar iofs lite info om hur koden i komponenten ser ut, och hur du returnerar värden från din lagrade procedur, men...

```
' i komponenten: 
Public function mCountFM(ByVal parameter1 as string, ByVal parameter2 as string) as Long
 ' Gör alltihop
 lngCount = objRS(0) ' returnerar du med select från SP'n?
CountTheStuff = lngCount
End function
```

```
<%
lngCounter = CCol.mCountFM application("ConnectionStr"), application("provider")
Response.write  lngCounter
%>
```

Permalänk: https://www.webforum.nu/p/1206676

## #3 — ironhead, 2003-11-17T11:39Z

Jag returnerar inte värdet sådär utan bara typ:

```
SELECT DISTINCT count(ttest.testID) FROM Tabell
WHERE test=@test
```

Måste jag loopa upp alla poster för att kunna räkna dom?

Permalänk: https://www.webforum.nu/p/1206715

## #4 — @nders, 2003-11-17T11:41Z

Ja, det var det jag utgick ifrån i mitt kodexempel.

edit: Loopa? Du får bara en post.
Varför har du **select distinct count(fält)** i din fråga?

Permalänk: https://www.webforum.nu/p/1206716

## #5 — ironhead, 2003-11-17T11:57Z

> Varför har du select distinct count(fält) i din fråga?

Den är mycket längre än vad jag visat här, är det inte korrekt att skriva så eller?

Permalänk: https://www.webforum.nu/p/1206722

## #6 — @nders, 2003-11-17T11:59Z

Jag vet inte vad du är ute efter.

Men:

```
SELECT COUNT(DISTINCT fältnamn) FROM tabell
```

returnerar antalet unika värden i ett speciellt fält.

Permalänk: https://www.webforum.nu/p/1206724

## #7 — ironhead, 2003-11-17T12:30Z

aha! ok!
Om man skriver som jag gjorde...blir det fel då?

...för i så fall har du hittat felet åt mig  :e  :r   :birp

Permalänk: https://www.webforum.nu/p/1206743

## #8 — @nders, 2003-11-17T12:32Z

Fel och fel...

Det är väl inget direkt syntaxfel, men resultatet är inte detsamma.

Permalänk: https://www.webforum.nu/p/1206745

## #9 — ironhead, 2003-11-17T12:38Z

ok! Ska testa.

Permalänk: https://www.webforum.nu/p/1206747

## #10 — ironhead, 2003-11-17T13:21Z

Får "slut på minne" :(

Permalänk: https://www.webforum.nu/p/1206768

## #11 — @nders, 2003-11-17T13:30Z

Var?

Ge oss all relevant kod.

Permalänk: https://www.webforum.nu/p/1206777

## #12 — ironhead, 2003-11-17T14:10Z

ASP:

```
FM="test"

Set CCol = Server.CreateObject("Fakta.FaktaCol")	
CCol.sFaktamangd=cstr(FM)
CCol.mCountFM application("ConnectionStr"), application("provider")
	  
Response.Write "Antal:" & FM & "=" & CCol.Count
```

 

VB:

```
Public Function mCountFM(pConnectionStr As String, pProviderStr As String)
  
  On Error GoTo ErrorHandler
  ConnectMe pConnectionStr, pProviderStr
  If mConnection.State = adStateClosed Then Exit Function

  iPublishDate = CStr(Format(Now, "yyyymmdd"))
      
  lSQLStr = "sCountFM @iPublishDate='" & iPublishDate & "',@sFM='" & sFaktamangd & "'"
    
  Set lrec = New Recordset
  Set lrec = mConnection.Execute(lSQLStr)
  
  Do While Not lrec.EOF
   With lrec
    
    If Not IsNull(!sFaktamangd) Then mvarsFaktamangd = !sFaktamangd
        
    Add mvariFaktaID, mvarsFaktamangd
    
    .MoveNext
   End With
  Loop
  
  mCountFM = Count
  
  Exit Function
```

 

SP: (sCountFM) 

```
CREATE PROCEDURE sCountFM
(
  @iPublishDate			varchar(255),
  @sFM				varchar(255)

)
AS BEGIN
  SET NOCOUNT ON

DECLARE
	@iCommaAt 			int,
	@CommaWk 			int,
	@err				int,
	@SQLString			nvarchar(2500),
	@Test				int
	SET @SQLstring = N'SELECT COUNT (DISTINCT tRecipe.iRecipeID)
			        	FROM tRecipe LEFT OUTER JOIN
    				FaktaRecipe ON tRecipe.iRecipeID = FaktaRecipe.iRecipe LEFT OUTER JOIN
    				Faktamangd ON FaktaRecipe.iRecipeFakta = Faktamangd.iFaktaID LEFT OUTER JOIN
				tMainIngredientGroup ON tRecipe.iRecipeID = tMainIngredientGroup.iRecipeID LEFT OUTER JOIN
				tIngredientGroup ON tMainIngredientGroup.iIngredientGroupID = tIngredientGroup.iIngredientGroupID LEFT OUTER JOIN
				tMealRecipe ON tRecipe.iRecipeID = tMealRecipe.iRecipeID LEFT OUTER JOIN
				tMeal ON tMealRecipe.iMealID = tMeal.iMealID LEFT OUTER JOIN
				tRecipeOccation ON tRecipe.iRecipeID = tRecipeOccation.iRecipeID LEFT OUTER JOIN
				tOccasion ON tRecipeOccation.iOccasionID = tOccasion.iOccasionID LEFT OUTER
				JOIN tRecipeType ON tRecipe.iRecipeID = tRecipeType.iRecipeID LEFT OUTER JOIN
				tType ON tRecipeType.iTypeID = tType.iTypeID LEFT OUTER JOIN
				tThemeIndex ON tRecipe.iRecipeID = tThemeIndex.iRecipeID LEFT OUTER JOIN
				tTheme ON tThemeIndex.iThemeID = tTheme.iThemeID LEFT OUTER JOIN
				tEditionIndex ON tTheme.iThemeID = tEditionIndex.iThemeID LEFT OUTER JOIN
				tEdition ON tEditionIndex.iEditionID = tEdition.iEditionID LEFT OUTER JOIN
				tRecipeProduct ON tRecipe.iRecipeID = tRecipeProduct.iRecipeID LEFT OUTER JOIN
				tProduct ON tRecipeProduct.iProductID = tProduct.iProductID
				WHERE tEdition.iPublishDate <=' + @iPublishDate + char(13)
	
	
	if @sFM <> '' 
		begin
		set @CommaWk = 0
		set @SQLString = @SQLString + N'and  ('
		select @iCommaAt = CHARINDEX(',',@sFM)
		while @iCommaAt > 0
			begin
			if @CommaWk > 0 set @SQLString = @SQLString + N' or '
			if substring(@sFM, 1, @iCommaAt - 1) > ''
				begin
				set @CommaWk = @CommaWk + 1
				set @SQLString = @SQLString + 'Faktamangd.sFaktamangd = ''' + substring(@sFM, 1, @iCommaAt - 1) + ''''
				end
			select @sFM = substring(@sFM, @iCommaAt + 1, 255)
			select @iCommaAt = charindex(',', @sFM)
			end
			if @CommaWk > 0
				begin
				set @SQLString = @SQLString + N' or '
				end
		if @sFM > '' SET @SQLString =  @SQLString +  N'Faktamangd.sFaktamangd =  ''' + @sFM + ''''
		set @sqlstring = @SQLString + N')'
		end

print @SQLstring

EXEC sp_executesql @SQLstring

END
RETURN
```

Permalänk: https://www.webforum.nu/p/1206813

## #13 — @nders, 2003-11-17T14:16Z

Var dyker felet upp? I ASP, i VB-komponenten eller i exekverandet av den lagrade proceduren?

edit:

Om funktionen i komponenten ska returnera saker så kan det ju vara bra att skriva det.

```
Public Function mCountFM(pConnectionStr As String, pProviderStr As String)[b] As Long[/b]
```

Permalänk: https://www.webforum.nu/p/1206821

## #14 — ironhead, 2003-11-17T14:21Z

i SP:n funkar det bra, det är i Komponenten det trilskas!

När jag kör Funktionen via ett formulär i VB stängs bara programmet ner.....kör jag via ASP får jag "Minne Slut"  :q

Permalänk: https://www.webforum.nu/p/1206829

## #15 — @nders, 2003-11-17T14:31Z

> **ironhead skrev:**
>
> När jag kör Funktionen via ett formulär i VB stängs bara programmet ner

Ta bort "On error goto errorhandler" då om du inte ska använda någon errorhandler. I övrigt, kommentarer/frågor i koden nedan:

```
' [b]Specificera gärna ByVal / ByRef i interfacet. Specificera också vad som ska returneras[/b]
Public Function mCountFM(ByVal pConnectionStr As String, ByVal pProviderStr As String) As Long
  
  On Error GoTo ErrorHandler ' [b]Jag ser ingen ErrorHandler i koden, har du klippt bort den?[/b]
  '[b] borde inte ConnectMe [i]returnera[/i] ett connectionobjekt? [/b]
  ConnectMe pConnectionStr, pProviderStr
  If mConnection.State = adStateClosed Then Exit Function

  iPublishDate = CStr(Format(Now, "yyyymmdd"))

  [b]' var får du sFaktamangd ifrån nedan?[/b]      
  lSQLStr = "sCountFM @iPublishDate='" & iPublishDate & "',@sFM='" & sFaktamangd & "'"
    
  Set lrec = New Recordset ' [b]varför har du med denna rad, om du ändå har med raden under?[/b]
  Set lrec = mConnection.Execute(lSQLStr)
  
  Do While Not lrec.EOF
   With lrec
    ' [b] vad är det tänkt att koden nedan ska göra? [/b]
    If Not IsNull(!sFaktamangd) Then mvarsFaktamangd = !sFaktamangd
        
    Add mvariFaktaID, mvarsFaktamangd
    
    .MoveNext
   End With
  Loop
  
  mCountFM = Count
  
  Exit Function
```

Ett tips är att du fortsätter köra koden i en windowsapplikation / form i VB tills den fungerar, gör den då till en komponent. Det är (imho) lättare att felsöka på det sättet.

Du bör också deklarera dina variabler med Dim.

Mvh

Permalänk: https://www.webforum.nu/p/1206839

## #16 — ironhead, 2003-11-17T14:36Z

> Jag ser ingen ErrorHandler i koden, har du klippt bort den?

Japp!

> var får du sFaktamangd ifrån nedan?
> lSQLStr = "sCountFM @iPublishDate='" & iPublishDate & "',@sFM='" & sFaktamangd & "'"

ifrån ASP-sidan (CCol.sFaktamangd=cstr(FM)) eller från formuläret i VB.

> Set lrec = New Recordset
> varför har du med denna rad, om du ändå har med raden under?

Det måste man väl?!

> vad är det tänkt att koden nedan ska göra? 
> If Not IsNull(!sFaktamangd) Then mvarsFaktamangd = !sFaktamangd

Lista upp alla träffar från fältet "sFaktamangd" i databasen

Permalänk: https://www.webforum.nu/p/1206848

## #17 — @nders, 2003-11-17T14:41Z

> **ironhead skrev:**
>
> ifrån ASP-sidan (CCol.sFaktamangd=cstr(FM)) eller från formuläret i VB.

Du borde skicka in det som en parameter i funktionen.

> **ironhead skrev:**
>
> Det måste man väl?!

Eftersom du har har *Set bla...* direkt på raden under så skapas bara objektet om på en gång. 

> **ironhead skrev:**
>
> Lista upp alla träffar från fältet "sFaktamangd" i databasen

Ska du lista upp saker i komponenten? Varför då? Vem ska se det? En select count returnerar alltid ett värde (0 eller annat tal), det är bara att skicka ut det till asp-sidan på en gång.

mvh

Permalänk: https://www.webforum.nu/p/1206858

## #18 — ironhead, 2003-11-17T14:45Z

> Du borde skicka in det som en parameter i funktionen.

huh? Hur då menar du?

> Ska du lista upp saker i komponenten? Varför då? Vem ska se det? En select count returnerar alltid ett värde (0 eller annat tal), det är bara att skicka ut det till asp-sidan på en gång.

Jaha! Jasså! Hur skickar jag ut det till sidan?

Permalänk: https://www.webforum.nu/p/1206863

## #19 — @nders, 2003-11-17T14:51Z

> **ironhead skrev:**
>
> huh? Hur då menar du?

Du skickar ju redan in två saker till funktionen i komponenten, skicka in en sak till!

```
Public Function mCountFM(ByVal pConnectionStr As String, ByVal pProviderStr As String[b], ByVal sFaktamangd As String[/b])As Long
```

Skicka bara med ett tredje värde sedan när du kallar på funktionen.

> **ironhead skrev:**
>
> Jaha! Jasså! Hur skickar jag ut det till sidan?

Du gör ju det sist i funktionen med **mCountFM = Count**?

På asp-sidan tar du emot värdet som om det vore vilken funktion som helst enligt exemplet i mitt första inlägg i tråden.

mvh

Permalänk: https://www.webforum.nu/p/1206867

## #20 — ironhead, 2003-11-17T14:56Z

ok! \<---stupid!  :r

Permalänk: https://www.webforum.nu/p/1206875

---

Tråden på webben: https://www.webforum.nu/amne/asp/90599-räknare-via-komponent-sp  
Nästa sida: https://www.webforum.nu/amne/asp/90599-räknare-via-komponent-sp/page2.md
