Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Erstellung einer Schuldatenbank mit Gruppierungs-Funktion

Begonnen von Geierschnabel, November 25, 2010, 11:47:48

⏪ vorheriges - nächstes ⏩

Geierschnabel

Guten Tag,

ich habe folgendes Problem: Ich bin Auszubildender in Hamburg und habe auf meiner Arbeitsstelle sehr viel mit Schulen zu tun. Jede Schule gibt ja unterschiedlich viel Geld für Schulmaterialien aus. Das Ganze ist ein wenig schwer zu erklären. Nehmen wir an, es gibt 100 Schulen in Hamburg. Ich habe eine Tabelle in Access, welche die 100 Schulen und deren Ausgaben für die Materialien auflistet. Meine Abfrage soll die Schulen nun in verschiedene Gruppen aufteilen, deren Ausgaben-Größe insgesamt 120.000€ ist. Wenn 3 Schulen aus den 100 z.B. ungefähre Ausgaben von 40.000€ haben, dann werden die 3 zu einer Gruppe vereint, denn 3*40.000=120.000.
Oder besser veranschaulicht:

z.B.:
Gruppe 1: 2 Schulen (Ausgaben der Schulen bei etwa 60.000€) --->ca. 120.000€
Gruppe 2: 12 Schulen (Ausgaben der Schulen bei etwa 10.000€) --->ca. 120.000€
Gruppe 3: 8 Schulen (Ausgaben der Schulen bei etwa 15.000€) --->ca. 120.000€

...und so weiter.
So möchte ich die alle 100 Schulen in Gruppen bzw. Lose aufteilen. Versteht ihr, was ich meine? Ich versuche, es so einfach wie möglich zu erklären. MS Access-Programmierung hatte ich in der Schule, bin also kein blutiger Anfänger. Meint ihr, das wäre halbwegs simpel zu erstellen? Falls ja, würde ich mich um Hilfe freuen. :)

DF6GL

Hallo,

das hört sich nach einem Optimierungsproblem an...


Dafür ist Access standardmäßig nicht gut geeignet, weil der Algorithmus fehlt.

Den könnte man nun aber mit VBA mehr oder weniger aufwändig nachbilden.


Im einfachsten Fall durchläuft man in einer Schleife die Datensätze, addiert die Ausgaben und  vergleicht die laufende Summe mit der Grenze von 120000 € . Solange die nicht erreicht (überschritten) ist, erhalten die DS eine akt. Gruppenkennung. Wird die Grenze überschritten, wird die laufende Summe auf 0 zurückgesetzt und eine weitere (andere)  Gruppenkennung benutzt.


Welchen Sinn hat denn eine solche Gruppierung?






Geierschnabel

Hi,

also deine Idee klingt schonmal ganz gut. Aber ich denke, dass meine Kenntnis dafür dann doch zu begrenzt sind.  ???
Vielleicht hab ich mich doch ein wenig übernommen.

Zum Sinn: Ich arbeite im Amt für Verwaltung in der Behörde für Schule und Berufsbildung. Die Schulen kaufen ihre Materialen von Steuergeldern und wir verwalten das Bugdet. Damit nicht immer überteuert eingekauft wird, kümmern wir uns darum, dass das wirtschaftlichste Angebot ausgewählt wird. Wenn wir geeignete Firmen gefunden haben, werden die Schulen in Lose mit ungefähr gleichen Ausgaben eingeteilt, damit jede Firma circa den gleichen Umsatz machen kann und niemand bevorteilt wird. Bisher musste das per Hand gemacht werden und ist alles andere als einfach bzw. zeitsparend. Deshalb habe ich mir gedacht, ich versuche es mal mit Access, um das Verfahren für die nächsten Jahre zu vereinfachen. Verständlich?

DF6GL

Hallo,




ist das Budget material- oder schulbezogen?

Wenn es schulbezogen ist, wie kann dann eine Verteilung auf bestimmte Firmen, die ja unterschiedliche Materialien liefern, funktionieren? Oder kann eine Firma alle angeforderten Materialien einer Schule liefern?

Den Code für "den einfachsten Fall" zu erstellen sollte nicht das große Problem sein. Schlecht wäre es nur, wenn er die Anforderungen nicht abdeckt..



Geierschnabel

Also eigentlich gibt es nur ein "Material", um das es geht: Schulbücher. Habe ich aber nicht erwähnt, weil ich das ganze so einfach wie möglich halten wollte. Bei den Bücher gibt es die unverbindliche Preisempfehlung, alle Bücher kosten gleich viel. Deshalb gibt es auch mehrere geeignete Firmen mit dem wirtschaftlichsten Angebot, weil halt alle den gleichen Preis für die Bücher haben. Da nun kein eindeutiger "Angebotsbester" hervorgeht, werden die Schulen in Lose aufgeteilt, damit jede Firma was vom Kuchen abbekommt.

Wie müsste ich denn für den "einfachsten Fall" in etwa vorgehen? Habe echt keine Ahnung. Mein Schulwissen hat auch stark nachgelassen.

DF6GL

Hallo,


mit einer Tabelle "tblSchulen", die u. a. folgende Felder hat:

.
SchulBudget (Währung)
SchulGruppe (Zahl, Long)
.
.


ein Formular mit Schaltfläche "btnGruppieren" und der Klick-Ereignis-Prozedur:



Private Sub btnGruppieren_Click()
Dim db As Dao.Database
Dim rs As DAO.Recordset, lngSchulgruppe As Long, wSchulbudget As Currency, wLfSum As Currency  'Verweis auf die Dao3.6-Library setzen

Set db = CurrentDb
Set rs = db.OpenRecordset("select * from tblschulen order by schulbudget desc, schulgruppe", dbOpenDynaset)

wSchulbudget = 120000  'Budgetvorgabe

lngSchulgruppe = 1
wLfSum = 0

Do Until rs.EOF

rs.Edit
rs!Schulgruppe = lngSchulgruppe
rs.Update


wLfSum = wLfSum + rs!schulbudget

If wLfSum >= wSchulbudget Then
  lngSchulgruppe = lngSchulgruppe + 1
  wLfSum = 0
End If

rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing
End Sub




Die TAbelle enthält anschließen eine Gruppenkennzeichnung (Schulgruppe), das jeweils die Schulen zusammenfasst, deren Budgetsumme (annähernd) der Vorgabe entspricht

Geierschnabel

Wow, vielen Dank! Werds leider erst am Montag ausprobieren können. :(
Aber dann meld ich mich sofort und sag Bescheid, obs geht. Auf das, was du mir da gegeben hast, wär ich niemals gekommen, echt super! Danke nochmal. :)

Geierschnabel

Moin moin,

nach dem Wochenende wollte ich mich ja wieder melden. Da bin ich! Habs ausprobiert, bin aber auf ein paar Probleme gestoßen.

Zum einen hätte ich eine Frage: Wieso muss ich ein Formular erstellen? Ein Formular dient doch dazu, Infos über einen Datensatz zu erstellen. Wäre eine Abfrage nicht das richtige? Bin ein wenig verwirrt deswegen.

Außerdem muss ich noch mal ganz doof nachfragen, wo ich eine Schaltfläche für ein Formular erstelle. Habe überall nachgeschaut, aber nichts gefunden. Meine Access-Kenntnisse sind also doch nicht mehr so frisch, wie ich dachte.  :(

DF6GL

Hallo,

mhmm, wenn Du die DB ernsthaft betreiben willst,  rate ich dringend zur Auffrischung/Ergänzung der Access-Grundlagen...


In Tabellen werden in aller Regel keine Eingaben etc. durch die User vorgenommen.  Alle Datenmanipulationen (sollten) erfolgen über Formulare.


Von einer Abfrage hast Du auch nichts erwähnt. Der Code aktualisiert eine Tabelle dann, wenn auf die Formular-Schaltfläche geklickt wird. Die kannst Du dann natürlich über eine Abfrage "abfragen". Der Code ist auch nicht zur Ausführung in einer Abfrage geeignet, er würde die Aktualisierung der gesamten Tabelle bei jedem "abgefragten" DS durchführen.



Eine Schaltfläche erstellst Du, indem Du das Steuerelement aus der Toolbox während des Formular-Entwurfes auf das Formular ziehst.