Function sequence error bei Tabellenupdate über XRow

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Kalinka
*
Beiträge: 15
Registriert: Mi, 22.03.2006 11:05
Wohnort: Hamburg

Function sequence error bei Tabellenupdate über XRow

Beitrag von Kalinka »

Hallo,

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
Also das Programm ruft zuerst den Dialog auf. Dort kann eine LS-Nr. in

Code: Alles auswählen

oDialog.getControl("tLnr").Text
eingegeben werden und über eine Suchfunktion

Code: Alles auswählen

LS_search()
geprüft werden, obs der richtige LS ist. Dann soll der neue Datumswert in die DB (Sybase Adaptive Server Anywhere 8 ) zurückgeschrieben werden.
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)
. Es gibt eine Exeption und den function sequence error.
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