Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: LibreOffice Basic .NET yhdistelmä

neosofta [06.04.2026 20:09:22]

#

Kevyt viritelmä tiedostosta byte taulukosksi luetun datan viennistä Dao tietokannan taulun adLongVarBinary (BLOB) sarakkeen tietueen kenttään käyttäen .NET palikkaa.

REM Module1:
REM  *****  BASIC  *****

' Komponentit:
' Valintaikkuna (Dialog1)
' Ohjausobjektit
' ListBox (ListBox1)
' Sido Objektin tilaa muutettu -> LstBoxStateChange tapahtumaan
' Tallenna projektisi

' Valitse valikkoriviltä: Työkalut -> Mukauta
' Valitse vasemmalta ylhäältä välilehti: Valikot
' Valitse oikealta ylhäältä: Rajaus alasvetolaatikko, valitse projektisi nimi.
' Valise sen alta: Kohde ja klikkaa oikealla pikku täppää (kolme viivaa alekkain)
' Klikkaa: Lisää, Kirjoita ylimpään tekstiruutuun Uusi valikko 1 tillalle:
' DaoBase ja klikkaa OK.
' Valitse vasemmalta ylhäältä Luokka alasvetolaatikko ja valitse laatikosta
' makro, odota ja valitse projektisi nimi. Laajenna alla olevan alasvetolaatikon
' listassa puu jossa lukee projektisi nimi. Tuplaklikkaa StarToWork jolloin se
' ilmestyy oikealle alempaan laatikkoon (Assigned Commands)
' Valitse StartToWork. Klikkaa alhaalta Muuta nappia -> Nimeä uudelleen
' kirjoita: Create/Write, klikkaa OK nappia
' Tees sama uudelleen ja valitse ja valitse ReadDaoBase, tuplaklikkaa, klikkaa OK
' nappia vasemmalla alhaalla ja tallenna projektisi.
' Valitse valikkoriviltä: Työkalut -> Mukauta -> valitse Tapahtumat välilehti,
' valitse listasta Asiakirjaa ollaan sulkemassa. Klikkaa Makro nappia.
' Valitse vasemmalla (Kirjasto), laajenna projektsi nimi puuu -> laajenna
' Standard, klikkaa Module1, Valitse OnClose -> klikkaa alhaalla OK ja tallenna
' jälleen projektisi.

REM Lisenssi: DWYFW (tee mitä v***** ikinä haluat)

Option VBASupport 1
Private DBEngine As Object
Private Const dbFixedField	 = 1
Private Const dbLong = 4
Private Const dbText	= 10
Private Const dbLongVarBinary = 11
Private Const dbAutoIncrField = 16
Private Const dbOpenDynaset = 2
Private Const dbOpenTable = 1
Private oListenerTop As Object
Private oController As Object
Private oDoc As Object
Private localFile As String
Private dbFile As String
Private Records() As String
Global oDlg As Object
Private oList As Object
Private CreateRunning As Boolean
Private ReadRunning As Boolean
Private oListenerTop As Object

Sub StartToWork

	If CreateRunning Then Exit Sub
	CreateRunning = True

	oDoc = ThisComponent
	oController = ThisComponent.CurrentController
	oDoc.lockControllers

	Dim filepicker As Object
	filepicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
	filepicker.setDisplayDirectory(Left(thisComponent.URL, InStrReverse(thisComponent.URL, "/") - 1))
	filepicker.appendFilter("Images (*.jpg; *.png; *.gif; *.bmp; *.tiff)", "*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tiff")
	filepicker.appendFilter("RTF (*.rtf)", "*.rtf")
	filepicker.appendFilter("ZIP (*.zip)", "*.zip")
	filepicker.setCurrentFilter("Images (*.jpg; *.png; *.gif; *.bmp; *.tiff)")

	If filepicker.Execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
		sFileArray = filepicker.getFiles()
        localFile = ConvertFromUrl(sFileArray(0))
    Else
    	MsgBox "Canceled by the user","48","System"
    	CreateRunning = False : Exit Sub
    End If

	dbFile = Replace(localFile, Left(localFile, InStrReverse(localFile, "\")), "")

	thisComponent.Store
	BuildDialog

	Dim sURL$, basePath$, dbPath$

	sURL = ConvertFromUrl(thisComponent.URL)
	basePath = Left(sURL, InStrRev(sURL, "\"))
    dbPath = basePath & "DaoBase.accdb"

    Dim existst As Boolean
    existst = False

	Dim DBEngine As Object
	Set DBEngine = CreateObject("DAO.DBEngine.120")
	If Dir(dbPath) <> "" Then
    	existst = True: Goto jump
    End If

	Dim sLang As String
    sLang = ";LANGID=0x0409;CP=1252;COUNTRY=0"
	DBEngine.CreateDatabase dbPath, sLang

Jump:

	Dim db As Object
	Set db = DBEngine.OpenDatabase(dbPath)

	IF existst Then Goto jump2

	Dim tdf As Object
	Set tdf = db.CreateTableDef("TABLE1")

	Dim fld As Object

	With tdf
    	Set fld = .CreateField("ID", 4)
    	fld.Attributes = dbAutoIncrField
    	.Fields.Append fld
    	Dim idx As DAO.Index
    	Set idx = .CreateIndex("PrimaryKey")
    	idx.Primary = True
    	idx.Unique = True
    	idx.Fields.Append idx.CreateField("ID")
    	.Indexes.Append idx
    	Set fld = .CreateField("File", dbText)
    	fld.Required = True
		.Fields.Append fld
    	Set fld = .CreateField("Data", dbLongVarBinary)
    	fld.Required = False
    	.Fields.Append fld
	End With

	db.TableDefs.Append tdf

jump2:

	strSQL = "Select ID, File, Data From TABLE1"
	Dim rs As Object
	Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
	If Not rs.EOF Then rs.MoveLast
	rs.AddNew
	rs.Fields.Item("File").Value = dbFile
	rs.Update
	rs.Close

	If Not IsNull(tdf) Then Set tdf = Nothing
    db.Close : Set db = Nothing
	Set DBEngine = Nothing

	Dim myNetBlob As Object, result As String
    myNetBlob = CreateObject("NetOleBlob.helper")
    result = myNetBlob.WriteBlob(dbPath, "TABLE1", "Data", localFile)
	CreateRunning = False

End Sub

Sub ReadDaoBase

	Dim sURL$, basePath$, rtfPath$, dbPath$
	sURL = ConvertFromUrl(thisComponent.URL)
	basePath = Left(sURL, InStrRev(sURL, "\"))
	oDoc = ThisComponent
	oController = ThisComponent.CurrentController
	oDoc.lockControllers
    If ThisComponent.hasLocation() Then ThisComponent.store()
    ThisComponent.setModified(False)

    dbPath = basePath & "DaoBase.accdb"

    If Dir(dbPath) <> "" Then
 		BuildDialog
		Dim lTicks As Long
		lTick = GetSystemTicks()
 		DoEvents
		Do
			If GetSystemTicks() > lTick + 500 Then Exit Do
		Loop
		CenterDialog
		oListenerTop = createUnoListener("TopListen_", "com.sun.star.awt.XTopWindowListener")
		oDlg.addTopWindowlistener(oListenerTop)
		ReadFromDb
    Else
    	yesno = MsgBox("File: " & dbPath & " does no exists." & chr(10) _
    	& "             Do you want to create a new database file?", vbYesNo, "DaoBase")
    	Select Case yesno
    		Case 6
    			CreateRunning = False : StartToWork
    		Case Else
				CreateRunning = False : Exit Sub
    	End Select
    End If

End Sub

Sub ReadFromDb

	If ReadRunning Then Exit Sub
	ReadRunning = True

	Dim sURL$, basePath$,  dbPath$
	sURL = ConvertFromUrl(thisComponent.URL)
	basePath = Left(sURL, InStrRev(sURL, "\"))

    dbPath = basePath & "DaoBase.accdb"
	dbfName = dbFile

	If Dir(dbPath) = "" Then
    	MsgBox "File : " & dbPath & " cannot be found" : Exit Sub
    End If

    Dim DBEngine As object
	Set DBEngine = CreateObject("DAO.DBEngine.120")

	Dim db As Object
	Set db = DBEngine.OpenDatabase(dbPath)
	Dim strSQL As String
	strSQL = "SELECT File FROM TABLE1"

    Dim rs As Object, i As Long, rCount As Long
	Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
	If Not rs.BOF Then rs.MoveFirst
	rCount = rs.RecordCount

	If rCount > -1 Then
		ReDim Records()
		Dim lst As String : lst = Chr(10)
		rs.MoveFirst
		For i = 0 To rCount + 1
			lst =  lst & rs.Fields.Item("File").Value
			If i <= rCount Then lst = lst & Chr(10)
			If rs.EOF Then Exit For
			rs.MoveNext
		Next i
		Records = Split(lst, Chr(10)) : lst = ""
	Else
		MsgBox "There is no records in database", "48", "System"
		Exit Sub
	End If

	rs.Close : Set rs = Nothing
	db.Close : Set db =  Nothing
	oList.Model.StringItemList = Records
	oDlg.execute()

	ReadRunning = False
	CreateRunning = False

End Sub

Sub BuildDialog

	DialogLibraries.LoadLibrary("Standard")
	oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
	oList = oDlg.getControl("ListBox1")

End Sub

Sub CenterDialog

	Dim oSize As New com.sun.star.awt.Size, factor As Double
	Dim oCC, oComponentWindow, oTopWindowPosSize
	oCC = ThisComponent.getCurrentController()
	oComponentWindow = oCC.ComponentWindow
	oTopWindowPosSize = oComponentWindow.Toolkit.ActiveTopWindow.getPosSize()

	oSize.Width = oDlg.Model.Width
	oSize.Height = oDlg.Model.Height
	factor = oSize.Width / oDlg.convertSizeToPixel(oSize, com.sun.star.util.MeasureUnit.APPFONT).Width

	With oDlg.Model
		.PositionX = (factor * oTopWindowPosSize.Width - .Width) / 2
		.PositionY = (factor * oTopWindowPosSize.Height - .Height) / 1.75
	End With

End Sub

Sub TopListen_windowOpened
End Sub

Sub TopListen_windowClosed
 	oDlg.dispose
End Sub
Sub TopListen_windowMinimized
End Sub
Sub TopListen_windowClosing
	Running = False
	ReadRunning = False
	oDlg.removeTopWindowListener(oListenerTop)
	oListenerTop = Nothing
	oDlg.endexecute
End Sub
Sub TopListen_windowNormalized
End Sub
Sub TopListen_windowActivated
End Sub
Sub TopListen_windowDeactivated
End Sub
Sub TopListen_disposing
End Sub

Sub LstBoxStateChange(oEvent)

	If oEvent.Source.SelectedItems(0) <> "" Then
	sURL = ConvertFromUrl(thisComponent.URL)
	basePath = Left(sURL, InStrRev(sURL, "\"))
    dbPath = basePath & "DaoBase.accdb"
	Dim dbfName As String, sql As String
	dbfName = oEvent.Source.SelectedItems(0)
	Set DBEngine = CreateObject("DAO.DBEngine.120")
	Set db = DBEngine.OpenDatabase(dbPath)

	sql = "SELECT File, Data FROM TABLE1 Where File = '" & dbfName & "';"

	Dim rs As Object
	Set rs = db.OpenRecordset(sql , dbOpenDynaset)

	If Not rs.BOF Then rs.MoveFirst

	Dim fName As String, ext As String, pos
	fName = rs.Fields.Item("File").Value

	sURL = ConvertFromUrl(thisComponent.URL)
	basePath = Left(sURL, InStrRev(sURL, "\"))
	filePath = basePath & fName

	ext = Replace(fName, Left(fName,  InStrReverse(fName, ".") -1), "")
	Dim fName2 As String
	fName2 = Replace(fName, ext, "")
	fName2 = fName2 & "2" & ext
	Dim sFilePath As String
	sFilePath = Replace(filePath, fName, fName2)
	If Dir(sFilePath) <> "" Then Kill sFilePath
	Do While Dir(sFilePath) <> "" : Loop
	On Error Goto ErrorHandler

	Dim oInstream As Object, fileBytes() As Byte
	oInstream = com.sun.star.io.SequenceInputStream.createStreamFromSequence(rs.Fields.Item("Data").Value)
	oInstream.readBytes(fileBytes, oInstream.getLength())
	oInstream = Nothing
	Dim sfa As Object, oOut As Object
	sfa = createUnoService("com.sun.star.ucb.SimpleFileAccess")
	oOut = sfa.openFileWrite(sFilePath)
	oOut.writeBytes(fileBytes)
	rs.Close : Set rs = Nothing
	db.Close : Set db = Nothing
	Set DBEngine = Nothing

	Do While(sFilePath) = "" : Loop
	Dim oShellExe As Object
	oShellExec = CreateUnoService("com.sun.star.system.SystemShellExecute")
	oShellExec.execute(sFilePath, "", 0)
	oShellExec = Nothing
	Exit Sub

 ErrorHandler:
 	MsgBox Err.Description
 	Err.Clear
	End If

End Sub

Function InStrReverse(sText As String, search As String) As Long

	If sText = "" Or search = "" Or Len(search) > Len(sText) Then
    	InStrReverse = 0
    	Exit Function
	End If

	Dim i As Long

	For i = Len(sText) To 1 Step -1
		If Mid(sText, i, Len(search)) = search Then
			InStrReverse = i : Exit Function
		End If
	Next i

End Function

Sub OnClose
	ThisComponent.setModified(False)
End Sub
REM NO WARRANTY 😎

Saadaksesi virityksen toimimaan noudata näitä ohjeita

Kuvaus ja toiminto selviää tsiigaamalla tämän

Halutessaan valmiin testiprojektin voi imaista täältä

HV (hyvää vappua jo etukäteen)

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta