Opgeven met 0 punten

Status
Niet open voor verdere reacties.

LuckyFm

Gebruiker
Lid geworden
3 feb 2015
Berichten
91
Beste forumleden,

Bij het ontwikkelen van mijn scorebord loop ik tegen het volgende probleem aan.
bv. speler 1 scoort 0 punten speler 2 scoort 100 punten. Speler 1 kan speler 2 niet meer inhalen en wil opgeven, Add key (+).
Dit werkt niet. echter wanneer speler 1 1 punt heeft gescoord werkt het wel.

Mijn beperkte kennis van VBA zegt dat als 100 groter is als 1 dan is 100 ook groter als 0, maar dat blijkt dus niet zo te zijn.

Code Add key (+):
Code:
    Case vbKeyAdd
    
        If Me.txtPoints1 > 0 And Me.txtPoints1 = Me.txtPoints2 Then
            DoCmd.OpenForm "frmBlackballGame"
            Me.picColor.Visible = True
            Me.picColor.Picture = "C:\KCS\Black.png"
        If Me.txtDirt27 <> 20 Then
            Me.txtDirt27 = 20
            Me.txtMax = 7
            Me.txtSerie1 = 0
            Me.txtSerie2 = 0
        End If
        Exit Sub
        ElseIf Me.txtPoints1 >= 0 And Me.txtPoints1 < Me.txtPoints2 Then
            Me.txtSp2Frame = Me.txtSp2Frame + 1
            Me.TXTRunFrame = Me.TXTRunFrame + 1
        Else
            Me.txtSp2Frame = Me.txtSp2Frame + 1
            Me.TXTRunFrame = Me.TXTRunFrame + 1
        End If
            Call CloseFrame
    KeyCode = 1

Tot zover werkt het prima de gewonnen frames worden opgeteld en het volgende frame wordt frame 2 ect.

Dus moet het volgens mij zo zijn dat het fout gaat in Private Sub CloseFrame:

Code:
Private Sub CloseFrame()

                Me.Speler1ID = Me.txtSp1ID
                Me.Speler2ID = Me.txtSp2ID
                Me.HighBreak1 = Me.txtHighBreak1
                Me.HighBreak2 = Me.txtHighBreak2
                Me.Break1 = Me.txtPoints1
                Me.Break2 = Me.txtPoints2
                Me.Frames1 = Me.txtSp1Frame
                Me.Frames2 = Me.txtSp2Frame
                Me.Dirt27 = Me.txtDirt27
                Me.Clr27 = Me.txtClr27
                Me.Left = Me.txtMax
                
                DoCmd.RunCommand acCmdSaveRecord

            Dim sqlAdd As String
            Dim PlDate As Date
            PlDate = Format(Now, "dd-mm-yyyy")

            sqlAdd = "insert into tblResult(Speler1ID, Speler2ID, Speler1, Speler2, Break1, Break2, HighBreak1, HighBreak2, Frames1, Frames2, PlayDate) values('" & Me.txtSp1ID & "', '" & Me.txtSp2ID & "', '" & Me.txtSpeler1 & "', '" & Me.txtSpeler2 & "', '" & Me.txtPoints1 & "', '" & Me.txtPoints2 & "', '" & Me.txtHighBreak1 & "', '" & Me.txtHighBreak2 & "', '" & Me.txtSp1Frame & "', '" & Me.txtSp2Frame & "',#" & PlDate & "# );"
            DoCmd.RunSQL sqlAdd
        Pause (0.5)
            
        If Me.txtHighBreak1 > Me.txtHBr1 Then
            Dim sqlUpdA As String
            Dim sqlUpdPA As String
            Dim Br1Date As Date
            BrDate = Format(Now, "dd-mm-yyyy")

            sqlUpdA = "UPDATE tblSpelers SET HighBreak= " & Me.txtHighBreak1 & ", BrDate= #" & BrDate & "# WHERE SpelerId=" & Me.txtSp1ID
            sqlUpdPA = "UPDATE tblPartij SET Break1 = " & Me.txtHighBreak1 & " WHERE Speler1ID=" & Me.txtSp1ID

            DoCmd.RunSQL sqlUpdA
        Pause (0.5)
            DoCmd.RunSQL sqlUpdPA
        Pause (0.5)
        End If
            
        If Me.txtHighBreak2 > Me.txtHBr2 Then
            Dim sqlUpdB As String
            Dim sqlUpdPB As String

            sqlUpdB = "UPDATE tblSpelers SET HighBreak = " & Me.txtHighBreak2 & ", BrDate= #" & BrDate & "#  WHERE SpelerId=" & Me.txtSp2ID
            sqlUpdPB = "UPDATE tblPartij SET Break2 = " & Me.txtHighBreak2 & " WHERE Speler2ID=" & Me.txtSp2ID

            DoCmd.RunSQL sqlUpdB
        Pause (0.5)
            DoCmd.RunSQL sqlUpdPB
        Pause (0.5)
        End If

            Pause (0.5)
                DoCmd.OpenForm "frmFrameEnd"
            Pause (0.5)
                DoCmd.Close acForm, "FrmBord"
