Page 1 of 1

Xbrowse que no se deja editar

Posted: Fri Dec 17, 2021 4:45 pm
by jose_murugosa
Tengo este código:

Code: Select all | Expand


function PlanillaMantDiarios( oCn )
     LOCAL oDlg, oFont1, oFont2, oFont3, oBrw, oRs, csql, oGet:={}
     oGet:=Array(2)
     
     cSql := "SELECT * FROM mantenimientos JOIN planilla JOIN maquinas JOIN sectores ON ( mantenimientos.mant_id = planilla.plaMant_id and mantenimientos.mantMaq_id = maquinas.Maq_id and mantenimientos.mantSector_id = sectores.Sector_ID ) WHERE ( planilla.pla_mes = 11 and planilla.pla_anio = 2021 )"
     oRs := oCn:RowSet( cSql )

     DEFINE DIALOG oDlg RESOURCE "DLG_PLAMDIARIOS" TITLE "Planilla de Mantenimientos Diarios"
     
          REDEFINE GET oGet[1] VAR wmes id 101 picture "99" of oDlg
          REDEFINE GET oGet[2] VAR wanio id 102 picture "9999" of oDlg

          REDEFINE XbROWSE oBrw id 201 of oDlg DATASOURCE oRs         ;
               COLUMNS "mant_nombre", "pla_mes", "pla_anio", "Sector_Nombre", "D1", "D2",                               ;
                    "D3",  "D4",  "D5",  "D6",  "D7",  "D8",  "D9",  "D10", "D11", "D12",                               ;
                    "D13", "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22",                               ;
                    "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31"                                       ;
               HEADERS "Mantenimiento:", "Mes:", "Año:", "Sector:", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",     ;
                    "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"   ;
               SIZES 320, 30, 40, 120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  ;
                    20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20                                                          
               FASTEDIT
 
          WITH OBJECT oBrw
               :nEditTypes    := EDIT_GET
               :SetChecks( nil, .t. )
               :nfreeze := 4
               :lEdit:=.t.
          END WITH
         
     ACTIVATE DIALOG oDlg CENTER
     oRs:Close()
RETURN nil
 


No me deja editar las celdas excepto la primera y no encuentro porqué, quizá alguien de foro me pueda dar una mano por favor.

Re: Xbrowse que no se deja editar

Posted: Fri Dec 17, 2021 5:46 pm
by Antonio Linares
Prueba a quitar esto o a cambiarlo

:nfreeze := 4

Re: Xbrowse que no se deja editar

Posted: Fri Dec 17, 2021 6:12 pm
by jose_murugosa
Antonio Linares wrote:Prueba a quitar esto o a cambiarlo

:nfreeze := 4



Gracias por tu respuesta Antonio, pero sigue igual :(

Re: Xbrowse que no se deja editar

Posted: Fri Dec 17, 2021 6:52 pm
by jose_murugosa
la consulta involucra 4 tablas, y los campos del xbrowse pertenecen a las 4, aunque ningun nombre se superpone porque yo nombro los campos con la abreviatura de la tabla, sucede que los campos que quedan editables son los de la tabla del select, pero todas las tablas de los joins, sus campos no se pueden editar.

Si pongo el nombre de la tabla punto el nombre del campo entre comillas, el campo no se muestra pero permite editar, la verdad estoy desconcertado.

xBrowse es sumamente potente, he visto lo que puede hacer y me fascina, pero la verdad para mi como novato en su uso, me ha resultado algo problemático, obviamente por mi ignorancia.

Creo que porque me ha resultado dificil de interpretar la documentación disponible.

Agradezco vuestra paciencia.

Re: Xbrowse que no se deja editar

Posted: Fri Dec 17, 2021 9:55 pm
by cmsoft
Cuando es una consulta convinada, tengo entendido que no deja editar directamente, porque no hace referencia a una sola tabla.
Una practica que yo uso es, generar una tabla temporal con el resultado de la consulta convinada, y editar esa tabla temporal.
Si el usuario decide grabar, ahi hago el pasaje a las tablas correspondientes.
Te muestro un ejemplo:

Code: Select all | Expand


********************************************
** Liquidaciones de sueldos
STATIC FUNCtION Liquida()
LOCAL oQry, oDlg1, oFont, acor:= ARRAY(4), nMes:=MONTH(DATE()), nAno := YEAR(DATE()), mrta:=.F., oGet:= ARRAY(6),;
      oBot1, oBot2, oBrwLiq, aLiqu, nSub := 0, dFecha := DATE(), oQryE , cDetalle := SPACE(30), oError

oApp:oServer:Execute("CREATE TEMPORARY TABLE IF NOT EXISTS `transi_liqemp` ("+;
                           "`codemp` INT(6) DEFAULT 0 NOT NULL, "+;
                           "`nombre` VARCHAR(40) , "+;
                           "`sueldo` DECIMAL(10,2) DEFAULT 0 NOT NULL, "+;                          
                           "`extras` DECIMAL(10,2) DEFAULT 0 NOT NULL, "+;                          
                           "`total`  DECIMAL(10,2) DEFAULT 0 NOT NULL "+;                                                      
                           ") ENGINE=INNODB DEFAULT CHARSET=utf8")
oApp:oServer:NextResult()
oApp:oServer:Execute("TRUNCATE transi_liqemp")
oApp:oServer:NextResult()
oApp:oServer:Execute(" INSERT INTO transi_liqemp (SELECT codigo,nombre,sueldo,0 as extra,sueldo as total FROM re_emp_empleado ORDER BY nombre)")
oQryE := oApp:oServer:Query("SELECT * FROM transi_liqemp")
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-11.5
DEFINE DIALOG oDlg1 TITLE "Carga de Liquidación de Sueldos" FROM 03,15 TO 30,100
   acor := AcepCanc(oDlg1)      
   @ 07, 05 SAY "Periodo:"                OF oDlg1 PIXEL SIZE 50,20 RIGHT
   @ 22, 05 SAY "SubLiq.:"                OF oDlg1 PIXEL SIZE 50,20 RIGHT
   @ 22, 75 SAY "Fecha Imputación:"       OF oDlg1 PIXEL SIZE 50,20 RIGHT
   @ 37, 05 SAY "Detalle:"                OF oDlg1 PIXEL SIZE 50,20 RIGHT


   @ 05, 60 GET oGet[01] VAR nMes     OF oDlg1 PIXEL PICTURE "99" VALID(nMes>0 .and. nMes < 13) RIGHT
   @ 05,100 GET oGet[02] VAR nAno     OF oDlg1 PIXEL PICTURE "9999" RIGHT
   @ 20, 60 GET oGet[03] VAR nSub     OF oDlg1 PIXEL PICTURE "99" RIGHT                      
   @ 20,130 GET oGet[04] VAR dFecha   OF oDlg1 PIXEL PICTURE "@D" CENTER  
   @ 35, 60 GET oGet[05] VAR cDetalle OF oDlg1 PIXEL PICTURE "@!"          

   @ 55, 05 XBROWSE oBrwLiq SIZE 315,100 pixel OF oDlg1 DATASOURCE oQryE ;
      HEADERS "Empleado", "Sueldo","Extras","Total";
      COLUMNS "nombre", "sueldo" ,"extras", "total";
      FOOTERS;
      CELL LINES NOBORDER UPDATE
   WITH OBJECT oBrwLiq
      :aCols[2]:nFooterType := AGGR_SUM
      :aCols[3]:nFooterType := AGGR_SUM
      :aCols[4]:nFooterType := AGGR_SUM
      :aCols[2]:cEditPicture := "999999.99"
      :aCols[3]:cEditPicture := "999999.99"
      :aCols[4]:cEditPicture := "999999.99"
      :nMoveType := 1
      :aCols[2]:nEditType := EDIT_GET
      :aCols[2]:bOnPostEdit := {|oCol, xVal, nKey | (CambiaValor(1,xval,oQryE,oBrwLiq,oGet[1]))}
      :aCols[3]:nEditType := EDIT_GET
      :aCols[3]:bOnPostEdit := {|oCol, xVal, nKey | (CambiaValor(2,xval,oQryE,oBrwLiq,oGet[1]))}
      :MakeTotals()
      :CreateFromCode()
   END  
   PintaBrw(oBrwLiq,0)
   
   @ acor[1],acor[2] BUTTON oBot1 PROMPT "&Grabar" OF oDlg1 SIZE 30,10 ;
           ACTION ((mrta := .t.), oDlg1:End() ) PIXEL
   @ acor[3],acor[4] BUTTON oBot2 PROMPT "&Cancelar" OF oDlg1 SIZE 30,10 ;
           ACTION ((mrta := .f.), oDlg1:End() ) PIXEL
ACTIVATE DIALOG oDlg1 CENTER
IF !mrta
   RETURN  NIL
ENDIF
// Valido si hay liquidacion
IF oApp:oServer:Query("SELECT * FROM re_emp_liqsueldo WHERE mes = " + ClipValue2Sql(nMes)+;
                      " AND ano = " + ClipValue2Sql(nAno)+ " AND sub = "+ClipValue2Sql(nSub)):nRecCount > 0
   mrta := MsgNoYes("Existe ya esa liquidacion!"+chr(10)+"Desea reemplazarla por esta??","Atencion")
   IF !mrta
      RETURN nil
   ENDIF
ENDIF
TRY

  oApp:oServer:BeginTransaction()
  oApp:oServer:Execute("DELETE FROM re_emp_liqsueldo WHERE mes = " + ClipValue2Sql(nMes)+;
                      " AND ano = " + ClipValue2Sql(nAno)+ " AND sub = "+ClipValue2Sql(nSub))
  oApp:oServer:Execute("INSERT INTO re_emp_liqsueldo (mes,ano,sub,codemp,fecha,sueldo,extras,total,observa,usuario) "+;
                       " (SELECT "+ClipValue2Sql(nMes)+","+ ClipValue2Sql(nAno)+","+ClipValue2Sql(nSub)+",codemp,"+;
                       ClipValue2Sql(dFecha)+",sueldo,extras,total,"+ClipValue2Sql(cDetalle)+"," + ClipValue2Sql(oApp:usuario)+;
                       " FROM transi_liqemp)")
  oApp:oServer:CommitTransaction()
  MsgInfo("Proceso Terminado con Exito!","Atencion")
CATCH oError
    ValidaError(oError)
END TRY      

RETURN nil
 

Yo uso Dolphin porque no tengo la ultima version de Fivewin, no te quiero confundir... Pero es una opcion para lo que necesitas.

Re: Xbrowse que no se deja editar

Posted: Mon Dec 20, 2021 11:43 am
by jose_murugosa
cmsoft wrote:Cuando es una consulta convinada, tengo entendido que no deja editar directamente, porque no hace referencia a una sola tabla.
Una practica que yo uso es, generar una tabla temporal con el resultado de la consulta convinada, y editar esa tabla temporal.
Si el usuario decide grabar, ahi hago el pasaje a las tablas correspondientes.
Te muestro un ejemplo:

Code: Select all | Expand


********************************************
** Liquidaciones de sueldos
STATIC FUNCtION Liquida()
LOCAL oQry, oDlg1, oFont, acor:= ARRAY(4), nMes:=MONTH(DATE()), nAno := YEAR(DATE()), mrta:=.F., oGet:= ARRAY(6),;
      oBot1, oBot2, oBrwLiq, aLiqu, nSub := 0, dFecha := DATE(), oQryE , cDetalle := SPACE(30), oError

oApp:oServer:Execute("CREATE TEMPORARY TABLE IF NOT EXISTS `transi_liqemp` ("+;
                           "`codemp` INT(6) DEFAULT 0 NOT NULL, "+;
                           "`nombre` VARCHAR(40) , "+;
                           "`sueldo` DECIMAL(10,2) DEFAULT 0 NOT NULL, "+;                          
                           "`extras` DECIMAL(10,2) DEFAULT 0 NOT NULL, "+;                          
                           "`total`  DECIMAL(10,2) DEFAULT 0 NOT NULL "+;                                                      
                           ") ENGINE=INNODB DEFAULT CHARSET=utf8")
oApp:oServer:NextResult()
oApp:oServer:Execute("TRUNCATE transi_liqemp")
oApp:oServer:NextResult()
oApp:oServer:Execute(" INSERT INTO transi_liqemp (SELECT codigo,nombre,sueldo,0 as extra,sueldo as total FROM re_emp_empleado ORDER BY nombre)")
oQryE := oApp:oServer:Query("SELECT * FROM transi_liqemp")
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-11.5
DEFINE DIALOG oDlg1 TITLE "Carga de Liquidación de Sueldos" FROM 03,15 TO 30,100
   acor := AcepCanc(oDlg1)      
   @ 07, 05 SAY "Periodo:"                OF oDlg1 PIXEL SIZE 50,20 RIGHT
   @ 22, 05 SAY "SubLiq.:"                OF oDlg1 PIXEL SIZE 50,20 RIGHT
   @ 22, 75 SAY "Fecha Imputación:"       OF oDlg1 PIXEL SIZE 50,20 RIGHT
   @ 37, 05 SAY "Detalle:"                OF oDlg1 PIXEL SIZE 50,20 RIGHT


   @ 05, 60 GET oGet[01] VAR nMes     OF oDlg1 PIXEL PICTURE "99" VALID(nMes>0 .and. nMes < 13) RIGHT
   @ 05,100 GET oGet[02] VAR nAno     OF oDlg1 PIXEL PICTURE "9999" RIGHT
   @ 20, 60 GET oGet[03] VAR nSub     OF oDlg1 PIXEL PICTURE "99" RIGHT                      
   @ 20,130 GET oGet[04] VAR dFecha   OF oDlg1 PIXEL PICTURE "@D" CENTER  
   @ 35, 60 GET oGet[05] VAR cDetalle OF oDlg1 PIXEL PICTURE "@!"          

   @ 55, 05 XBROWSE oBrwLiq SIZE 315,100 pixel OF oDlg1 DATASOURCE oQryE ;
      HEADERS "Empleado", "Sueldo","Extras","Total";
      COLUMNS "nombre", "sueldo" ,"extras", "total";
      FOOTERS;
      CELL LINES NOBORDER UPDATE
   WITH OBJECT oBrwLiq
      :aCols[2]:nFooterType := AGGR_SUM
      :aCols[3]:nFooterType := AGGR_SUM
      :aCols[4]:nFooterType := AGGR_SUM
      :aCols[2]:cEditPicture := "999999.99"
      :aCols[3]:cEditPicture := "999999.99"
      :aCols[4]:cEditPicture := "999999.99"
      :nMoveType := 1
      :aCols[2]:nEditType := EDIT_GET
      :aCols[2]:bOnPostEdit := {|oCol, xVal, nKey | (CambiaValor(1,xval,oQryE,oBrwLiq,oGet[1]))}
      :aCols[3]:nEditType := EDIT_GET
      :aCols[3]:bOnPostEdit := {|oCol, xVal, nKey | (CambiaValor(2,xval,oQryE,oBrwLiq,oGet[1]))}
      :MakeTotals()
      :CreateFromCode()
   END  
   PintaBrw(oBrwLiq,0)
   
   @ acor[1],acor[2] BUTTON oBot1 PROMPT "&Grabar" OF oDlg1 SIZE 30,10 ;
           ACTION ((mrta := .t.), oDlg1:End() ) PIXEL
   @ acor[3],acor[4] BUTTON oBot2 PROMPT "&Cancelar" OF oDlg1 SIZE 30,10 ;
           ACTION ((mrta := .f.), oDlg1:End() ) PIXEL
ACTIVATE DIALOG oDlg1 CENTER
IF !mrta
   RETURN  NIL
ENDIF
// Valido si hay liquidacion
IF oApp:oServer:Query("SELECT * FROM re_emp_liqsueldo WHERE mes = " + ClipValue2Sql(nMes)+;
                      " AND ano = " + ClipValue2Sql(nAno)+ " AND sub = "+ClipValue2Sql(nSub)):nRecCount > 0
   mrta := MsgNoYes("Existe ya esa liquidacion!"+chr(10)+"Desea reemplazarla por esta??","Atencion")
   IF !mrta
      RETURN nil
   ENDIF
ENDIF
TRY

  oApp:oServer:BeginTransaction()
  oApp:oServer:Execute("DELETE FROM re_emp_liqsueldo WHERE mes = " + ClipValue2Sql(nMes)+;
                      " AND ano = " + ClipValue2Sql(nAno)+ " AND sub = "+ClipValue2Sql(nSub))
  oApp:oServer:Execute("INSERT INTO re_emp_liqsueldo (mes,ano,sub,codemp,fecha,sueldo,extras,total,observa,usuario) "+;
                       " (SELECT "+ClipValue2Sql(nMes)+","+ ClipValue2Sql(nAno)+","+ClipValue2Sql(nSub)+",codemp,"+;
                       ClipValue2Sql(dFecha)+",sueldo,extras,total,"+ClipValue2Sql(cDetalle)+"," + ClipValue2Sql(oApp:usuario)+;
                       " FROM transi_liqemp)")
  oApp:oServer:CommitTransaction()
  MsgInfo("Proceso Terminado con Exito!","Atencion")
CATCH oError
    ValidaError(oError)
END TRY      

RETURN nil
 

Yo uso Dolphin porque no tengo la ultima version de Fivewin, no te quiero confundir... Pero es una opcion para lo que necesitas.


Gracias por molestarte en pegar aquí parte del código que usas, lo voy a adaptar y ver que pasa, de todas maneras me encantaría si alguien que use fwmariadb de FWH puede comentar si hay algo ya implementado para estos casos.

Un abrazo y felices fiestas!! :D

Re: Xbrowse que no se deja editar

Posted: Wed Dec 22, 2021 1:33 pm
by jose_murugosa
César, Muchas gracias por tu ayuda, lo he implementado adaptandolo a FWMariaDB de FWH y funcionó bien.

Gracias por compartir tu código y consejo. :D

Re: Xbrowse que no se deja editar

Posted: Wed Dec 22, 2021 7:42 pm
by cmsoft
Me alegro que te haya sido de utilidad José!