ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby joseluisysturiz » Thu Oct 29, 2015 4:01 pm

ACTUALIZAR DATOS DINAMICAMENTE EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Saludos, tengo creado un xbrowse con data de una consulta Mysql con TDolphin, las primeras 4 columnas, 1 es numero de filas del xbrw y las 3 siguiente son campos de la consulta(tabla), luego adiciono una 5ta. columna que inicializo sus valores con ceros, pero que debo reemplazarlos basado en operaciones posteriores, en otra funcion trato de actualizar esta 5ta. columna con oBrw:aArrayData[oBrw:nArrayAt, 5] := xValor, pero me da error, tambien intente con oBrw:aCols[5]:Value := xValor, tambien error.
La pregunta de las mil lochas es: puedo o no modificar el valor de la 5ta.columna que no es de un campo de la consulta o estoy inventando loquera.? por los momentos lo resolvi cambiando el xBrw a un array en vez de un Qry, pero es mas trabajo y lo necesito con el Qry. Espero sus comentarios y sugerencias, dejo el codigo del xBrw, gracias, saludos... :shock:

Code: Select all  Expand view

   aCampos := {"productos_id", "productos_nombre", "productos_pvp"}
   oBrwMenu := TXBrowse():New( oDlg )

   WITH OBJECT oBrwMenu
      :SetDolphin( oQryPro, .t., .t., aCampos )
      :nMarqueeStyle    := MARQSTYLE_HIGHLROW
      :nColDividerStyle := LINESTYLE_BLACK
      :lAllowColSwapping := .f.
      :lAllowColHiding := .f.
      :lColDividerComplete := .t.
      :nHeaderHeight := 30
      :l2007 := .t.
      :lFooter := .f.
      :lRecordSelector := .t.
      :bClrStd := {|| IF( oQryPro:RecNo() % 2 == 0, {0, RGB(255, 255, 255)} ,;
         {0, RGB(203,226,254)} ) }
      :bLDblClick := {|| add_producto_pedido( oQryPro, oBrwPed, aVarPed, aGetPed, aVar, oBrwMenu ) ,;
         aVar[2] := 1, aGet[2]:REFRESH(), oBrwPed:SETFOCUS() }
      :bKeyDown := {|nKey| IF( nKey == VK_RETURN ,;
         ( add_producto_pedido( oQryPro, oBrwPed, aVarPed, aGetPed, aVar, oBrwMenu ), aVar[2] := 1 ,;
         aGet[2]:REFRESH(), oBrwPed:SETFOCUS() ), ) }
   END WITH

   ADD TO oBrwMenu AT 1 DATA StrZero( oBrwMenu:KeyNo(), 2 )
   oBrwMenu:aCols[1]:cHeader       := "Reg."
   oBrwMenu:aCols[1]:nHeadStrAlign := AL_CENTER
   oBrwMenu:aCols[1]:nDataStrAlign := AL_CENTER
   oBrwMenu:aCols[1]:nWidth        := 30

   oBrwMenu:aCols[2]:cHeader       := "Código"
   oBrwMenu:aCols[2]:bStrData      := {|| IIF( oQryPro:LastRec() = 0, SPACE(10) ,;
                                             STRZERO( oQryPro:productos_id, 5 ) ) }
   oBrwMenu:aCols[2]:nHeadStrAlign := AL_CENTER
   oBrwMenu:aCols[2]:nDataStrAlign := AL_CENTER
   oBrwMenu:aCols[2]:nWidth        := 60

   oBrwMenu:aCols[3]:cHeader       := "Nombres del Producto"
   oBrwMenu:aCols[3]:bStrData      := {|| IIF( oQryPro:LastRec() = 0, SPACE(10) ,;
                                             oQryPro:productos_nombre ) }
   oBrwMenu:aCols[3]:nHeadStrAlign := AL_CENTER
   oBrwMenu:aCols[3]:nDataStrAlign := AL_LEFT
   oBrwMenu:aCols[3]:nWidth        := 255

   oBrwMenu:aCols[4]:cHeader       := "PVP"
   oBrwMenu:aCols[4]:bStrData      := {|| IIF( oQryPro:LastRec() = 0, SPACE(10) ,;
                                             TRANS( oQryPro:productos_pvp, "@E 99,999.99" ) ) }
   oBrwMenu:aCols[4]:nHeadStrAlign := AL_CENTER
   oBrwMenu:aCols[4]:nDataStrAlign := AL_RIGHT
   oBrwMenu:aCols[4]:nWidth        := 70

[b]// COLUMNAS ADICIONALES, 5TA.COLUMNAS QUE QUIERO CAMBIAR SU VALOR DINAMICAMENTE...[/b]
   oCol := oBrwMenu:AddCol()
   oCol:cHeader       := "Tot.PVP"
   oCol:bStrData      := {|| IIF( oQryPro:LastRec() = 0, SPACE(10) ,;
                              TRANS( 0, "@E 99,999.99" ) ) }
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nWidth        := 70
//
   oCol := oBrwMenu:AddCol()
   oCol:cHeader       := "Ing"
   oCol:nHeadStrAlign := AL_CENTER
   oCol:AddResource( "PRODUC16" ) // MUESTRA BMP CON DATA
   oCol:nBtnBmp := 1 // COLOCA IMAGEN AL BOTON
   oCol:nEditType     := EDIT_BUTTON // BOTON EN LA MISMA DATA
   oCol:bEditBlock    := { | oCol | select_ingre_menu( aVar, aGet, oQryPro, oBrwIP ) } // ACCION A REALIZAR PULSAR BOTON
   oCol:nWidth        := 25
   oCol:cToolTip      := "Pulse Boton para Ingredientes"
//
   oCol := oBrwMenu:AddCol()
   oCol:cHeader       := "Add"
   oCol:nHeadStrAlign := AL_CENTER
   oCol:AddResource( "SUMAR16" ) // MUESTRA BMP CON DATA
   oCol:nBtnBmp := 1 // COLOCA IMAGEN AL BOTON
   oCol:nEditType     := EDIT_BUTTON // BOTON EN LA MISMA DATA
   oCol:bEditBlock    := { | oCol | add_producto_pedido( oQryPro, oBrwPed, aVarPed, aGetPed, aVar, oBrwMenu ) } // ACCION A REALIZAR PULSAR BOTON
   oCol:nWidth        := 25
   oCol:cToolTip      := "Pulse Boton para Agregar este Producto"

   oBrwMenu:CreateFromResource(100)
 
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby FranciscoA » Thu Oct 29, 2015 11:42 pm

José Luis.
Utilizo TMySql. He intentado lo que describes, pero no lo he conseguido. Aunque no me da ningún error, no hace nada; el browse no cambia.

¿Cual es el error que te presenta?
El valor que le envía la función que mencionas, asumo que es numérico.
Saludos
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2111
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby joseluisysturiz » Fri Oct 30, 2015 12:33 am

FranciscoA wrote:José Luis.
Utilizo TMySql. He intentado lo que describes, pero no lo he conseguido. Aunque no me da ningún error, no hace nada; el browse no cambia.

¿Cual es el error que te presenta?
El valor que le envía la función que mencionas, asumo que es numérico.
Saludos


Francisco, cuando el xBrowse contiene completamente una consulta no se pueden modificar los valores de los registros ya que es como si esta de SOLO LECTURA, es solo consulta, launica forma es yendo primero a la tabla y luego actualizando el query, asi si trabaja, es mi caso no puedo hacer eso ya que la data es parte de una consulta y la otra no, esa que no es, es la que necesito cambiar, cuando lo intento asume que es un OBJETO y que no soporta el tipo de dato que le envio, sea numerico o strin, da igual, he puesto la columna con ambos tipos de valores y el reseultado erroneo es el mismo, asumo que la columna se conporta de igual manera que las que son del Query, por eso por los momentos estoy resolviendo alimentando un array con los datos del query y ese array al xBrowse, haber si alguien mas da algun comentario o idea, gracias, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby FranciscoA » Fri Oct 30, 2015 3:38 am

joseluisysturiz wrote
Francisco, cuando el xBrowse contiene completamente una consulta no se pueden modificar los valores de los registros ya que es como si esta de SOLO LECTURA, es solo consulta, launica forma es yendo primero a la tabla y luego actualizando el query, asi si trabaja, es mi caso no puedo hacer eso ya que la data es parte de una consulta y la otra no, esa que no es, es la que necesito cambiar, cuando lo intento asume que es un OBJETO y que no soporta el tipo de dato que le envio, sea numerico o strin, da igual, he puesto la columna con ambos tipos de valores y el reseultado erroneo es el mismo, asumo que la columna se conporta de igual manera que las que son del Query, por eso por los momentos estoy resolviendo alimentando un array con los datos del query


Jose Luis.
Soy de los que creen que en programación se pueden hacer muuuuuchassss cosas.
He estado dandole vueltas al asunto, y creo que tiene solución.
¿Podrías postear esa function donde tratas de actualizar tu columna 5?
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2111
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby FranciscoA » Fri Oct 30, 2015 3:41 am

Upps...
Te he solicitado esa function para asegurarme que es lo que hace, y poderla adaptar al código que he hecho, de manera tal que la solución que pueda ofrecer sea la mas acertada (de acuerdo a mis conocimientos), ya que no dudo que pueden haber otras mejores.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2111
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby cmsoft » Fri Oct 30, 2015 4:35 pm

Lo que podes hacer es crear una tabla temporal y llenarla con los datos de la consulta, y luego hacer el browse sobre dicha tabla temporal, y ahi si te va a dejar hacer los cambios que deseas.
Code: Select all  Expand view
oApp:oServer:Execute(   "CREATE TEMPORARY TABLE IF NOT EXISTS `transi` ("+;
                           "`numero` INT(8) NOT NULL,"+;
                           "`dato1`   VARCHAR(3) ,"+;
                           "`dato2`   INT(8) NOT NULL,"+;
                           "`dato3` DATE ,"+;
                           "`dato4`   INT(3) NOT NULL,"+;
                           "PRIMARY KEY (`numero`) "+;
                           ") ENGINE=INNODB DEFAULT CHARSET=latin1")
oApp:oServer:Execute("INSERT INTO transi (numero,dato1,dato2,dato3,dato4)"+;
                        "SELECT s.numero,a.dnit,a.dnin,a.fecnac,"+;                      
                        "s.codafi "+;
                        "FROM solidet s "+;
                        "LEFT JOIN afiliado a ON a.codigo = s.codafi "+;
                        "LEFT JOIN catego c ON c.codigo = a.codcat "+;
                        "LEFT JOIN solicit s1 ON s1.numero = s.numero "+;
                        "WHERE s.numero = " +ClipValue2Sql(nnumero)")
oQryBrw1:= oApp:oServer:Query( "
SELECT * FROM transi ORDER BY numero")
.
.
.
REDEFINE XBROWSE oBrw1 DATASOURCE oQryBrw1;
          COLUMNS "
numero","dato1","dato2","dato3","dato4";
          HEADERS "
Numero","Dato 1","Dato 2","Dato 3","Dato 4";
          SIZES 50,40,50,90,70;
          ID 139 OF oDlg AUTOSORT

Espero te sirva la idea.
Saludos
User avatar
cmsoft
 
Posts: 1191
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby FranciscoA » Fri Oct 30, 2015 5:21 pm

cmsoft wrote:Lo que podes hacer es crear una tabla temporal y llenarla con los datos de la consulta, y luego hacer el browse sobre dicha tabla temporal, y ahi si te va a dejar hacer los cambios que deseas.
Code: Select all  Expand view
oApp:oServer:Execute(   "CREATE TEMPORARY TABLE IF NOT EXISTS `transi` ("+;
                           "`numero` INT(8) NOT NULL,"+;
                           "`dato1`   VARCHAR(3) ,"+;
                           "`dato2`   INT(8) NOT NULL,"+;
                           "`dato3` DATE ,"+;
                           "`dato4`   INT(3) NOT NULL,"+;
                           "PRIMARY KEY (`numero`) "+;
                           ") ENGINE=INNODB DEFAULT CHARSET=latin1")
oApp:oServer:Execute("INSERT INTO transi (numero,dato1,dato2,dato3,dato4)"+;
                        "SELECT s.numero,a.dnit,a.dnin,a.fecnac,"+;                      
                        "s.codafi "+;
                        "FROM solidet s "+;
                        "LEFT JOIN afiliado a ON a.codigo = s.codafi "+;
                        "LEFT JOIN catego c ON c.codigo = a.codcat "+;
                        "LEFT JOIN solicit s1 ON s1.numero = s.numero "+;
                        "WHERE s.numero = " +ClipValue2Sql(nnumero)")
oQryBrw1:= oApp:oServer:Query( "
SELECT * FROM transi ORDER BY numero")
.
.
.
REDEFINE XBROWSE oBrw1 DATASOURCE oQryBrw1;
          COLUMNS "
numero","dato1","dato2","dato3","dato4";
          HEADERS "
Numero","Dato 1","Dato 2","Dato 3","Dato 4";
          SIZES 50,40,50,90,70;
          ID 139 OF oDlg AUTOSORT

Espero te sirva la idea.
Saludos


cMsoft:
Muy acertado. En mi caso, normalmente uso tablas temporales.
El caso es que me llama la atención el requerimiento de Jose Luis, y he hecho algunas pruebas.

El resultado es el siguiente: (solo demuestra que se puede modificar datos en la columna que no es de la consulta, pero solo para reemplazar todas las lineas de esa columna en el browse)

Code: Select all  Expand view
//-----------------------------
FUNCTION PRUEBA()
LOCAL oC:=oServer:Query("SELECT * FROM recibosc LIMIT 6 ;")
local oDlg, oBrw, oCol

  XbrNumFormat( 'A', .t. )
  DEFINE DIALOG oDlg RESOURCE "ENTRADAS" TITLE "PRUEBA"  TRANSPARENT

  REDEFINE XBROWSE oBrw ID 181 OF oDlg ;  
      COLUMNS "FECHEMIS","NUMDOC","HABER" ;
      OBJECT oC CELL LINES

  oBrw:SetMySql(oC,.f.)

   oCol := oBrw:AddCol()
   oCol:cHeader       := "PRUEBA"
   oCol:bEditValue      := {|| 0 }
   oCol:cEditPicture    := "@Z 99,999.99"
   oCol:nHeadStrAlign := AL_CENTER
   oCol:nDataStrAlign := AL_RIGHT
   oCol:nWidth        := 70

  REDEFINE BUTTONBMP PROMPT "Calcular" ID 230 OF oDlg ACTION ( oCol:bEditValue := {|| CALCULE(oC,.t.) }, oBrw:Refresh() )
  REDEFINE BUTTONBMP PROMPT "Borrar"   ID 231 OF oDlg ACTION ( oCol:bEditValue := {|| 0 }, oBrw:Refresh() )
  REDEFINE BUTTONBMP PROMPT "Salir  "  ID 235 OF oDlg ACTION ( oDlg:End() )

  ACTIVATE DIALOG oDLG CENTERED

  XXX(oBrw)

  oC:End()
RETURN NIL
//--------------------------------
FUNCTION CALCULE(oC,lCalc)
Return  if(lCalc, oC:Haber * 2, 0)
//--------------------------------
function XXX(oBrw)
local n,aa:={}  
oBrw:GoTop()
for n:=1 to oBrw:nLen
   aadd(aa,oBrw:Prueba:Value)
   oBrw:Skip()
next
xBrowse(aa,"Prueba")
return nil

 

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2111
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby FranciscoA » Fri Oct 30, 2015 5:45 pm

José Luis.
Por otro lado, si usas tabla temporal, como sugiere cmsoft, podrías hacer lo siguiente:

Crear la tempo basada en la consulta, e inmediatamente modificarla, agregando las columnas que necesitas.

Ej:
Code: Select all  Expand view
 cTbTemp :=cCreaTbTemp("TablaFuente",.t.)   //function de usuario para crear tablas temporales

 oServer:Query("ALTER TABLE " +cTbTemp+ " ADD TuColumna NUMERIC(10,2) NULL DEFAULT 0.00 ;")   //aqui la modificamos

  oTbTemp:= oServer:Query("SELECT * FROM " + cTbTemp + ";")    // aqui hacemos la consulta, ya con las columnas agregadas
 

Espero te sirva de guía.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2111
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: ACTUALIZAR DATOS EN COLUMNA ADICIONAL DE XBROWSE CON QUERY

Postby joseluisysturiz » Fri Oct 30, 2015 8:42 pm

Francisco, cMsoft, hacer lo de la tabla temporal tambien ya lo pense pero no me sirve, voy colocar una imagen haber si se entiende mejor lo que requeria, como ya dije antes alimentando el array con el Query y esta se refresca cada vez que hay ciertos cambios, esta trabajando todo bien.
Cual es el punto, el sistema es algo sistema venta de piza, pero en este caso con cachapas (producto de maiz), hay un menu de los productos que se ofrecen y al igual que una piza se van agregando ingredientes y estos hacen que el producto vaya cambando de precio ya que cada ingrediente tiene un precio, pero a la vez estos ingredientes se pueden ir acabando y el sistema de forma automatica controla la existencia, si ya no queda lo saca de los ingredientes para la ( piza/cachapa ) y a su vez un producto principal tambien se puede acabar y hay que sacarlo del menu, por eso es que se actualiza el query cada momento, ya que venden varias personas a la vez, si trabajo con una tabla temporal veo en su momento solo lo que esta contiene y no los datos de existencia reales, se que las consultas en si no se les pueden modificar las columnas, pero el caso es que esta columna no es de la consulta y debo cambiar su valor dinamicamente ya que es donde da el precio final del producto con sus ingredientes...como repito, con el array esta funcionando bien, pero para hacer los WHERE del menu tengo que estar vaciando y llenando el array cada momento con los datos necesarios...si hay solucion lo cambiare luego, si no...ni modo, trabajare como esta en estos momento, igual gracias a ambos por las ideas...

Francisco, para la intencion de cambiar la columna que no es del query cuando estaba el query, es simplemente como lo expuse antes en una linea:

oBrw:aArrayData[oBrw:nArrayAt, 5] := xValor
o
oBrw:aCols[5]:Value := xValor

con el array funciona muy bien

Code: Select all  Expand view

oBrwMnu:aArrayData[oBrwMnu:nArrayAt, 5] := oBrwIP:aCols[5]:nTotal + oBrwMnu:aArrayData[oBrwMnu:nArrayAt, 4]

// COLUMNA ADICIONAL EN LE xBrwMenu que no es de la consulta...
oBrwMnu:aArrayData[oBrwMnu:nArrayAt, 5]

// VALORES POR LOS CUALES REEMPLAZO DESDE OTRO Xbrw
oBrwIP:aCols[5]:nTotal + oBrwMnu:aArrayData[oBrwMnu:nArrayAt, 4]
 
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 12 guests