Función con xbrowse y xedit

Función con xbrowse y xedit

Postby jose_murugosa » Thu Jul 06, 2023 4:11 pm

Queridos compañeros del Foro.
Intento crear una función con la cual pasar algunos parámetros y obtener un browse de una tabla al cual dando doble click en un elemento se pueda editar el mismo, usando Xbrowse y Xedit.

Lo hago así:
Parámetros:
Code: Select all  Expand view  RUN

//Script de la tabla
aAdd( aSql, 'SELECT id, descripcion, idcategoria, sector, ordenlinea FROM puestos AS p ORDER BY id' )
//Campos y cabezales para el xbrowse
aAdd( aFields,  { 'id', 'descripcion', 'idcategoria', 'sector', 'ordenlinea' } )
aAdd( aHeaders, { 'Id', 'Descripción', 'Id.Categoría', 'Sector', 'Orden en Línea' } )
//Título del browse
aAdd( aTitleBrw, 'Puestos de Faena' )
 


así por cada tabla a la que deseo mostrar.

Para ver la tabla hago:
Code: Select all  Expand view  RUN

BrwSql( aSql[1], aFields[1], aHeaders[1], aTitleBrw[1] )
 


Así está hecha la función:

Code: Select all  Expand view  RUN

FUNCTION Brwsql( aSql, aFields, aHeaders, aTitleBrw )
     LOCAL oWndChild, cSql, cFields, cHeaders, cTitleBrw
     
     SetBalloon( .t. )
     xbrNumformat( ,.t. )
     
     oRs:= oCn:Rowset( aSql, .t. )
     IF oRs != nil
          DEFINE WINDOW oWndChild MDICHILD OF oWnd TITLE "Tabla de: "  +  atitlebrw  
               @ 0,0 XBROWSE oBrw OF oWndChild DATASOURCE oRs FIELDS aFields HEADERS aHeaders ;
                    AUTOCOLS AUTOSORT FOOTERS LINES CELL ;
                    ON DblClick MyXEdit( oRs, aFields, aHeaders, oBrw )
                   
               aEval( oBrw:aCols, { |oCol| oCol:cHeader := Upper( Left( oCol:cHeader, 1 ) ) + Lower( Substr( oCol:cHeader, 2 ) ) } )
               oBrw:bPopUp := { |o| ColMenu( o ) }
               oBrw:CreateFromCode()
               oWndChild:oClient := oBrw
         
               SET MESSAGE OF oWndChild TO ;
                    "Doble click le permite modificar una fila o agregar una nueva.." 2010

          ACTIVATE WINDOW oWndChild MAXIMIZED
     
          oRs:Close()
     ELSE
          oCn:ShowError()
     ENDIF
RETURN nil
//-----------------------------------------------------------------------------------------------
FUNCTION MyXEdit( oRs, aFields, aHeaders )
     LOCAL aFieldsHeaders:={}
     
     FOR i = 1 to Len( aFields )
          aAdd( aFieldsHeaders, { aFields[i], aHeaders[i] } )
     NEXT i
     oRec := FW_Record():New( oRs )        
     oRec:SetPrompt( aFieldsHeaders )
     oRec:Edit()
     
RETURN nil
//----------------------------------------------------------------------------//
 


El resultado es este en el browse:
Image

Despliega los campos, pero además despliega una columna con el array aFields.
Por otro lado si en lugar de usar un script abro cargo toda la tabla, me muestra todos los campos y no los del fieldlist, y una columna más con el array aFields.

Estoy seguro que hago algo mal, pero no me doy maña para dar con la solución (las neuronas ya no son las mismas, son muchas menos :) )

Agradeceré cualquier guía que puedan darme.
Gracias desde Ya.
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1180
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Función con xbrowse y xedit

Postby jose_murugosa » Fri Jul 07, 2023 12:11 pm

Cualquier sugerencia será altamente apreciada.
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1180
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Función con xbrowse y xedit

Postby cmsoft » Fri Jul 07, 2023 9:19 pm

Jose, prueba quitar el AUTOCOLS
User avatar
cmsoft
 
Posts: 1290
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Función con xbrowse y xedit

Postby jose_murugosa » Mon Jul 10, 2023 12:17 pm

Gracias César, lo probé eliminando esa cláusula y el resultado fue solo una columna con el array de campos.
Como pensé que el problema era el haberle mandado un array, opté por hacer al revés.
Dejé la cláusula autocol, limité las columnas en el query, y suprimí afields, dejando a headers.
Con esto el resultado fué el esperado. Muchas gracias por tu ayuda.

Lo que no he resuelto ahora, es que el xedit que se activa con dobleclick me permite navegar en la tabla, pero no modificarla ni crear registros nuevos.... en eso estoy.

MUCHAS GRACIAS CÉSAR, EFECTIVAMENTE POR ESE LADO IBAN LOS TIROS :D
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1180
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Re: Función con xbrowse y xedit

Postby cmsoft » Mon Jul 10, 2023 4:00 pm

Hola Jose:
Vos querés editar en el array o directamente en la tabla MySql?
Porque serían dos caminos distintos.
Ambas son posibles, pero si pasas todo a un array, despues vas a tener que volcar el resultado en la tabla MySql.
Si lo haces directamente desde la tabla MySql, evitarias ese ultimo paso.
Este ejemplo (muy sencillo) lo hace desde la query
Code: Select all  Expand view  RUN

#include "tdolphin.ch"
#include "fivewin.ch"
function Test()

   local oCn, oRs
   local oDlg, oBrw
   
   CONNECT oCn HOST 'localhost' ;
                      USER 'user' ;
                      PASSWORD 'password' ;
                      PORT 3306;
                      FLAGS 0;
                      DATABASE 'test'
   oRs   := oCn:Query("select STATE, CITY,FIRST,LAST, STREET, ZIP, AGE, SALARY  from customer order by state")
   oRs:SetOrder("STATE")
   oRs:GoTop()

   DEFINE DIALOG oDlg SIZE 800,400 PIXEL TRUEPIXEL
   @ 60,20 XBROWSE oBrw SIZE -20,-20 PIXEL OF oDlg ;
      DATASOURCE oRs  ;
      COLUMNS "STATE", "CITY","FIRST","LAST", "STREET", "ZIP", "AGE";
      PICTURES "","","","","","","9999";
      CELL LINES NOBORDER ON DBLCLICK(oBrw:Edit(.f.,.t.))
   oBrw:lDisplayZeros   := .f.
   oBrw:CreateFromCode()
   ACTIVATE DIALOG oDlg CENTERED
oRs:End()
oCn:End()
return nil
 
User avatar
cmsoft
 
Posts: 1290
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Función con xbrowse y xedit

Postby jose_murugosa » Mon Jul 10, 2023 5:10 pm

César, lo que cargo en el browse es un RowSet de la clase nativa de Fivewin, es decir el equivalente a un RecordSet de la clase TDolphin.
Gracias a tu ayuda y algo de sudor ahora el browse funciona perfectamente.
En el método dblclick de este browse he llamado la función FW_Record, con el fin de poder editar el registro en el que me encuentro por ese medio.
Pero me despliega la información pero no me permite insertar un registro nuevo ni actualizar el registro donde me encuentro.
Me parece más claro y seguro para el usuario.

No he entendido bien porque no me permite editar el rowset.

El script es así:
'SELECT l.id, l.lugar, l.numerodellaves FROM llaves AS l ORDER BY l.id'
oRs:= oCn:Rowset( aSql, .t. )
oRs es el rowset resultante.

en el método dblblick del browse ejecuto el FW_Record así

ON DBLCLICK MyXedit( oRs, aFields, aHeaders )

esta es la función:

Code: Select all  Expand view  RUN

FUNCTION MyXEdit( oRs, aFields, aHeaders )
     LOCAL aFieldsHeaders:={}

     FOR i = 1 to Len( aFields )
          aAdd( aFieldsHeaders, { aFields[i], aHeaders[i] } )
     NEXT i
     oRec  := FW_Record():New( oRs )
     oRec:SetPrompt( aFieldsHeaders )
     oRec:Edit()
RETURN nil
 


Si ves el error te agradezco me lo hagas saber.
Saludos/Regards,
José Murugosa
"Los errores en programación, siempre están entre la silla y el teclado y la IA!!"
User avatar
jose_murugosa
 
Posts: 1180
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 23 guests