Avatar billede fqthjoe Nybegynder
11. september 2002 - 16:08 Der er 21 kommentarer og
2 løsninger

Find det højeste tal fra textbox og skriv det på label

Hej Eksperter.
Vil gerne have skrevet det højeste/største tal fra et textfelt i en label. Sådan at der altid i pågældende label står det største tal fra f.eks. text1.text.
Er der kan hjælpe ?
Avatar billede driis Nybegynder
11. september 2002 - 16:31 #1
Hvordan er tallene adskilt i text1.text ?
Avatar billede driis Nybegynder
11. september 2002 - 16:44 #2
Hvis tallene f.eks. er adskilt af kommaer, bruger du bare flg. kode:

Private Sub Text1_Change()
Dim Str As Variant
Dim I As Integer
Dim Tal As Double ' Går ud fra der er max 1000 tal

Str = Text1.Text + ",NULL"
Str = Split(Str, ",")
I = 0
While Not Str(I) = "NULL"
    If Val(Str(I)) > Tal Then Tal = Val(Str(I))
    I = I + 1
Wend

Label1.Caption = CStr(Tal)

End Sub


Hvis tallene er adskilt af noget andet end komma, ændrer du bare "," til noget andet. Hvis de er adskilt af linieskift, ændrer du "," til vbCrLf.
Avatar billede driis Nybegynder
11. september 2002 - 16:46 #3
Den dér kommentarlinie ' Går ud fra der er max 1000 tal ' skal du bare se bort fra
Avatar billede driis Nybegynder
11. september 2002 - 16:48 #4
... jeg genbrugte koden fra noget andet jeg har lavet og glemte at slette kommentaren - den stammer fra, at Tal i den originale kode er et array med 1000 poster.
Avatar billede fqthjoe Nybegynder
12. september 2002 - 07:49 #5
Hejsa tak for koden. Men jeg kan kun få den til at vise det aktuelle tal i den "aktive" post. Den tjekker ikke alle mine poser i gennem og finder og skriver det højeste tal fra text1.
Tallen går fra 1 til 1000 og der står kun et tal i feltet.
Håber du kan hjælpe mig videre.. Takker :-)
Avatar billede driis Nybegynder
12. september 2002 - 14:44 #6
Øh... Jeg er ikke helt sikker på at jeg forstår hvad du mener ... Er der ikke kun én tekstboks ? Du kan evt. sende mig et VB projekt indeholdende et eksempel på hvad du mener, hvis du ikke kan forklare det...

driis@oncable.dk
Avatar billede fqthjoe Nybegynder
12. september 2002 - 15:17 #7
Prøver lige her først :-)
Har felterne: Kassenr. og produkt
og her er eks. på i alt 4 poster i basen:
Post 1 : Kassenr. = 1    produkt: netkort
Post 2 : Kassenr. = 2    produkt: skærmkort
Post 3 : Kassenr. = 1    produkt: RJ45-kabler
Post 4 : Kassenr. = 3    produkt: software
Så vil jeg gerne vide det største tal i feltet "kassenr." og udskrive det på en label. Altså i overnstående eksempel skal der så i label'en står højestekassenr er "3". Hvor 3 så er tallet der hentes fra "kassenr."
Når jeg så opretter nye kasser 4,5,6... Så ændre Labelteksten til "højestekassenr. er 6" (når 6 er det højeste/største.
Håber du forstår.. ellers sender jeg den lille kode jeg bruger.
Avatar billede martin_moth Mester
12. september 2002 - 15:19 #8
>> driis: Du er ikke den eneste der ikke forstår...

>>fqthjoe: Det kan betale sig at formulere sit spørgsmål lidt mere præcist, så vi ikke spilder hinandens tid alt for meget (et velment råd:o))

Du snakker om det største tal fra text1.text, og om aktive poster - hvad mener du egentligt? Har du måske gang i noget database, så ville det være rart at vide det ;o)
Avatar billede driis Nybegynder
12. september 2002 - 15:34 #9
Hmmm, er det måske en ComboBox, du bruger ?
Avatar billede driis Nybegynder
12. september 2002 - 15:37 #10
eller er det noget database ... Som martin_moth skriver, er det ret kryptisk, stadigvæk.
Avatar billede martin_moth Mester
12. september 2002 - 15:41 #11
NB: Ovenstående kommentar er skrevet FØR du kom med "Prøver lige her først..."-indlægget.

