Maken van een ID aan de hand van een keuze en een teller

Status
Niet open voor verdere reacties.

kruimeltjes

Gebruiker
Lid geworden
30 sep 2009
Berichten
222
Sorry voor de wat vage titel van dit onderwerp maar ik weet niet goed hoe ik dit kort moet uitleggen.

Voor de database die ik aan het maken ben moet ik een zogenaamde PatientID gaan maken, deze wil laten samenstellen uit de eerste 3 letters van de studienaam en een teller.

Ik (denk) dat ik dit via een vba code moet gaan laten samen stellen maar ik zou begod niet weten hoe ik dit moet gaan aanpakken, zou iemand mij een duw in de goeie richting willen geven.

Een van de problemen is dat niet alle studienamen uit minstens 3 (hoofd)letters bestaan, er zijn er ook een aantal tussen die er maar uit 2 bestaan, als het mogelijk is zou ik hiervoor een * (of welke andere teken dan ook) willen plaatsen, dus bv *CB.

Groetjes,

Simone

Bekijk bijlage Patientendatabase3.rar
 
't Is nog niet helemaal perfect, want het tweede formulier neemt de gegevens van het eerste formulier nog niet netjes over, maar de code om een PatientID te 'componeren' werkt wel. Dus kijk maar of je er wat aan hebt.
 

Bijlagen

Hai OctaFish,

Dit is al helemaal geweldig maar kun je mij uitleggen wat je precies hebt gedaan in de code?

Ik ben er nog niet zo heel erg lang mee bezig en wil graag snappen wat je gedaan hebt zodat ik er van kan leren! Ik snap wel wat je bedoelt met het niet juist overnemen van de gegevens in het tweede formulier. heb je daar een idee van hoe dat kan en hoe ik daar iets aan kan veranderen?

Groetjes,

Simone
 
Laatst bewerkt:
Meestal doet de routine die ik heb gebruikt het prima; als ik zelf een tabel/formulier maak werkt-ie altijd, dus waarom hij het bij jou niet doet kan ik zo snel niet zeggen. Maar ik kan wel uitleggen wat ik gedaan heb:

Code:
    strSQL = "SELECT TOP 1 Last(PatientID) AS PatientCode FROM Tbl_Patient;"
    iCode = 0
    i = 1
Ik begin met het definieren van een quey waarmee het laatste PatientID wordt opgehaald uit de tabel tbl_Patient.

Code:
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 1 And Not Nz(.Fields(0), "") = "" Then
            sLaatsteCode = Nz(.Fields(0).Value)
            Do While Not IsNumeric(Mid(sLaatsteCode, i, 1))
                i = i + 1
            Loop
            iCode = Mid(sLaatsteCode, i, Len(sLaatsteCode))
        End If
    End With
Met een databasecommando wordt de query geopend. Hier volgt, als het goed is, één record uit. Deze code wordt in een variabele (sLaatsteCode) gezet. Vervolgens zoekt de procedure het eerste getal op in de string, met een loopje (Do While...Loop). Doorgaans zal i de waarde 4 krijgen, omdat er 3 teksttekens aan het begin van de patientID staan. Met behulp van i (eerste plek waar een cijfer staat) wordt een variabele gevuld met het getal.

Code:
    iCode = iCode + 1
    If Len(StudyName) > 2 Then
        sCode = Left(StudyName, 3) & Right("000" & iCode, 3)
    Else
        sCode = "@" & StudyName & Right("000" & iCode, 3)
    End If
    Me.PatientID = sCode
De variabele iCode wordt met 1 verhoogd, om een nieuw volgnummer te genereren. Vervolgens wordt gekeken naar de lengte van de variabele StudyName, en worden daar 3 of alle tekens van genomen. Daar wordt dan de waarde van iCode aan toegevoegd, met eventueel een aantal voorloopnullen om de code netjes te houden.

Code:
    If Me.Dirty Then Me.Dirty = False

    strSQL = "INSERT INTO Tbl_Materials ( PatientID, [Study Name]) "
    strSQL = strSQL & "VALUES('" & sCode & "','" & StudyName & "')"
    DoCmd.RunSQL strSQL
Vervolgens wordt het formulier bewaard, zodat de gegevens kunnen worden toegevoegd aan de tabel tbl_Materials.

Code:
    sArgs = sCode & "|" & Me.fraStudyName.Value & "|" & StudyName
    DoCmd.OpenForm "Frm_Materials", , , , acFormAdd, , sArgs
Als laatste actie wordt het formulier frm_Materials geopend, waarbij de patientcode, studyName waarde (uit het kader) en de studyname worden meegenomen met een startvariabele.

Op het formulier frm_Materials wordt de startvariabele 'uit elkaar getrokken' en toegewezen aan de tekstvakken.

Code:
Dim sArgs() As String
    If Not Nz(Me.OpenArgs, "") = "" Then
        sArgs = Split(Me.OpenArgs, "|")
        On Error Resume Next
        Me.txtPatientID = CStr(sArgs(0))
        Me.fraStudyName.Value = sArgs(1)
        Call fraStudyName_AfterUpdate
    End If
Dat lukt dus wel met de waarde voor het frame, maa niet voor het tekstvak txtPatientID. Als je het tekstvak onafhankelijk maakt (dus niet koppelt aan een tabelveld) doet-ie het overigens wel goed, dus het ligt niet aan de code....
 
Laatst bewerkt:
Hai OctaFish,

Dank voor je uitleg snap het nu een stuk beter dan daarvoor.

Ik heb je code in mijn database geplakt en hij loopt bij mij vast op;

Code:
DoCmd.RunSQL strSQ

Hij geeft dan ook de foutmelding;

Bekijk bijlage Foutmelding PatientID VBA code.zip

Heb ik iets verkeerd overgenomen, ben ik iets vergeten of doe ik iets anders gewoon helemaal verkeerd?

Groetjes,

Simone

PS: voor de zekerheid nog een keer de database bijgevoegd

Bekijk bijlage Patientendatabase3.1.rar
 
Laatst bewerkt:
De opdracht moet zo zijn:

DoCmd.RunSQL strSQL

Zie net dat je de code verkeerd geplakt hebt in het bericht, dus dat is het probleem niet. Ik krijg inderdaad dezelfde foutmelding, maar het vreemde is dat hij de opdracht wel uitvoert.... Ik kijk er vanavond wel even naar.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan