Page 1 of 1

Propiedades y cursores de un Recordset

Posted: Mon Jun 29, 2015 5:45 pm
by Pedro
Hola a todos
Vengo con dos temas que me traen de cabeza.
El primero es el de los cursores de un recordset, y la pregunta es (aunque me tomeis por loco) ¿Por qué si abres un Recordset con un curso tipo 1 (Keyset) ó 2 Dynamic) , éste viene como 3 (Static) ?
La segunda es ¿Por qué si tienes un recordset cuya propiedad UPDATE y UPDATEBACH estan en .T. cuando haces un update a ese Recordset, te da un Error ADODB.RecordSet/3 DISP_E_MEMBERNOTFOUND: UPDATE ?

No sé por donde meterle mano a esto, el recordset se abre se pasan sus datos a una tabla Dbf, y no se hace nada con él hasta que los datos son devueltos al recordset, y cuando hago el update de un registro o el updatebach de todos los registros, me casca el modulo con el error antes dicho.
Deciros que mediante la funcion info(oRs) de Adolfo Lagos, verifico que la propiedad Update y UpdateBach esten a true antes de llamar a oRs:Update() o bien oRs:UpdateBach()

Alguien puede decirme algo de esto?

Re: Propiedades y cursores de un Recordset

Posted: Tue Jun 30, 2015 7:06 am
by AHF
Pedro,

google translator:

Si decide cursor aduseclient pienso que siempre viene con Static.
La propiedad Update deja de ser válida si hay un error con el campo o el valor de poner en ese campo.
Si el campo ya ha sido cambiado por otro usuario a continuación, update también deja de ser válida.

La propiedad Update es válida y se puede utilizar sin embargo, en la presente actualización debido a la anterior puede tornar-se inválida.

Por favor poner el código aquí.

cheques ADORDD.

Re: Propiedades y cursores de un Recordset

Posted: Tue Jun 30, 2015 9:25 am
by Pedro
Estimado Antonio

Los datos los he comprobados antes de ser pasado al RecordSet y todos coinciden con el tipo de campo, no obstante pongo aqui el código donde abro los recordset y paso los datos a una dbf y luego de la dbf al recordset. Observe que hay dos funciones INFO() e INFO2() La primera es para verificar las propiedades del Recordset y la segunda los datos de cada campo del recordset.

Codigo de apertura y traspaso de datos

Code: Select all

   cTempLin := cArea+"MODLIN.DBF"

   aadd(aEstruc,{"CODIGO"    ,"C", 14,0 } )
   aadd(aEstruc,{"CONCEPTO"  ,"C", 50,0 } )
   aadd(aEstruc,{"CANTIDAD"  ,"N",  7,2 } )
   aadd(aEstruc,{"PRECIO"    ,"N", 10,5 } )
   aadd(aEstruc,{"IVA"       ,"N",  5,2 } )
   aadd(aEstruc,{"CUOIVA"    ,"N", 10,2 } )
   aadd(aEstruc,{"REC"       ,"N",  5,2 } )
   aadd(aEstruc,{"CUOREC"    ,"N", 10,2 } )
   aadd(aEstruc,{"IMPORTE"   ,"N", 10,2 } )
   aadd(aEstruc,{"FECHA"     ,"D",  8,0 } )
   aadd(aEstruc,{"IVAINCL"   ,"L",  1,0 } )
   aadd(aEstruc,{"NUMERO"    ,"N",  6,0 } )
   aadd(aEstruc,{"REGISTRO"  ,"N",  6,0 } )   
   aadd(aEstruc,{"BORRADO"   ,"L",  1,0 } )
         
   dbCreate(cTempLin,aEstruc)
   
   dbUseArea(.T.,,cTempLin,"TEMP",.F.,,)
   
   oRsLineas    := FW_OpenRecordSet(oConex,cSource1,3,2,1)
   oRsArti      := FW_OpenRecordSet(oConex,cSource2,3)

   oRsLineas:MoveFirst()
     
   ASIZE(aTempDat, oRsLineas:Fields:Count)
   AFILL(aTempDat,.T.)
   aTempDat := BlankDatos(aTempDat,oRsLineas)
   
   oRsLineas:Find("Numero ="+Alltrim(Str(Int(nAlbar))),0,1,1 )
   If oRsLineas:Eof() .and. oRsLineas:Bof()
      Msginfo("No se han encontrado lineas")
      oRsLineas:Close()
      oRsArti:Close()
      dbCloseAll()
      Ferase(cTempLin)
      Return nil
   EndIf 

   nNumero := oRsLineas:Fields("numero"):Value 
   WHILE  nNumero = Int(nAlbar)
          aTempDat := BlankDatos(aTempDat,oRsLineas)
          aTempDat := LoadDatos(aTempDat,oRsLineas)
          TEMP->(dbAppend())
          TEMP->CODIGO   := aTempDat[ 2]  
          TEMP->CONCEPTO := aTempDat[ 3]
          TEMP->CANTIDAD := aTempDat[ 4]
          TEMP->PRECIO   := aTempDat[ 5]
          TEMP->IVA      := aTempDat[ 6]
          TEMP->CUOIVA   := aTempDat[ 7]
          TEMP->REC      := aTempDat[ 8]
          TEMP->CUOREC   := aTempDat[ 9]
          TEMP->IMPORTE  := aTempDat[10]
          TEMP->FECHA    := aTempDat[11]         
          TEMP->IVAINCL  := aTempDat[12]
          TEMP->NUMERO   := aTempDat[ 1]
          TEMP->REGISTRO := oRsLineas:Bookmark
          TEMP->BORRADO  := .f.
          TEMP->(dbUnlock())
                           
          ALTARTICULO(aTempDat,oRsArti)

          oRsLineas:MoveNext()
          If oRsLineas:Eof()
             Exit
          Else     
            nNumero := oRsLineas:Fields("numero"):Value
          EndIf           
   EndDo
   TEMP->(dbCommitAll())
   OLDLINEAS()
   oRsLineas:MoveFirst()

Return nil
Código de traspaso de datos entre la dbf y el RecordSet
Nota: paso los datos desde la dbf a un array porque luego me sirve para dar de baja al stock de articulos

Code: Select all

          If lSuma
             aLinAlb[ 2] := TEMP->Codigo
             aLinAlb[ 3] := TEMP->Concepto
             aLinAlb[ 4] := TEMP->Cantidad
             aLinAlb[ 5] := TEMP->Precio
             aLinAlb[ 6] := TEMP->Iva
             aLinAlb[ 7] := TEMP->Cuoiva
             aLinAlb[ 8] := TEMP->Rec
             aLinAlb[ 9] := TEMP->Cuorec
             aLinAlb[10] := TEMP->Importe
             aLinAlb[11] := TEMP->Fecha
             aLinAlb[12] := TEMP->Ivaincl
             
             Info(oRsLineas)   <------------------------------------------Compruebo propiedades del recordset                                 
             Info2(oRsLineas)  <-----------------------------------------Compruebo _ del recordset
             
             For nLin := 1 TO 12
                 oRsLineas:Fields(nLin-1):Value := aLinAlb[nLin]
             EndFor  
             
             Info(oRsLineas)   <------------------------------------------Compruebo propiedades del recordset                                  
             Info2(oRsLineas)  <-----------------------------------------Compruebo _ del recordset
             oRsLineas:Update()     <------------------------------------Aqui es donde da el error 
             BAJARTICULO(aLinAlb)