Det lader til at du arbejder med en database - til en anden gang kunne det være en ret god ide at oplyse om dette, da vi jo ikke kan vide hvad du laver hvis du ikke skriver om det :o(

Følgende er kopieret fra http://www.eksperten.dk/spm/227356, og modificeret ganske lidt (der er MASSER af gode svar ang. databaser)

If Not rs.EOF Then
    rs.MoveFirst
    Do While Not rs.EOF
        if MaxKassenr < rs!kassenr then MaxKassenr = rs!kassenr
        rs.MoveNext
    Loop
End If
Label1.caption = MaxKassenr

Altså er princippet i ovenstående:

Loop gennem alle poster fra start til slut. Hver post sammenlignes med din variabel MaxKassenr, og er posten større end MaxKassenr, smides postens værdi over i MaxKassenr. Således vil MaxKassenr indeholde det højeste kassenummer efter endt loop

PS: Måske snakker du om et array og ikke en database - igen, det kan vi jo ikke vide. Men princippet i løsningen er den samme, du skal bare bruge LBound(ArrayNavn) og UBound(Arraynavn) som grænser for løkken :o)
Avatar billede driis Nybegynder
12. september 2002 - 15:50 #12
Hvis det, du kalder en tekstboks egentlig er en combobox med et antal poster, kan du bruge flg. kode til at finde den tekststreng i ComboBox listen, som indeholder det største tal. Eksemplet bruger en combobox, 'Combo1', en knap, 'Command2' og en label, 'Label1':

Dim X As Integer
Dim I As Integer
Dim Z As Integer
Dim Max As Integer
Dim S As String

Private Sub Command2_Click()
Max = 0
For I = 0 To Combo1.ListCount - 1
    For Z = 48 To 57
        If Not InStr(1, Combo1.List(I), Chr(Z)) = 0 Then
            S = Right(Combo1.List(I), Len(Combo1.List(I)) - InStr(1, Combo1.List(I), Chr(Z)) + 1)
            If Val(S) > Max Then Max = Val(S)
        End If
    Next Z
Next I
Label1.Caption = CStr(Max)

End Sub

Private Sub Form_Load()
Randomize Timer
For I = 1 To 20
    X = 1 + Int(100 * Rnd)
    Combo1.AddItem "Kasse " + CStr(X) + " blabla"
Next I
End Sub
Avatar billede fqthjoe Nybegynder
12. september 2002 - 16:17 #13
Ok. helt enig ved min formulering af spørgsmålet.. Kan godt se det ikke er særligt velskrevet.. Min fejl - sorry..
Jeps, jeg har en access database tilknyttet. Og har ingen ComboBoks, kun felterne fra min base. (det jeg kalder textfelter/textboxe).
Martin_Mouth: Der kommer en fejl ved Maxkassenr, "Variable Not Defined"
Kan du /driis måske hjælpe ?
Avatar billede martin_moth Mester
12. september 2002 - 16:35 #14
Dim Maxkassenr (eller rettere Dim MaxKasseNr as Integer)

Du skal Dim'me din e variabler først :o)
Avatar billede fqthjoe Nybegynder
13. september 2002 - 08:01 #15
Martin_Mouth:
Kan du se hvad jeg gør forkert ? Danke :-)
Private Sub Form_Load()
Dim rs As Recordset
Dim MaxKassenr
If Not rs.EOF Then
    rs.MoveFirst
    Do While Not rs.EOF
        If MaxKassenr < rs!kassenr Then MaxKassenr = rs!kassenr
        rs.MoveNext
    Loop
End If
Label1.Caption = MaxKassenr

End Sub
Avatar billede martin_moth Mester
13. september 2002 - 08:22 #16
Du har sat koden under form_load - altså bliver koden kun afviklet een gang, nemlig når du starter programmet. Bare du er klar over det ;o)

Nu har du ikke vist hvad den går i baglås over, men jeg kunne forestille mig at den allerede i linien If Not rs.EOF then...

Rs skal jo pege på et recordsæt i din database - hvor og hvordan har du skabt forbindelse til denne database? Denne forbindelse skal etableres INDEN du begynder at rode i databasen, logisk nok...

Hvis du slet ikke har gjort det endnu, så se det spørgsmål jeg har linket til i det tidligere i dette svar - der har tubber givet en meget udførlig vejledning. Jeg gengiver kun lige koden her:

'Dimensionering af workspace og recordset - står helt uden for alle Sub'er, dvs. aller øverst i din kode

  Dim ws As Workspace
  Dim db As Database
  Dim rs As Recordset

