Dubletten in Tabelle per Makro zählen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Dubletten in Tabelle per Makro zählen

Re: Dubletten in Tabelle per Makro zählen

von Gabriel123 » Mo, 28.01.2008 09:27

JA!
Nun hat es endlich geklappt, ich hatte nicht an die While Schleife gedacht! DANKE!°

Code: Alles auswählen

 If Not IsNull(Ergebnis) Then
   msgbox "Anzahl Spalten in Ergebnis: " & Ergebnis.getColumns().getCount()
   endIF
liefert allerdings immer den Wert 1 zurück?! Ist aber egal, ich habe den Teil rausgelassen. Mit

Code: Alles auswählen

   While Ergebnis.next()
   msgbox "Anzahl : " & Ergebnis.getString( 1 )
	wend
bekomme ich genau die Anzahl der Datensätze=) Herzlichen Dank noch mal für Deine Geduld!!
Gabriel

Re: Dubletten in Tabelle per Makro zählen

von komma4 » Sa, 26.01.2008 05:19

Die Abfrage liefert in einem com.sun.star.sdb.OResultSet eine Treffertabelle zurück,

Code: Alles auswählen

' Abfrage auf DB-Tabelle erfolgreich
 If Not IsNull(Ergebnis) Then
   msgbox "Anzahl Spalten in Ergebnis: " & Ergebnis.getColumns().getCount()
Die Position des aktuellen Datensatzes zeigt ein Cursor an, nach der Abfrage steht dieser Cursor 'vor' der Tabelle. Wir schleifen nun über das Ergenis

Code: Alles auswählen

Whilfe Ergebnis.next()
Eine 'KundenNr' in einer Kundentabelle ist i.d.R. eindeutig - Du solltest nur eine Ausgabe(-nzeile) erhalten.


Da wir nur eine Spalte (die Berechnung) zurückbekommen, fragen wir auch nur die erste Spalte dieser Zeile ab:

Code: Alles auswählen

' erste Spalte: Anzahl einer KundenNr
msgbox "Anzahl : " & oResultSet.getString( 1 )
' Schleifen-Ende
Wend

Klappt es nun?

Re: Dubletten in Tabelle per Makro zählen

von Gabriel123 » Fr, 25.01.2008 15:38

Hallo komma4,

vielen Dank für deine ganze Mühe! Leider komm ich nicht so recht klar. Also was ich wollte war: Zähle wie oft ein Kunde in der DB ist. Kundennr. ist also mehrfach in der DB enthalten.

So schauts nun aus:

Code: Alles auswählen

Sub Abfrage
DIM DatabaseContext as object
DIM DataSourceName AS OBJECT
DIM Verbindung AS OBJECT
DIM SQL_Anweisung AS OBJECT
DIM Ergebnis 
dim menge
dim sKundenNr

sKundenNr = thisComponent.drawpage.forms.getByName("gafuform").getByName("Kundennr.").Text
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSourceName = DatabaseContext.getByName("DBImportF4")
Verbindung = DataSourceName.GetConnection("","")
SQL_Anweisung = Verbindung.createStatement()
sql = "SELECT COUNT(*) FROM ""Adressen"" WHERE ""Kundennr."" = '167373' "

Ergebnis = SQL_Anweisung.executeQuery(sql)
msgbox (sKundenNr)
msgbox (sql)
MsgBox (Ergebnis.getstring(1))
end sub 
Habe mal die Kundennr. direkt reingeschrieben. Der fehler kommt dann bei msgBox (Ergebnis.getstring(1))
No Data is available. ich lese also Ergebnis irgendwie falsch aus, vielleicht ist getString da völlig fehl am Platz...
komma4 hat geschrieben:setzt die abfrage ab und liefert das Rowset (als Variable: Ergebnis). Dort hast Du eine Rückgabespalte, die die Anzahl enthält (versuche den Befehl mal im Abfragefenster zu erstellen und abzusetzen)
Count liefert mir also nicht wieviele Kunden in der DB sind sondern die Position der Kundennr. im RowSet? Was ist die Rückgabespalte? Die ist vorher nicht in meiner Tabelle oder Db vorhanden und wird erst durch den sql befehl angelegt oder wie? Sql Befehl:

Code: Alles auswählen

SELECT COUNT(*) FROM ""Adressen"" WHERE ""Kundennr."" = '167373'
im Abfragefenster war erfolgreich.
Sorry für die vielen dummen fragen!

Re: Dubletten in Tabelle per Makro zählen

von komma4 » Fr, 25.01.2008 14:51

"... Zähle die Datensätze in der Tabelle "Adressen", welche die KundenNr haben, die dem Inhalt von sKundenNr entspricht..."

(sSQL ist erst mal nur die Zeichenfolge, die in der Abfrage verwendet wird).

Sollte eins raus kommen (die KundenNr. ist Deine Spalte - und doch hoffentlich eindeutig)..


Du wolltest doch zählen, wie viele Auftragspositionen zum Kunden vorhanden ist....
also brauchst Du einen SQL-Befehl der Art:

Code: Alles auswählen

 sql = "SELECT COUNT(*) FROM ""AuftragsPos"" WHERE ""AP_Kundennr"" = '" & sKundenNr & "' "
sKundenNr ist hier in einzelne Hochkomma gefasst = 'sKundenNr'
MSGBOX sSQL zeigt Dir bspw. an: SELECT COUNT(*) FROM "AuftragsPos" WHERE "AP_KundenNr" = '123456'

Das
Ergebnis = SQL_Anweisung.executeQuery(sql)
setzt die abfrage ab und liefert das Rowset (als Variable: Ergebnis). Dort hast Du eine Rückgabespalte, die die Anzahl enthält (versuche den Befehl mal im Abfragefenster zu erstellen und abzusetzen)

Nu?

[edit: Typo]

Re: Dubletten in Tabelle per Makro zählen

von Gabriel123 » Fr, 25.01.2008 14:31

hm ich glaube ich habe das mit dem Select Count noch nicht geschnallt. Ich dachte

Code: Alles auswählen

sql = "SELECT COUNT(*) FROM ""Adressen"" WHERE ""Kundennr."" = " & sKundenNr
zählt gleiche einträge und liefert dann eine zahl die ich einfach ausgeben kann. Oder was genau macht diese zeile? sKundenNR ist in der tabelle als Textfeld hinterlegt. Die 2. MSGBOX ist auskommentiert! Das war ein Rest;)

Re: Dubletten in Tabelle per Makro zählen

von komma4 » Fr, 25.01.2008 14:16

Welche Zeile ist fehlerhaft?

Wie ist "Kundenr." in der Datenbank definiert (Du holst einen Text in sKundenNR !) ... bei einem Zeichenvergleich fehlen die Apostrophe um das Vergleichsfeld, sonst ist eine Konvertierung in eine Zahl erforderlich...

... und Du solltest das Ergebnis -wie bei allen Abfragen- bspw. in Ergebnis.getString( 1 ) erhalten (was ist "rowset.command"?)

Re: Dubletten in Tabelle per Makro zählen

von Gabriel123 » Fr, 25.01.2008 13:40

Nein nein=) ich wollte Ergebnis einfach wie im Code beschrieben per MSGBOX ausgeben. Aber da bekomme ich "falscher Wert für eine Eigenschaft". Mein Makro muss irgendwie nicht ganz richtig sein!

Re: Dubletten in Tabelle per Makro zählen

von komma4 » Fr, 25.01.2008 13:16

erstelle ein weiteres Kontrollelement und setze den Wert dahin:

Code: Alles auswählen

thisComponent.drawpage.forms.getByName("gafuform").getByName("AnzahlAuftrag").Text =Ergebnis
Meintest Du so etwas?

Re: Dubletten in Tabelle per Makro zählen

von Gabriel123 » Fr, 25.01.2008 11:57

Hm da hast Du recht. Darauf bin ich halt einfach nicht gekommen. habe grad erst entdeckt, dass es überhaupt ein rowset gibt und dachte das könnte ich ja nutzen.

Wie genau gebe ich denn jetzt das Ergebnis aus?

Code: Alles auswählen

DIM DatabaseContext
DIM DataSourceName AS OBJECT
DIM Verbindung AS OBJECT
DIM SQL_Anweisung AS OBJECT
DIM Ergebnis

sKundenNr = thisComponent.drawpage.forms.getByName("gafuform").getByName("Kundennr.").Text
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSourceName = DatabaseContext.getByName("DBImportF4")
Verbindung = DataSourceName.GetConnection("","")
SQL_Anweisung = Verbindung.createStatement()
sql = "SELECT COUNT(*) FROM ""Adressen"" WHERE ""Kundennr."" = " & sKundenNr
Ergebnis = SQL_Anweisung.executeQuery(sql)
MsgBox (Ergebnis)
 ' msgbox("Dieser Kunde hat" & chr(10) & rowset.Command & chr(10) & "weitere Positionen!")
end sub 
ich habe echt kein plan wie ich mit select count umgehen muss=( Gibst Du mir noch nen kleinen Tip?

Re: Dubletten in Tabelle per Makro zählen

von komma4 » Do, 24.01.2008 16:45

wollte Dir gestern schon schreiben:


wieso zählst Du nicht in der Datenbank?

Code: Alles auswählen

sKundenNr = thisComponent.drawpage.forms.getByName("gafuform").getByName("Kundennr.").Text
sSQL = "SELECT COUNT(*) FROM ""AuftragsPos"" WHERE ""Kundennr"" = " & sKundenNr
?

Re: Dubletten in Tabelle per Makro zählen

von Gabriel123 » Do, 24.01.2008 16:12

So dann antworte ich mir mal selbst=) Bin jetzt soweit, dass ich ein RowSet habe um doppelte Daten darin zu zählen! Mein problem ist folgendes:

Ich möchte im Rowset schauen, wie oft eine Kundennummer enthalten ist. Gleiche Kundennummern stehen immer untereinander. ich brauche also nur den zeiger bis zu der row bewegen, wo die Kundennummer meiner gesuchten entspricht und dann ab dort zählen wie oft sie hintereinander auftaucht. das habe ich so gemacht:
Sub Abfrage
Dim rowset as Object
dim c as integer
rowset = createUnoService("com.sun.star.sdb.RowSet")
rowset.DataSourceName = "DBImportF4"
rowset.CommandType = 0
rowset.Command = "Adressen"
c=0
rowset.execute()
rowset.first()
While rowset.getString (3)<> thisComponent.drawpage.forms.getByName("gafuform").getByName("Kundennr.").Text
rowSet.next()
wend
while rowset.getString (3)= thisComponent.drawpage.forms.getByName("gafuform").getByName("Kundennr.").Text
c=c+1
rowset.next()
wend
msgbox("Dieser Kunde hat" & chr(10) & c & chr(10) & "weitere Positionen!")
rowset.dispose()
end sub

Das dauert aber sehr lange weil die suche im rowset immer von der ersten Row an beginnt. Gibt es nun eine Möglichkeit direkt den zeiger in eine bestimmte row zu setzen? die entsprechende ID kann ich ja übers formular auslesen.
Dankeschön=)

Dubletten in Tabelle per Makro zählen

von Gabriel123 » Mo, 21.01.2008 17:33

Hallo Liebe leser=)

Heute beschäftigt mich mal das zählen von dubletten in einer sortierten tabelle per makro.
ich habe in meiner Basetabelle kundendaten mit kundennr. Die Tabelle ist nach Kundennummern sortiert. Alle gleichen stehen also hintereinander. Jetzt wollte ich ausgeben, wie oft der Kunde in der Datenbank ist. ich habe mir folgendes überlegt:
Kundennr. aus dem Formular solange mit der Nummer aus der tabelle vergleichen bis ein unterschied auftaucht. Eine Variable zählt mit und wird dann ausgegeben:

sub menge
dim odoc as object
dim oform as object
dim menge1
dim j as integer

j=1
odoc = thiscomponent
oform = odoc.drawpage.forms.getbyName("gafuform")
menge1 = oform.getByName("Kundennr.").text
While menge1 = oform.getstring(3)
oform.next()
j = j+1
wend
oform.previous(j)
msgBox("Dieser Kunde hat" & j & "aktive Positionen!")
end sub

jetzt Tickert automatisch das ganze Formular die gleichen datensätze durch.
(das kann gerne aufhören, kann man das im hintergrund machen, ohne dass sich das
Formular mitbewegt?) Dann habe ich halt versucht mit
oform.previous(j) wieder auf den ehemaligen Datensatz zu springen. Ohne Erfolg.
In bin erst seit einigen Tagen mit Base vertraut, also lacht nicht über meinen ersten Zählversuch;)

Nach oben