Dialog mit Scanner füllen klappt nicht

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Dialog mit Scanner füllen klappt nicht

Beitrag von CADdy »

Hallo allerseits,

es sind meine ersten Schritte mit OOo Basic, daher bitte ich um Nachsicht und etwas Unterstützung.

Mein Vorhaben ist ein Dialogfenster, das auf eine Eingabe von einem Barode-Scanner wartet. Der gescannte Code soll dann in drei Teile aufgesplittet werden und im Dialogfenster in verschiedene Textfelder eingetragen werden. Soweit habe ich das auch hinbekommen, der Dialog wird angezeigt und nach dem Scannen steht der Scancode im obersten Feld. Auch funktioniert die Aufsplittung des Codes einwandfrei. Allerdings erfolgt die Anzeige in den entsprechenden Textfeldern erst, wenn ich den Dialog schließe (per Klick auf das Kreuz) und gleich wieder öffne (was ich mal so im Makro eingebaut habe). Kann man die Felder eines Dialoges nur durch erneutes öffnen desselben aktualisieren? Ich finde keinen Ansatz.

Das Schließen des Dialoges wollte ich per if-Abfrage machen. Im Forum hatte ich einen Lösungsansatz gefunden. Der Scanner liefert als Abschluß nach einem Scan ein Carriage Return. Den Aufruf habe ich an das Textfeld Scancode in das Ereignis "Text modifiziert" eingetragen. Klappt aber auch nicht, da ich die Meldung "Objektvariable nicht belegt" bekomme.

Der Dialog sieht folgendermaßen aus:
001 Screenshot - 03.04.2014 , 13_01_07.png
001 Screenshot - 03.04.2014 , 13_01_07.png (20.96 KiB) 1440 mal betrachtet
Ein gescannter Code hat folgendes Format:

11111111;222222;33333333
Der Scanner hängt dann noch ein Return dran.

Den Code hänge ich hier mal an. Ich denke, da wäre einiges verbesserungswürdig... Später wollte ich dann die einzelnen Felder in eine MySQL-Datenbank schreiben lassen - aber soweit wage ich noch gar nicht zu denken :-)

Code: Alles auswählen

dim sScancode as string		' scancode vom Scanner
dim sPalette as string		' Palettennummer
dim sArtikel as string		' Artikelnummer
dim sMenge as string		' Menge auf der Palette
dim iPalette as long		' Palettennummer als Zahl
dim iArtikel as long		' Artikelnummer als Zahl
dim iMenge as long			' Menge als Zahl

dim datum as date			' Datentyp zuweisen
dim zeit as date

Dim readTextField As Object
Dim writeScancode As Object
Dim writePalettennummer as Object
Dim writeArtikelnummer as Object
Dim writeMenge as Object
Dim writeDatum as Object
Dim writeZeit as Object

REM ##########################################################

sub Dialog1Show

BasicLibraries.LoadLibrary("Tools")
oDialog1 = LoadDialog("Standard", "Dlg_Dateneingabe")
oDialog1.Execute()

readTextField = oDialog1.getControl("TextField1")
writePalettennummer = oDialog1.getControl("TextField2")
writeArtikelnummer = oDialog1.getControl("TextField3")
writeMenge = oDialog1.getControl("TextField4")
writedatum = oDialog1.getControl("DateField1")
writezeit = oDialog1.getcontrol("TimeField1")

sScancode = readTextField.Model.Text

' zerlegen des Scancodes in die Einzelteile und Umwandlung in Zahlen
sPalette = left(sScancode,8)
sArtikel = mid(sScancode,10,6)
sMenge   = mid(sScancode,17,6)

iPalette = sPalette
iArtikel = sArtikel
iMenge = sMenge
sMenge = iMenge
datum = Date()
zeit = Time()

writePalettennummer.setText(sPalette)
writeArtikelnummer.setText(sArtikel)
writeMenge.setText(sMenge)
writedatum.setText(datum)
writezeit.setText(zeit)

oDialog1.Execute()


End Sub

Sub EnterPressed(oEvt)
' funktioniert nicht, Fehlermeldung: Objektvariable nicht belegt

taste = oEvt.keychar
if oEvt.keycode = 1280 then
	
oDialog1.endExecute()
endif

End Sub
Vielen Dank fürs Drüberschauen und evtl. Tipps.

Servus
Peter
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von F3K Total »

Hi,
habe dein Makro in zwei zerlegt, das zweite wird an die Eigenschaft "Inhalt geändert" der Scanfeldes gebunden.

Code: Alles auswählen

    dim sScancode as string      ' scancode vom Scanner
    dim sPalette as string      ' Palettennummer
    dim sArtikel as string      ' Artikelnummer
    dim sMenge as string      ' Menge auf der Palette
    dim iPalette as long      ' Palettennummer als Zahl
    dim iArtikel as long      ' Artikelnummer als Zahl
    dim iMenge as long         ' Menge als Zahl

    dim datum as date         ' Datentyp zuweisen
    dim zeit as date

    Dim readTextField As Object
    Dim writeScancode As Object
    Dim writePalettennummer as Object
    Dim writeArtikelnummer as Object
    Dim writeMenge as Object
    Dim writeDatum as Object
    Dim writeZeit as Object
    Dim oDlg_Dateneingabe as Object

    REM ##########################################################

sub Dialog1Show
    DialogLibraries.loadLibrary("Standard")
    oDlg_Dateneingabe = CreateUnoDialog(DialogLibraries.Standard.Dlg_Dateneingabe)
    oDlg_Dateneingabe.Execute
End Sub
    
sub split_scancode
    readTextField = oDlg_Dateneingabe.getControl("TextField1")
    writePalettennummer = oDlg_Dateneingabe.getControl("TextField2")
    writeArtikelnummer = oDlg_Dateneingabe.getControl("TextField3")
    writeMenge = oDlg_Dateneingabe.getControl("TextField4")
    writedatum = oDlg_Dateneingabe.getControl("DateField1")
    
    writezeit = oDlg_Dateneingabe.getcontrol("TimeField1")

    sScancode = readTextField.Model.Text

    ' zerlegen des Scancodes in die Einzelteile und Umwandlung in Zahlen
    sPalette = left(sScancode,8)
    sArtikel = mid(sScancode,10,6)
    sMenge   = mid(sScancode,17,6)

    iPalette = sPalette
    iArtikel = sArtikel
    iMenge = sMenge
    sMenge = iMenge
    datum = Date()
    zeit = Time()

    writePalettennummer.setText(sPalette)
    writeArtikelnummer.setText(sArtikel)
    writeMenge.setText(sMenge)
    writedatum.setText(datum)
    writezeit.setText(zeit)
end sub
Der Button
  • hat die "Art der Schaltfläche: OK"
  • wird als Standardschaltfläche definiert, dann reagiert er auf Enter
Du kannst natürlich auch die Weiterverarbeitung der Daten an einen Button, dem du ein weiteres Makro zuordnest, binden.
Anbei ein Beispiel.
HTH R
Dateianhänge
Scandialog.odt
(11.83 KiB) 58-mal heruntergeladen
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von CADdy »

Hi,

erstmal vielen Dank für Deine Antwort und Hilfe.

Ich habe das Makro "split_scancode" dem Ereignis "Text modifiziert" des TextField1 zugeordnet. So funktioniert das einwandfrei. Das vom Scanner gesendete "Enter" wird also gar nicht gebraucht? Das könnte man aber doch auswerten, sehe ich das richtig? Wenn ich im Makro "split_scancode" mit Hilfe einer if-Abfrage auf das "Enter" teste, könnte ich ein weiteres Makro starten, das dann z.B. den Datensatz in eine Datenbank schreibt.

Noch eine Frage: Habe ich das bei meinem ersten Posting richtig interpretiert, dass die Inhalte der Textfelder nur durch erneuten Aufruf des Dialoges aktualisiert werden?

Servus
Peter
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von F3K Total »

CADdy hat geschrieben:Noch eine Frage: Habe ich das bei meinem ersten Posting richtig interpretiert, dass die Inhalte der Textfelder nur durch erneuten Aufruf des Dialoges aktualisiert werden?
Nein, dass hast Du falsch interpretiert, du siehst doch, das im 2. Makro, nachdem der Dialog ausgeführt wurde, der Inhalt geändert wird, ohne das der Dialog noch einmal ausgeführt wird.
CADdy hat geschrieben:Wenn ich im Makro "split_scancode" mit Hilfe einer if-Abfrage auf das "Enter" teste, könnte ich ein weiteres Makro starten, das dann z.B. den Datensatz in eine Datenbank schreibt.
Das Enter wird doch mit jedem Scan ausgeführt, bringt also keine weitere Information.
Du hast m.E. nach drei Möglichkeiten.
  • Du schreibst die Daten direkt mit dem 2. Makro in die Datenbank
  • Du fügst einen Button hinzu, der das Schreiben in die DB auslöst, damit du die Daten vorher noch einmal kontrollieren kannst.
  • Du vergisst den ganzen Dialog und arbeitest gleich mit einem Formular, das an die Datenbank gebunden ist, dabei hast du wiederum mindestens zwei Möglichkeiten
    • ein in ein Base-Dokument eingebettetes Formular
    • ein Standalone Formular (Writer/Calc/Impress/Draw)
HTH R
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von CADdy »

Ok, dank Dir für Deine Antwort.

Einen Button möchte ich nicht hinzufügen. Es handelt sich um behinderte Menschen, die den Dialog angezeigt bekommen. Die Leute sollen nur sehen, was sie einscannen. Also ist die erste Option sinnvoll. Was ich gerade versuche, ist den Dialog bei Beginn eines neuen Scanvorganges zuerst zu löschen und dann die neuen gescannten Daten anzuzeigen. Das wäre optimal.

Servus
Peter
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von F3K Total »

Hi,
CADdy hat geschrieben:Die Leute sollen nur sehen, was sie einscannen. Also ist die erste Option sinnvoll.
Das sehe ich etwas anders. Was machst Du, wenn der falsche Code gescant wurde, oder aus Versehen doppelt? Kann ja leicht passieren.
Ich empfehle Version 3, mit einem Tabellenkontrollfeld, das z.B. die letzen 5 gescanten Datensätze anzeigt, und die Möglichkeit bietet, einen fehlerhaften Datensatz zu löschen.

Nun zur Version 1:

Leider hast Du nicht erwähnt, dass meine o.a Version, in der das Makro split_scancode an das Ereignis Text modifiziert gebunden ist, nicht funktioniert, da das Makro nach jedem Buchstaben ausgeführt wird.
Darum anbei nun eine Version, die ich mit meinem Scanner geprüft habe.
Das Makro wird nach dem Ereignis Taste lossgelassen ausgeführt, und prüft tatsächlich auf ENTER.
Standardschaltfläche = Nein, dann reagiert der nun umbenannte Button nicht auf Enter und beendet den Dialog nicht mit jedem Scanvorgang, sondern erst, wenn der Button gedrück wird.
Ich habe mal für 2 Sekunden 'ne Farbwechselaktion eingebaut, als Feedback, siehe Beispiel.
Hier der neue Code

Code: Alles auswählen

    dim sScancode as string      ' scancode vom Scanner
    dim sPalette as string      ' Palettennummer
    dim sArtikel as string      ' Artikelnummer
    dim sMenge as string      ' Menge auf der Palette
    dim iPalette as long      ' Palettennummer als Zahl
    dim iArtikel as long      ' Artikelnummer als Zahl
    dim iMenge as long         ' Menge als Zahl

    dim datum as date         ' Datentyp zuweisen
    dim zeit as date

    Dim readTextField As Object
    Dim writeScancode As Object
    Dim writePalettennummer as Object
    Dim writeArtikelnummer as Object
    Dim writeMenge as Object
    Dim writeDatum as Object
    Dim writeZeit as Object
    Dim oDlg_Dateneingabe as Object

    REM ##########################################################

sub Dialog1Show
    DialogLibraries.loadLibrary("Standard")
    oDlg_Dateneingabe = CreateUnoDialog(DialogLibraries.Standard.Dlg_Dateneingabe)
    oDlg_Dateneingabe.Execute
End Sub
    
sub split_scancode(oEvt)
    if oEvt.keycode = 1280 then
    readTextField = oDlg_Dateneingabe.getControl("TextField1")
    writePalettennummer = oDlg_Dateneingabe.getControl("TextField2")
    writeArtikelnummer = oDlg_Dateneingabe.getControl("TextField3")
    writeMenge = oDlg_Dateneingabe.getControl("TextField4")
    writedatum = oDlg_Dateneingabe.getControl("DateField1")    
    writezeit = oDlg_Dateneingabe.getcontrol("TimeField1")

    writePalettennummer.setText("")
    writeArtikelnummer.setText("")
    writeMenge.setText("")
    writedatum.setText("")
    writezeit.setText("")


    sScancode = readTextField.Model.Text

    ' zerlegen des Scancodes in die Einzelteile und Umwandlung in Zahlen
    sPalette = left(sScancode,8)
    sArtikel = mid(sScancode,10,6)
    sMenge   = mid(sScancode,17,6)

    iPalette = sPalette
    iArtikel = sArtikel
    iMenge = sMenge
    sMenge = iMenge
    datum = Date()
    zeit = Time()

    writePalettennummer.setText(sPalette)
    writeArtikelnummer.setText(sArtikel)
    writeMenge.setText(sMenge)
    writedatum.setText(datum)
    writezeit.setText(zeit)
    'Farbaktion
    oDlg_Dateneingabe.model.BackgroundColor = 38400
    wait 2000
    oDlg_Dateneingabe.model.BackgroundColor = empty
    readTextField.Model.Text = ""
    endif
end sub
HTH R
Dateianhänge
Scandialog.odt
(12.15 KiB) 69-mal heruntergeladen
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von CADdy »

Hi,
F3K Total hat geschrieben:Hi,
CADdy hat geschrieben:Die Leute sollen nur sehen, was sie einscannen. Also ist die erste Option sinnvoll.
Das sehe ich etwas anders. Was machst Du, wenn der falsche Code gescannt wurde, oder aus Versehen doppelt? Kann ja leicht passieren.
Der falsche Code wird es nicht sein, aber dass eine Palette doppelt gescannt wird, kann jederzeit passieren und muss erkannt werden. Ich hatte diese Möglichkeit auch schon in Erwägung gezogen und mir vorgestellt, im Fehlerfall den gescannten Datensatz zu löschen und dem Anwender eine Meldung anzuzeigen (evtl. kombiniert mit einem akustischen Signal):
Fehlerscan_klein.jpg
Fehlerscan_klein.jpg (30.12 KiB) 1301 mal betrachtet
F3K Total hat geschrieben:Ich empfehle Version 3, mit einem Tabellenkontrollfeld, das z.B. die letzen 5 gescanten Datensätze anzeigt, und die Möglichkeit bietet, einen fehlerhaften Datensatz zu löschen.
Das ist so ne Sache; die Mitarbeiter sollen nicht mit Informationen überladen werden. Andererseits ist die Info über die letzten x-Datensätze vielleicht gar nicht so abwegig, löschen sollen sie aber nichts können.
F3K Total hat geschrieben:
Nun zur Version 1:

Leider hast Du nicht erwähnt, dass meine o.a Version, in der das Makro split_scancode an das Ereignis Text modifiziert gebunden ist, nicht funktioniert, da das Makro nach jedem Buchstaben ausgeführt wird.
Funktionieren tut das schon :) Nur wird nach dem Enter vom Scanner der Datensatz sofort wieder gelöscht (zumindest so wie ich versucht habe, das Makro zu erweitern).

Danke für den neuen Code. Ich mache mich gleich ran, ihn zu testen.

Noch ein paar Infos von mir zu der Geschichte:
Es handelt sich um eine Behinderteneinrichtung bei mir in der Nähe. Die Leute dort sind körperlich und/oder geistig behindert, aber in der Lage, diese Arbeit zu erledigen. Ich passe dort ehrenamtlich ein bisschen auf die Computer in der Verwaltung der Werkstatt auf und wurde gebeten, ob ich das Vorhaben umsetzen kann. Bisher wird eine Strichliste geführt und die Fehlerquote ist dementsprechend hoch.

Danke und servus
Peter
LO 4.2, LinuxMint16
CADdy
*
Beiträge: 14
Registriert: Mo, 31.03.2014 14:37

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von CADdy »

Hi,

super der Code von Dir!

Für die Fehlererkennung habe ich mir folgendes ausgedacht und ausprobiert:
Da es immer nur die aktuelle Palette sein kann, die im Fehlerfall nochmal gescannt wird, habe ich den Code um eine Funktion erweitert.

Code: Alles auswählen

        dim sScancode as string      ' scancode vom Scanner
        dim sScancode_old as string	' vorheriger Scancode
        dim sPalette as string      ' Palettennummer
        dim sArtikel as string      ' Artikelnummer
        dim sMenge as string      ' Menge auf der Palette
        dim iPalette as long      ' Palettennummer als Zahl
        dim iArtikel as long      ' Artikelnummer als Zahl
        dim iMenge as long         ' Menge als Zahl

        dim datum as date         ' Datentyp zuweisen
        dim zeit as date

        Dim readTextField As Object
        Dim writeScancode As Object
        Dim writePalettennummer as Object
        Dim writeArtikelnummer as Object
        Dim writeMenge as Object
        Dim writeDatum as Object
        Dim writeZeit as Object
        Dim oDlg_Dateneingabe as Object
       

        REM ##########################################################

    sub Dialog1Show
        DialogLibraries.loadLibrary("Standard")
        oDlg_Dateneingabe = CreateUnoDialog(DialogLibraries.Standard.Dlg_Dateneingabe)
        oDlg_Dateneingabe.Execute
    End Sub
       
    sub split_scancode(oEvt)
    	
        if oEvt.keycode = 1280 then
        readTextField = oDlg_Dateneingabe.getControl("TextField1")
        writePalettennummer = oDlg_Dateneingabe.getControl("TextField2")
        writeArtikelnummer = oDlg_Dateneingabe.getControl("TextField3")
        writeMenge = oDlg_Dateneingabe.getControl("TextField4")
        writedatum = oDlg_Dateneingabe.getControl("DateField1")   
        writezeit = oDlg_Dateneingabe.getcontrol("TimeField1")

		writePalettennummer.setText("")
        writeArtikelnummer.setText("")
        writeMenge.setText("")
        writedatum.setText("")
        writezeit.setText("")


        sScancode = readTextField.Model.Text

        ' zerlegen des Scancodes in die Einzelteile und Umwandlung in Zahlen
        sPalette = left(sScancode,8)
        sArtikel = mid(sScancode,10,6)
        sMenge   = mid(sScancode,17,6)

        iPalette = sPalette
        iArtikel = sArtikel
        iMenge = sMenge
        sMenge = iMenge
        datum = Date()
        zeit = Time()

        writePalettennummer.setText(sPalette)
        writeArtikelnummer.setText(sArtikel)
        writeMenge.setText(sMenge)
        writedatum.setText(datum)
        writezeit.setText(zeit)
        
        Fehlertest(sScancode)
        
        readTextField.Model.Text = ""
        endif
    end sub
    
    Function Fehlertest (sScancode)
    	if sScancode = sScancode_old then
    		oDlg_Dateneingabe.model.BackgroundColor = &HCC0000	' rot
			wait 5000
        	oDlg_Dateneingabe.model.BackgroundColor = &HCFE7F5	' klassisches Blau
        else
        	oDlg_Dateneingabe.model.BackgroundColor = &H00CC00	' grün
			wait 2000
        	oDlg_Dateneingabe.model.BackgroundColor = &HCFE7F5	' klassisches Blau
    	EndIf
    	sScancode_old = sScancode
    End Function
    
Hier könnte dann auch das Schreiben in die Datenbank stattfinden denke ich mal.

Servus
Peter
LO 4.2, LinuxMint16
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Dialog mit Scanner füllen klappt nicht

Beitrag von F3K Total »

CADdy hat geschrieben:Hier könnte dann auch das Schreiben in die Datenbank stattfinden denke ich mal.
Genau!

Das Rot wird auffallen!
Weniger ist mehr.
Ich denke die Lösung ist angemessen und gut.

Gruß R
Antworten