BASE: Übertrag eines Wertes zwischen zwei Tabellen

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

Moderator: Moderatoren

Senekurios
**
Beiträge: 26
Registriert: So, 13.03.2016 20:22

BASE: Übertrag eines Wertes zwischen zwei Tabellen

Beitrag von Senekurios »

Hallo,

ich habe mir anhand des Handbuchs ein Makro gebaut, das einen Wert aus einer Tabelle "Client Data" ausliest und diesen in eine Tabelle "Basic Data" schreiben soll, wenn der "Client", welcher in einem Listenfeld verknüpft ist, verändert wird. Das Makro ist an das Listenfeld gebunden und wird mit dem Ereignis "Nach dem Aktualisieren" ausgeführt.

Code: Alles auswählen

SUB Update_Client_Charge 
DIM oDoc, oDrawpage, oForm, oFeld, oClient, oResult, oDatenquelle, oVerbindung, oSQL_Anweisung AS OBJECT
DIM stSQL AS STRING
DIM charge AS Double

oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm = oDrawpage.Forms.getByName("Filter").getByName("Basic_Data")
oFeld = oForm.getByName("fmtID")
oClient = oForm.getByName("Selected by")
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
	oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()

' Read Client Fee from Client Data if a client is selected (List field!)
stSql = "SELECT ""ClientFee"" FROM ""Client Data"" WHERE ""ID_Client"" = '"+oClient.GetCurrentValue()+"'  "
oResult = oSQL_Anweisung.executeQuery(stSql)
charge = oResult.getdouble()
oForm.updateFloat(oForm.findcolumn("Client Charge"),charge) ' Insert Client Charge in Basic Data 

IF oForm.isNew THEN
oForm.insertRow()
ELSE
oForm.updateRow()
END IF
END SUB
Meine Tests ergeben, dass alles bis auf einen Punkt funktioniert. Wenn ich für "Charge" einen festen Wert eingebe, wird der Datensatz wie gewünscht aktualisiert. Will ich das Ergebnis der SQL-Abfrage verwenden, gibt es einen Typenkonflikt.

Ich habe auch schon versucht, das Zellenupdate mit dem SQL-Befehl "update" durchzuführen. Leider ohne Erfolg.

Wie kann ich diesen Typenkonflikt umgehen?

Gruß
Marko


Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst
Senekurios
**
Beiträge: 26
Registriert: So, 13.03.2016 20:22

Re: BASE: Übertrag eines Wertes zwischen zwei Tabellen

Beitrag von Senekurios »

als Ergänzung hier noch der Screenshot, was die Abfrage in SQL als Ergenbis bringt, für den Fall dass die ID_Client = 2 ist.
Dateianhänge
Unbenannt.jpg
Unbenannt.jpg (18.7 KiB) 3046 mal betrachtet
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: BASE: Übertrag eines Wertes zwischen zwei Tabellen

Beitrag von komma4 »

Senekurios hat geschrieben:gibt es einen Typenkonflikt.
Sage uns doch bitte mal wie die Tabellendefinition aussieht.
Du arbeitest im Code mit float und double Werten...

Und die Fehlermeldung zu sehen wäre auch nicht verkehrt
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Senekurios
**
Beiträge: 26
Registriert: So, 13.03.2016 20:22

Re: BASE: Übertrag eines Wertes zwischen zwei Tabellen

Beitrag von Senekurios »

Hallo Winfried,

danke für die Antwort. In der Datenbanktabelle ist der Wert für "ClientFee" als "Zahl [Numeric]" definiert.

Ich bin inzwischen durch Recherchieren und Probieren ein ganzes Stück weiter, aber leider noch nicht ganz fertig. Die WHILE Schleife zum Auslesen der Daten aus der Tabelle hat gefehlt. Es war dann gestern abend doch etwas zuviel :D

Jetzt habe ich "nur" noch das Problem, dass im Falle "Charge = 0" - In der Tabelle "Client Data" steht für "ClientFee" 0,00 drin - der Wert in der Tabelle Basic Data nicht aktualisiert wird, sondern der vorherige bestehen bleibt. Ist der Wert für "Charge" nur minimal größer als Null (z.b. 0,001), klappt es wie vorgesehen.
Gibt es dazu ggf. eine Lösungsidee?

Das Makro sieht nun so aus:

Code: Alles auswählen

SUB Update_Client_Charge 
DIM oDoc, oDrawpage, oForm, oResult, oFeld, oClient, oDatenquelle, oVerbindung, oSQL_Anweisung AS OBJECT
DIM stSQL AS STRING
DIM charge AS DOUBLE
DIM ID_Client AS LONG
oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm = oDrawpage.Forms.getByName("Filter").getByName("Basic_Data")
oFeld = oForm.getByName("fmtID")
oClient = oForm.getByName("Selected by")
ID_Client = oClient.GetCurrentValue()
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
	oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()

' Read Client Fee from Client Data if a client is selected (List field!)
IF ID_Client > 0 THEN
  stSql = "SELECT ""ClientFee"" FROM ""Client Data"" WHERE ""ID_Client"" = '"+oClient.GetCurrentValue()+"'  "
  oResult = oSQL_Anweisung.executeQuery(stSql)
	WHILE oResult.next
		charge = oResult.getDouble(1)
	WEND
	ELSE
	charge = 0	
ENDIF
oForm.updatedouble(oForm.findcolumn("Client Charge"),charge) ' Insert Client Charge in Basic Data 

IF oForm.isNew THEN
oForm.insertRow()
ELSE
oForm.updateRow()
END IF

END SUB
Antworten