Newsgroup: it.comp.lang.visual-basic
Titolo: Errore UpdateBatch

Ciao a tutti ho un problema con Ado.UpdateBatch
In poche parole ho un file aperto in input con tanti campi separati da |
(pipe), da inserire in 2 tabelle (testa e righi).
Per la testa con il codice analogo a quello sotto funziona tutto, e se
provo dalla console ad inserire gli stessi dati nella tabella FRDOC non da
errore, mentre con il codice di cui sotto mi da errore.
Mi da errore sull'update batch, ma anche se al posto di quello metto Update
o AddNew è lo stesso.
C'è solo il campo chiave (numeric(10,0)) che è IDFRDOC, poi NDOC è sempre
numeric. Poi gli altri campi sono VARCHAR apparte quelli in cui uso DeciM
che sono Decimal(12,4).
In commento ho messo i valori per i quali mi da errore, ma lo fa anche se
metto più valori non a Null.
L'apertura del recset è la stessa dell'altra tabella in cui funziona,
quindi non dovrebbe esser quello.
Grazie a tutti
Il codice è questo:
RsC.Open "FRDOC", ADOCn, adOpenStatic, adLockOptimistic, adCmdTable
i = 1
RsC.AddNew
Do
  Line Input #ff, a$
  VetT = Split(a$, Sep)
  If VetT(0) <> "B" Then Exit Do
  RsC("NDOC") = 1'1
  RsC("IDFRDOC") = i&'1
  RsC("NARTICOL") = CharM(VetT(1))'Null
  RsC("DESC") = CharM(VetT(2))'Rif.Ns.Ord. 74/A del 03.07.2002
  RsC("UMISURA") = CharM(VetT(3))'Null
  RsC("QTA") = DeciM(VetT(4))'Null
  RsC("PREZZO") = DeciM(VetT(5))'Null
  RsC("SCONTO") = DeciM(VetT(6))'Null
  RsC("IMPORTOSCONTO") = DeciM(VetT(7))'Null
  RsC("PERCIVA") = CharM(VetT(8))'Null
  i = i + 1
  RsC.UpdateBatch
Loop Until VetT(0) = "B"
L'SQL della tabella (parte) è questo:
"IDFRDOC"	 NUMERIC(10,0) NOT NULL,
CONSTRAINT "PK_FRDOC_1" PRIMARY KEY ("IDFRDOC")
Ed il trigger per IDFRDOC, che comunque sta anche nell'altra tabella in cui
funziona
SET TERM ^ ;
/* Triggers only will work for SQL triggers */
CREATE TRIGGER "INC_IDFRDOC" FOR "FRDOC" 
ACTIVE BEFORE INSERT POSITION 0
as
begin
If ( FRDOC.IDFRDOC is Null) THEN
  new.IDFRDOC = gen_id(IDFRDOC_GEN,1);
end
 ^
COMMIT WORK ^
SET TERM ;^

 Mi da errore
E' stranissimo sia il codice che la descrizione di quell'errore...
Alberto
-- 
Si è visto di meglio,
ma si è scopato di peggio,
qualche volta a pago
e non erano neanche sempre donne
[Paolo]

 E' stranissimo sia il codice che la descrizione di quell'errore...
Sorry
Errore: 80040e21 'Metodo UpdateBatch dell'oggetto '_recordset' non riuscito
Con RsT funziona, mentre sotto con RsC mi da quell'errore.
Grazie :)
Ed ecco il listato completo:
Sub Main()
Dim pathStampa
Dim ff As Integer
Dim VetInfo() As String '(0)=tipo stampa (1)=ncopie
Dim VetT() As String
Dim Sep As String * 1
Dim a$
Dim i As Long
Dim RsT As ADODB.Recordset       'recordset testa
Dim RsC As ADODB.Recordset    'recordset coda
Set RsT = New ADODB.Recordset
Set RsC = New ADODB.Recordset
Call Inizio 'qui apro la connessione
RsT.ActiveConnection = ADOCn
RsC.ActiveConnection = ADOCn
ADOCn.Execute "DELETE FROM FRDOC"
ADOCn.Execute "DELETE FROM FTDOC"
RsT.Open "FTDOC", ADOCn, adOpenStatic, adLockOptimistic, adCmdTable
RsC.Open "FRDOC", ADOCn, adOpenStatic, adLockOptimistic, adCmdTable
adCmdTable
frmMain.Show
pathStampa = PathStm & "\stampaDDT.txt"
If Dir(pathStampa) = "" Then
  MsgBox "Impossibile trovare il file stampa.txt" & vbnewlinle & "Il
programma verrà terminato", vbCritical, NOMEPRG
  End
End If
Sep = "|"
ff = FreeFile
Open pathStampa For Input As ff
'Testa
Line Input #ff, a$
a$ = Replace(a$, "'", "''")
VetT = Split(a$, Sep)
If VetT(0) <> "T" Then
  MsgBox "Impossibile trovare i dati relativi alla testa." & vbnewlinle &
"Il programma verrà terminato", vbCritical, NOMEPRG
  End
End If
RsT.AddNew
RsT("IDFTDOC") = 1
RsT("DENOMA") = CharM(VetT(7))
RsT("DENOMB") = CharM(VetT(8))
RsT("INDIRIZZO") = CharM(VetT(9))
RsT("CITTA") = CharM(VetT(10))
RsT("DESCDD") = CharM(VetT(11))
RsT("INDIRIZZODD") = CharM(VetT(12))
RsT("CAPCITTADD") = CharM(VetT(13))
RsT("TELEFONODD") = CharM(VetT(14))
RsT("NOTEDD") = CharM(VetT(15))
RsT("PROGFTDOC") = CharM(VetT(16))
RsT("DATADOC") = DateM(VetT(17))
RsT("CODCLIFOR") = CharM(VetT(18))
RsT("PIVAFISC") = CharM(VetT(19))
RsT("CAUSMOVIM") = CharM(VetT(21))
RsT("MEZZOTRASP") = CharM(VetT(22))
RsT("PORTO") = CharM(VetT(23))
RsT.UpdateBatch adAffectCurrent
i = 1
RsC.AddNew
Do
  Line Input #ff, a$
  a$ = Replace(a$, "'", "''")
  VetT = Split(a$, Sep)
  If VetT(0) <> "B" Then Exit Do
  RsC("NDOC") = 1
  RsC("IDFRDOC") = CStr(i&)
  RsC("NARTICOL") = CharM(VetT(1))
  RsC("DESC") = CharM(VetT(2))
  RsC("UMISURA") = CharM(VetT(3))
  RsC("QTA") = DeciM(VetT(4))
  RsC("PREZZO") = DeciM(VetT(5))
  RsC("SCONTO") = DeciM(VetT(6))
  RsC("IMPORTOSCONTO") = DeciM(VetT(7))
  RsC("PERCIVA") = CharM(VetT(8))
  i = i + 1
  RsC.UpdateBatch adAffectCurrent
Loop Until VetT(0) = "B"
Close ff
End Sub
Function CharM(ByRef dato$)
dato$ = Clean(dato$)
If dato$ <> "Null" Then 'tolgo ' iniziale  e finale
  dato$ = Mid(dato$, 2, Len(dato$) - 2)
  CharM = dato$
Else
  CharM = Null
End If
End Function
Function DeciM(ByRef dato$)
dato$ = VerificaNull(UsaPunto(dato$))
If dato$ <> "Null" Then 'tolgo ' iniziale  e finale
  dato$ = Mid(dato$, 2, Len(dato$) - 2)
  DeciM = dato$
Else
  DeciM = Null
End If
End Function

   RsC("DESC") = CharM(VetT(2))
Credo di aver trovato l'errore.
Il campo DESC è ovviamente una parola chiave :\, e quindi credo dipenda da
quello.
Con una sqlstr mi basta fare:
Update ... SET ... ",""DESC""= " & Clean(VetT(2))
Al posto di ",DESC= " & Clean(VetT(2))
Ma da Ado come posso fare? 
Usando con Rs(7) (con 7 l'indice del campo desc) non funge :\
(intanto cambio nome al campo...)

 Ma da Ado come posso fare? 
Il modo corretto di fare inserimenti e modifiche, con Ado, è quello di 
usare un Adodb.Command, e quindi il tuo problema (se è quello) sarebbe 
risolto alla radice, usando le parentesi quadrate attorno al nome del 
campo.
L'utilizzo delle modalità bound è, come noto, altamente rischioso, in 
quanto, non avendo il pieno controllo di ciò che avviene in background, 
si rischia di trovarsi in situazioni incomprensibili.
Devo dire, infatti, di non saperti aiutare, in quanto io ho utilizzato 
una sola volta in vita mia questa metodica, e me ne pentirò ancora a 
lungo (visto che il sw è rilasciato e accadono continuamente cose 
inspiegabili di questo tipo).
Ciao


 inspiegabili di questo tipo).
Anche io l'ho utilizzato un paio di volte, quando avevo la necessità di
controllare la validità di alcuni campi ed eventualmente settargli un
valore predefinito. Altrimenti con Adocn.execute non avrei avuto il
recordset aggiornato immediatamente come mi serviva, e avrei dovuto fare
due passate, una di controllo/settaggio e una seconda per stampare i
record.
Via di SQLString allora :) (oppure mi cambio il nome del campo, tanto è un
mini programmino che crea e distrugge sempre i dati)