Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Schleifen, Loops und andere

Begonnen von klaus101, April 15, 2016, 01:16:08

⏪ vorheriges - nächstes ⏩

klaus101

Hallo Freunde,
hab 'ne Blokade
ich möchte lange Zahlenreihen wie folgt darstellen
Ausgangssituation:        Ziel Ausgabe:
Reihe                            Bereich
3466                            3466 bis 3467
3467
3515                            3515 bis 3519
3516
3517
3518
3519
3550                            3550 bis 3550
3596                            3596 bis 3599
3597
3598
3599

heißt aus einer Reihe von Zahlen sollen jeweils Anfang und Ende eines Bereiches dargestellt werden ohne die Zahlen dazwischen. In der Datenbank sind diese Zahlenreihen sequentiell gespeichert. Um die Ausgabe nicht unnötig lang werden zu lassen sollen diese in Bereichen zusammengefaßt werden.
Hab schon mal Schleifen gebaut mit move next previous etc. aber hänge in bischen fest was die Logik angeht.
Hat jemand eine Idee wie man das realisieren kann?
LG
Klaus
ACCESS 2010

DF6GL

Hallo,

vielleicht hilft dies (prinzipiell) weiter:

http://dbwiki.net/wiki/VBA_Tipp:_Liste_per_SQL_aufbauen


wenn Du die "Logik" der Bereichsgrenzen genau bestimmen kannst.

Kannst Du auch noch den Sinn dieser Geschichte erläutern?
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

klaus101

Hallo Franz,

herzlichen Dank für Deine Antwort,
eigentlich simpel aber doch tricky
es handelt sich um eine Tabelle mit 2 Feldern
Feld 1 = Adressennummer
Feld 2 = Vertragsnummer
jetzt soll eine 2te Tabelle erstellt werden in der die Vertragsnr. als Bereich angegeben wird
wie in meinem Beispiel von 3515 bis 3519. Da es Adressen mit bis zu 10.000 Vertragsnummern gibt macht solch eine nicht datenbanktypische Struktur ausnahmsweise mal Sinn, widerstrebt mir zwar auch aber eine Angabe z.B.: 8970 bis 16700 ist etwas schlanker als Datensätze in Listenform
8970
...
...
...
16700

Beispiel: |Adressnr.|Vertagsnr. von|Vertragsnr. bis|
                100             8970             16700   

dient zum Ausdruck und zur Übersicht in einem Formular
wenn Änderungen an den Daten erfolgen wird diese Tabelle upgedatet.
Es gibt verschiedene Situationen in der Bereits vorh. Liste
a. Bereiche= fortlaufende Nummern von bis
b. Sprünge und einzelne Nummern siehe in meinem Beispiel Nr. 3550

nun bin ich auf der Suche nach einer Schleifenstruktur die mir diese Zahlen von der einen Tabelle in die Übersichtstabelle schaufelt.

Besten Gruß zum Wochenende
Klaus

ebs17

#3
Zitatnun bin ich auf der Suche nach einer Schleifenstruktur

Ach so. Ich würde es mit einer Abfrage umsetzen, da braucht man auch keine zweite Tabelle.
Ansatz: Ein Von-Wert ergibt sich, wenn es dazu keinen Vorgänger gibt
(Vertragsnummer - 1). Ein Bis-Wert hat entsprechend keinen Nachfolger.

Zitatjetzt soll eine 2te Tabelle erstellt werden in der die Vertragsnr. als Bereich angegeben wird
wie in meinem Beispiel von 3515 bis 3519. Da es Adressen mit bis zu 10.000 Vertragsnummern gibt macht solch eine nicht datenbanktypische Struktur ausnahmsweise mal Sinn

Wenn die Bereichsgrenzen nicht in einem Ausdruck zusammengefasst sind ("3515 bis 3519" oder Ergebnis aus SQL-Liste), sondern in getrennten Feldern gespeichert werden, ist diese Form der Erfassung durchaus datenbanktypisch, sinnvoll und üblich. Einen Bereich in Einzelwerte auflösen ist einfacher als der umgedrehte Weg, siehe auch Grundlagen - SQL ist leicht (1) - Hilfstabellen
Mit freundlichem Glück Auf!

Eberhard

klaus101

Hallo Eberhard,

auch Dir herzlichen Dank für Deine Antwort

wäre toll wenn man das mit einer Abfrage realisieren könnte
erster/letzter Wert sehen erst einmal gut aus. Nur schade das es innerhalb der Gruppierung die von der Adressnummer kommt größere Sprünge zwischen den Vertragsnummern gibt. Da wird die jeweils kleinste und größte Nummer ausgegeben. Wenn man jetzt noch nach zusammenhängenden gruppieren könnte wäre das prima. Oder hast Du einen Ansatz den ich nicht kenne.
Besten Gruß
Klaus

ebs17

Als ungetesteter Versuch:
SELECT
   T.Adressennummer,
   T.Vertragsnummer AS UntereG,
   (
      SELECT
         MIN(U.ObereG) AS ObereG
      FROM
         (
            SELECT
               T1.Adressennummer,
               T1.Vertragsnummer AS ObereG
            FROM
               TabX AS T1
            WHERE
               NOT EXISTS
                  (
                     SELECT
                        NULL
                     FROM
                        TabX AS X
                     WHERE
                        X.Adressennummer = T1.Adressennummer
                           AND
                        X.Vertragsnummer = T1.Vertragsnummer + 1
                  )
         ) AS U
      WHERE
         U.Adressennummer = T.Adressennummer
            AND
         U.ObereG >= T.Vertragsnummer
   ) AS ObereG
FROM
   TabX AS T
WHERE
   NOT EXISTS
      (
         SELECT
            NULL
         FROM
            TabX AS X
         WHERE
            X.Adressennummer = T.Adressennummer
               AND
            X.Vertragsnummer = T.Vertragsnummer - 1
      )

Mit freundlichem Glück Auf!

Eberhard

klaus101

wow
das sieht ja klasse aus
der sql-mann
damit werde ich mich jetzt mal 'ne Weile beschäftigen
ich sag Bescheid was draus geworden ist.

Nochmals vielen Dank
Klaus