Basic mit SQL

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: Basic mit SQL

Re: Basic mit SQL

von eBayer » Mo, 03.08.2009 17:49

Hallo Uli,
zunächst mal Glückwunsch, daß Deine Hartnäckigkeit mit Erfolg belohnt wurde.
Zu Deiner Frage:
Ja, ich würde aus der Abfrage eine temporäre Tabelle erzeugen und diese dann mit dem Report auswerten.
Es ist meines Wissens der einzige Weg, den Report mit Daten zu versorgen.
Ideal wäre es, wenn Du Dein Makro inclusive dem darin befindlichen Dialog aus dem Report heraus starten könntest. Das ist aber leider nicht möglich. Abgesehen davon machst Du Dir die Arbeit am Report leichter, wenn Du den Weg über die temporäre Tabelle gehst. Schließlich bekommt der Report auf diesem Weg die Daten mundgerecht aufbereitet.

Du könntest natürlich auch eine Abfrage mit dem Designer erstellen und dabei das Datum direkt in die Abfrage eingeben.....
allerdings erscheint dann als Eingabemöglichkeit ein relativ unschöner Dialog ohne eigene Intelligenz, der aber letztendlich das gleiche Ergebnis erzielt. Diese Abfrage kannst Du dann mit dem Report verbinden und fertig ist der Bericht.

Gruß eBayer

Re: Basic mit SQL

von ulihueck » Mo, 03.08.2009 17:36

Hallo.
Vielen Dank für Eure Hilfe.
Habe nochmals einiges umgebaut, wil noch viele Denk- und Syntaxfehler versteckt waren :shock:
Mit diesem Code kann ich also nun mittels Dialog das Anfangs- und Enddatum eingeben und in die Abfrage einbauen.

Code: Alles auswählen

Sub Leistungen_Zeitintervall
GlobalScope.BasicLibraries.LoadLibrary("Tools")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog_Datum)
dim oDatabaseContext, oDataSource, oConnection , oStatement as object
dim query, sSqL1 as string
oDatabaseContext=CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=oDatabaseContext.getbyName("ABH")
oConnection=oDataSource.getConnection("", "")
oStatement=oConnection.createStatement()

Dim  dlgBeschreibung, DateField1, Statement, ResultSet, Connection as Object
Dim Anfang, Ende , Year1, Year2, Month1,Month2, Date1, Date2  as string
dlgBeschreibung = DialogLibraries.Standard.Dialog_Datum
dlg = CreateUnoDialog(dlgBeschreibung)
DateField1 = dlg.getControl("DateField1")
DateField2 = dlg.getControl("DateField2")
Dlg.Execute()
sDate = DateField1.Date
edate = DateField2.date
Year1 = Mid(sDate, 1,4)
Month1 = Mid(sDate, 5,2)
Date1 = Mid(sDate, 7,2)
sdate = Year1 &"-"& Month1 &"-"& Date1

edate = DateField2.date
Year2 = Mid(eDate, 1,4)
Month2 = Mid(eDate, 5,2)
Date2 = Mid(eDate, 7,2)
edate = Year2 &"-"& Month2 &"-"& Date2
Anfang = sdate
Ende = edate

query = "SELECT  ""Kunden"".""Anrede"", ""Kunden"".""Vorname"", ""Kunden"".""Name"", ""Leistungen"".""Leistung"", ""Leistungsnachweis"".""Menge"", ""Preise"".""Preis"", ""Kunden"".""Kunden-ID"", ""Preis"" * ""Menge"" AS ""Gesamt"", ""Leistungsnachweis"".""Datum"" FROM ""Leistungsnachweis"" AS ""Leistungsnachweis"", ""Kunden"" AS ""Kunden"", ""Preise"" AS ""Preise"", ""Leistungen"" AS ""Leistungen"" WHERE ""Leistungsnachweis"".""Kunden-ID"" = ""Kunden"".""Kunden-ID"" AND ""Preise"".""Kunden-ID"" = ""Kunden"".""Kunden-ID"" AND ""Preise"".""Leistungs-ID"" = ""Leistungen"".""Leistungs-ID"" AND ""Leistungsnachweis"".""Datum"" = ""Leistungsnachweis"".""Datum"" AND ""Preise"".""Kunden-ID"" = ""Leistungsnachweis"".""Kunden-ID"" AND ""Preise"".""Leistungs-ID"" = ""Leistungsnachweis"".""Leistungs-ID"" AND ""Kunden"".""Kunden-ID"" = 0 AND ""Leistungsnachweis"".""Datum"" >= {D '" 
sSQL1 = query & Anfang & "'} AND ""Leistungsnachweis"".""Datum"" <= {D '" & Ende &"'  }"
oResultSet = oStatement.executeQuery(sSQL1)
End Sub
Ich möchte mit dieser Abfrage einen Bericht erstellen.
Muss ich einen Umweg gehen und eine Tabelle anlegen, in die die abgefragten Daten zwischengespeichert und dann mit dem Report weiter verarbeitet werden?

Grüße
Uli

Re: Basic mit SQL

von eBayer » Do, 30.07.2009 09:10

ok, versuchen wir einen Schritt weiterzukommen...
Wenn die Variablen a und e nicht als Global definiert wurden, kannst Du sie in der Funktion nicht sehen.
Es gibt 2 Möglichkeiten:
1. Variablen als Global definieren (ist aber die unsaubere Methode)
2. Die Variablen als Parameter an die Funktion übergeben, dann sind sie dort sichtbar und Du kannst sie dort - und nur dort - verwenden.
Wenn Du Dir unsicher beim Zusammenbau des SQL-Statements bist, würde ich Dir empfehlen:
1. Dich mit der Doku auseinanderzusetzen
2. Die fraglichen, vermuteten Fehlerquellen zunächst nicht einzubauen und das SQL-Statement so langsam aufzubauen und Schritt für Schritt zu erweitern!
Gruß eBayer

Re: Basic mit SQL

von ulihueck » Mi, 29.07.2009 22:16

Hallo ebayer.
Danke für Deine Antwort.
a und e sind 2 Variablen, die aus einem Dialogstammen, der zwei Datumsangaben erfassen soll. Anfan und Ende des Zeitraum, für den die Abfrage gelten soll.
Wegen den Fehlermeldungen weiß ich leider nicht, ob der Dialog die Variablen übergibt.
Im Forum habe ich gelesen, dass dann das Datum als Strin in geschweiften Klammern angegeben werden soll.

Grüße
Uli

Re: Basic mit SQL

von eBayer » Mi, 29.07.2009 20:10

Nochmal: was ist a und was ist e?
Wo hast Du a und e definiert und womit hast Du die beiden Variablen gefüllt?
Außerdem fehlt, wenn ich Dein SQL-Statement richtig lese, das "&" nach dem a
also: sSQL1 = query & a & " } AND e < {D "

Ich bin nicht der SQL-Spezi, aber die geschweiften Klammern verstehe ich auch nicht!
Gruß eBayer

Re: Basic mit SQL

von ulihueck » Mi, 29.07.2009 17:23

Hallo.
Danke für den Tipp mit 'Aufnahme'. Es liegt tatsächlich an ' im String.
Trotzdem komme ich leider nicht weiter.
Mit der Abfrage sollen Leistungen, die in einem Zeitbereich geleistet wurden, aufgelistet werden.
Dazu habe ich eine Dialogbox erstellt, mit der ich das Anfangsdatum und das Enddatum eingebe.
Die beiden Datumsangaben sollen dann in die SQL-Anweisung eingebaut werden.
Leider klappt das noch nicht so richtig, weil ich die Datumsangaben wohl nicht richtig einbinde.
Hier der aktuelle Code:

Code: Alles auswählen

Sub Leistungen_Zeitintervall
GlobalScope.BasicLibraries.LoadLibrary("Tools")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog_Datum)
Dlg.Execute()
dim oDatabaseContext, oDataSource, oConnection , oStatement as object

dim query, sSqL1 as string
oDatabaseContext=CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=oDatabaseContext.getbyName("ABH")
oConnection=oDataSource.getConnection("", "")
oStatement=oConnection.createStatement()

sSQL1="SELECT ""Kunden"".""Anrede"", ""Kunden"".""Titel"", ""Kunden"".""Vorname"", ""Kunden"".""Name"", ""Kunden"".""Straße"", ""Kunden"".""Hausnummer"", ""Kunden"".""Postleitzahl"", ""Kunden"".""Stadt"", ""Leistungen"".""Leistung"", ""Leistungsnachweis"".""Menge"", ""Leistungsnachweis"".""Datum"", ""Kunden"".""Kunden-ID"", ""Preise"".""Preis"", ""Preis"" * ""Menge"" AS ""Gesamt"" FROM ""Leistungsnachweis"" AS ""Leistungsnachweis"", ""Kunden"" AS ""Kunden"", ""Preise"" AS ""Preise"", ""Leistungen"" AS ""Leistungen"" WHERE ""Leistungsnachweis"".""Kunden-ID"" = ""Kunden"".""Kunden-ID"" AND ""Preise"".""Kunden-ID"" = ""Kunden"".""Kunden-ID"" AND ""Preise"".""Leistungs-ID"" = ""Leistungen"".""Leistungs-ID"" AND ""Leistungen"".""Leistungs-ID"" = ""Leistungsnachweis"".""Leistungs-ID""  AND ""Kunden"".""Kunden-ID"" = ?   AND a >= {D ""
sSQL1 = query & a " } AND e < {D "
sSQL1 = query & e " } ORDER BY "Leistungsnachweis"."Datum" ASC"
sSQL1=query
oStatement.executequery(sSQL1)
sql=ReplaceString(sql,a,"ANFANG")
sql=ReplaceString(sql,e,"ENDE")
End Sub

Wie kann ich das Anfangs- und das Enddatum am besten einbauen??

Grüße
Uli

Re: Basic mit SQL

von komma4 » Di, 28.07.2009 21:00

eBayer hat geschrieben:Ist das eine selbstgebaute Funktion?
Wird mit einer Standard-OOo-Installation mitgeliefert: Bibliothek TOOLS Modul STRINGS

Tipp: Extension OOo BTL2 - BasicTextListe
OOo BTL2 hat geschrieben:Gibt alle vorhandenen BASIC-Module aus allen installierten Bibliotheken und allen aktuell geladenen Dokumenten in ein Writer-Dokument aus.

Re: Basic mit SQL

von eBayer » Di, 28.07.2009 18:04

Hallo, schau Dir mal Deine folgenden Zeilen genauer an:
zu Zeile 1: ich bin mir nicht sicher, daß `Aufnahme` so richtig aufgelöst wird.
zu Zeile 2: was ist a? query & a
Wenn Du damit eine irgendwo vorher definierte Variable meinst könnte es passen, aber dann gehört hinter a auch ein "&"
Das gleiche gilt auch für Zeile-3!
ReplaceString kenne ich nicht, finde es auch nicht in der Hilfe. Ist das eine selbstgebaute Funktion?
Gruß eBayer

1. AND ""Kunden"".""Kunden-ID"" = ? AND `Aufnahme` >= {D ""
2. query = query & a " } AND `Aufnahme` < {D "
3. query = query & e " } ORDER BY "Leistungsnachweis"."Datum" ASC"
sSQL1=query
oStatement.executequery(sSQL1)
sql=ReplaceString(sql,a,"ANFANG")
sql=ReplaceString(sql,e,"ENDE")

Basic mit SQL

von ulihueck » Di, 28.07.2009 17:36

Hallo.
Ich möchte eine Abfrage in ein Makro einbauen.
Leider erhalte ich bei der Ausführung folgenden Fehler in der Zeile
query = "Select... : BasicSyntax-Fehler. Erwartet: ".

Komisch - bei anderen Makros mit einer SQL-Anweisung funktioniert eine Abfrage in einem Makro.
Hier mein Code:

Code: Alles auswählen

Sub Leistungen_Zeitbereich

GlobalScope.BasicLibraries.LoadLibrary("Tools")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog_Datum)
Dlg.Execute()
dim oDatabaseContext, oDataSource, oConnection , oStatement as object

dim query,  sSQL1 as string
oDatabaseContext=CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=oDatabaseContext.getbyName("ABH")
oConnection=oDataSource.getConnection("", "")
oStatement=oConnection.createStatement()

query =" SELECT ""Kunden"".""Anrede"", ""Kunden"".""Titel"", ""Kunden"".""Vorname"", ""Kunden"".""Name"", ""Kunden"".""Straße"", ""Kunden"".""Hausnummer"", ""Kunden"".""Postleitzahl"", ""Kunden"".""Stadt"", ""Leistungen"".""Leistung"", ""Leistungsnachweis"".""Menge"", ""Leistungsnachweis"".""Datum"", ""Kunden"".""Kunden-ID"", ""Preise"".""Preis"", ""Preis"" * ""Menge"" AS ""Gesamt"" FROM ""Leistungsnachweis"" AS ""Leistungsnachweis"", ""Kunden"" AS ""Kunden"", ""Preise"" AS ""Preise"", ""Leistungen"" AS ""Leistungen"" WHERE ""Leistungsnachweis"".""Kunden-ID"" = ""Kunden"".""Kunden-ID"" AND ""Preise"".""Kunden-ID"" = ""Kunden"".""Kunden-ID"" AND ""Preise"".""Leistungs-ID"" = ""Leistungen"".""Leistungs-ID"" AND ""Leistungen"".""Leistungs-ID"" = ""Leistungsnachweis"".""Leistungs-ID""  AND ""Kunden"".""Kunden-ID"" = ?   AND `Aufnahme` >= {D ""
query = query & a " } AND `Aufnahme` < {D "
query = query & e " } ORDER BY "Leistungsnachweis"."Datum" ASC"
sSQL1=query
oStatement.executequery(sSQL1)
sql=ReplaceString(sql,a,"ANFANG")
sql=ReplaceString(sql,e,"ENDE")

End Sub
Wo liegt mein Fehler?

Grüße
Uli

Nach oben