Waarde volgende of vorige record in huidige record weergeven

Status
Niet open voor verdere reacties.

ronvr

Gebruiker
Lid geworden
23 mrt 2007
Berichten
7
Beste,

Ik heb een leuke database gemaakt,
deze database heeft als doel een retour traject te bepalen aan de hand van een tabel met alleen laad en los adressen.
Het retourtraject is: record 1 losadres + record 2 laadadres.
en dit moet in een veld staan van record 1.

dus in het kort.
Record 1 bevat een veld met een (gekoppelde) veldwaarde uit record 2.
Hoe kan dit?

Hartelijk bedankt,

Ron
 
is dit een wens of een fout?

In ieder geval is meer info nodig over de opzet van de tabel waarover je het hebt.
 
is dit een wens of een fout?

In ieder geval is meer info nodig over de opzet van de tabel waarover je het hebt.

mm, nu ik het nalees heb ik het idd nogal fout geformuleerd.

Het is een wens.
de tabel bestaat onder andere uit:
ID (random), oplegger, datum, tijd, laadland, losland, herlaad land.
de eerste velden zijn ingevuld.
het herlaadland moet de waarde gaan bevatten van het laadland wat op record 2 staat.
(conditie is dat de oplegger bij beide records gelijk is, anders moet retour onbekend ingevuld worden)

voorbeeldje:
2, 207, 26-2-2007, 16:00, NL, BE, ???
5, 207, 26-2-2007, 17:00, BE, NL, ???

??? op de 1e regel moet dus BE worden.

Hoop dat ik zo voldoende info gegeven heb,
het is het zelfde principe als in excel verwijzen naar een cel in de volgende regel.


Hartelijk bedankt,
Ron
 
ik verwacht dat je daarna weer moet lossen?

Maak een andere tabel: LaadLosVracht met de Velden ID, LaadID, LosID.
In jouw geval wordt deze dan gevuld :
1, NL, BE
2, BE, NL

Jouw tabel ziet er dan als volgt uit:
2, 207, 26-2-2007, 16:00, 1
5, 207, 26-2-2007, 17:00, 2

Het herladen zal waarschijnlijk wel op een ander tijdstip gebeuren? Vandaar deze nieuwe tabel.
 
ik zie het voordeel niet van de nieuwe tabel.
ik bouw dan gewoon een relationele database (die hangt al op de backend om deze waardes te krijgen)
maar heb mijn herlaad adres dan nog steeds niet.

ik sorteer nu in excel mijn brondata op oplegger en datum/tijd.
dan heb ik de 'route' van de oplegger.
het herlaad adres van regel 1 is het laadadres van regel 2.

dit principe wil ik overzetten naar access.

een excel vb heb ik in de bijlage zitten.

alvast hartelijk bedankt,
Ron
 

Bijlagen

Laden, lossen lijkt me logisch, maar het herladen is toch weer laden?
Waar moet je volgens jouw opzet je herladen goederen lossen? Daar is volgens mij geen plaats voor in je tabel structuur. Vandaar de nieuwe tabel.

Als je normaliseert volgens de Boyce-Codd normaalvorm, zoals ik gewend ben, dan kom je uit op een extra tabel.
 
de herlaad loslocatie is in mijn verhaal absoluut niet relevant.

Om bijv een rit na te calculeren, moeten wij de kilometers naar de herlaadlocatie bepalen.
ritten worden in ons TMS opgeslagen als laden -> lossen.
dus vandaar dat wij in onze eigen DB tbv oa hercalculatie het herlaad adres hierachter willen zetten.


wanneer wij dmv dit proof of concept vaststellen dat dit een goede methode is, zal in de bron SQL-database een aanpassing doorgevoerd worden.

Omdat wij alleen met > 60.000 regels moeten gaan werken, willen wij dit in Access maken.

en dus de tabel uit mijn voorgaande post krijgen.
laden, lossen, herladen
dit traject is voor ons op dit moment meer dan voldoende.

Vandaar dat ik bij mijn vraag blijf.
kan ik in Access net zoals in Excel verwijzen naar de volgende / vorige regel??

Hartelijk bedankt voor je inbreng:thumb:

Groetjes,
Ron
 
Ik snap je probleem. Niet eenvoudig op te lossen. Heb je ervaring met Pivot queries?
Anders zou je het op kunnen lossen door met VB door je recordset te loopen en op die manier het veld te updaten. Lastig probleem.
 

Bijlagen

Ik snap je probleem. Niet eenvoudig op te lossen. Heb je ervaring met Pivot queries?
Anders zou je het op kunnen lossen door met VB door je recordset te loopen en op die manier het veld te updaten. Lastig probleem.

tnx, ik snap nog niet 100% wat je bedoeld,
maar kan helaas je bijlage niet openen. (company firewall he)
ik kijk dit vanavond thuis eventjes,

alvast hartelijk bedankt voor je reacties.

Groetjes,
Ron
 
Ik snap je probleem. Niet eenvoudig op te lossen. Heb je ervaring met Pivot queries?
Anders zou je het op kunnen lossen door met VB door je recordset te loopen en op die manier het veld te updaten. Lastig probleem.

ik heb de database eventjes bekeken, en dit is wat ik nu heb.
Die pivot query ziet er gewoon uit als een selectie query.

Zoals jij het dus zegt, zou ik VB door de selectie moeten laten gaan, tot ik de huidge record tegen kom. en dan + 1?
Wordt dit dan niet heel erg intensief/vertragend als ik in de duizende records zit???
Ik ga hier in ieder geval eens naar kijken. omdat ik in acces lekker grote datasets kan gebruiken:evil:

Hartelijk bedankt.

Ron

ps. ik heb een tijdelijke workaround gevonden, door de bewerking in excel te maken. en dan met VB een query naar Access te maken om zo de afstanden uit mijn afstandenmatrix te halen. deze gaat redelijk snel gelukkig:cool:
Nogmaals hartelijk bedankt voor de reacties:thumb:
 
oplossing gevonden.
De onderstaande VBA code maakt een recordset aan.
gaat elke record af.
en maakt een query die mijn herlaad lokatie (=volgende regel zoekt)
de where condities in mijn querys kunnen anderen natuurlijk negeren.

succes,

Code:
Public Sub HerlaadBepalen()
    StatusBar "Variabelen declareren..."
    Dim BeginTijd, EindTijd, Duur, Tabel, rstSQL, rstCount, rstKPI_ID, Herlaadland, Herlaadplaats, Herlaadpc, Update_Query As String, rstSQL2
    BeginTijd = Time
    Set rstKPI = New ADODB.Recordset
    
    Tabel = "KPI-VDBT-LFR"
    'rstSQL = "Select * From `" & Tabel & "` WHERE ((([KPI-VDBT-LFR].zendnr)=1) AND (([KPI-VDBT-LFR].goednr)=1) AND (([KPI-VDBT-LFR].OplCont_Charter) Not Like ""0 - *"" And ([KPI-VDBT-LFR].OplCont_Charter) Not Like ""0 - ?"" And ([KPI-VDBT-LFR].OplCont_Charter) Not Like ""? - 0"" And ([KPI-VDBT-LFR].OplCont_Charter) Not Like ""999999 - 0"") AND (([KPI-VDBT-LFR].Laadland) Is Not Null) AND (([KPI-VDBT-LFR].Laadlokatie) Is Not Null) AND (([KPI-VDBT-LFR].losland) Is Not Null) AND (([KPI-VDBT-LFR].loslokatie) Is Not Null) AND (([KPI-VDBT-LFR].Begindatum_laden) Is Not Null) AND (([KPI-VDBT-LFR].Begintijd_laden) Is Not Null) AND (([KPI-VDBT-LFR].Einddatum_lossen) Is Not Null) AND (([KPI-VDBT-LFR].Eindtijd_lossen) Is Not Null) AND (([KPI-VDBT-LFR].OpdrachtStatus)>0 And ([KPI-VDBT-LFR].OpdrachtStatus)<5) AND (([KPI-VDBT-LFR].LaadPC) Is Not Null) AND (([KPI-VDBT-LFR].LosPC) Is Not Null)) ORDER BY [KPI-VDBT-LFR].OplCont_Charter, [KPI-VDBT-LFR].Begindatum_laden, [KPI-VDBT-LFR].Begintijd_laden"
    rstSQL = "Select * From `" & Tabel & "` WHERE ((([KPI-VDBT-LFR].zendnr)=1) AND (([KPI-VDBT-LFR].goednr)=1) AND (([KPI-VDBT-LFR].OplCont_Charter) Not Like '0 - %' And ([KPI-VDBT-LFR].OplCont_Charter) Not Like '0 - ?' And ([KPI-VDBT-LFR].OplCont_Charter) Not Like '? - 0' And ([KPI-VDBT-LFR].OplCont_Charter) Not Like '999999 - 0') AND (([KPI-VDBT-LFR].Laadland) Is Not Null) AND (([KPI-VDBT-LFR].Laadlokatie) Is Not Null) AND (([KPI-VDBT-LFR].losland) Is Not Null) AND (([KPI-VDBT-LFR].loslokatie) Is Not Null) AND (([KPI-VDBT-LFR].Begindatum_laden) Is Not Null) AND (([KPI-VDBT-LFR].Begintijd_laden) Is Not Null) AND (([KPI-VDBT-LFR].Einddatum_lossen) Is Not Null) AND (([KPI-VDBT-LFR].Eindtijd_lossen) Is Not Null) AND (([KPI-VDBT-LFR].OpdrachtStatus)>0 And ([KPI-VDBT-LFR].OpdrachtStatus)<5) AND (([KPI-VDBT-LFR].LaadPC) Is Not Null) AND (([KPI-VDBT-LFR].LosPC) Is Not Null)) ORDER BY [KPI-VDBT-LFR].OplCont_Charter, [KPI-VDBT-LFR].Begindatum_laden, [KPI-VDBT-LFR].Begintijd_laden;"
    'ddd = InputBox("ddd", "excel", rstSQL)
    
    StatusBar "Recordset openen..."
    rstKPI.Open rstSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rstCount = rstKPI.RecordCount
    
'    MsgBox rstCount
'    rstKPI.Close
'    Exit Sub
    
    rstKPI.MoveFirst
    i = 1
    i2 = 1
    StatusBar "While recorset is not empty herlaad gegevens bepalen..."
    Do While Not rstKPI.EOF
    ' Do something useful with the "current" record
        If IsNull(rstKPI.Fields("Herlaadland").Value) Or rstKPI.Fields("Herlaadland").Value = "" Or rstKPI.Fields("Herlaadland").Value = Null Or rstKPI.Fields("Herlaadland").Value = 0 Then
            rstKPI_ID = rstKPI!Id
            'StatusBar "Herlaad gegevens bepalen Record " & i & " van " & rstCount & " (Bezig met record: " & rstKPI_ID & ") ..."
            StatusBar Format((Time - BeginTijd), "hh:mm:ss") & " Herlaad gegevens bepalen, voortgang: " & Round((i / rstCount * 100), 2) & "%"
            
            rstSQL2 = "SELECT TOP 1 [KPI-VDBT-LFR].OplCont_Charter, CDate([Begindatum_laden] & ' ' & [KPI-VDBT-LFR]![Begintijd_laden]) AS Expr1, [KPI-VDBT-LFR].Laadland, [KPI-VDBT-LFR].Laadlokatie, [KPI-VDBT-LFR].LaadPC FROM [KPI-VDBT-LFR] WHERE ((([KPI-VDBT-LFR].OplCont_Charter)='" & rstKPI!OplCont_Charter & "') AND ((CDate([Begindatum_laden] & ' ' & [KPI-VDBT-LFR]![Begintijd_laden])) Is Not Null And (CDate([Begindatum_laden] & ' ' & [KPI-VDBT-LFR]![Begintijd_laden]))>CDate('" & rstKPI!Begindatum_laden & " " & rstKPI!Begintijd_laden & "'))) ORDER BY CDate([Begindatum_laden] & ' ' & [KPI-VDBT-LFR]![Begintijd_laden]);"
            
            Set rst2KPI = New ADODB.Recordset
            rst2KPI.Open rstSQL2, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
            If rst2KPI.RecordCount <> 1 Then
                Herlaadland = "RETOUR ONBEKEND"
                Herlaadplaats = "RETOUR ONBEKEND"
                Herlaadpc = "RETOUR ONBEKEND"
            Else
                rst2KPI.MoveFirst
                Herlaadland = rst2KPI!Laadland
                Herlaadplaats = rst2KPI!Laadlokatie
                Herlaadpc = rst2KPI!LaadPC
            End If
            
            'Controle op ' of "
                Herlaadland = Replace(Herlaadland, "'", "")
                Herlaadplaats = Replace(Herlaadplaats, "'", "")
                Herlaadpc = Replace(Herlaadpc, "'", "")
            
            rst2KPI.Close
            
            'Update_Query = "UPDATE [KPI-VDBT-LFR] SET [KPI-VDBT-LFR].HerlaadLand = '" & Herlaadland & "' WHERE ((([KPI-VDBT-LFR].Id)=" & rstKPI_ID & "))" '"UPDATE `" & Tabel & "`  SET Herlaadland = '" & Herlaadland & "' WHERE Id = " & rstKPI_ID & ""
            Update_Query = "UPDATE [KPI-VDBT-LFR] SET [KPI-VDBT-LFR].HerlaadLand = '" & Herlaadland & "', [KPI-VDBT-LFR].HerlaadPC = '" & Herlaadpc & "', [KPI-VDBT-LFR].HerlaadLokatie = '" & Herlaadplaats & "' WHERE ((([KPI-VDBT-LFR].Id)=" & rstKPI_ID & "))" '"UPDATE `" & Tabel & "`  SET Herlaadland = '" & Herlaadland & "' WHERE Id = " & rstKPI_ID & ""
            CurrentProject.Connection.Execute Update_Query
            'nummering
            i2 = i2 + 1
        End If
    ' Get the next record
        StatusBar "Next record in Recordset..."
        i = i + 1
        rstKPI.MoveNext
    Loop
    StatusBar "Recordset Sluiten..."
    rstKPI.Close
    
    StatusBar "Afronden..."
    
    EindTijd = Time
    Duur = Format((EindTijd - BeginTijd), "hh:mm:ss")
    StatusBar (i - 1) & " records van de " & rstCount & " doorgelopen." & " Tijdsduur: " & Duur
    MsgBox (i - 1) & " records van de " & rstCount & " doorgelopen, " & (i2 - 1) & " records bijgewerkt." & Chr(13) & "Tijdsduur: " & Duur
    
    StatusBar ""

End Sub

Sub StatusBar(Optional Msg As Variant)
Dim Temp As Variant

' if the Msg variable is omitted or is empty, return the control of the status bar to Access

If Not IsMissing(Msg) Then
 If Msg <> "" Then
  Temp = SysCmd(acSysCmdSetStatus, Msg)
 Else
  Temp = SysCmd(acSysCmdClearStatus)
 End If
Else
  Temp = SysCmd(acSysCmdClearStatus)
End If
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan