Hallåjs igen, Hej Jag praktiserar alltid defensiv programmering. det jag gör är att direkt efter hämtandet av ett recordsett kollar jag rs.eof. Vilket gör endast ett anrop till recordsettet och på det viset kommer bli snabbare. Är det rs.eof direkt efter rs.open då är det tomt eftersom cursorn alltid ställer sig på första raden Hej Räcker ju med att bara kolla RS.Eof Ifall man öppnat recordsettet... EOF inträffar när du passerat sista posten. Alltså om du gör en movenext efter en movlast kommer få dig att hamna utanför recordsetet och eof kommer då var True... klart du får eof om du gör en movelast, det fattar ju vem som helst ... du måste kolla det som det första du gör direkt efter en rs.open. Hej Hej "Appropå recordset: Jag förstår mig inte heller på folk som använder sig av Do While Not RS.Eof" Om jag fick betalt för varje rad kod jag skrev skulle jag inte hålla till här. Då skulle jag ju koda och var snuskigt rik vid det här laget... Hej Hej Om man precis har öppat recordsetet... Ja då stämmer det... Igen Det skulle vara mycket intressant att få se testen du utfört... Andreas och varför i helvete påstår du att detta inte funkar då: Om du skulle lägga in den i funktionen som jag använt som exempel. Skulle det se ut något sådant här: Det är skillnad på att ha ett tomt recordsset, som ju frågan faktiskt gällde (trots den taffliga rubriken), och att ha stå efter sista posten i ett icke tomt recordset. Hej Men Sven, du är ju helt otrolig... OkiDoki Erik i detta fall (ditt exempel) duger det utmärkt, men som en generell funktion för att testa om ett recordset är tomt duger det inte med att testa med rs.eof Kan inte låta bli Viste inte att 62 år pensionerad MarinOfficer var sådana envisa programmerare... Alltså är mitt sätt ett bra sätt ??!!?? Hej så rundar Vi av med inlägg 30 Hoppsan, Sven fattar fortfarande inte *s* Återigen. Igen Erik skrev Kära peterh eftersom kontrollen om både Eof och Bof är falsk inte säkert kan avgöra om recordsetet är tomt. Utan endast kontroll om Bof och Eof är snt kan avgöra detta. Ett recordset som befinner sig Eof eller Bof innehåller data... Eller hur!!! Hej igen GodMorgon Det var ju verkligen också en lösning *s* igen Erik skrev de ggr ett fel uppstår kommer du få prestandan sänkt med hur mycket som helst .. On error Resume next är långsamt som faen... sug på den du Sven... Det här är ett ämne som har gått åt skogen. Hej Hej Varför dela upp diskussioner i nybörjare/expert??? Är det inte bättre att alla, oavsett förkunskaper, lär sig det "bästa" sättet? Det finns väl ingen anledning att lära sig något "mindre bra" bara för att man inte har så stor kunskaper innan? Jag håller med dig Johan. Jag tror att detta leder till någon form av segregering. SvenPon > Hej Du låter mena "undvärderanede" att En Blind leder En annan Blind" Igen det blir 51 tror jag !Sv: inget kvar
men tänk om det är ett recordset med 200 poster och så står man sist...då är det ju åxå rs.eof
alltså funkar inte rs.eof inte speciellt bra om man vill kolla om recordsetet är tomt.
/e:a
ngn annan idéSv: inget kvar
Som Patrik skrev
Du kan alltid testa rs.EOF
If rs.EOF Then
'om rs är tomt får du True annars inte.
mvh
SvenSv: inget kvar
Det vill säga mycket koller på allt, man får mer kod, men det fungerar oftast bäst i slutändan.
Jag skriver alltid.
if (RS.EOF=False and RS.BOF=False) = True then
RS = Ej tomt
end if
/peterhSv: inget kvar
Sv: inget kvar
Jag var tvungen att testa
Jag hade ett antal poster i recordsetet och gjorde MoveLast
därefter testade jag EOF , Jag fick False dvs recordsetet
var Ej tomt
mvh
SvenSv: inget kvar
RS.Open cmd
Do Until RS.Eof
RS.MoveNext
Loop
Om man återanvända ett öppnat recordsett. Som man T.ex. redan loopat igenom en gång och vill göra det igen... Kan ju förekomma tillfälen. Fast undviks bäst med god kodning...
Fungerar ju inte:
if (RS.EOF=False and RS.BOF=False) = True then
RS = Ej tomt
end if
Efter som EOF är sann.
Jag brukar då köra som nämnts i tidigare inlägg:
If RS.EOF and RS.BOF Then
'Tomt- Inget behövs gör. Kanske medela användaren
Else
RS.MoveFirst 'Behövs bara om
Do Until RS.Eof
RS.MoveNext
Loop
End if
Alternativt:
If Not(RS.EOF and RS.BOF) Then
RS.MoveFirst 'Behövs bara om
Do Until RS.Eof
RS.MoveNext
Loop
End if
Appropå recordset: Jag förstår mig inte heller på folk som använder sig av
Do While Not RS.Eof
Kan ju inte finnas några fördelar med det, Eller???Sv: inget kvar
Samma gäller Bof. Om man befinner sig innan första posten...
Alltså En moveFirst följt av en MovePrevious och man hamnar där...
Det är väl för väl annar så skulle inte det vara lätt att använda dem... :O)Sv: inget kvar
använder du ngt anant än en firhoose cursor kan du använda dig av rs.recorscount också.. kolla om den e större än 0Sv: inget kvar
Andreas är sannslös, så dj.... mycket rader för att
skriva något så här enkelt, ingen orkar läsa .
Som Patrik förmodligen skulle skriva .Nu får det vara "Nock"
Vi kan inte hålla på och "Klydda" mer med detta.
mvh
SvenSv: inget kvar
Måste komma med ett inlägg till på denna tråd.
När man läser Andreas Hillkvist :s och peterh : s inlägg så
blir jag mer och mer övertygad om att Ni som jobbar
yrkesmässigt med programmering, får betalt efter
hur många programrader Ni lyckas åstadkomma.
tror
SvenSv: inget kvar
Av vilken anledning? Vilket sätt är bättre?
/JohanSv: inget kvar
Skulle nog vilja rubricera det som en mognads fråga...
Vill man skapa bra applikationer måste man ha lite "onödiga" rader...Sv: inget kvar
Det här har blivit en intressant tråd
>Jag förstår mig inte heller på folk som använder sig av Do While Not RS.Eof"
Inte jag också
Jag skriver Do Until rs.EOF
Så en sista kommentar ang EOF . Det har ingen djäv............
betydelse om Ni gör MoveLast eller vilka trix Ni har för Er
Om det finns något i RecordSetet så får Ni False om Ni
testar If EOF
DIXI
SvenSv: inget kvar
Detta åker in under avdelningen kvallificerat "Bull skit"
>Vill man skapa bra applikationer måste man ha lite "onödiga" rader...
DSSv: inget kvar
Efter som om det finns poster i recordsette så befiner man sig på första posten... Om Recordsettet är tomt så är BOF och EOF True.
Men om man vill gör kontrollen i t.ex en funktion/Kontroll/What ever, där man får recordsettet som en parameter. Man vet inte om recordsetet nyss är öppnat eller kanske befinner sig EOF.
Då måste man använda sig av If rs.Bof And rs.Eof Then eller RecordCount. Det kan du inte förneka... :O)Sv: inget kvar
>Det kan du inte förneka...
jooo
Skillnaden mellan dig och mig är att jag testar .
DSSv: inget kvar
Här är testen jag använt mig av:
Private Sub Form_Load()
Dim conn As ADODB.Connection
Dim rsTemp As Recordset
Set conn = New ADODB.Connection
Set rsTemp = New ADODB.Recordset
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"
'rsTemp.Open "Categories", conn, adOpenStatic, adLockReadOnly, adCmdTableDirect
rsTemp.Open "SELECT * FROM Categories WHERE False", conn, adOpenStatic, adLockReadOnly, adCmdText
LoadComboBox Combo1, rsTemp, rsTemp("CategoryID"), rsTemp("CategoryName")
LoadComboBox Combo2, rsTemp, rsTemp("CategoryID"), rsTemp("CategoryName")
rsTemp.Close
conn.Close
Set conn = Nothing
Set rsTemp = Nothing
End Sub
Private Function LoadComboBox(ComboBox As ComboBox, Recordset As ADODB.Recordset, DataField As ADODB.Field, TextField As ADODB.Field)
ComboBox.Clear
If Recordset.BOF And Recordset.EOF Then
Else
Recordset.MoveFirst
Do Until Recordset.EOF
ComboBox.AddItem "" & TextField
ComboBox.ItemData(ComboBox.NewIndex) = DataField
Recordset.MoveNext
Loop
End If
End Function
Efter som Recordset.MoveFirst orsakar ett fel om recordsettet är tomt så är en kontroll av om data finns obligatorisk. Använder man sig sedan av källan som innehåller poster. Kommer andra anropet till funktionen inte lägga till några poster om man ite gör något anrop till MoveFirst...
Skulle vara intressant och se dig lösa det genom att enbar kontrollera EOF...Sv: inget kvar
If (RS.EOF = False And RS.BOF = False) = True Then
Debug.Print "Du har data i ditt recordset"
Else
Debug.Print "Du har inte data i ditt recordset"
End If
Förklara vad som är felet då....
Det funkar då innihelvete bra i alla mina jävla program.
/peterhSv: inget kvar
Private Function LoadComboBox(ComboBox As ComboBox, Recordset As ADODB.Recordset, DataField As ADODB.Field, TextField As ADODB.Field)
ComboBox.Clear
If (Recordset.EOF = False And Recordset.BOF = False) = True Then
Recordset.MoveFirst
Do Until Recordset.EOF
ComboBox.AddItem "" & TextField
ComboBox.ItemData(ComboBox.NewIndex) = DataField
Recordset.MoveNext
Loop
End If
End Function
I andra anropet till funktionen med samma recordset skulle Recordset.EOF vara san. Efter som recordsettet loppats igenom en gån. Därav skulle vilkoret ej retunera sant.
Men om man precis öppnat ett recordset så fungerar det...
Jag pekar på att vid återanvändning av ett igenom loopat recordset. Då man befinner sig EOF.
Notera att jag inte påstår att det är bra att återanvända ett öppet rrecordset... Utan att jag bara anmärker att man bör hantera detta då det förekkommer på ett korrekt sätt...
KAnske jag som brister i mina formuleringar... Är det ingen som förstår vad jag menar?Sv: inget kvar
Tänk om alla levde som dom lärde och läste frågeställningen ordentligt, Sven...Sv: inget kvar
Jag refererar till ett tomt recordset
Tex om jag konstruerar ett recSQL och det inte
har blivit några träffar så är
IF recSQL.EOF Then ett utmärkt sätt att få reda på detta
dvs att det är tomt.
DSSv: inget kvar
Du brukar själv propagera för logiskt tänkande.
Bara för att du fåt rs.EOF=True så kan du ju inte vara säker på att du har ett tomt recordset!Sv: inget kvar
Jag vet inte om Vi pratar förbi varandra men
Tag tog en kod snutt från ett av mig fungerande program
Set DynaGods = DbGods.OpenRecordset("SELECT" _
& " GodsNr,Klass,ADR,ÄmneNr,UnNr,Ems," _
& " Mfag,Mp,Faktor FROM FARLIGTGODS" _
& " WHERE ÄmneNamn = " & "'" & tmpName _
& "'" & " ORDER BY Klass,ÄmneNr,UnNr")
If DynaGods.EOF Then
Set DynaGods = Nothing
Exit Sub
End If
Menar du att om jag får DynaGods.EOF True
så kan jag ändå inte vara säker på att DynaGods är tomt
undrand logiska svenSv: inget kvar
Sv: inget kvar
"TjaffsNissen" Andreas Hillkvist skriver att jag inte läser
frågan. Så här var det från början
> hur kan man kolla om ett recordset är tomt.
Svar: öppna och kolla rs.EOF
Jag fick iallafall Erik att erkänna att mitt och Patriks svar
var korrekt se inlägg ovan.
DIXI
SvenSv: inget kvar
Har inte för mig att jag gjort det vår kära SvenPon påstår... Har för mig att det var Erik som referade till frågan...
Har bevisat när man bör kontrollera Bof och Eof. Att det alltid inte räcker med att kontrollera Eof, som vår vän SvenPon påstår... Sv: inget kvar
SvenPon.... GivAkt.
Jag är själv en gammal avdankad officer, Fänrik för att vara exakt. Fast bara en värnpliktig sådan men i alla fall.
Lediga..
/peterhSv: inget kvar
>SvenPon.... GivAkt.
Vad ända in i glödheta helvete säger du kanin
En Fänrik kan väl inte kommendera givakt på en Kapten
mvh Sven :-) :-) ;-)Sv: inget kvar
Än en gång Sven, läs igenom lite noggrannare.
Frågeställaren e:a skrev:
>hur kan ma kolla om ett recordset är tomt.
och fick svaret:
>rs.eof
av Patrik Löwendahl, vilket iofs är rätt då frågan ställdes som "hur KAN man..." osv, det är dock inte ett uttömande svar eftersom det inte i alla lägen räcker att kolla OEF. Dock KAN man, i vissa situationer, nöja sig med att kolla EOF.
Så mycket fattade också frågeställeren e:a och kompletterade sin fråga med följande:
>men tänk om det är ett recordset med 200 poster och så står man >sist...då är det ju åxå rs.eof
>alltså funkar inte rs.eof inte speciellt bra om man vill kolla om >recordsetet är tomt.
alltså måste man då kolla både BOF och EOF!
Det jag "erkände" var att i ditt exempel räckte det att kolla OEF.
Kan du Sven skriva en funktion som får ett recordset som argument och returnerar True om recordsetet är tomt och False om det innehåller poster? Det skulle vara intressant att se hur du löser det...Sv: inget kvar
Alltså är mitt sätt bra.
Det fungerar och Andreas Hillkvist har ännu inte visat vad som är fel i mitt sätt.
SvenPon............... Honnör.........
/peterh (Fänrik fjun), Vapenfett 101 som frisygeléSv: inget kvar
>som argument och returnerar True om recordsetet är tomt .
Det kanske blir lite för abbstrakt för dig men om påståendet
inte är True så är det False. ;-)
>Vapenfett 101 som frisygelé
Saltvatten som måltidsdryck
Ha det
SvenSv: inget kvar
Om du testa exemplet jag använder kommer det ej att fungera...
Där är mit påstående bevisat... Tack och hej, leverpastej...
Private Sub Form_Load()
Dim conn As ADODB.Connection
Dim rsTemp As Recordset
Set conn = New ADODB.Connection
Set rsTemp = New ADODB.Recordset
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"
rsTemp.Open "Categories", conn, adOpenStatic, adLockReadOnly, adCmdTableDirect
LoadComboBox Combo1, rsTemp, rsTemp("CategoryID"), rsTemp("CategoryName")
LoadComboBox Combo2, rsTemp, rsTemp("CategoryID"), rsTemp("CategoryName")
rsTemp.Close
conn.Close
Set conn = Nothing
Set rsTemp = Nothing
End Sub
Private Function LoadComboBox(ComboBox As ComboBox, Recordset As ADODB.Recordset, DataField As ADODB.Field, TextField As ADODB.Field)
ComboBox.Clear
If (Recordset.EOF = False And Recordset.BOF = False) = True Then
Else
Recordset.MoveFirst
Do Until Recordset.EOF
ComboBox.AddItem "" & TextField
ComboBox.ItemData(ComboBox.NewIndex) = DataField
Recordset.MoveNext
Loop
End If
End FunctionSv: inget kvar
Eftersom tråden fortsätter utan min förskyllan
så får jag väl slänga in ett nytt vedträ i brasan.
Så här kan man också lösa ursprungsproblemmet
On Error Resume Next
rs.MoveFirst
If Err = 3021 Then _
MsgBox ("Recordset är tomt")
On Error Goto 0
Tycker jag
SvenSv: inget kvar
Nu vet vi var vi har Sven, om det nu var nån som var tveksam...Sv: inget kvar
>Det var ju verkligen också en lösning *s*
Nu vet vi var vi har Sven, om det nu var nån som var tveksam...
Vad menar du lille Erik
Sen tyckar jag att det är lite fegt att inte visa vem du är !
Mitt exempel fungerar 100 % på ursprungsfrågan
DS
Sv: inget kvar
Sv: inget kvar
lite synd att behöva förflytta sig i recorsetet för kolla om det är tomt eller inte, om det inte var tomt så har man ju tappat sin position med movefirst...
feg? ja jag vet... men det är bara för att jag tycker det är en löjlig funktion i pelles forum att behöva vara registrerad för att läsa i ett forum.Sv: inget kvar
Detta är forumet för VB nybörjare så lungna er lite.
MiaSv: inget kvar
Håller fullständigt med dig.
Det finns en massa "besserwissers" som älskar att "tjaffsa"
Jag är väl lite skyldig också.
Forumet heter VB fö Nybörjare, då skall man svara rakt
med något som fungerarar.Om det sedan inte är den optimala
lösningen så skall det avhandlas på annat ställe.
Jag blir väldigt fundersam när ser att "de sk proffsen" är här och
"tjaffsar" . Har Ni inget eget Forum som bättre passar Er kapacitet.
mvh
SvenSv: inget kvar
Du låter mena "undvärderanede" att En Blind leder En annan Blind"
Up yours ^
DsSv: inget kvar
/Johan - som hoppas han inte rör upp diskussionen för mycket...Sv: inget kvar
Det kanske beror på tekniska skäl men kan inte förstå varför i så fall.
mvh FransSv: inget kvar
Up yours ^
Ds
SVAR ==========================================
Blir förvånad över att en pensionerad marinofficer använder sådana
uttryck som Up Yours ^
Jag tycker inte det är lämpligt att svara på detta sättet, speciellt inte
om man är moderator för denna avdelning i forumet.
==============================================
/peterhSv: inget kvar
peterh skrev
>Blir förvånad över att en pensionerad marinofficer använder sådana
>uttryck som Up Yours ^
>Jag tycker inte det är lämpligt att svara på detta sättet, speciellt inte
>om man är moderator för denna avdelning i forumet.
1 Jag är inte Moderator för detta Forum
2 "Fantomen är hård mot dom hårda"
Sen har jag kommit på att Ni måste vara understimulerade
kommunaltjänstemän ,eftersom Ni kan sitta och svammla en
massa långa onödiga haranger på "Brinnande arbetstid"
mvh
Sven