Here the relevant parts of the import (dtaBelegExchange.prg in ASBau ExImport)
Code: Select all
METHOD pshImp83( )
LOCAL oScr AS dlgProgress
LOCAL oDialog AS OpenDialog
LOCAL nLen AS DWORD
LOCAL nZeichen AS DWORD
LOCAL cZeile AS STRING
LOCAL cInh AS STRING
LOCAL nLines AS INT
LOCAL i AS INT
SELF:lFehler := FALSE
SELF:OZ_Maske := ""
SELF:nStruktur := 0
SELF:lEinlesPreis := FALSE
SELF:lBelInBel := FALSE // Beleg in Gewerke aufteilen
// Auswahlfenster Hidden
// Belegkopf erzeugen
IF Empty( SELF:cBeleg )
SELF:Belegkopf( )
ELSE
IF YesNo( "Soll der einzulesende Beleg als Gewerk eingefügt werden.", TRUE)
SELF:lBelInBel := TRUE
ENDIF
ENDIF
SELF:oDbf:SetOrder( "Beleg" )
IF SELF:oDbf:Seek( SELF:cBeleg )
SELF:nRec := SELF:oDbf:RecNo
SELF:oDbf:RLOCK( SELF:nRec )
ELSE
Warning( "Konnte Beleg "+ SELF:cBeleg +"nicht finden. Abbruch!")
RETURN SELF
ENDIF
// Preisübernahme aus LV?
IF YesNo( "Preise und Kalkulationen aus dem LV "+AllTrim( SELF:cBlankText )+" übernehmen?", TRUE )
SELF:lEinlesPreis := TRUE
ENDIF
// Dateiauswahl
oDialog := OpenDialog{ SELF, "*.D83" }
oDialog:Setstyle( OFN_NOCHANGEDIR, TRUE )
oDialog:InitialDirectory := "C:"
oDialog:Show( )
SELF:cFile := oDialog:filename
oDialog := NULL_OBJECT
IF .NOT. Empty( SELF:cFile ) .AND. .NOT. Empty( SELF:cBeleg )
SELF:nHandle := FOpen2(SELF:cFile, FO_READ)
IF SELF:nHandle = F_ERROR
Warning( DosErrString(FError()) )
ENDIF
cInh := MemoRead( SELF:cFile)
nLines := MLCount(cInh, 80)
oScr := dlgProgress{ AppWnd( ) , FALSE }
oScr:Max := nLines
oScr:Caption := "Einlesen in Beleg: " +SELF:cBeleg
oScr:Message := "Importstatus - Einlesen der Angebotsaufforderung"
CenterDialog( oScr )
oScr:Show( )
// Einlesen der Datei
SELF:lInsLos := FALSE
SELF:nInsLos := 0
FOR i := 1 UPTO nLines
cZeile := MemoLine(cInh, 80, i)
oScr:Inc( )
nZeichen := Len(cZeile)
SELF:Import( cZeile, "83" )
IF Left( cZeile, 2 ) == "99"
EXIT
ENDIF
IF nZeichen != 80 .OR. SELF:lFehler == TRUE
Warning("Einlesevorgang abgebrochen!")
EXIT
ENDIF
NEXT
oScr:EndDialog( 1 )
// Datei wieder schließen.
FClose( SELF:nHandle )
ENDIF
RETURN SELF
METHOD Import( cZeile, cArt)
LOCAL cTemp AS STRING
LOCAL cNr AS STRING
//LOCAL cText AS STRING
LOCAL i AS DWORD
LOCAL nPreis AS FLOAT
LOCAL nAnz AS DWORD
LOCAL nEPreis AS FLOAT
LOCAL nRecno AS DWORD
// Einleseschleife GAEB
DO CASE
// Beginn der vertraglichen Regelungen
CASE Left( cZeile, 2 ) == "T0"
// SELF:cVertTxt := ""
// Texte einer vertraglichen Regelung
CASE Left( cZeile, 2 ) == "T1"
SELF:cVertTxt += SubStr( cZeile, 3, 72 ) + UMBRUCH
// Ende der vertraglichen Regelungen
CASE Left( cZeile, 2 ) == "T9"
SELF:oDbf:Beschr := Oem2Ansi( SELF:cVertTxt )
SELF:cVertTxt := ""
// Eröffnungssatz Leistungsverzeichnis
CASE Left( cZeile, 2 ) == "00"
// Falls Zeilenart "T9" nicht kam
IF .NOT. Empty( SELF:cVertTxt )
SELF:oDbf:Beschr += Oem2Ansi( SELF:cVertTxt )
SELF:cVertTxt := ""
ENDIF
// Positionsnummernmaske (OZMaske einlesen)
SELF:OZ_Maske := SubStr( cZeile, 63, 9)
SELF:lLos := IIF( SubStr( cZeile, 74, 1 ) == "X", TRUE, FALSE )
IF .NOT. (SubStr( cZeile, 11, 2 ) == "81" .OR. ;
SubStr( cZeile, 11, 2 ) == "83" .OR. ;
SubStr( cZeile, 11, 2 ) == "84" .OR. ;
SubStr( cZeile, 11, 2 ) == "85" .OR. ;
SubStr( cZeile, 11, 2 ) == "86")
Warning("Diese Datei entspricht nicht der Datenart "+cArt+"!")
SELF:lFehler := TRUE
ELSE
SELF:oDbf:OZMaske := SELF:OZ_Maske
ENDIF
//Information Leistungsverzeichnis
CASE Left( cZeile, 2 ) == "01"
SELF:lPreise := IIF(.NOT. Empty(SubStr( cZeile, 72, 1 )), TRUE, FALSE )
// Information Projekt
CASE Left( cZeile, 2 ) == "02"
// Belegname
IF .NOT. Empty( Oem2Ansi( SubStr( cZeile, 3, 60 )))
SELF:oDbf:BauText := Oem2Ansi( SubStr( cZeile, 3, 60 ))
ENDIF
// Information Auftraggeber
CASE Left( cZeile, 2 ) == "03"
SELF:oDbf:K_Name1 := Oem2Ansi( SubStr( cZeile, 3, 60 ))
// Information Bieter/Auftragnehmer
CASE Left( cZeile, 2 ) == "04"
// Stammdaten
// Bezeichnung der Einheitspreisaufgliederung
CASE Left( cZeile, 2 ) == "06"
// Zuordnung Leistungsverzeichnis
CASE Left( cZeile, 2 ) == "07"
// ??
// Kennzeichen der Währung
CASE Left( cZeile, 2 ) == "08"
SELF:oDbf:WaeKu := SubStr( cZeile, 3, 6 )
SELF:cWhrg := AllTrim( Left( SubStr( cZeile, 3, 6 ), 3 ))
// Muß gerechnet werden?
SELF:lEuro := FALSE
SELF:lDM := FALSE
DO CASE
CASE AllTrim( SELF:oOwner:cWhrg ) == "EUR" .AND. SELF:cWhrg != "EUR"
SELF:lEuro := TRUE
CASE AllTrim( SELF:oOwner:cWhrg ) == "EUR" .AND. SELF:cWhrg == "EUR"
SELF:lEuro := FALSE
CASE AllTrim( SELF:oOwner:cWhrg ) == "DM" .AND. SELF:cWhrg != "DM"
SELF:lDM := TRUE
CASE AllTrim( SELF:oOwner:cWhrg ) == "DM" .AND. SELF:cWhrg == "DM"
SELF:lDM := FALSE
ENDCASE
SELF:oDbf:WaeBez := Oem2Ansi( SubStr( cZeile, 9, 50 ))
// Beginn des Loses
CASE Left( cZeile, 2 ) == "10"
IF cArt == "83"
IF SELF:nStruktur != 0
Warning("Strukturfehler in der GAEB Datei aufgetreten.")
SELF:lFehler := TRUE
ELSE
SELF:lInsLos := TRUE
SELF:cLosNr := SubStr( cZeile, 3, 2 )
IF .NOT. SELF:oSumm:Seek( SELF:cBeleg + SELF:cLosNr + Space( 12 ))
IF SELF:AppendSum( )
SELF:oSumm:Los := SELF:cLosNr
SELF:oSumm:Bezeich := Oem2Ansi( SubStr( cZeile, 5, 44 ))
ENDIF
SELF:AppendLine( )
SELF:oRech:Los := SELF:cLosNr
SELF:oRech:Gewerk := SELF:cGewerk
SELF:oRech:Titel := SELF:cTit
SELF:oRech:UTitel := SELF:cUTit
SELF:oRech:PosText := Oem2Ansi( SubStr( cZeile, 5, 44 ))
SELF:oRech:ZeilenArt := "L "
ELSE
Warning("Losdefinition bereits vorhanden.")
SELF:oSumm:Bezeich := Oem2Ansi( SubStr( cZeile, 5, 44 ))
ENDIF
ENDIF
ELSE
SELF:cLosNr := SubStr( cZeile, 3, 2 )
ENDIF
// Beginn der LV-Gruppe
CASE Left( cZeile, 2 ) == "11"
// Einfügen des Loses
// IF SELF:nInsLos == 1
// SELF:lInsLos := FALSE
// SELF:nInsLos := 0
// ENDIF
// IF SELF:lInsLos
// SELF:nInsLos := 1
// ELSE
// einfügen von Titeln und Gewerk
SELF:nStruktur += 1
SELF:Splitten( SubStr( cZeile, 3, 9 ), "11" ) // OZ zerlegen
IF .NOT. SELF:oSumm:Seek( SELF:cBeleg + SELF:cLosNr + SELF:cGewerk + SELF:cTit + SELF:cUTit)
SELF:AppendSum( )
SELF:oSumm:Blankett := SELF:cBlank
SELF:oSumm:Los := SELF:cLosNr
SELF:oSumm:Gewerk := SELF:cGewerk
SELF:oSumm:Titel := SELF:cTit
SELF:oSumm:UTitel := SELF:cUTit
SELF:AppendLine( )
SELF:oRech:Los := SELF:cLosNr
SELF:oRech:Gewerk := AllTrim( SELF:cGewerk )
SELF:oRech:Titel := AllTrim( SELF:cTit )
SELF:oRech:UTitel := AllTrim( SELF:cUTit )
// Zeilentyp ermitteln
DO CASE
CASE SELF:nStruktur == 1
DO CASE
CASE SELF:nMax == 3
SELF:oRech:ZeilenArt := "G "
CASE SELF:nMax == 2 .AND. Empty( SELF:cUTit )
SELF:oRech:ZeilenArt := "T "
CASE SELF:nMax == 2 .AND. .NOT. Empty( SELF:cUTit )
SELF:oRech:ZeilenArt := "U "
CASE SELF:nMax == 1
SELF:oRech:ZeilenArt := "T "
ENDCASE
CASE SELF:nStruktur == 2
DO CASE
CASE SELF:nMax == 3
SELF:oRech:ZeilenArt := "T "
CASE SELF:nMax == 2
SELF:oRech:ZeilenArt := "U "
ENDCASE
CASE SELF:nStruktur == 3
SELF:oRech:ZeilenArt := "U "
ENDCASE
// SELF:oRech:Skip( 0 )
// ELSE
// Warning("Beleg-Strukturdefinition bereits vorhanden.")
// ENDIF
ENDIF
// Bezeichnung der LV-Gruppe
CASE Left( cZeile, 2 ) == "12"
cTemp := AllTrim( SELF:oSumm:Bezeich )
SELF:oSumm:Bezeich := IIF( Empty( cTemp ), Oem2Ansi( SubStr( cZeile, 3, 40)), cTemp + " " + Oem2Ansi( SubStr( cZeile, 3, 40)) )
SELF:oRech:PosText := IIF( Empty( cTemp ), Oem2Ansi( SubStr( cZeile, 3, 40)), cTemp + " " + Oem2Ansi( SubStr( cZeile, 3, 40)) )
// Beginn eines Hinweistextes
CASE Left(cZeile,2) == "20"
// ?? wohin damit???
// Beginn einer Teilleistung (Position)
CASE Left(cZeile,2) == "21"
IF cArt == "83"
SELF:lFirstPos := TRUE
SELF:Splitte