Access, hoe haal je gegevens uit een tabel?

Status
Niet open voor verdere reacties.

GerwinEderveen

Gebruiker
Lid geworden
18 apr 2011
Berichten
65
Beste Mensen,

Voor mijn stage ben ik bezig met het maken van een query en vervolgens het maken van formulieren. Nu is het zo dat ik een grote tabel heb waaruit ik gegevens wil halen. Er staat in het tabel een kolom met commentaren die er als volgt uit zien: ABCE w1116 jwaoijewf

ABCD is een afkorting van een persoon en w1116 geeft aan dat het week 16 van jaar 11 betreft.jwaoijewf betekent het commentaar dat ze toevoegen(dit staat allemaal in één hokje) Ik zou nu graag de 1116 willen filteren en zo een periode selecteren waar mensen naar kunnen gaan kijken. Dus bijvoorbeeld alle regels voor week 0950 bekijken.

Kan iemand me bij dit probleem helpen?

alvast bedankt!

Gerwin Ederveen
 
Maak een query. Bij de criteria van het veld commentaren maak je gebruik van operator Like. Je krijgt dan zoiets als:

Like "*" & "w0950" & "*"

Voor "w0950" kun je ook verwijzen naar een veld in een formulier. Bijvoorbeeld:

Like "*" & [Forms]![NaamVanJeFormulier]![Veldnaam] & "*"
 
Er staat in het tabel een kolom met commentaren die er als volgt uit zien: ABCE w1116 jwaoijewf

ABCD is een afkorting van een persoon en w1116 geeft aan dat het week 16 van jaar 11 betreft.jwaoijewf betekent het commentaar dat ze toevoegen(dit staat allemaal in één hokje)

Is er een goede reden dat dit allemaal in 1 kolom staat?

Het ligt voor de hand om dit soort gegevens onder te brengen in drie verschillende kolommen
- persoon
- datum, week, tijdsaanduiding, whatever
- commentaar

Daarmee zou je filterwens een stuk makkelijker te verwezenlijken zijn.
Ook om andere redenen zou een dergelijke oplossing beter zijn.
 
Bedankt voor de reacties, zou je dan ook een query kunnen maken die w0950, w0949 ,w0948 enzovoort tot bijv. w0740 kunnen nemen, of deze code zelf in een formulier invullen waardoor je alle regels van w0950 en eerder kan nemen?

Ik kan er helaas geen 3 kolommen van maken, heeft met het bedrijf te maken.

alvast bedankt!

Gerwin Ederveen
 
Als je er meer wilt kunnen kiezen, dan kun je een Keuzelijst maken en die instellen op <Meervoudige selectie>. Sorteren op die kolom wordt lastig, omdat je weekcode niet vooraan staat. Al kun je dat veld (ook weer met een query) nog wel weer uit elkaar trekken. 't Is niet gelijk kansloos :)
 
Met een simpele functie.

Code:
Function WeekCode(Veld As Variant)
Dim sq

sq = Split(Veld, " ")
WeekCode = sq(1)

End Function

In je query zet je dan deze veldformule:
Expr1: WeekCode([Codeveld])

De functie gaat er vanuit dat je in elk te splitsen veld minstens één spatie hebt, zodat er twee variabelen in de matrix worden ingelezen. De tweede wordt dan aan de functie toegewezen.
 
Zou je me kunnen vertellen hoe ik dit werkend krijg. Moet je die functie in een module invoeren of in een klassenobject(dit dan invullen bij het formulier waar het in komt?). Daarnaast, moet je dan twee query's maken, dus één voor het uit elkaar trekken en een Like "*" & [Forms]![NaamVanJeFormulier]![Veldnaam] & "*". Of kan je die laatste niet meer gebruiken als je meerdere weekcodes gebruikt? En moet je dus eigenlijk een andere query maken. Hoe moet je dit dan doen? eerst de query maken en daarna het formulier? of juist andersom omdat je in het formulier bepaald wat er moet gebeuren? Zoals je ziet ben ik nog niet echt thuis in access. De opdracht die ik ooit voor m'n opleiding moest maken was niet zo ingewikkeld en ging dan ook meteen goed(er zat een stappenplan bij).

In ieder geval bedankt voor diegene die me kunnen helpen!

Gerwin Ederveen
 
De functie zet je in een gewone module. Dus niet in een klassemodule, of bij een formuliermodule, al kan dat laatste wel. Alleen: dan kun je hem alleen op dat specifieke formulier gebruiken, en dat lijkt mij niet de bedoeling. In een query maak je een veld aan waaarin je de code zet zoals in mijn voorbeeld. Uiteraard kun je de veldnaam veranderen.
 
Ik heb dit geprobeerd, maar nu flipt access. Dit kan zijn omdat de codes niet allemaal gelijk zijn, ik zal dan een if ofzo moeten toevoegen. Heeft iemand hiervoor suggesties?
 
Een opmerking als 'maar nu flipt access' is niet heel erg wetenschappelijk ;) Ik heb namelijk geen idee wat je daar onder verstaat. Dus valt er ook weinig te suggereren. Wat gebeurt er precies? Let wel, deze functie is voor een specifiek doel gemaakt, dus goede kans dat hij bij jou niet zomaar draait. Met een IIF overigens kun je in een query nog wel bepalen of je de functie gebruikt of niet. Bedoel je dat misschien?
 
Excuses voor de woordkeuze 'flippen'. Toen ik op help drukte kreeg ik dit te zien. Om even een aantal problemen aan te geven, de comments zijn niet allemaal hetzelfde opgebouwd. Dit zou wel moeten. Ik wilt dit dus laten filteren en dat de mensen dit dan in de tool kunnen zien onder het kopje foute comment. Als iets wel goed is wil ik het gebruiken voor de weekcode. Hoe krijg ik het foute eruit gehaald?

Het subscript valt buiten het bereik (Fout 9)


U kunt alleen binnen de gedefinieerde bereiken toegang krijgen tot matrixonderdelen en leden van collecties. Voor deze fout zijn de volgende oorzaken en oplossingen mogelijk:

U hebt verwezen naar een matrixonderdeel dat niet bestaat.
Misschien is het subscript groter of kleiner dan het bereik van mogelijke subscripts of er zijn op dit punt in de toepassing nog geen dimensies aan de matrix toegewezen. Controleer de boven- en ondergrens van de declaratie van de matrix. Gebruik de functies UBound en LBound om matrixgrenzen aan te geven als u werkt met matrices waarvan de grootte wordt gewijzigd. Controleer de spelling van de variabelennaam wanneer de index als een variabele is opgegeven.

U hebt een matrix gedeclareerd, maar u hebt het aantal matrixonderdelen niet opgegeven. Deze fout wordt bijvoorbeeld veroorzaakt door de volgende code:
Dim MyArray() As Integer
MyArray(8) = 234 ' Causes Error 9.

In Visual Basic worden niet-opgegeven matrixbereiken zoals het bereik 0 - 10 niet impliciet van een dimensie voorzien. Als u het aantal onderdelen van een matrix expliciet wilt opgeven, gebruikt u Dim of ReDim.

U hebt verwezen naar een niet-bestaand lid van een collectie.
Probeer de constructie For Each...Next te gebruiken in plaats van indexonderdelen op te geven.

U hebt een afgekorte vorm van het subscript gebruikt waarmee u impliciet een ongeldig element hebt opgegeven.
Als u bijvoorbeeld de operator ! in combinatie met een collectie gebruikt, geeft ! impliciet een sleutel op. Zo is object!sleutelnaam.waarde bijvoorbeeld equivalent aan object.onderdeel(sleutelnaam).waarde. In dit geval treedt een fout op als keyname een ongeldige sleutel is in de collectie. Gebruik een geldige sleutelnaam of index voor de collectie om de fout op te lossen.

Selecteer voor aanvullende informatie het desbetreffende item en druk op F1 (in Windows) of op HELP (op de Macintosh).
 
Ik snap de functie nog niet helemaal van de teksten die je nu gepost hebt; zijn dat de resultaten van je filtering, of wil je daar op kunnen filteren? Want de vraag ging in eerste instantie over het filteren op een deel van je tekst, maar die string zie ik niet meer terug. Dus waar wil je nu op filteren?
 
Dit gaf de help van access weer, fout 9 tijdens uitvoering, het subscript valt buiten gebruik. Daar klikte ik op help en gaf hij bovenstaande weer. Wat ik bedoel is dat mensen op verschillende wijze de comment invullen. Alleen de comments waar de weekcode goed is wil ik eruit filteren(ABCD w1117 oiwjawoej). Dus met w1117. De andere rijen van de excel tabel wil ik op een andere button stoppen genaamd, Foute weekcode.

Vind u dit duidelijk genoeg?

Alvast bedankt!

Gerwin Ederveen
 
Eigenlijk niet... zoals ik het nu lees, wil je twee filteringen: één die voldoet aan de zoekeis (tekst bevat ABCE w1116 jwaoijewf) en een die de rest laat zien. Dus de test waar je zoekstring niet in voorkomt.
 
Het is eigenlijk heel simpel, de tekst moet de volgende code bevatten: ABCD w1121 loiwje
Hierbij is ABCD de afkorting van een persoon en w1121 en loiwje de comment. De w1121 is het daadwerkelijke wat ik wil filteren om zo de tijdspanne te kunnen berekenen. Om ervoor te zorgen dat alle mensen het op de juiste manier invullen moet de rest worden toegekend aan foute weekcode. Dus het MOET er zo uitzien anders moet het in een ander formulier komen.
 
Beste Octafish,

Ik zat alle berichten terug te lezen en je gaf aan dat het veld minimaal 1spatie moet hebben. Als dit niet zo is geeft hij een fout melding. Zou je dit eruit kunnen halen, dus door te zeggen dat zonder spatie, dat ze die niet moeten meenemen?

Of zou je ook alleen getallen kunnen opsporen in een veld. Dus dat ze de eerste 4 cijfers in een veld eruit filteren. Staan er geen cijfers in, dat die dan ook niet worden weergegeven?
 
Je kunt op allerlei manieren een filter maken, en toepassen. Je kunt velden zonder spatie bijvoorbeeld op deze manier vinden:
Expr1: IIf(InStr(1;[Veldnaam];" ")=0;"Fout";"Goed")
Wil je de eerste groep van cijfers uit een string halen, dan zul je daar een functie voor moeten maken die letterlijk alle tekens van de string doorloopt en controleert of het teken numeriek is of niet.
Zodra er een cijfer gevonden wordt, ga je dan met een loopje verder tot er een tekstteken komt. De tekens die je van begin van de loop tot eind van de loop hebt gevonden, zijn dan je getal.
 
bedankt voor je antwoord, het is me gelukt om goed en fout eruit te krijgen. Nu alleen het numerieke nog. kan je mij vertellen hoe zo'n functie eruit ziet? Of hoe je dit moet doen. Uit je antwoord kan ik nog niet precies zien wat ik moet doen(ik ben echt nog een beginneling).
 
Deze functie komt een heel eind...

Code:
Function Getalletje(Veld As String)
Dim i As Byte, x As Byte, iWaarde As Long

i = 1
Do Until IsNumeric(Mid(Veld, i, 1))
    If i = Len(Veld) Then
        Exit Function
    End If
    i = i + 1
Loop

Do While IsNumeric(Mid(Veld, i, 1))
    iWaarde = iWaarde & Mid(Veld, i, 1)
    i = i + 1
Loop
Getalletje = iWaarde
End Function

Zet 'm in een module, en gebruik hem als volgt in een query:
Expr1:Getalletje([Veldnaam])
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan