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?
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
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
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.
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.
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.