Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Xoar am August 29, 2011, 15:54:25

Titel: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 15:54:25
Hallo, mir fällt momentan keine gute Lösung ein wie ich folgendes lösen kann....

Ich habe eine Eingabemaske wo das Datum,Name, eingeteiltes Fahrzeug, Dienstbeginn und das Dienstende ausgewählt wird. Das wird in eine Tabelle gespeichert.

So nun kann es vorkommen das Person 1 Fahrzeug 1 von 08:00 - 10:00 besetzt und Person 2 das Fahrzeug 1 von 10:00 - 19:00

jetzt hätte ich gerne, dass in meiner Abfrage oder Tabelle ein Feld erzeugt wird, wo eingetragen wird welche Person das Fahrzeug zuerst besetzt.  

Bsp:
Datum              Fahrzeug     Name          von           bis         Std          neues Feld wo eingetragen wird wer das zuerst besetzt.    
01.08.2011      Auto1          Meier       08:00        10:00        2                   1
01.08.2011      Auto1          Schulz     10:00        19:00        9                   2
01.08.2011      Auto2          Müller      08:00        19:00        11                 1 
01.08.2011      Auto3          Kohl         08:00       19:00        11                  1 


Die Abfrage gibt es schon wo alle Auflistungen wie oben zu sehen sind, erstellt werden, nur OHNE das neue Feld wo jetzt 1 und 2 steht. Das muss noch erzeugt werden, mir fällt da nur keine passende Formel für ein.

Oder geht das nur über VBA?


Liebe Grüße

Titel: Re: Lösungsidee?
Beitrag von: Jonny am August 29, 2011, 16:11:53
Hallo,
ein Feld mit Zeit ist unglücklich.
Mache ein Feld Anfang und ein Feld Ende.
Dann kannst du nicht nur sauber sortieren (Datum, Anfang) sondern auch noch
auswerten wie lange jemand das Fahrzeug benutzt hat.

Gruß

Johann
Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 17:35:52
ja sorry hab ich falsch geschrieben.

hab ein Feld [von] und ein Feld [bis]. Ausgewertet wie lange Person X das Fahrzeug besetzt hat, habe ich auch drin. Nur halt der für mich wichtige Punkt nun, nicht ob er als erstes oder erst als zweites das Fahrzeug besetzt.

Da ich Textfelder durch die Daten der Abfrage befülle, bringt mir sortieren glaube ich nichts...
Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 29, 2011, 17:43:31
HAllo,

was hast Du denn damit vor?


Du siehst doch anhand der "Von"-Zeit (in Verbindung mit dem Datumsfeld, was an sich in dieser Konstellation als zwei Felder eher unglücklich ist) und dem entspr. Fahrzeug, wer der "erste" Fahrer ist.
Titel: Re: Lösungsidee?
Beitrag von: Jonny am August 29, 2011, 17:44:54
Hallo,
dann bringt dir die Sortierung doch was du willst (sortiere nach Datum, nach Auto und danach nach Von)
Tag ist zusammen, Auto ist zusammen und die kleinste Zeit von, also der Erste.

Gruß

Johann
Titel: Re: Lösungsidee?
Beitrag von: Jonny am August 29, 2011, 17:47:11
Hallo,
Datum und Auto müssen schon zwei Felder sein weil innerhalb eines Datums alle Autos zusammenstehen müssen.
Bei einen Feld Datum und Zeit würde das nicht gehen.

Gruß

Johann
Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 29, 2011, 17:48:53
 ???
Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 17:52:48
ja wenn ich drauf schaue sehe ich das, jetzt kommt aber das ABER

Ich befülle über VBA automatisch Textfelder mit den Daten der Abfrage und nun muss Access ja wissen wer in Textfeld1 und wer in Textfeld2 geschrieben werden muss.

Textfeld 1 soll in diesem Fall den Mitarbeiter beinhalten, der zuerst auf dem Fahrzeug eingesetzt ist und Textfeld 2 halt den Mitarbeiter, der danach das Fahrzeug besetzt.

Fahrzeug 1
08:00 - 10:00     10:00 - 19:00
[Mitarbeiter 1]       [Mitarbeiter 2]      Und nun muss ich den VBA Code ja so anpassen, dass man erkennen kann, wer zuerst das Fahrzeug besetzt.

Hoffe ist etwas klar geworden.
Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 29, 2011, 17:58:37
Hallo,


nein    ;)


Klar ist , was Du machen willst, aber nicht, wofür das gut sein soll.


Welcher Fahrer der Erste ist, braucht nicht gespeichert werden, das ergibt sich aus der Tatsache der "frühen" Zeit.


"Textfeld 1 soll in diesem Fall den Mitarbeiter beinhalten, der zuerst auf dem Fahrzeug eingesetzt ist und Textfeld 2 halt den Mitarbeiter, der danach das Fahrzeug besetzt"

Sowas geht schief, wenn das zwei verschiedene Form-Textfelder im Detailbereich des Form sind.   Zeige besser die Fahrer in ihrer zeitlichen Reihenfolge in einem Listenfeld oder Unterform an.


Erklär mal, was mit diesem Formular gemacht werden soll und poste den VBA-Code, der dazu gehört.

Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 18:00:27
dauert nen moment :)
Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 29, 2011, 18:07:15
Was dauert?


Die Schockverarbeitung  ?     :D ;D :D ;D :D ;D ;) ;) ;)
Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 18:14:26
Also das erste Bild ist die Maske wo der Dienstplan erstellt wird.

Das zweite Bild wird ausgedruckt und aufgehangen.

Dort sieht man alle Textfelder, die Zeiten dabei sind noch aus der Vorversion, also nicht beachten.


Nach der Eingabe der Daten in der Maske, werden die Daten in eine Tabelle eingetragen und über eine Abfrage so abgefragt, dass man die richtigen Bezeichnungen für die Textfelder halt.

Nun wird über einer DLookup Funktion nach verschiedenen Schlüsselelementen gesucht und dann der Name dem Textfeld zugeordnet.

Form_frmDienstplanAusdruck.RTW1_D.Value = DLookup("[Nachname]", "qryDienstplan", "[Fahrzeug] = 'RTW 1' and [Posten] = 'Fahrer'")


jetzt muss ich aber noch ein neues Schlüsselelement haben, wo drin steht ob er das Fahrzeug als ersten oder zweites besetzt.

So eine DLookup Funktion hab ich für jedes Textfeld.

Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 19:07:09
jetzt war das wohl ein Schock für dich^^

wohl schlimmer als erwartet   HA
Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 29, 2011, 21:00:19
Hallo,


nee, kein Schock für mich...     ;)


Wenn das Formular ungebunden ist, was ich stark vermute, könnte man mittels eines Recordsets und SQL-Strings die entspr. Datensätze filtern, nach Datum plus Von-Uhrzeit sortieren und mittels Schleife die Von-Zeiten irgendwelchen Steuerelementen zuweisen.

Die Position dieser "irgendwelchen Steuerelementen" gibt die Reihenfolge (Erster, Zweiter,.. )  sichtbar an.


Oder wie vorher gesagt, gleich ein Listenfeld mit Zuweisung eines passenden SQL-Strings , das dann die Reiehnfolge anzeigt.
Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 29, 2011, 21:28:37
Hi,

also das mit dem Listenfeld hört sich ja ansich einfacher an, nur habe ich da nicht so die Formatierungsmöglichkeiten.
Demnach müsste das Listenfeld ja nicht untereinander die Datensätze anzeigen, sondern horizontal nebeneinander, das geht glaube ich nicht, oder?!

Mit nem RecordSet habe ich auch schon überlegt, da bin ich leider nicht so ganz fit drin, habe in meinem Code zwar schon zwei drin, aber da musste ich auch schon viel Hilfe für in Anspruch nehmen.

Wie z.B. könnte man alle Steuerelemente durchlaufen, wenn sie total unterschiedliche Namen haben, oder müsste ich sie umbenennen in 1,2.... und dann den Counter immer +1?

Und dann müsste ja auch noch jedem Textfeld in der Schleife der passende Datensatz zugeordnet werden. z.B. Textfeld1 muss RTW1 Fahrer sein, Textfeld2 RTW2 Fahrer etc...  da weiß ich auch nicht wie das geht.


Das auch immer alles so kompliziert sein muss, bis mans kann....

Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 30, 2011, 11:25:16
Hallo,

warum muss das nun nebeneinander stehen und nicht untereinander? Das ist doch Deine Designvorstellung.


"da bin ich leider nicht so ganz fit drin"   dann musst Du üben   ;)


"oder müsste ich sie umbenennen in 1,2.... und dann den Counter immer +1?"    genau so...

" z.B. Textfeld1 muss RTW1 Fahrer sein, Textfeld2 RTW2 "

Beispielhaft:


Dim rs as Dao.Recordset, i as Long

Set rs=CurrentDB.Openrecordset(" select  Datum, Fahrzeug, [Name], von, bis, Std    From DeineAbfrageTabelle where Fahrzeug='Auto1' and Datum = #08/01/2011# order by Von" , dbopensnapshot)     

i=0

Do until rs.Eof
i=i+1
Me("Textfeld" & i) = rs![Name]
rs.Movenext
Next

rs.close:set rs=nothing
Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 30, 2011, 12:31:47
Huhu,

verstehe ich das nun richtig, das ich für jedes Fahrzeug einen neuen RecordSet machen müsste?

Die Sortierung geht damit ja, wie du gezeigt hast, sehr gut.

Probiere ich nachher mal aus :)


PS: warum ist im RecordSet eigentlich nur der Name in [] und die restlichen Felder nicht?
Titel: Re: Lösungsidee?
Beitrag von: DF6GL am August 30, 2011, 13:12:46
Hallo,

"für jedes Fahrzeug einen neuen RecordSet "


nein, nicht unbedingt. Du kannst auch in einem Recordset mit z. B. Findfirst nach dem(n) Fahrzeug(gruppen) suchen.

"nur der Name in [] und die restlichen Felder nicht?"

weil es sich bei "Name" um ein reserviertes Wort handelt und dieses Feld, das Du selber erzeugt und so genannt hast, UNBEDINGT in Eckklammern stehen muss. 

Du kannst ja mal das einfügen:

Msgbox rs.Name
Titel: Re: Lösungsidee?
Beitrag von: Xoar am August 30, 2011, 20:32:18
habs nun so gelöst. In der Abfrage auf der ich zugreife, erst nach der "von" Zeit sortiert und dann nach den "Fahrzeugen" per SQL.


Private Sub Vorschau_Click()
Dim DB As DAO.Database
Dim rs As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim i As Integer

Dim RTW1D As Integer
Dim RTW1L As Integer
DoCmd.OpenForm "frmDienstplanAusdruck"

Set DB = CurrentDb
Set qdf = DB.QueryDefs("qryDienstplan")
qdf.Parameters(0) = Me!Datum
RTW1D = 1
RTW1L = 1
Set rs = qdf.OpenRecordset(dbOpenSnapshot)

With rs   'with vereinfacht die Schreibweise.  direkt .Befehl
  Do While Not .EOF
   '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
       If .Fields("Fahrzeug") = "RTW 1" And .Fields("Posten") = "Fahrer" Then
           Form_frmDienstplanAusdruck("RTW1_D" & RTW1D).Value = .Fields("Nachname")
           RTW1D = RTW1D + 1 Gibt hier genau zwei Felder RTW1D1 und RTW1D2, durch sie Sortierung beginnt er automatisch mit dem, der zuerst den Wagen besetzt
   ElseIf .Fields("Fahrzeug") = "RTW 1" And .Fields("Posten") = "Führer" Then
           Form_frmDienstplanAusdruck("RTW1_L" & RTW1L).Value = .Fields("Nachname")
           RTW1L = RTW1L + 1
   '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
           
  End If
  .MoveNext
  Loop
  .Close: Set rs = Nothing
End With
qdf.Close: Set qdf = Nothing
Set DB = Nothing
End Sub


irgendeine Verbesserung, bevor ich das nun für ALLE Textfelder mache :D