[GELÖST] Cursormanipulation per Basic

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

Moderator: Moderatoren

StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: Cursormanipulation per Basic

Beitrag von StePfl »

Lieber Stephan,

danke, dass du dir die Mühe machst und die Daten im "Temp"-Sheet ansiehst.

==== schon wieder ein langer Exkurs zur Situation ;-) =======
Die ständige Veränderung der Datenstruktur (durch den Hersteller des HV-Programms - nahezu bei jedem Update) verhindert ja, dass ich die Zerlegung direkt in das EinleseProgramm einbaue. Dort hatte ich es schon und bin schier an den permanenten Änderungen und damit neuen Fehlern verzweifelt. Zusätzlich gibt es auch noch immer wieder echte Fehler in den Daten (es werden manchmal Zeichen verschluckt, Datenspalten vertauscht etc.)

Da ich ein ganz kleines Licht in der Datenkette bin, habe ich auch nicht die Möglichkeit hier mehr Zuverlässigkeit zu verlangen.
Ich muß also das Programm um die Realität herumbauen.

Deshalb gehe ich den aufwendigen (Um)weg der Zwischenschritte:
1. suchen der einzulesenden Dateien mit FilePiker (speichern der URL in den ersten Datenblock in Sheet "Temp")
2. Einlesen der ausgewählten Dateien: (jeweils in einen nächsten Datenblock)
2.1 Übernahme der realen Zeilennummern (im LisDoc) - Eintragung in Spalte "A"
2.2 Übertragung der Rohdaten in Spalte "B"
3. erste BereinigungsStufe und Übertragung der Daten in Spalte "C"

jetzt kämen die (noch nicht neu programmierten) weiteren Auswertungen:
4. Prüfung der Daten auf Konsistenz (ggf. ERROR-Kennung in Spalte "D")
5. Zerlegung der Daten in eine (zur jew. Datei) passenden Datenbankstruktur - Eintragung in Spalten "E - "AN" (je nach Inhalt der Daten)
6. ... Weiterverarbeitung Stufe 2, Stufe 3, Stufe 4 .... (diese Stufen benötigt es, weil es in jedem ZwischenSchritt zu notwendigen Korrekturen kommen kann - und auch kommt)

Das ganze Paket habe ich 1997 in VBA geschrieben - und immer wieder korrigieren müssen (wg. der Änderungen der Struktur und zusätzlichen Auswertungsaufgaben). 2010 bin ich auf Linux umgestiegen und 2012 habe ich die alte Version (mit der Hand am Arm) in StarBasic übertragen.

Da jetzt eine weitere, erhebliche Erweiterung ansteht, habe ich mir vorgenommen, das gesamte Werk zu überarbeiten und (noch) flexibler zu gestalten. Und in diesem Zusammenhang bin auf das Problem gestoßen, wie ich jedesmal unterschiedlich große Datenblöcke lokalisieren und anschließend adressieren kann.

Und - natürlich kann man jetzt die gesamte Logik hinterfragen und an vielen Stellen anders vorgehen - ABER, das System hat ja (an fast allen Stellen) funktioniert und es ist wirklich komplex. und dafür fehlt mir (leider) auch die Zeit (und die Lust).
==== ENDE des Exkurses ======

Ich hab mir aufgrund deiner Tips noch einmal das Thema "strg+Pfeiltaste" vorgenommen und auch eine Lösung gefunden (siehe Anhang)

... bin aber gleich auf ein neues Problem bei der Verwendung von "isMissing" gestoßen:
Ich möchte meine Routinen so aufbauen, dass ich wahlweise eine BezugsZelle übergeben kann, oder - falls nicht - die "aktuelle Zelle" verwendet wird. Wenn ich das ÜbergabeArgument als "optional" deklariere verliert komischer Weise das übergebene Object seine Deklaration nach der Verwendung von "isMissing" (Vor "isMissing" ist das nicht so .... ). Bei jeder Verwendung von dem Object taucht die Fehlermeldung "BASIC-Laufzeitfehler. Variable nicht definiert" auf. Kennt jemand dieses Verhalten?

Ich habe mit der Verwendung von "TypName(<Object>) für mich einen Lösungsweg gefunden ... Vielleicht sollte ich/man dieses Problem aber in einen eigenen "Thema" beschreiben...

für mich sind meine Ausgangsfragen beantwortet und ich markiere das Thema als [gelöst].
nochmals herzlichen Dank
Gruß
StePfl
Dateianhänge
MakroTest-Demo.ods
(11.75 KiB) 126-mal heruntergeladen
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von mikeleb »

Hallo,

ich häng' mich nun auch mal mit 'rein, auch wenn du den Thread schon auf gelöst gesetzt hast.
Das Hauptproblem scheint mir wirklich die Analyse der .lis Datei zu sein. Beim Durchforsten der Rohdaten scheint es mir so, als ob da (durch automatische Importmechanismen) bereits einiges an Informationen verloren gegangen ist.
Ich vermute mal, dass die "~C", "~E" etc. Tags für bestimmte Datentypen sind. Daher würde ich versuchen die lis-Datei anhand dieser Tags zu zerlegen. Hierzu wäre eine Originaldatei sinnvoll. Darin sind aber sicher sensible Daten, die anonymisiert werden müssen. Beim Bearbeiten der Datei kann es passieren, dass der Editor z. B. aus Tabulatoren mehrere Leerzeichen macht oder Zeilenumbrüche einfügt etc. die in der Originaldatei gar nicht da sind.
Kurz: wenn du uns so eine Datei zur Verfügung stellen könntest, wäre hier genug know-how verfügbar um das Problem zu lösen.

Zu deiner Anfangsfrage und (eigentlich nur) Detailproblem.
Wenn du den "Block" auswählen möchtest, in dem du dich gerade befindest (resp. eine Zelle, die dich gerade interessiert), dann reicht folgender Codeschnipsel.

Code: Alles auswählen

Sub block

	oDoc = thisComponent
	oCell = oDoc.CurrentSelection
	blatt=ocell.rangeaddress.sheet
	oCurs = odoc.sheets(blatt).createCursorByRange(oCell)
	oCurs.collapseToCurrentRegion()
	odoc.currentcontroller.select(ocurs)

End Sub
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von balu »

Hallo,

Stephan hatte den Vorschlag mit "Input#-Anweisung" gemacht, was ja auch schon mein Gedanke war. Und als ich das hier las,
StePfl hat geschrieben: lese diese per "Input" ein
dachte ich ja auch schon das er mit "Input#-Anweisung" arbeitet. Doch wie in seinem Code zu sehen ist, ist dem leider nicht so.

Und der weitere Vorschlag
Stephan hat geschrieben:... sondern die ursprüngliche Textdatei per Basic zeilenweise einlesen und bearbeiten (und das Bearbeitungsergebnis dann ggf. in eine Calc-Tabelle eintragen).
war auch mein Reden. Aber um mal zu zeigen, anstatt nur immer zu reden, poste ich gleich mal einen Codeausschnitt der einen HTML-Quelltext zeilenweise untersucht und nur geforderte und gefundene Suchkriterien rausfiltert und übernimmt.

Jedoch muss ich folgendes noch vorher dazu erklären, besonders für StePfl.
Da ich in meinem Code mit Dialog arbeite, werden die gefundenen Ergebnisse nicht in eine Zelle in einem Tabellenblatt eingetragen, sondern z.B. in ein Textfield im Dialog. Und deshalb darf man sich nicht wundern das so etwas z.B. da steht.

Code: Alles auswählen

oBestellNr.text = Right(sReps1, 9)
Okay, Stephan und einige andere aktive hier verstehn das eben gesagte, bseonders das wegen Dialog und Textfield, aber StePfl wird das wahrscheinlich Fremd vorkommen.

Es spielt aber überhaupt keine Rolle ob da jetzt 'oBestellNr.text = ....' steht, oder 'oSheet.getCellRangeByName("A1").string = ....', denn es ist das gleiche Verfahren, es wird an der definierten Stelle etwas eingetragen.

Um aber den Quelltext zu untersuchen greife ich auf einen "Befehl" aus der OO Internen Tool-Sammlung zu. Der da lautet: FindPartString

Und hier der Code.

Code: Alles auswählen

Open sFile For Input As iNumber
While not eof(iNumber)
Line Input #iNumber, sLine

    sBestellnummer = FindPartString(sLine, "artnr" & CHR(34) & " size=", "/>", 1)
    sVersandgewicht = FindPartString(sLine, "versandgewicht" & CHR(34) & " size=", "/>", 1)
    sPreisBrutto = FindPartString(sLine, "preisb" & CHR(34) & " size=", "/>", 1)
    sProduktName = FindPartString(sLine, "foto.gif" & CHR(34) & " alt=", " style", 1)
    sUmschalter1 = FindPartString(sLine, "_werkzeugselect(this.form,", "option" & CHR(62) & CHR(60) &"/select", 1)

If sLine<>"" then
    if sUmschalter1="" then
        if sLine<>"" AND sBestellnummer<>"" then    
            sReps1 = Replace(sBestellnummer, CHR(34), "")
            oBestellNr.text = Right(sReps1, 9)'<--bei treffer übernehmen'
        END IF    
                        
        if sLine<>"" AND sVersandgewicht<>"" then    
            sReps2 = Replace(sVersandgewicht, CHR(34), "")
            sGewichtX0 = RTrim(Replace(Right(sReps2, 8), "=", ""))
            oGewicht.Text =  Replace(sGewichtX0, "kg", "")'<--bei treffer übernehmen'
        END IF    
            if sLine<>"" AND sPreisBrutto<>"" then
                io = 0 : ilvh = 0 : izvh = 0        
                    for iq = len(sPreisBrutto) to 1 step -1
                        if Mid(sPreisBrutto, iq, 1) = CHR(34) then
                            io = io +1
                                if io = 2 then
                                    izvh = iq' <--bei treffer übernehmen'
                                    goto finisch
                                else
                                    ilvh = iq
                                end if
                        end if                                
                    next iq
                            finisch:
            oPreis.text = mid(sPreisBrutto, izvh +1, ilvh -izvh -1)' <--bei treffer übernehmen'
            END IF                            
        if sLine<>"" AND sProduktName<>"" then    
            oTitelS4.text = UCase(Replace(sProduktName, CHR(34), ""))'<--bei treffer übernehmen'
            iEinzelArtikel = 0'<--bei treffer übernehmen'
        end if
      END IF    
    end if
    wend
Close #iNumber
Wie zu sehen ist, steht bei FindPartString einiges in doppelten Anführungszeichen, wie z.B. "artnr", und anderes habe ich mit CHR(xx) geschrieben. Die Gründe dafür sind recht einach.

1.)
Manchmal ist es einfacher CHR(34) zu schreiben, anstatt ein doppeltes Anführungszeichen zu maskieren, da dann mehrere hintereinander gesetzt werden müssten, also so z.B. """. Was manchmal verwirrend sein kann.

2.
Einige zu suchende Zeichen kann man mit der Methode "xx" nicht suchen, da sie von StarBasic z.B. als Steuerzeichen interpretiert werden, auch wenn sie in doppelten Anführungszeichen stehen. Aber auch Sonderzeichenkombinationen können StarBasic durcheinander bringen, so z.B. "><". Und deshalb ist es dann besser 'CHR(62) & CHR(60)' zu schreiben.

Und schon sind wir bei einem Punkt, der hier irgendwo mal angesprochen wurde, und zwar Steuerzeichen oder ähnliches die sich in der *.Lis befindet.

Bei der Untersuchung dieser *.Lis-Datei müssten dann nur die sogenannten Störenfriede ausgeklammert werden, oder mit einbezogen werden und zwar per CHR(xx). Und zum Thema Steuer- und Sonderzeichen verweise ich auf Pitonyak Kapitel "7.1. ASCII- und Unicode-Werte"


Ich will mal kurz ein bestimmtes Suchkriterium so einfach wie möglich erklären.

Code: Alles auswählen

    sBestellnummer = FindPartString(sLine, "artnr" & CHR(34) & " size=", "/>", 1)
Der Teil mit FindPartString ist so schwer zu lesen, deshalb drösel ich das mal auf.

Code: Alles auswählen

sLine, artnr"size=, />
Genauer gesagt wird jetzt in EINER sLine alles gesucht was zwischen artnr"size= und /> steht. Wenn also die sLine wie folgt aussehen würde:

artnr"size=Ich-bin-sehr-groß/>

Dann würde FindPartString folgendes ausgeben:

Ich-bin-sehr-groß

Die Suchparameter artnr"size= und /> (oder meinetwegen "Satzbegrenzer") werden nicht ausgegeben.



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
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von StePfl »

Hallo zusammen,

@mikeleb:
danke fü deinen "CodeSchnipsel" - so ähnlich habe ich es auch gelöst (siehe mein letztes "MakroTest-Demo.ods")
Ich habe nur ein Verständnisproblem mit dem Verhalten bei "isMissing"

Die "~" folgenden Zeichen sollen angeblich Druckersteuerzeichen sein - die LisDateien sind Datenausdruck, die in eine Datei umgeleitet wurden.
Es gibt in LIS keine Tabulatoren sondern nur Leerzeichen.

@Balu:
Input# hatte ich ursprünglich verwendet. StarBasic erwartet dabei leider als Zeichensatz Unicode- die Date ist aber DOS-850
Das lässt sich aber ziemlch elegant SO lösen: (Quelle: viewtopic.php?t=63442#p242227)

Code: Alles auswählen

		oUcB = createUnoService("com.sun.star.ucb.SimpleFileAccess")        ' File Object generieren
		oInputStream = createUnoService("com.sun.star.io.TextInputStream")  ' den Stream öffnen
'		oDatei = oUcb.OpenFileReadWrite(sURL)
		oDatei = oUcb.OpenFileRead(sURL)									' und für das Lesen öffnen	
	'	oInputStream.setEncoding( "IBMPC_850" )		' Beispiele für andere Zeichensätze	 
	'	oInputStream.setEncoding( "ISO-8859-1" )		' Beispiele für andere Zeichensätze	 
		oInputStream.setEncoding( "CP850" )			' die scheint die richtige CodeTabelle fü die LIS-Dateien zu sein

		'=== die Datei für den InputStream öffnen
		oInputStream.SetInputStream(oDatei)
FindPartString kannte ich bisher noch nicht - DANKE für das Beispiel und die Erläuterungen dazu.
Das werde ich mir noch genauer ansehen.

Noch einen schönen Sonntag,
Gruß
StePfl
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von mikeleb »

Hallo,

ismissing() funktioniert korrekt. Der Fehler war die zusätzliche Dim-Anweisung für oCell.
So läuft die function mit und ohne Parameter:

Code: Alles auswählen

function locStrgRight(optional byval oCell as object) as object
	dim oDoc as object, oSheet as object, oRange as object, oCurs as object
	dim hlp as Variant
	
	if isMissing(oCell) then 
		oDoc = thisComponent
		oSheet=oDoc.CurrentController.ActiveSheet
		oCell = oDoc.CurrentSelection
	else 
		oSheet = oCell.getSpreadSheet
	
	endif

	oCurs = oSheet.createCursorByRange(oCell)
	oCurs.collapseToCurrentRegion()		' Ausweiten des "oCurs" auf den gesamten DatenBlock, in dem "oCell" liegt.
												
	' der ganz rechte ZellBereich ist die gesuchte Position
	locStrgRight = oSheet.getCellRangeByPosition(oCurs.RangeAddress.EndColumn,oCell.RangeAddress.StartRow,oCurs.RangeAddress.EndColumn,oCell.RangeAddress.EndRow)
	hlp = locStrgRight.AbsoluteName		'Kontrolle
	msgbox hlp
	
end function
Gruß,
mikeleb
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von StePfl »

Hallo Mikeleb,

Warum ich dieseDim-Anweisung eingeführt hatte, weiß ich nicht mehr genau. Ich vermute, dass ich eine Fehlermeldung "Variable nicht definiert" fälschlicher Weise "oCell" zugeordnet hatte. In sofern hat Balu Recht mit seinen Forderungen: Wenn man weiß (sich sauber/detailliert informiert), was man tut und dies auch ordentlich/sauber ausführt (und dokumentiert), ist das Sehr von Vorteil :-)

Mich überrascht, dass die Dim-Anweisung innerhalb des "if isMissing"-Bereichs auch wirkt, obwohl dieser gar nicht ausgeführt (übersprungen) wird...
da hab ich wieder etwas dazugelernt ...

SO - mit "isMissing" - gefällt mir die Routine deutlich besser ...

Nochmal Danke und Gruß,
StePfl
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von mikeleb »

Hallo,

vielleicht habe ich es nur überlesen: Welches Programm liefert dir eigentlich diese .lis-Dateien?
Ist es richtig, dass diese Dateien die Informationen per Zeichenzahl gruppieren, also eine Buchungszeile (außen den Steuerzeichen ~C ~E usw.)
- ab dem 9. Zeichen das Konto
- ab dem 23. Zeichen das Gegenkonto
- ab/bis dem 42. Zeichen BS
- ab dem 44. Zeichen oder bis zum 45. Zeichen BA
- ab dem 47. Zeichen den MwSt.-Satz
- ab dem 53. Zeichen das We-Dat (6-stellig)
- ab dem 62. Zeichen den Beleg
- ab dem 73. Zeichen den Buchungstext
- bis zum 115. Zeichen den Soll-Betrag ("bis" da rechtbündig)
- bis zum 132. Zeichen den Haben-Betrag
enthält?
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von balu »

Oh man ohhh, StePfl!

Ich hatte dich darauf angesprochen ob die ganzen hlpx vom Typ Variant sein sollen oder was?
Und was machst Du?
Du deklarierst sie alle ausführlich als Variant.

Code: Alles auswählen

function locStrgRight(optional byval oCell as object) as object
    dim oDoc as object, oSheet as object, oRange as object, oCurs as object
    dim hlp as Variant, hlp1 as Variant, hlp2 as Variant, hlp3 as Variant, hlp4 as Variant, hlp5 as Variant
Das ist, um sehr deutlich zu sein, so ein absoluter Schwachsinn. Aber nicht nur das! Du deklarierst mehr als Du wirklich anwendest. Die deklaration geht von hlp bis hlp5, und das macht insgesamt 6 mal 'hlp'.
Anwenden tust Du aber nur hlp und hlp2.
Was soll das?
Du bist doch kein Eichhörnchen! Besser gesagt, StarBasic ist kein Eichhörnchen.

Wenn sie wirklich vom Typ Variant sein sollen, dann brauchst Du das nicht extra zu schreiben, denn das macht StarBasic automatisch von alleine.


Das ist aber nicht das einzige was mich da so aufregt. Da gibt es noch etwas was auch mit dem hlp zu tun hat.

Was für einen Sinn soll das ergeben, eine Variable vom Typ Object in eine Variable vom Typ Variant reinzupacken?

Code: Alles auswählen

    hlp2 = oCell
        hlp = TypeName(oCell)
        hlp = TypeName(hlp2)
 
Das war noch immer nicht die Spitze des Eisberges. Denn die kommt jetzt.

Code: Alles auswählen

    if hlp = "Error" then         
        oDoc = thisComponent
            hlp = oDoc.Title    ' Ergebnis anzeigen'
        oSheet=oDoc.CurrentController.ActiveSheet
            hlp = oSheet.absoluteName    ' Ergebnis anzeigen'
        oCell = oDoc.CurrentSelection
            hlp = oCell.absoluteName    ' Ergebnis anzeigen'
    elseif hlp <> "Object" then
        ' hier fehlt noch eine FehlerAbfangRoutine'
    else
        oSheet = oCell.getSpreadSheet
            hlp = oSheet.absoluteName    ' Ergebnis anzeigen'
    endif
Da wird ein und dieselbe Variable mit drei unterschiedlichen Dingen (oder wie auch immer) gefüttert.

Code: Alles auswählen

    hlp = oDoc.Title    ' Ergebnis anzeigen'
 
Hier bekommt hlp den String von oDoc.Title zugewiesen.

Code: Alles auswählen

    hlp = oSheet.absoluteName    ' Ergebnis anzeigen'
 
Und hier bekommt hlp den String von oSheet.absoluteName zugewiesen.
usw.
etc. ....

Und spätestens hier muss ich mal ernsthaft nachfragen. Für was steht hlp und Verwante?
Ich sehe nirgends in deinen Dateien das hlp ein Ausgabefenster oder ähnliches ist. Du Komentierst aber das etwas angezeigt werden soll.

Code: Alles auswählen

    hlp = oDoc.Title    ' Ergebnis anzeigen
Und wo bitte schön wird das angezeigt?


Aber warum hlp als Variant deklarieren, wenn doch wie zu sehen hlp einen String aufnehmen soll?
Also müsste die deklaration theoretisch beispielsweise wie folgt aussehen

Code: Alles auswählen

function locStrgRight(optional byval oCell as object) as object
    dim oDoc as object, oSheet as object, oRange as object, oCurs as object
    dim hlp as String, hlp2 as Variant

Und ganz ehrlich gesagt, wenn man alles sauber programmiert und alles Stück für Stück sauber aufbaut, dann kann man sehr gut auf option explicit verzichten.


Hab keinen Bock mehr, zumal ich deine Datei von gestern ja nicht mal ausführen kann.



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
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von StePfl »

mikeleb hat geschrieben:Hallo,

vielleicht habe ich es nur überlesen: Welches Programm liefert dir eigentlich diese .lis-Dateien?
Ist es richtig, dass diese Dateien die Informationen per Zeichenzahl gruppieren, also eine Buchungszeile (außen den Steuerzeichen ~C ~E usw.)
- ab dem 9. Zeichen das Konto
- ab dem 23. Zeichen das Gegenkonto ...
Es handelt sich um Ausgaben eines Hausverwaltungsprogramm (Nemetschek: Buchungsjournal, SummenSaldenListe, KontenListen) (für mehrere Anwesen, über mehrere Abrechnungszeiträume). Die beauftragte Hausverwaltung führt die Buchhaltung; ich "darf" für die Eigentümergemeinschaften zusätzlich Auswertungen/Berichte durchführen (z.B. Kostenzuordnungen der einzelnen Einnahmen/Ausgaben zu den Eigentümern) - Auswertungen, die in dem GrundProgramm nicht möglich sind. Außerdem soll es eine Rückwärtskontrolle zu den Buchungen liefern.

Nemetschek liefert regelmäßig WartungsUpdates, in denen leider häufig auch die Druckmasken verändert werden - was meine Nachbearbeitung erheblich erschwert. (neue Spaltenbezeichnungen, Austausch der Spalten, Verschiebungen der Kopfdaten zu den Spaltenwerten, veränderte Zahlenformaten uvm.) Es gäbe zwar auch einen "CSV-Export" - nur liefert der nachweißlich SO falsche Daten, dass damit nicht zu arbeiten ist.

@Balu:
die diversen hlp-Variablen dienen mir hauptsächlich dazu, im im Einzelschrittmodus im Beobachtungsfenster die jeweiligen Werte ansehen zu können, oder um einzelne Berechnungen so zu zerlegen, dass ich die einzelnen Parameter nachvollziehen kann.

Stimmt - ich habe die DimZeilen einfach als Grundsammlung von Variablen nur kopiert und - wenn alles läuft - dann werden die nicht benutzen Variablen wieder gelöscht. Bis jetzt bin ich aber noch nicht so weit.

Grundsätzlich: ich bin sicherlich kein so guter Programmierer wie du und sicherlich bei weitem nicht so methodisch und ...
Leider bekomme ich aber von dir fast nur Rückmeldungen, wie unmöglich/unlogisch/unsauber meine Programme sind. Das mag aus deiner (und vll auch der Anderen) so sein. Für mich geht es aber primär darum, meine Aufgabe damit zu erledigen ... Dafür hatte ich hier meine Frage gestellt - und inzwischen auch (m)eine Lösung gefunden..

Vielleicht ist es wirklich besser, wenn wir diesen Diskurs beenden - deine Botschaft ist angekommen - ich mache DAS daraus, was mir möglich ist... Ich habe ehrlich gesagt auch keine Lust mehr, mich ständig so zurechtweisen zu lassen - selbst wenn deine Anregungen an vielen Stellen berechtig sind.

Gruß StePfl
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von balu »

Hallo StePfl,
die diversen hlp-Variablen dienen mir hauptsächlich dazu, im im Einzelschrittmodus im Beobachtungsfenster die jeweiligen Werte ansehen zu können
Ja okay. Jetzt habe ich es auch kapiert.

ich bin sicherlich kein so guter Programmierer wie du und sicherlich bei weitem nicht so methodisch und ...
Ich und guter Programmierer? Da muss ich lachen. :lol:
Die richtgig guten sind z.B. Stephan und Karolus.

Aber Methode kann man lernen, auch wenn es anfangs etwas dauert und disziplin fordert.


Leider bekomme ich aber von dir fast nur Rückmeldungen, wie unmöglich/unlogisch/unsauber meine Programme sind.
Stimmt wohl, aber auch scheinbar "unwichtige" Fehler oder Probleme können sich an anderer Stelle negativ bemerkbar machen und sehr oft dort wo man nicht mit rechnet. Und davon kann ich so manches Lied singen. Und ohne die Hilfe des Forums wäre ich nie und nimmer von alleine darauf gekommen. Nur weil ich relativ viele Beiträge geschrieben habe, heißt das nicht das ich alles kann.

Ich meinerseits hätte ja schon interessa daran gehabt die .lis zu knacken, da sie aber nicht separat kam, hatte ich zumindest versucht Fehler oder dergleichen aufzuzeigen und anzusprechen um so die Zeit "einigermaßen" auszunutzen bis das sie vielleicht doch noch kommt.

Übrigens: ich habe schon einige deiner Beiträge sehr geschätz und daran viel gelernt - Danke dafür
Freut mich zu hören. Danke :)



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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von Stephan »

==== schon wieder ein langer Exkurs zur Situation ;-) ======= [...]
Deine Verteidigung ist ganz unnötig, denn ich habe überhaupt nichts an Deiner Programmierlösung im Grundsätzlichen zu kritisieren.

Da ich beruflich den überwiegenden Teil meines Geldes damit verdiene VBA nach StarBasic umzuschreiben, ist mein allgemeiner Rat:
ja, auch ich würde einen bewährten VBA-Code nicht grundlos ändern (insofern handelst Du völlig richtig) manchmal aber kommt man schneller zum Ziel wenn man VBA Code nicht 1:1 nach StarBasic umschreibt sondern eher nur 'sinngemäß', weil bestimmte Dinge in VBA und StarBasic zwar prinzipiell gleich zu lösen sind, aber das häufig nicht der optimale Weg ist, weil die Erfahrung lehrt das bestimmte WEge zu bevorzugen sind (ich nannte das an anderer Stelle 'best practice' und die können im Detail in VBA und StarBasic unterschiedlich sein.

Bitte versuche doch aber zielgerichtet zu diskutieren, denn sonst kommen wir nicht voran.
Das ich überhaupt einen neuen Weg vorgeschlagen hatte hatte z.B. maßgeblich den Grund das mir nicht klar ist warum manche Daten in der geposteten Beispieltabelle 'anders' strukturiert sind als Andere. Da die Ausgangsdaten per Programm erzeugt werden ist nämlich sowas wie ich es bezüglich der Zellen B46 bis B52 beschrieben hatte ganz untypisch, denn ein Programm wir solche Ausgaben per Schleife machen, also immer denselben Code durchlaufen, und im Ergebnis ist dann entweder alles 'falsch' oder alles 'richtig'.

Versuche auch die 'Grenzen' eines Forums zu sehen, denn eine Frage wie:
... bin aber gleich auf ein neues Problem bei der Verwendung von "isMissing" gestoßen:
Ich möchte meine Routinen so aufbauen, dass ich wahlweise eine BezugsZelle übergeben kann, oder - falls nicht - die "aktuelle Zelle" verwendet wird. Wenn ich das ÜbergabeArgument als "optional" deklariere verliert komischer Weise das übergebene Object seine Deklaration nach der Verwendung von "isMissing" (Vor "isMissing" ist das nicht so .... ). Bei jeder Verwendung von dem Object taucht die Fehlermeldung "BASIC-Laufzeitfehler. Variable nicht definiert" auf. Kennt jemand dieses Verhalten?
ist zwar natürlich nicht falsch, motiviert doch aber niemand zum antworten weil jeder sieht das ist quasi 'klassisches' Debugging, ist Arbeit die Du selbst tun musst, weil Du sie besser tun kannst als wir, denn Du kennst Dein Programm, bist eingearbeitet. Ja, Debugging ist langweilig, aber das ist es auch für uns.

Eine Frage wie "Kennt jemand dieses Verhalten?" ist dann prima wenn Du wirklich nur die Antwort von demjenigen erwartest der genau das gleiche Problem hatte, nicht jedoch solltest Du systematische Antworten erwarten.

Ich habe jetzt mal den Code debugt und komme darauf das es hilft an den Anfang der Funktion "locStrgRigth" zu schreiben:

Code: Alles auswählen

k = oCell
und k in Folge statt oCell zu benutzen. Das ist aber eine Lösung auf die Du selbst auch gekommen wärst (und zwart mutmaßlich schneller als ich) und es ist nur eine Lösung die funktioniert, jedoch keine LÖsung die Klarheit über die eigentliche Ursache des Problems gibt, ich weiß also weiterhin auch nicht zu sagen was da schiefläuft bzw. lief.



Gruß
Stephan
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von StePfl »

Balu hat geschrieben: Ich meinerseits hätte ja schon interessa daran gehabt die .lis zu knacken .... bis das sie vielleicht doch noch kommt.
Nein - sie kommt nicht mehr: EINE Lis zu knacken ist einfach .... VIELE (unterschiedliche) Lis deutlich schwieriger.
Stephan hat geschrieben:Deine Verteidigung ist ganz unnötig, ....
War keine Verteidigung, sondern der Hinweis auf "viel Text". Das mag ich (beim Querlesen) oft selber nicht - dafür der Hinweis.
Stephan hat geschrieben:

Code: Alles auswählen

k = oCell
und k in Folge statt oCell zu benutzen. Das ist aber eine Lösung auf die Du selbst auch gekommen wärst (und zwart mutmaßlich schneller als ich) ... jedoch keine LÖsung die Klarheit über die eigentliche Ursache des Problems gibt, ich weiß also weiterhin auch nicht zu sagen was da schiefläuft bzw. lief.
STIMMT - diesen Ansatz hatte ich auch (eher zufällig) gefunden (siehe in "locStrgRight": "hlp2 = oCell" : Anhang in Post viewtopic.php?f=18&t=67253&start=45#p264281)

"Mikeleb" hat mich durch seinen Hinweis auf eine Idee der vermutlichen Ursache gebracht, die ich durch folgenden Code versucht habe nachzubilden:

Code: Alles auswählen

Sub TestDim(optional hlp1)
	dim hlp, hlp2
	hlp = 5
	hlp1 = 6

	if hlp > 5 then
		redim hlp1
	endif
	hlp2 = hlp1 	' nach "Beobachter" erhält "hlp2" den Wert von "hlp1"

	if hlp > 5 then
		dim Hlp1
	endif
	hlp2 = hlp1	' Fehlermeldung: "Variable nicht definiert"
end sub
Ursache war ein Denkfehler von mir: Ich dachte, dass - falls hlp1 NICHT übergeben wird - hlp1 nicht dimensioniert wäre und somit von mir definiert werden müsse - deshalb die DIM-Anweisung innerhalb von "isMissing".

Das Problem ist, dass scheinbar eine "Dim-Anweisung" auch dann ausgeführt wird, wenn sie innerhalb eines "if-Bereichs" steht, der aufgrund der Bedingung nicht ausgeführt wird. Eine "redim-Anweisung" dagegen hat keine Auswirkung. Vielleicht ist das für Andere hilfreich.
Stephan hat geschrieben:auch ich würde einen bewährten VBA-Code nicht grundlos ändern ...aber kommt man schneller zum Ziel wenn man VBA Code nicht 1:1 nach StarBasic umschreibt sondern eher nur 'sinngemäß'...
Genau auf diese Weise bin ich vorgegangen: ich hatte den "Lösungsweg" im Rahmen meines vorhandenen Wissens in StarBasic neu geschrieben - und das selbe tue ich gerade auch wieder .... sozusagen jeweils ein Upgrade.
Da die Ausgangsdaten per Programm erzeugt werden ist nämlich sowas wie ich es bezüglich der Zellen B46 bis B52 beschrieben hatte ganz untypisch...
Sorry, du kennst vmtl. die "doppelte Buchhaltung" nicht - B46 beschreibt den Vorgang im buchhalterischen HabenKto, B47..B52 die Gegenbuchungen im SollKonto. Nach jeder "Buchungszeile" müssen die "Soll-" und "Haben"Seite ausgeglichen sein. Probleme macht aber z.B. dass in der "BS-Spalte" mal eine Zahl steht, dann wieder Text und dann wiederum überhaupt nichts (nur Leerzeichen).

ABER - auch Das habe ich inzwischen ganz gut im Griff.

Gruß
StePfl
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von Stephan »

War keine Verteidigung, sondern der Hinweis auf "viel Text".
Das ist aber nicht das was ich meinte, sondern ich meinte das Du inhaltlich schriebst, also im Wesentlichen das Du Dein VBA Programm für bewährt hälst, es deshalb nur auf StarBasic übersetzen willst und Du eigentlich keine neuen Lösungsweg beschreiten.

Das halte ich nämlich selbst für hoch vernünftig, weshalb Du es nicht vor mir verteidigen musst.

Mein Vorschlag eines anderen LÖsungswegs verstand sich deshalb gerade nicht als bessere Alternative, sondern nur als Alternative weil Deine Rohdaten für mich Unklarheiten enthalten.
Sorry, du kennst vmtl. die "doppelte Buchhaltung" nicht - B46 beschreibt den Vorgang im buchhalterischen HabenKto, B47..B52 die Gegenbuchungen im SollKonto.
Doch, ich bin studierter Chemiker und Betriebswirt, allerdings erklärt die doppelte Buchführung nicht die unterschiedlichen Einträge von B46 und B47 ff. was ich eigentlich glaubte verständlich erklärt zu haben.
Die Einträge sehen nämlich so aus (gekürzte Darstellung):

Code: Alles auswählen

~C        2798                            1  50       04.01.01 1 
~C                      6151              1  50 19.00 04.01.01 1


und die Frage dabei ist (vereinfacht gesagt):

Warum stehen 2798 und 6151 nicht genau übereinander?

Das kann nämlich nur eine Ungenauigkeit des Programms sein (ich nannte das "Schreibfehler") oder Ausdruck davon das die Datenfelder im Datensatz ganz anders abgegrenzt sind als es die rein menschliche Intuition auf den ersten Blick nahelegt.
_z.B._ weiß ich auch nicht ob diese Zahlen IMMER 4-stellig sein werden, obwohl das in den Beispielwerte so ist kann es in anderen Daten anders sein ... und so gibt es noch einige Möglichkeiten die einfach kurz geklärt werden müssen ehe man zum Programmieren schreitet.
Probleme macht aber z.B. dass in der "BS-Spalte" mal eine Zahl steht, dann wieder Text und dann wiederum überhaupt nichts (nur Leerzeichen).
Ja, eben und das mach deshalb Schwierigkeiten weil die Art wie die Datenfelder in einem Datensatz getrennt sind nicht klar benannt ist. Das ist keine große Sache muss aber der Klarheit wegen getan werden, denn z.B. die Logik/Kodierung nach der ich in obigen Beispielwerten die 2798 und die 6151 abtrennen muss kann ziemlich verschieden sein, beispielweise:

-nimm das 11. bis 14. Zeichen
-nimm die erste vierstellige Zahl nach "~C"
-nimm die ersten vier Zeichen nach dem 8. Leerzeichen
usw.




Gruß
Stephan
StePfl
**
Beiträge: 47
Registriert: Mo, 04.07.2016 17:16

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von StePfl »

Hallo Stephan,

Schau mal in "B23", da steht (Spaltenzuordnung- auch gekürzte Darstellung):

Code: Alles auswählen

        Konto         Gegenkonto        BS BA Mwst%% We-Dat   Beleg ...
und dann in "B46ff" (WerteZeilen - gekürzte Darstellung)

Code: Alles auswählen

~C        2798                            1  50       04.01.01 1
~C                      6151              1  50 19.00 04.01.01 1
die Spalten(Datenfelder) haben ihre Überschriften. und es werden die FiBu-Konten-Nummern für "Soll" und "Haben in getrennten Spalten aufgeführt... analog zu den Spalten "Soll" und "Haben"

Wie du richtig beschrieben hast, ist es (immer wieder) schwierig, die Einträge SAUBER den Datenfeldern zuzuordnen. Noch dazu, da sich dieses Bild bei jeden SW-Update nicht/wenig/grundsätzlich ändert. Ich versuche mich gerade daran eine (Teil-)Automatik für die Erkennungslogik zu gestalten, denn die Aufgabe der SW-Erweiterung ist nun, diese Auswertungen z.B. über die monatlichen Dateien von 5 Jahren durchzuführen (mit all den immer wieder auftauchenden Strukturänderungen).
(Manchmal werden auch zufällig immer wieder mal Leerzeichen verschluckt oder zusätzlich eingefügt.
Erklären kann mir das keiner (von wegen: SW sollte doch konsistente Ergebnisse liefern)

Aus diesem Grund funktioniert dein Vorschlag ...
-nimm das 11. bis 14. Zeichen
-nimm die erste vierstellige Zahl nach "~C"
-nimm die ersten vier Zeichen nach dem 8. Leerzeichen
usw.
leider nicht bzw. macht häufig Probleme und erfordert häufige Anpassungsarbeiten.
(SO hatte ich es früher programmiert und nach der x-ten Änderung aufgegeben.)

DAMIT habe ich mich schon viel beschäftigt und meine(hoffe - bin zuversichtlich) das in der aktuellen Version realisieren zu können.

Gruß Stefan

PS: war dir das Verhalten der DIM-Anweisung in dieser Form bekannt? mir nicht! ... man lernt nie aus :-)!
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: [GELÖST] Cursormanipulation per Basic

Beitrag von Stephan »

Schau mal in "B23", da steht (Spaltenzuordnung- auch gekürzte Darstellung):
Muss ich nicht, kenne ich! Bin ich hier im falschen Film?

Zum letzten Male:

Es gibt (bisher) keine klare ERklärung dafür warum die Einträge in B46 und B47 ff in TEilen unterschiedlich sind, AUCH B23 klärt das nicht auf, sondern fügt nun noch eine dritte Position für "Konto" hinzu, denn "Konto" steht nicht in gleicher Position wie 2798.

Code: Alles auswählen

        Konto         Gegenkonto        BS BA Mwst%% We-Dat   Beleg   
~C        2798                            1  50       04.01.01 1 
~C                      6151              1  50 19.00 04.01.01 1
Aus diesem Grund funktioniert dein Vorschlag ...
Was nun wieder ein Missverständnis ist, denn es handelt sich um keinerlei Vorschlag.



Gruß
Stephan
Antworten