 |
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 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 21.10.2005, 09:56 Titel: Gruppierte Werte aus vorhandener Datei generieren |
|
|
Morgen!
Ich habe eine Inventurdatei die folgendermaßen aufgebaut ist: (inventur.dat)
(Artikel,Menge,Einheit)
-----------
12345,1,1
12345,1,1
12345,1,1
12345,1,2
12345,1,2
12345,1,3
-----------
Mit diesen Informationen möchte ich eine weitere Datei erstellen.
Es sollen alle vorhandene Einheiten sowie die Summe der Artikel
in der jeweiligen Einheit aufgeführt werden.
So könnte dies dann aussehen: (einheiten.dat)
(Einheit,Summe)
----
1,3
2,2
3,1
----
Über eine Hilfestellung, wie ich solch eine Gruppierung durchführen könnte, würde ich mich sehr freuen.
Vielen Dank schon einmal im Voraus für Eure Antworten.
Gruß
studio
PS: Die Position Menge bei der Inventurdatei bleibt immer "1". |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.10.2005, 10:51 Titel: |
|
|
Hallo.
Wie wär's hiermit:
Code: | MaximaleAnzahlVerschiedeneGruppen=500
DIM gruppen(1 TO MaximaleAnzahlVerschiedeneGruppen) AS INTEGER
DIM max AS INTEGER
PRINT "Zum Starten eine beliebige Taste druecken!"
SLEEP
OPEN "ERSTEDAT.EI" FOR INPUT AS #1
DO UNTIL EOF(1)
INPUT #1, artnr&, menge%, gruppe&
gruppen(gruppe&) = gruppen(gruppe&)+1
IF gruppe& > max THEN max=gruppe&
IF EOF(1) THEN EXIT DO
LOOP
CLOSE #1
OPEN "ZWEITEDA.TEI" FOR OUTPUT AS #1
FOR i%=1 TO max
WRITE #1, i%, gruppen(i%)
NEXT i%
CLOSE #1
PRINT "In der Datei ZWEITEDA.TEI wurde jetzt gespeichert, wie viele"
PRINT "Eintraege jede Gruppe hat."
SLEEP: END |
Das ist so die Quick'n'Dirty Lösung. Am schönsten wäre es sicherlich, das mit einem UDT zu lösen:
Code: | TYPE Gruppe
GruppenNr AS INTEGER
Mitglieder AS INTEGER
END TYPE |
Denn bei der oberen Lösung entspricht der Arrayindex der Gruppennummer und so verbrauchen auch unbenutzte Gruppennummern jedes mal 2 Bytes kostbaren Speicher...
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 21.10.2005, 12:54 Titel: |
|
|
Hallo Sebastian,
vielen Dank für Deine schnelle Antwort. Vielleicht habe ich einige wichtige
Details vergessen zu erwähnen.
Dieses Inventurprogramm befindet sich auf einem MDE-Gerät.
In einer Filiale können mehrere MDE-Geräte zur Inventur eingesetzt
werden. Eine Einheit deklariert nur einen zu erfassenden Bereich
(z.B. Regal, Fach). Somit könnte Mitarbeiter A die Einheiten 1,5,6 u. 8
zugeteilt bekommen haben und Mitarbeiter B die Einheiten 2,3,4 u. 7.
Ob dies nun Sinn macht oder nicht spielt keine Rolle ... es könnte passieren.
Pro Filiale können max 200 Einheiten auftreten. D.h. ein MDE könnte
max 200 Einheiten aufweißen.
Entweder stehe ich gerade auf dem Schlauch oder könnten diese
neuen Erkenntnisse Probleme mit Deinem Codeschnipsel verursachen?
MDE 1 würde die Inventurdatei so aussehen:
12345,1,1
12345,1,1
12345,1,5
12345,1,5
12345,1,6
12345,1,8
Somit müsste die "Einheiten.dat" folgendermaßen aussehen:
1,2
5,2
6,1
8,1
MDE 2 würde die Inventurdatei so aussehen:
12345,1,2
12345,1,2
12345,1,3
12345,1,4
12345,1,7
Somit müsste die "Einheiten.dat" folgendermaßen aussehen:
2,2
3,1
4,1
7,1
Wäre nett, wenn Du einwenig Licht ins Dunkle bringen könntest.
Vielen Dank im Voraus.
Gruß
studio |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.10.2005, 13:32 Titel: |
|
|
Hallo.
OK, neuer Versuch.
Code: | '$DYNAMIC
TYPE Einheit
EinheitsNr As Integer
AnzahlSachen As Integer
END TYPE
DIM Einheiten(1) AS Einheit
PRINT "Beliebige Taste zum Loslegen drücken!"
SLEEP
OPEN "MDE1.txt" FOR INPUT AS #1
DO UNTIL EOF(1)
INPUT #1, artikel&, menge%, e&
FOR i%=LBOUND(Einheiten) TO UBOUND(Einheiten)
If Einheiten(i%).EinheitsNr = e& THEN
Einheiten(i%).AnzahlSachen=Einheiten(i%).AnzahlSachen+1
Else
'*** Ist noch ein Index frei? ***
nr%=-1
FOR temp%=LBOUND(Einheiten) TO UBOUND(Einheiten)
If Einheiten(temp%).EinheitsNr=0 THEN
nr%=temp%
exit for
end if
Next temp%
If nr%>-1 THEN
'*** Ja, ein leere Eintrag gefunden! Den belegen wir jetzt. ***
Einheiten(nr%).EinheitsNr = e&
Einheiten(nr%).AnzahlSachen=1
ELSE
'*** Kein Eintrag frei, legen wir einen neuen an. ***
temp%=UBOUND(Einheiten)+1
REDIM PRESERVE Einheiten(temp%)
Einheiten(temp%).EinheitsNr = e&
Einheiten(temp%).AnzahlSachen=1
END IF
END IF
NEXT i%
IF EOF(1) THEN EXIT DO
LOOP
CLOSE #1
OPEN "DATEI2.TXT" FOR OUTPUT AS #1
FOR i%=LBOUND(Einheiten) TO UBOUND(Einheiten)
If Einheiten(i%).EinheitsNr<> 0 THEN
WRITE #1, Einheiten(i%).EinheitsNr, Einheiten(i%).AnzahlSachen
END IF
NEXT i%
CLOSE #1
PRINT "Fertig!"
SLEEP: END |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 24.10.2005, 09:41 Titel: |
|
|
Morgen!
Deine neue Lösung ist zwar sehr nett gemeint aber wird mir nicht weiterhelfen können,
da einige Funktionen in meinem "BHT-Basic" nicht zur Verfügung
stehen -> LBOUND,UBOUND. Ebenfalls gibt es TYPE und eine DO Schleife (alternativ nehme
ich hierfür WHILE) nicht. Daher tendiere ich eher zu Deiner bereits oben aufgeführten Quick'n'Dirty Variante.
BHT-Basic hat Ähnlichkeiten mit dem MS-DOS Basic.
Bei Interesse:
---------------
1. http://www.denso-id.de/
2. Products
3. Downloads
4. Choose a category: "Programmers Manual"
5. "BHT-300 Programmers Manual"
In "Chapter 14 u. 15" sind alle Optionen die mir zur Verfügung stehen dargestellt.
Daher meine Bitte: Könnten wir Deine Quick'n'Dirty Variante mit den neuen Erkenntnissen
aus meinem vorangegangen Beitrag entsprechend anpassen?
Im Voraus vielen Dank für Deine Unterstützung.
Gruß
studio |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 24.10.2005, 12:44 Titel: |
|
|
Hallo
Muss das denn auf der MDE passieren? Kannst du beim Auslesen nicht einfach die "inventur.dat" so wie sie ist an den PC übertragen und die Verarbeitung dann dort machen?
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 24.10.2005, 14:06 Titel: |
|
|
Hallo Skilltronic,
ich musste etwas über Deine Frage schmunzeln. Das hätte ich mir nämlich auch gewünscht.
Eigentlich wollte ich das MDE-Geräte so "dumm" wie möglich halten und eventuell ausstehende
Auswertungen der Kasse bzw. dem PC überlassen. Leider ist das so gewünscht und mir
so auferlegt.
Ich habe das Problem folgendermaßen bewältigt:
Code: | OPEN DatName$ AS #DatFile%
FIELD #DatFile% , 20 AS BarCodeD$, 1 AS MengeD$, 3 AS EinheitD$
DatLaenge% = LOF(#DatFile%)
OPEN DatEinh$ AS #EinFile%
FIELD #EinFile% , 3 AS FachD$,3 AS SummeD$
FachD$ = "0"
FOR i% = 1 TO DatLaenge%
GET #DatFile%
IF EinheitD$ <> FachD$ THEN
IF FachD$ <> "0" THEN
PUT #EinFile%
END IF
FachD$ = EinheitD$
SummeD$ = "1"
ELSE
SummeD$ = MID$(STR$(VAL(SummeD$) + 1),2)
END IF
NEXT i%
PUT #EinFile%
CLOSE #EinFile%
CLOSE #DatFile% |
Vielen Dank für Eure Ideen und Vorschläge.
Bis demnächst
studio |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 26.10.2005, 14:20 Titel: |
|
|
Hallo nochmal.
Ich muss oft mit MDEs arbeiten und kann aus leidvoller Erfahrung nur sagen, dass es für den Anwender sehr störend ist, wenn das Scantempo durch lange, interne Verarbeitungszeiten gebremst wird. Ich denke, dass dafür vor allem langsame Speicherzugriffe verantwortlich sind, die deshalb so weit wie möglich vermieden werden sollten. Wenn es schnell gehen soll wie bei einer Inventur, ist nichts nervender als wenn man ständig mehrfach auf den Auslöser drücken muss, weil die Verarbeitung der Daten noch nicht abgeschlossen ist. Vielleicht lässt sich wer immer diese Vorgaben macht durch eine kleine Rechnung zum Umdenken bewegen. Wenn fünf Leute je 10.000 Artikel scannen und die Programmierung der MDEs erzeugt im Durchschnitt eine unnötige Wartezeit von nur 0,5 Sekunden (was meiner Erfahrung nach durchaus realistisch ist) sind das schon fast 7 Stunden, was praktisch einer ganzen weiteren Arbeitskraft entspricht.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
studio
Anmeldungsdatum: 08.08.2005 Beiträge: 34
|
Verfasst am: 27.10.2005, 10:28 Titel: |
|
|
Hallo!
Du sprichst mir aus der Seele. Diese Punkte wurden von mir desöfteren zur Ansprache gebracht. Die Situation ist die, dass zur Zeit eine Umstellung von Symbol MDE auf Denso ansteht. Das Inventurprogramm auf dem Symbol MDE ist in C von einer Externen Firma geschrieben worden. Meine Aufgabe ist es diese Anwendung 1 zu 1 auf das Denso (BHT-Basic) zu portieren. Grund: Schulungsaufwand sollte so gering wie möglich gehalten werden. Dies ist ein berechtigtes Argument ... wenn man bedenkt pro Filiale (ca. 200) 2 - 3 Mitarbeiter schulen zu müssen.
Gruß
studio
PS: Vielen Dank für Deine Anteilnahme. _________________ Entwicklungsumgebung:
---------------------------
Hardware: Denso BHT 300 / SATO Etikettendrucker (MB 200)
Software: BHT-Basic (Ähnlichkeiten zu MSDOS-Basic)
Infos: ftp://www.denso-id.de/Documents/Manuals/Programmers_Manuals/Denso_OS/BHT300_Programmers_Manual_E.pdf |
|
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.
|
|