webForumDet fria alternativet

Räknare via komponent & SP

ASP

33 svar · 639 visningar · startad av ironhead

Medlem sedan mars 20011 346 inlägg
Frågan#1

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 ;) ?

Medlem sedan juni 200032 967 inlägg
#2

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
%>
Medlem sedan mars 20011 346 inlägg
#3

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?

Medlem sedan juni 200032 967 inlägg
#4

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?

Medlem sedan mars 20011 346 inlägg
#5

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?

Medlem sedan juni 200032 967 inlägg
#6

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.

Medlem sedan mars 20011 346 inlägg
#7

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

Medlem sedan juni 200032 967 inlägg
#8

Fel och fel...

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

Medlem sedan mars 20011 346 inlägg
#9

ok! Ska testa.

Medlem sedan mars 20011 346 inlägg
#10

Får "slut på minne" :(

Medlem sedan juni 200032 967 inlägg
#11

Var?

Ge oss all relevant kod.

Medlem sedan mars 20011 346 inlägg
#12

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
Medlem sedan juni 200032 967 inlägg
#13

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]
Medlem sedan mars 20011 346 inlägg
#14

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

Medlem sedan juni 200032 967 inlägg
#15

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

Medlem sedan mars 20011 346 inlägg
#16

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

Medlem sedan juni 200032 967 inlägg
#17

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

Medlem sedan mars 20011 346 inlägg
#18

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?

Medlem sedan juni 200032 967 inlägg
#19

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

Medlem sedan mars 20011 346 inlägg
#20

ok! <---stupid! :r

276 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)