No puedo moverme por un RecordSet

No puedo moverme por un RecordSet

Postby Pedro » 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


Code: Select all  Expand view
   
      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)
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: No puedo moverme por un RecordSet

Postby Pedro » Thu Sep 28, 2023 6:36 pm

Muy buenas a todos
Veo que me quedo como hace 8 años (2015) a dos velas. En fin, será que no os ha dado este problema, a mi si y he averiguado que son los datos que se van a grabar, pero no puedo dar con el error ya que no se como capturar el error de fivewin que sale a continuación y que se graba en el fichero error.log. Es de suponer que de alguna manera se podrá capturar el registro que produce el error y averiguar que dato viene mal. He puesto msginfo() para averiguar el tipo de dato que viene, su longitud y su contenido y para mi todo viene bien, pero no debe ser asi cuando salta el error "Error ADODB.RecordSet/3 DISP_E_MEMBERNOTFOUND: UPDATE
Args: "
Algún compañero puede indicarme como capturar ese error y desvelar que datos vienen mal al ser pasados al recordset ?

Muchas gracias de antemano
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Re: No puedo moverme por un RecordSet

Postby carlos vargas » Sat Sep 30, 2023 1:26 am

Sí mal no recuerdo, al abrir un Recordset, existen 3 o 4 formas, una de ellas es que el cursor se abre con lectura de registros hacia adelante, esto es rapidísimo, y es para aquellos procesos los cuales leemos.los datos por ejemplo para llenar un combobox o similar, por lo cual los movimientos atrás, buscar no están permitidos, para esos estra otro typos de cursor, además cada engine debe soportar esos modos, por ejemplo ado acceso puede que no lo tenga, pero ado MySQL si, otro punto en donde se abre el cursor en server o cliente, lo mismo cada engine debe soportarlo. Busca un poco de info respecto a esto.
Recuerdo que en FoxPro hay bastantes ejemplos de esto.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: No puedo moverme por un RecordSet

Postby leandro » Sun Oct 01, 2023 10:52 pm

Pedro buenas tardes como estas?

Deberías colocar un xbrowse justo después de crear el recorset, a ver si visualmente puedes identificar el error.

Code: Select all  Expand view

      cSource1 := "SELECT * FROM LINALB"      
      oRsLin := FW_OpenRecordSet(oConex,cSource1,3)
      xbrowse(oRsLin)
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: No puedo moverme por un RecordSet

Postby Pedro » Mon Oct 02, 2023 2:10 pm

Hola Carlos
el recordset se abre en modo adUseClient (modo 3) como puedes ver en el modulo, y adLockOptimistic, el problema surge cuando despues de recorrer y grabar el primer registro del recordset, ya no se puede mover hacia ningun lado, da errores de movefirst, recordcout, update etc, es como si el recordset se hubiera cerrado, pero no es asi, está abierto.

Amigo Leandro, esa fue una de las primeras cosas que hice para ver si el recordset estaba abierto y no daba errores, es decir el recordset estaba correcto, como le dije a Carlos Vargas es despues del primer registro cuando sucede todo eso.
Para mi es algún dato de la tabla, lease algún campo, que está mal grabado y no se aprecia en la vista, si siquiera entrando con access se ve, y es lo que causa el error, pues he borrado el registro que da dicho error y en el resto de registros no pasa absolutamente nada.
Un saludo
Pedro
gahetesoft@gmail.com
FWH12.06 BCC582, Xverce CW, Pelles C 6.00.4,PSPAD 4.54
y ahora con ADO
User avatar
Pedro
 
Posts: 464
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 94 guests