Page 1 of 1

Problema de oRs:RecordCount()

Posted: Wed May 20, 2015 11:13 am
by Pedro
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

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

 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 ?

Re: Problema de oRs:RecordCount()

Posted: Wed May 20, 2015 11:56 am
by armando.lagunas
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

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

Re: Problema de oRs:RecordCount()

Posted: Wed May 20, 2015 1:53 pm
by Pedro
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

   ::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

Re: Problema de oRs:RecordCount()

Posted: Wed May 20, 2015 3:16 pm
by Armando
Pedro:

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

En lugar de:

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Saludos

Re: Problema de oRs:RecordCount()

Posted: Wed May 20, 2015 3:41 pm
by Rick Lipkin
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

   oRsDiario:Close()

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

   ...
   ...

 
This should fix the error.

Rick Lipkin

Re: Problema de oRs:RecordCount()

Posted: Wed May 20, 2015 6:34 pm
by Pedro
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

                    :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