 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
michaelblasin
Anmeldungsdatum: 09.11.2010 Beiträge: 38
|
Verfasst am: 18.11.2014, 10:14 Titel: Qbasic - Freebasic Random Dateien |
|
|
Hallo,
Ich habe eine Random Datei mit einer Satzlaenge von 384, erstellt mit QB.
Auch mit QB64 gibt es keine Probleme beim Lesen oder Schreiben der Datei. Dasgleiche Programm läuft ohne Änderungen.
Der mit TYPE deklarierte Typenname nach TYPE TypenName AS DatenTyp in QBasic und QB64 hat diegleiche Länge des DatenTyps (in meinem konkretem Fall 384).
Aber in FreeBasic ist die Länge 452. Laenge durch LEN(DatenTyp)
Das Ergenis des Lesens ist natürlich ein ziemliches Durcheinander.
Kennt jemand eine Lösung?
Gruss Michael |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 18.11.2014, 11:45 Titel: |
|
|
Zeig mal dein Type.
Es gibt mehrere Dinge die Falsch laufen können, weil FreeBasic sich etwas unterscheidet:
Du solltest "Type mit FIELD = 1" verwenden.
http://www.freebasic-portal.de/befehlsreferenz/field-236.html
Integer sind in QB 2-Byte in FB normalerweise 4 manchmal auch 8 Byte je nach Target Plattform (32bit oder 64bit) d.h. nutze in FB
Short-2 Byte
Long 4-Byte
LongInt 8-Byte
Strings fester Länge sind glaube ich ein Byte länger wegen eines NULL Zeichens am Ende. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 18.11.2014, 19:05 Titel: |
|
|
@Stringlänge: Richtig, in FreeBASIC werden allen Strings ein Nullbyte angehängt (ähnlich ZSTRING, nur nicht terminierend) zur besseren Kompatibilität mit C-Bibliotheken.
Als Lösung könnte man die Daten durch eine selbst gestrickte Routine auslesen und ggf. neu (in "FB-Format") speichern (siehe BINARY); bietet sich insb. an, wenn die Daten in Zukunft nur noch mit FB verwendet werden sollen - wenn ein zeitgleicher Einsatz von QB geplant ist, wird das natürlich unangenehm. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 19.11.2014, 11:49 Titel: |
|
|
Ich habe da etwas für michaelblasin gebastelt und als private Nachricht geschickt. Mit seiner Erlaubnis veröffentliche ich es hier. |
|
Nach oben |
|
 |
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 19.11.2014, 12:17 Titel: |
|
|
UDT's, die mit QB erzeugt und als Datensatz gespeichert wurden, koennen in FB einfach als Binaer-Datei gelesen werden.
Code: |
Type TMeinTyp
Deine Datenfelder
End Type
dim as TMeinTyp MeineDaten
' in FB muss jetzt die Datei Binaer geoeffnet werden und die Datensatzposition mit -Datensatznummer * Datensatzlaenge-
' ermittelt werden. Die Datensatzlaenge bezieht sich hier auf die laenge unter QB Eingelesen wird dann so:
Get #DateiHandle, Satzposition, MeineDaten.Datenfeld1
Get #DateiHandle, , MeineDaten.naechstesfeld
' u.s.w
|
Wenn du das genau so Speicherst, dann kannst du die Datei auch wieder mit QB lesen. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 19.11.2014, 13:13 Titel: |
|
|
Elor, das Problem mit den unterschiedlichen Stringlängen hast du dabei leider immer noch. Da müsste man dann ggf. noch bei Bedarf mit SEEK den Zeiger verschieben. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 19.11.2014, 13:43 Titel: |
|
|
Ich werde jetzt mal meinen Ansatz kundtun:
Code: | #Macro DeclareProperty(feldname,laenge)
Declare Property feldname() AS STRING
Declare Property feldname(new##feldname AS STRING)
l##feldname(1 To laenge) AS UBYTE
#EndMacro
#Macro AddProperty(typ,feldname)
Property ##typ.##feldname() AS String
Dim s As String = Space(UBound(l##feldname))
For i As Integer = 1 To UBound(l##feldname)
s[i-1]=l##feldname(i)
Next
Return s
End Property
Property ##typ.##feldname(new##feldname as String)
For i As Integer = 1 To UBound(l##feldname)
if i>len(new##feldname) Then Return
l##feldname(i)=new##feldname[i-1]
Next
End Property
#EndMacro
TYPE StockTyp Field = 1
DeclareProperty(LagFeldChar,1)
DeclareProperty(KundenNr,6)
DeclareProperty(EKReNrJahr,6)
DeclareProperty(ZugangsArt,1)
DeclareProperty(EKReNr,6)
DeclareProperty(PalettenNr,8)
DeclareProperty(AuftragNrJahr,6)
DeclareProperty(AuftragNr,6)
DeclareProperty(ZeilenNr,4)
DeclareProperty(UnterZeilenNr,2)
DeclareProperty(WaKategory,3)
DeclareProperty(Matname,20)
MatDateiNr AS Short
DeclareProperty(MatQualitaet,1)
DeclareProperty(Matkode,6)
DeclareProperty(FliesFase,3)
DeclareProperty(Politur,3)
DeclareProperty(OberflaecheChemie,3)
DeclareProperty(OberflaecheSchnitt,3)
DeclareProperty(PoliturRueckseite,3)
DeclareProperty(PackingKode,3)
DeclareProperty(PackPalKode,3)
DeclareProperty(PackKartKode,3)
DeclareProperty(Wendel,1)
DeclareProperty(Laenge,4)
DeclareProperty(Breite,4)
DeclareProperty(Hoehe,4)
DeclareProperty(LaengeDispo,4)
DeclareProperty(BreiteDispo,4)
DeclareProperty(HoeheDispo,4)
DeclareProperty(LaengeVon,4)
DeclareProperty(LaengeBis,4)
DeclareProperty(KantenArt1,3)
DeclareProperty(PoliturKante1,3)
DeclareProperty(KantenSeiten1,4)
DeclareProperty(Widerkehr1,1)
DeclareProperty(KantenKopfLaenge1L,3)
DeclareProperty(KantenKopfLaenge1R,3)
DeclareProperty(KantenArt2,3)
DeclareProperty(PoliturKante2,3)
DeclareProperty(KantenSeiten2,4)
DeclareProperty(Widerkehr2,1)
DeclareProperty(KantenKopfLaenge2L,3)
DeclareProperty(KantenKopfLaenge2R,3)
DeclareProperty(KantenArt3,3)
DeclareProperty(PoliturKante3,3)
DeclareProperty(KantenSeiten3,4)
DeclareProperty(Widerkehr3,1)
DeclareProperty(KantenKopfLaenge3L,3)
DeclareProperty(KantenKopfLaenge3R,3)
DeclareProperty(ArtWassernase,3)
DeclareProperty(WassernaseSeiten,4)
DeclareProperty(WassernaseKopfLaengeL,3)
DeclareProperty(WassernaseKopfLaengeR,3)
DeclareProperty(ArtRutschstreifen,3)
DeclareProperty(RutschstreifenSeiten,4)
DeclareProperty(RutschstreifenBreite,3)
DeclareProperty(RutschstreifenAbstand,3)
DeclareProperty(RutschstreifenAbstandLinks,3)
DeclareProperty(RutschstreifenAbstandRechts,3)
DeclareProperty(RutschstreifenKopfLaengeL,3)
DeclareProperty(RutschstreifenBreiteL,3)
DeclareProperty(RutschstreifenAbstandL,3)
DeclareProperty(RutschstreifenKopfLaengeR,3)
DeclareProperty(RutschstreifenBreiteR,3)
DeclareProperty(RutschstreifenAbstandR,3)
DeclareProperty(LagerPlatz,10)
DeclareProperty(EkReAuftragVergleich,1)
InventurMenge AS LONG
InventurWert AS DOUBLE
InventurAbgangMenge AS LONG
InventurAbgangWert AS DOUBLE
LagerZugang AS LONG
LagerZugangWert AS DOUBLE
LagerAbgang AS LONG
LagerAbgangWert AS DOUBLE
LagerMindestMenge AS LONG
KundenLagerBestellung AS LONG
KundenLagerBestellungWert AS DOUBLE
KundenAuftragBestellung AS LONG
KundenAuftragBestellungWert AS DOUBLE
LiefLagerBestellung AS LONG
LiefLagerBestellungWert AS DOUBLE
LiefAuftragBestellung AS LONG
LiefAuftragBestellungWert AS DOUBLE
LiefLagerUnterwegs AS LONG
LiefLagerUnterwegsWert AS DOUBLE
LiefAuftragUnterwegs AS LONG
LiefAuftragUnterwegsWert AS DOUBLE
GRLAGSTMenge AS LONG
DeclareProperty(LeerFeld,9)
END TYPE
AddProperty(StockTyp,LagFeldChar)
AddProperty(StockTyp,KundenNr)
AddProperty(StockTyp,ZugangsArt)
AddProperty(StockTyp,EKReNrJahr)
AddProperty(StockTyp,EKReNr)
AddProperty(StockTyp,PalettenNr)
AddProperty(StockTyp,AuftragNrJahr)
AddProperty(StockTyp,AuftragNr)
AddProperty(StockTyp,ZeilenNr)
AddProperty(StockTyp,UnterZeilenNr)
AddProperty(StockTyp,WaKategory)
AddProperty(StockTyp,Matname)
AddProperty(StockTyp,MatQualitaet)
AddProperty(StockTyp,Matkode)
AddProperty(StockTyp,FliesFase)
AddProperty(StockTyp,Politur)
AddProperty(StockTyp,OberflaecheChemie)
AddProperty(StockTyp,OberflaecheSchnitt)
AddProperty(StockTyp,PoliturRueckseite)
AddProperty(StockTyp,PackingKode)
AddProperty(StockTyp,PackPalKode)
AddProperty(StockTyp,PackKartKode)
AddProperty(StockTyp,Wendel)
AddProperty(StockTyp,Laenge)
AddProperty(StockTyp,Breite)
AddProperty(StockTyp,Hoehe)
AddProperty(StockTyp,LaengeDispo)
AddProperty(StockTyp,BreiteDispo)
AddProperty(StockTyp,HoeheDispo)
AddProperty(StockTyp,LaengeVon)
AddProperty(StockTyp,LaengeBis)
AddProperty(StockTyp,KantenArt1)
AddProperty(StockTyp,PoliturKante1)
AddProperty(StockTyp,KantenSeiten1)
AddProperty(StockTyp,Widerkehr1)
AddProperty(StockTyp,KantenKopfLaenge1L)
AddProperty(StockTyp,KantenKopfLaenge1R)
AddProperty(StockTyp,KantenArt2)
AddProperty(StockTyp,PoliturKante2)
AddProperty(StockTyp,KantenSeiten2)
AddProperty(StockTyp,Widerkehr2)
AddProperty(StockTyp,KantenKopfLaenge2L)
AddProperty(StockTyp,KantenKopfLaenge2R)
AddProperty(StockTyp,KantenArt3)
AddProperty(StockTyp,PoliturKante3)
AddProperty(StockTyp,KantenSeiten3)
AddProperty(StockTyp,Widerkehr3)
AddProperty(StockTyp,KantenKopfLaenge3L)
AddProperty(StockTyp,KantenKopfLaenge3R)
AddProperty(StockTyp,ArtWassernase)
AddProperty(StockTyp,WassernaseSeiten)
AddProperty(StockTyp,WassernaseKopfLaengeL)
AddProperty(StockTyp,WassernaseKopfLaengeR)
AddProperty(StockTyp,ArtRutschstreifen)
AddProperty(StockTyp,RutschstreifenSeiten)
AddProperty(StockTyp,RutschstreifenBreite)
AddProperty(StockTyp,RutschstreifenAbstand)
AddProperty(StockTyp,RutschstreifenAbstandLinks)
AddProperty(StockTyp,RutschstreifenAbstandRechts)
AddProperty(StockTyp,RutschstreifenKopfLaengeL)
AddProperty(StockTyp,RutschstreifenBreiteL)
AddProperty(StockTyp,RutschstreifenAbstandL)
AddProperty(StockTyp,RutschstreifenKopfLaengeR)
AddProperty(StockTyp,RutschstreifenBreiteR)
AddProperty(StockTyp,RutschstreifenAbstandR)
AddProperty(StockTyp,LagerPlatz)
AddProperty(StockTyp,EkReAuftragVergleich)
AddProperty(StockTyp,LeerFeld)
'### Hauptprogramm #######
Dim StockKode AS StockTyp
Print Len(StockKode)
StockKode.LagFeldChar = "Hallo"
Print StockKode.LagFeldChar
StockKode.LeerFeld = "abcd"
Print StockKode.LeerFeld
sleep
|
|
|
Nach oben |
|
 |
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 19.11.2014, 14:49 Titel: |
|
|
Zitat: |
Elor, das Problem mit den unterschiedlichen Stringlängen hast du dabei leider immer noch. Da müsste man dann ggf. noch bei Bedarf mit SEEK den Zeiger verschieben.
|
@nemored:
Das ist so nicht ganz richtig, da bei einem UDT die Stringlaenge immer angegeben ist. Diese angegebene Stringlaenge stellt beim lesen oder
Schreiben in/aus Binaerdateien einen Lese/Schreibpuffer dar. Der Dateizeiger wird dabei Automatisch auf den naechten Feldeintrag gesetzt. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 19.11.2014, 17:05 Titel: |
|
|
Hallo michaelblasin!
Das einfachste dürfte sein, in der FB-Version des Programms die Datentypen innerhalb des UDT so anzupassen, daß der Speicherbedarf mit dem von QB übereinstimmt. Also Integer wird zu Short, String*10 wird zu ZString*10 (bzw. alternativ: String*10 wird zu String*9). Die nutzbare Länge der Strings vermindert sich dann zwar um 1 Zeichen, aber die Datei kann -sowohl lesend als auch schreibend- unverändert weiterbenutzt werden.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 19.11.2014, 17:39 Titel: |
|
|
Zitat: | @nemored:
Das ist so nicht ganz richtig, da bei einem UDT die Stringlaenge immer angegeben ist. Diese angegebene Stringlaenge stellt beim lesen oder
Schreiben in/aus Binaerdateien einen Lese/Schreibpuffer dar. Der Dateizeiger wird dabei Automatisch auf den naechten Feldeintrag gesetzt. |
Nichtsdestotrotz erwartet QB bei einem STRING*10 einen 10 Byte langen Eintrag, FB dagegen einen 11 Byte langen Eintrag. FB setzt damit beim automatischen Weiterrücken um ein Byte weiter als es QB tut (vgl. auch grindstones Posting). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 19.11.2014, 19:04 Titel: |
|
|
@nemored: Wenn unter FB ein UDT erstellt wird, wird nach einem STRING-Feld ein leerzeichen eingefuehgt. Bei verwendung in RANDOM-
Dateien verlangt FB nach diesem Zeichen, soweit sind wir doch einer Meinung.
Wenn aber einzellne Felder des UDT's verwendet werden, z.B. um Daten von einer mit QB erstellten RANDOM-Datei zu lesen, dann ist es FB egal ob
nach dem String-Feld ein 0Byte im UDT steht. Wenn dieses Feld mit 20 Zeichen Deklariert wurde, dann werden auch nur 20 Byte eingelesen.
Da in QB aber kein zusatzbyte verwendet wird, zeigt der Dateizeiger Automatisch auf das erste Zeichen des naechsten Feldes. Ich hab das schon
x-mal so gemacht und hat immer sehr gut Funktioniert.
Aber.. Wenn es einen nicht stoert das da an einem Stringende ein Zeichen fehlen kann, ist die Variante von grindstone besser als meine weil sich ein
QB-Programm viel schneller und einfacher auf FB umstellen laesst. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 19.11.2014, 19:48 Titel: |
|
|
Ich habe das nochmal getestet; scheinbar hatte ich da was falsch in Erinnerung. Wir hatten vor einigen Monaten eine sehr ähnliche Fragestellung, bei der dieses einzelne Einlesen nicht funktionierte, aber möglicherweise scheiterte das wegen etwas ganz anderem. Wie auch immer, ich ziehe meine obige Aussage zurück und behaupte vorerst einmal das Gegenteil.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
micha
Anmeldungsdatum: 09.12.2005 Beiträge: 72
|
Verfasst am: 19.11.2014, 21:44 Titel: |
|
|
RockTheSchock hat Folgendes geschrieben: | Integer sind in QB 2-Byte in FB normalerweise 4 manchmal auch 8 Byte je nach Target Plattform (32bit oder 64bit) | Bist Du Dir da auch ganz sicher ?
Ich dachte immer:
FreeBASIC Integer und Long ist 4 byte unter Win32/Win64 und Linux_X86.
FreeBASIC Long und Enum ist 8 byte aber nur unter Linux_x86_64
Also nur unter 64bit Linux ändert sich etwas bei FreeBASIC.
Natürlich sind Zeiger/Pointer entweder 32 oder 64 bit breit.
micha |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 19.11.2014, 22:12 Titel: |
|
|
Zitat: | Bist Du Dir da auch ganz sicher ? |
Jetzt ja! Es gab da eine lange Diskussion drüber, wobei letztlich Integer als Standard Datentyp ausgewählt wurde, dessen Länge mit der Plattform wechselt, analog zu QB 16bit / FB 32bit.
Ein kleiner Test:
Code: | FreeBASIC 1.00.0 gcc 32 bit
SizeOf:
byte 1
short 2
long 4
longint 8
integer 4
any ptr 4
String 12
|
Code: | FreeBASIC 1.00.0 gcc 64 bit
SizeOf:
byte 1
short 2
long 4
longint 8
integer 8
any ptr 8
String 24
|
|
|
Nach oben |
|
 |
micha
Anmeldungsdatum: 09.12.2005 Beiträge: 72
|
Verfasst am: 20.11.2014, 04:31 Titel: |
|
|
RockTheSchock hat Folgendes geschrieben: | Code: | 32 bit
long 4
integer 4 |
Code: | 64 bit
long 4
integer 8 |
| Danke und was ist mit ENUM gcc 64bit Windows / Linux ?
micha |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 20.11.2014, 10:30 Titel: |
|
|
Ich fürchte, mein Vorschlag war etwas voreilig, die Sache ist doch etwas komplizierter.
Zum Vergleich zwei kleine Testprogramme, zunächst für FB: Code: | Type tkomm
text1 As String *10
zahl As Short
text2 As String *10
End Type
Dim ko As tkomm
Dim As String h
ko.text1 = "abcdefghijklmno"
ko.zahl = -1
ko.text2 = "abcdefghijklmno"
Kill "c:\test.txt"
Open "c:\test.txt" For Binary As #1
Put #1,, ko
Close 1
Open "c:\test.txt" For Binary As #1
Print Lof(1)
Print SizeOf(ko)
h = Input(Lof(1),#1)
For x As Integer = 0 To Len(h)-1
Print h[x];" ";
Next
Close
Sleep
End |
und dann das gleiche noch einmal für QB: Code: | TYPE tkomm
text1 AS STRING * 10
zahl AS INTEGER
text2 AS STRING * 10
END TYPE
DIM ko AS tkomm
KILL "c:\test.txt"
CLS
ko.text1 = "abcdefghijklmno"
ko.zahl = -1
ko.text2 = "abcdefghijklmno"
OPEN "c:\test.txt" FOR BINARY AS #1
PUT #1, , ko
CLOSE 1
OPEN "c:\test.txt" FOR BINARY AS #1
PRINT LOF(1)
h$ = INPUT$(LOF(1), #1)
FOR x% = 1 TO LEN(h$)
PRINT ASC(MID$(h$, x%, 1)); " ";
NEXT
CLOSE
SLEEP
END
|
Wie man sieht, hängt FB an jeden String noch zwei Nullbytes an. Als Lösung sehe ich da nur die Möglichkeit, die Datei als Binary zu öffnen, jeweils einen Datensatz als String passender Länge einzulesen und diesen dann "zu Fuß" in die passenden Variablen umzuwandeln, etwa in dieser Art (die Datei "Test.txt" ist die, welche von QB angelegt wurde): Code: | Type tkomm
text1 As String *10
zahl As Short
text2 As String *10
End Type
Dim ko As tkomm
Dim As String h
Open "c:\test.txt" For Binary As #1
h = Input(22,#1) 'datensatzlänge von QB
ko.text1 = Mid(h,1,10) 'text1 isolieren
ko.zahl = CVShort(Mid(h,11,2)) '2-byte-string in short-zahl umwandeln
ko.text2 = Mid(h,13,10) ' text2 isolieren
Print ko.text1
Print ko.zahl
Print ko.text2
Close
Sleep
End |
Umgekehrt (wenn man das Dateiformat beibehalten möchte) geht das natürlich auch:
Code: | h = ko.text1 + MkShort(ko.zahl) + ko.text2
Open "c:\test.txt" For Output As #1
Print #1, h;
Close
| Diese Datei stimmt mit der von QB geschriebenen überein.
Gruß
grindstone
EDIT: Alternativ kann man auch jede Variable des UDT einzeln aus der Datei einlesen (in der richtigen Reihenfolge): Code: | Type tkomm
text1 As String *10
zahl As Short
text2 As String *10
End Type
Dim ko As tkomm
Open "c:\test.txt" For Input As #1
Get #1,,ko.text1
Get #1,,ko.zahl
Get #1,,ko.text2
Print ko.text1
Print ko.zahl
Print ko.text2
Sleep |
_________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 20.11.2014, 11:15 Titel: |
|
|
Wenn du alle Felder einzeln liest bzw. speicherst geht es. Du musst dich halt für eine Methode entscheiden:
- Datei einlesen jedes Feld einzeln und im neuen FB Format als ganze Datensätze in neuer Datei speichern. Dann bleibt dein Programm schön kompakt. Zum Einlesen kannst du die Laden Routine von unten verwenden. Dann kannst du dein QB Programm nicht mehr parallel verwenden!
- Die Speicherlänge der einzelnen Felder von Strings mit ByteArrays simulieren und den Zugriff auf diese Felder per Properties regeln. (siehe mein Beispiel oben)
- Die Datei Routinen zum Lesen / Speichern einzelner Datensätze anpassen, indem die Felder alle einzeln gelesen/geschrieben werden. Dazu ein Beispiel:
'Test14.bas
Code: | Const StockTypSize = 384
TYPE StockTyp Field = 1
Declare Sub Speichern(dateiname As String,datensatz As Integer)
Declare Sub Laden(dateiname As String,datensatz As Integer)
LagFeldChar AS STRING * 1
KundenNr AS STRING * 6
EKReNrJahr AS STRING * 6
ZugangsArt AS STRING * 1
EKReNr AS STRING * 6
PalettenNr AS STRING * 8
AuftragNrJahr AS STRING * 6
AuftragNr AS STRING * 6
ZeilenNr AS STRING * 4
UnterZeilenNr AS STRING * 2
WaKategory AS STRING * 3
Matname AS STRING * 20
MatDateiNr AS SHORT
MatQualitaet AS STRING * 1
Matkode AS STRING * 6
FliesFase AS STRING * 3
Politur AS STRING * 3
OberflaecheChemie AS STRING * 3
OberflaecheSchnitt AS STRING * 3
PoliturRueckseite AS STRING * 3
PackingKode AS STRING * 3
PackPalKode AS STRING * 3
PackKartKode AS STRING * 3
Wendel AS STRING * 1
Laenge AS STRING * 4
Breite AS STRING * 4
Hoehe AS STRING * 4
LaengeDispo AS STRING * 4
BreiteDispo AS STRING * 4
HoeheDispo AS STRING * 4
LaengeVon AS STRING * 4
LaengeBis AS STRING * 4
KantenArt1 AS STRING * 3
PoliturKante1 AS STRING * 3
KantenSeiten1 AS STRING * 4
Widerkehr1 AS STRING * 1
KantenKopfLaenge1L AS STRING * 3
KantenKopfLaenge1R AS STRING * 3
KantenArt2 AS STRING * 3
PoliturKante2 AS STRING * 3
KantenSeiten2 AS STRING * 4
Widerkehr2 AS STRING * 1
KantenKopfLaenge2L AS STRING * 3
KantenKopfLaenge2R AS STRING * 3
KantenArt3 AS STRING * 3
PoliturKante3 AS STRING * 3
KantenSeiten3 AS STRING * 4
Widerkehr3 AS STRING * 1
KantenKopfLaenge3L AS STRING * 3
KantenKopfLaenge3R AS STRING * 3
ArtWassernase AS STRING * 3
WassernaseSeiten AS STRING * 4
WassernaseKopfLaengeL AS STRING * 3
WassernaseKopfLaengeR AS STRING * 3
ArtRutschstreifen AS STRING * 3
RutschstreifenSeiten AS STRING * 4
RutschstreifenBreite AS STRING * 3
RutschstreifenAbstand AS STRING * 3
RutschstreifenAbstandLinks AS STRING * 3
RutschstreifenAbstandRechts AS STRING * 3
RutschstreifenKopfLaengeL AS STRING * 3
RutschstreifenBreiteL AS STRING * 3
RutschstreifenAbstandL AS STRING * 3
RutschstreifenKopfLaengeR AS STRING * 3
RutschstreifenBreiteR AS STRING * 3
RutschstreifenAbstandR AS STRING * 3
LagerPlatz AS STRING * 10
EkReAuftragVergleich AS STRING * 1
InventurMenge AS LONG
InventurWert AS DOUBLE
InventurAbgangMenge AS LONG
InventurAbgangWert AS DOUBLE
LagerZugang AS LONG
LagerZugangWert AS DOUBLE
LagerAbgang AS LONG
LagerAbgangWert AS DOUBLE
LagerMindestMenge AS LONG
KundenLagerBestellung AS LONG
KundenLagerBestellungWert AS DOUBLE
KundenAuftragBestellung AS LONG
KundenAuftragBestellungWert AS DOUBLE
LiefLagerBestellung AS LONG
LiefLagerBestellungWert AS DOUBLE
LiefAuftragBestellung AS LONG
LiefAuftragBestellungWert AS DOUBLE
LiefLagerUnterwegs AS LONG
LiefLagerUnterwegsWert AS DOUBLE
LiefAuftragUnterwegs AS LONG
LiefAuftragUnterwegsWert AS DOUBLE
GRLAGSTMenge AS LONG
LeerFeld AS STRING * 9
END Type
Sub StockTyp.Speichern(dateiname As String,datensatz As Integer)
Dim As Integer datei
Dim As LongInt start
start = datensatz*StockTypSize+1
datei = FreeFile
Open dateiname For Binary Access Write As datei
Print "Speichern",dateiname, datensatz
PUT #datei,start,LagFeldChar
PUT #datei,,KundenNr
PUT #datei,,EKReNrJahr
PUT #datei,,ZugangsArt
PUT #datei,,EKReNr
PUT #datei,,PalettenNr
PUT #datei,,AuftragNrJahr
PUT #datei,,AuftragNr
PUT #datei,,ZeilenNr
PUT #datei,,UnterZeilenNr
PUT #datei,,WaKategory
PUT #datei,,Matname
PUT #datei,,MatDateiNr
PUT #datei,,MatQualitaet
PUT #datei,,Matkode
PUT #datei,,FliesFase
PUT #datei,,Politur
PUT #datei,,OberflaecheChemie
PUT #datei,,OberflaecheSchnitt
PUT #datei,,PoliturRueckseite
PUT #datei,,PackingKode
PUT #datei,,PackPalKode
PUT #datei,,PackKartKode
PUT #datei,,Wendel
PUT #datei,,Laenge
PUT #datei,,Breite
PUT #datei,,Hoehe
PUT #datei,,LaengeDispo
PUT #datei,,BreiteDispo
PUT #datei,,HoeheDispo
PUT #datei,,LaengeVon
PUT #datei,,LaengeBis
PUT #datei,,KantenArt1
PUT #datei,,PoliturKante1
PUT #datei,,KantenSeiten1
PUT #datei,,Widerkehr1
PUT #datei,,KantenKopfLaenge1L
PUT #datei,,KantenKopfLaenge1R
PUT #datei,,KantenArt2
PUT #datei,,PoliturKante2
PUT #datei,,KantenSeiten2
PUT #datei,,Widerkehr2
PUT #datei,,KantenKopfLaenge2L
PUT #datei,,KantenKopfLaenge2R
PUT #datei,,KantenArt3
PUT #datei,,PoliturKante3
PUT #datei,,KantenSeiten3
PUT #datei,,Widerkehr3
PUT #datei,,KantenKopfLaenge3L
PUT #datei,,KantenKopfLaenge3R
PUT #datei,,ArtWassernase
PUT #datei,,WassernaseSeiten
PUT #datei,,WassernaseKopfLaengeL
PUT #datei,,WassernaseKopfLaengeR
PUT #datei,,ArtRutschstreifen
PUT #datei,,RutschstreifenSeiten
PUT #datei,,RutschstreifenBreite
PUT #datei,,RutschstreifenAbstand
PUT #datei,,RutschstreifenAbstandLinks
PUT #datei,,RutschstreifenAbstandRechts
PUT #datei,,RutschstreifenKopfLaengeL
PUT #datei,,RutschstreifenBreiteL
PUT #datei,,RutschstreifenAbstandL
PUT #datei,,RutschstreifenKopfLaengeR
PUT #datei,,RutschstreifenBreiteR
PUT #datei,,RutschstreifenAbstandR
PUT #datei,,LagerPlatz
PUT #datei,,EkReAuftragVergleich
PUT #datei,,InventurMenge
PUT #datei,,InventurWert
PUT #datei,,InventurAbgangMenge
PUT #datei,,InventurAbgangWert
PUT #datei,,LagerZugang
PUT #datei,,LagerZugangWert
PUT #datei,,LagerAbgang
PUT #datei,,LagerAbgangWert
PUT #datei,,LagerMindestMenge
PUT #datei,,KundenLagerBestellung
PUT #datei,,KundenLagerBestellungWert
PUT #datei,,KundenAuftragBestellung
PUT #datei,,KundenAuftragBestellungWert
PUT #datei,,LiefLagerBestellung
PUT #datei,,LiefLagerBestellungWert
PUT #datei,,LiefAuftragBestellung
PUT #datei,,LiefAuftragBestellungWert
PUT #datei,,LiefLagerUnterwegs
PUT #datei,,LiefLagerUnterwegsWert
PUT #datei,,LiefAuftragUnterwegs
PUT #datei,,LiefAuftragUnterwegsWert
PUT #datei,,GRLAGSTMenge
PUT #datei,,LeerFeld
Close datei
End Sub
Sub StockTyp.Laden(dateiname As String,datensatz As Integer)
Dim As Integer datei
Dim As LongInt start, ende
start = datensatz*StockTypSize+1
ende = start+StockTypSize
datei = FreeFile
Open dateiname For Binary Access Read As datei
If ende>Lof(datei) Then
Print "Datei enthält weniger Datensätze:"
Close datei
Return
EndIf
Print "Laden",dateiname, datensatz
GET #datei,start,LagFeldChar
GET #datei,,KundenNr
GET #datei,,EKReNrJahr
GET #datei,,ZugangsArt
GET #datei,,EKReNr
GET #datei,,PalettenNr
GET #datei,,AuftragNrJahr
GET #datei,,AuftragNr
GET #datei,,ZeilenNr
GET #datei,,UnterZeilenNr
GET #datei,,WaKategory
GET #datei,,Matname
GET #datei,,MatDateiNr
GET #datei,,MatQualitaet
GET #datei,,Matkode
GET #datei,,FliesFase
GET #datei,,Politur
GET #datei,,OberflaecheChemie
GET #datei,,OberflaecheSchnitt
GET #datei,,PoliturRueckseite
GET #datei,,PackingKode
GET #datei,,PackPalKode
GET #datei,,PackKartKode
GET #datei,,Wendel
GET #datei,,Laenge
GET #datei,,Breite
GET #datei,,Hoehe
GET #datei,,LaengeDispo
GET #datei,,BreiteDispo
GET #datei,,HoeheDispo
GET #datei,,LaengeVon
GET #datei,,LaengeBis
GET #datei,,KantenArt1
GET #datei,,PoliturKante1
GET #datei,,KantenSeiten1
GET #datei,,Widerkehr1
GET #datei,,KantenKopfLaenge1L
GET #datei,,KantenKopfLaenge1R
GET #datei,,KantenArt2
GET #datei,,PoliturKante2
GET #datei,,KantenSeiten2
GET #datei,,Widerkehr2
GET #datei,,KantenKopfLaenge2L
GET #datei,,KantenKopfLaenge2R
GET #datei,,KantenArt3
GET #datei,,PoliturKante3
GET #datei,,KantenSeiten3
GET #datei,,Widerkehr3
GET #datei,,KantenKopfLaenge3L
GET #datei,,KantenKopfLaenge3R
GET #datei,,ArtWassernase
GET #datei,,WassernaseSeiten
GET #datei,,WassernaseKopfLaengeL
GET #datei,,WassernaseKopfLaengeR
GET #datei,,ArtRutschstreifen
GET #datei,,RutschstreifenSeiten
GET #datei,,RutschstreifenBreite
GET #datei,,RutschstreifenAbstand
GET #datei,,RutschstreifenAbstandLinks
GET #datei,,RutschstreifenAbstandRechts
GET #datei,,RutschstreifenKopfLaengeL
GET #datei,,RutschstreifenBreiteL
GET #datei,,RutschstreifenAbstandL
GET #datei,,RutschstreifenKopfLaengeR
GET #datei,,RutschstreifenBreiteR
GET #datei,,RutschstreifenAbstandR
GET #datei,,LagerPlatz
GET #datei,,EkReAuftragVergleich
GET #datei,,InventurMenge
GET #datei,,InventurWert
GET #datei,,InventurAbgangMenge
GET #datei,,InventurAbgangWert
GET #datei,,LagerZugang
GET #datei,,LagerZugangWert
GET #datei,,LagerAbgang
GET #datei,,LagerAbgangWert
GET #datei,,LagerMindestMenge
GET #datei,,KundenLagerBestellung
GET #datei,,KundenLagerBestellungWert
GET #datei,,KundenAuftragBestellung
GET #datei,,KundenAuftragBestellungWert
GET #datei,,LiefLagerBestellung
GET #datei,,LiefLagerBestellungWert
GET #datei,,LiefAuftragBestellung
GET #datei,,LiefAuftragBestellungWert
GET #datei,,LiefLagerUnterwegs
GET #datei,,LiefLagerUnterwegsWert
GET #datei,,LiefAuftragUnterwegs
GET #datei,,LiefAuftragUnterwegsWert
GET #datei,,GRLAGSTMenge
GET #datei,,LeerFeld
Close datei
End Sub
DIM StockKode AS StockTyp
Cls
StockKode.Laden "Test14.bas",0
StockKode.Speichern "Test14c.bas",0
Print
StockKode.Laden "Test14.bas",1
StockKode.Speichern "Test14c.bas",1
Print
Print StockKode.LagFeldChar
Sleep |
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|