PDA

Vollständige Version anzeigen : Anzahl ermitteln


Alexandra, die zweite
23.10.2001, 09:24
Hallo abermals,

ich habe eine Datenbank, die u.a. 10 Felder enthält (Karte1, Karte2, ..., Karte10). Es werden beim Anlegen eines neuen Datensatzes allerdings nicht immer alle Felder ausgefüllt, sondern z.B. nur Karte1 bis Karte3 usw (es gibt _nicht_ die Variante, dass zwischendurch mal eine Karte weggelassen wird, also nur Karte1 und Karte3 z.B.). Ich möchte jetzt herausfinden, wieviele Karten in jedem Datensatz eingeben wurden, wie stelle ich das am geschicktesten an?

Ich könnte jetzt ja natürlich für jedes Feld eine If-Abfrage machen und sagen, wenn in dem Feld (bspw. Karte4) nichts steht, soll zum Ende gesprungen werden und eine Messagebox angezeigt werden á la "Es wurden 3 Karten eingeben", aber ich denke da müsste es einen einfacheren Weg geben.

ich sag schonmal danke,
Alex

horse79
23.10.2001, 10:12
Hallo Peter,

mach doch ne for-Each schleife für die jeweiligen Felder und sobald ein feld leer ist kannste die anzahl ja ausgeben lassen?
Könnte evtl. a bisserl kürzer sein?

Alexandra, die zweite
23.10.2001, 10:36
Hallo,

schon wieder jemand mit 'ner for-Schleife, irgendwie komm ich da wohl nicht mehr drumrum :-)

Könntest du das vielleicht ein Tickchen näher erklären?

Wie gebe ich ihm z.B. an, das er alle 10 Felder durchlaufen soll? In der OH steht als Beispiel:

For Each Objekt1 In Auflistung1 ' Alle Elemente durchlaufen.

Für Optionsgruppen könnte ich mir das jetzt als Lösung vorstellen, aber für 10 einzelne Felder? Aber ansonsten scheint's das im Prinzip zu sein, was ich suche

:-),
Alex

horse79
23.10.2001, 11:02
Ich denke Du musst Deine 10 Felder in eine Objektliste eingeben:

Hab in der Hilfe folgendes gefunden:

Dieses Beispiel verwendet die Add-Methode, um Inst-Objekte (Instanzen einer Klasse mit dem Namen Klasse1, die eine Public-Variable mit dem Namen Instanzname enthalten) zu einer Auflistung mit dem Namen TestClasses hinzuzufügen. Sie probieren dieses Beispiel aus, indem Sie aus dem Menü Einfügen den Befehl Klassenmodul wählen und eine öffentliche Variable mit dem Namen Instanzname auf der Modulebene von Klasse1 deklarieren (geben Sie Public Instanzname ein), die die Namen der einzelnen Instanzen aufnimmt. Ändern Sie den Standardnamen Klasse1 nicht. Kopieren Sie den folgenden Code, und fügen Sie ihn in die Form_Load-Ereignisprozedur ein. (Wenn Ihre Host-Anwendung nicht über Formen verfügt, fügen Sie den Code auf Modulebene ein, und schließen Sie ihn in einen Sub...End Sub-Block ein.)

Dim TestClasses As New Collection ' Collection-Objekt erstellen.
Dim Num As Integer ' Zähler für Namen der einzelnen
' Schlüssel.
Dim DerName ' Zum Speichern der eingegebenen
' Namen.
Do
Dim Inst As New Klasse1 ' Neue Klasse1-Instanz erstellen.
Num = Num + 1 ' Num hochzählen und Namen abrufen.
Mldg = "Welchen Namen soll das Objekt bekommen?" & Chr(13) _
& "Drücken Sie 'Abbrechen', um die Namen in der Auflistung " & _
"anzuzeigen."

DerName = InputBox(Mldg, "Namen der Auflistungselemente")
Inst.Instanzname = DerName ' Name in Objektinstanz speichern.

' Wenn Benutzer einen Namen eingegeben hat, Objekt zur Auflistung
' hinzufügen.

If Inst.Instanzname <> "" Then
' Benanntes Objekt zur Auflistung hinzufügen.
TestClasses.Add item := Inst, key := CStr(Num)
End If
' Aktuellen Verweis als Vorbereitung auf den nächsten löschen.
Set Inst = Nothing
Loop Until DerName = ""

Vielleicht kannst ja Da die Felder eingeben?
Ist aber wohl auch nicht der heilige Gral ;-)

Alexandra, die zweite
23.10.2001, 12:11
hi nochmal,

puh, starker Tobak. Könnte funktionieren, aber so die schönste Lösung ist es wohl wirklich nicht (wenn ich bedenke, das dies nur der Ansatz für 'ne Berechnungsgeschichte ist, ui)

Na, danke ersteinmal für deine Antwort. Vielleicht hat ja jemand anderes noch eine schöne Idee für mich :-)

der Feierabend kommt, langsam aber er kommt,
Alex

MarioR
23.10.2001, 12:53
Hallo Alex,

vielleicht ist das eine Lösung:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Dim</span> ctlVariable <span class="TOKEN">As</span> <span class="TOKEN">Control</span>
<span class="TOKEN">Dim</span> bytAnzahl <span class="TOKEN">As</span> Byte, bytZaehler <span class="TOKEN">As</span> <span class="TOKEN">Byte</span>
bytAnzahl = 0
<span class="TOKEN">For</span> bytZaehler = 1 <span class="TOKEN">To</span> 10
<span class="TOKEN">Set</span> ctlVariable = Forms!DeinFormular("Feld" & Format(bytZaehler, "0"))
<span class="TOKEN">If</span> IsNull(ctlVariable) <span class="TOKEN">Then</span> <span class="TOKEN">Exit For</span>
bytAnzahl = bytAnzahl + 1
<span class="TOKEN">Next</span></pre></div>

kama
23.10.2001, 13:12
hallo
Das funktioniert bei mir
Neueus modul und das einfügen

Function KartenAnzahl(K1, k2, k3, k4, k5, k6, k7, k8, k9, k10 As Integer) As Integer
Dim x As Integer
Dim Karten As Integer
Dim k As Variant
k = Array(K1, k2, k3, k4, k5, k6, k7, k8, k9, k10)

For x = 0 To 9
Karten = k(x)
KartenAnzahl = IIf(Karten > 1, KartenAnzahl + 1, KartenAnzahl)
Next x

End Function


In deine Abfrage neues feld
kartenAnzahl:KartenAnzahl(karte1;karte2;karte3;..usw)

fertig

Alexandra, die zweite
23.10.2001, 13:34
Holla,

hey, das sieht ja schon viel gemütlicher aus :-)

@Mario
- hab grad versucht das durchzudenken, aber irgendwie komme ich nicht dahinter. Wie funktioniert das ganze mit mehreren Feldern (du scheinst da ja nur ein Feld drin zu haben)?

@kama
- das "Ergebnis" steht dann ja kartenAnzahl (wenn man das mal so sagen kann/will); kann ich dies dann auch anders "auslesen" als über eine Abfrage? Oder _muss_ ich eine Abfrage erstellen und dort

kartenAnzahl:KartenAnzahl(karte1;karte2;karte3;..usw)

eintragen?

jaja, ihr merkt es schon, die Newbiews halt, sorry,
Alex

kama
23.10.2001, 13:47
Du kannst diese funktion auch in berichten und formularen verwenden.
Aber meiner meinung nach ist der Weg über eine Abfrage am einfachsten.
Also neue Abfrage auf der Basis deiner Tabelle mit karte1, karte2 usw
dann die funktion wie gezeigt einbinden.
Ich bin allerdings davon ausgegeangen das sich in den Feldern zahlen befinden. U.U muß man die Kriterien und datentypen ändern.
Aber mit etwas hilfe (oder vielleicht ohne bekommst du das hin) Wenn eine Email adresse hättest könnte ich die ein kleines Beispiel schicken.

Bitte beachten Karten => 1>>Verbessert
[Dieser Beitrag wurde von kama am 23.10.2001 editiert.]

MarioR
23.10.2001, 13:51
Hallo,

das funktioniert so:

Wenn in "bytZaehler" eine 5 steht,
dann steht nach
Set ctlVariable = Forms!DeinFormular("Feld" & Format(bytZaehler, "0"))
in "ctlVariable" ein Verweis auf das Element "Feld5" im Formular "DeinFormular".

Und das Ganze in einer Schleife.

Alexandra, die zweite
23.10.2001, 14:03
Hello again,

ich werd das einfach mal ausprobieren, bin da ja nicht so (muss nur grad noch etwas anderes erledigen).

Aber wer ein kleines Beispiel für mich hat, kann mir das natürlich auch gerne zuschicken, ich bin da ja gar nicht so *grins*

Eine E-Mail Adresse hab ich natürlich auch,
let-me-be-your-sunshine@gmx.net

Danke,
Alex

Alexandra, die zweite
24.10.2001, 07:14
Hallo und guten Morgen,

ich hab eure Beispiele jetzt mal getestet (danke für die Zusendung der mdb@kama!), und prinzipiell scheints auch zu funktionieren.

Nur weiß ich leider nicht, wie ich das jetzt für meine Bedürfnisse umstricken kann :-(

Nochmal als kleine Erläuterung, was ich vorhabe...

Ich hab 10 Felder (Text) pro Datensatz, in denen Daten stehen können oder nicht. Hier mal ein Datensatz als Beispiel:

Feld1 = Karte1
Feld2 = Karte1
Feld3 = Karte2
Feld4 = Karte4

in den Feldern 5 bis 10 steht nichts (bzw. habe ich als Standartwert in den Feldern einen - eingetragen, da sonst eine Abfrage auf diese Felder nicht funktioniert, ist für die Sache mit der Anzahlermittlung natürlich nicht so schön *grübel*).

Auf jeden Fall suche ich jetzt eine Möglichkeit, die mir einfach nur (in irgendein anderes Feld meinetwegen) eine 4 schreibt (da in 4 Feldern Karten ausgewählt wurden).

Kann ich das mit euren geposteten Lösungen so umsetzen (will jetzt nur nicht hin und her probieren, und dann gehts so gar nicht)?

Ihr merkt schon, ich bin nicht wirklich firm in solchen Sachen, tut mir leid :-(,
Alex

MarioR
24.10.2001, 07:29
Hallo Alex,

sieht nicht so schön aus, aber vielleicht solltest Du in Dein Zielfeld einfach Folgendes reinschreiben:
=Wenn([DeinFeld1]="-";0;1)+Wenn([DeinFeld2]="-";0;1)+...+Wenn([DeinFeld10]="-";0;1)

kama
24.10.2001, 08:04
hallo und guten Morgen
Du rückst ja nur Häppchenweise mit deinem Problem heraus
Für einen Neuling ist marios Lösung sicherlich am Besten.
Habe aber die DB1 nochmal auf die neue Angaben angepaßt, Mailen kann ich aber erst später Mailserver wird gewartet.

Aber auch mal ein paar grundsätzliche anmerkungen
Deine Probleme liegen im schlechten Design deiner datenbank

Richtiger wäre es zwei Felder zu benutzen

Zuordnung_____KarteNr
Meier_________1
Schulze_______2
verschenckt___3

Usw
Über entsprechende Abfragen könntest du nun ohne Probleme deine Anzahl ermitteln.

LIF
24.10.2001, 08:35
Hi Alex
Alle Vorschläge führen zum Ziel.
Der beste und schnellste ist der von Mario R
Setze aber noch ein Trim davor das auch Karten welche nur ein Blank oder Leerzeichen beinhalten mitgezählt werden.

Also neue Abfrage-Spalte und die Funktion einfügen
xAnzahl:Wenn(Trim([Feld1])="";0;1)+Wenn(Trim([Feld2])="";0;1)+...+Wenn(Trim([Feld10])="";0;1)......
oder
xAnzahl:Wenn(Isnull(Trim([Feld1]));0;1)+Wenn(IsNull(Trim([Feld2]))0;1)+...+Wenn(IsNull(Trim([Feld10);0;1)......
Gruss

Stema
24.10.2001, 09:46
Hallo Alex,

ich habe auch noch eine Lösung anzubieten: Diese Funktion zeigt an, wieviele Felder (Karte*) des aktuellen Datensatzes Deines Formulars ausgefüllt sind.

Function CheckQtyOfUsedFields()
Dim i As Integer
Dim fld As Field
Dim R As Recordset

Set R = Me.RecordsetClone
R.MoveFirst
R.Move (Me.CurrentRecord - 1)

For Each fld In R.Fields
If Left(fld.Name, 5) = UCase("KARTE") And Nz(fld) <> "" Then i = i + 1
Next
MsgBox i & " Felder sind belegt!"
End Function