Pannello di Controllo Moderatore ]

Inserimento dati da calc a db; inserire solo nuovi record

Creare una macro - Scrivere uno script - Usare le API

Inserimento dati da calc a db; inserire solo nuovi record

Messaggioda marcocurreli » sabato 8 maggio 2021, 0:24

Buonasera,
ho una macro che inserisce record nel database da una tabella di calc; le tabelle, di calc e del database, devono essere aggiornate continuamente, per cui, quando qualche record è già stato inserito, la macro restituisce un errore di violazione di unicità. C'è un modo per aggiungere al database solo i nuovi record?
Codice: Seleziona tutto   Espandi visualeStringi visuale
for i = 1 to iCount-1
  ID = Sh.getCellByPosition(0, i).getString()
  campo2 = Sh.getCellByPosition(1, i ).getString()
  campo3 = Sh.getCellByPosition(2, i ).getString()

sql = "INSERT into ""prova"" (""ID"", ""campo2"", ""campo3"") VALUES " _
       & "('" & ID & "', '" & due & "', '" & tre  & "')"
    oDeclaracion.Execute(sql)
  next i
    doc.close(false)

Ho provato con On Error Resume Next, ma la macro rimane in esecuzione all'infinito.
Ho provato anche con questa istruzione, ma anche questa volta la macro rimane in esecuzione all'infinito.
Codice: Seleziona tutto   Espandi visualeStringi visuale
sql1 = "SELECT IFNULL(""ID"", 0)  AS ""ID"" FROM ""prova"" "
sNull =oDeclaracion.Execute(sql1)
if sNull > 0 then
oDeclaracion.Execute(sql)
end if
LibreOffice 7.1.4 -- Linux 5.12.12-arch
marcocurreli
 
Messaggi: 24
Iscritto il: sabato 10 aprile 2021, 13:28

Re: Inserimento dati da calc a db; inserire solo nuovi recor

Messaggioda Gaetanopr » sabato 8 maggio 2021, 9:40

marcocurreli ha scritto: C'è un modo per aggiungere al database solo i nuovi record?

I passaggi corretti sono i seguenti:
1) Select per verificare se il campo ID(Valore univoco per record) sia già presente nella tabella "prova".
2) Analizzare il risultato della Select.
3) ID non presente si effettua una INSERT.
4) ID presente si passa al prossimo record oppure si aggiorna(istruzione UPDATE) quello esistente e poi si passa ai prossimi record.

Questo è il codice corretto, naturalmente non l'ho potuto testare non avendo a disposizione i file ods e odb.
Codice: Seleziona tutto   Espandi visualeStringi visuale
sSQL = "SELECT ID FROM ""prova"" WHERE ID='" & ID & "'"
      oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")   
      If oDBC.hasByName( Nomedatabase ) Then
         oBD = oDBC.getByName( Nomedatabase )
         oConexion = oBD.getConnection("","")
         oDeclaracion = oConexion.createStatement()
         oResultado = oDeclaracion.executeQuery( sSQL)
         oResultado.next()
         If oResultado.getRow = 0 Then
            sql = "INSERT into ""prova"" (""ID"", ""campo2"", ""campo3"") VALUES " _
                & "('" & ID & "', '" & due & "', '" & tre  & "')"
            oDeclaracion.executeUpdate( sql)
         Else
            oResultado.close()
            MsgBox "Record già presente"
            EVENTUALE UPDATE RECORD IN CASO DI POSSIBILI VARIAZIONI
         End If
           End If
Openoffice 4.1 su windows xp
Gaetanopr
Volontario
Volontario
 
Messaggi: 2903
Iscritto il: mercoledì 21 novembre 2012, 21:07

Re: Inserimento dati da calc a db; inserire solo nuovi recor

Messaggioda marcocurreli » sabato 8 maggio 2021, 14:58

Funziona alla grande! Grazie.
LibreOffice 7.1.4 -- Linux 5.12.12-arch
marcocurreli
 
Messaggi: 24
Iscritto il: sabato 10 aprile 2021, 13:28

Re: Inserimento dati da calc a db; inserire solo nuovi recor

Messaggioda charlie » sabato 8 maggio 2021, 18:41

Sistema corretto per aggiungere [Risolto] viewtopic.php?f=2&t=5661
charlie
macOS 10.12 Sierra: Open Office 4.1.9 - LibreOffice 6.4.6.2
http://www.charlieopenoffice.altervista.org
Avatar utente
charlie
Site Admin
Site Admin
 
Messaggi: 7551
Iscritto il: mercoledì 19 dicembre 2012, 11:50


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti