Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Gruppierte Werte aus vorhandener Datei generieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 21.10.2005, 09:56    Titel: Gruppierte Werte aus vorhandener Datei generieren Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.10.2005, 10:51    Titel: Antworten mit Zitat

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... durchgeknallt

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 21.10.2005, 12:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.10.2005, 13:32    Titel: Antworten mit Zitat

Hallo.

OK, neuer Versuch. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 24.10.2005, 09:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 24.10.2005, 12:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 24.10.2005, 14:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 26.10.2005, 14:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 27.10.2005, 10:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz