Page 1 of 1
Resta de columnas en xBrwose
Posted: 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
Posted: 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
@ 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
Posted: 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
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"
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
Posted: 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
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
Posted: 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
Posted: Tue Nov 29, 2022 3:25 pm
by nageswaragunupudi
when you provide COLUMNS names, please remove AUTOCOLS
Re: Resta de columnas en xBrwose
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Re: Resta de columnas en xBrwose
Posted: 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
Posted: Wed Nov 30, 2022 8:53 pm
by Cgallegoa
Jose:
Code: Select all | Expand
#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
Posted: Thu Dec 01, 2022 2:04 am
by JoseAlvarez
Cgallegoa wrote:Jose:
Code: Select all | Expand
#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
Posted: 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