Consulto por xBrowse 2 tablas

47 views
Skip to first unread message

Claudio Roldan

unread,
Jul 17, 2025, 8:51:10 AMJul 17
to ADO Harbour
Hola a todos, estoy aprendiendo y probando SQL modificando SQLAdo.prg.
estoy trabajando con dos tablas una que contiene los datos de articulo y otra que contiene los distintos precios del articulo.
Hasta ahora logré sincronizar los xBrowse, y en  la xBrowse de articulos dejo modificar algunos campos.
La Consulta viene porque no puedo modificar la xBrowse de precios seguramente el error está en la definición del replacefield pero no me doy cuenda y no encuentro muchos ejemplos en el grupo como para comparar.

Desde ya gracias por su ayuda 
Claudio Roldan.

adjunto sqlado.prg  y error 
abajo copio el parrafo del prg con el armado del array para  replacefield
*--------------------
aEditables:=  "cod_barra, descripcio, desc_adic, porc_utili"
*
FOR n := 1 TO oRs:oRs:Fields:Count()
   IF oRs:oRs:Fields(n-1):Name $ aEditables
      AADD( aReplace, oRs:FieldBlock(n) )
   ELSE
      AADD( aReplace, NIL )
   ENDIF
NEXT
*
FOR n := 1 TO oRs2:oRs2:Fields:Count()
   IF oRs2:oRs2:Fields(n-1):Name $  "precio"
      AADD( aReplace2, oRs2:FieldBlock(n) )
   ELSE
      AADD( aReplace2, NIL )
   ENDIF
NEXT
*/

* Cargo un Array con la Listas de Precios
aListas:=GetRows("select NRO_DE_LIS, NOMBRE_LIS from GVA10",.T.)
*
aHeaders1:={'Codigo','Cod.Barras','Descripción','Desc.Adicional','Utilidad','Perfil'}
aWidths1:={ 90, 90, 230, 180, 70, 180 }
aFields1:={{|wa| wa:cod_articu},{|wa| wa:cod_barra},{|wa| wa:descripcio},{|wa| wa:desc_adic},{|wa| wa:porc_utili},{|wa| GetPerfilDesc(wa:perfil)}}
aColumns1:={{'TEXTBOX',,},{'TEXTBOX',,},{'TEXTBOX',,},{'TEXTBOX',,},{'TEXTBOX', 'NUMERIC', "999,999.99" },{'TEXTBOX',,} }
aJustifys1:={BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_LEFT }
*
aHeaders2:={'Codigo','Listas','Precio'}
aWidths2:={ 90, 230, 180 }
aFields2:={{|wb| wb:cod_articu},{|wb| GetListaDesc(wb:nro_de_lis)},{|wb| wb:precio}}
aColumns2:={{'TEXTBOX',,},{'TEXTBOX',,},{'TEXTBOX', 'NUMERIC', "999,999.99" } }
aJustifys2:={BROWSE_JTFY_LEFT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT }
*/

DEFINE WINDOW Form_1 AT 0, 0 OBJ oWin WIDTH 800 HEIGHT 530 Title "Artículos Detalle" ;
CHILD ON RELEASE oRs:Close()
ON KEY ESCAPE ACTION oWin:Release()
ON KEY F5 ACTION {|| oRs:Refresh(), oBrw1:Refresh()}

@ 1, 1 XBROWSE xSTA11 OBJ oBrw1 ;
WIDTH 780 ;
HEIGHT 380 ;
      WORKAREA ( oRs ) ;
HEADERS aHeaders1 ;
WIDTHS aWidths1 ;
FIELDS aFields1 ;
      COLUMNCONTROLS aColumns1 ;
      JUSTIFY aJustifys1 ;
EDIT INPLACE EDITLIKEEXCEL;
REPLACEFIELD aReplace ;
FIXEDBLOCKS  ;
      ON CHANGE {|| ActualizarPrecios(oBrw1, oBrw2, oRs, oRs2)}                    
                   
      @ 400,1 XBROWSE xGVA17 OBJ oBrw2 ;
      WIDTH 550;
      HEIGHT 80;
WORKAREA ( oRs2 ) ;
HEADERS aHeaders2 ;
WIDTHS aWidths2 ;
FIELDS aFields2 ;
      COLUMNCONTROLS aColumns2 ;
      JUSTIFY aJustifys2 ;
EDIT INPLACE EDITLIKEEXCEL;
REPLACEFIELD aReplace2 ;
FIXEDBLOCKS
*
error sqlado.jpg
SqlAdo.prg

David Field

unread,
Jul 17, 2025, 1:39:05 PMJul 17
to ADO Harbour
Hola,

Tu error esta en tratar de usar oRs2:oRs2.
El segundo oRs2 no existe.

FOR n := 1 TO oRs2:oRs2:Fields:Count()
   IF oRs2:oRs2:Fields(n-1):Name $  "precio"
      AADD( aReplace2, oRs2:FieldBlock(n) )
   ELSE
      AADD( aReplace2, NIL )
   ENDIF
NEXT

El objecto que creas al realizar un query oRs := ADODB("SELECT * FROM clientes") o oRs := DBADO():New("SELECT * FROM clientes") es uno que dentro de él crea otro objeto utilizando la variable de instancia oRs. Este objeto oRs no es el mismo que defines anteriormente sino que es el objeto que contiene el recordset.

Por lo tanto, 
FOR n := 1 TO oRs2:oRs:Fields:Count()
   IF oRs2:oRs:Fields(n-1):Name $  "precio"

      AADD( aReplace2, oRs2:FieldBlock(n) )
   ELSE
      AADD( aReplace2, NIL )
   ENDIF
NEXT

oRs2 contiene el objeto DBADO, oRs2:oRs (DBADO:oRs) contiene el objeto Recordset creado con win_oleCreateObject( "ADODB.Recordset" )

Saludos,
David Field

Claudio Roldan

unread,
Jul 18, 2025, 10:02:57 PMJul 18
to ADO Harbour
Gracias David por tu respuesta.
El error quedó superado aún así no puedo modificar precios en el xBrowse.  Se me ocurre que podría ser la rutina de sincronización 
copio abajo la rutina.
Gracias nuevamente por sus sugerencias.

Saludos.
Claudio Roldan


// Función para sincronizar los XBrowse
Function ActualizarPrecios(oBrw1, oBrw2, oRs, oRs2)
Local cCodArticu

    // Obtener el código del artículo seleccionado en el primer browse
    cCodArticu := oRs:cod_articu
   
    // Filtrar el segundo Recordset por el código de artículo
    oRs2:Filter := "cod_articu = '" + cCodArticu + "'"
    oRs2:Requery()

    // Actualizar el segundo browse
    oBrw2:Refresh()
   
    // Si no hay registros, mostrar mensaje
    If oRs2:RecordCount == 0
        MsgInfo("No Hay Precios para este Artículo", "Información")
    EndIf
   
Return Nil
SqlAdo.prg

David Field

unread,
Jul 20, 2025, 6:16:47 PMJul 20
to ADO Harbour
Hola Clauidio,

Tu problema es que al orpimir el botón "Guardar" se realiza oRs2:Update(). El Update() solo actualiza el registro actual (el registro sobre el que se encuentra el browse).

Tienes 2 opciones;
1. cambiar aReplace2 := {,, {|x| oRs2:Precio := x, oRs2:Update()} } que va a actualizar el registro al momento de cambiar el precio
o
2. Al botón "Guardar" cambiar ACTION {|| oRs:Update(), oRs2:UpdateBatch() }, el UpdateBatch() te actualiza todos los registros modificados.

Te recomiendo veas  ADO Recordset Object para más información y conocimiento de los métodos del recordset.

Saludos,
David Field

Ayuda en Informatica

unread,
Jul 21, 2025, 9:12:25 AMJul 21
to ado-h...@googlegroups.com

Gracias por la respuesta.

Leeré y modificaré

Saludos.

Claudio Roldan

 

De: ado-h...@googlegroups.com <ado-h...@googlegroups.com> En nombre de David Field
Enviado el: domingo, 20 de julio de 2025 19:17
Para: ADO Harbour <ado-h...@googlegroups.com>
Asunto: [ADO Harbour] Re: Consulto por xBrowse 2 tablas

 

Hola Clauidio,

 

Tu problema es que al orpimir el botón "Guardar" se realiza oRs2:Update(). El Update() solo actualiza el registro actual (el registro sobre el que se encuentra el browse).

 

Tienes 2 opciones;

1. cambiar aReplace2 := {,, {|x| oRs2:Precio := x, oRs2:Update()} } que va a actualizar el registro al momento de cambiar el precio

o

2. Al botón "Guardar" cambiar ACTION {|| oRs:Update(), oRs2:UpdateBatch() }, el UpdateBatch() te actualiza todos los registros modificados.

 

Te recomiendo veas  ADO Recordset Object para más información y conocimiento de los métodos del recordset.

 

Saludos,

David Field

--
Has recibido este mensaje porque estás suscrito al grupo "ADO Harbour" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a ado-harbour...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/ado-harbour/b122d2ef-cb49-46b0-9053-0df6c1e28707n%40googlegroups.com.


Libre de virus.www.avast.com
Reply all
Reply to author
Forward
0 new messages