Page 1 of 1

xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Wed May 29, 2013 4:12 am
by Miguel Salas
Hola Amigos

Tengo lo siguiente en un xbrowse con recordset de detalle si ya tiene registros y le agrego mas, lo muestra sin problema... peroooooo mi problema es al ingresar un maestro(cabecera) nuevo obviamente muestra el browse vacío y al irle agregando nuevos en el detalle no los muestra no refresca, mas si los graba

Ya intente de todo hasta asignarle otro recordset y nada.

Code: Select all

     ACTION ( GrabaDatos(cAccion), ;
                      CapturaDet("A",cClave,oDlg,@oGet),;
                      oRsDetOrdSrv:close(),;
                      scopeorden(cClave), ;
                      oBrwDet:ReFresh(.t.),;
                      oDlg:update(),;
                      oSay[2]:refresh(),;
 

Code: Select all

STAT FUNC scopeOrden(cClave2)

          cSQL := "SELECT * FROM  detordsrv  WHERE  ORDENSRV = '" + cClave2 +"'"

          oRsDetOrdSrv := TOleAuto():New( "ADODB.Recordset" )
          oRsDetOrdSrv:CursorType := 1 // opendkeyset
          oRsDetOrdSrv:CursorLocation := 3 // local cache
          oRsDetOrdSrv:LockType := 3 // lockoportunistic

          TRY
           oRsDetOrdSrv:Open(cSQL,oApp:oCon )
          CATCH oErr
           MsgInfo( "Error al abrir la detOrdSrv " )
           ShowError(oErr)
           RETURN(.F.)
          END TRY

       /*   do while !oRsDetOrdSrv:eof()
             ? oRsDetOrdSrv:fields("CONTENEDOR"):value
             oRsDetOrdSrv:movenext()
          enddo
*/
       //     oRsDetOrdSrv:moveFIRST()


return nil

 

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Wed May 29, 2013 6:58 pm
by Pedro
Hola Miguel

Discúlpame si no lo entiendo, ya que no lo veo, añades registros ¿dónde? ¿en el Xbrowse, o en un diálogo y luego quieres ver el registro en el Xbrowse?
Si lo añades en el Xbrowse, deberías de poner como lo haces, para que veamos, si podemos, por qué no se muestra. Y si lo haces en un diálogo lo más lógico es que refresques el xBrowse. Tampoco nos dices si las columnas del xbrowse es el recordset o un array.
En fin, danos algo más de información.

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 1:32 am
by Miguel Salas
Gracias por tu interés Pedro y tienes razon debì ilustrarlos con mas codigo lo que se me vino a la mente es el que como funciona cuando ya existen registros del detalle solo les puse lo que hago cuando añado un maestro (cabecera) nuevo.

Code: Select all


oBrwDet := TxBrowse():New( oDlg )
oBrwDet:nHeaderLines := 1
oBrwDet:lAllowColSwapping :=.F.
oBrwDet:nColSel := 1
oBrwDet:nRowHeight := 18
oBrwDet:nMarqueeStyle := MARQSTYLE_HIGHLROW
//oBrwDet:nMarqueeStyle    := MARQSTYLE_HIGHLCELL
oBrwDet:nColDividerStyle := LINESTYLE_BLACK
oBrwDet:lColDividerComplete := .t.
oBrwDet:lHScroll := .f.
oBrwDet:lFooter := .t.


oCol := oBrwDet:AddCol()
oCol:cHeader := "CONTENEDOR"
oCol:bStrData := { || If( oBrwDet:oRs:Eof, Space( 10 ),oBrwDet:oRs:fields("CONTENEDOR"):value)}
oCol:nWidth := 150
oCol:nDataStrAlign:= AL_LEFT
oCol:nHeadStrAlign:= AL_LEFT
oCol:lAllowSizing :=.F.


oCol := oBrwDet:AddCol()
oCol:cHeader := "TIPO"
oCol:bStrData := { || If( oBrwDet:oRs:Eof, Space( 10 ),oBrwDet:oRs:fields("TIPO"):value )}
oCol:nWidth := 50
oCol:nDataStrAlign:= AL_RIGHT
oCol:nHeadStrAlign:= AL_RIGHT
oCol:lAllowSizing :=.F.


oCol := oBrwDet:AddCol()
oCol:cHeader := "CONCEPTO"
oCol:bStrData := { || If( oBrwDet:oRs:Eof, Space( 10 ),oBrwDet:oRs:fields("CONCEPTO"):value) }
oCol:nWidth := 200
oCol:nDataStrAlign:= AL_LEFT
oCol:nHeadStrAlign:= AL_LEFT
oCol:lAllowSizing :=.F.

oCol := oBrwDet:AddCol()
oCol:cHeader := "IMPORTE"
oCol:bStrData := { || If( oBrwDet:oRs:Eof, Space( 10 ),TRANS(oBrwDet:oRs:fields("PRECIOUNI"):value ,"@ 999,999,999.99")) }
oCol:nWidth := 120
oCol:nDataStrAlign:= AL_LEFT
oCol:nHeadStrAlign:= AL_LEFT
oCol:lAllowSizing :=.F.

oCol := oBrwDet:AddCol()
oCol:cHeader := "FOLIO FACTURA"
oCol:bStrData := { || If( oBrwDet:oRs:Eof, Space( 10 ),oBrwDet:oRs:fields("FACTURA"):value) }
oCol:nWidth := 120
oCol:nDataStrAlign:= AL_LEFT
oCol:nHeadStrAlign:= AL_LEFT
oCol:lAllowSizing :=.F.

   oBrwDet:aCols[01]:AddResource( 'UNCHECK' )
   oBrwDet:aCols[01]:AddResource( 'CHECK' )
   oBrwDet:aCols[01]:bBmpData:={ || iif( oBrwDet:oRs:fields("marcar"):value = 1, 2, 1 ) }
   oBrwDet:aCols[01]:cHeader       := 'Facturar'
   oBrwDet:aCols[01]:nHeadBmpAlign := AL_CENTER
   oBrwDet:aCols[01]:bLDClickData:={ ||(IIF( empty(oBrwDet:oRs:fields("factura"):value),CambiaStatusDetOrd(@nSuma),.t.),oBrwDet:refresh())}

oBrwDet:SetADO(oRsDetOrdSrv)

oBrwDet:CreateFromResource (117)

 
te comento que inserto directamente en la tabla , sin problemas, el detalle esta en el pintado del xbrowse.
en otras palabras cuando es un nuevo maestro lo muestra vacío, le añado registros y lo sigue mostrando vacío así le añada 3,4,5 , si me salgo al dialogo maestro y regreso al detalle ya me aparecen todos los que agregué y si agrego otro lo muestra sin problema

Code: Select all

     cCmdSql := armaCadenaInsert("DetOrdSrv",aCampos,aValores)
            TRY
                oApp:oCon:Execute(cCmdSql)
              CATCH oError
                  MsgInfo("No se pudo INSERTAR la tabla DetordSrv ",oApp:cAplicacion)

              ShowError(oError)
              return nil
             END
 

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 8:23 am
by Pedro
Hola Miguel

No veo por ningún lado el fastedit ni el bpasteof(), tampoco en las columnas el bOnpostEdit.
La verdad es que nunca he intentado grabar directamente sobre la tabla, ya que soy muy mal pensado y creo que el usuario es tan ¿==(=)/(%%$% que cuando está terminando el albarán o la factura, va y dice que quiere cancelar lo que ha hecho, de esa manera tengo que borrar los registros y empaquetar la tabla, un fastidio cuando estas en ambiente multiusuario, así que prefiero hacerlo en un array o en una tabla temporal. Como es lógico tanto el array como la tabla temporal están vacíos cuando es una nueva factura o albarán.
Aqui te pongo como lo hago yo y no tengo ningún problema.

Para una tabla temporal.

Code: Select all

   oBrw = TXBrowse():New( oDlgAlb ) 
   
   oBrw:nColDividerStyle    := LINESTYLE_BLACK
   oBrw:nRowDividerStyle    := LINESTYLE_BLACK
   oBrw:lRecordSelector     := .t.
   oBrw:nHeaderLines        := 1
   oBrw:nDataLines          := 1
     oBrw:nRowSel             := 1
     oBrw:nMarqueeStyle       := 3 //Highlight row //MARQSTYLE_HIGHLCELL
     oBrw:bClrSelFocus        := {||{CLR_WHITE,RGB(176,196,222 )}}
   oBrw:cAlias := cAlias1
   oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales 
   oBrw:bClrSel := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco 
   oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco 

   oBrw:lFastEdit  := .T.
   oBrw:bPastEof = {|| (cAlias1)->(Dbappend()), oBrw:GoLeftMost(),oBrw:Refresh(),;
                                            oBrw:aCols[ 1 ]:Edit() } 
                                            //agrega registro y "oprime" enter

                        
   oCol = oBrw:AddCol()
   oCol:bStrData      := { ||(cAlias1)->codigo } 
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "CODIGO" 
   oCol:bOnPostEdit   := { | oCol, xVal, nKey | If( RecCount() == 0,( DbAppend(), oBrw:Refresh() ),) ,; 
   If( nKey == VK_RETURN, If(BArticulo(oBrw,xVal,"CODIGO"),((cAlias1)->importe := Importe(oBrw,1),;
                           (cAlias1)->(dbAppend()),oBrw:Refresh(),oBrw:aCols[1]:Edit()  ),),),;
   If( nKey == VK_ESCAPE .and. Empty((cAlias1)->codigo),( (cAlias1)->(dbDelete()),;
               (cAlias1)->(__dbPack()),(cAlias1)->(dbGoBottom()),oBrw:Refresh() ), ) }
   
          
     oCol = oBrw:AddCol()
   oCol:bStrData      := { ||(cAlias1)->CONCEPTO}    
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "CONCEPTO" 
   oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
     If( nKey == VK_RETURN, (cAlias1)->CONCEPTO := xVal ,)} 
    
                  
     oCol = oBrw:AddCol()
   oCol:bStrData      := { ||Transform( (cAlias1)->CANTIDAD,"999,999.99" ) }     
   oCol:nDataStrAlign := 1 //alineado a la derecha 
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "CANTIDAD" 
   oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
     If( nKey == VK_RETURN, ( (cAlias1)->CANTIDAD := Val(xVal),;
   If ( Val(xVal) <> 0, ((cAlias1)->importe := Importe(oBrw,2) ),)) ,) }
................................etc       
 
Para un Array. ( En realidad es el mismo programa la única diferencia es que el código de más arriba es para dbfs y el de abajo es con ado y acces)

Code: Select all

   oBrw = TXBrowse():New( oDlgAlb ) 
   oBrw:SetArray(aLinVentas,.T.,0,.F.)
   
   oBrw:nColDividerStyle    := LINESTYLE_BLACK
   oBrw:nRowDividerStyle    := LINESTYLE_BLACK
   oBrw:lRecordSelector     := .t.
   oBrw:nHeaderLines        := 1
   oBrw:nDataLines          := 1
     oBrw:nRowSel             := 1
     oBrw:nMarqueeStyle       := 3 //Highlight row //MARQSTYLE_HIGHLCELL
     oBrw:bClrSelFocus        := {||{CLR_WHITE,RGB(176,196,222 )}}
   oBrw:bClrStd             := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales 
   oBrw:bClrSel             := {|| { nRGB(0,0,0), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco 
   oBrw:bClrSelFocus        := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco 

   oBrw:lFastEdit  := .T.
   oBrw:bPastEof = {||  InsertRow(oBrw) ,oBrw:GoLeftMost(),oBrw:Refresh(),;
                                                oBrw:aCols[ 1 ]:Edit() } 
                                               //agrega registro y "oprime" enter

   oCol = oBrw:AddCol()
   oCol:bStrData      := { || aLinVentas[oBrw:nArrayAt,1] }   
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "ARTICULO" 
   oCol:bOnPostEdit   := { | oCol, xVal, nKey | If( Empty(aLinVentas),( InsertRow(oBrw), oBrw:Refresh() ),) ,; 
   If( nKey == VK_RETURN, If(BArticulo(oBrw,xVal,"CODIGO"),(aLinVentas[oBrw:nArrayAt,9] := Importe(oBrw,1),;
                           InsertRow(oBrw),oBrw:Refresh() ),),),;
   If( nKey == VK_ESCAPE .and. Empty(aLinVentas[oBrw:nArrayAt,1]), (DeleteRow(oBrw),;
                                    oBrw:Refresh() ), ) }
                               
   oCol:nArrayCol := 1
*-------------------------------------------------------------------------------          
     oCol = oBrw:AddCol()
   oCol:bStrData      := { || aLinVentas[oBrw:nArrayAt,2] }
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "DESCRIPCIÓN" 
   oCol:bOnPostEdit = { | oCol, xVal, nKey | If( Empty(aLinVentas), (InsertRow(),oBrw:Refresh() ),),;
     If( nKey == VK_RETURN, aLinVentas[oBrw:nArrayAt,2] := xVal ,) } 
   oCol:nArrayCol := 2     
*-------------------------------------------------------------------------------                  
     oCol = oBrw:AddCol()
   oCol:bStrData      := { ||Transform( aLinVentas[oBrw:nArrayAt,3],"999,999.99" ) }     
   oCol:nDataStrAlign := 1 //alineado a la derecha 
   oCol:nEditType     := EDIT_GET
   oCol:cHEADER       := "CANTIDAD" 
   oCol:bOnPostEdit = { | oCol, xVal, nKey | If( Empty(aLinVentas), (InsertRow(),oBrw:Refresh() ),),;
     If( nKey == VK_RETURN, ( aLinVentas[oBrw:nArrayAt,3] := xVal,;
   If ( xVal <> 0, (aLinVentas[oBrw:nArrayAt,9] := Importe(oBrw,2) ),)) ,) }
   oCol:nArrayCol := 3
..............................etc
          
A ver si te sirve de algo

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 1:16 pm
by nageswaragunupudi
Mr Miguel Salas

After opening new recordset, you should assign it to oBrwDet:oRs := <newrecordset> and then call oBrwDet:Refresh()

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 2:19 pm
by nageswaragunupudi
Hints for browsing Parent and Child tables with XBrowse using ADO.
It is not necessary to close and reopen record set every time the row in parent table changes. It is easier to open full child table and keep changing oRsChild:Filter.
Instead of using SQL INSERT statements, it is better to use RecordSet's AddNew() method. AddNew() method automatically updates the recordset. If we use SQL INSERT statement, we need to use ReQuery() method to read the data again into the record set.

Here I give a very simple self contained example of Parent Child browse using ADO recordsets.

Important part of the sample is the oBrwParent:bChange codeblock

Code: Select all

      :bChange    := { || oRsChild:Filter := "PARID=" + LTrim( Str( oRsParent:Fields( "ID" ):Value ) ), ;
                          oBrwChild:GoTop(), oBrwChild:Refresh() }
 
This sample program is fully self contained and you can just compile and run. The program creates a sample MDB ( MsAccess database ), creates parent and child tables and shows the browse. You can add parents and childs and see how it works.

Code: Select all

#include "fivewin.ch"
#include "xbrowse.ch"

static cMdb := "parchild.mdb"
static oCn

//----------------------------------------------------------------------------//

function Main()

   if ! CreateMDB( cMdb )
      MsgStop( "Can not create MDB database" )
      return nil
   endif
   oCn      := FW_OpenAdoConnection( ;
               "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ;
               cFilePath( ExeName() ) + cMdb + ";User ID=Admin;Password=;" )

   if oCn != nil
      CreateTables()
      BrowseTables()
      oCn:Close()
   else
      MsgAlert( "Can not open MDB" )
   endif

return nil

//----------------------------------------------------------------------------//

static function BrowseTables()

   local oRsParent, oRsChild
   local oBrwParent, oBrwChild
   local oDlg, oFont

   oRsParent   := FW_OpenRecordSet( oCn, "PARENT" )
   oRsChild    := FW_OpenRecordSet( oCn, "CHILD"  )

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 600,300 PIXEL ;
      TITLE "ADO: PARENT CHILD BROWSE" FONT oFont

   @ 30,10 XBROWSE oBrwParent SIZE 135,-10 PIXEL OF oDlg ;
      DATASOURCE oRsParent AUTOCOLS HEADERS "ID", "Parent" ;
      COLSIZES 40 CELL LINES NOBORDER FASTEDIT

   WITH OBJECT oBrwParent
      :lHScroll                  := .f.
      :aCols[ 2 ]:nEditType      := EDIT_GET
      :nStretchCol               := 2
      :bChange    := { || oRsChild:Filter := "PARID=" + LTrim( Str( oRsParent:Fields( "ID" ):Value ) ), ;
                          oBrwChild:GoTop(), oBrwChild:Refresh() }
      :CreateFromCode()
   END

   @ 30,146 XBROWSE oBrwChild SIZE -10,-10 PIXEL OF oDlg ;
      DATASOURCE oRsChild AUTOCOLS HEADERS "ID", "ParID", "Child" ;
      COLSIZES 40, 40 CELL LINES NOBORDER FASTEDIT

   WITH OBJECT oBrwChild
      :lHScroll                  := .f.
      :aCols[ 3 ]:nEditType      := EDIT_GET
      :nStretchCol               := 3
      :CreateFromCode()
   END

   @ 10,10 BUTTON "AddParent" SIZE 60,12 PIXEL OF oDlg ACTION AddParent( oBrwParent )
   @ 10,oBrwChild:nLeft BUTTON "AddChild" SIZE 60,12 PIXEL OF oDlg ;
      ACTION AddChild( oBrwChild, oBrwParent )

   Eval( oBrwParent:bChange )

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

   oRsParent:Close()
   oRsChild:Close()

return nil

//----------------------------------------------------------------------------//

static function AddParent( oBrwParent )

   local cName := Space( 20 )

   if MsgGet( "Enter Parent Name", "ADD PARENT", @cName ) .and. ;
      ! Empty( cName )

      WITH OBJECT oBrwParent:oRs
         :AddNew()
         :Fields( "NAME" ):Value   := AllTrim( cName )
         :Update()
      END
      oBrwParent:Refresh()
      Eval( oBrwParent:bChange )
   endif
   oBrwParent:SetFocus()

return nil

//----------------------------------------------------------------------------//

static function AddChild( oBrwChild, oBrwParent )

   local cName := Space( 20 )

   if MsgGet( "Enter Chld Name", "ADD CHILD", @cName ) .and. ;
      ! Empty( cName )

      WITH OBJECT oBrwChild:oRs
         :AddNew()
         :Fields( "NAME" ):Value    := AllTrim( cName )
         :Fields( "PARID" ):Value   := oBrwParent:oRs:Fields( "ID" ):Value
         :Update()
      END
      oBrwChild:Refresh()
   endif
   oBrwParent:SetFocus()

return nil

//----------------------------------------------------------------------------//
// INITIAL CREATION OF TABLES
//----------------------------------------------------------------------------//

static function CreateMDB( cMdbName )

   local cFile := cFilePath( ExeName() ) + cMdbName
   local cStr  := "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + cFile
   local lCreated := .f.
   local oCat

   FErase( cFile )
   oCat  := TOleAuto():New( "ADOX.Catalog" )
   TRY
      oCat:Create( cStr )
      lCreated    := .t.
   CATCH
   END

return lCreated

//----------------------------------------------------------------------------//

static function CreateTables()

   local cName

   oCn:Execute( "CREATE TABLE PARENT ( ID AUTOINCREMENT PRIMARY KEY, NAME VARCHAR( 20 ) )" )
   oCn:Execute( "CREATE TABLE CHILD ( ID AUTOINCREMENT PRIMARY KEY, PARID INT, NAME VARCHAR( 20 ) )" )

   for each cName in { "Albert", "James", "Edward", "John" }
      oCn:Execute( "INSERT INTO PARENT ( NAME ) VALUES ( '" + cName + "' )" )
   next
   oCn:Execute( "INSERT INTO CHILD ( PARID, NAME ) VALUES ( 1, 'David' )" )

return nil

//----------------------------------------------------------------------------//
 
Image

I suggest first compile and run the program as it is.

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 3:25 pm
by Antonio Linares
Aqui tienes una versión actualizada de FiveDBU (incluye todo el código fuente) que añade registros correctamente en un recordset de ADO:

https://code.google.com/p/fivewin-contr ... 130530.zip

Como puedes comprobar, añade registros y el browse se muestra correctamente :-)

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 4:07 pm
by Miguel Salas
Muchas gracias por sus respuestas , voy a revisar y les cuento, saludos

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Thu May 30, 2013 5:46 pm
by Antonio Linares
Revisa el código de la funcion RSAppendBlank( oRS ) en fivedbu.prg

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Fri May 31, 2013 1:01 am
by Miguel Salas
checando sus recomendaciones detecté lo siguiente:

no es solo en el browse detalle, limpiando la tabla padre, tampoco muestra el primer registro agregado,(lo hace cuando cierro el dialogo y entro de nuevo) entonces concluyo que es al crear un browse:setado(oRs) con un recordset vacío cuando no se refresca.

estamos cercando el problema.
saludos y gracias

Re: xbrowse+ADO NO REFRESCA EL BROWSE

Posted: Fri May 31, 2013 10:31 am
by Pedro
Miguel, por qué no pruebas a crear un registro vacío en el recordset y lo modificas? Era lo que yo hacía cuando usaba el recordset a pelo y no me daba problemas.