Hallo alpines,
zB:
01.01.2017 10:01 ABC
01.01.2017 10:01 ABC XYZ
...
VIelen Dank.
Hallo alpines,
zB:
01.01.2017 10:01 ABC
01.01.2017 10:01 ABC XYZ
...
VIelen Dank.
Hallo alpines,
perfekt.
Nur mal für mich, was muss ich wo verändern wenn ich danach noch mehr Einträge in der Datei habe?!
Vielen Dank.
vielen Dank.
Leider funktioniert es nur bis 09:59, alle Einträge ab 10:00 Uhr werden leider nicht gezählt.
Hallo autoiter,
sieht einfacher aus, ich finde nur nicht was ich verändern muss.
Er zeigt es nach deinem Script wie folgt an:
Da fehlt nun das auslesen der Uhrzeit.
Vielen Dank euch beiden.
Hallo zusammen,
ich habe mal wieder ein Problem
Irgendwie verstehe ich die Arrays einfach nicht, habe das so wie ich das verstehen würde angepasst, leider ohne Erfolg.
Ich möchte alle Daten aus einer TXT auslesen und dann in eine csv konvertieren.
Die TXT ist wie folgt aufgebaut:
01.01.2017 00:02
01.01.2017 00:10
....
Ich möchte folgende Daten auslesen:
Tag Anzahl Einträge.
Beispiel:
01.01.2017 00:00 - 00:59 3 Einträge
01.01.2017 01:00 - 01:59 4 Einträge
...
Vielen Dank vorab.
#include <array.au3>
Global $sSep=" " ;Trennzeichen zwischen Spalten in der Tabelle
$sFileData=FileRead("C:\Test\Datum.txt")
local $arResult=StringRegExp($sFileData,"(?m)^\d\d.(\d\d).\d\d\d\d"&$sSep&"(*?:*?)",4);RegExpPattern um das wichtige zu FilternRegExpPattern um das wichtige zu Filtern
;(?m) sagt das ^ den Zeilenanfang sucht, nicht den Textanfang
;\d ist eine Zahlm also wird dort das Datum gesucht. Die () um den Monat sorgen dafür, dass dieser Teil einen eigenen Eintrag im Array bekommt. (Capture Group)
;Danach kommt der Spalten Trenner. Das ?: in den () Danach, sagt, dass die Klammer ein Ausdruck ist, der nicht gematcht werden soll. Somit wird die Spalte danach übergangen
;Und die Spalte danach wird als Gebäude wieder gespeichert. (.*?) findet alles, bis das danach kommt, hier also der Spaltentrenner
;Für genauere Infos sieh dir die Hilfe zu StringRegExp an :)
local $arEntryDates[0][2];Array anlegen, indem für jedes Gebäude ein Array gespeichert wird
for $i=0 to UBound($arResult)-1 step 1;Alle funde durchgehen
local $arInsert=$arResult[$i];Auf das jeweilige Ergebnis zugreifen
local $index=_ArraySearch($arEntryDates,$arInsert[2],0,0,0,0,1,0);Gucken, ob das Gebäude bereits einen Eintrag hat
if $index=-1 then;Wenn nicht einen neuen anlegen
$index=UBound($arEntryDates)
ReDim $arEntryDates[UBound($arEntryDates)+1][2];Array um 1 vergrößern
local $tmp[0][2];ein 2d Array für Monat und Count anlegen
$arEntryDates[$index][0]=$arInsert[2];Gebäudenamen reinschreiben
$arEntryDates[$index][1]=$tmp;Array eintragen
endif
local $arGet=$arEntryDates[$index][1];Array zu dem Gebäude abrufen
local $indexSec=_ArraySearch($arGet,$arInsert[1],0,0,0,0,1,0);Nachsehen, ob der Monat schon einen Eintrag hat
if $indexSec<0 then;Wenn nicht einen neuen Erstellen
$indexSec=UBound($arGet)
ReDim $arGet[$indexSec+1][2];Array vergrößern
$arGet[$indexSec][0]=$arInsert[1];Monatsnummer
$arGet[$indexSec][1]=1;Ersten Count, den aktuellen
else
$arGet[$indexSec][1]=$arGet[$indexSec][1]+1;Sonst den Zähler an der Stelle, wo der Monat gefunden wurde erhöhen
endif
$arEntryDates[$index][1]=$arGet;Array zurückschreiben, da AutoIt Arrays kopiert und keine Pointer nimmt
next
local $sErg=""
for $i=0 to UBound($arEntryDates)-1 step 1
$sErg&=$arEntryDates[$i][0]&@crlf;Den Gebäudenamen hinzufügen
local $arTmp=$arEntryDates[$i][1];Array abfragen
_ArraySort($arTmp);Sortieren, damit die Monate untereinander in der richtigen Reihenfolge sind und nicht nach dem ersten Fund sortiert sind
for $j=0 to UBound($arTmp)-1 step 1;Alle Monate durchlaufen und an den String anhängen
$sErg&=$arTmp[$j][0]&$sSep&$arTmp[$j][1]&@crlf
Next
next
MsgBox(48,"",$sErg)
FileWrite("C:\Test\Auswertung.csv",$sErg)
Alles anzeigen
Das anpinnen kann gelöscht werden, 95% der Video gehen nicht mehr.
Der Oscar macht die Menschen glücklich, sieht richtig gut aus.
Das sieht ja ganz schön aufwendig aus, wo liegen wir hier preislich?
Warum nicht, interessant zu sehen wie du es umsetzt
Alles gute auch von mir
Hallo Kanashius,
alle Personen welche das bekommen wissen nicht wie man sowas nur Ansatzweise hinbekommen kann.
ABER
Wenn jemand unbedingt an die Daten will kann es gut möglich sein das dies wo auch immer landet, muss ehrlich gestehen das mit dem Inhalt habe Ich völlig ausser acht gelassen.
Wie immer wurde mir gut geholfen, das Thema ist somit abgeschlossen.
Hallo ihr 2,
natürlich kann man das auch über eine Webseite machen, ich finde das als Programm aber schöner.
Aber an das Thema das jemand die Berechnung klauen kann habe ich gar nicht gedacht.
Dann wird wohl Autoit ausscheiden
Hallo zusammen,
ich bins mal wieder
Wie der Name schon sagt suche ich verschiedene Möglichkeiten ein Programm zu sichern.
Ich möchte ein Berechnungstool für die Firma schreiben, viele benötigen Stunden um Angebote zu erstellen, dass ist aber eigentlich (für mich zumindest) keine Große Sache ( ich liebe Zahlen )
Um nun aber Missbrauch zu unterbinden suche ich verschiedene Möglichkeiten das Programm zu sichern, ein einfaches Login möchte ich nicht, jedem der das Tool nicht mehr nutzen darf hat die Logindaten ja schon bekommen.
Mir schwebt eine Abfrage eine Datei im Internet vor, ich kopiere auf den Server eine TXT in dieser ist nur der Code, hat den Code jemand darf er das Programm nutzen, gibt er es falsch ein löscht sich die Datei nach der 3. falschen Eingabe automatisch vom Rechner.
Das mit der TXT ist nur ein Beispiel.
Habe schon im Forum danach gesucht aber nichts gefunden.
Des weiteren hoffe Ich so vielleicht noch bessere / andere Möglichkeiten zu erhalten.
Vielen Dank an alle.
PS: Tobt euch richtig aus
Hallo zusammen,
ich baue mir gerade ein eigenes Script was die Arbeit erleichtern soll.
Ich bekomme es aber nicht hin das er mir Einträge in excel schreibt ohne das er die Datei permanent geöffnet haben muss, geht das nicht irgendwie im Hintergrund
Danke vorab.
Nachfolgend der Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("Abarbeitung", 800, 640, 192, 114)
$lKundennummer = GUICtrlCreateLabel("Kundennummer:", 5, 16, 78, 17)
$iKundennummer = GUICtrlCreateInput("", 96, 16, 89, 21)
$Speichern = GUICtrlCreateButton("Speichern", 600, 600, 73, 25)
$Drucken = GUICtrlCreateButton("Drucken", 700, 600, 73, 25)
$lKundenname = GUICtrlCreateLabel("Kundenname:", 5, 48, 78, 17)
$iKundenname = GUICtrlCreateInput("", 96, 48, 89, 21)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
;EXCEL
Local $oExcel = _Excel_Open()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Fehler in Excel", "Fehler in Excel." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Test\test.xlsx")
If @error Then
MsgBox($MB_SYSTEMMODAL, "Fehler in Excel", "Fehler in Excel." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
EndIf
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Speichern
$rKundennummer = GUICtrlRead($iKundennummer) ;Kundennummer
$rKundenname = GUICtrlRead($iKundenname) ;Kundenname
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $rKundennummer, "B1") ;in Excel schreiben
EndSwitch
WEnd
Alles anzeigen
Hallo Oscar, hallo firewalldevil,
ich bin absoluter Beginner, selbst ich kann dir das "machen".
Aber Oscar hat es mehr als verdient, gutes Gelingen.
MFG
Hallo Kanashius,
vielen Dank für deine ausführliche Antwort.
Ich werde das, mit Hilfe, versuchen.
Hallo Oscar,
das wäre die XXL Umsetzung, nicht alles ist zwingend notwendig.
Es würde natürlich reichen wenn die Basics gehen, die Wünsche wäre natürliche ein Traum.
Basics:
Mitarbeiter anlegen können
Kalender unendlich
Stunden hinten fest verankert
Samstag Sonntag Feiertage farblich
Schichten anlegen
Zeiten der Schichten
Maximalschichten
Ruhezeiten zwischen Schichten
Mitarbeiter Schichten zuordnen welche sie können /dürfen
EDIT:
Sofern das nicht viel Arbeit macht würde ich gern mal wissen wielange man dafür ungefähr brauchen würde
Entschuldigung für den Doppelpost, ich finde das ist so übersichtlicher als wenn ich das an den anderen so ranklatsche.
Es handelt sich um ca. 20 Mitarbeiter.
Wünsche:
- Unendlicher Plan Verschiebung des Datum nach rechts und links. ( die Stundenanzeige bleibt immer am Ende fest, egal wie man das Datum verschiebt)
- Vielleicht noch ein Feld wo man zu einem bestimmten Datum springen kann
- Jeder Mitarbeiter bekommt eine eigene Einstellung (Welche Schicht kann er, gibt es minimal / maximalstunden was soll passieren wenn diese unterschritten / überschritten sind)
- E-Mailversendung der Pläne (jeweils nur der Mitarbeiter)
- Auswahlmöglichkeit zum Drucken (einzelne Mitarbeiter / Monatsübersicht / Tagesplan / Wochenplan)
- Hinterlegung von Hinweisen zu bestimmten Tagen (durch Admin)
Grundsätzliche Einstellungen
- Login
- Adminkonto (kann alles) / Disponent (Kann nur Schichten buchen und Drucken)
- Logbuch über alle Tätigkeiten
- Maximalschichten am Stück
- Eingabe der Schichten die es gibt
- Eingabe der Zeiten der jeweiligen Schichten
- Pausen zwischen den Schichten (11 Stunden dürfen nicht unterschritten werden, wenn doch Info (msgbox o.ä.)
- Feiertage rot o.ä. / Samstag grau o.ä. / Sonntag dunkelgrau o.ä.
Frage:
Sofern möglich, Zusammenführung aller Pläne in einem Masterplan
Beispiel:
Plan A wird durch Disponent A geschrieben
Plan B wird durch Disponent B geschrieben
...
Admin will nun wissen ob nicht Mitarbeiter A von Plan A auf Plan B aushelfen kann.
Ich habe absolut keine Ahnung ob das überhaupt geht und was das für ein Aufwand ist.
Frage2:
Beim Starten des Programmes wird dem Admin die Arbeit auf einer HDD / SQL Datenbank angeboten, je nach Auswahl legt das Programm die Standartdaten an und speichert diese in einer ini o.ä.
Allgemein:
Jetzt wo ich mir die Punkte (und da fallen mir sicher noch viel mehr ein) so ansehe, klingt das nach sehr sehr viel Arbeit, zumindest für mich als Autoit Neuling.
Ich helfe wie schon erwähnt bei allem was nur irgendwie geht mit.
Sollte der Aufwand nun so enorm sein das du dafür 6 Monate benötigst oder das so nebenbei gar nicht gehen, können wir das ganze auch einfach lassen.
Hallo Oscar, hallo Alina,
vielen Dank für eure Antworten.
Das du dies nun gleich schreiben ist natürlich sehr nett von dir, was genau würde ich schreiben, es könnten ja dann alle zusätzliche Ideen einbringen, muss ja nicht nur auf mich zugeschnitten sein.
Sollte es etwas geben wo ich dir helfen kann schreib es mir. Ich werde zu 100% Helfen wo ich kann!
@Alina, das ist mir klar das man dies Sperren kann, aber das Eingabefeld selbst kann man schlecht sperren Auch dort ist / war Code hinterlegt.
Hallo Oscar,
da hast du wohl Recht, ich wusste das es auf Arrays hinausläuft, ich habe das noch nicht verstanden.
Kann ich nicht Excel dateien komplett einlesen und in der Datei Änderungen vornehmen
Könnte die Datei ja sicherlich mit einem Kennwort schützen und das im Autoit einlesen.
EDIT:
Ok Excel einlesen ist nicht weiter schwer, aber das macht doch kein Sinn und ist unendlich umständlich wenn ich jeden Eintrag einzeln einlese.
Nachfolgend der Code
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Excel.au3>
; *****************************************************************************
; Excel öffnen
; *****************************************************************************
Local $oExcel = _Excel_Open()
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Fehler in der Exceldatei", & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\Test.xlsx")
If @error Then
MsgBox($MB_SYSTEMMODAL, "Fehler in der Exceldatei", "" & @ScriptDir & "\Test.xlsx'." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
_Excel_Close($oExcel)
Exit
EndIf
; *****************************************************************************
; Lesen der Daten aus der Excel
; *****************************************************************************
Local $Name = _Excel_RangeRead($oWorkbook, Default, "A1", 2)
Local $Mitarbeiter1 = _Excel_RangeRead($oWorkbook, Default, "A2", 2)
Local $Mitarbeiter2 = _Excel_RangeRead($oWorkbook, Default, "A3", 2)
Local $Mitarbeiter3 = _Excel_RangeRead($oWorkbook, Default, "A4", 2)
Local $Mitarbeiter4 = _Excel_RangeRead($oWorkbook, Default, "A5", 2)
Local $Mitarbeiter5 = _Excel_RangeRead($oWorkbook, Default, "A6", 2)
Local $Mitarbeiter6 = _Excel_RangeRead($oWorkbook, Default, "A7", 2)
Local $Mitarbeiter7 = _Excel_RangeRead($oWorkbook, Default, "A8", 2)
Local $Mitarbeiter8 = _Excel_RangeRead($oWorkbook, Default, "A9", 2)
Local $Mitarbeiter9 = _Excel_RangeRead($oWorkbook, Default, "A10", 2)
Local $Soll = _Excel_RangeRead($oWorkbook, Default, "A11", 2)
Local $Hinweis = _Excel_RangeRead($oWorkbook, Default, "A12", 2)
If @error Then Exit
_Excel_Close($oExcel)
; GUI
$hMainGui = GUICreate("Dienstplan", 1000, 450, 100, 200, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x0000FF)
$idListview = GUICtrlCreateListView($Name & "|01.01.16|02.01.16|03.01.16|04.01.16|05.01.16|...|Stundenanzahl", 20, 10, 950, 300)
$hListview = GUICtrlGetHandle($idListview)
$button1 = GUICtrlCreateButton("Monatsübersicht Drucken", 100, 420, 150, 20)
$button2 = GUICtrlCreateButton("Login für Änderungen", 300, 420, 150, 20)
$item1 = GUICtrlCreateListViewItem($Mitarbeiter1, $idListview)
$item2 = GUICtrlCreateListViewItem($Mitarbeiter2, $idListview)
$item3 = GUICtrlCreateListViewItem($Mitarbeiter3, $idListview)
$item4 = GUICtrlCreateListViewItem($Mitarbeiter4, $idListview)
$item5 = GUICtrlCreateListViewItem($Mitarbeiter5, $idListview)
$item6 = GUICtrlCreateListViewItem($Mitarbeiter6, $idListview)
$item7 = GUICtrlCreateListViewItem($Mitarbeiter7, $idListview)
$item8 = GUICtrlCreateListViewItem($Mitarbeiter8, $idListview)
$item9 = GUICtrlCreateListViewItem($Mitarbeiter9, $idListview)
$item10 = GUICtrlCreateListViewItem($Soll, $idListview)
$item11 = GUICtrlCreateListViewItem($Hinweis, $idListview)
$hInputGui = GUICreate("", 100, 24, -1, -1, $WS_POPUPWINDOW, Default, $hMainGui)
GUISetBkColor(0xFFFFFF)
$idInput = GUICtrlCreateInput('', 0, 0, 100, 24)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
$idCloseButton = GUICtrlCreateButton('close', 0, 50, 10, 10, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW, $hMainGui)
Global $iIndex, $iSubItem
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While True
$msg = GUIGetMsg(1)
Switch $msg[1]
Case $hMainGui
Switch $msg[0]
Case $GUI_EVENT_CLOSE
Exit
Case $button1
GUICtrlSetData($item1, "||Nachttest")
EndSwitch
Case $hInputGui
Switch $msg[0]
Case $idCloseButton
_GUICtrlListView_SetItemText($hListview, $iIndex, GUICtrlRead($idInput), $iSubItem)
GUISetState(@SW_HIDE, $hInputGui)
EndSwitch
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $tNMHDR, $hWndFrom, $iIDFrom, $iCode, $tInfo, $aMainPos, $sItemText
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hListview
Switch $iCode
Case $NM_CLICK
GUISetState(@SW_HIDE, $hInputGui)
Case $NM_DBLCLK
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
$iIndex = DllStructGetData($tInfo, "Index")
$iSubItem = DllStructGetData($tInfo, "SubItem")
$sItemText = _GUICtrlListView_GetItemText($hListview, $iIndex, $iSubItem)
GUICtrlSetData($idInput, $sItemText)
$aMainPos = WinGetPos($hMainGui)
WinMove($hInputGui, '', $aMainPos[0] + $iSubItem * 64, 58 + $aMainPos[1] + $iIndex * 19)
GUISetState(@SW_SHOW, $hInputGui)
GUICtrlSetState($idInput, $GUI_FOCUS)
ConsoleWrite(StringFormat('Index: %i, SubItem: %i\n', $iIndex, $iSubItem))
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Alles anzeigen
Hallo Oscar,
das sieht schon ganz schön gut aus.
wie kann ich die Daten in einer Datei ablegen, vorallem die geänderten.
Macht es Sinn für jeden Tag eine Datei anzulegen oder für jeden Mitarbeiter eine und die dann Einlesen?
Am liebsten würde ich noch Einstellungen zu den Schichten hinzufügen, dass nur die Schichten eingetragen werden können die auch in Einstellungen hinterlegt sind, dort ist dann auch die Stundenzahl hinterlegt, was er dann hinten addieren soll.
Vielen Dank.