Makro Frage

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

Moderator: Moderatoren

mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Makro Frage

Beitrag von mike6 »

Hallo,

mit dem nachfolgenden Makro:

#########################################################


Dim oDlg As Object
Dim sFilename As String
Dim FileNo As Integer
Dim iFilePointerValue As Integer
Dim sLine As String

Type Datensatz
sDienststellennummer As String
sDienststellennummer_1 As String
sNumerierungsbezirk As String
sPunktart As String
sPunktnummer As String
sVermarkungsart As String
sBerechnungsjahr As String
sEntstehungshinweis As String
sLagestatus As String
sLagestatus1 As String
sRW_1 As String
sRW_2 As String
sRW_3 As String
sHW_1 As String
sHW_2 As String
sHW_3 As String
End Type

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

Sub edbs_dialog_aufrufen
DialogLibraries.LoadLibrary("Standard")
oDlg = CreateUnoDialog(DialogLibraries.Standard.dlg_edbs)
oDlg.setTitle("EDBS Ergänzer - " + VERSIONSTRING)

oDlg.getControl("cmd_next").setEnable(False)
oDlg.getControl("cmd_save").setEnable(False)

oDlg.Execute()
End Sub

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

Sub datei_waehlen
Dim oFileDlg As Object
Dim sLine As String

' Dateiauswahl-Dialog öffnen
oFileDlg = createunoservice("com.sun.star.ui.dialogs.FilePicker")
oFileDlg.appendfilter("EDBS Dateien","*.edb")
oFileDlg.appendfilter("Alle Dateien","*.*")
oFileDlg.execute

If UBound(oFileDlg.Files()) <> -1 Then
' Datei öffnen
sFilename = oFileDlg.Files(0)
FileNo = Freefile()
Open sFilename For Input As #FileNo

' TESTING!!!!!
Line Input #FileNo, sLine
Line Input #FileNo, sLine

oDlg.getControl("cmd_next").setEnable(True)
End If
End Sub

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

Sub datei_schliessen
Close #FileNo
End Sub

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

Sub datensatz_einlesen
On Error Resume Next
Dim oData As Object

oData = createObject("Datensatz")

If Not EOF(#FileNo) Then
iFilePointerValue = Seek(#FileNo)

Line Input #FileNo, sLine

sTmp = Split(sLine, " ")

' Numerierungsbezirk
oData.sNumerierungsbezirk = Mid(sTmp(2), 9,8)
oDlg.getControl("numerierungsbezirk").setText(oData.sNumerierungsbezirk)

' Punktart
oData.sPunktart = Mid(sTmp(2), 17,1)
oDlg.getControl("punktart").setText(oData.sPunktart)

' Punktnummer
oData.sPunktnummer = Mid(sTmp(2), 18,5)
oDlg.getControl("punktnummer").setText(oData.sPunktnummer)

' Dienststellennummer
oData.sDienststellennummer = Mid(sTmp(2), 24,5)
oDlg.getControl("dienststellennummer").setText(oData.sDienststellennummer)

' Dienststellennummer_1
oData.sDienststellennummer_1 = Mid(sTmp(2), 29,3)
oDlg.getControl("dienststellennummer_1").setText(oData.sDienststellennummer_1)

' Vermarkungsart
oData.sVermarkungsart = sTmp(3)
oDlg.getControl("vermarkungsart").setText(oData.sVermarkungsart)

sTmp = Split(sLine, "--")

' Entstehungshinweis
oData.sEntstehungshinweis = Right(sTmp(0), 7) +"--"
oDlg.getControl("entstehungshinweis").setText(oData.sEntstehungshinweis)

' Lagestatus
oData.sLagestatus = Mid(sTmp(1), Len(sTmp(1))-10, 1)
oDlg.getControl("lagestatus").setText(oData.sLagestatus)

' Jahr der Berechnung
oData.sBerechnungsjahr = Mid(sTmp(1), Len(sTmp(1))-9, 3)
oDlg.getControl("jahr_der_berechnung").setText(oData.sBerechnungsjahr)

' LST_1
oData.sLagestatus1 = Mid(sTmp(1), Instr(sTmp(1), "B")+9, 3)
oDlg.getControl("lagestatus_1").setText(oData.sLagestatus1)

'Rechtswert_1
oData.sRW_1 = Mid(sTmp(1), Instr(sTmp(1), "B")+12, 4)
oDlg.getControl("RW_1").setText(oData.sRW_1)

'Rechtswert_2
oData.sRW_2 = Mid(sTmp(1), Instr(sTmp(1), "B")+16, 3)
oDlg.getControl("RW_2").setText(oData.sRW_2)

'Rechtswert_3
oData.sRW_3 = Mid(sTmp(1), Instr(sTmp(1), "B")+19, 3)
oDlg.getControl("RW_3").setText(oData.sRW_3)

'Hochwert_1
oData.sHW_1 = Mid(sTmp(1), Instr(sTmp(1), "B")+22, 4)
oDlg.getControl("HW_1").setText(oData.sHW_1)

'Hochwert_2
oData.sHW_2 = Mid(sTmp(1), Instr(sTmp(1), "B")+26, 3)
oDlg.getControl("HW_2").setText(oData.sHW_2)

'Hochwert_3
oData.sHW_3 = Mid(sTmp(1), Instr(sTmp(1), "B")+29, 3)
oDlg.getControl("HW_3").setText(oData.sHW_3)

oDlg.getControl("cmd_save").setEnable(True)
Else
MsgBox("Sie haben das Ende der Datei erreicht")
oDlg.getControl("cmd_next").setEnable(False)
oDlg.getControl("cmd_save").setEnable(False)
End If
End Sub

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

Sub datensatz_ueberschreiben
Dim FileNo As Integer
Dim sLineNeu As String
Dim oData As Object

oData = createObject("Datensatz")

' Struktur füllen
oData.sNumerierungsbezirk = oDlg.getControl("numerierungsbezirk").getText()
oData.sPunktart = oDlg.getControl("punktart").getText()
oData.sPunktnummer = oDlg.getControl("punktnummer").getText()
oData.sDienststellennummer = oDlg.getControl("dienststellennummer").getText()
oData.sDienststellennummer_1 = oDlg.getControl("dienststellennummer_1").getText()
oData.sVermarkungsart = oDlg.getControl("vermarkungsart").getText()
oData.sEntstehungshinweis = oDlg.getControl("entstehungshinweis").getText(
oData.sLagestatus = oDlg.getControl("lagestatus").getText()
oData.sLagestatus1 = oDlg.getControl("lagestatus_1").getText()
oData.sBerechnungsjahr = oDlg.getControl("jahr_der_berechnung").getText()
oData.sRW_1 = oDlg.getControl("RW_1").getText()
oData.sRW_2 = oDlg.getControl("RW_2").getText()
oData.sRW_3 = oDlg.getControl("RW_3").getText()
oData.sHW_1 = oDlg.getControl("HW_1").getText()
oData.sHW_2 = oDlg.getControl("HW_2").getText()
oData.sHW_3 = oDlg.getControl("HW_3").getText()

' Alten Datensatz Ausgeben (NUR ZUM TESTEN!!)
oDlg.getControl("bla").setText( oDlg.getControl("bla").getText() + Chr(13) + "ALT:" + Chr(13) + sLine )

' Neuen Datensatz bilden
sTmp = Split(sLine, " ")
sLineNeu = sLineNeu + sTmp(0) + " " + sTmp(1) + " " + mid(sTmp(2), 1, 8) + oData.sNumerierungsbezirk
sLineNeu = sLineNeu + oData.sPunktart + oData.sPunktnummer + mid(sTmp(2), 23, 1) + oData.sDienststellennummer
sLineNeu = sLineNeu + oData.sDienststellennummer_1 + mid(sTmp(2), 32, 2) + " "
sLineNeu = sLineNeu + oData.sVermarkungsart + " " + oData.sEntstehungshinweis + " "
sTmp = Split(sLine, "--")
sLineNeu = sLineNeu + mid(sTmp(1), InStr(sTmp(1), "B"), 9) + oData.sLagestatus1
sLineNeu = sLineNeu + oData.sRW_1 + oData.sRW_2 + oData.sRW_3 + oData.sHW_1 + oData.sHW_2 + oData.sHW_3 + "1"
sLineNeu = sLineNeu + " " + oData.sLagestatus + oData.sBerechnungsjahr + Right(sTmp(1), 7) + "--" + sTmp(2)

' Neuen Datensatz Ausgeben (NUR ZUM TESTEN!!)
oDlg.getControl("bla").setText( oDlg.getControl("bla").getText() + Chr(13) + "NEU:" + Chr(13) + sLineNeu )

' Datensatz in Datei schreiben
FileNo = Freefile()
Open sFilename For Output As #FileNo
Seek(#FileNo, iFilePointerValue)
Write #FileNo, sLineNeu
Close #FileNo
End Sub

#########################################################

lese ich aus der folgenden Datei:



EDBS01700000FEIN000009 0000ULPUNN 000100018000000020071240079010101 012 ...
EDBS01700000FEIN000010 0000ULPUNN 000100018000000020071400079010101 012 ...
EDBS01700000FEIN000011 0000ULPUNN 000100018000000020071670079010101 012 ...
EDBS01700000FEIN000012 0000ULPUNN 000100018000000020071830079010101 012 ...




verschiedene Angaben heraus.
Diese Angaben werden in Text-Feldern dargestellt.

Wenn ich in den Text-Feldern nun die Werte abändere und die o.a. Datei wieder speichere,
geht der Anfang der Datei verloren:



Soll:

ALT:
""EDBS01700000FEIN000002 0000ULPUNN 000100018000000020070350079010101 012""
NEU:
""EDBS01700000FEIN000002 0000ULPUNN 000100018000000020070350079010101 100""


Ist:

ALT:
01700000FEIN000003 0000ULPUNN 000100018000000020070430079010101 012""

NEU:
01700000FEIN000003 0000ULPUNN 000100018000000020070430079010101 100""


Es fehlt immer das Wort EDBS.


Wer kann den Code berichtigen?


mfg
mike6
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag von ykcim »

Auf den ersten Blick denke ich das Du die ersten vier Zeichen nicht ausliest.
Und dann auch nicht schreibst.

mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Beitrag von mike6 »

Hallo,

hier noch ein Nachtrag zu meiner Frage.
_____________________________________________________________________________
Erster Datensatz wird richtig Übernommen ( Die """ müssten noch weg )

ALT:
"""EDBS01700000FEIN000002 0000ULPUNN 000100018000000020070350079010101 100 ...."""
NEU:
"""EDBS01700000FEIN000002 0000ULPUNN 000100018000000020070350079010101 200 ...."""
_____________________________________________________________________________


Alle weiteren Datensätze werden um "EDBS" gekürzt

ALT:
1700000FEIN000003 0000ULPUNN 000100018000000020070430079010101 100 ...."""
NEU:
1700000FEIN000003 0000ULPUNN 000100018000000020070430079010101 300 ...."""
____________________________________________________________________________

Der Makro-Code ist wie folgt:



' Datensatz in Datei schreiben
FileNo = Freefile()
Open sFilename For Output As #FileNo
Seek(#FileNo, iFilePointerValue)
Write #FileNo, sLineNeu
Close #FileNo

Es scheint als nur an dem Makro " In Datei schreiben " zu liegen.

mfg
mike6
ykcim
*****
Beiträge: 324
Registriert: Di, 29.07.2003 15:22
Wohnort: Neu-Isenburg
Kontaktdaten:

Beitrag von ykcim »

Hallo Mike,

mache Dich bitte mit dem Debuggen eines Codes vertraut. Innerhalb der IDE kann man Makros Schritt für Schritt ablaufen lassen und einzelne Variablen beobachten. Deine Problem dürften die Variablen sLIne und sLineNeu sein.


mfg
Michael
__
FAQ zu Starbasic -> http://www.starbasicfaq.de
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Beitrag von mike6 »

:D

Danke.


mfg
mike6
Antworten