End Sub

Ik zit er nu al een paar uur naar te staren maar ik kan niet ontdekken waarom het bij 1 gescoorde punt goed gaat en bij 0 gescoorde punten niet.

Hopelijk heeft iemand van jullie een idee om mij een beetje op weg te helpen.

Alvast bedankt voor de medewerking.

Gr, Luc
 
Het verbaast mij in hoge mate dat je zo te zien allemaal tekstvelden gebruikt voor velden die toch overduidelijk getallen bevatten, zoals [Break1], [Break2], [HighBreak1], [HighBreak2], [Frames1] en [Frames2]. Daarnaast zie ik dat je naast de Speler1ID en Speler2ID ook nog velden Speler1 en Speler2 gebruikt; dat lijkt mij óók overbodig want dat levert dataredundantie op. Maar die laatste velden zijn dan wél tekstvelden neem ik aan. Het gekke is ook dat je in de Insert query dus tekstvelden gebruikt, maar in de Update dat niet doet.

Mij lijkt je probleem non-existent als je dus getalvelden gebruikt met een standaardwaarde voor de scores (0 uiteraard). Een speler die dan opgeeft zonder een score te hebben geregistreerd (want daar gaat het fout vermoed ik) heeft dan namelijk altijd een waarde staan: de default waarde. En aangezien elke speler met 0 punten begint in een frame lijkt mij dat een mooie instelling.
Mijn beperkte kennis van VBA zegt dat als 100 groter is als 1 dan is 100 ook groter als 0, maar dat blijkt dus niet zo te zijn.
100 is uiteraard groter dan 1 of 0, maar 100 is niet groter dan Null. Je kunt een getal namelijk niet vergelijken met een leeg veld of een veld met een NULL waarde.
 
Octafish,

Wederom bedankt voor je snelle reactie.

Het klopt dat ik veel tekstvelden gebruik, dit omdat ik dan, met mijn beperkte kennis, kan zien wat er gebeurt.
Ik weet het, het getuigt niet van vertrouwen maar voor mij werkt dat.
Je hebt natuurlijk volkomen gelijk dat 100 groter is als 0 maar niet als Null, zover strekt mijn kennis nog net (lol)

Het probleem is overigens verholpen zat hem in de datum bij de update query.
Weer mijn beperkte kennis en te wilt knippen en plakken, de definitie van de datum Format (Now,"dd-mm-yyy") plaatsen na de update werkt niet zo goed (zeg het maar gewoon dom).

Nogmaals bedankt voor je reactie.

Gr, Luc
 
Sowieso is het onzinnig om een format mee te geven.
Code:
     PlDate = Date
Werkt net zo goed. Beter nog zou ik zeggen. Nog beter: de datum omzetten naar een getal, en in de query terug converteren naar een datum. Dit om problemen als 9-7-2017 of 7-9-2017 te voorkomen.
 
Sowieso is het onzinnig om een format mee te geven.
Code:
     PlDate = Date
Werkt net zo goed. Beter nog zou ik zeggen. Nog beter: de datum omzetten naar een getal, en in de query terug converteren naar een datum. Dit om problemen als 9-7-2017 of 7-9-2017 te voorkomen.

Octafish,

Zou jij mij kunnen helpen aan een voorbeeldje van hoe de datum omzetten naar een getal en hoe terug te converteren naar een datum, want ik loop inderdaad tegen het genoemde probleem aan.
Maar heb geen idee hoe je dat doet.

Alvast bedankt voor je hulp.

Gr, Luc.
 
..., want ik loop inderdaad tegen het genoemde probleem aan.
Ik wist het :). Vroeg of laat loopt iedereen daar tegenaan en blijken records 'verdwenen' te zijn. Blijken ze dus op de verkeerde datum te staan. Ik pak even jouw originele query erbij:

PHP:
    sqlAdd = "INSERT INTO tblResult(" _
        & "Speler1ID, Speler2ID, Speler1, Speler2, Break1, Break2, HighBreak1, HighBreak2, Frames1, Frames2, PlayDate)" _
        & "VALUES(" _
        & "'" & Me.txtSp1ID & "', '" & Me.txtSp2ID & "', '" & Me.txtSpeler1 & "', '" & Me.txtSpeler2 & "', '" _
        & Me.txtPoints1 & "', '" & Me.txtPoints2 & "', '" & Me.txtHighBreak1 & "', '" & Me.txtHighBreak2 & "', '" _
        & Me.txtSp1Frame & "', '" & Me.txtSp2Frame & "',#" & PlDate & "# );"

Hier moet dus de PIDate worden vervangen door een werkende datum. Die genereer je met CDate, en dat rekent een getal om naar een datum. Je moet dus tegelijkertijd de huidige datum omrekenen naar een getal. Dat is namelijk altijd hetzelfde getal, ongeacht de landinstellingen. En dat omzetten doe ik met CDbl. Het totaal ziet er dan zo uit: (alleen de laatste regel, de rest laat ik hetzelfde)
PHP:
        & Me.txtSp1Frame & "', '" & Me.txtSp2Frame & "',CDate(" & CDbl(Date) & "));"
 
Ik wist het :). Vroeg of laat loopt iedereen daar tegenaan en blijken records 'verdwenen' te zijn.

Octafish, Inderdaad de partij van 1-9-2017 vond ik terug op 9 januari 2017 en dat kan niet de bedoeling zijn ik had inmiddels ook een oplossing bedacht en gevonden.

Datum opslaan als getal yyyymmdd en dit met een query weer terug zetten in een nieuw datum veld in mijn "tijdelijke" tabel tblLongSearch inmiddels blijft deze maar word telkens geleegd.
De datum wordt met een update query weer terug geconverteerd naar eeb echte datum:

Code:
UPDATE tblLongSearch SET tblLongSearch.Datum = Right([PlayDate],2) & "-" & Mid([PlayDate],5,2) & "-" & Left([PlayDate],4)

Volgens mij nu ik jou oplossing zie erg omslachtig maar het werkt wel.

Nu ga ik ff stoeien met jou oplossing dan heb ik bovenstaande query niet meer nodig begrijp ik.

Bedankt voor het meedenken.

gr, Luc.
 
Datum omzetten naar tekst, en weer terugzetten als datum kan natuurlijk altijd. Mijn oplossing is echter een stuk slimmer en handiger omdat je altijd in het datumveld blijft werken.
 
Mijn oplossing is echter een stuk slimmer en handiger omdat je altijd in het datumveld blijft werken.

OctaFish,

Ik heb het inmiddels allemaal aangepast omdat het inderdaad veel handiger is.

Al doende leert men :)

nogmaals bedankt voor je meedenken

Gr, Luc
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan