WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   VBA/Access: mehrere Abfragen in ein Listfeld (http://www.wcm.at/forum/showthread.php?t=86947)

BigNfan 05.02.2003 11:18

VBA/Access: mehrere Abfragen in ein Listfeld
 
http://members.chello.at/ntsc-j/verleih.jpg

folgendes prob:
ich gebe kundennummer und produktnummer ein
auf hinzufügen und es sollte im listfeld erscheinen

ist ja noch kein problem.. einfach ne abfrage
aber was mach ich wenn er noch mehrere produkte hinzufügt werden?

wie bring ich mehrere abfragen in ein listfeld?


die einzige möglichkeit die mir einfiel ist ich erstell ne tabelle schreib das dann dort rein.. und das steht dann im listfeld..

aber mein professor maunzt dann wieder weils ne extra-tabelle is..

ich hoffe mir kann wer helfen
kann man vielleicht im code ne tabelle erstellen? und wenns formular geschlossen wird lösch ichs wieder..

wenns ohne tabelle gehen würd wärs mir am liebsten


ps: schulprojekt :D

chrisne 05.02.2003 11:26

hmm. kannst du mir das bitte nocheinmal erklären.
ich verstehe das nicht so ganz, wo dein problem ist.

danke
chris

BigNfan 05.02.2003 11:39

wie ich 2 oder mehrere Abfragen in ein Listfeld bekomme

schau.. er schreibt ne produktnummer hin.. geht auf hinzufügen.. und der name erscheint unten.. erreich ich mit ner abfrage

wenn er jetzt noch ein produkt hinzufügt.. wieder ne abfrage..
aber wie bekomm ich mehrere abfragen in ein listfeld ?

chrisne 05.02.2003 11:45

Zitat:

Original geschrieben von BigNfan
wie ich 2 oder mehrere Abfragen in ein Listfeld bekomme

schau.. er schreibt ne produktnummer hin.. geht auf hinzufügen.. und der name erscheint unten.. erreich ich mit ner abfrage

wenn er jetzt noch ein produkt hinzufügt.. wieder ne abfrage..
aber wie bekomm ich mehrere abfragen in ein listfeld ?

ich bin einfach zu dumm:
also nocheinmal für die billigen plätze:

du schreibst in produktnummer eine nummer rein (z.b.: 1234) und im listenfeld unten steht dann der dazugehörige wert (zb. handschuhe).
richtig ??

frage eins: was passiert mit den werten die unten stehen. lasst du die nur anzeigen oder werden die in eine tabelle geschrieben.

frage zwei: was soll passieren, wenn due eine zweite produktnummer eingibst.

sorry, ich verstehe das ganze leider noch nicht.

gruss
chris

BigNfan 05.02.2003 11:48

wenn ich eine zweite produktnummer eingebe sollen beide artikel dortstehn

und wenn man dann auf ok drückt werden die artikel als "Verliehen", "Zurückgebracht" oder "Verkauft" in der tabelle vermerkt

chrisne 05.02.2003 12:07

jetzt weiss ich was ich meine.
naja ist eh nicht so schwer. du musst einfach nur den listfeld die werte zuweisen.
das kannst du mit den befehl: RowSource machen:

hier ein kleines beispiel:

dim source as string

source =[Liste].RowSource & ";" & Produktnummer
Me![Liste].RowSource = source

fertig

in diesen beispiel wird einen listenfeld mit den namen "Liste"
der wert von den Feld "Produktnummer" angefügt.
habe zum testen einen button gemacht und jedesmal wenn ich drauf klicke habe ich einen wert mehr in der liste.
den ";" brauchst du, weil du damit den listfeld bekannst gibst, dass das ein neuer datensatz ist.

alles klar ????

gruss
chris

BigNfan 05.02.2003 12:10

ich denke

also immer wenn ich eine produktnummer hinzufügen will schreib ich erneut:

source =[Liste].RowSource & ";" & Produktnummer
Me![Liste].RowSource = source

oder ?

chrisne 05.02.2003 12:14

welche version von access hast du ???
2000 und xp kann ich jetzt gerade öffnen.
ich schicke dir eine pm mit meiner email adresse.
sende mir das file und baue dir das auf die schnelle ein.

sagst halt deinen lehrer nicht, dass du das nicht warst :)

gruss
chris

BigNfan 05.02.2003 12:24

hi
hab office xp

ich versuchs mal selber

danke für die hilfe

aber muss es ja können weil sonst kann ichs zur matura nicht ;)

chrisne 05.02.2003 12:32

ok. selber machen ist eh besser :)

also nocheinmal für dich.

du hast den button "hinzufügen". da wird dann unten in der liste ein wert angezeigt. was du aber brauchst, ist der liste einen wert hinzufügen. und das geht mit RowSource wie schon beschrieben.

mit me! kannst du feldern werte setzten:
me![liste] :wäre das listenfeld mit den namen "liste"
me![liste].RowSource :damit sagst, dass das listenfeld folgende einträge von dir bekommt z.b:
me![liste].RowSource = "Test1; Test2; Test3"
in der liste würde dann stehen: Test1 und Test2 und Test3
";" trennt die werte ab.
da du aber den wert nicht jedesmal überschreiben willst, sondern dazuhängen muss du vorher den alten wert der liste auslesen. dafür brauchen wir eine variable:

dim source as string 'varibale source als test
jetzt müssen wir den alten wert auslesen:
source =[Liste].RowSource ' die variable hat den alten listenwert
jetzt den neuen wert noch dazuhängen:
source =[Liste].RowSource & ";" & Produktnummer 'Produktnummer ist ein Feld
und zum schluss den neuen wert wieder in die liste schreiben:
Me![Liste].RowSource = source

ich kann dir darüber ein kleines beispiel schreiben, wenn du mir deine mail adresse gibst.
kennst dich jetzt aus ???

gruss
chris

BigNfan 05.02.2003 12:40

danke

ich denke schon :)


meld mich eben wieder wenns ned funkt :D

BigNfan 05.02.2003 20:34

hi
danke das funktioniert
nur wie aktualisiere ich das listfeld?
früher gings mit renew ... nur das kennt er nicht mehr :rolleyes:
(aja - wir proggen mit ado (extras - verweise))

nächste frage wäre wie ich das dann wieder auslese
weil wenn ich auf ok klicke soll er speichern ob es verliehen/zurückgegeben/verkauft wurde..


danke

aja, kannst natürli a mailen => ntsc-j@chello.at

:)

chrisne 05.02.2003 20:49

Zitat:

Original geschrieben von BigNfan

nächste frage wäre wie ich das dann wieder auslese
weil wenn ich auf ok klicke soll er speichern ob es verliehen/zurückgegeben/verkauft wurde..

erkläre das einmal genauer.
was soll er, wie soll er und wann soll er, speichern.


gruss
chris

BigNfan 05.02.2003 20:54

wenn ich auf ok klicke soll er in einer tabelle speichern, dass er ausgeliehen hat (falls oben das gewählt wurde) oder ob es verkauft wurde oder zurückgebracht..

chrisne 05.02.2003 21:11

wie muss die tablle ausschauen, oder ist das egal ?

chris

BigNfan 05.02.2003 21:16

die tabellen sind alle schon vorhanden..
muss nur wissen welche titeln es sind, und der rest is ka prob mehr


muss nur wissen wie ich es auslese


und wie ich das listfeld aktualisiere, weil leider nichts drin steht..

Seidl 05.02.2003 21:20

Na da haben aber zwei ganz schön aneinander vorbei geredet :D

Eine Listbox kann man auf mehrere Arten befüllen. Man kann Werte aus einer Tabelle oder Abfrage nehmen (was BigNfan anscheinend ursprünglich gemacht hat), die Werte durch Semikola getrennt als RowSource angeben (das war Chrisnes Plan) und man kann sie auch über die Methode AddItem mit Werten befüllen.
Ein Requery, also ein erneutes einlesen der Werte ist natürlich nur im ersten Fall sinnvoll da in den beiden anderen Fällen die Werte ja ohnehin direkt in der Listbox abgelegt und damit immer aktuell bekannt sind.

Eine Möglichkeit wäre es das Listenfeld an ein ADO-Recordset zu binden und dem du die Datensätze zuerst hinzufügst um sie dann bei OK nacheinander in deine Tabelle zu schreiben.

Ich würde aber eher vorschlagen beim Starten der Auswahl für eine ADO-Connection auf die betreffende Datenbank eine TRANSAKTION zu starten (=BeginTrans), dann ein Recordset für die betreffende Tabelle zu öffnen, die Werte bei Auswahl in das Recordset zu schreiben (AddNew) und erst bei OK die Änderungen zu übernehmen (=CommitTrans). Wenn der Vorgang nicht mit OK bestätigt wird brichst du die Änderungen einfach ab (=RollbackTrans).

Alle Klarheiten beseitigt?
Na dann is' ja gut ;)

so long
Seidl

chrisne 05.02.2003 21:20

ich mache dir gerade ein demo. wenn du mir sagst, wie deine tabelle ausschaut, dann baue ich es dir im demo gleich so ein.

chris

BigNfan 05.02.2003 21:24

ich hab dir ne mail geschickt

dankeschön :)

chrisne 05.02.2003 21:24

Zitat:

Original geschrieben von Seidl

Eine Möglichkeit wäre es das Listenfeld an ein ADO-Recordset zu binden und dem du die Datensätze zuerst hinzufügst um sie dann bei OK nacheinander in deine Tabelle zu schreiben.

Ich würde aber eher vorschlagen beim Starten der Auswahl für eine ADO-Connection auf die betreffende Datenbank eine TRANSAKTION zu starten (=BeginTrans), dann ein Recordset für die betreffende Tabelle zu öffnen, die Werte bei Auswahl in das Recordset zu schreiben (AddNew) und erst bei OK die Änderungen zu übernehmen (=CommitTrans). Wenn der Vorgang nicht mit OK bestätigt wird brichst du die Änderungen einfach ab (=RollbackTrans).

viele wege gehen nach rom.
so wie es ausschaut hat bignfan nur "wenig" kenntnisse in access. darum sollte die lösung einfacher sein.
deine lösung ist zwar hübsch, aber meine meinung nicht einfach.
3 zeilen programm mit RowSource :)

chris

BigNfan 05.02.2003 21:35

Zitat:

Original geschrieben von chrisne



so wie es ausschaut hat bignfan nur "wenig" kenntnisse in access. darum sollte die lösung einfacher sein.


chris

so ist es ;)

Seidl 05.02.2003 21:37

Naja, für so kleine Datenmengen ist die Performance wohl auch nicht wirklich ausschlaggebend. Die Frage ist nur wie die Note bei einer getricksten Lösung ausfällt wenn der Lehrer schon eine zusätzliche Tabelle nicht wollte. Die wollte er ja wahrscheinlich nicht um seine Leute zur Verwendung von ADO zu treiben. Bei so kleinen Datenmengen wäre ja auch der Grössenzuwachs durch das Hinzufügen und Löschen aus einer Tabelle kein Thema und sogar das ließe sich bei einer Single-User-Anwendung die es ja sicher ist durch komprimieren beim Schliessen verhindern.

Jetzt liegt's an BigNfan: praktischer Minimalist oder performancegeiler Streber :lol: :lol: :lol:

BigNfan 06.02.2003 17:57

hast du dir den code schon angeschaut ?

Seidl 07.02.2003 10:15

Wie? Was? Wer?!?! :confused:

chrisne 07.02.2003 10:21

ich war damit gemeint.

ja kurz. bin/war gerade ur im stress. schaue das ich am wochenende dazu komme.

zur info:
die ansicht der liste kannst du mit:
Me![list].Requery
aktualisiere

gruss
chris

BigNfan 07.02.2003 10:37

leider steht nach requery immer no nix im listfeld

If (i = 0) Then 'Wenn noch nix im Listfeld steht
Me!lst_artikel.RowSource = rst1!CDName
MsgBox (rst1!CDName)
Else 'Wenn schon etwas im listfeld steht
source = lst_artikel.RowSource 'Alter Wert im Listfeld
source = lst_artikel.RowSource & ";" & rst1!CDName
Me!lst_artikel.RowSource = source 'Neuer Wert im Lisfeld
End If
Me!lst_artikel.Requery 'Listfeldaktualisierung



aber msgbox(rst1!Cdname) gibt den richtigen wert aus.. *hm*

BigNfan 07.02.2003 22:42

Zitat:

Original geschrieben von Seidl
Na da haben aber zwei ganz schön aneinander vorbei geredet :D

Eine Listbox kann man auf mehrere Arten befüllen. Man kann Werte aus einer Tabelle oder Abfrage nehmen (was BigNfan anscheinend ursprünglich gemacht hat), die Werte durch Semikola getrennt als RowSource angeben (das war Chrisnes Plan) und man kann sie auch über die Methode AddItem mit Werten befüllen.
Ein Requery, also ein erneutes einlesen der Werte ist natürlich nur im ersten Fall sinnvoll da in den beiden anderen Fällen die Werte ja ohnehin direkt in der Listbox abgelegt und damit immer aktuell bekannt sind.

Eine Möglichkeit wäre es das Listenfeld an ein ADO-Recordset zu binden und dem du die Datensätze zuerst hinzufügst um sie dann bei OK nacheinander in deine Tabelle zu schreiben.

Ich würde aber eher vorschlagen beim Starten der Auswahl für eine ADO-Connection auf die betreffende Datenbank eine TRANSAKTION zu starten (=BeginTrans), dann ein Recordset für die betreffende Tabelle zu öffnen, die Werte bei Auswahl in das Recordset zu schreiben (AddNew) und erst bei OK die Änderungen zu übernehmen (=CommitTrans). Wenn der Vorgang nicht mit OK bestätigt wird brichst du die Änderungen einfach ab (=RollbackTrans).

Alle Klarheiten beseitigt?
Na dann is' ja gut ;)

so long
Seidl

leider hab ich es noch immer nicht geschafft
habs jetzt mit deiner methode probiert
weil chrisne hatte leider noch keine zeit meinen code anzuschauen


lst_artikel.RowSourceType = "Value List"
lst_artikel.AddItem source, 0

so, wenn ich nun ins listfeld klicke sehe ich das sich jedes mal eine neue zeile auftut, aber nur leider steht nix drin :rolleyes:
hab mir aber angeschaut source isn string und da steht "unsterblich" drin, nur leider zeigt er es nicht an.. sondern nur ein leeres feld

BigNfan 08.02.2003 18:20

Zitat:

Original geschrieben von chrisne
ich war damit gemeint.

ja kurz. bin/war gerade ur im stress. schaue das ich am wochenende dazu komme.

zur info:
die ansicht der liste kannst du mit:
Me![list].Requery
aktualisiere

gruss
chris

hi, wollte nur fragen, ob du jetzt am WE dazu kommst, weil Mo is wieder schule ;-)

Seidl 10.02.2003 10:48

Kleines Beispiel. Ich hoffe nicht zu spät.

BigNfan 10.02.2003 11:03

sehr gut danke!

werd i heut abend glei ausprobieren


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag