Page 1 of 1

Resta de columnas en xBrwose

PostPosted: Mon Nov 28, 2022 11:10 pm
by JoseAlvarez
Saludos a todos, colegas y amigos.

En un xBrowse, necesito que la columna 8, en cada fila se muestre el resultado de la resta de la columna 6 menos la 7.

¿Como hacerlo?

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 1:04 pm
by cmsoft
Hola Jose:
Puedes hacer directamente que la columna que muestre sea calculada
Code: Select all  Expand view

@  1, 0.50 XBROWSE oLbx ALIAS "DATA" COLUMNS "data1","data2","valor1","valor2","valor3","valor4","valor1 - valor2" SIZE 285, 95 OF oDlg
 

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 1:42 pm
by JoseAlvarez
Hola César. como estas?

Cuando lo hago asi, me resta el valor nominal de la columna y no el valor de su contenido. Me explico:
Code: Select all  Expand view
    cT_Clientes:= _cPrefijo+'_clientes'
    cT_Facturas:= _cPrefijo+'_facturas'
    cT_Pagos   := _cPrefijo+'_pagos'

    cQuery := "SELECT "
    cQuery += "Cli.rif_cliente, "
    cQuery += "Cli.razon_social_cliente, "
    cQuery += "Fac.numero_documento, "
    cQuery += "Fac.fecha_documento, "
    cQuery += "Fac.fecha_vencimiento, "
    dHoy:=subs(dToc(_dFechaDeHoy),7,4)+"/"+subs(dToc(_dFechaDeHoy),4,2)+"/"+subs(dToc(_dFechaDeHoy),1,2)
    cQuery += "DATEDIFF('"+dHoy+"', Fac.fecha_vencimiento),"
    cQuery += "Fac.monto, "
    cQuery += "(SELECT SUM(monto_pago) FROM "+cT_Pagos+" WHERE codigo_cliente=Cli.codigo_cliente AND numero_documento=Fac.numero_documento) AS nPagos , "
    cQuery += "Fac.concepto, "
    cQuery += "Cli.codigo_cliente, "
    cQuery += "Fac.codigo_cliente "
    cQuery += "FROM "
    cQuery += cT_Clientes + " AS Cli , "
    cQuery += cT_Facturas + " AS Fac   "
    cQuery += "WHERE Fac.codigo_cliente = Cli.codigo_cliente  ;"

  TRY
      oFacturas:=_oSqlConex:Query( cQuery )
  CATCH
      Fnct_MsgErrorBD("NoMySql"  , .f. , "No hay conexión a La Base de Datos" , "Sin Acceso a La Red","Error en servicio de Datos",)
      return .f.
  END TRY

    *****************************************************************************************************************************************

  Define cursor oCursorBar       resource 'manito'
  Define cursor oCursorIndicador resource 'Indicador'
  Define Font   oFHeadBrw Name "Segoe UI SemiBold" Size 0, -14

  Define Dialog oDlg_Facturas resource "oDlg_Facturas" title 'Gestión de Documentos Por Cobrar'
       oDlg_Facturas:lHelpIcon:=.f.

         Redefine Image oSeekImage Resource "Buscar" id 15 of oDlg_Facturas

         Redefine get oGetSeek Var cSeek Id 11  of oDlg_Facturas on change (cSeek:=oGetSeek:GetText() )
         oGetSeek:SetFont(_oFontGets)
         oGetSeek:SetColorFocus( CLR_YELLOW )
         
         Redefine xBrowse oBrwFacturas Id 4007  DATASOURCE oFacturas AUTOCOLS AUTOSORT ;
                                                                     COLUMNS 1, 2, 3, 4, 5, 6, 7, 8, (7-8), 9, 10, 1  ;
                                          HEADERS      _cIdEmpresa, "Cliente", "N# Doc. ","Emisión", "Vencto.", "Dias Vcdo.", ;
                                                       "Monto "+_cSignoMoneda , "Pagos", "Saldo Doc.", "Concepto"

 



Image


Como puedes ver, las columnas a restar son la 8 menos la 7 y lo que muestra es -1 (8 - 7 = -1)

¿Cual es la manera correcta para que funcione? ¿Tendra que ver que la columna 8 es el resultado de un subconsulta y no el campo de una tabla?

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 3:19 pm
by JoseAlvarez
Cesar, hice lo que me indicaste. Sustitui el valor numerico de las columnas por su nombre, esta vez me da error al momento de aplicar la resta.

Code: Select all  Expand view
Redefine xBrowse oBrwFacturas Id 4007  DATASOURCE oFacturas AUTOCOLS AUTOSORT COLUMNS "rif_cliente", "razon_social_cliente", "numero_documento""fecha_documento", "fecha_vencimiento","nDiasVencido", "monto", "nPagos", "monto-nPagos"


y me da error 9012. Si quita la parte de la resta "monto-nPagos" no da error.

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 3:22 pm
by nageswaragunupudi
Not 7-8
FIELD NAME OF 7 - FIELD NAME OF 8

Eg:
COLUMNS "NAME", "QTY", "RATE", "QTY*RATE" ;
HEADERS "ClientName", "Quantity", "Price", "Amount"

Also it is not a good practice to provide numbers in COLUMNS clause. Provide field names.

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 3:25 pm
by nageswaragunupudi
when you provide COLUMNS names, please remove AUTOCOLS

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 5:46 pm
by JoseAlvarez
Thank you Mr. Rao

I did what you suggested, but the error persists

Eg:
COLUMNS "NAME", "QTY", "RATE", "QTY*RATE" ;

Taking your example, it does not perform the operation. the columns "NAME", "QTY", "RATE" show their value well, but placing "QTY*RATE" generates an error.

in my case RATE is the value of a subquery, not a field of a table. It must be because of that?


Gracias mr Rao

Hice lo que me suguirió, pero el error persiste

Eg:
COLUMNS "NAME", "QTY", "RATE", "QTY*RATE" ;

Tomando su ejemplo, no realiza la operacion. las columnas "NAME", "QTY", "RATE" muestran bien su valor, pero al colocar "QTY*RATE" genera error.

en mi caso, RATE es el valor de una subconsulta, no es un campo de una tabla. ¿Sera por eso?

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 11:09 pm
by JoseAlvarez
Para mr. Rao y todos los expertos en xbrwose, creo que la clase tiene un bug.

No permite operaciones con columnas creadas desde subconsultas o "al vuelo".

Si tengo una columna creada desde un campo real de una tabla con un valor digamos X, y otra columna creada "al vuelo" con un valor Y, no permite hacer una operacion en el browse de tipo "X * Y" , dara error.

Y si la columna "al vuelo" tiene valor 0 y deseo poner una operacion directa de suma, resta o multiplicacion con otra columa que tenga valor positivo, siempre arroja 0 como resultado. Quiero decir, si la columna real es 800 y la creada al vuelo tiene valor de 0, la resta deberia ser 800 - 0 = 800, pero muestra 0.

Si consultamos los valores con msginfo(oQuery:columna) todo esta bien.

Los problemas se presentan al querer mostrarlos en el xBrowse

Quizas este equivocado. Por eso dejo la inquietud.

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 11:46 pm
by jacgsoft
En tu select tienes la siguiente columna "DATEDIFF('"+dHoy+"', Fac.fecha_vencimiento)", agrégale lo siguiente:


"DATEDIFF('"+dHoy+"', Fac.fecha_vencimiento) AS DiasVcto,"

Luego en la columna correspondiente del Xbrowse pones el nombre de esta columna que contiene la diferencia de días "DiasVcto".

Los dias de vencimiento lo tienes que calcular en tu Query (Sentencia Select) y NO hacer cálculos con las columnas del Xbrowse.

Re: Resta de columnas en xBrwose

PostPosted: Tue Nov 29, 2022 11:58 pm
by JoseAlvarez
Hola amigo, gracias por responder.

No es esa la columna que me da error, es la que tiene la subconsulta, "Select sum(...." es alli donde esta el problema. Con AS y sin AS se presenta el problema.

Si lees el hilo completo, el mismo Mr rao me dice que puedo hacer el calculo al momento de definir el browse usando las columas que vienen de la consulta.

Pero no esta funcionando con las columnas creadas al vuelo.

Saludos.

Re: Resta de columnas en xBrwose

PostPosted: Wed Nov 30, 2022 4:50 am
by JESUS MARIN
Buenas Jose Alvarez

A mi me funcionan las operaciones de suma, resta, etc.... , incluso si pongo formulas o funciones. Y al vuelo, como tu dices.
Bien es cierto que siempre utilizo arrays.
Te pongo un video de ejemplo

Image

Re: Resta de columnas en xBrwose

PostPosted: Wed Nov 30, 2022 11:02 am
by JoseAlvarez
Hola jesus, saludos,

Sí, con arrays funciona perfecto. No hay problemas.
Pero quiero eliminar el uso de arreglos por lo engorroso que resulta.

Por los momentos no tuve mas remedio que regresar a elllos, pero no es mi idea. Lo que quiero es ahorrar tiempo y codigo y tener un codigo mas legible y entendible.

Le dejó la inquietud a los expertos.

Gracias por tu comentario¡

Re: Resta de columnas en xBrwose

PostPosted: Wed Nov 30, 2022 8:53 pm
by Cgallegoa
Jose:

Image

Code: Select all  Expand view
#include "fivewin.ch"
#include "xBrowse.ch"


Function Inicio()
   LOCAL cServer   := "127.0.0.1"
   LOCAL cUser     := "tuuser", cDBName := "basedatosnnn"
   LOCAL cPassword := "tupassw"
   LOCAL oServer3, oRs, cQuery1
   LOCAL oDlg, oBrw
   
   SET DATE FORMAT TO "dd-mm-yyyy"
   
   MsgRun( "Conectando con tuservidor.com...", "Pruebas...",;
           {|oDlgx| oServer3 := Maria_Connect( cServer, cDBName, cUser, cPassword ) } )
   
   TEXT INTO cQuery1
       SELECT vta.codigopro,vta.numdoc,vta.fechadoc,vta.fechapag,vta.totaldoc
              FROM vta_cob AS vta
                    WHERE fechapag <> '' AND marca = 'FC'
                    ORDER BY numdoc
   ENDTEXT
   
   oRs := oServer3:RowSet( cQuery1 )
   
   DEFINE DIALOG oDlg FROM 10,10 TO 400,520 PIXEL
   
      @ 10,10 XBROWSE oBrw OF oDlg SIZE 235,170 PIXEL ;
              DATASOURCE oRs ;
                        COLUMNS "numdoc", "fechadoc", "fechapag", "Dias_Dif",  "totaldoc" ;
                        HEADERS "Documento", "Fecha Emisión", "Fecha Pago", "Días Dif.",  "Total Doc" ;
                      NOBORDER CELL LINES AUTOSORT
   
       // *** Aquí se asigna valor al campo calculado:
        oBrw:oCol("Días Dif."):bEditValue    := {|| oRs:fechapag - oRs:fechadoc }
   
      oBrw:CreateFromCode()
      oDlg:oClient := oBrw
   
   ACTIVATE DIALOG oDlg CENTERED
   oServer3:Close()

Return(NIL)
//-------------

Re: Resta de columnas en xBrwose

PostPosted: Thu Dec 01, 2022 2:04 am
by JoseAlvarez
Cgallegoa wrote:Jose:

Image

Code: Select all  Expand view
#include "fivewin.ch"
#include "xBrowse.ch"


Function Inicio()
   LOCAL cServer   := "127.0.0.1"
   LOCAL cUser     := "tuuser", cDBName := "basedatosnnn"
   LOCAL cPassword := "tupassw"
   LOCAL oServer3, oRs, cQuery1
   LOCAL oDlg, oBrw
   
   SET DATE FORMAT TO "dd-mm-yyyy"
   
   MsgRun( "Conectando con tuservidor.com...", "Pruebas...",;
           {|oDlgx| oServer3 := Maria_Connect( cServer, cDBName, cUser, cPassword ) } )
   
   TEXT INTO cQuery1
       SELECT vta.codigopro,vta.numdoc,vta.fechadoc,vta.fechapag,vta.totaldoc
              FROM vta_cob AS vta
                    WHERE fechapag <> '' AND marca = 'FC'
                    ORDER BY numdoc
   ENDTEXT
   
   oRs := oServer3:RowSet( cQuery1 )
   
   DEFINE DIALOG oDlg FROM 10,10 TO 400,520 PIXEL
   
      @ 10,10 XBROWSE oBrw OF oDlg SIZE 235,170 PIXEL ;
              DATASOURCE oRs ;
                        COLUMNS "numdoc", "fechadoc", "fechapag", "Dias_Dif",  "totaldoc" ;
                        HEADERS "Documento", "Fecha Emisión", "Fecha Pago", "Días Dif.",  "Total Doc" ;
                      NOBORDER CELL LINES AUTOSORT
   
       // *** Aquí se asigna valor al campo calculado:
        oBrw:oCol("Días Dif."):bEditValue    := {|| oRs:fechapag - oRs:fechadoc }
   
      oBrw:CreateFromCode()
      oDlg:oClient := oBrw
   
   ACTIVATE DIALOG oDlg CENTERED
   oServer3:Close()

Return(NIL)
//-------------



Gracias amigo, ya estoy probando, aun no logro echarlo a andar, estare avisando

Agradecido por la ayuda

Re: Resta de columnas en xBrwose

PostPosted: Thu Dec 01, 2022 3:25 pm
by Willi Quintana
MI estimado, prueba asi:

cQuery := "SELECT "
cQuery += "Cli.rif_cliente, "
cQuery += "Cli.razon_social_cliente, "
cQuery += "Fac.numero_documento, "
cQuery += "Fac.fecha_documento, "
cQuery += "Fac.fecha_vencimiento, "
dHoy:=subs(dToc(_dFechaDeHoy),7,4)+"/"+subs(dToc(_dFechaDeHoy),4,2)+"/"+subs(dToc(_dFechaDeHoy),1,2)
cQuery += "DATEDIFF('"+dHoy+"', Fac.fecha_vencimiento),"
cQuery += "Fac.monto, "
cQuery += "(SELECT SUM(monto_pago) FROM "+cT_Pagos+" WHERE codigo_cliente=Cli.codigo_cliente AND numero_documento=Fac.numero_documento) AS nPagos , "
cQuery += Fac_monto - nPagos AS saldo, // aqui ya realizas la resta *****************************************************************************************************************
cQuery += "Fac.concepto, "
cQuery += "Cli.codigo_cliente, "
cQuery += "Fac.codigo_cliente "
cQuery += "FROM "
cQuery += cT_Clientes + " AS Cli , "
cQuery += cT_Facturas + " AS Fac "
cQuery += "WHERE Fac.codigo_cliente = Cli.codigo_cliente ;"

TRY
oFacturas:=_oSqlConex:Query( cQuery )
CATCH
Fnct_MsgErrorBD("NoMySql" , .f. , "No hay conexión a La Base de Datos" , "Sin Acceso a La Red","Error en servicio de Datos",)
return .f.
END TRY

xbrowse(oFacturas) // aqui ves como sale el resultado del query