Nicoletta
Prova con
CONVERT(DATETIME, '2003-12-31 00:00:00', 102)
nell'esecuzione.
Invece se copio e incollo in management studio funziona perfettamente
(d'altra parte funzionava anche prima)
Nicky
Ma perché è diverso? sono disperata!!!
le query PT non sono come eseguire il comando nell'SQL nativo del dn in uso?
azz. qui ho sbagliato io
>
> Ma perché è diverso? sono disperata!!!
> le query PT non sono come eseguire il comando nell'SQL nativo del dn in
> uso?
questa invece credevo fosse così ma ho tanti dubbi.
ho provato a scrivere la data come stringa banalmente e la inserisce.
col CONVERT non c'è verso ed il mio problema è che domani in produzione
avrò probabilmente un sql in inglese e la mia data in stringa va a farsi
benedire!!!
Ciao Nicoletta,
il miglior modo per passare la data a Sql server � quello che utilizzi
ovvero il formato 'yyyymmdd' che il manuale definisce ISO.
L'unica cosa che mi viene in mente � che la query PT lavora su un database
diverso da quello che vai a interrogare con Management studio.
Prova a controllare la propriet� di connessione della query PT.
Ciao
Giorgio Rancati.
>> Ma perch� � diverso? sono disperata!!!
>> le query PT non sono come eseguire il comando nell'SQL nativo del dn in
>> uso?
>
> questa invece credevo fosse cos� ma ho tanti dubbi.
S�, le query PT sono interpretate direttamente dal database server, come
detto sopra, controlla la connessione della query PT, forse � collegata su
un altro database.
> ho provato a scrivere la data come stringa banalmente e la inserisce.
> col CONVERT non c'� verso ed il mio problema � che domani in produzione
> avr� probabilmente un sql in inglese e la mia data in stringa va a farsi
> benedire!!!
esatto, non allontanarti dalla retta via!!
:-)
Giorgio Rancati
aspetta, questo passo mi � sfuggito...
Forse � meglio che posti il codice con cui prepari ed esegui la query PT.
Ciao
Giorgio Rancati
.
Set wrk = DBEngine.Workspaces(0)
Set dbswrk = OpenDatabase("", False, False, Connect_String)
.
wrk.BeginTrans
.
'elimino vecchia estrazione
dbswrk.Execute StringaSql, dbSeeChanges
.
.
.
'leggo dati da altre tabelle
qdf.SQL = StringaSql
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
.
do while not rst.EOF
'scrivo nuova estrazione
dbswrk.Execute StringaInsert
rst.movenext
loop
'conferma transazione
wrk.CommitTrans
rst.Close
qdf.Close
Set rst = Nothing
Set qdf = Nothing
Set dbs = Nothing
Export_Click_Wrk_Exit:
DoCmd.Hourglass False
On Error Resume Next
dbswrk.Close
Set dbswrk = Nothing
wrk.Close
Set wrk = Nothing
Export_Click_Exit:
On Error Resume Next
DoCmd.Hourglass False
rst.Close
Set qdf = Nothing
La stringa di inserimento l'ho provate in questi tre modi
StringaInsert = StringaInsert & "'" & Format(Now(), "yyyymmdd")
e mi inserisce NULL nel campo DATETIME di sql server
StringaInsert = StringaInsert & "',CONVERT(DATETIME,'" & Format(Now(),
"yyyymmdd") & "', 112)
e mi restituisce errore 3085 Funzione 'CONVERT' non definita
nell'espressione
StringaInsert = StringaInsert & "'2009-10-27'"
e mi scrive correttamente il campo DATETIME che riporta
2009-10-27 00:00:00.000
Prima di eseguire la scrittura mi copio la stringa costruita per
l'insert e ti accodo al post il secondo esempio (quello che dovrei
utilizzare)
INSERT INTO GWENXRIPPAG
(IDESTRAZIONE,CODAZI,MATR,COGNOME,NOME,CODAGGR1,DESCAGGR1,CODAGGR2,DESCAGGR2,CODAGGR3,DESCAGGR3,CODAGGR4,DESCAGGR4,CODAGGR5,DESCAGGR5,CODAGGR6,DESCAGGR6,CODAGGR7,DESCAGGR7,CODAGGR8,DESCAGGR8,CODPAGA01,VALPAGA01,CODPAGA02,VALPAGA02,CODPAGA03,VALPAGA03,CODPAGA04,VALPAGA04,CODPAGA05,VALPAGA05,CODPAGA06,VALPAGA06,CODPAGA07,VALPAGA07,CODPAGA08,VALPAGA08,CODPAGA09,VALPAGA09,CODPAGA10,VALPAGA10,CODPAGA11,VALPAGA11,CODPAGA12,VALPAGA12,CODPAGA13,VALPAGA13,CODPAGA14,VALPAGA14,CODPAGA15,VALPAGA15,CODPAGA16,VALPAGA16,CODPAGA17,VALPAGA17,CODPAGA18,VALPAGA18,CODPAGA19,VALPAGA19,CODPAGA20,VALPAGA20,DATACONSOLIDAMENTO,DATAESTRAZIONE,DATADIAPCONSOLIDAMENTO,DATADIAPESTRAZIONE,TIPOESTRAZIONE)
VALUES (1,'001','0000000001','AZZURRI DE ANDREI','ADRIANO LUIGI
FRANCO','3','Descrizione
modificata','Q','ssss',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'MIOZ1',
.6666,'MIOZ2', .3333,'P801', 22,'P802', 26,'P803',
31,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'20090930',CONVERT(DATETIME,'20091008',
102),1056497760,1056509280 ,'M');
INSERT INTO MIATAB (a,b,c,d,e,f,DATAESTRAZIONE) VALUES
(1,2,3,4,5,6,'20090927') ?
devo cioᅵ arrivare a costruire la stringa in quel modo?
perchᅵ in realtᅵ l'ho giᅵ fatto, ma quello che ottengo da access ᅵ NULL
nel campo data mentre da mngmn studio inserisco correttamenjte la data.
E' questo comportamento diverso tra la query PT e quella 'interattiva'
che mi lascia perplessa!
Nicoletta
quando eseguo la query non uso l'opzione dbSQLPassThrough.
In realtᅵ credevo erroneamente che avendo definito la stringa di
connessione all'atto della definizione dell'oggetto database della
workspace, automaticamente tutto ciᅵ che riguardava quell'oggetto fosse
passthrough
grazie per il prezioso aiuto datomi
Nicky
prego, se vuoi un consiglio abbandona il metodo che stai usando, in
Access2007 ODBCdirect � stato rimosso e se in futuro passerai alla nuova
versione otterrai un errore di runtime.
Ciao
Giorgio Rancati
quello delle transazioni?
dammi per cortesia un'indicazione di come fare e la seguirᅵ.
Ho letto il documento Risorse Access + ODBC di Alex e ho seguito quello
perchᅵ dovevo fare una insert massiva su un db sql server e validarla
solo al termine del ciclo
Nicky
Finchᅵ scrivevo un record soltanto tutto andava correttamente (le prove
le facevo cosᅵ)
Quando i record sono stati 2 da scrivere, alla seconda insert mi ritorna
3146 ODBC: chiamata non riuscita
L'indice ᅵ univoco ma i campi in chiave contengono valori diversi per i
due record.
Nicky
Ciao Nicoletta,
"chiamata non riuscita" � un errore generico, per capire cosa � successo
devi vedere il messaggio di errore che restituisce il server.
Qui il modo per recuperarlo
----
ACC2000: How to Trap Specific ODBC Error Messages
http://support.microsoft.com/kb/209855/en-us
----
Ciao
Giorgio Rancati
ODBC Error
0
[Microsoft][SQL Server Native Client 10.0]Timeout query scaduto
ODBC Error
3146
ODBC: chiamata non riuscita.
In pratica dopo aver fatto la prima insert che vedo eseguita dal debug,
alla seconda esecuzione si ferma fino al temine del timeout e poi esce
l'errore. Ovviamente mi fa il rollback e non vedo nessuna riga scritta.
Ho risposto anche al tuo post di A2007. Fammi sapere come mi dovrᅵ
muovere per il futuro
Nicky
> quale metodo?
no, non farci caso, a prima vista avevo scambiato la Opendatabase con la
Openconnection.
Ciao
Giorgio Rancati
Togliti tutti i problemi di conversione che tra a americano ed italiano sono
sempre dolori
usa long
VALUES Clng(tuadata)
bisogna capire se � effettivamente un problema di timeout o se � un problema
di blocco record.
Se � effettivamente un problema di timeout lo risolvi eseguendo i comandi
non tramite Db.Execute ma tramite un oggetto querydef in cui andrai ad
impostare un ODBCTimeout pi� alto.
Se � un problema di blocco dei record devi scoprire chi blocca cosa e vedere
come risolvere.
Pu� essere d'aiuto la stored procedure sp_lock da eseguire con management
studio nel contesto del tuo database, per come interpretarla ti rimando al
manuale di sql server.
Ciao
Giorgio Rancati
Ma, stiamo parlando di Sql server e di query Pass-Through
In Sql server non esiste la funzione Clng()
:-)
Giorgio Rancati
ad esempio: quel recordset che apri
----
'leggo dati da altre tabelle
qdf.SQL = StringaSql
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
----
legge anche dalla tabella GWENXRIPPAG ?
Se s�, potrebbe bloccare le pagine della tabella fino a che tutti i dati non
sono stati recuperati.
visto che il recordset � di tipo SnapShot puoi risolvere con:
----
If rst.Eof = False Then
rst.Movelast
rst.Movefirst
End If
----
subito dopo l'apertura del recordset
poi inizi il ciclo
----
do while not rst.EOF
...
...
ecc ecc
----
Ciao
Giorgio Rancati
> Se sᅵ, potrebbe bloccare le pagine della tabella fino a che tutti i dati non
> sono stati recuperati.
>
> visto che il recordset ᅵ di tipo SnapShot puoi risolvere con:
> ----
> If rst.Eof = False Then
> rst.Movelast
> rst.Movefirst
> End If
> ----
???????
> subito dopo l'apertura del recordset
>
> poi inizi il ciclo
> ----
> do while not rst.EOF
> ...
> ...
> ecc ecc
> ----
>
> Ciao
> Giorgio Rancati
>
>
Sono basita!!!
Sembra funzionare il movelast e movefirst.
Riesci a spiegarmelo in due parole visto che non comprendo il
ragionamento che ci sta dietro?
che scemo che sono!!!
ciao Giorgio
>
>
Ciao nicoletta,
Quando apri un recordset, il driver odbc comincia a richiedere una parte di
dati poi sospende il flusso fino a quando non viene richiesto, la
sospensione del flusso blocca la pagina (dell'indice o della tabella) che
deve essere ancora letta.
Per verificarlo metti un punto di interruzione subito dopo l'apertura del
recordset, esegui il codice, quando il codice si ferma al punto di
interruzione apri Management studio, apri una nuova query sul tuo database e
scrivi:
----
Exec sp_who2
----
tra le tante righe ne troverai una con SPID >50 (Spid Id) avente la colonna
Status = SUSPENDED , nella colonna HostName troverai il nome del tuo
computer, nella colonna DbName il nome del database e nella colona Command
troverai SELECT.
Poi esegui
----
Exec sp_lock
----
nelle righe con SPID uguale a quello indicato da sp_who2 individua la/le
righe con la colonna Type = PAG , nella colonna resource vi troverai i
numeri di pagina bloccati. La colonna ObjId indica la tabella, puoi
conoscerne il nome eseguendo:
----
SELECT OBJECT_NAME(xxxxxxxx)
----
dove xxxxxxxx � il valore che vedi in ObjId
se il blocco � a livello di pagine dell'indice, nella colonna IndId trovi il
numero dell'indice, puoi conoscere il nome dell'indice eseguendo:
----
SELECT Name FROM sys.indexes
WHERE Object_Id=xxxxxxxx AND index_id = y
----
dove xxxxxxxx � il valore che vedi in ObjId e y � il valore che vedi in
IndId
Adesso torna in VBA ed esegui la riga con rst.Movelast, torna in management
studio e riesegui la Exec sp_who2, vedrai che i blocchi a livello di pagina
non ci sono pi� perch� il client ha recuperato tutti i records.
Spero di aver chiarito, quello che rimane da capire � il perch� di un blocco
sulla tabella GWENXRIPPAG quando la stessa non fa parte della select di rst,
con queste informazioni e indagando sui risultati di sp_lock dovresti capire
il perch�.
Ciao
Giorgio Rancati
CUT
> Ciao
> Giorgio Rancati
>
>
Grazie mille!
Ora faccio queste verifiche.
Intanto apro un altro post sulle query pt
Nicky