Hallo,
ich habe folgendes vor:
Zur besseren Vorstellung, stellt euch eine Liste vor, wo untereinander alle Mitarbeiter und nebeneinander alle Datumstage für ein Jahr stehen. Hier müssen in bestimmten Intervallen die Werte X1,X2,X3 eingetragen werden.
Es müssen alle 7 Tage(Invervalleingabe) ein X pro Mitarbeiter eingetragen werden, es fängt mit X1 an, das nächste (7 Tage später) X2, das dritte (7 Tage später) X3. Es kann aber auch vorkommen, dass das START X nicht 1, sondern, 2, oder 3 ist und dieses Problem bekomm ich noch nicht hin. Die Logik dahinter ist aber simpel. Wenn die X1 Treppe durchläuft, sieht man das ein Mitarbeiter 7 Schichten vor dem X1 wieder eine X eingetragen bekommen muss. Da es aber immer 1,2,3 durchlaufend eingetragen wird, muss dieser mit einem X2 starten.
Bsp:
M_ID Tag1 Tag2 Tag3 Tag4 Tag5 Tag6 Tag7 Tag8 Tag9 Tag10
1 x1 x2
2 x1 x2
3 x1 x2
4 x1
5 x1
6 x1
7 x1
8 x3 x1
9 x3 x1
10 x3 x1
Habe bis jetzt folgenden VBA Code geschrieben:
'////Hier wird eine Abfrage für jeden Mitarbeiter erstellt und dann alle 8(intervalleingabe) Schichten die passende X Schicht zugewiesen
Public Function XschichtenEintragen(StarttagWA As Date, XArt As Integer, intervall As Integer)
Dim qdf As QueryDef
Dim Starttag As Date
Dim rs As Recordset
Dim zaehler As Integer
Dim XSchichtArt As Integer
Dim Mitarbeiterschleife As Integer
Dim CounterDatum As Integer
On Error GoTo Fehlerbehandlung
CounterDatum = 1
Starttag = StarttagWA
For Mitarbeiterschleife = 1 To DMax("[Sortierung]", "tblMitarbeiter", "[Wachabteilung] = 1")
Set qdf = CurrentDb.QueryDefs("qryXSchichtenVBA") 'Hier wird qdf eine Abfrage zugewiesen, der in VBA Parameter zugewieden werden können.
qdf.Parameters("[WaEingabeX]") = 1
qdf.Parameters("[MitarbeiterIDXTage]") = Mitarbeiterschleife 'hier wird die Abfrage auf den aktuellen Mitarbeiter der Schleife ausgeführt nach der Sortierreihenfolge
'Eine Abfrage enhält immer genau 1 Mitarbeiter und den Zeitraum 01.01. akt Jahr bis 31.12. akt. Jahr
Set rs = qdf.OpenRecordset 'den Recordset auf die parameterisierte(gefilterte) Abfrage öffnen
Do While Not rs.EOF
If rs!Datumstag_F < Starttag Then
rs.MoveNext
Else
For XSchichtArt = 37 To 39 'X 1 - 3
rs.Edit
rs!vonZeit = Null
rs!bisZeit = Null
rs!Position = XSchichtArt '37=X1, 38=X2, 39=X3
rs.Update
For zaehler = 1 To intervall
On Error Resume Next
If rs!Datumstag_F = Null Then GoTo Sprungmarke
If rs!Datumstag_F <= "31.12." & Year(Date) + 1 Then rs.MoveNext Else
Next
Next
End If
Loop
Sprungmarke: If CounterDatum < intervall Then
Starttag = DateAdd("d", 3, Starttag)
CounterDatum = CounterDatum + 1
Else
CounterDatum = 1
Starttag = DateAdd("d", 3, StarttagWA)
End If
Next
MsgBox "fertig"
Exit Function
Fehlerbehandlung:
End Function
habt ihr eine Idee, wie ich dies realisieren kann, oder insg. anders machen sollte?
Jetzt fängt er halt immer mit X1 an.
Hallo xoar,
ZitatJetzt fängt er halt immer mit X1 an.
So ist es ja auch programmiert:
For XSchichtArt = 37 To 39 'X 1 - 3Vielleicht müsstest du erst suchen, welche Schicht für den MA zuletzt definiert wurde.
Noch was:
Deine Codezeile
If rs!Datumstag_F <= "31.12." & Year(Date) + 1 Then rs.MoveNext Elseist ja wohl fehlerhaft (else).
(Insgesamt: achte auf Ein- und Ausrückungen im Sourcecode, stelle Labels (sprungmarke) in einer Zeile allein usw., damit jeder If-Block oder Loop immer anhand der Einrückung identifiziert werden kann.)
Ansonsten würde ich das Intervall nach oben legen (also als erstes Statement beim Abarbeiten des Recordsets), etwa so:
icount =0
do while not rs.eof
icount = icount +1
if icount < intervall then
goto MoveMyRS
else
icount=0
endif
(hier nun code für Intervall erreicht)
...
MoveMyRS:
rs.movenext
loop
Zusammengefasst:
1. suche den letzten Tag (z.B. mit dlookup), an dem für den MA eine Schicht eingetragen wurde (kann allerdings auch im Vorjahr liegen, also suche z.B. vom 1.Dez.<Vorjahr> bis 31.Dez.<aktuelles Jahr>) und merke dir x1, x2 oder x3
2. da SQL kein STEP kennt (so wie in For i=1 to 100 step 10), selektiere nun die Datensätze von <letzter gefundener Eintrag> bis <31.12. aktuelles Jahr>
3. arbeite den RecordSet ab, überspringe dabei Records, die unterhalb des Intervalls liegen
4. wenn du einen Intervall-Tag gefunden hast, speicher den passenden X-Wert ab (in Abhängigkeit vom zuvor gefundenen X-Wert des letzten Tags)
Ich hoffe, diese Anregungen helfen dir weiter, wenn sie auch nicht "ausprogrammiert" sind.
lg
crystal
ja danke, den Gedanken hatte ich auch schon in der Art, wusste nur noch nicht genau wie ich mir den Wert am besten hole.
Wenn ich den Wert dann gefunden habe, muss ich ihn ja als irgendwie einbinden.
Es gibt keine direkte Möglichkeit zu sagen, starte bei Wert 38 (x2) in der if Schleife, oder?
Ich muss dann wohl den Wert vor der Eintragung abfragen und mit if die Szenarien programmieren, wo der Start kein X1 ist.
sowas wie
if Abfragewert = 38 then
rs.edit
rs!Position = 39
rs.update
rs.movenext....
else if Abfragewert = 39 then
....
else
....
end if
Hallo xoar,
ZitatEs gibt keine direkte Möglichkeit zu sagen, starte bei Wert 38 (x2) in der if Schleife, oder?
Naja - du meinst ja For-Next-Schleife...
Prinzipiell kann du eine solche Schleife von einem "beliebigen" Punkt starten:
for i = <startpunkt> to <endpunkt> [step <stepsize>], also z.B.
for i = 120 to 140 step 4
Aber bei deiner Fragestellung würde ich den Vergleich mit "Intervall" vorziehen, da der Recordset ja schon sequenziell abgearbeitet wird.
Statt den Abfragewert mit if..elseif abzufragen könntest du auch
select case abfragewert
case 38:
...
case 39:
...
...
end select
schreiben.
Ganz verstanden habe ich nicht, wann aus x1 x2, aus x2 x3 und aus x3 wieder x1 wird (und was geschieht, wenn der MA Urlaub hat). Aber das kannst du ja programmieren, wenn du ertsmal die Intervall-Tage gefunden hast.
lg
crystal
Hallo,
Zitatwo untereinander alle Mitarbeiter und nebeneinander alle Datumstage für ein Jahr stehen.
prinzipiell ist eine solcher Matrixaufbau für eine Datenbank ungeeignet. Abgesehen davon, lässt sich ein Jahr mit allen Tagen nicht so darstellen, da eine Accesstabelle nur max. 255 Spalten haben kann.
Die Tabelle sollte nur 3 Spalten haben (MAID, Schichtart, Datum) und die Daten vertikal führen. Also für ein Mitarbeiter je Schichttag ein Datensatz, also nur ein Datum eintragen wenn er an diesem Tag auch Schicht hat.. Ob es sinnvoll ist diese Tabelle im voraus anzulegen weiß ich jetzt auch.
In Deinen Beispieldaten würde MA1 an Tag1 und Tag8 arbeiten und dazwischen ?
Warum glaubst Du die Tabelle im voraus füllen zu müssen ?
Kannst Du mal einfach die Schichtfolge beschreiben (ich verstehe das Beispiel nicht ganz), ohne jetzt mal eine Tabelle im Hinterkopf zu haben?
Um wie viele Mitarbeiter geht es denn da ?
@crystal
Ich dachte Step ist dafür da, dass die Schleife z.B. 4 steps weiter geht. also 1 to 100 step 4 = 1,5,9,13....
Wann aus X1, X2, oder X3 hängt aus der Kombination zweier Sichtweisen ab.
a.
1. Mitarbeiter Tag 1 = X1
Tag 2 = wert
Tag 3 = wert
Tag 4 = wert
Tag 5 = wert
Tag 6 = wert
Tag 7 = wert
Tag 8 = x2
...
und einmal aus der Sichtweise des Tages
MitarbeiterID Tag Tag
1 01.01.2017 X1 02.01.2017
2 01.01.2017 02.01.2017 x1
3 01.01.2017 02.01.2017
4 01.01.2017 02.01.2017
5 01.01.2017 02.01.2017
6 01.01.2017 02.01.2017
7 01.01.2017 02.01.2017
8 01.01.2017 X3 02.01.2017 -> 08.01.2017 X1
9 01.01.2017 02.01.2017 x3 -> 09.01.2017 X1
Das hängt damit zusammen, dass der Mitarbeiter 8, sieben Tage nach dem 01.01.2017 sein X1 hat. Man geht die Treppe der X Tage einfach weiter, wie im Erstposting zu sehen ist.
PS: Da gabs noch ein Fehler die roten X2er, müssen natürlich X3er sein, weil danach ja X1 kommt.
Hoffe ist nun verständlich
@MzKIMu
soeine Matrix habe ich ja auch nicht, sie war nur zur Vorstellung gedacht.
Ich habe eine Tabelle wo alle Tage für jeden Mitarbeiter als DS untereinander stehen, also Anzahl_Jahrestage*AnzahlMitarbeiter an DS
Dazu dann ein Feld wo diese X1,2,3 rein müssen.
Die Vorausfüllung ist eine Arbeitserleichterung, da diese am Jahresanfang fest steht und somit nicht mehr eingetragen werden muss, sobald Tag X auftaucht steht bei Mitarbeiter Y schon der Wert drin.
Da diese Vorplanung einer Logik folgt, sollte das ja möglich sein.
Diese X1,2,3 bedeuten eigentlich "frei" mit Rangfolge (wegen Rufbereitschaft)
Die Arbeitsfolge ist eigentlich alle drei Tage, zum Verständnis habe ich es auf Tag auf Tag vereinfacht.
Hallo,
also trotz mehrmaligen lesen habe ich das nicht verstanden. Oder ich stehe auf der Leitung, was ich ja nicht ausschließen will.
Was hat es mit diesen X auf sich ?
Was ist denn der Unterschied zwischen X1, X2 und X3 ?
X bedeutet erstmal frei. Jetzt können drei Leute an einem Tag frei haben. X1,2,3.
Wenn jetzt wer krank wird, wird erst X3 angerufen, bei zwei Kranken auch X2....
Diese Freitage sind alle 7 Tage vordefiniert. Damit die Priorität nicht immer gleich ist, wechselt diese immer.
Hallo,
scheinbar bin ich wirklich etwas schwer von Begriff.
Kannst Du mal eine Exceltabelle hier hochladen, wie die fertige Accesstabelle aussehen soll ?
Mit so vielen Zeilen (Datensätzen) dass man die Regel erkennen kann.
So habe sie als Xer.xls angehangen.
Wie gesagt da der erste Mitarbeiter mit X1 anfängt und die Treppe nach rechts unten weiter geht, muss irgendwann am ersten Tag ein Mitarbeiter mit X2 und einer mit X3 anfangen.
Hoffe ist ersichtlich.
PS: wie die Accesstabelle aussieht, kann ich garnicht abbilden, das wäre viel zu viele DS.
Jeder Tag ist ja 20x vorhanden (jeder Mitarbeiter 1x) und dann gehts los..
01.01 Mitarbeiter 1 X1
....
01.01 Mitarbeiter 8 X3
....
01.01 Mitarbeiter 15 X2
....
01.01 Mitarbeiter 20
02.01 Mitarbeiter 1
02.01 Mitarbeiter 2 x1
....
02.01 Mitarbeiter 9 x3
02.01 Mitarbeiter 16 x2
....
Grüße
Hallo,
sorry, aber das wollte ich nicht. Ich wollte sehen, wie die Accesstabelle aussehen soll.
Zitat von: MzKlMuKannst Du mal eine Exceltabelle hier hochladen, wie die fertige Accesstabelle aussehen soll ?
Die Antwort auf eine frühere Frage steht auch noch aus.
Zitat von: MzKlMuUm wie viele Mitarbeiter geht es denn da ?
Insg. um ca. 70, aber diese sind geteilt in 3 Schichten., da ich mich ja immer auf eine Abfrage berufe sind es also ca. 24.
Hier ändert sich im Prinzip nur der erste Starttag und dann geht das gleiche Procedere los.
Hallo,
und wo ist jetzt die andere Exceltabelle ?
ich baue sie noch
SO....
jetzt wo ich mir das so in dieser Variante anschaue, sieht das eigentlich garnicht mehr so schwer aus, man muss nur immer bei jedem folgenden Datumstag MitarbeiterID +1 machen..... so spontan
Hier ist natürlich nun drauf zu achten, dass wenn die X1,2,3 soweit nach unten gewandert sind, diese wieder bei Mitarbeiter 1 anfangen.
heißt Mitarbeiter 20 hat nen X3 am 10.01. dann am 11.01 hat wieder Mitarbeiter 1 das X3.
(bei einer Annahme von genau 20 Mitarbeiter)
Hallo,
ich versuche mal eine Regel zu definieren.
1.Spalte
Datum für jeden Mitarbeiter wiederholend. Beginnen am 1.1.
2.Spalte Mitarbeiter (als ID)
3.Spalte
Die X beginnend am 1.1. mit X1 dann X3 dann X2 immer 7 Tage dazwischen.
Fragen:
Sind das immer durchgängig 7 Tage ?
Die Reihenfolge ist durchgängig immer X1 - X3 - X2 ?
7 Tage sind fix.
Reihenfolge ist bedingt fix.
Stell dir vor Du hast diese X1,2,3 die immer ein Mitarbeiter pro Tag nach unten wandern, irgendwann fällt ja das X unten raus und taucht oben wieder auf.
Mann könnte sagen:
4. Wenn TagY Mitarbeiter20 (letzteID) X3 hat, muss TagY+1 wieder Mitarbeiter1 das X3 haben.
Für die X1 und X2 natürlich das gleiche Prinzip
Hallo,
sorry, aber ich kapiere es einfach nicht. Für Dich mag das ja einfach sein, aber ich habe ja 0 Ahnung über Eure Abläufe. Und wenn man etwas automatisiert machen will braucht es ein klare und eindeutige Regel.
Es ist auch verwirrend, weil Du mal von X spricht und dann wieder von X1, X2, X3.
Zitatirgendwann fällt ja das X unten raus und taucht oben wieder auf
Welches (von den 3en) fällt dann raus und wie geht es dann oben weiter. Und was heist oben, wo oben, wieder beim 1.1.
Ok, ich danke dir für die Mühe, aber ich breche es hier ab. Scheint wohl für Außenstehende echt schwer zu verstehen sein.
Mein nächstes Problem, wird hoffentlich nicht so kompliziert. ;)
Meinetwegen kannst Du den Thread löschen.
Danke
Hallo,
nicht so schnell die Flinte ins Korn werfen.
Ich glaube, deine Frage verstanden zu haben und hatte schon begonnen, eine Lösung zu schreiben, als sich plötzlich mei Browser verabschiedet hat.
Ich schreib's jetzt neu und lade es dann hier hoch - bitte um etwas Geduld.
lg
crystal
Ok, merci
Hallo xoar,
hier nun meine Lösung.
Aber zunächst zu dem, was ich mir anhand deiner Beschreibungen vorstelle.
1. du hast eine Tabelle, in der für jeden MA ein Jahreskalender gespeichert ist.
2. gemäß deiner Darstellung in deiner ursprünglichen Frage willst du nun in der sich gedanklich ergebenden Matrix, beginnend am 1.Jan für Ma1 alle 8 Tage ein Kennzeichen speichern, das von x1 bis x3 läuft und dann wieder bei x1 beginnt.
3. für Ma2 beginnt der Zyklus einen Tag später, also am 2.Jan.
4. usw. bis Ma8. Hier fällt das x1 auf den 8.Jan. Das ist größer als das Intervall und deshalb muss hier für den 1.Jan. ein weiteres xn eingefügt werden. Um die Reihenfolge der xn's einzuhalten UND weil der 8.1. ein x1 bekommt, muss also am 1.1. ein x3 stehen.
Wenn das ganze ein 2-dimensionales Array in VBA wäre, könnte man mit For-Next-Loops die Matrix abarbeiten.
Das geht aber nicht in Access, weil deine Tabelle ja eigentlich so aussieht:
MA Tag Wert
1 1.1. x1
1 2.1. -
1 3.1. -
...
1 7.1. -
1 8.1. x2
...
1 31.12. -
2 1.1. -
2 2.1. x1
...
Diese Tabelle kannst du natürlich nur sequenziell abarbeiten, also Zeile für Zeile.
Ich gehe jetzt vom einfachen Fall aus (das erste x1 in der gedachten Matrix fällt auf den 1.Jan. bei MA1). Die Lösung sieht dann grob so aus (für MA1):
<Hilfsvariable initialisieren:
intervall = 7
oldma = 1
weiter = true
<recordset öffnen (sortierung MA und Datum>
do while not rs.eof
do while weiter
for x = 37 to 39
for i = 1 to intervall
if i=1 then
rs!wert = xwert
rs.update
endif
rs.movenext
if rs.ma <> rs.oldma then
weiter = false
goto loopexit
endif
next
next
loop
loop
loopexit:
Mir schwirrt etwas der Kopf, vielleicht kann das mal jemand prüfen...
Noch einfacher:
icounter = 0
xwert=37
intervall =7
oldma =1
macount=0
do while not rs.eof
if rs!ma <> oldma then
macount = macount +1
for i = 1 to macount
rs.movenext
next
icounter =0
exit loop
endif
icounter = icounter +1
if icounter mod intervall = 0 then
rs!wert = xwert
rs.update
xwert = xwert +1
if xwert > 39 then xwert = 37
endif
rs.movenext
loop
Jap Du hast es erkannt.
Ich hab nur noch nicht erkannt, wo in der Schleife der Fall eintritt, dass er mit einem X3 beginnt.
OK - daran arbeite ich noch.
Ok, soweit bin ich ja auch schon gekommen. Jetzt fängt das eigentliche Problem an... ich bin gespannt ;)
Hallo xoar,
Zwischenbericht:
Ich habe eine Tabelle "xtab" angelegt, die folgende Felder hat:
xid = autowert, Primärschlüssel
ma = zahl
dt = datum
xw = text
und mit 3 MAs und jeweils dem Datum 1.1. bis 31.12.2016 gefüllt.
Dazu noch eine Abfrage "xtaba", die einfach nur die Werte aus xtab holt und (zur Sicherheit) nach ma und dt sortiert.
Mit diesem Code
Private Sub Befehl0_Click()
Dim icounter As Integer
Dim xwert As Integer
Dim intervall As Integer
Dim oldma As Integer
Dim macount As Integer
Dim i As Integer
Dim rs As ADODB.Recordset
Dim sq As String
sq = "select * from xtaba"
Set rs = New ADODB.Recordset
rs.ActiveConnection = CurrentProject.Connection
rs.Open sq, , adOpenDynamic, adLockOptimistic
icounter = 0
xwert = 37
intervall = 8
oldma = 1
macount = 0
Do While Not rs.EOF
If rs!ma <> oldma Then 'MA wechselt, d.h. wir sind wieder beim 1.Januar
oldma = rs!ma 'neuen Ma merken
macount = macount + 1 'MA-Zähler erhöhen und ...
For i = 1 To macount '... entspr. viele Tage überspringen
rs.MoveNext
Next
xwert = 37
icounter = 0 'ab hier starten wir (fast) ...
End If
icounter = icounter + 1 '... denn erst jetzt ist der Startzähler gesetzt
If icounter Mod intervall = 0 Or _
icounter = 1 Then 'wenn das Intervall erreicht ist oder wir gerade gestartet haben ...
rs!xw = xwert '... schreiben wir den xwert in die Tabelle und ...
rs.Update
xwert = xwert + 1 '... erhöhen ihn ...
If xwert > 39 Then xwert = 37 '... innerhalb der vorgegebenen Grenzen
End If
rs.MoveNext 'weiter zum nächsten Record
Loop
rs.Close
End Sub
habe ich jetzt schon mal alle x-Werte richtig eingetragen.
An diesem Code muss jetzt weiter gebastelt werden - lass mir etwas Zeit.
lg
crystal
Lieber xoar,
hat etwas gedauert, aber ich habe eine Lösung gebaut und getestet, allerdings erstmal nur für 3 Mitarbeiter.
Zur Bedienung:
0. stelle im VBA-Fenster unter Extras einen Verweis auf Active-X-Dataobjects Vers.xx (letzte ist beste) her
1. öffne xtab. Du findest dort einen einzelnen x-wert (38), eingetragen am 27.12.2015 (ja 2015) für MA1.
2. öffne Formular1 und klicke auf "Befehl0".
3. wechsle zurück zu xtab und du siehst die Zahlen 38, 39, 37 usw. im Abstand von je 8 Tagen eingetragen. Wenn du runterscrollst, wird dir auffallen, dass für MA2 (MA3) und Dez. 2015 keine Werte eingetragen wurden.
4. zurück in Formular1 kannst du dann zum Testen alle x-Werte wieder löschen (Button reset). Dann musst du aber manuell einen neuen Wert in xtab eintragen (z.B. 37 am 26.12.2015) und kannst dann Befehl0 wieder anklicken.
Ich hoffe, diese erste Lösung entspricht deinen Vorstellungen und übersteht deine Tests. ;-)
Was jetzt noch zu tun ist, ist die spezielle Situation zu berücksichtigen, wenn man einen 8., 16. oder 24. MA bearbeitet...
Viel Erfolg beim Testen. Meine db ist unter acc2016 gebaut. Ich hoffe, das passt. Aber ich habe auch eine mdb eingepackt (acc2002 ff.).
Und sorry - ich habe kein Error-Handling eingebaut, musst du dann selber machen.
lg
crystal
PS: Erweiterungen mache ich dann in den folgenden Tagen...
Ja cool danke.
Ich arbeite mit der 2010er. Kann sie selber erst am Dienstag testen, da ich erst dann wieder auf der Arbeit bin.
Werd dir aufjedenfall eine Rückmeldung geben!
Hallo xoar,
so, es ist nun fertig. In der alten Version waren noch Fehler, bitte löschen.
Nicht vergessen: Verweis auf ADODB.
Ich hab die Tabelle auf 12 MA aufgepumpt und noch ein Formular2 gebastelt, zur Visualisierung des Ergebnisses (mit fest eingestelltem Jahr 2016, Rollbalken funktionieren nicht).
Zum Testen öffne Formular1, Formular2 und xtab. Wechsel dann zurück zu Formular1 und klick auf "x eintragen". Das Ergebnis siehst du dann "sofort" in xtab und Formular2.
Neuer Versuch? Einfach "reset" klicken, einen Startwert im Dez. 2015 eintragen und "x eintragen" klicken.
Viel Spaß beim Testen.
lg
crystal
PS: ich hab noch eine Excel-Tabelle zum Füllen von xtab beigefügt. Wenn du den Dez. 2015 rauslöschst und die MA-Spalte um je 12 erhöhst, hast du 12 weitere Test-MA für xtab (einfach importieren und an xtab anfügen).
Super vielen dank! Ich werd mir morgen alles genau anschauen und berichten.
:D
@crystal
Perfekt, klappt super, dank deiner Dokumentation ist auch alles gut nachvollziehbar.
Bist mein persönlicher Tagesheld.
*Daumen hoch*
Grüße
Hallo xoar,
na - das freut mich aber.
Es gibt noch einen kleinen Logik-Fehler: das letzte x-Datum im Dezember muss innerhalb der Intervalls liegen, d.h. es muss nach dem 23.12. eingetragen sein (31-8). Aber das ist in der Praxis dann sicherlich der Fall und kommt ja erst 2017 zum Tragen.
Viel Erfolg bei der Umsetzung in deine Anwendung und Danke für den "Tagesheld" - ich fühle mich geschmeichelt...
lg
crystal