Lock or frozen Database access (firebird via odbc32 simultanious Delphi+IBX)

Boa tarde,
Esta ligação TRAVA com outra aplicação concorrente por exemplo “delphi client aplication com Firebird”! Estou a usar o ODBC free.
A ligação ODBC está assim “**localhost/3050:**c:\trab\fb30\dados\MeusDados.Fdb”. portanto o “data engine” fala com o server a ligação “não” é embebed
Porém trava/Lock !?
Coisa mais estranha, já que da documentação do FB3.0 resulta que podem estar em rede um numero ilimitado de engines/users!? Se bem percebo nenhum usa exclusivamente a Database.FDB
Será que alguém pode ajudar-me. O codigo tal qual está:
DatabaseContext = createUnoService(“com.sun.star.sdb.DatabaseContext”)
DataSource = DatabaseContext.getByName(“GestACRA”) ’ Com ODBC porque persiste o problema do acesso directo via LibreOfice 7.5.3
Connection = DataSource.ConnectWithCompletion(InteractionHandler) ’ PopUp User: ??? /Pwd: *******
'Consulta:
oQuery = Connection.createStatement()
oQuery.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE

oQuery = Connection.createStatement()

oQuery.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE

sText = InputBox ("Id. N.º ",“NIF da Empresa: !”) ’ NIF , DscEntidad etc… qq campo da consulta

Não haverá algo como:(?)oQuery.CreateParameter seguido de Parameter.Add(Parm1…2…3) <== onde poderia ver isso ando um tanto perdido
sDSCENTIDAD = “’”+ CStr(sText) +"’" ’ Da I nputBox na verdade aqui precisava era um ou parâmetro
sSql = " SELECT FIRST 1 DISTINCT E.CENTIDAD_ID , E.DSCENTIDAD , " & _
" E.TPMORA || ’ ’ || E.MORADA ||’, N.º: '|| COALESCE ( E.NPOLICIA , E.ANDAR , ‘S/’ ) Morada, " & _
" L.CPALFA AS CPALFA , E.NIF, E.USERID " & _
" FROM EMPRESAS E , LOCART L " & _
" WHERE E.CP4=L.CP4 AND E.CP3= L.CP3 AND E.NIF IS NOT NULL AND E.NIF <> ‘’ " & _
" AND NIF = " +sDSCENTIDAD & _
" ORDER BY E.DSCENTIDAD "

nota: também dá para fazer assim : " AND NIF = :NIF " & _
mas de seguida há que fazer sSql = Replace(sSql, “:NIF”,sText) ’ e, tantas vezes tantas quantos os parâmetros! Qualquer interface assume que =:Parametro?
oQuery.Add.parameter ?!?oResult = oQuery.executeQuery(sSql)

If Not IsNull(oResult) Then
while oResult.next()

txtNomeEmp.Text   = oResult.getString(2)    ' Nome da Empresa
txtMoradaEmp.Text = oResult.getString(3)   ' Morada 
txtCPALFAEmp.Text = oResult.getString(4) ' Código Postal /Zip Code

’ E, assim completo a morada da carta
wend
End If

Connection.close()
Funciona, mas com conflitos sempre tenho outra aplicação concorrente a usar a mesma base!?
É que não faz sentido ter 2 bases, como é bom de ver uma para lidar com o LibreOffice e outra
com o meu cliente em delphi ou lazarus?!
Alguém me dá uma ajuda? Obrigado

Ainda não consegui entender corretamente sua demanda. Por favor, edite o título do tópico como uma pergunta mais clara.
.
O trecho de código no meio do texto, sem a devida formatação, também não ajuda. Reproduzo abaixo, com algumas alterações…

Option Explicit

Sub main()
Dim DatabaseContext
Dim DataSource
Dim Connection
Dim oQuery
Dim oResult
Dim sText
Dim sSql
Dim sQuote
Dim sDSCENTIDAD
Dim txtCPALFAEmp
Dim txtNomeEmp
Dim txtMoradaEmp

DatabaseContext = createUnoService(“com.sun.star.sdb.DatabaseContext”)

REM Com ODBC porque persiste o problema do acesso directo via LibreOfice 7.5.3
DataSource = DatabaseContext.getByName(“GestACRA”)

REM PopUp User: ??? /Pwd: *******
Connection = DataSource.ConnectWithCompletion(InteractionHandler) 

REM Consulta:
REM oQuery = Connection.createStatement()
REM oQuery.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE

REM NIF, DscEntidad etc… qq campo da consulta
REM Não haverá algo como:(?)oQuery.CreateParameter seguido de Parameter.Add(Parm1…2…3) <== onde poderia ver isso ando um tanto perdido
sText = InputBox ("Id. N.º ",“NIF da Empresa: !”)

REM Obtem as aspas usadas na Base de Dados
sQuote = Connection.getMetaData().getIdentifierQuoteString()

REM Da InputBox na verdade aqui precisava era um ou parâmetro
sDSCENTIDAD = sQuote & CStr(sText) & sQuote

sSql = "SELECT FIRST 1 DISTINCT E.CENTIDAD_ID, E.DSCENTIDAD, " & _
          "E.TPMORA || ' ' || E.MORADA ||', N.º: '|| COALESCE ( E.NPOLICIA, E.ANDAR, 'S/' ) Morada, " & _
              "L.CPALFA AS CPALFA , E.NIF, E.USERID " & _
                  "FROM EMPRESAS E, LOCART L" & _
                      "WHERE E.CP4=L.CP4 AND E.CP3= L.CP3 AND E.NIF IS NOT NULL AND E.NIF <> '' " & _
                          "AND NIF = " & sDSCENTIDAD & _
                              "ORDER BY E.DSCENTIDAD "

REM Utiliza a declaração preparada para obter os dados
oQuery = Connection.prepareStatement(sSql)

REM Nota: também dá para fazer assim : " AND NIF = :NIF " mas de seguida há que fazer
REM sSql = Replace(sSql, “:NIF”,sText) e, tantas vezes tantas quantos os parâmetros! Qualquer interface assume que =:Parametro?
REM oQuery.Add.parameter ?!?

oResult = oQuery.executeQuery(sSql)
If Not IsNull(oResult) Then
    while oResult.next()
        txtNomeEmp.Text = oResult.getString(2)    ' Nome da Empresa
        txtMoradaEmp.Text = oResult.getString(3)  ' Morada 
        txtCPALFAEmp.Text = oResult.getString(4)  ' Código Postal /Zip Code
        REM E, assim completo a morada da carta
    Wend
End If
Connection.close()

End Sub

.

Significa que a base de dados é utilizada em duas aplicações diferentes?
.
De qualquer maneira, já que avançou na utilização da macros para manipulação de Banco de Dados, dê uma olhada no Livro de Andrew Pytoniak, para ver se encontra sua resposta.
.
----EDIT-----
.
Seu tópico, refere-se a esta pergunta?

.
Sem acesso ao arquivo exemplo fica difícil tentar reproduzir o problema para possível solução.
.
Com base na pergunta, tente talvez tratar o erro com algo semelhante a estrutura a seguir:

If Connection.isReadOnly() Then
    MsgBox "Base de dados está sendo usada por outra aplicação no momento."
    Connection.close()
    Exit Sub
End If

Valeu André. Obrigado. O problema do ODBC está ultrapassado foi só fazer reboot. Por certo haveria algo em memória estragando a minha ligação.
De facto a primeira aproximação foi fazer uma ligação local embarcada.
Só depois à medida que ia ganhando confiança fui avançando e mudei do embedded para myhostIP/3050:C:\MeuPath\MinhaDataBase.
Só que andei dois ou três dias sem desligar a máquina assim que fiz o reboot e logo tudo começou a funcionar sem travar a máquina.
Obrigado pelo Livro do Pytoniac, vou estudá-lo.
Se sair alguma coisa de DB_Grids ,“Controlo de Tabelas” e “Dialogs” por favor me avise.
Todos os exemplos carregam os Grids a partir de folhas de calculo nunhum exemplo até agora de como

Aquele exemplo foi a forma que encontrei para ultrapasar a falta do dialog + DbGrid ou controlo de tabela.
E, está a funcionar embora não esteja bonito e obrigue de antemão a saber o NIF(N.º Identificação Fiscal)

Obrigado
Atentamente

Felipe Alé via Ask LibreOffice <noreply@ask.libreoffice.org> escreveu no dia domingo, 16/10/2022 à(s) 20:07:

Postei um arquivo exemplo aqui:

.

.
No exemplo o grid é carregado em janela de diálogo, com algumas interações com o usuário para personalização (FACILMENTE AJUSTÁVEL)
.
Antes de preencher o Grid, os dados são carregado em folha de cálculo, porém, toda interação entre o DataBase e o calc, ocorre de maneira imperceptível para o usuário.
.
Ainda estou trabalhando no entendimento para obter os registros direto da Fonte de Dados.

“Antes de preencher o Grid, os dados são carregado em folha de cálculo…”

A questão é “dimensionar o grid” onde o
Intervalo=osheets.cells(0,1,2,3, last ou ultima linha) para dimensionar a matriz do string grid.
Agora como calcular o intervalo em uma database table?!
Essa é a questão de fundo ou o “busílis” da questão. Obrigado