Variabeln Replacen
lima-city → Forum → Programmiersprachen → Basic
anfang
berechnen
code
dauer
ende
feld
funktion
gesamtdauer
http
minute
problem
string
stunden
system
tag
text
uhr
url
wichtig minuten
wichtig stunden
-
Hallo Zusammen,
Ich bastel mir derzeit ein kleines Programm um meine Arbeitstag/stunden">stunden auszurechnen.
Der aufbau ist relativ einfach gehalten.
31 Textboxen - 31 Variabeln.
Nun stoße ich auf ein Problem , auf der Stempelkarte ist die Uhrzeit in Dezimalzahlen geschrieben und das soll natürlich voher umgewandelt werden.
Es kommen nur folgende Dezimalzahlen vor:
:00
:05
:10
:15
:20
:25
:30
:35
:40
:45
:50
:55
:60
:65
:70
:75
:80
:85
:90
:95
Vor dem Doppelpunkt steht jeweils die Stunde Beispielsweise jetzt 12:35.
nun muss alles nach dem Doppelpunkt ausgetauscht werden.
05 ->3
10 ->6 usw.
Doch wie mache ich das? :)
Variabel Typ ist String
LG
Beitrag zuletzt geändert: 12.1.2014 22:11:28 von marvinkleinmusic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
1. Warum nicht einfach ausrechnen? Dafür musst du natürlich den String los werden. ;) Schau doch mal, ob es da ein Konstrukt deiner Sprache gibt oder du die Zahlen auch als Integer bekommen kannst.
2. Regex wäre zwar aufwändig, könnte aber auch helfen. -
Wie ist denn das genau Format? Werden die Stunden auch immer durch zwei Zeichen repräsentiert, also 6:00 Uhr, oder 06:00 Uhr? Das wäre nämlich interessant für die Verwendung in Left$ zur Ermittlung der Anzahl in Stunden. DIe Minuten jedenfalls würdest du über Right$ herausbekommen als String:
http://www.vbarchiv.net/workshop/workshop_27-left-right-und-mid-funktion-ganz-neu-und-mit-klasse.html
Anschließend könntest du den String in eine Zahl umwandeln:
http://stackoverflow.com/questions/7708838/how-do-i-convert-from-a-string-to-an-integer-in-visual-basic
und damit in Stunden umrechnen, indem du durch 100 dividierst und mit 60 mutliplizierst.
Hättest du also den Text "6:50" aus der Stempelkarte (was für 6:30 Uhr steht) würdest du die 50 bekommen, durch 100 x 60 = 30. -
Hallo ihr zwei! :)
Ersteinmal danke für eure Hilfe !:)
Ersteinmal so sieht derzeit der Umrechner aus und die Zahlen müssen in diesem Format so eingegeben werden.
http://s7.directupload.net/images/140113/aqjl2uqk.png
Wie man sehen kann habe ich den Rechner ein wenig Verändert sodass wir jetzt Insgesammt auf 31 x 4 Textboxen kommen. (Kommt - Geht Zur Pause - Wieder da - Feierabend.
Nun stoße ich auf 2 Probleme.
Das erste betrifft ja das Replacen sprich (@burgi dieser Artikel ist eine Große Hilfe , ebenso wie das /100x60 (Y) ).
Doch wie kann ich jetzt genau Auf den ersten Wert zugreifen und wie auf den zweiten Muss ich die jeweils in einer Variabel abspeichern oder geht das irgendwie einfacher?
Das zweite Problem besteht dadraus , das er der Umrechner auch ein Ergebnis ausgeben soll , doch ich weis nicht genau wie ich an dieses kommen kann.
Beispielsweise jetzt die ersten zwei Werte von Tag 1 sind jetzt:
Gekommen 06:45 ---> Umgerechnet 06:27 Uhr
Gegangen 14:05 ---> Umgerechnet 14:03 Uhr -->Macht 07:36 Stunden
Wie komme ich jetzt auf die Stunden und Minuten Zeitspanne , von der Zeit wie lange ich da war?
Es sind jeweils immer 4 Textboxen für einen Tag da.
LG
Beitrag zuletzt geändert: 13.1.2014 15:02:36 von marvinkleinmusic -
Also ich würde das so lösen:
Ich habe kurz einen Teil deines Programms nachgebastelt:
http://burgi.lima-city.de/forum/formular.png
Der Code für den Klick auf Button1 wäre in dem Beispiel dann dieser hier:
1234567891011121314151617181920212223242526272829303132333435363738394041Private
Sub
Button1_Click(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
Button1.Click
Dim
Dauer1
As
Integer
Dim
Dauer2
As
Integer
Dim
Anfang, Ende
Dim
Dauer
As
Integer
Dim
Dauer_Stunden
As
Integer
Dim
Dauer_Stunden_Str
As
String
Dim
Dauer_Minuten
As
Integer
Dim
Dauer_Minuten_Str
As
String
'ANFANG
'Stunden Anfang, WICHTIG: Stunden zweistellig!!
Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(TextBox1.Text, 2))
'Minuten Anfang, WICHTIG: Minuten zweistellig!!
Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(TextBox1.Text, 2))
'Anfang in Minuten umgerechnet
'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
Anfang = Dauer1 * 60 + Dauer2 / 100 * 60
'ENDE
'Stunden Anfang, WICHTIG: Stunden zweistellig!!
Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(TextBox2.Text, 2))
'Minuten Anfang, WICHTIG: Minuten zweistellig!!
Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(TextBox2.Text, 2))
'Ende in Minuten umgerechnet
'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
Ende = Dauer1 * 60 + Dauer2 / 100 * 60
'Dauer vormittag in Minuten
Dauer = Ende - Anfang
Dauer_Stunden = Dauer \ 60
'ganzzahlige Division
If
Dauer_Stunden < 10
Then
Dauer_Stunden_Str =
"0"
& Convert.ToString(Dauer_Stunden)
Else
Dauer_Stunden_Str = Convert.ToString(Dauer_Stunden)
End
If
Dauer_Minuten = Dauer - Dauer_Stunden * 60
If
Dauer_Minuten < 10
Then
Dauer_Minuten_Str =
"0"
& Convert.ToString(Dauer_Minuten)
Else
Dauer_Minuten_Str = Convert.ToString(Dauer_Minuten)
End
If
TextBox5.Text = Convert.ToString(Dauer_Stunden_Str) &
":"
& Convert.ToString(Dauer_Minuten_Str)
End
Sub
Der Code ist absichtlich mit vielen Zwischenschritten, um es für dich verständlich zu halten. Du kannst ja dann Schritte zusammenfassen!
Du musst natürlich auch die Ergebnisse (Dauer) nicht anzeigen, du kannst das auch in Variablen speichern. Aber so ist es einfacher nachzuvollziehen, und man sieht sofort, ob das Ergebnis stimmt. -
Hallo nochmal!
Das ist ja Spitze!
Besonders die Gründliche Kommentierung hat mir sehr weitergeholfen!
Jetzt kommt nur die Frage Wie ich das am Einfachsten für jeden Tag hinbekomme Da ja jeder Tag 4 Kästchen hat bräuchte ich dann ja 4 * 2 Variabeln Pro Tag das ganze mal 31 --->248 Variabeln.
Kann man dies noch einfacher Regeln?
LG -
marvinkleinmusic schrieb:
Kann man dies noch einfacher Regeln?
LG
Logisch: Schreib dir eine Funktion BerechneDauer, welcher du die Inhalte der beiden Textboxen Anfang und Ende übergibst, und der Rückgabewert ist die Dauer. Das wäre die einfachste Lösung meiner Meinung nach, weil dann hast du nur die Variablen in der Funktion, und auch nur einmal, und die wird immer wieder aufgerufen -
Hallo nochmal,
Ich bin ein absoluter Noob bezüglich Visual Basic.
Wie soll soeine Funktion denn aussehen?
und gibt es auch eine möglichkeit nur mit dieser Einen Funktion , auch die Werte für Tag 2-31 Ebenfalls zuberechnen?
(Da kommt dann wieder das problem das Leere Felder als 00:00 gezählt werden müssen)
Wenn du mir vielleicht noch zeigen könntest wie man 2 Tage sehr Simple mit Hilfe einer Funktion Berechnen kann und diese dann am Ende zusammen zählt , wäre ich einen riesen Schritt weiter! :)
(Ich nehme mal an eine Variabel endergebnis = tag1 + tag2 +tag3 usw)
LG -
Ne, das Summieren wäre auf jeden Fall mit einem Feld einfacher, da man da eine Schleife durchlaufen lassen kann. Würde dann so aussehen:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071Private
Function
BerechneDauer(
ByRef
BeginnStr
As
String
,
ByRef
EndeStr
As
String
)
As
Integer
' gibt die Dauer aus zwei Textfeldern als Ineger in Minuten zurück
Dim
Dauer1
As
Integer
Dim
Dauer2
As
Integer
Dim
Anfang, Ende
'ANFANG
'Stunden Anfang, WICHTIG: Stunden zweistellig!!
Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(BeginnStr, 2))
'Minuten Anfang, WICHTIG: Minuten zweistellig!!
Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(BeginnStr, 2))
'Anfang in Minuten umgerechnet
'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
Anfang = Dauer1 * 60 + Dauer2 / 100 * 60
'ENDE
'Stunden Anfang, WICHTIG: Stunden zweistellig!!
Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(EndeStr, 2))
'Minuten Anfang, WICHTIG: Minuten zweistellig!!
Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(EndeStr, 2))
'Ende in Minuten umgerechnet
'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
Ende = Dauer1 * 60 + Dauer2 / 100 * 60
'Dauer vormittag in Minuten
BerechneDauer = Ende - Anfang
End
Function
Private
Function
MinutenInStunden(
ByRef
Dauer
As
Integer
)
As
String
' gibt das Ergebnis als String für die Anzeige und/oder das Abspeichern zurück
Dim
Dauer_Stunden
As
Integer
Dim
Dauer_Stunden_Str
As
String
Dim
Dauer_Minuten
As
Integer
Dim
Dauer_Minuten_Str
As
String
Dauer_Stunden = Dauer \ 60
'ganzzahlige Division
If
Dauer_Stunden < 10
Then
Dauer_Stunden_Str =
"0"
& Convert.ToString(Dauer_Stunden)
Else
Dauer_Stunden_Str = Convert.ToString(Dauer_Stunden)
End
If
Dauer_Minuten = Dauer - Dauer_Stunden * 60
If
Dauer_Minuten < 10
Then
Dauer_Minuten_Str =
"0"
& Convert.ToString(Dauer_Minuten)
Else
Dauer_Minuten_Str = Convert.ToString(Dauer_Minuten)
End
If
MinutenInStunden = Convert.ToString(Dauer_Stunden_Str) &
":"
& Convert.ToString(Dauer_Minuten_Str)
End
Function
Private
Sub
Button1_Click(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
Button1.Click
Dim
DauerFeld_vormittag(0
To
30)
As
Integer
Dim
DauerFeld_nachmittag(0
To
30)
As
Integer
Dim
i
As
Integer
Dim
Gesamtdauer
As
Integer
Dim
GesamtdauerStr
As
String
'Dauer für vormittag in Minuten im Feld ablegen
DauerFeld_vormittag(0) = BerechneDauer(TextBox1.Text, TextBox2.Text)
TextBox5.Text = MinutenInStunden(DauerFeld_vormittag(0))
'Dauer für nachmittag in Minuten im Feld ablegen
DauerFeld_nachmittag(0) = BerechneDauer(TextBox3.Text, TextBox4.Text)
TextBox6.Text = MinutenInStunden(DauerFeld_nachmittag(0))
'hier den Code für die restlichen Tage berechnen
'
'
'Gesamtsumme berechnen:
Gesamtdauer = 0
For
i = 0
To
30
Gesamtdauer = Gesamtdauer + DauerFeld_vormittag(i)
Gesamtdauer = Gesamtdauer + DauerFeld_nachmittag(i)
Next
GesamtdauerStr = MinutenInStunden(Gesamtdauer)
Label5.Text =
"Summe: "
& GesamtdauerStr
End
Sub
Ich würde für meinen Code natürlich keine derartigen Funktions-Namen verwenden, allerdings denke ich, dass das den Code ganz gut für dich erklärt -
Huhu!
Ich danke dir ich habe es Erfolgreich geschafft Tag 2 mithilfe des Codes mit zu Berechnen!
Doch es gibt noch ein entscheidendes Problem.
Angenommen ich komme an Tag 1 nur 1 mal und gehe einmal , dann bleiben 2 Kästechen Leer.
Dann stürzt wieder das Programm ab weil die value von 2 Boxen leer ist.
Es muss noch eingebaut werden das leere Kästchen immer den wert 00:00 haben sonst bringt das nichts! :)
Einmal Fehlermeldung in VB: Die Eingabezeichenfolge hat das falsche Format.
LG
-
marvinkleinmusic schrieb:
Es muss noch eingebaut werden das leere Kästchen immer den wert 00:00 haben sonst bringt das nichts! :)
Dann mach das doch!?
Was ist denn dabei, den Standard-Text der Textboxen auf "00:00" zu setzen?
Andere Lösung: eine If-Abfrage in die Funktion zum Berechnen der Dauer in Minuten einbauen, die prüft, ober der Text = "" (also leer ist) ist, und wenn das Feld leer ist, mit 0 rechnen, oder die Berechnung komplett auslassen.
Das wirst du wohl selber hinbringen -
Hmm auch das bekomme ich nicht hin , ich habe mal ein wenig gegoogelt aber ich weis nicht wo ich die if Bedingung einbauen muss und auch nicht wie ich die Leeren TextBoxen nur Ansprechen kann , ich habe es mal so versucht allerdings ohne erfolg:
If TextBox(i).Text = "" Then TextBox(i).Text = "00:00" End If
-
Ich weiß ja nicht, welchen BASIC-Dialekt Du nutzt. (von mir überlesen, oder von dir nicht erwähnt.), aber es sollte doch eine Funkition wie split() geben.
Für dich nutzbar als
Dim Zeitwert = split(Datenerfassungswert, ":")
Zeitwert ist dann ein Array aus Stunden und 100stel, Die 100stel kannst Du dann, wie von Burgi empfohlen, in Sekunden wandeln
Daraus sollte sich ein gültiges Zeitformat deines verwendeten Basic-Dialektes erstellen lassen, das, mit sicher voirhandenen Date-/Time-Funktionen, weiter zu verarbeiten ist. Eine Auswertung wie Dauer = Endzeit - Startzeit und anschließende SummierungAuswertung derselben, sollte dann kein Problem mehr darstellen
Beitrag zuletzt geändert: 14.1.2014 3:30:51 von fatfreddy -
Hmm das hilft mir so alles nicht weiter.
Ich suche einen weg ganzeinfach alle leeren Textboxen die übermittelt werden , den wert 00:00 zuzuweisen.
LG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage