Fallunterscheidung

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

Moderator: Moderatoren

Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Fallunterscheidung

Beitrag von Jörg »

Hallo Fachleute,

vor der Ausführung des nachstehenden Makros möchte ich zuerst prüfen, ob C14 leer ist oder nicht.
Aber ich erhalte die Fehlermeldung: Basic-Syntaxfehler-> unerwartet end sub

Könnte bitte jemand drauf schauen, woran es liegen könnte?

Code: Alles auswählen

Public oDialog4 as Object
sub Abrechnung
	Dim Datum as String
	oSheet = thisComponent.Sheets(2)
	Datum = oSheet.getCellRangeByName("C14").String	
	
	if Datum <> ""  then
antwort = msgbox("Behandlungsdaten nicht übertragen!!",49,"Verordnung abrechnen?")
if antwort = 2 Then
		 exit sub
end if		 
else	
	if Datum = ""  then	 
rem ----------------------------------------------------------------------
antwort = msgbox("Rezeptdaten erfaßt und eingetragen?",36,"Verordnung abrechnen?")
if antwort = 7 Then
		 exit sub

end if
 odoc = ThisComponent
        osheet = odoc.sheets(2)
        orange = osheet.getCellRangeByName("F37:U37")
        orangeAddress = orange.getrangeaddress
        odata()= orange.getdataarray
        oZielSheet = oDoc.sheets(3)
        c = oZielSheet.getCellRangeByName("A1:A250").queryEmptyCells
        oZielCell = c(0).getcellbyposition(0,0)
        oZielCellAddress = oZielCell.getcelladdress
        X1=oZielCellAddress.column
        Y1=oZielCellAddress.row
        X2=oZielCellAddress.column+(orangeAddress.EndColumn-orangeAddress.StartColumn)
        Y2=oZielCellAddress.Row+(orangeAddress.EndRow-orangeAddress.StartRow)
        oZielrange=oZielSheet.getCellRangeByPosition(X1,Y1,X2,Y2)
        oZielrange.setdataarray(odata())

rem-------------------------------------------------------------------     
     oCellRange = osheet.getCellRangeByName("F16:G20")       
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.VALUE)     
     oCellRange = osheet.getCellRangeByName("C23:F23")           
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.DATETIME)
     oCellRange = osheet.getCellRangeByName("I5")           
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.STRING) 
rem------------------------------------------------------------     
rem get access to the document
mycell = osheet.getCellRangebyName("E12")
mycell.formulalocal= "=WENN(ZÄHLENWENN(Hilfstabelle.$C$2:$C$200;$C$8);SVERWEIS($C$8;Hilfstabelle.$C$2:$M$200;VERGLEICH($E$11;Hilfstabelle.$C$1:$M$1;0);0);"""")"

rem-------------------------------------------------------------
myView = oDoc.CurrentController
mycell = osheet.getCellRangebyName("I5")
myView.Select(mycell)
rem----------------------------------------------------------------------------------------------------
sort_Abr
rem---------------------------------------------------------------------------------
	oDialog4.endexecute
rem-------------------------------------------------------------------------------------
 Neue_Verordnung_erfassen_Array


end sub
Danke!!

Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Fallunterscheidung

Beitrag von balu »

Hallo Jörg,

zähl mal ganz genau nach wieviele "if ... then" und wieviele "end if" Du hast. Zu jedem "if ..." gehört abschließend ein "end if".



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Fallunterscheidung

Beitrag von Jörg »

Hallo Balu,
hab es jetzt so. Krieg zwar keine Fehlermeldung mehr, aber die entsprechende Meldung kommt nicht, obwohl C14 leer ist.

Code: Alles auswählen

Public oDialog4 as Object
sub Abrechnung
   Dim Datum as String
   oSheet = thisComponent.Sheets(2)
   Datum = oSheet.getCellRangeByName("C14").String   
   
   if Datum <> ""  then
antwort = msgbox("Behandlungsdaten nicht übertragen!!",49,"Verordnung abrechnen?")
if antwort = 2 Then
       exit sub
end if  
end if    
   
   if Datum = ""  then   
rem ----------------------------------------------------------------------
antwort = msgbox("Rezeptdaten erfaßt und eingetragen?",36,"Verordnung abrechnen?")
if antwort = 7 Then
       exit sub
end if
end if
 odoc = ThisComponent
        osheet = odoc.sheets(2)
        orange = osheet.getCellRangeByName("F37:U37")
        orangeAddress = orange.getrangeaddress
        odata()= orange.getdataarray
        oZielSheet = oDoc.sheets(3)
        c = oZielSheet.getCellRangeByName("A1:A250").queryEmptyCells
        oZielCell = c(0).getcellbyposition(0,0)
        oZielCellAddress = oZielCell.getcelladdress
        X1=oZielCellAddress.column
        Y1=oZielCellAddress.row
        X2=oZielCellAddress.column+(orangeAddress.EndColumn-orangeAddress.StartColumn)
        Y2=oZielCellAddress.Row+(orangeAddress.EndRow-orangeAddress.StartRow)
        oZielrange=oZielSheet.getCellRangeByPosition(X1,Y1,X2,Y2)
        oZielrange.setdataarray(odata())

rem-------------------------------------------------------------------     
     oCellRange = osheet.getCellRangeByName("F16:G20")       
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.VALUE)     
     oCellRange = osheet.getCellRangeByName("C23:F23")           
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.DATETIME)
     oCellRange = osheet.getCellRangeByName("I5")           
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.STRING)
rem------------------------------------------------------------     
rem get access to the document
mycell = osheet.getCellRangebyName("E12")
mycell.formulalocal= "=WENN(ZÄHLENWENN(Hilfstabelle.$C$2:$C$200;$C$8);SVERWEIS($C$8;Hilfstabelle.$C$2:$M$200;VERGLEICH($E$11;Hilfstabelle.$C$1:$M$1;0);0);"""")"

rem-------------------------------------------------------------
myView = oDoc.CurrentController
mycell = osheet.getCellRangebyName("I5")
myView.Select(mycell)
rem----------------------------------------------------------------------------------------------------
sort_Abr
rem---------------------------------------------------------------------------------
   oDialog4.endexecute
rem-------------------------------------------------------------------------------------
 Neue_Verordnung_erfassen_Array


end sub
Möglicherweise liegt es daran?

Code: Alles auswählen

 Datum = oSheet.getCellRangeByName("C14").String   
C14 ist als Datum formatiert.
Gruß
Jörg
P.S.
Im Originalcode hat die lange Zählenwenn-Formel einen Namen("kasse") :) :)
Gruß Jörg

Win 10 Pro AOO 4.1.15
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Fallunterscheidung

Beitrag von Jörg »

Ich hab ne Klatsche.
das erste

Code: Alles auswählen

 if Datum <> ""  then
muß heißen = ""
das zweite

Code: Alles auswählen

 if Datum = ""  then
muß heißen <>""

Code: Alles auswählen

Public oDialog4 as Object
sub Abrechnung
   Dim Datum as String
   oSheet = thisComponent.Sheets(2)
   Datum = oSheet.getCellRangeByName("C14").String   
   
   if Datum = ""  then
antwort = msgbox("Behandlungsdaten nicht übertragen!!",49,"Verordnung abrechnen?")
if antwort = 2 Then
       exit sub
end if 
end if   
   
   if Datum <> ""  then   
rem ----------------------------------------------------------------------
antwort = msgbox("Rezeptdaten erfaßt und eingetragen?",36,"Verordnung abrechnen?")
if antwort = 7 Then
       exit sub
end if
end if
 odoc = ThisComponent
        osheet = odoc.sheets(2)
        orange = osheet.getCellRangeByName("F37:U37")
        orangeAddress = orange.getrangeaddress
        odata()= orange.getdataarray
        oZielSheet = oDoc.sheets(3)
        c = oZielSheet.getCellRangeByName("A1:A250").queryEmptyCells
        oZielCell = c(0).getcellbyposition(0,0)
        oZielCellAddress = oZielCell.getcelladdress
        X1=oZielCellAddress.column
        Y1=oZielCellAddress.row
        X2=oZielCellAddress.column+(orangeAddress.EndColumn-orangeAddress.StartColumn)
        Y2=oZielCellAddress.Row+(orangeAddress.EndRow-orangeAddress.StartRow)
        oZielrange=oZielSheet.getCellRangeByPosition(X1,Y1,X2,Y2)
        oZielrange.setdataarray(odata())

rem-------------------------------------------------------------------     
     oCellRange = osheet.getCellRangeByName("F16:G20")       
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.VALUE)     
     oCellRange = osheet.getCellRangeByName("C23:F23")           
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.DATETIME)
     oCellRange = osheet.getCellRangeByName("I5")           
     ocellRange.clearContents(com.sun.star.sheet.CellFlags.STRING)
rem------------------------------------------------------------     
rem get access to the document
mycell = osheet.getCellRangebyName("E12")
mycell.formulalocal= "=WENN(ZÄHLENWENN(Hilfstabelle.$C$2:$C$200;$C$8);SVERWEIS($C$8;Hilfstabelle.$C$2:$M$200;VERGLEICH($E$11;Hilfstabelle.$C$1:$M$1;0);0);"""")"

rem-------------------------------------------------------------
myView = oDoc.CurrentController
mycell = osheet.getCellRangebyName("I5")
myView.Select(mycell)
rem----------------------------------------------------------------------------------------------------
sort_Abr
rem---------------------------------------------------------------------------------
   oDialog4.endexecute
rem-------------------------------------------------------------------------------------
 Neue_Verordnung_erfassen_Array


end sub
Schaun wir mal, ob es jetzt funkt.
Gruß Jörg

Win 10 Pro AOO 4.1.15
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Fallunterscheidung

Beitrag von Jörg »

Hallo Balu,

unabhängig von den Vergleichsoper. (bin mit meinen Schltflächen durcheinander gekommen)funktioniert alles.
Danke für Deinen Hinweis.
Eine Frage dazu hätte ich noch.
Wann und wie genau verwendet man "else" und welche Bedeutung hat dieses?

Danke und schönen Tag.
Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Fallunterscheidung

Beitrag von Stephan »

Wann und wie genau verwendet man "else" und welche Bedeutung hat dieses?
Else kennzeichnet die Alternative die immer dann zur Anwendung kommen soll wenn keine der zu prüfenden Bedingungen zutrifft.


Gruß
Stephan
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Fallunterscheidung

Beitrag von Jörg »

Hallo Stephan,
danke für die Antwort. Na ja mathem. Logik war noch nie so mein Ding.

habe hier mal einen Beispielcode.

Code: Alles auswählen

	if Rechnungsdatum <>"" and Rezeptdatum <>"" and vom <>"" and bis <>"" and Anrede <>"" then
RechnungErstellen
else
Rechnungsdatum = ""
msgbox ("Rechungsdatum fehlt!",0,"Rechnung erstellen")
exit sub
antwort = msgbox ("Abrechnungsdaten nicht vollständig!" & Chr(13) & "Anschrift" & Chr(13) & "Rechnungsdatum"& Chr(13) &"Rezeptdatum"& Chr(13) &"Behandlungsbeginn -ende"& chr(13) & "Rot umrandete Felder beachten !!!",48, "Rechnung erstellen")
end if
end sub
Wie müßten bsp. die Anweisungen aussehen, wenn ich jede einzelne Zelle einzeln abfragen möchte, um eine konkrete Antort zu erhalten?
Einfach mit "else" weitermachen?
Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Fallunterscheidung

Beitrag von Stephan »

Na ja mathem. Logik war noch nie so mein Ding.
naja, das ist doch nun aber wirklich einfach mit Else. Else ist immer das was getan wird wenn alles Andere nicht zutrifft.

z.B.
ist die Ampel rot dann: bleibe stehen
ist die Ampel gelb dann: halte an
ist die Ampel grün dann: fahre

tritt das alles nicht zu dann: ELSE,
d.h. es gelten die normalen Vorfahrtsregeln UNABHÄNGIG davon ob die Ampel gelb blinkt, garkein Licht zeigt, von einem LKW umgefahren wurde, mit einer Plane angedeckt ist, ...
Wie müßten bsp. die Anweisungen aussehen, wenn ich jede einzelne Zelle einzeln abfragen möchte, um eine konkrete Antort zu erhalten?
Da Dein Code auf keinerlei Zelle Bezug nimmt kann ich das nicht beantworten.
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Fallunterscheidung

Beitrag von Jörg »

Zu den Zellen.

Rechnungsnummer, Rechnungsdatum, Anrede, usw. sind die Zellen.

Code: Alles auswählen

	Rechnungsdatum = oSheet.getCellRangeByName("B23").String
Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Fallunterscheidung

Beitrag von balu »

Hallo Jörg,
Wann und wie genau verwendet man "else" und welche Bedeutung hat dieses?
Eine IF...THEN kann man durchaus mit der Calc Funktion =WENN() vergleichen. Da gibt es ja den WENN-Teil der die Überprüfung durchführt (IF blabla) und wenn die Überprüfung zutrifft DANN (THEN). Und bei =WENN() muss man nicht unbedingt den SONST-Teil aufführen. So ist das auch bei der IF. Falls man aber doch den SONST-Teil braucht muss dieser aufgeführt und ausgeführt werden. Und bei der IF geschieht das durch die Anweisung ELSE.

Um das nochmal kurz zu verdeutlichen.
WENN DANN SONST
IF THEN ELSE
Und das END IF ist so gesehen die schließende Klammer ) der WENN.
Alles Klar ;-)

Wie müßten bsp. die Anweisungen aussehen, wenn ich jede einzelne Zelle einzeln abfragen möchte, um eine konkrete Antort zu erhalten?
Was willst Du denn überhaupt erreichen? Eine konkrete Antwort kannst Du ja immer bekommen egal wie Du die IF...THEN aufbaust, blos wie soll diese Antwort aussehen, etwa z.B. "Halt Stop, da fehlt was" (allgemein gehalten), oder sehr präzise "Es wurde kein Name eingetragen, bitte korrigieren", oder "Es wurde kein Rechnungsdatum eingetragen, bitte korrigieren"?

Eine allgemein gehaltene Info hast Du ja schon hinbekommen. Jetzt gehts ja nur eventuell darum eine präzise Info auszugeben. Doch dazu werde ich jetzt keine weitere Hilfestellung geben, da ich den gesamten Zusammenhang der Datei nicht kenne. Denn mir ist nicht klar, und es ist aus deinem Beispielcode nicht ersichtlich, wie Du die Datenerfassung machst. Geht es denn überhaupt darum das bei der Datenerfassung eine Überprüfung stattfinden soll, oder willst Du eine nachträgliche Überprüfung der vorhandenen Daten durchführen?

Und je nachdem ob bei Datenerfassung, oder nachträglich Daten überprüft werden sollen, gibt es verschiedene Methoden dies durchzuführen die auch dementsprechend mehr oder weniger komplex sein können. Und deshalb brauchen wir eine Beispieldatei und mehr Informationen dazu.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Jörg
*****
Beiträge: 401
Registriert: Mo, 21.10.2013 12:05

Re: Fallunterscheidung

Beitrag von Jörg »

Hallo balu,

vielen Dank für die ausführliche Beschreibung.
Der Vergleich mit WENN-> Dann;Sonst war sehr anschaulich.

Ich denke das oben von mir zitierte Makro krieg ich selbst umgebaut. Ist auch nicht ganz so wichtig. Hab ja noch die bedingte Formatierung drin.
msgbox

Code: Alles auswählen

"Rot umrandete Felder beachten !!!"
Das Makro dient mir zur Überprüfung der Vollständigkeit der Eingaben bevor ich diese per Makro aus der Eingabemaske in die Tabelle schicke.

Beim anderen Thema von mir (Doppelte Einträge) ist mir noch nichts eingefallen.

Gruß Jörg
Gruß Jörg

Win 10 Pro AOO 4.1.15
Antworten