Problema de oRs:RecordCount()

Problema de oRs:RecordCount()

Postby Pedro » Wed May 20, 2015 11:13 am

Hola a todos

Tengo un pequeño problema con este código que os pongo abajo. El problema consiste en que una vez mostrado el Browse al mover el cursor aparece el siguiente mensaje de error :
Code: Select all  Expand view
Application
===========
   Path and name: D:\ProADO\Wconta\GCONTA.Exe (32 bits)
   Size:   905,728 bytes
   Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 9445)
   FiveWin  Version: FWHX 12.06
   Windows version: 6.1, Build 7600

   Time from start: 0 hours 0 mins 24 secs
   Error occurred at: 20-05-2015, 13:07:05
   Error description: Error ADODB.RecordSet/6  DISP_E_UNKNOWNNAME: RECORDCOUNT
   Args:

Stack Calls
===========

   Called from: .\source\classes\XBROWSE.PRG => (b)TXBROWSE:SETADO( 4282 )
   Called from: .\source\classes\XBROWSE.PRG => TXBROWSE:PAINT( 1384 )
   Called from: .\source\classes\XBROWSE.PRG => TXBROWSE:DISPLAY( 1253 )
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1666 )
   Called from: .\source\classes\XBROWSE.PRG => TXBROWSE:HANDLEEVENT( 11649 )
   Called from: .\source\classes\WINDOW.PRG => _FWH( 3154 )
   Called from:  => SYSREFRESH( 0 )
   Called from: .\source\classes\DIALOG.PRG => TDIALOG:END( 511 )

System
======

El error es recursivo
El código es este

Code: Select all  Expand view
Local cSource1 := "SELECT * FROM DIARIO ORDER BY ASIENTO"
 Local cSource2 := "SELECT * FROM CONCEPTO ORDER BY CODIGO"
 Local cSource3 := "SELECT * FROM CUENTAS ORDER BY CUENTA"  
 Local aRowGrad,aSelGrad ,aCampos
 Private oRsDiario, oRsCta, oRsCpto
 
       oBarMain:Disable()
       oMenu:Disable()
           
       oRsDiario := FW_OPENRECORDSET(oConex,cSource1,3)
       oRsCpto   := FW_OPENRECORDSET(oConex,cSource2,3)
       oRsCta    := FW_OPENRECORDSET(oConex,cSource3,3)              

       If oRsDiario:RecordCount() > 1
          oRsDiario:MoveLast()
       EndIf  
       aRowGrad := { { .5, RGB( 232, 241, 252 ), RGB(  232, 241, 252 ) }, ;
                   { .5, RGB( 210, 225, 244 ), RGB(  235, 243, 253 ) } }

       aSelGrad := { { .5, RGB( 255, 255, 251 ), RGB( 255, 237, 178 ) }, ;
                   { .5, RGB( 255, 218, 103 ), RGB( 255, 233, 162 ) } }      
       
       AFILL(aSumas,0)
       aCampos := {oRsDiario:Fields(0):Name, oRsDiario:Fields(1):Name, ;
                   oRsDiario:Fields(2):Name, oRsDiario:Fields(3):Name, ;
                   oRsDiario:Fields(4):Name, oRsDiario:Fields(5):Name, ;
                   oRsDiario:Fields(6):Name, oRsDiario:Fields(7):Name,"." }
                   
       DEFINE FONT oFontCli NAME "TAHOMA" SIZE 0, -13
 
       DEFINE WINDOW oWChild MDICHILD NOSYSMENU;
              TITLE "Diario Contable" OF oWMain

              SET FONT OF oWChild TO oFontCli
              SET MESSAGE OF oWChild TO "DIARIO CONTABLE : "+cTrabajo
   
       DEFINE BUTTONBAR oBar1 OF oWChild SIZE 80, 60 2007
       
       DEFINE BUTTON OF oBar1 ACTION NuevoAsiento(ID_ALT,oBrw) ;
              RESOURCE "NUEVAS" PROMPT "Añadir" TOOLTIP "Nuevo Asiento"

       DEFINE BUTTON OF oBar1 ACTION ModAsiento(ID_MOD,oBrw) ;
              RESOURCE "EDITAR" PROMPT "Editar" TOOLTIP "Editar Asiento"

       DEFINE BUTTON OF oBar1 ACTION (BorrAsiento(),oBrw:Refresh()) ;
              RESOURCE "BORRAR" PROMPT "Borrar" TOOLTIP "Borrar Asiento"
   
*       DEFINE BUTTON OF oBar1 ACTION (Ordenar(oDiario,oWchild,"DIAR"),oLbx:Refresh()) ;
*              RESOURCE "ORDENAR" PROMPT "ORDENAR" TOOLTIP "Ordenar Asientos"
   
*       DEFINE BUTTON OF oBar1 ACTION Buscasientos(oBrw,cAlias,oWChild) ;
*              RESOURCE "BUSCAR" PROMPT "Buscar" TOOLTIP "Buscar en Asiento"

       DEFINE BUTTON OF oBar1 ACTION oWChild:End() ;
              RESOURCE "Salir" PROMPT "Salir" TOOLTIP "Salir de esta pantalla"

     
       oBrw := TXBrowse():New( oWChild )
       oBrw:SetAdo( oRsDiario, .T.,.T.,aCampos)
         
               WITH OBJECT oBrw
                    :lColDividerComplete := .t.
                    :nMarqueeStyle       := 3
                    :nColDividerStyle    := 1
                    :nHeaderLines        := 2
                    :lFooter             := .t.
                    :nStretchCol         := 9
                    :bClrSelFocus  := { || { CLR_BLACK, aSelGrad } }
                    :bClrRowFocus  := { || { CLR_BLACK, aRowGrad } }  
                    :bClrStd       := { || IIF(oRsDiario:AbsolutePosition % 2 == 0,{ CLR_BLACK, RGB( 224, 236, 255 ) }, { CLR_BLACK, RGB( 189, 211, 253 ) } )}
                    :blDClickDatas := { || ModAsiento(ID_MOD,oWChild,oBrw),oBrw:Refresh() }          
                    :CreateFromCode()  
               END
                    * nStrechCol := nº de columna del Browse que queremos que nos ajuste desde la 1 hasta la ultima
                    *                      
               oBrw:aCols[ 1]:cEditPicture := "999,999"
               oBrw:aCols[ 7]:cEditPicture := "999,999.99"
               oBrw:aCols[ 8]:cEditPicture := "999,999.99"
               oWChild:oClient := oBrw
     

    ACTIVATE WINDOW oWChild MAXIMIZED ;
               VALID( oBarMain:Enable(),oMenu:Enable(),dbCloseAll(),.t. )
    SysRefresh()
    FERASE(cDiarioTmp)
    RELEASE FONT oFontCli
    oRsDiario:Close()
    oRsCta:Close()
    oRsCpto:Close()
return( nil )
 


Alguna idea ?
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: Problema de oRs:RecordCount()

Postby armando.lagunas » Wed May 20, 2015 11:56 am

hola

solo una idea!,

al parecer el error no es en tu código, sino en la clase txbrowse, al tratar de pintar e invocar el method setado, al parecer una de las 3 consultas que tienes, puede que una devuelva un recorset vacío y por ende puede que se produzca el error que mencionas.

buscando en la clase que yo tengo, lo único que se ve de recordcount es cuando se define el default del method

Code: Select all  Expand view

METHOD SetAdO( oRs, lAddCols, lAutoOrder, aFldNames ) CLASS TXBrowse

   local nFields,nFor, oCol, aRsColNames
   local lJet  := .f.

   if ::lCreated
      if ::nDataType == DATATYPE_ARRAY
         if SameAdoStruct( Self, oRs )
            return nil
         else
            ::aCols  := {}
         endif
      else
         ::ClearBlocks()
         ::aCols  := {}
      endif
   endif

   ::oRs    := oRs

   DEFAULT ::bGoTop    := {|| If( ::oRs:RecordCount() > 0, ::oRs:MoveFirst(), nil ) },;
           ::bGoBottom := {|| If( ::oRs:RecordCount() > 0, ::oRs:MoveLast(), nil )  },;
           ::bSkip     := {| n | AdoSkip( ::oRs, IfNil( n, 1 ) ) },;
           ::bBof      := {|| ::oRs:Bof },;
           ::bEof      := {|| ::oRs:Eof },;
           ::bBookMark := {| n | If( n == nil,;
                                 If( ::oRs:RecordCount() > 0, ::oRs:BookMark, 0 ), ;
                                 If( ::oRs:RecordCount() > 0, ( ::oRs:BookMark := n ), 0 ) ) }, ;
           ::bKeyNo    := {| n | If( n == nil, ;
                                 If( ::oRs:RecordCount() > 0, ::oRs:AbsolutePosition, 0 ), ;
                                 If( ::oRs:RecordCount() > 0, ( ::oRs:AbsolutePosition := n ), 0 ) ) },;
           ::bKeyCount := {|| ::oRs:RecordCount() }

   DEFAULT lAddCols   :=  Empty( ::aCols ) .or. ! Empty( aFldNames )
   DEFAULT lAutoOrder := ::lAutoSort
   ::lAutosort        := lAutoOrder
....
....
...
 


hecha un vistazo a la linea 4282 de la clase txbrowse que tienes, (la que te he puesto es diferente comienza en la linea 4426), e identifica la sentencia exacta en donde te produce el error, hay puedes encontrar algo mas especifico para que podamos ayudarte.

ojo, es solo una idea, quisas alguien mas experto pueda decirnos mas.

saludos
SkyPe: armando.lagunas@hotmail.com
Mail: armando.lagunas@gmail.com
User avatar
armando.lagunas
 
Posts: 346
Joined: Mon Oct 05, 2009 3:35 pm
Location: Curico-Chile

Re: Problema de oRs:RecordCount()

Postby Pedro » Wed May 20, 2015 1:53 pm

Hola Armando

el recordset cobre el que se produce el error es oRsDiario, los otros solo los abro para extraer el concepto o la cuenta. El activo es oRsDiario y lo curioso es que aparece el Browse con sus datos, pero al mover el cursor encima del Browse, sin hacer movimientos sobre las filas, es cuando se produce el error.
Las líneas, desde la 4269 a la 4282, en mi fuente del xBrowse, son estas :
Code: Select all  Expand view
  ::oRs    := oRs

   DEFAULT ::bGoTop    := {|| If( ::oRs:RecordCount() > 0, ::oRs:MoveFirst(), nil ) },;
           ::bGoBottom := {|| If( ::oRs:RecordCount() > 0, ::oRs:MoveLast(), nil )  },;
           ::bSkip     := {| n | AdoSkip( ::oRs, If( n==nil, 1, n ) ) },;
           ::bBof      := {|| ::oRs:Bof },;
           ::bEof      := {|| ::oRs:Eof },;
           ::bBookMark := {| n | If( n == nil,;
                                 If( ::oRs:RecordCount() > 0, ::oRs:BookMark, 0 ), ;
                                 If( ::oRs:RecordCount() > 0, ( ::oRs:BookMark := n ), 0 ) ) }, ;
           ::bKeyNo    := {| n | If( n == nil, ;
                                 If( ::oRs:RecordCount() > 0, ::oRs:AbsolutePosition, 0 ), ;
                                 If( ::oRs:RecordCount() > 0, ( ::oRs:AbsolutePosition := n ), 0 ) ) },;
           ::bKeyCount := {|| ::oRs:RecordCount() }
 


Como verás no difieren en nada de las tuyas, el número de línea puede ser porque, en alguna modificación , hayan introducido algo más de código.
A ver si los gurus del xBrowse me indican el motivo del error
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: Problema de oRs:RecordCount()

Postby Armando » Wed May 20, 2015 3:16 pm

Pedro:

Tal vez mi comentario no solucione el problema, perooo...

En lugar de:
Code: Select all  Expand view

       If oRsDiario:RecordCount() > 1   // si el recordset está vacío, te va a tirar un horror  :)
          oRsDiario:MoveLast()
       EndIf  
 


Usa:
Code: Select all  Expand view

       If oRsDiario:BOF() .AND. oRsDiario:EOF()    // Así no tendrás error
       ELSE
          oRsDiario:MoveLast()
       EndIf  
 


En lugar de:
Code: Select all  Expand view

       aCampos := {oRsDiario:Fields(0):Name, oRsDiario:Fields(1):Name, ;
 


Usa:
Code: Select all  Expand view

       aCampos := {oRsDiario:Fields("Cuenta"):Value, oRsDiario:Fields("SubCuenta"):Value, ;   // Esto da más claridad a tu código
 


Son solo sugerencias

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Problema de oRs:RecordCount()

Postby Rick Lipkin » Wed May 20, 2015 3:41 pm

Pedro

Two things ..

1) Remove the SysRefresh() <-- this is most likely the cause or the error
2) After you close your table oRsDiario assign 0 to the following code blocks :
Code: Select all  Expand view

   oRsDiario:Close()

   oBrw:bKeyCount := { || 0 }
   oBrw:bKeyNo    := { || 0 }

   ...
   ...

 


This should fix the error.

Rick Lipkin
User avatar
Rick Lipkin
 
Posts: 2618
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Problema de oRs:RecordCount()

Postby Pedro » Wed May 20, 2015 6:34 pm

Rick

al hacer lo que dices, no se produce el error, pero en cuanto accedes a la barra de botones, desaparecen los registros y el Browse queda vacío a la vista.

Como dato curioso he de decir que si quito el cierre de los recordsets tampoco se produce el error pero indica que no existe el recordset en esta línea
Code: Select all  Expand view
                   :bClrStd       := { || IIF(oRsDiario:AbsolutePosition % 2 == 0,{ CLR_BLACK, RGB( 224, 236, 255 ) }, { CLR_BLACK, RGB( 189, 211, 253 ) } )}


lo dejo por hoy me está dando dolor de cabeza esta historia, a ver si mañana deja de suceder
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: Google [Bot] and 94 guests