Toon posts:

[VB6] Do until - lus, probleem met code

Pagina: 1
Acties:
  • 398 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een bepaalde code samengesteld om gegevens in een database opteslaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim y as Integer
Dim i as Integer
i = 0
Do Until i = Adodc2.Recordset.Fields.Count
    y = Adodc2.Recordset.Fields(i)
    Maat.Text = Adodc2.Recordset.Fields(i).Name
    If y = "0" Then
    Else
        Adodc1.RecordSource = "Select * from Producten"
        Adodc1.Refresh
        With Adodc1.Recordset
        .AddNew
        .Fields("Leverancier") = Text1.Text
        .Fields("Model") = Text2.Text
        .Fields("Maat") = Maat.Text
        .Fields("Aantal") = y
        .Fields("AantalL") = AantalL.Text
        .Fields("Bestelling") = Text8.Text
        .Update
        End With
    End If
    i = i + 1
Loop
Adodc1.Recordset.Close
MsgBox "Bestelling opgeslaan"


Heb probleem ligt bij de variabele y, door voortdurend te testen zag ik dat y op nul blijft staan. Dus blijkbaar is de keuze van:
code:
1
y = Adodc2.Recordset.Fields(i)

niet correct. Klopt deze code, of bestaat er nog een andere code die hetzelfde resultaat zou moeten geven?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:33

TeeDee

CQB 241

offtopic:
opgeslaan? :)


Probeer eens
code:
1
2
3
4
IF y = 0 then
MsgBox "Y = 0!" //kan je zien of ie inderdaad op 0 blijft staan
Else
...

of
code:
1
2
3
If Adodc2.Recordset.Fields(i) = 0
Else
...


Verder zie ik niet 1-2-3 wat hier fout aan kan zijn.

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
TeeDee schreef op 14 juli 2004 @ 09:54:
offtopic:
opgeslaan? :)


Probeer eens
code:
1
2
3
If Adodc2.Recordset.Fields(i) = 0
Else
...

Verder zie ik niet 1-2-3 wat hier fout aan kan zijn.
Ik heb uw tweede test gebruikt en blijkbaar ligt het dus toch aan:
code:
1
Adodc2.Recordset.Fields(i)

En zegt hij dat dit altijd gelijk is aan nul, maar de waarden zijn dus alles behalve nul. Volgens mij levert die code een probleem op in een lus. Dan had ik nog een idee en heb ik volgende code gebruikt om te testen:
code:
1
2
3
4
5
6
7
8
Private Sub DataGrid2_Click()
Dim i As Integer
i = 0
Do Until i = Adodc2.Recordset.Fields.Count
Aantal.Text = Adodc2.Recordset.Fields(i)
i = i + 1
Loop
End Sub

En dan werkt het wel, ik begrijp het niet. Kan het liggen aan bepaalde eigenschappen ofzo van uw Adodc?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:33

TeeDee

CQB 241

Hmm, tis weer een poosje geleden hoor maar:

Je gaat een loop in met i = 0.
Je check of y(Adod2.Rs.Fields(0)) 0 is. Die is mijn beleving nu altijd 0.
Wil je niet checken op .EOF of NULL?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Probeer eens expliciet de .value property van een veld te gebruiken, i.p.v. te hopen dat het de default property is. Uit ervaring weet ik dat dat wel eens wil helpen.

dus
code:
1
y = Adodc2.Recordset.Fields(i).value

i.p.v.
code:
1
y = Adodc2.Recordset.Fields(i)

verdere tip is om een for each-lus te gebruik i.p.v. je do until

code:
1
2
3
4
5
6
7
dim fld as adodb.field

for each fld in adodc2.recordset.fields
..
..
..
next

Verwijderd

Topicstarter
TeeDee schreef op 14 juli 2004 @ 10:06:
Hmm, tis weer een poosje geleden hoor maar:

Je gaat een loop in met i = 0.
Je check of y(Adod2.Rs.Fields(0)) 0 is. Die is mijn beleving nu altijd 0.
Wil je niet checken op .EOF of NULL?
Ik heb eens de If Then Else weggelaten, maar dan slaat hij op hoor, da's geen probleem maar het probleem is dat hij dan het Aantal altijd gelijk stelt aan nul. Wat niet correct is. dus die y is volgens hem altijd = 0, wat niet klopt

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Wat me zo snel opvalt is dat je y definieert als een integer en je vergelijkt het met een string... beetje vreemd.

Verwijderd

Topicstarter
Verwijderd schreef op 14 juli 2004 @ 10:11:
Probeer eens expliciet de .value property van een veld te gebruiken, i.p.v. te hopen dat het de default property is. Uit ervaring weet ik dat dat wel eens wil helpen.

dus
code:
1
y = Adodc2.Recordset.Fields(i).value

verdere tip is om een for each-lus te gebruik i.p.v. je do until
code:
1
2
3
4
5
6
7
dim fld as adodb.field

for each fld in adodc2.recordset.fields
..
..
..
next
Hehe prachtig, het ligt dus aan de Do until - lus. Lang leve For each ... _/-\o_
Zeg bedankt hé, kzat al een hele tijd in de miserie ;-)

Verwijderd

Topicstarter
Lorn schreef op 14 juli 2004 @ 10:16:
Wat me zo snel opvalt is dat je y definieert als een integer en je vergelijkt het met een string... beetje vreemd.
Ja weet ik, ik had het ook gezien. Deze heb ik dan aangepast, maar blijkbaar lag het daar niet aan maar aan de verkeerde keuze van lus.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Niet om vervelend te doen maar je probleem is wel wat groter dan de Do Until lus. Variabelen die i en y heten wijzen op een groter probleem. Ook het gebruik van editboxen met de namen Text1 en Text8 is gruwelen. Die code kun je over een maand echt niet meer terug lezen zonder eerst grondig te moeten bestuderen wat wat is.

Ik ben zo vrij geweest je code voor een stuk te herschrijven, moet je eens kijken hoeveel makkelijker de code te onderhouden is.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim lngFieldIndex  As Long
Dim intAantal      As Integer

For lngFieldIndex = 0 To Adodc2.RecordSet.Fields.Count-1
  intAantal = Adodc2.Recordset.Fields.Item(lngFieldIndex).Value
  txtMaat.Text = Adodc2.Recordset.Fields.Item(lngFieldIndex).Name
  If Not(intAantal=0) Then
    Adodc1.RecordSource = "SELECT * FROM Producten"
    Adodc1.Refresh
    Adodc1.AddNew
    Adodc1.Fields("Leverancier").Value = txtLeverancier.Text
    Adodc1.Fields("Model").Value = txtModel.Text
    Adodc1.Fields("Maat").Value = txtMaat.Text
    Adodc1.Fields("Aantal").Value = intAantal
    Adodc1.Fields("AantalL").Value = txtAantalL.Text
    Adodc1.Fields("Bestelling").Value = txtBestelling.Text
    Adodc1.Update
  End If
Next
Adodc1.Recordset.Close
Call MsgBox("Bestelling opgeslaan", vbInformation+vbOkOnly)


Eigenlijk zou je de objecten Adodc1 en Adodc2 ook een andere naam moeten geven... Waarom loop je trouwens door de velden en niet door de records van Adodc2?

[ Voor 20% gewijzigd door Lorn op 14-07-2004 11:27 . Reden: lngAantal veranderd in intAantal ]


Verwijderd

Topicstarter
Ok, ik begrijp er niets meer van. Zonder iets te veranderen lukt het weer niet. Eerst lukt het en dan 5 min. later lukt het niet meer. 8)7

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 23-05 21:15

Sponge

Serious Game Developer

Ik snap die Select niet. Die hoeft toch maar een keer? Nu gaat ie voor elke Field in AdoDC2 ene keer ene query doen...?

Kan je met addwatch niet even rustig stap voor stap kijken wat er in de vars staat? :)

Verwijderd

Topicstarter
Lorn schreef op 14 juli 2004 @ 10:24:
Niet om vervelend te doen maar je probleem is wel wat groter dan de Do Until lus. Variabelen die i en y heten wijzen op een groter probleem. Ook het gebruik van editboxen met de namen Text1 en Text8 is gruwelen. Die code kun je over een maand echt niet meer terug lezen zonder eerst grondig te moeten bestuderen wat wat is.

Ik ben zo vrij geweest je code voor een stuk te herschrijven, moet je eens kijken hoeveel makkelijker de code te onderhouden is.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim lngFieldIndex  As Long
Dim intAantal      As Integer

For lngFieldIndex = 0 To Adodc2.RecordSet.Fields.Count-1
  intAantal = Adodc2.Recordset.Fields.Item(lngFieldIndex).Value
  txtMaat.Text = Adodc2.Recordset.Fields.Item(lngFieldIndex).Name
  If Not(lngAantal=0) Then
    Adodc1.RecordSource = "SELECT * FROM Producten"
    Adodc1.Refresh
    Adodc1.AddNew
    Adodc1.Fields("Leverancier").Value = txtLeverancier.Text
    Adodc1.Fields("Model").Value = txtModel.Text
    Adodc1.Fields("Maat").Value = txtMaat.Text
    Adodc1.Fields("Aantal").Value = intAantal
    Adodc1.Fields("AantalL").Value = txtAantalL.Text
    Adodc1.Fields("Bestelling").Value = txtBestelling.Text
    Adodc1.Update
  End If
Next
Adodc1.Recordset.Close
Call MsgBox("Bestelling opgeslaan", vbInformation+vbOkOnly)


Eigenlijk zou je de objecten Adodc1 en Adodc2 ook een andere naam moeten geven... Waarom loop je trouwens door de velden en niet door de records van Adodc2?
Ik Loop dus door velden en niet door records op aanvraag van mijn baas, hij wilt de gegevens van links naar rechts invullen, omdat dit ook op zijn blad van links naar rechts staat.
Dus ik heb uw code uitgeprobeerd en die werkt perfect, maar wanneer ik nog code toevoeg bij u code, krijg ik hetzelfde probleem. Blijkbaar heeft mijn andere code een invloeg op deze code

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Verwijderd schreef op 14 juli 2004 @ 11:16:
[...]

Ik Loop dus door velden en niet door records op aanvraag van mijn baas, hij wilt de gegevens van links naar rechts invullen, omdat dit ook op zijn blad van links naar rechts staat.
Dus ik heb uw code uitgeprobeerd en die werkt perfect, maar wanneer ik nog code toevoeg bij u code, krijg ik hetzelfde probleem. Blijkbaar heeft mijn andere code een invloeg op deze code
Okay... maar wat je baas wil en de technische implementatie daarvan staat toch redelijk los van elkaar? Ik bedoel, je kan natuurlijk door de velden lopen maar als je gewoon door records heen zou lopen dan merkt je baas als eindgebruiker daar toch niks van? Laten we het er voorlopig op houden dat het een bijzonder creatief gebruik van recordsets is :)

Ik ben natuurlijk wel benieuwd naar welke code je hebt toegevoegd waardoor de code niet meer werkt...

Verwijderd

Topicstarter
Lorn schreef op 14 juli 2004 @ 11:26:
[...]


Okay... maar wat je baas wil en de technische implementatie daarvan staat toch redelijk los van elkaar? Ik bedoel, je kan natuurlijk door de velden lopen maar als je gewoon door records heen zou lopen dan merkt je baas als eindgebruiker daar toch niks van? Laten we het er voorlopig op houden dat het een bijzonder creatief gebruik van recordsets is :)

Ik ben natuurlijk wel benieuwd naar welke code je hebt toegevoegd waardoor de code niet meer werkt...
Het zit vrij raar in elkaar om het uit te leggen, waarom dat ik het zo gedaan heb, maar het lijkte mij de enige oplossing. Ok de code die ik erbij gevoegd heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Dim lngFieldIndex  As Long
Dim intAantal      As Integer
Dim intAantalL     As Integer
Dim a As Integer
Dim b As Integer
    If Check1.Value = "1" Then
    DatumL.Text = DatumB.Text
    Else
    DatumL.Text = ""
    End If
For lngFieldIndex = 0 To Adodc2.Recordset.Fields.Count - 1
  intAantal = Adodc2.Recordset.Fields.Item(lngFieldIndex).Value
  Maat.Text = Adodc2.Recordset.Fields.Item(lngFieldIndex).Name
      If Check1.Value = "1" Then
        intAantalL = Adodc2.Recordset.Fields.Item(lngFieldIndex).Value
        Else
        intAantalL = "0"
        End If
  If Not (intAantal = 0) Then
    Adodc1.RecordSource = "SELECT * FROM Producten"
    Adodc1.Refresh
    Adodc1.Recordset.AddNew
    Adodc1.Recordset.Fields("Leverancier").Value = Text1.Text
    Adodc1.Recordset.Fields("Model").Value = Text2.Text
    Adodc1.Recordset.Fields("Omschrijving").Value = Text3.Text
    Adodc1.Recordset.Fields("Kleur").Value = Text4.Text
    Adodc1.Recordset.Fields("Aankoopprijs").Value = Text5.Text
    Adodc1.Recordset.Fields("Verkoopprijs").Value = Text6.Text
    Adodc1.Recordset.Fields("Code").Value = Code.Text
    Adodc1.Recordset.Fields("Maat").Value = Maat.Text
    Adodc1.Recordset.Fields("Aantal").Value = intAantal
    Adodc1.Recordset.Fields("AantalL").Value = intAantalL
    Adodc1.Recordset.Fields("Bestelling").Value = Text8.Text
    Adodc1.Recordset.Fields("DatumB").Value = DatumB.Text
    Adodc1.Recordset.Fields("Levering").Value = Check1.Value
    Adodc1.Recordset.Fields("Seizoen").Value = Seizoen.Text
    Adodc1.Recordset.Fields("Code Type").Value = Code2.Text
    Adodc1.Recordset.Fields("DatumL").Value = DatumL.Text
    Adodc1.Recordset.Fields("Verkocht").Value = "0"
    Adodc1.Recordset.Update
  End If
Next
Adodc1.Recordset.Close
Call MsgBox("Bestelling opgeslaan", vbInformation + vbOKOnly)
a = 0
    Do Until a = Adodc2.Recordset.Fields.Count
    Adodc2.Recordset.Fields(a) = "0"
    a = a + 1
    Adodc2.Recordset.Update
    Loop
Adodc2.Recordset.Close
Adodc2.RecordSource = "Select * from " & CodeM.Text & ""
Adodc2.Refresh
b = 0
    Do Until b = Adodc2.Recordset.Fields.Count
    DataGrid2.Columns(b).Width = "400"
    b = b + 1
    Loop


Mss een kleine uitleg nodig
die Check1 staat voor: bestelling geleverd of niet.
Wanneer het gelevert is dan wordt de datum van de bestelling = aan deze van de levering en wordt het aantal van de bestelling = aan het aantal van de levering.
DatumB = Now

Na de lus maak ik gebruik van nog twee lussen, met de eerste worden de waarden van Adodc2 terug op nul gebracht voor de volgende bestelling en met de tweede lus worden de kolommen op een breedte van 400 gebracht.
CodeM.text is een soort van variable afhankelijk van welke Tabel hij moet ophalen uit de Database

Met deze code blijkt het dus toch te gaan (Na enkele verschillende tests). Hartelijk dank voor de hulp
Mijn excuses van het niet gebruiken van standaardregels in het programmeren zoals: txtMaat.Text Sorry
Wie wil mag nog commentaar geven op mijn code (liefst negatief, want ik weet dat ik geen standaardregels gebruik in het programmeren, deze zou ik dan ook mijzelf eigen willen maken)

[ Voor 16% gewijzigd door Verwijderd op 14-07-2004 11:54 ]


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Blij te horen dat het werk. Ik heb nog wel wat aanmerkingen op je code :)
  • - [i]intAantalL = "0"[/i] Waarom ken je een string toe aan een numerieke variabele? -[i]Benaming van variabelen[/i] Geef je variabelen een naam die iets betekend. Variabele 'i' zegt je over een week niks meer maar 'lngFieldIndex' verteld je meteen waar 'ie voor dient. -[i]Gebruik van prefixen[/i] Ook wel de Hongaarse notatie genoemd. De naam van integer variabele begint met 'int', een boolean met 'bln', etc. Op internet moet genoeg te vinden zijn. Pas het ook toe op objecten op je form. Noem Check1 bijvoorbeeld chkGeleverd -[i]Controleren checkbox waarde[/i] Gebruik hiervoor liever chkGeleverd.Value = vbChecked dan chkGeleverd.Value="1" -[i]Do...Until...Loop[/i] Gebruik liever een For...Next constructie. Je hoeft dan niet zelf de lusvariabele bij te houden, dit doet VB dan voor je. Je kan dan ook niet vergeten de lusvariabele te initialiseren. -[i]a en b[/i] Waarom gebruik je voor beide lussen een andere variabele? Dit kan gewoon met 1 en dezelfde variabele.
Er is zeker nog meer maar dit zijn de punten die me het eerst op vielen. Je gebruik van recordsets en de interactie met de database is ook nog vatbaar voor verbetering.

[ Voor 96% gewijzigd door Lorn op 14-07-2004 12:15 ]


Verwijderd

Topicstarter
Lorn schreef op 14 juli 2004 @ 11:53:
Kun je er ook even bij vermelden wat er nu misgaat? Krijg je een foutmelding? Zie je niks gebeuren in je database? Weet je op welke regel code het fout gaat?
Er zat nog een fout in mijn andere code en deze heb ik dan ook aangepast, daarom ging het niet. Hartelijk dank voor uw code hé, blijkbaar lag het daar aan

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

maar eeuh.. wat is er mis met een insert query? waarom allemaal zo moeilijk doen? Je zorgt voor wat database traffic op deze manier.
Die excuses.. je hebt je er zelf gewoon mee hoor.

Verwijderd

Topicstarter
henkleerssen schreef op 14 juli 2004 @ 12:09:
maar eeuh.. wat is er mis met een insert query? waarom allemaal zo moeilijk doen? Je zorgt voor wat database traffic op deze manier.
Die excuses.. je hebt je er zelf gewoon mee hoor.
Ja, daar had ik ook aangedacht om insert te gebruiken, maar ik vond de code niet in samenwerking met een Adodc. Vroeger wanneer ik werkte met Data, dan gebruikte ik Insert
code:
1
Data1.Database.Execute "Insert into Tabels Values ('1','2')

Bestaat dit dan om Insert ook mogelijk te maken met een Adodc? ==> Da's Ado toch hé, sorry ben nog een tamelijke leek
En in samenwerking met een Data dat is dan DAO niet?

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

met ado kun je ook gewoon insert queries maken hoor..
ADODC is gewoon een control om de database connectie te maken. Ik zelf doe het gewoon handmatig met ado met een eigen gemaakte control. Databindings op de MS manier vind ik doorgaans wat gekunsteld.

zie ook http://www.google.nl/sear...ml+adodc+versus+ado&hl=nl
En in samenwerking met een Data dat is dan DAO niet?
eeuh wat bedoel je? Dat voorbeeld wat je gaf.. is idd een DAO manier van doen.
Ik zou eens een goede tutorial bekijken over ado.. gewoon ff googlen. Dit is meer een scriptrequest op deze manier.

[ Voor 5% gewijzigd door henkleerssen op 14-07-2004 12:29 ]


Verwijderd

Topicstarter
henkleerssen schreef op 14 juli 2004 @ 12:28:
met ado kun je ook gewoon insert queries maken hoor..
ADODC is gewoon een control om de database connectie te maken. Ik zelf doe het gewoon handmatig met ado met een eigen gemaakte control. Databindings op de MS manier vind ik doorgaans wat gekunsteld.

zie ook http://www.google.nl/sear...ml+adodc+versus+ado&hl=nl

[...]

eeuh wat bedoel je? Dat voorbeeld wat je gaf.. is idd een DAO manier van doen.
Ik zou eens een goede tutorial bekijken over ado.. gewoon ff googlen. Dit is meer een scriptrequest op deze manier.
Data is een control zoals Adodc maar met een klein verschil in eigenschappen, met deze control wordt er waarschijnlijk gebruik gemaakt van DAo, als ik het goed op heb

Verwijderd

Topicstarter
Lorn schreef op 14 juli 2004 @ 11:53:
Blij te horen dat het werk. Ik heb nog wel wat aanmerkingen op je code :)
  • -[i]a en b[/i] Waarom gebruik je voor beide lussen een andere variabele? Dit kan gewoon met 1 en dezelfde variabele.
Ja dat had ik ook in het begin gedaan, maar als er ergens een fout is, dan zoek je achter alles iets. Dus dacht ik mss, ligt het aan de variabele, en moet deze opgesplitst worden

[ Voor 6% gewijzigd door Verwijderd op 14-07-2004 12:39 ]


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Verwijderd schreef op 14 juli 2004 @ 12:32:
[...]


Data is een control zoals Adodc maar met een klein verschil in eigenschappen, met deze control wordt er waarschijnlijk gebruik gemaakt van DAo, als ik het goed op heb
ik heb niet zoveel met dao gewerkt. ODBC meer.. Beetje dao.. maar toen kwam alweer ado aan...vandaar.

Verwijderd

Topicstarter
henkleerssen schreef op 14 juli 2004 @ 12:41:
[...]

ik heb niet zoveel met dao gewerkt. ODBC meer.. Beetje dao.. maar toen kwam alweer ado aan...vandaar.
Ja ik ook niet hoor, zag al vlug de nadelen, en ben dan maar overgestapt naar ADO, want DAO werkt blijkbaar niet met access waarvan de versie hoger is dan 97, dus ging ik al vlug over naar ADO

  • nenne
  • Registratie: Juni 2004
  • Laatst online: 06-06-2024
Verwijderd schreef op 14 juli 2004 @ 12:46:
[...]

Ja ik ook niet hoor, zag al vlug de nadelen, en ben dan maar overgestapt naar ADO, want DAO werkt blijkbaar niet met access waarvan de versie hoger is dan 97, dus ging ik al vlug over naar ADO
Da's niet waar, DAO werkt ook met MS Access 2000 aangezien ik daar gebruik van heb gemaakt.

But forget about DAO :)

Verwijderd

Topicstarter
nenne schreef op 14 juli 2004 @ 13:09:
[...]


Da's niet waar, DAO werkt ook met MS Access 2000 aangezien ik daar gebruik van heb gemaakt.

But forget about DAO :)
Zal ik dan maar ook doen :)

Verwijderd

Topicstarter
Weet er iemand hoe je een tekstvak kunt linken aan een Field, dus wanneer men over een ander Field gaat dat hij de waarde toont van de huidige record afhankelijk van de aangeklikte field?
Pagina: 1