Artikelverwaltung (Small Edition)

    • Offizieller Beitrag

    Hi,
    da ich mit meinem Warenwirtschaftsprogramm für unsere Außendienstler noch nicht fertig bin, mein Chef aber nach einer einheitlichen und regelmäßigen Inventur verlangt, habe ich mal schnell eine reine Artikelbestandsverwaltung zusammengezimmert.
    Typische Datenbankfunktionalität fehlt natürlich.
    Aber immerhin kann man hiermit:
    - Artikel erfassen, getrennt nach Massen- und Seriennummer-Artikeln
    - Massenartikel Bestand führen (absoluter Lagerwert)
    - Seriennummer-Artikeln führen, bei Lagerausgang (z.B. kurzfristig wg. Leihgabe) wird per Checkbox (* s. Kommentar) Status "Out" gesetzt und für Inventurwert nicht berücksichtigt
    - Lagerbestand ausdrucken oder
    - Lagerbestand (Inventur) per Mail versenden (Konfiguration in INI-Datei)
    Für kleine Anzahl von unterschiedlichen Artikeln ist das ganz praktikabel.


    * - Kommentar zu Checkbox
    Mir ist aufgefallen, dass die Checkboxen beim Sortieren ignoriert werden. ;(
    Darum mußte ich hier etwas umständlich erst für alle Einträge den Checkbox-Status prüfen. Falls markiert wird eine 1 in die Spalte geschrieben. Dann wird sortiert und anschließend der Checkbox-Status neu gesetzt und die 1 bzw. 0 aus der Spalte gelöscht.
    Das dauert leider mit zunehmender Anzahl der Einträge.
    Kennt hier vielleicht jemand einen Weg, die Checkboxen mit in die Sortierung einzubeziehen?

    Und hier das Ergebnis meiner sonntäglichen "Erholung" :rofl:
    (zum Test braucht ihr die angehängten Dateien)

    EDIT
    Hab nun doch noch eine Suche eingebaut, war sonst zu spartanisch. Den Dateianhang habe ich aber NICHT geändert. Also wer mag, das Script per Copy & Paste holen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiListView.au3>
    #include <GuiTab.au3>
    #include <file.au3>
    #include <GuiCombo.au3>
    #Include <GuiStatusBar.au3>
    Global $lvArtikel, $lvSerien
    Global Const $WM_NOTIFY = 0x004E
    Global Const $NM_FIRST = 0
    Global Const $NM_LAST = (-99)
    Global Const $NM_OUTOFMEMORY = ($NM_FIRST - 1)
    Global Const $NM_CLICK = ($NM_FIRST - 2)
    Global Const $NM_DBLCLK = ($NM_FIRST - 3)
    Global $hWndGUI
    Global $MsgID
    Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
    Dim $new = 0, $changed = 0, $inputA = 0, $inputS = 0, $CurrIndex = 0, $ArtUnit = "", $MengeNr = 0, $Comment, $iArtBez, $iArtNr, $mNotiz
    Dim $Fehler = 0, $massArt, $serArt, $cbLoadedA = 0,$cbLoadedS = 0, $INIchangedA = 0, $INIchangedS = 0
    Dim $text1_1 = " Artikelbezeichnung:", $text2_1 = " SN-Gerät:", $text1_2 = " Anzahl:", $text2_2 = " Seriennummer:"
    Local $a_PartsRightEdge[4] = [186, 447, 648, -1]
    Local $a_PartsText[4] = [$text1_1, "", $text1_2, ""]
    Dim $Required_Files[3]
    $Required_Files[0]= "VerwSmall.INI"
    $Required_Files[1] = "ser_art.vwg"
    $Required_Files[2] = "mass_art.vwg"
    For $i = 0 To 2
    If Not FileExists($Required_Files[$i]) Then
    MsgBox(262160, 'Fehler',"Datei: " & $Required_Files[$i] & " nicht im Anwendungspfad!"& @LF & @LF & _
    "Ohne diese Datei kann das Programm nicht ausgeführt werden!")
    $Fehler = 1
    EndIf
    Next
    If $Fehler = 1 Then Exit
    $INImail = IniReadSection("VerwSmall.INI", "mail")
    $INIgeraete = IniReadSection("VerwSmall.INI", "geraete")
    $INIartikel = IniReadSection("VerwSmall.INI", "artikel")
    Dim $smtpServer = $INImail[1][1], $AbsName = $INImail[2][1], $AbsAdress = $INImail[3][1], $ToAdress = $INImail[4][1]
    Dim $Betreff = $INImail[5][1], $Body = "", $UserName = $INImail[6][1], $UserPW = $INImail[7][1], $Port = $INImail[8][1]

    [/autoit] [autoit][/autoit] [autoit]

    $ArtikelGUI = GUICreate("Artikel", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
    $StatusBar = _GUICtrlStatusBarCreate ($ArtikelGUI, $a_PartsRightEdge, $a_PartsText)
    _GUICtrlStatusBarSetBKColor ($StatusBar, 0xEEE8AA)
    $TabArtikel = GUICtrlCreateTab(0, 120, 866, 429)
    $TabMassArt = GUICtrlCreateTabItem("Mengen - Artikel")
    $lvArtikel = GUICtrlCreateListView("Artikel-Bez.|Menge", 8, 144, 849, 385)
    GUICtrlSetTip(-1, "Sortieren mit Klick auf den Spaltenkopf")
    GUICtrlSendMsg($lvArtikel, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    _GUICtrlListViewSetColumnWidth(-1,0,250)
    _GUICtrlListViewSetColumnWidth(-1,1,80)
    _GUICtrlListViewJustifyColumn (-1, 1, 1)
    GUICtrlCreateTabItem("")
    $TabSNArt = GUICtrlCreateTabItem("Serien-Nr - Artikel")
    $lvSerien = GUICtrlCreateListView("Out|Gerätename|Herst.-SN|Info", 7, 144, 849, 385, -1,$LVS_EX_CHECKBOXES)
    GUICtrlSetTip(-1, "Sortieren mit Klick auf den Spaltenkopf")
    GUICtrlSendMsg($lvSerien, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($lvSerien, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    _GUICtrlListViewSetColumnWidth(-1,0,40)
    _GUICtrlListViewSetColumnWidth(-1,1,150)
    _GUICtrlListViewSetColumnWidth(-1,2,150)
    _GUICtrlListViewSetColumnWidth(-1,3,500)
    _GUICtrlListViewJustifyColumn (-1, 0, 2)
    _GUICtrlListViewJustifyColumn (-1, 2, 1)
    GUICtrlCreateTabItem("")
    $Group1 = GUICtrlCreateGroup("", 0, 0, 866, 118)
    $lArtBez = GUICtrlCreateLabel("Artikelbezeichnung", 8, 20, 90, 21)
    $lArtNrAnz = GUICtrlCreateLabel("Anzahl", 8, 56, 90)
    $iArtBez = GUICtrlCreateCombo("", 116, 17, 230, 21, BitOR($CBS_SORT, $CBS_DROPDOWN, $WS_TABSTOP))
    $iArtNr = GUICtrlCreateInput("", 116, 53, 230, 21, BitOR($ES_RIGHT, $ES_AUTOHSCROLL, $ES_READONLY, $WS_TABSTOP), $WS_EX_CLIENTEDGE)
    GUICtrlCreateLabel("Mengenartikel:", 8, 89, 80)
    $bPrintA = GUICtrlCreateButton("Drucken", 90, 86, 60, 21)
    GUICtrlSetTip(-1, "Ausdruck Lager-Bestand Mengenartikel")
    GUICtrlCreateLabel("SN-Artikel:", 185, 89, 60)
    $bPrintS = GUICtrlCreateButton("Drucken", 245, 86, 60, 21)
    GUICtrlSetTip(-1, "Ausdruck Lager-Bestand SN-Artikel")
    $bMail = GUICtrlCreateButton("Mailen", 375, 86, 60, 21)
    GUICtrlSetTip(-1, "Mailversand Lager-Bestand" & @LF & "Mengenartikel und SN-Artikel"& @LF & @LF _
    & "Zuerst SMTP-Server einrichten" & @LF & "in 'VerwSmall.INI'")
    $bFirstA = GUICtrlCreateButton("", 728, 16, 30, 29,$BS_BITMAP)
    GUICtrlSetImage(-1,@ScriptDir&"\button\first30x29.bmp")
    GUICtrlSetTip(-1,"Erster"& @LF &"Eintrag")
    $bLastA = GUICtrlCreateButton("", 760, 16, 30, 29,$BS_BITMAP)
    GUICtrlSetImage(-1,@ScriptDir&"\button\last30x29.bmp")
    GUICtrlSetTip(-1,"Letzter"& @LF &"Eintrag")
    $bPrevA = GUICtrlCreateButton("", 728, 48, 30, 29,$BS_BITMAP)
    GUICtrlSetImage(-1,@ScriptDir&"\button\prev30x29.bmp")
    GUICtrlSetTip(-1,"Voriger"& @LF &"Eintrag")
    $bNextA = GUICtrlCreateButton("", 760, 48, 30, 29,$BS_BITMAP)
    GUICtrlSetImage(-1,@ScriptDir&"\button\next30x29.bmp")
    GUICtrlSetTip(-1,"Nächster"& @LF &"Eintrag")
    $bNewA = GUICtrlCreateButton("", 728, 80, 30, 29,$BS_BITMAP)
    GUICtrlSetImage(-1,@ScriptDir&"\button\new30x29.bmp")
    GUICtrlSetTip(-1,"Neuer"& @LF &"Eintrag oder"& @LF & "Eintrag ändern")
    $bDelA = GUICtrlCreateButton("", 760, 80, 30, 29,$BS_BITMAP)
    GUICtrlSetImage(-1,@ScriptDir&"\button\del30x29.bmp")
    GUICtrlSetTip(-1,"Eintrag"& @LF &"Löschen")
    $bSaveA = GUICtrlCreateButton("&Speichern", 792, 16, 65, 45)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $bEscapeA = GUICtrlCreateButton("&Abbrechen", 792, 64, 65, 45)
    $bSuchAufruf = GUICtrlCreateButton("", 613, 86, 100, 21)
    GUICtrlSetTip(-1, "Suche nach Artikel bzw. Seriennummer."& @LF & "Eingabe wird automatisch in Kleinbuchstaben gewandelt -" _
    & @LF & "Schreiben von Großbuchstaben also nicht nötig.")
    GUICtrlCreateLabel("Notiz", 440, 20)
    $mNotiz = GUICtrlCreateEdit("", 478, 17, 235, 60, BitOR($ES_LEFT, $ES_AUTOHSCROLL, $ES_READONLY), $WS_EX_CLIENTEDGE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    [/autoit] [autoit][/autoit] [autoit]

    If Not _FileReadToArray("mass_art.vwg",$massArt) Then
    MsgBox(262144,"Fehler", " Fehler beim Lesen der Datei Fehler-Nr" & @error)
    Exit
    EndIf
    If Not _FileReadToArray("ser_art.vwg",$serArt) Then
    MsgBox(262144,"Fehler", " Fehler beim Lesen der Datei Fehler-Nr" & @error)
    Exit
    EndIf
    For $i = 1 To $massArt[0]-1
    If StringLen($massArt[0]) > 1 Then _
    GUICtrlCreateListViewItem($massArt[$i], $lvArtikel)
    Next
    For $i = 1 To $serArt[0]
    $tmp = StringLeft($serArt[$i], 1)
    $item = StringTrimLeft($serArt[$i],1)
    If StringLeft($item, 1) = "|" Then _
    GUICtrlCreateListViewItem($item, $lvSerien)
    If $tmp = 1 Then GUICtrlSetState(-1, $GUI_CHECKED)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ;GUI Suche
    $SucheGUI = GUICreate("Suche", 250, 92, -1, -1, BitOr($WS_CAPTION, $WS_POPUP), $WS_EX_TOPMOST)
    $lSuche = GUICtrlCreateLabel("Suchbegriff:", 10, 18)
    $iSuche = GUICtrlCreateInput("", 80, 15, 160, 21, $ES_LOWERCASE)
    $bSuche = GUICtrlCreateButton("Suche", 10, 56, 80, 21, $BS_DEFPUSHBUTTON )
    GUICtrlSetTip(-1, "Button kann auch mit <ENTER> betätigt werden.")
    $bEscSuche = GUICtrlCreateButton("Abbrechen", 160, 56, 80, 21)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_NOTIFY, "MY_WM_COMMAND")
    GUICtrlSetState($bSuchAufruf, $GUI_FOCUS)
    GUISetState(@SW_SHOW, $ArtikelGUI)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $A_DESCENDING[_GUICtrlListViewGetSubItemsCount ($lvArtikel) ]
    Dim $S_DESCENDING[_GUICtrlListViewGetSubItemsCount ($lvSerien) ]
    $AnzItemA = _GUICtrlListViewGetItemCount($lvArtikel)
    $AnzItemS = _GUICtrlListViewGetItemCount($lvSerien)
    _GUICtrlListViewSetItemSelState($lvArtikel, 0, 1, 1)
    _GUICtrlListViewSetItemSelState($lvSerien, 0, 1, 1)
    _AktuellDS_Serien()
    _AktuellDS_Artikel()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    $statTab = _GUICtrlTabGetCurSel($TabArtikel)
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $statTab = 0 ; Mengen-Artikel
    If $cbLoadedA = 0 Then ; Aktionen, die einmalig bei Tab-Aktivierung ausgeführt werden
    _AktuellDS_Artikel()
    _SetComboArtikel()
    $cbLoadedA = 1
    $cbLoadedS = 0
    GUICtrlSetData($lArtBez, "Artikelbezeichnung")
    GUICtrlSetData($lArtNrAnz, "Anzahl")
    GUICtrlSetData($bSuchAufruf, "Suche Artikel")
    EndIf
    Select
    Case $msg = $bPrintA
    _PrintA()
    Case $msg = $bPrintS
    _PrintS()
    Case $msg = $bMail
    _PrintA(1)
    _PrintS(1)
    $Body = ""
    Case $msg = $bSuchAufruf
    GUISetState(@SW_SHOW, $SucheGUI)
    ControlFocus($SucheGUI, "", $iSuche)
    Case $msg = $lvArtikel
    _GUICtrlListViewSort($lvArtikel, $A_DESCENDING, GUICtrlGetState($lvArtikel))
    Case $msg = $bFirstA
    $CurrIndex = _GUICtrlListViewGetCurSel($lvArtikel)
    _GUICtrlListViewSetItemSelState($lvArtikel, 0, 1, 1)
    If $CurrIndex > 12 Then _ScrollA(-1 * $CurrIndex)
    _AktuellDS_Artikel()
    Case $msg = $bLastA
    _GUICtrlListViewSetItemSelState($lvArtikel, $AnzItemA-1, 1, 1)
    If $AnzItemA > 12 Then _ScrollA($AnzItemA)
    _AktuellDS_Artikel()
    Case $msg = $bPrevA
    $CurrIndex = _GUICtrlListViewGetCurSel($lvArtikel)
    If $CurrIndex > 0 Then _GUICtrlListViewSetItemSelState($lvArtikel, $CurrIndex-1, 1, 1)
    _AktuellDS_Artikel()
    Case $msg = $bNextA
    $CurrIndex = _GUICtrlListViewGetCurSel($lvArtikel)
    If $CurrIndex < $AnzItemA -1 Then _GUICtrlListViewSetItemSelState($lvArtikel, $CurrIndex+1, 1, 1)
    _AktuellDS_Artikel()
    Case $msg = $bNewA
    $tmp = MsgBox(262179, "Datensatz anlegen / ändern", 'JA - für "Neuen Datensatz"' _
    & @LF & @LF & 'NEIN - für "Ändern"')
    Switch $tmp
    Case 6 ; JA - neuer DS
    $new = 1
    $inputA = 1
    _ActivInput()
    GUICtrlSetState($lvSerien, $GUI_DISABLE)
    GUICtrlSetState($iArtBez, $GUI_FOCUS)
    $changed = 1
    Case 7 ; NEIN - DS ändern
    $new = 0
    $inputA = 1
    _ActivInput()
    GUICtrlSetState($lvSerien, $GUI_DISABLE)
    ControlSetText("Artikel", "", $iArtBez, $ArtUnit)
    GUICtrlSetData($iArtNr, $MengeNr)
    GUICtrlSetState($iArtNr, $GUI_FOCUS)
    $changed = 1
    EndSwitch
    Case $msg = $bDelA
    If MsgBox(262164, "Achtung - Löschvorgang !", "Soll der markierte Datensatz" _
    & @CR & "wirklich gelöscht werden?") = 6 Then
    $CurrIndex = _GUICtrlListViewGetCurSel($lvArtikel)
    _GUICtrlListViewDeleteItem($lvArtikel, $CurrIndex)
    _GUICtrlListViewSetItemSelState($lvArtikel, $CurrIndex-1, 1, 1)
    $AnzItemA -= 1
    $changed = 1
    EndIf
    _AktuellDS_Artikel()
    Case $msg = $bSaveA
    $MengeNr = GUICtrlRead($iArtNr)
    $ArtUnit = GUICtrlRead($iArtBez)
    If $MengeNr = "" Or $ArtUnit = "" Then
    MsgBox(262160, 'Fehler', "Angaben nicht komplett!")
    Else
    If _GUICtrlComboFindString($iArtBez, $ArtUnit, 1) = $CB_ERR Then ; neuer Artikel
    $INIchangedA = 1
    $INIartikel[0][0] += 1
    $anz = $INIartikel[0][0]
    ReDim $INIartikel[$anz+1][2]
    $INIartikel[$anz][0] = "item" & $anz
    $INIartikel[$anz][1] = $ArtUnit
    EndIf
    If $new = 1 Then
    GUICtrlCreateListViewItem($ArtUnit&"|"&$MengeNr, $lvArtikel)
    $AnzItemA += 1
    $new = 0
    _GUICtrlListViewSetItemSelState($lvArtikel, $AnzItemA-1, 1, 1)
    Else
    $CurrIndex = _GUICtrlListViewGetCurSel($lvArtikel)
    _GUICtrlListViewSetItemText($lvArtikel, $CurrIndex, 0, $ArtUnit)
    _GUICtrlListViewSetItemText($lvArtikel, $CurrIndex, 1, $MengeNr)
    _GUICtrlListViewSetItemSelState($lvArtikel, $CurrIndex, 1, 1)
    EndIf
    _Back()
    EndIf
    _AktuellDS_Artikel()
    Case $msg = $bEscapeA
    If $inputA = 1 Then
    GUICtrlSetState($lvSerien, $GUI_ENABLE)
    $inputA = 0
    _DeActivInput()
    ControlSetText("Artikel", "", $iArtBez, "")
    GUICtrlSetData($iArtNr, "")
    Else
    ExitLoop
    EndIf
    Case $msg = $bEscSuche
    GUISetState(@SW_HIDE, $SucheGUI)
    Case $msg = $bSuche
    _GUICtrlListViewSetItemSelState($lvSerien, 0, 1, 1) ; geh erstmal zum 1.DS
    If $CurrIndex > 12 Then _ScrollA(-1 * $CurrIndex)
    $CurrIndex = 0
    $index = _SucheA()
    If $index < 0 Then
    MsgBox(262144, "Achtung", "Keine Übereinstimmung mit Suchbegriff.")
    Else
    _GUICtrlListViewSetItemSelState($lvArtikel, $index, 1, 1)
    If $index > 0 Then
    If $index > 12 Then _ScrollA($index)
    EndIf
    _AktuellDS_Artikel()
    GUISetState(@SW_HIDE, $SucheGUI)
    GUICtrlSetData($iSuche, "")
    EndIf
    EndSelect
    Case $statTab = 1 ; Serien-Artikel
    If $cbLoadedS = 0 Then ; Aktionen, die einmalig bei Tab-Aktivierung ausgeführt werden
    _AktuellDS_Serien()
    _SetComboGeraete()
    $cbLoadedS = 1
    $cbLoadedA = 0
    GUICtrlSetData($lArtBez, "Gerätename")
    GUICtrlSetData($lArtNrAnz, "Hersteller SN")
    GUICtrlSetData($bSuchAufruf, "Suche Serien-Nr")
    EndIf
    Select
    Case $msg = $bPrintA
    _PrintA()
    Case $msg = $bPrintS
    _PrintS()
    Case $msg = $bMail
    _PrintA(1)
    _PrintS(1)
    $Body = ""
    Case $msg = $bSuchAufruf
    GUISetState(@SW_SHOW, $SucheGUI)
    ControlFocus($SucheGUI, "", $iSuche)
    Case $msg = $lvSerien
    For $i = 0 To $AnzItemS -1
    If _GUICtrlListViewGetCheckedState($lvSerien, $i) Then
    _GUICtrlListViewSetItemText($lvSerien, $i, 0, 1)
    _GUICtrlListViewSetCheckState($lvSerien, $i, 0)
    EndIf
    Next
    _GUICtrlListViewSort($lvSerien, $S_DESCENDING, GUICtrlGetState($lvSerien))
    For $i = 0 To $AnzItemS -1
    If _GUICtrlListViewGetItemText($lvSerien, $i, 0) = 1 Then
    _GUICtrlListViewSetCheckState($lvSerien, $i, 1)
    _GUICtrlListViewSetItemText($lvSerien, $i, 0, "")
    EndIf
    Next
    Case $msg = $bFirstA
    _GUICtrlListViewSetItemSelState($lvSerien, 0, 1, 1)
    If $CurrIndex > 12 Then _ScrollS(-1 * $CurrIndex)
    _AktuellDS_Serien()
    Case $msg = $bLastA
    _GUICtrlListViewSetItemSelState($lvSerien, $AnzItemS-1, 1, 1)
    If $AnzItemS > 12 Then _ScrollS($AnzItemS)
    _AktuellDS_Serien()
    Case $msg = $bPrevA
    $CurrIndex = _GUICtrlListViewGetCurSel($lvSerien)
    If $CurrIndex > 0 Then _GUICtrlListViewSetItemSelState($lvSerien, $CurrIndex-1, 1, 1)
    _AktuellDS_Serien()
    Case $msg = $bNextA
    $CurrIndex = _GUICtrlListViewGetCurSel($lvSerien)
    If $CurrIndex < $AnzItemS -1 Then _GUICtrlListViewSetItemSelState($lvSerien, $CurrIndex+1, 1, 1)
    _AktuellDS_Serien()
    Case $msg = $bNewA
    $tmp = MsgBox(262179, "Datensatz anlegen / ändern", 'JA - für "Neuen Datensatz"' _
    & @LF & @LF & 'NEIN - für "Ändern"')
    Switch $tmp
    Case 6 ; JA - neuer DS
    $new = 1
    $inputS = 1
    _ActivInput()
    GUICtrlSetState($lvArtikel, $GUI_DISABLE)
    GUICtrlSetData($mNotiz, "")
    GUICtrlSetState($iArtBez, $GUI_FOCUS)
    Case 7 ; NEIN - DS ändern
    $new = 0
    $inputS = 1
    _ActivInput()
    GUICtrlSetState($lvArtikel, $GUI_DISABLE)
    ControlSetText("Artikel", "", $iArtBez, $ArtUnit)
    GUICtrlSetData($iArtNr, $MengeNr)
    GUICtrlSetState($iArtNr, $GUI_FOCUS)
    EndSwitch
    Case $msg = $bDelA
    If MsgBox(262164, "Achtung - Löschvorgang !", "Soll der markierte Datensatz" _
    & @CR & "wirklich gelöscht werden?") = 6 Then
    $CurrIndex = _GUICtrlListViewGetCurSel($lvSerien)
    _GUICtrlListViewDeleteItem($lvSerien, $CurrIndex)
    _GUICtrlListViewSetItemSelState($lvSerien, $CurrIndex-1, 1, 1)
    $AnzItemS -= 1
    EndIf
    _AktuellDS_Serien()
    Case $msg = $bSaveA
    $MengeNr = GUICtrlRead($iArtNr)
    $ArtUnit = GUICtrlRead($iArtBez)
    $Comment = GUICtrlRead($mNotiz)
    If $MengeNr = "" Or $ArtUnit = "" Then
    MsgBox(262160, 'Fehler', "Angaben nicht komplett!")
    Else
    If _GUICtrlComboFindString($iArtBez, $ArtUnit, 1) = $CB_ERR Then ; neuer Gerätetyp
    $INIchangedS = 1
    $INIgeraete[0][0] += 1
    $anz = $INIgeraete[0][0]
    ReDim $INIgeraete[$anz+1][2]
    $INIgeraete[$anz][0] = "item" & $anz
    $INIgeraete[$anz][1] = $ArtUnit
    EndIf
    If $new = 1 Then
    GUICtrlCreateListViewItem("|"&$ArtUnit&"|"&$MengeNr&"|"&$Comment, $lvSerien)
    $AnzItemS += 1
    $new = 0
    _GUICtrlListViewSetItemSelState($lvSerien, $AnzItemS-1, 1, 1)
    Else
    $CurrIndex = _GUICtrlListViewGetCurSel($lvSerien)
    _GUICtrlListViewSetItemText($lvSerien, $CurrIndex, 1, $ArtUnit)
    _GUICtrlListViewSetItemText($lvSerien, $CurrIndex, 2, $MengeNr)
    _GUICtrlListViewSetItemText($lvSerien, $CurrIndex, 3, $Comment)
    _GUICtrlListViewSetItemSelState($lvSerien, $CurrIndex, 1, 1)
    EndIf
    _Back()
    EndIf
    _AktuellDS_Serien()
    Case $msg = $bEscapeA
    If $inputS = 1 Then
    GUICtrlSetState($lvArtikel, $GUI_ENABLE)
    $inputS = 0
    _DeActivInput()
    ControlSetText("Artikel", "", $iArtBez, "")
    GUICtrlSetData($iArtNr, "")
    Else
    ExitLoop
    EndIf
    Case $msg = $bEscSuche
    GUISetState(@SW_HIDE, $SucheGUI)
    Case $msg = $bSuche
    _GUICtrlListViewSetItemSelState($lvSerien, 0, 1, 1) ; geh erstmal zum 1.DS
    If $CurrIndex > 12 Then _ScrollS(-1 * $CurrIndex)
    $CurrIndex = 0
    $index = _SucheSN()
    If $index < 0 Then
    MsgBox(262144, "Achtung", "Keine Übereinstimmung mit Suchbegriff.")
    Else
    _GUICtrlListViewSetItemSelState($lvSerien, $index, 1, 1)
    If $index > 12 Then _ScrollS($index)
    _AktuellDS_Serien()
    GUISetState(@SW_HIDE, $SucheGUI)
    GUICtrlSetData($iSuche, "")
    EndIf
    EndSelect
    EndSelect
    WEnd
    _WriteMassArt()
    _WriteSerArt()
    _INIWrite()
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetComboGeraete()
    _GUICtrlComboResetContent($iArtBez)
    For $i = 1 To $INIgeraete[0][0]
    _GUICtrlComboAddString($iArtBez,$INIgeraete[$i][1])
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetComboArtikel()
    _GUICtrlComboResetContent($iArtBez)
    For $i = 1 To $INIartikel[0][0]
    _GUICtrlComboAddString($iArtBez,$INIartikel[$i][1])
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ActivInput()
    GUICtrlSetStyle($iArtNr, BitOR($ES_RIGHT, $ES_AUTOHSCROLL), $WS_EX_CLIENTEDGE)
    If $statTab = 1 Then GUICtrlSetStyle($mNotiz, BitOR($ES_LEFT, $ES_AUTOHSCROLL), $WS_EX_CLIENTEDGE)
    GUICtrlSetState($bFirstA, $GUI_DISABLE)
    GUICtrlSetState($bLastA, $GUI_DISABLE)
    GUICtrlSetState($bPrevA, $GUI_DISABLE)
    GUICtrlSetState($bNextA, $GUI_DISABLE)
    GUICtrlSetState($bNewA, $GUI_DISABLE)
    GUICtrlSetState($bDelA, $GUI_DISABLE)
    GUICtrlSetState($bSaveA, $GUI_ENABLE)
    GUICtrlSetState($bSuchAufruf, $GUI_DISABLE)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DeActivInput()
    GUICtrlSetStyle($iArtNr, BitOR($ES_RIGHT, $ES_AUTOHSCROLL, $ES_READONLY), $WS_EX_CLIENTEDGE)
    GUICtrlSetStyle($mNotiz, BitOR($ES_LEFT, $ES_AUTOHSCROLL, $ES_READONLY), $WS_EX_CLIENTEDGE)
    GUICtrlSetState($bSaveA, $GUI_DISABLE)
    GUICtrlSetState($bFirstA, $GUI_ENABLE)
    GUICtrlSetState($bLastA, $GUI_ENABLE)
    GUICtrlSetState($bPrevA, $GUI_ENABLE)
    GUICtrlSetState($bNextA, $GUI_ENABLE)
    GUICtrlSetState($bNewA, $GUI_ENABLE)
    GUICtrlSetState($bDelA, $GUI_ENABLE)
    GUICtrlSetState($bSaveA, $GUI_DISABLE)
    GUICtrlSetState($bSuchAufruf, $GUI_ENABLE)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Back()
    If $inputS = 1 Then
    GUICtrlSetState($lvArtikel, $GUI_ENABLE)
    $inputS = 0
    ElseIf $inputA = 1 Then
    GUICtrlSetState($lvSerien, $GUI_ENABLE)
    $inputA = 0
    EndIf
    _DeActivInput()
    ControlSetText("Artikel", "", $iArtBez, "")
    GUICtrlSetData($iArtNr, "")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ScrollA($index)
    $x = $index * 10
    _GUICtrlListViewScroll($lvArtikel,0,$x)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ScrollS($index)
    $x = $index * 10
    _GUICtrlListViewScroll($lvSerien,0,$x)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SucheA()
    For $i = 0 To $AnzItemA -1
    $item = StringLower(_GUICtrlListViewGetItemText($lvArtikel, $i, 0))
    $vergleich = StringLower(GUICtrlRead($iSuche))
    If $item = $vergleich Then Return $i
    Next
    Return -1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SucheSN()
    For $i = 0 To $AnzItemS -1
    $item = StringLower(_GUICtrlListViewGetItemText($lvSerien, $i, 2))
    $vergleich = StringLower(GUICtrlRead($iSuche))
    If $item = $vergleich Then Return $i
    Next
    Return -1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _AktuellDS_Serien()
    $CurrIndex = _GUICtrlListViewGetCurSel($lvSerien)
    $ArtUnit = _GUICtrlListViewGetItemText($lvSerien, $CurrIndex, 1)
    $MengeNr = _GUICtrlListViewGetItemText($lvSerien, $CurrIndex, 2)
    $Comment = _GUICtrlListViewGetItemText($lvSerien, $CurrIndex, 3)
    _GUICtrlStatusBarSetText($StatusBar, $text2_1, 0)
    _GUICtrlStatusBarSetText($StatusBar, " " & $ArtUnit, 1)
    _GUICtrlStatusBarSetText($StatusBar, $text2_2, 2)
    _GUICtrlStatusBarSetText($StatusBar, " " & $MengeNr, 3)
    GUICtrlSetData($mNotiz, $Comment)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _AktuellDS_Artikel()
    $CurrIndex = _GUICtrlListViewGetCurSel($lvArtikel)
    $ArtUnit = _GUICtrlListViewGetItemText($lvArtikel, $CurrIndex, 0)
    $MengeNr = _GUICtrlListViewGetItemText($lvArtikel, $CurrIndex, 1)
    _GUICtrlStatusBarSetText($StatusBar, $text1_1, 0)
    _GUICtrlStatusBarSetText($StatusBar, " " & $ArtUnit, 1)
    _GUICtrlStatusBarSetText($StatusBar, $text1_2, 2)
    _GUICtrlStatusBarSetText($StatusBar, " " & $MengeNr, 3)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _WriteMassArt()
    If $changed = 1 Then
    $file = FileOpen("mass_art.vwg",2)
    For $i = 0 To $AnzItemA -1
    FileWriteLine($file, _GUICtrlListViewGetItemText($lvArtikel, $i))
    Next
    FileClose($file)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _WriteSerArt()
    $file = FileOpen("ser_art.vwg",2)
    For $i = 0 To $AnzItemS -1
    If _GUICtrlListViewGetCheckedState($lvSerien, $i) Then
    _GUICtrlListViewSetItemText($lvSerien, $i, 0, 1)
    Else
    _GUICtrlListViewSetItemText($lvSerien, $i, 0, 0)
    EndIf
    If _GUICtrlListViewGetItemText($lvSerien, $i, 1) <> "" Then _
    FileWriteLine($file, _GUICtrlListViewGetItemText($lvSerien, $i))
    Next
    FileClose($file)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _PrintA($type = 0)
    _WriteMassArt()
    If Not _FileReadToArray("mass_art.vwg",$massArt) Then
    MsgBox(262144,"Fehler", " Fehler beim Lesen der Datei Fehler-Nr" & @error)
    Return 0
    EndIf
    $file = FileOpen("Massenartikel.txt", 2)
    For $i = 1 To $massArt[0]
    $var = StringSplit($massArt[$i], "|")
    If $var[2] > 0 Then
    $text = StringReplace($massArt[$i], "|", ": ")
    FileWriteLine($file, $text)
    EndIf
    Next
    FileClose($file)
    If $type = 0 Then
    _FilePrintCom("Massenartikel.txt")
    Else
    If Not _FileReadToArray("Massenartikel.txt",$massArt) Then
    MsgBox(262144,"Fehler", " Fehler beim Lesen der Datei Fehler-Nr" & @error)
    Return 0
    EndIf
    $Body = "Massenartikel" & @LF & @LF
    For $i = 1 To $massArt[0]
    $Body &= $massArt[$i] & @LF
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _PrintS($type = 0)
    $file = FileOpen("SN-Geräte.txt",2)
    For $i = 0 To $AnzItemS -1
    If Not _GUICtrlListViewGetCheckedState($lvSerien, $i) Then
    If _GUICtrlListViewGetItemText($lvSerien, $i, 1) <> "" Then
    $text = _GUICtrlListViewGetItemText($lvSerien, $i)
    $text = StringReplace($text, "|", ": ", 1)
    $text = StringTrimRight($text, 1)
    FileWriteLine($file, $text)
    EndIf
    EndIf
    Next
    FileClose($file)
    If $type = 0 Then
    _FilePrintCom("SN-Geräte.txt")
    Else
    If Not _FileReadToArray("SN-Geräte.txt",$serArt) Then
    MsgBox(262144,"Fehler", " Fehler beim Lesen der Datei Fehler-Nr" & @error)
    Return 0
    EndIf
    $Body &= @LF & "SN-Geräte" & @LF & @LF
    For $i = 1 To $serArt[0]
    $Body &= $serArt[$i] & @LF
    Next
    _INetSmtpMailCom($smtpServer, $AbsName, $AbsAdress, $ToAdress, $Betreff, _
    $Body,"","","", $UserName, $UserPW, $Port)
    MsgBox(262144, "", "Mail versendet")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _INIWrite()
    If $INIchangedA = 1 Then
    IniDelete("VerwSmall.INI", "artikel")
    For $i = 1 To $INIartikel[0][0]
    IniWrite("VerwSmall.INI", "artikel", "item" & $i, $INIartikel[$i][1])
    Next
    ElseIf $INIchangedS = 1 Then
    IniDelete("VerwSmall.INI", "geraete")
    For $i = 1 To $INIgeraete[0][0]
    IniWrite("VerwSmall.INI", "geraete", "item" & $i, $INIgeraete[$i][1])
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam) ; Funktion von SmOke_N
    #forceref $hWndGUI, $MsgID
    Local $tagNMHDR, $event
    Switch $wParam
    Case $lvArtikel
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Switch $event
    Case $NM_CLICK
    _AktuellDS_Artikel()
    EndSwitch
    Case $lvSerien
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Switch $event
    Case $NM_CLICK
    _AktuellDS_Serien()
    EndSwitch
    EndSwitch
    $tagNMHDR = 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _FilePrintCom($iFile) ; Funktion von Jos
    If Not FileExists($iFile) Then Return SetError(1,0,0)
    $objShellApp = ObjCreate("Shell.Application")
    $objShellApp.ShellExecute($iFile,0,0,"PRINT",0)
    EndFunc
    ; auch von Jos
    Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", _
    $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "",$IPPort=25, $ssl=0)
    $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body,"<") and StringInStr($as_Body,">") Then
    $objEmail.HTMLBody = $as_Body
    Else
    $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
    Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
    For $x = 1 To $S_Files2Attach[0]
    $S_Files2Attach[$x] = _PathFull ($S_Files2Attach[$x])
    If FileExists($S_Files2Attach[$x]) Then
    $objEmail.AddAttachment ($S_Files2Attach[$x])
    Else
    $i_Error_desciption = $i_Error_desciption & @lf & 'File not found to attach: ' & $S_Files2Attach[$x]
    SetError(1)
    return 0
    EndIf
    Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $Ssl Then
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Sent the Message
    $objEmail.Send
    if @error then
    SetError(2)
    return $oMyRet[1]
    EndIf
    EndFunc ;==>_INetSmtpMailCom
    ; Com Error Handler
    Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description,3)
    ConsoleWrite("### COM Error ! Number: " & $HexNumber & " ScriptLine: " & $oMyError.scriptline & " Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
    EndFunc ;==>MyErrFunc

    [/autoit]
  • Ich habe dein Skript installiert.

    Ich wuerde personlich dieses Programm nicht per Gui machen sonder lieber Per Html-autoit, denn es so moderner aussieht. :schild4: Per iexplorer/Firefox laufen lassen. Besser als .Net.

    Aber wenn du es noch immer per Gui machen willst, am schnellesten waere einfach an stelle vom ein file direkt zu benutzen, lieber per Array, die Daten in einem Matrix das tun, und spaeter das info zum file speichern. :keks:

    Viel Spass .. mal schauen das end version.

    Einmal editiert, zuletzt von BasicOs (22. November 2006 um 02:08)

    • Offizieller Beitrag
    Zitat

    BasicOs:
    am schnellesten waere einfach an stelle vom ein file direkt zu benutzen, lieber per Array

    ?? - Schau in den Code, die Files werden in Array's geladen. Zur Laufzeit werden nur die Array's bedient. Erst mit Beenden werden die Daten zurück ins File geschrieben.
    Dies ist sowieso nur eine "Notversion" - deshalb Small Edition, die nur funktionieren muss (und das tut sie :) ).
    Das Endprodukt ist ein komplettes Warenwirtschaftssystem. Datenbank ist SQLite. Dieses ist beleggesteuert und hat: Beleg~, Kunden~, Artikel~, Seriennummer~ und Parameterverwaltung (SerNum-Geräte).

    Zitat

    BasicOs:
    Ich wuerde personlich dieses Programm nicht per Gui machen sonder lieber Per Html-autoit

    Ich weiß ja, dass du eine Vorliebe für deine Autoit-html Entwicklung hast. ;)
    Ob das nun "moderner" aussieht, darüber ließe sich streiten. Aber über Geschmack soll man bekanntlich nicht streiten. ;)

  • Code
    Das Endprodukt ist ein komplettes Warenwirtschaftssystem. Datenbank ist SQLite. Dieses ist beleggesteuert und hat: Beleg~, Kunden~, Artikel~, Seriennummer~ und Parameterverwaltung (SerNum-Geräte).


    Das hatte ich mich vorgestellt, denn das Programm wenig sinn vom selbst oder allein haette.

    Wenn du array benuzt, wird dann schneller als per Direkt Write, jedes mal. Aber du meinst dass troztdem ist die ArrayVerwaltung nicht so Optimieziert fuer viele Daten??

    Ich habe deine Frage nicht voll verstanden, kannst du in ein Paar Woerter stellen, bitte ?:tier: