No puedo moverme por un RecordSet
Posted: Tue Sep 19, 2023 7:35 pm
Muy buenas a todos
Hacía mucho tiempo que no escribía por aqui, dejé de programar hace tiempo. Buenos pues me han hecho volver a coger la tecla y darle al código.
En este caso tomé un programa y lo he modificado para un amigo. todo funciona bien a excepción de un registro de la base de datos de albaranes que tengo en ese programa (está en access) y uso ADO para manejar los datos.
El caso es que para probar hice 3 albaranes, el 1º con 49 lineas, el 2º con 9 lineas y el 3º con 10 lineas. Con el 2º y el 3º no hay problemas en las modificaciones (que es donde tengo el problema) pero con el primero si tengo problemas
al modificarlo (ya sea cambiando datos o sin cambiarlos) en cuanto pasa el primer registro, ya no puedo hacer Move, MoveFirst, ni Update, ni UpdateBatch ni nada, el recordset esta abierto y los datos los grabo en un dbf para comprobar
que no haya discordancia con la tabla de access, en cuanto a tipos de datos y longitudes. Pero como os digo en cuanto paso del 1º registro ya todos son errores ADODB.RecordSet/6 DISP_E_UNKNOWNNAME: MOVEFIRST o MOVE o UPDATE
o UPDATEBATCH . He comprobado el recordset antes de dar el error, esta bien y permite todas estas propiedades. Aqui os dejo el codigo, por si me podeis iluminar, y de paso me haríais un favor enorme, porque ya estoy que me subo por las paredes.
Muchas gracias por anticipado
Hacía mucho tiempo que no escribía por aqui, dejé de programar hace tiempo. Buenos pues me han hecho volver a coger la tecla y darle al código.
En este caso tomé un programa y lo he modificado para un amigo. todo funciona bien a excepción de un registro de la base de datos de albaranes que tengo en ese programa (está en access) y uso ADO para manejar los datos.
El caso es que para probar hice 3 albaranes, el 1º con 49 lineas, el 2º con 9 lineas y el 3º con 10 lineas. Con el 2º y el 3º no hay problemas en las modificaciones (que es donde tengo el problema) pero con el primero si tengo problemas
al modificarlo (ya sea cambiando datos o sin cambiarlos) en cuanto pasa el primer registro, ya no puedo hacer Move, MoveFirst, ni Update, ni UpdateBatch ni nada, el recordset esta abierto y los datos los grabo en un dbf para comprobar
que no haya discordancia con la tabla de access, en cuanto a tipos de datos y longitudes. Pero como os digo en cuanto paso del 1º registro ya todos son errores ADODB.RecordSet/6 DISP_E_UNKNOWNNAME: MOVEFIRST o MOVE o UPDATE
o UPDATEBATCH . He comprobado el recordset antes de dar el error, esta bien y permite todas estas propiedades. Aqui os dejo el codigo, por si me podeis iluminar, y de paso me haríais un favor enorme, porque ya estoy que me subo por las paredes.
Muchas gracias por anticipado
Code: Select all | Expand
cSource1 := "SELECT * FROM LINALB"
oRsLin := FW_OpenRecordSet(oConex,cSource1,3)
oRsLin:MoveFirst() <-------------------------------------Aqui no hay problemas
oRsLin:Filter := "[NUMERO] = '"+cNumAlba+"'" <-------------------Aqui tampoco
oRsLin:MoveLAst() <--------------------------------------------------Aqui tampoco
aDatos[09] := aDatos[11] := aDatos[12] := 0
For nIni := 1 TO Len(aLinVenAlb)
aLinAlb[1] := aLinVenAlb[nIni,12]
Do Case
Case !aLinVenAlb[nIni,14] .and. aLinVenAlb[nIni,13] <> 0 //Un registro que ya existía puede haber sido modificado
oRsLin:MoveFirst() [color=#FF0000]<---------------------------------Aqui despues al pasar la 2º vez da error[/color]
oRsLin:Move(aLinVenAlb[nIni,13]-1,1) [color=#FF0000] <------------------ y aqui da error si comento la linea anterior[/color]
lSuma := .T.
Case aLinVenAlb[nIni,14] = .T. .and. aLinVenAlb[nIni,13] <> 0 //Registro borrado
oRsLin:Move(aLinVenAlb[nIni,13]-1,1)
oRsLin:Delete()
oRsLin:Update()
lSuma := .F.
Case aLinVenAlb[nIni,14] = .T. .and. aLinVenAlb[nIni,13] == 0 //Un registro que hemos añadido y hemos borrado
lSuma := .F.
Case !aLinVenAlb[nIni,14] .and. aLinVenAlb[nIni,13]== 0 //Un registro nuevo que hemos añadido
If !Empty(aLinVenAlb[nIni,2])
oRsLin:AddNew()
lSuma := .T.
aLinAlb[1] := cNumAlba
Else
lSuma := .F.
EndIf
Case !aLinVenAlb[nIni,14] .and. aLinVenAlb[nIni,13]== 0 ; //un registro vacío
.and. Empty(aLinVenAlb[nIni,2])
lSuma := .F.
EndCase
If lSuma
aLinAlb[ 2] := aLinVenAlb[nIni, 1]
aLinAlb[ 3] := aLinVenAlb[nIni, 2]
aLinAlb[ 4] := aLinVenAlb[nIni, 3]
aLinAlb[ 5] := aLinVenAlb[nIni, 4]
aLinAlb[ 6] := aLinVenAlb[nIni, 5]
aLinAlb[ 7] := aLinVenAlb[nIni, 6]
aLinAlb[ 8] := aLinVenAlb[nIni, 7]
aLinAlb[ 9] := aLinVenAlb[nIni, 8]
aLinAlb[10] := aLinVenAlb[nIni, 9]
aLinAlb[11] := aDatos[2]
aLinAlb[12] := aDatos[3]
Grabadbf(aLinAlb)
For nLin := 1 TO 12
oRsLin:Fields(nLin-1):Value := aLinAlb[nLin]
EndFor
* oRsLin:Update() [color=#FF0000]y aqui si descomento esta linea que es para hacer el update linea a linea[/color]
BAJARTICULOMALB(aLinAlb)
Do Case
Case aLinVenAlb[nIni,6] = aIva[1,2] //.or. aIva[4,2] //Iva General, Vigente o Anterior
aDatos[09] += aLinVenAlb[nIni,7] //Bruto
aDatos[11] += aLinVenAlb[nIni,8] //Cuota de Iva
aDatos[12] += aLinVenAlb[nIni,9] // Total
Case aLinVenAlb[nIni,6] = aIva[2,2] //.or. aIva[5,2] //Iva Reducido, Vigente o Anterior
aDatos[09] += aLinVenAlb[nIni,7] //Bruto
aDatos[11] += aLinVenAlb[nIni,8] //Cuota de Iva
aDatos[12] += aLinVenAlb[nIni,9] // Total
Case aLinVenAlb[nIni,6] = aIva[3,2] //.or. aIva[6,2] //Iva Super Reducido, Vigente o Anterior
aDatos[09] += aLinVenAlb[nIni,7] //Bruto
aDatos[11] += aLinVenAlb[nIni,8] //Cuota de Iva
aDatos[12] += aLinVenAlb[nIni,9] // Total
Case aLinVenAlb[nIni,6] = aIva[4,2] //.or. aIva[6,2] //Iva exento
aDatos[09] += aLinVenAlb[nIni,7] //Bruto
aDatos[11] += aLinVenAlb[nIni,8] //Cuota de Iva
aDatos[12] += aLinVenAlb[nIni,9] // Total
EndCase
EndIf
EndFor
oRsLin:UpdateBatch() [color=#FF0000]<------------------y aqui si he dejado comentada la linea del update anterior para que me haga un unpdatebatch [/color]
aDatos[10] := nTipoIva
For n := 1 TO Len(aDatos)
oRsAlbar:Fields(n-1):Value := aDatos[n]
EndFor
oRsAlbar:Update()
oRsAlbar:Filter := ""
oRsLin:Close()
SysRefresh()
Return(lSigue)