Inserimento dati da calc a db; inserire solo nuovi record

Creare una macro - Scrivere uno script - Usare le API
Rispondi
marcocurreli
Messaggi: 104
Iscritto il: sabato 10 aprile 2021, 13:28

Inserimento dati da calc a db; inserire solo nuovi record

Messaggio da marcocurreli »

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

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

sql1 = "SELECT IFNULL(""ID"", 0)  AS ""ID"" FROM ""prova"" "
sNull =oDeclaracion.Execute(sql1)
if sNull > 0 then 
oDeclaracion.Execute(sql)
end if
LibreOffice 7.3.0 -- Linux 5.16.4-arch
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

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

Messaggio da Gaetanopr »

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

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
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
marcocurreli
Messaggi: 104
Iscritto il: sabato 10 aprile 2021, 13:28

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

Messaggio da marcocurreli »

Funziona alla grande! Grazie.
LibreOffice 7.3.0 -- Linux 5.16.4-arch
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8786
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

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

Messaggio da charlie »

Sistema corretto per aggiungere [Risolto] viewtopic.php?f=2&t=5661
charlie
macOS 14.3 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Rispondi