Newsgroup: it.comp.appl.access
Titolo: Problema di aggiornamento dati via VBA su server sql che su progetto adp funzionava!

Salve,
Ho un database accdb (Access2019) collegato via ODBC a sql server
ho il seguente codice su un pulsante per accodare dei dati su una tabella
che sul db in access 2003 con progetto adb funzionava ma che ora continua a darmi errore ("Tipo non corrispondente nell'espressione") e non capisco cosa sto sbagliando:
 
Private Sub Comando106_Click()
Dim strSQL As String
Dim NRec As Long
Dim strFiltro, strFiltro1 As String
strFiltro = Me!ID_Fornitura
strFiltro1 = Me!IDFornitore
'MsgBox strFiltro1
'MsgBox strFiltro
 
 
strSQL = "INSERT INTO [dbo_Dettagli ordini a fornitori] ( Peso_Ritiro, ID_Fornitura, Posizione, Descrizione, Quantità, Qta, Comm, Codice, COD_rada, UN, Prezzo, Prezzo1, [Tipo di prezzo], SCONTO, Sconto1, FORNITORE_PREFERENZIALE, [Prezzo di riferimento], Lavorazione )" & _
"SELECT dbo_Codici_PDM.PESO*dbo_DistintaMateriali_UT.Quantità AS Peso_Ritiro, [dbo_Ordine a fornitore].ID_Fornitura, dbo_DistintaMateriali_UT.Posizione, dbo_DistintaMateriali_UT.Descrizione+' - '+dbo_DistintaMateriali_UT.Dimensioni+' - '+dbo_DistintaMateriali_UT.Materiale AS Des, dbo_DistintaMateriali_UT.Quantità, dbo_DistintaMateriali_UT.Quantità, dbo_DistintaMateriali_UT.COMM, dbo_Codici_PDM.CODICE_COSTRUTTORE, dbo_DistintaMateriali_UT.ParticolareDWG, dbo_DistintaMateriali_UT.UN, dbo_Codici_PDM.PREZZO_LISTINO, dbo_Codici_PDM.PREZZO_LISTINO, dbo_Codici_PDM.[Tipo di prezzo], dbo_Codici_PDM.SCONTO, dbo_Codici_PDM.SCONTO, dbo_Codici_PDM.FORNITORE_PREFERENZIALE, dbo_Codici_PDM.PREZZO_LISTINO, dbo_DistintaMateriali_UT.Finitura " & _
"FROM dbo_DistintaMateriali_UT, [dbo_Ordine a fornitore], dbo_Fornitori, dbo_Codici_PDM " & _
"WHERE dbo_Fornitori.IDFornitore = " & strFiltro1 & " AND(dbo_DistintaMateriali_UT.oRDINATA = 1) AND(dbo_DistintaMateriali_UT.oRDINATA_PRIMA=0) AND (dbo_DistintaMateriali_UT.RdO=FALSE) AND (dbo_DistintaMateriali_UT.Fornitore=dbo_Fornitori.NomeFornitore) AND([dbo_Ordine a fornitore].ID_RichiestaOfferta=dbo_DistintaMateriali_UT.COMM) AND (dbo_DistintaMateriali_UT.ParticolareDWG = dbo_Codici_PDM.DED_COD) AND [dbo_Ordine a fornitore].ID_Fornitura = " & strFiltro
 
MsgBox strSQL
CurrentProject.Connection.Execute strSQL, NRec
MsgBox "Numero record inseriti: " & NRec
Me.[Sottomaschera Dettagli ordini a fornitori].Form.Requery
 
 
End Sub
 
Grazie per l'aiuto


se strFiltro1 l'hai dichiaratao string quindi devono esserci gli apici
 
 
WHERE dbo_Fornitori.IDFornitore = '" & strFiltro1 & "' AND(
 
idem dove usi strFiltro
 
BFS

Il 27/10/2021 19:11, Sabrina Levanti ha scritto:

e forse anche questo ti crea probelmi
 
dbo_DistintaMateriali_UT.RdO=FALSE
 
prova con
 
dbo_DistintaMateriali_UT.RdO=0
 
 
BFS
 
 
 
 


 Intanto grazie per la risposta, sono riuscita solo ora a provare ma non sembra essersi risolto!
Il codice l'ho modificato così:
strSQL = "INSERT INTO [dbo_Dettagli ordini a fornitori] ( Peso_Ritiro, ID_Fornitura, Posizione, Descrizione, Quantità, Qta, Comm, Codice, COD_rada, UN, Prezzo, Prezzo1, [Tipo di prezzo], SCONTO, Sconto1, FORNITORE_PREFERENZIALE, [Prezzo di riferimento], Lavorazione )" & _
"SELECT dbo_Codici_PDM.PESO*dbo_DistintaMateriali_UT.Quantità AS Peso_Ritiro, [dbo_Ordine a fornitore].ID_Fornitura, dbo_DistintaMateriali_UT.Posizione, dbo_DistintaMateriali_UT.Descrizione+' - '+dbo_DistintaMateriali_UT.Dimensioni+' - '+dbo_DistintaMateriali_UT.Materiale AS Des, dbo_DistintaMateriali_UT.Quantità, dbo_DistintaMateriali_UT.Quantità, dbo_DistintaMateriali_UT.COMM, dbo_Codici_PDM.CODICE_COSTRUTTORE, dbo_DistintaMateriali_UT.ParticolareDWG, dbo_DistintaMateriali_UT.UN, dbo_Codici_PDM.PREZZO_LISTINO, dbo_Codici_PDM.PREZZO_LISTINO, dbo_Codici_PDM.[Tipo di prezzo], dbo_Codici_PDM.SCONTO, dbo_Codici_PDM.SCONTO, dbo_Codici_PDM.FORNITORE_PREFERENZIALE, dbo_Codici_PDM.PREZZO_LISTINO, dbo_DistintaMateriali_UT.Finitura " & _
"FROM dbo_DistintaMateriali_UT, [dbo_Ordine a fornitore], dbo_Fornitori, dbo_Codici_PDM " & _
"WHERE dbo_Fornitori.IDFornitore ='" & strFiltro1 & "' AND(dbo_DistintaMateriali_UT.Ordinata = 1) AND (dbo_DistintaMateriali_UT.Ordinata_PRIMA=0) AND (dbo_DistintaMateriali_UT.RdO=0) AND (dbo_DistintaMateriali_UT.Fornitore=dbo_Fornitori.NomeFornitore) AND([dbo_Ordine a fornitore].ID_RichiestaOfferta=dbo_DistintaMateriali_UT.COMM) AND (dbo_DistintaMateriali_UT.ParticolareDWG = dbo_Codici_PDM.DED_COD) AND [dbo_Ordine a fornitore].ID_Fornitura = '" & strFiltro & "' "
L'errore è sempre lo stesso:
Errore di run-tima'-
2147467259
 (80004005)':
Tipo non corrispondente nell'espressione.


fatti un debug.print di strsql
copia il testo
e prova ad incollarlo direttamente in management studio di sql server 
cosi vedi cosa ti sottolinea come sintatticamente errato
 
BFS
 
 
 
 
 
 


Grazie di nuovo per la risposta.
Ho provato e in  management studio non ho riscontrato problemi
qui riporto la query testata, non capisco sembra che quando vado a modificare i nomi tabella con i nomi dati via ODBC qualcosa si blocca (es. dbo.Codici_PDM con dbo_Codici_PDM)
ho provato anche inserendo manualmente  strFiltro1=125 e  strFiltro=3187 ma niente!
 
INSERT INTO dbo.[Dettagli ordini a fornitori] ( Peso_Ritiro, ID_Fornitura, Posizione, Descrizione, Quantità, Qta, Comm, Codice, COD_rada, UN, Prezzo, Prezzo1, [Tipo di prezzo], SCONTO, Sconto1, FORNITORE_PREFERENZIALE, [Prezzo di riferimento], Lavorazione )
SELECT dbo.Codici_PDM.PESO * dbo.DistintaMateriali_UT.Quantità AS Peso_Ritiro, dbo.[Ordine a fornitore].ID_Fornitura, dbo.DistintaMateriali_UT.Posizione, dbo.DistintaMateriali_UT.Descrizione+' - '+dbo.DistintaMateriali_UT.Dimensioni+' - '+dbo.DistintaMateriali_UT.Materiale AS Des, dbo.DistintaMateriali_UT.Quantità, dbo.DistintaMateriali_UT.Quantità, dbo.DistintaMateriali_UT.COMM, dbo.Codici_PDM.CODICE_COSTRUTTORE, dbo.DistintaMateriali_UT.ParticolareDWG, dbo.DistintaMateriali_UT.UN, dbo.Codici_PDM.PREZZO_LISTINO, dbo.Codici_PDM.PREZZO_LISTINO, dbo.Codici_PDM.[Tipo di prezzo], dbo.Codici_PDM.SCONTO, dbo.Codici_PDM.SCONTO, dbo.Codici_PDM.FORNITORE_PREFERENZIALE, dbo.Codici_PDM.PREZZO_LISTINO, dbo.DistintaMateriali_UT.Finitura
FROM dbo.DistintaMateriali_UT, dbo.[Ordine a fornitore], dbo.Fornitori, dbo.Codici_PDM
WHERE dbo.Fornitori.IDFornitore =125 AND(dbo.DistintaMateriali_UT.Ordinata = 1) AND (dbo.DistintaMateriali_UT.Ordinata_PRIMA=0) AND (dbo.DistintaMateriali_UT.RdO=0) AND (dbo.DistintaMateriali_UT.Fornitore=dbo.Fornitori.NomeFornitore) AND(dbo.[Ordine a fornitore].ID_RichiestaOfferta = dbo.DistintaMateriali_UT.COMM) AND (dbo.DistintaMateriali_UT.ParticolareDWG = dbo.Codici_PDM.DED_COD ) AND dbo.[Ordine a fornitore].ID_Fornitura = 3187
 
 


Buon pomeriggio a tutti,
chiedo cortesemente aiuto non ho più idee.
Ho testato la query su management studio e tutto funziona!
Su progetto adp e access 2010 tutto ok
Portato su Access2019 collegato via ODBC a sql server continua a darmi:
Errore di run-tima'-
2147467259
 (80004005)':
Tipo non corrispondente nell'espressione.
Ho provato a semplificare la query fino al punto di inserire solo un campo e funziona, ma così divento matta non c'è modo di capire cosa gli da fastidio in un debug che magari non conosco?
Il problema è che nel db che sto provando ad aggiornare ci sono centinaia di query come quella postata, se devo ricostruirle tutte ci metto due anni! Quindi sto cercando di capire cosa può causare il problema?
Magari una dichiarazione di dati sulle tabelle sql non compatibile con access?


visto che si tratta di un insert con una manciata di parametri perchè 
non realizzi direttamente una stored procedure dentro sql che ti faccia 
l'insert?
 
oltre a essere più performante è pure più chiara da leggere
 
se proprio non puoi usare TSQL allora per fare una sorta di debug parti 
ad eseguire prima solo la select senza where e vedi se da errori
 
poi se la select funziona inizia ad aggiungere una condizione alla volta 
la where
 
e alla fine l'insert
 
BFS
 
 
 
 


Grazie per l'aiuto,
come posso fare a creare una stored procedure dentro sql passandogli però due campi di una maschera?
Mi spiego meglio:
Io ho una maschera in cui l'utente compila due campi e poi preme un pulsante carica nel quale c'era il codice originalmente postato e tale codice andava a recuperare dei dati da varie tabelle per caricarle un una sottomaschera  del form da cui stanno lavorando.

Fai vedere il predicato sql che funziona con un solo campo.

Questo funziona, ma ho inserito fisso Comm e ID_Fornitura e ho tolto praticamente tutti i campi :-(
Dim strSQL As String
Dim NRec As Long
Dim strFiltro, strFiltro1
strFiltro = Me!ID_Fornitura
strFiltro1 = Me!IDFornitore
'MsgBox strFiltro1
'MsgBox strFiltro
 
strSQL = "INSERT INTO [dbo_Dettagli ordini a fornitori] (posizione,ID_Fornitura)" & _
" SELECT dbo_DistintaMateriali_UT.Posizione,[dbo_Ordine a fornitore].ID_Fornitura" & _
" FROM dbo_DistintaMateriali_UT,[dbo_Ordine a fornitore]" & _
" WHERE dbo_DistintaMateriali_UT.COMM= '63082' AND [dbo_Ordine a fornitore].ID_Fornitura = 3187"


Intanto prova ad esegure il seguente predicato:
 
strSQL = "INSERT INTO [dbo_Dettagli ordini a fornitori] ( Peso_Ritiro, ID_Fornitura, Posizione, Descrizione, Quantità, Qta, Comm, Codice, COD_rada, UN, Prezzo, Prezzo1, [Tipo di prezzo], SCONTO, Sconto1, FORNITORE_PREFERENZIALE, [Prezzo di riferimento], Lavorazione )" & _
"SELECT dbo_Codici_PDM.PESO*dbo_DistintaMateriali_UT.Quantità AS Peso_Ritiro, [dbo_Ordine a fornitore].ID_Fornitura, dbo_DistintaMateriali_UT.Posizione, dbo_DistintaMateriali_UT.Descrizione+' - '+dbo_DistintaMateriali_UT.Dimensioni+' - '+dbo_DistintaMateriali_UT.Materiale AS Des, dbo_DistintaMateriali_UT.Quantità, dbo_DistintaMateriali_UT.Quantità, dbo_DistintaMateriali_UT.COMM, dbo_Codici_PDM.CODICE_COSTRUTTORE, dbo_DistintaMateriali_UT.ParticolareDWG, dbo_DistintaMateriali_UT.UN, dbo_Codici_PDM.PREZZO_LISTINO, dbo_Codici_PDM.PREZZO_LISTINO, dbo_Codici_PDM.[Tipo di prezzo], dbo_Codici_PDM.SCONTO, dbo_Codici_PDM.SCONTO, dbo_Codici_PDM.FORNITORE_PREFERENZIALE, dbo_Codici_PDM.PREZZO_LISTINO, dbo_DistintaMateriali_UT.Finitura " & _
"FROM dbo_DistintaMateriali_UT, [dbo_Ordine a fornitore], dbo_Fornitori, dbo_Codici_PDM " & _
"WHERE dbo_DistintaMateriali_UT.COMM= '63082' AND [dbo_Ordine a fornitore].ID_Fornitura = 3187"
 
per vedere se funziona perchè l'errore dovrebbe consistere che uno dei tipi di dato inseriti nella ricerca non corrisponde a quello del relativo campo.
Se non funziona dovresti pubblicare ciò che mostra la finestra di messaggio
 
MsgBox strSQL
 
relativa al predicato sql pubblicato nel primo post.


se lavoravi con gli adp do per scontato che le SP in TSQL le usavi gia
ti spiego come richiamarle da access e passare dei parametri
 
supponiamo che tu hai in sql server una stored procedure che cancella 
dall'anagrafica un cliente con id passato come parametro
sp che crei con
 
 
CREATE PROCEDURE CancellaAnagrafica
	@IDelininare  int
AS
 
 
	delete from anagrafica where idcliente=@IDelininare
 
GO
 
 
supponiamo ora che nella tuo form access hai una casella di testo 
"mioID" dove inserirci l'id da cancellare e un pulsante per avviare la 
cancellazione
 
 
sul evento click del pulsante scrivi
 
Dim cnn As New ADODB.Connection
'qui metti la tua connection string
cnn.Open 
"Provider=MSOLEDBSQL;Server=myServerAddress;Database=myDataBase;UID=myUsername;PWD=myPassword;
"
 
'cancellazione
cnn.Execute "exec cancellaAnagrafica " & me.mioID
cnn.Close
 
 
 
se i parametri sono piu di uno devi separarli con la virgola
se i parametri sono non numerici devi metterli tra apici
 
es, questa sp cancella un nominativo in base al nome  e al cognome passati
 
 
 
CREATE PROCEDURE CancellaAnagraficaNome
	@nome nvarchar(50),
	@cognome nvarchar(50)
AS
 
 
	delete from anagrafica where nome=@IDelininare and cognome=@cognome
 
GO
 
 
da access la richiami con
 
cnn.Execute "exec cancellaAnagrafica '" & me.txtNome & "','" & 
me.txtCognome & "'"
 
 
BFS
 


Grazie per l'aiuto
Ho creato la stored procedure e l'ho testata da Management Studio e funziona perfettamente!
Quando la richiamo da Access però ho degli errori:
Errore di run-time '3706':
Impossibile trovare il provider. E' possibile che non sia installato correttamente.
 
Questo è il codice sul pulsante:
Dim strFiltro, strFiltro1 As String
strFiltro = Me!ID_Fornitura
strFiltro1 = Me!IDFornitore
Dim cnn As New ADODB.Connection
cnn = "Provider=MSOLEDBSQL;Server=SERVERDB;Database=2021SQL;UID=sa;PWD=Prova;"
 
 cnn.Open
 
cnn.Execute "exec CaricaCOD_RADA '" & Me!IDFornitore & "','" & Me!ID_Fornitura & "'"
cnn.Close



Ho risolto, reinstallando il DRIVER OLEDB! 
Grazie a tutti per l'aiuto


bene
dovresti notare anche un netto miglioramento delle prestazioni sui 
client lavorando con le sp di sql
 
 
ciao
BFS