'Når formen loades skabes forbindelsen til databasen
  Private Sub Form_Load()
    Set ws = Workspaces(0)
'data.mdb er databasenavnet
    Set db = ws.OpenDatabase(App.Path & "\data.mdb")
'data er tabelnavnet inde i databasen
    Set rs = db.OpenRecordset("SELECT * FROM data")
'Og så kommer din kode, UDEN Dim Rs, da den jo allerede er erklæret allerøverst

/Martin
Avatar billede fqthjoe Nybegynder
13. september 2002 - 09:13 #17
Hej igen.. Ka' sgu' ik' få det til at virke :-(
Prøver lige vise det "hele" koden..
Tror vist pointene skal lidt i vejret også med alt den hjælp :-)

Option Explicit
Dim ws As Workspace
  Dim db As Database
  Dim rs As Recordset
 
Private Sub Form_Load()
Set ws = Workspaces(0)
Set db = ws.OpenDatabase(App.Path & "\kasse2000.mdb")
Set rs = db.OpenRecordset("SELECT * FROM data")
Text5.Text = Adodc1.Recordset.RecordCount
Dim MaxKassenr
If Not rs.EOF Then
    rs.MoveFirst
    Do While Not rs.EOF
        If MaxKassenr < rs!kassenr Then MaxKassenr = rs!kassenr
        rs.MoveNext
    Loop
End If
Label6.Caption = MaxKassenr

End Sub

Private Sub Command1_Click()
Adodc1.Recordset.AddNew
End Sub

Private Sub Command2_Click()
If MsgBox("Er du Sikker?", vbQuestion + vbYesNo, "Slet CD") = vbYes Then
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
End If

End Sub

Private Sub Command3_Click()
Adodc1.Recordset.Update
End Sub

Private Sub Command4_Click()
Adodc1.Refresh
Text5.Text = Adodc1.Recordset.RecordCount
Adodc1.RecordSource = "Select * From Tabel1 Where(Tabel1.Find Like '%" & Text4 & "%')"
Adodc1.CommandType = adCmdText
Adodc1.Refresh

End Sub

Private Sub Command5_Click()
If Not Adodc1.Recordset.EOF Then
Adodc1.Recordset.MoveNext
End If
End Sub

Private Sub Command6_Click()
If Not Adodc1.Recordset.BOF Then
Adodc1.Recordset.MovePrevious
End If

End Sub

Private Sub Command7_Click()
Unload Me
End Sub
Avatar billede martin_moth Mester
13. september 2002 - 11:18 #18
Hvor får du fejlen - har du skabt kontakt til databasen med succes?

Hvad får du af fejlmeddelse hvorhenne? - og har du husket at lave en reference til MS DAO 3.51 (hvis du har office XP så MS DAO 3.6) (Under Project > References)

PS: Du får stadig kun opdateret Label6.Caption under opstart af program. Måske var det en ide at lave en selvstændig Sub, der opdaterer Label6, og så kalde denne procedure fra Form_Load og alle de andre steder du ændrer i databasens poster... Men fortæl lige hvad fejl du får først, så kan vi altid få finpudset koden ;o)
Avatar billede martin_moth Mester
13. september 2002 - 11:46 #19
PS: Nu har jeg kikket lidt nærmere på din kode - du bruger ADO data kontrollen (Adodc1)...

For lige at starte ved begyndelsen: Hvad virker i dit program? HAR du fået skabt forbindelse til din database via Adodc1?

1) Hvis du ikke har, så skal vi nok starte der!
2) Hvis du har, så er det jo ikke nødvendigt at skabe forbindelsen du gør i din Form1_load procedure med Set db = ws.OpenDatabase(App.Path & "\kasse2000.mdb") osv. osv.
Avatar billede fqthjoe Nybegynder
13. september 2002 - 18:33 #20
Hejsa igen :-)
Jeg får allerede fejl, fra starten ved disse:
Dim ws As Workspace
Dim db As Database
Dim rs As Recordset
Med hensyn til min connection til min database ser den sådan ud:
Private Sub Form_Load()
Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\jonas\Kasse2000.mdb"
Adodc1.CommandType = adCmdTable
Adodc1.RecordSource = "Tabel1"
Adodc1.Refresh
End Sub
Forbindelse til basen virker fint :-)
Forøvrigt fordan skrives App.Path i forbindelse med min connectionString, synes kun det virker hvis jeg skriver den fulde sti.
Avatar billede fqthjoe Nybegynder
13. september 2002 - 19:25 #21
Det virker nu, efter leget lidt videre :-)
Kan jeg få feltet opdateret dynamisk efterhånden kassetallet bliver større ? og i givetfald hvor skal koden så stå ? (sikkert flytes fra Form_load, men hvordan mon)
Og så er det til til points :-)
Koden ser sådan ud + Dim'et i starten de forskellige variable.
Private Sub Form_Load()
Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\jonas\Kasse2000.mdb"
Adodc1.CommandType = adCmdTable
Adodc1.RecordSource = "Tabel1"
Adodc1.Refresh
Text5.Text = Adodc1.Recordset.RecordCount
intBiggestKasse = 1
  ' Find største kassenr.
  Adodc1.Recordset.MoveFirst
  For I = 1 To Adodc1.Recordset.RecordCount
      intTapeNum = Val(Text1.Text)
      If intBiggestKasse < intTapeNum Then  'updater intBiggestKasse
        intBiggestKasse = intTapeNum
      End If
      Adodc1.Recordset.MoveNext ' løber igennem en for en
  Next I
  Label5 = "Højeste Kassenr, som er brugt:" & Str(intBiggestKasse)  'Viser Største
  Adodc1.Recordset.MoveFirst ' Flytter til 1. post
End Sub
Avatar billede martin_moth Mester
13. september 2002 - 20:16 #22
Svar på dit spørgsmål kl. 18:33:58

Grunden til at du får fejl ved de 3 Dim'er er, at du ikke har tilføjet DAO som reference, se mit svar fra kl 11:18:22. Men det er ligegyldigt, da du jo allerede HAR forbindelse til din database - den forbindelse behøver du ikke oprette 2 gange, jf. punkt 2) i mit svar kl. 11:46:47

Så helt forfra - glem de ovenstående indlæg, og start på en frisk her:

Det du ønsker er at kunne finde den post i en tabel "Kassenr" i din database, der indeholder den højeste værdi (heltal). Du HAR forbindelse til databasen via din kode angivet ovenfor ( Adodc1.ConnectionString osv. osv.)

Jeg vil foreslå følgende procedure - skrevet i pseudo-kode, for at undgå at sidde fast i detaljer:

Private Sub DitForetrukneNavn
  Dim StørsteNummer as integer
  Gå til første post i databasen
  Gør indtil sidste post i databasen nås
    If MaxKassenr < Aktuelt felt i databasen Then
      MaxKassenr = Aktuelt felt i databasen
    End If
  Gå til næste post i databasen
  Loop
  Skriv StørsteNummer til din Label
End Sub

Nederst i din Form1_load kan du så kalde denne sub, og i øvrigt kalde den hver gang der er behov for at opdatere Label1.Caption, f.eks. i de procedurer hvor du sletter og opretter poster (det er så svaret på dit spørgsmål kl. 19:25:47) - man kalder en Sub ved blot at skrive dens navn (Altså skriv linien "DitForetrukneNavn" nederst i Form1_Load)

     
                                    - 0 -


Hvis du havde startet med at skrive:

Hej - jeg har en database, som jeg "snakker med" gennem
Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\jonas\Kasse2000.mdb"

Jeg vil gerne finde det største værdi i tabellen Kassenr, der indeholder heltal (integers) - kan I lave en funktion/procedure der kan det, og skrive værdien til Label1.Caption?


Tænk - så kunne 18 indlæg have været undgået, og jeg havde aldrig startet med at svare, da min stærke side ikke er Adodc - men hvordan kunne jeg også vide, at spørgsmålet drejede sig om databaser??

Beklager, at jeg måske lyder lidt "mopset" - men til en anden gang, så skal du ikke forudsætte at vi kan læse dine tanker, så brug bare 2 minutter på at forklare hvad du mener - det spare både din og alle andres tid.

Held og lykke

PS: Der er eksempler på hvordan du koder ovenstående pseudokode i f.eks. http://www.eksperten.dk/spm/245025
Avatar billede fqthjoe Nybegynder
13. september 2002 - 20:45 #23
Takker mange gange :-)
Jeps, husker at formulere spørgsmål bedre næste gang.. Så det jeg har i hovedet kommer med i spørgsmålet, og ikke sådan noget "ged" som min formulering i dette spørgsmål. Bliver klog af skade..
Lige lidt point også til Driis...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester