versuche mich gerade in OO-Basic einzuarbeiten. Bevor ich größere Projekte angehe, wollte ich erst mal an kleineren Dingen lernen.
Da wir in unserer Warenwirtschaft manchmal das Lieferscheindatum eines Lieferscheines ändern müssen und das Programm das selbst nicht anbietet (und ich das immer händisch in der DB machen muß), habe ich ein kleines Programm geschrieben, das mir das Datum ändert:
Code: Alles auswählen
Option Explicit
Dim oDialog as Object, oModel as Object ' Dialog & Modell des Dialoges
Dim oDVerb as Object, DatabaseContext as Object, oDatenquelle as Object, oStatement as Object ' Datenbankverbindungsobjekte
Dim oResultSet as Object ' Datensatz mit zu änderndem LS
Sub DialogAnzeigen
DialogLibraries.LoadLibrary("Impuls")
oDialog = createUnoDialog(DialogLibraries.Impuls.dLieferschein)
oModel = oDialog.getModel()
oDialog.getControl("dDatum_neu").Date = CDateToIso(Now)
getDB
oDialog.execute()
End Sub
sub DialogBeenden
oStatement.close()
oDVerb.close()
oDialog.endExecute()
end sub
Function LS_search as Integer
Dim sLieferschein as String
clearLabel
sLieferschein = oDialog.getControl("tLnr").Text
If Left(sLieferschein,1) <> "2" or LEN(sLieferschein) <> 6 Then
oDialog.getControl("lMessage").Text = "Eine LS-Nummer beginnt immer mit '2' und hat 6 Stellen - bitte korrigieren"
Else
oResultSet = oStatement.executeQuery("Select count(*) FROM Lieferschein where Lieferschein_Nr = '" & sLieferschein & "'")
oResultSet.Next()
LS_Search = oResultSet.getInt(1)
if LS_Search = 0 then
oDialog.getControl("lMessage").Text = "Diese LS-Nummer existiert leider nicht."
Elseif LS_Search > 1 then
oDialog.getControl("lMessage").Text = "Es gibt mehr als einen LS mit dieser Nummer. Bitte dem Admin melden."
Else
oResultSet = oStatement.executeQuery("SELECT * FROM Lieferschein where Lieferschein_Nr = '" & sLieferschein & "'")
oResultSet.Next()
' Lieferscheindaten einlesen
oDialog.getControl("lKdnr").Text = oResultSet.getString(15)
oDialog.getControl("lRgnr").Text = oResultSet.getString(9)
oDialog.getControl("lKunde").Text = oResultSet.getString(16)
oDialog.getControl("lDatum_alt").Text = CDate(oResultSet.getString(6))
End if
End if
End Function
Sub ChangeLdat
Dim dDatum_neu as Long, sDatum_neu as String
' zuerst prüfen, ob es den Lieferschein gibt (0 = nein, 1 = ja, >1 = mehr als ein)
if LS_search() = 1 then
dDatum_neu = CDateFromIso(oDialog.getControl("dDatum_neu").Date)
sDatum_neu = Year(dDatum_neu) & "-" & Format(Month(dDatum_neu),"0#") & "-" & Format(Day(dDatum_neu),"0#")
--> oResultSet.updateString(6,sDatum_neu) -> hier hakt es
oResultSet.updateRow()
oDialog.getControl("lMessage").Text = "Das neue Lieferscheindatum '" & sDatum_neu & "' wurde gespeichert."
End if
End Sub
Sub getDB
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDatenquelle = DatabaseContext.getByName("Textil")
If not oDatenquelle.isPasswordRequired then
oDVerb = oDatenquelle.getConnection("","")
Else
oHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
oDVerb = oDatenquelle.connectWithCompletion(oHandler)
End if
oStatement = oDVerb.createStatement()
oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
End Sub
Sub clearLabel
' löscht evtl. vorhandene Einträge
oDialog.getControl("lKdnr").Text = ""
oDialog.getControl("lRgnr").Text = ""
oDialog.getControl("lKunde").Text = ""
oDialog.getControl("lDatum_alt").Text = ""
oDialog.getControl("lMessage").Text = ""
End Sub
Code: Alles auswählen
oDialog.getControl("tLnr").Text
Code: Alles auswählen
LS_search()
Das klappt leider nicht. Die LS_search-Routine sucht den richtigen LS in der Sub ChangeLdat (die zum Schreiben aufgerufen wird) erst raus und dann hakt es bei
Code: Alles auswählen
oResultSet.updateString(6,sDatum_neu)
Ich habe oStatement mittels Xray geprüft. ResultSetConcurrency und ResultSetType werden richtig gesetzt. Daran kann es nicht liegen.
Natürlich könnte ich mir ein eigenes Update-SQL-Script machen, aber es sollte doch auch so gehen

Also, weiß jemand ob es evtl. an meiner Datenbank liegt, oder ist es ein ODBC-Problem von OO (unsere Fakturierung spricht nur per ODBC mit der DB) oder liegt es evtl. daran, daß ich keine UpdateXXX-Funktion aufrufen darf, nachdem ich Werte aus dem ResultSet gelesen habe (das wäre ziemlich blöd) ?
Weiß evtl. noch jemand, warum das oResultSet nicht NULL ist, wenn die SQL-Abfrage kein Ergebnis bringt ? Bei mir ist das oResultSet immer ein Objekt, egal, ob die Abfrage Ergebnisse hat oder nicht. Daher meine etwas umständliche Konstruktion mit der vorgeschalteten count()-Abfrage.
Danke für Eure Hilfe, Kalinka