- VERSION 5.09.10.2

- Se corrigio que Trade Spending no consideraba los productos fijos de las promos a la hora de afectar el presupuesto.
- Se agregó la validacion de la version de la app desde cat_rutas (CAT_RU_VERSION_REQUERIDA).
- Se agregó el ligar el telefono a una ruta desde cat_rutas (CAT_RU_IDTELEFONO).
This commit is contained in:
2025-09-23 18:27:41 -06:00
parent ae8ac63b1d
commit e6455d8147
8 changed files with 154 additions and 56 deletions

View File

@@ -491,8 +491,8 @@ Sub Entrar_Click
Starter.skmt.ExecNonQuery2("INSERT INTO USUARIOA VALUES (?,?,?)", Array As Object(user.Text, pass.Text, DateTime.Date(DateTime.Now)))
Starter.skmt.ExecNonQuery("delete from cat_almacen")
Starter.skmt.ExecNonQuery2("INSERT INTO CAT_ALMACEN(ID_ALMACEN) VALUES (?)", Array As Object (pass.Text))
Starter.skmt.ExecNonQuery("delete from VERSION")
Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.95"))
' Starter.skmt.ExecNonQuery("delete from VERSION")
' Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object ("2.95"))
B4XPages.ShowPage("Principal")
End If
' c=Starter.skmt.ExecQuery2("select count(*) as EXISTE1 from usuarioa where usuario = ?", Array As String(user.Text))
@@ -1038,12 +1038,13 @@ Private Sub ImageView1_LongClick
' Log("traeConexion")
' Private reqManagerX As DBRequestManager
' reqManagerX.Initialize(Me, "http://keymon.net:9010/DB2")
' reqManagerX.Initialize(Me, "http://keymon.net:9010")
' Private cmdX As DBCommand
' cmdX.Initialize
' cmdX.Name = "traeConexion"
' cmdX.Parameters = Array As Object()
' reqManagerX.ExecuteQuery(cmdX, 0, "traeConexion")
' cmdX.Name = "update_usuario_guna_nobajas"
' cmdX.Parameters = Array As Object("CDAZA")
' reqManagerX.Executequery(cmdX, 0, "traeConexion")
If Subs.traeAlmacen <> "" Then
linker.VerifyAndLinkDevice(Subs.traeAlmacen, Subs.traeRuta)
End If
@@ -1070,27 +1071,29 @@ Sub Linker_Response(Status As String) ' << AÑADE ESTE SUB [New Query]
If Starter.Logger Then LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) '
Select Status
Case "UUID_ERROR"
Log("Error interno al obtener el identificador único del dispositivo.")
ToastMessageShow("Error interno al obtener el identificador único del dispositivo.", True)
Case "HTTP_ERROR"
LogColor("Error HTTP al verificar el dispositivo: " & linker.lastJobDoneError, Colors.Red)
ToastMessageShow("Error de conexión al servidor durante la verificación del dispositivo.", True)
Case "SERVER_LOGIC_ERROR"
Log("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.")
ToastMessageShow("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.", True)
Case "OK"
If Starter.Logger Then Log("Dispositivo ligado y verificado exitosamente.")
Log("Dispositivo ligado y verificado exitosamente.")
ToastMessageShow("Dispositivo verificado y ligado correctamente.", False)
' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal.
Case "NO_REGISTRADO"
If Starter.Logger Then Log("Dispositivo NO registrado.")
Log("Dispositivo NO registrado.")
ToastMessageShow("Dispositivo NO registrado.", False)
Case "REGISTRO_NUEVO"
If Starter.Logger Then Log("¡¡Registro nuevo!!")
Log("¡¡Registro nuevo!!")
ToastMessageShow("¡¡Registro nuevo!!", False)
Case "ALREADY_REGISTERED"
If Starter.Logger Then Log("¡¡El dispositivo ya esta registrado con otra ruta!!")
Case "YA_REGISTRADO"
Log("¡¡El dispositivo ya esta registrado con otra ruta!!")
ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True)
Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL")
If Starter.Logger Then Log($"Estado de verificación del dispositivo: ${Status}"$)
Log($"Estado de verificación del dispositivo: ${Status}"$)
ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True)
' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado.
End Select

View File

@@ -910,7 +910,7 @@ Sub GPS_LocationChanged (Location1 As Location)
If Not(clienteDeudor) Then B_VENTA.Visible = True 'Si el cliente no tiene adeudo, habilitamos el boton de venta
If Not(clienteId.StartsWith("N")) And la_cuenta.Text <> "0" Then
b_noVenta.Visible = True 'Ni cliente nuevo, ni abordo.
Log("NoVenta False")
' Log("NoVenta False")
End If
If Not(p_rechazoDOE.Visible) Then pedido_doe_muestra
Else

View File

@@ -218,6 +218,7 @@ Sub Class_Globals
Type TCuantos (query As String, esperados As Int, guardados As Int)
Dim validaCuantos As TCuantos
Dim ts As C_TrendSpending
Dim linker As C_deviceLinker
End Sub
'You can add more parameters here.
@@ -321,6 +322,7 @@ End Sub
Sub B4XPage_Appear
' Log(Subs.traeDiaSemana)
linker.Initialize(Me, "Linker", True)
Starter.errorConnDBReq = False
connecta.TextColor = Colors.White
StartBluetooth
@@ -1773,11 +1775,17 @@ Sub JobDone(Job As HttpJob)
' Subs.logJobDoneResultados(RESULT)
For Each records() As Object In RESULT.Rows
Starter.skmt.ExecNonQuery("delete from VERSION")
Dim CAT_VE_VERSION As String = records(RESULT.Columns.Get("CAT_VE_VERSION"))
Log(">>>>>>> Version minima: " & CAT_VE_VERSION & " - Actual: " & Application.VersionName & " --> " & Subs.comparaVersiones(CAT_VE_VERSION, Application.VersionName))
Dim CAT_RU_VERSION_REQUERIDA As String = records(RESULT.Columns.Get("CAT_RU_VERSION_REQUERIDA"))
Log(">>>>>>> Version requerida: " & CAT_RU_VERSION_REQUERIDA & " - Actual: " & Application.VersionName & " --> " & Subs.comparaVersiones(CAT_RU_VERSION_REQUERIDA, Application.VersionName))
Starter.skmt.ExecNonQuery("delete from VERSION")
Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_VE_VERSION))
Starter.skmt.ExecNonQuery2("INSERT INTO VERSION(NOVERSION) VALUES (?)", Array As Object (CAT_RU_VERSION_REQUERIDA))
Next
If CAT_RU_VERSION_REQUERIDA = 0 Or Subs.comparaVersiones(CAT_RU_VERSION_REQUERIDA, Application.VersionName) = 0 Then
connecta3
Else
Msgbox2("Es necesario actualizar la versión de la aplicación.", "VERSION INCORRECTA","Aceptar", "", "",Null) 'ignore
' ExitApplication
End If
End If
If RESULT.Tag = "count_cli" Then 'query tag
@@ -2248,10 +2256,23 @@ Sub connecta_Click
reqManager.trackInit
linker.VerifyAndLinkDevice(Subs.traeAlmacen, Subs.traeRuta)
' Else
' Msgbox("LA RUTA NO ES CORRECTA","") 'ignore
' End If
End Sub
Sub connecta2
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "select_version_KELL"
cmd.Parameters = Array As Object(ALMACEN, e_ruta.text)
reqManager.ExecuteQuery(cmd , 0, "version")
End Sub
Sub connecta3
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "select_ruta4_KELL"
@@ -2262,9 +2283,6 @@ Sub connecta_Click
If e_ruta.Text = "KMTSKLL1" Then e_ruta.Enabled = True
ToastMessageShow("Validando Conexión." , False)
ruta_valida = e_ruta.Text
' Else
' Msgbox("LA RUTA NO ES CORRECTA","") 'ignore
' End If
End Sub
Private Sub connecta_LongClick
@@ -3877,4 +3895,39 @@ End Sub
Private Sub l_efectiva_Click
l_descripcion.Text = "Clientes visitados / Clientes totales"
l_descripcion.Visible = True
End Sub
Sub Linker_Response(Status As String) ' << AÑADE ESTE SUB [New Query]
If Starter.Logger Then LogColor($"Respuesta de DeviceLinker para la verificación del dispositivo: ${Status}"$, Colors.Magenta) '
Select Status
Case "UUID_ERROR"
Log("Error interno al obtener el identificador único del dispositivo.")
ToastMessageShow("Error interno al obtener el identificador único del dispositivo.", True)
Case "HTTP_ERROR"
LogColor("Error HTTP al verificar el dispositivo: " & linker.lastJobDoneError, Colors.Red)
ToastMessageShow("Error de conexión al servidor durante la verificación del dispositivo.", True)
Case "SERVER_LOGIC_ERROR"
Log("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.")
ToastMessageShow("El servidor no proporcionó un estado de verificación válido. Contacte a soporte.", True)
Case "OK"
Log("Dispositivo ligado y verificado exitosamente.")
ToastMessageShow("Dispositivo verificado y ligado correctamente.", False)
' Aquí puedes añadir lógica adicional si la verificación es exitosa, por ejemplo, habilitar ciertos botones o continuar con el flujo normal.
connecta2
' Case "NO_REGISTRADO"
' Log("Dispositivo NO registrado.")
' ToastMessageShow("Dispositivo NO registrado.", False)
Case "REGISTRO_NUEVO"
Log("¡¡Registro nuevo!!")
connecta2
ToastMessageShow("¡¡Registro nuevo!!", False)
Case "YA_REGISTRADO"
Log("¡¡El dispositivo ya esta registrado con otra ruta!!")
ToastMessageShow("¡¡El dispositivo ya esta registrado con otra ruta!!", True)
Msgbox2("Ruta registrada en otro dispositivo", "RUTA INCORRECTA","Aceptar", "", "",Null) 'ignore
Case Else ' Otros estados que tu servidor pueda devolver (ej. "UNAUTHORIZED", "PENDING_APPROVAL")
Log($"Estado de verificación del dispositivo: ${Status}"$)
ToastMessageShow($"Verificación del dispositivo: ${Status}"$, True)
' Puedes decidir si bloquear la funcionalidad o mostrar un mensaje específico según el estado.
End Select
End Sub

View File

@@ -476,9 +476,21 @@ Private Sub b_terminar1_Click
cuentaProds
Private elMontoTSDeLaVenta As String = 0
' Log("====================================================================")
' Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$)
Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$)
For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido.
Private pn As String = Subs.traeProdNombre(prodsIds.Get(t))
Private idProdFijo As String = prodsIds.Get(t)
Private cantProdFijo As Int = prodsCants.Get(t)
' ' Asumimos que el índice 0 es el encabezado de la promoción (estaPromo) y no tiene bonificación de producto.
If t > 0 Then
Private bonificacion_monto As String = ts.traeMontoBonificacion(idProdFijo, estaPromo)
Log(bonificacion_monto)
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (bonificacion_monto * cantProdFijo)
Log($"TS Fijo Acumulado: ${elMontoTSDeLaVenta}, Prod: ${idProdFijo}"$)
End If
If prodsCants.Get(t) > 0 Then Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
Next
For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido.
@@ -503,6 +515,18 @@ Private Sub b_continuar_Click
Log($"${prodsIds}${CRLF}${prodsCants}${CRLF}${prodsPrecios}"$)
For t = 0 To prodsIds.Size - 1 'Guardamos los productos fijos de la promocion en pedido.
Private pn As String = Subs.traeProdNombre(prodsIds.Get(t))
Private idProdFijo As String = prodsIds.Get(t)
Private cantProdFijo As Int = prodsCants.Get(t)
' ' Asumimos que el índice 0 es el encabezado de la promoción (estaPromo) y no tiene bonificación de producto.
If t > 0 Then
Private bonificacion_monto As String = ts.traeMontoBonificacion(idProdFijo, estaPromo)
Log(bonificacion_monto)
elMontoTSDeLaVenta = elMontoTSDeLaVenta + (bonificacion_monto * cantProdFijo)
Log($"TS Fijo Acumulado: ${elMontoTSDeLaVenta}, Prod: ${idProdFijo}"$)
End If
Subs.guardaProductoSinGestion(estaPromo, prodsPrecios.Get(t), prodsCants.Get(t), pn, prodsIds.Get(t), Subs.traeCliente, Subs.traeFecha, Subs.traeUsuarioDeBD, Subs.traeRuta, 0, Starter.tipov)
Next
For t = 0 To prodsIds2.Size - 1 'Guardamos los productos variables de la promocion en pedido.

View File

@@ -46,7 +46,8 @@ Public Sub Initialize (PageObject As Object, NameOfEvent As String, AppLogger As
' Inicializamos el DBRequestManager para las comunicaciones con el servidor.
' 'Me' indica que el evento JobDone de esta clase se encargará de las respuestas de reqManager.
' reqManager.Initialize(Me, Starter.DBReqServer)
reqManager.Initialize(Me, "http://keymon.net:9010/DB2") 'Servidor de pruebas
' reqManager.Initialize(Me, "http://keymon.net:9010/DB2") 'Servidor de pruebas
reqManager.Initialize(Me, "http://keymon.net:1781") 'Servidor productivo
If logger Then Log("DBRequestManager para DeviceLinker inicializado.")
If logger Then Log("DeviceLinker inicializado y listo para operar.")
@@ -110,7 +111,7 @@ Public Sub JobDone(Job As HttpJob) ' El nombre del sub debe ser 'JobDone' o el q
If Job.Success = False Then
lastJobDoneError = Job.ErrorMessage
LogColor("############################################", Colors.red)
LogColor("###### JobError: " & Job.Tag & CRLF & Job.ErrorMessage, Colors.red)
LogColor("###### JobError: " & Job.Tag & " ######" & CRLF & "#### " & Job.ErrorMessage, Colors.red)
LogColor("############################################", Colors.red)
' Enviar una respuesta de error HTTP al callback.
If SubExists(CallBack, EventName & "_Response") Then
@@ -125,43 +126,59 @@ Public Sub JobDone(Job As HttpJob) ' El nombre del sub debe ser 'JobDone' o el q
If logger Then LogColor($"Petición exitosa al servidor. Registros devueltos: ${result.Rows.Size}"$, Colors.Green)
If result.Tag = "hist_cliente_promos" Then 'query tag
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
Dim HCCP_CLIENTE As String = records(result.Columns.Get("HCCP_CLIENTE"))
Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA) VALUES (?,?,?,?)", Array As Object (HCCP_CLIENTE))
Next
Starter.skmt.TransactionSuccessful
Starter.skmt.EndTransaction
' ToastMessageShow(" Historico Clientes Promociones Actualizado." , True)
End If
' If result.Tag = "hist_cliente_promos" Then 'query tag
' Starter.skmt.BeginTransaction
' For Each records() As Object In result.Rows
' Dim HCCP_CLIENTE As String = records(result.Columns.Get("HCCP_CLIENTE"))
' Starter.skmt.ExecNonQuery2("INSERT INTO HIST_CLIENTE_CANT_PROMOS(HCCP_CLIENTE, HCCP_PROMO, HCCP_CANT, HCCP_CANT_VENDIDA) VALUES (?,?,?,?)", Array As Object (HCCP_CLIENTE))
' Next
' Starter.skmt.TransactionSuccessful
' Starter.skmt.EndTransaction
' ' ToastMessageShow(" Historico Clientes Promociones Actualizado." , True)
' End If
If result.Tag = "verify_device" Then 'query tag
' Aquí es donde la lógica de la aplicación interpreta el éxito/falla de la operación en el servidor.
' No usamos result.Success porque DBResult no tiene esa propiedad.
' En su lugar, comprobamos si se devolvieron filas y el campo 'status' dentro de los datos.
If result.Rows.Size > 0 Then
Subs.logJobDoneResultados(result)
For Each records() As Object In result.Rows
Dim Status As String = records(result.Columns.Get("ESTATUS"))
Dim GUID As String = records(result.Columns.Get("GUID"))
If deviceId <> GUID Then Status = "ALREADY_REGISTERED" ' Ya existe OTRO registro.
Dim Status As String = "" 'records(result.Columns.Get("ESTATUS"))
Dim CAT_RU_IDTELEFONO As String = records(result.Columns.Get("CAT_RU_IDTELEFONO"))
Log($"|${deviceId}|${CAT_RU_IDTELEFONO}|"$)
' If deviceId <> CAT_RU_IDTELEFONO Then Status = "YA_REGISTRADO" ' Ya existe OTRO registro.
If CAT_RU_IDTELEFONO = 0 Or CAT_RU_IDTELEFONO.Length < 5 Then
Log(">>> NUEVO")
' Status = "REGISTRO_NUEVO"
Dim cmd As DBCommand ' Creamos un comando para enviar al servidor.
cmd.Initialize
cmd.Name = "registarMovil"
' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
cmd.Parameters = Array As Object(deviceId, almacen, ruta)
reqManager.ExecuteCommand(cmd, "registramosGUID")
If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", "REGISTRO_NUEVO")
End If
else if CAT_RU_IDTELEFONO = deviceId Then
Status = "OK"
Else
Status = "YA_REGISTRADO"
End If
' Invocamos el callback en el módulo principal con el estado.
If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", Status)
End If
Next
Else
If logger Then LogColor($"El servidor respondió con éxito, pero no encontró registros.${CRLF}Quiere decir que la ruta NO esta registrada en el servidor."$, Colors.Red)
Dim cmd As DBCommand ' Creamos un comando para enviar al servidor.
cmd.Initialize
cmd.Name = "registarMovil"
' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
cmd.Parameters = Array As Object(almacen, ruta, deviceId)
reqManager.ExecuteCommand(cmd, "registramosGUID")
If SubExists(CallBack, EventName & "_Response") Then
CallSub2(CallBack, EventName & "_Response", "NO_REGISTRADO")
End If
' Else
' If logger Then LogColor($"El servidor respondió con éxito, pero no encontró registros.${CRLF}Quiere decir que la ruta NO esta registrada en el servidor."$, Colors.Red)
' Dim cmd As DBCommand ' Creamos un comando para enviar al servidor.
' cmd.Initialize
' cmd.Name = "registarMovil"
' ' Pasamos el almacén, la ruta y el GUID del dispositivo como parámetros.
' cmd.Parameters = Array As Object(almacen, ruta, deviceId)
' reqManager.ExecuteCommand(cmd, "registramosGUID")
' If SubExists(CallBack, EventName & "_Response") Then
' CallSub2(CallBack, EventName & "_Response", "NO_REGISTRADO")
' End If
End If
End If

View File

@@ -917,7 +917,7 @@ Version=12.8
#Region Project Attributes
#ApplicationLabel: Kelloggs Venta
#VersionCode: 3000
#VersionName: 5.09.10
#VersionName: 5.09.10.1
#SupportedOrientations: portrait
#CanInstallToExternalStorage: False
#BridgeLogger:true

View File

@@ -67,14 +67,14 @@ ModuleBreakpoints7=
ModuleBreakpoints8=
ModuleBreakpoints9=
ModuleClosedNodes0=
ModuleClosedNodes1=6,8,46,47
ModuleClosedNodes1=6,46,47
ModuleClosedNodes10=
ModuleClosedNodes11=
ModuleClosedNodes12=3,5,6
ModuleClosedNodes12=3,5
ModuleClosedNodes13=7,8,9,10,11,12
ModuleClosedNodes14=6,7,8,9,12,13
ModuleClosedNodes15=
ModuleClosedNodes16=3,7,8,15,17
ModuleClosedNodes16=3,8,17
ModuleClosedNodes17=
ModuleClosedNodes18=
ModuleClosedNodes19=7,8,9,10,11,12,13,14
@@ -92,7 +92,7 @@ ModuleClosedNodes29=
ModuleClosedNodes3=1,3,5,6
ModuleClosedNodes30=
ModuleClosedNodes31=
ModuleClosedNodes32=114,116
ModuleClosedNodes32=116
ModuleClosedNodes33=
ModuleClosedNodes4=
ModuleClosedNodes5=
@@ -100,6 +100,6 @@ ModuleClosedNodes6=
ModuleClosedNodes7=
ModuleClosedNodes8=
ModuleClosedNodes9=
NavigationStack=C_Cliente,GPS_LocationChanged,906,0,C_Cliente,B4XPage_Appear,552,6,Diseñador Visual,cliente.bal,-100,6,Diseñador Visual,principal.bal,-100,2,C_Principal,cargar_Click,837,0,C_Principal,B4XPage_Appear,539,6,kms_helperSubs,traeRuta,748,0,C_deviceLinker,Initialize,43,0,C_deviceLinker,VerifyAndLinkDevice,64,0,B4XMainPage,ImageView1_LongClick,1041,0
NavigationStack=C_Principal,JobDone,1779,0,B4XMainPage,B4XPage_Appear,392,0,B4XMainPage,Label4_Click,1062,0,B4XMainPage,Linker_Response,1063,3,C_Principal,l_efectiva_Click,3892,0,C_Principal,Class_Globals,214,0,C_Principal,B4XPage_Created,312,0,C_Principal,B4XPage_Appear,321,0,C_Principal,Linker_Response,3917,6,C_deviceLinker,JobDone,132,6,C_deviceLinker,Initialize,44,0
SelectedBuild=0
VisibleModules=31,1,12,5,16,26,3,32,13,14,8,33,10,28
VisibleModules=31,1,12,5,16,26,3,32,13,14,8,33,10,28,19

View File

@@ -337,6 +337,7 @@ Sub traeBonificacionesMaximas(tipo As String, clienteId As String, id As String,
Log($"Presupuesto disponible: ${tsRestantes}"$)
Log($"Cantidad: ${laCant}"$)
Log($"Floor(tsRestantes / (tsMonto * laCant))= ${Floor(tsRestantes / (tsMonto * laCant))}"$)
Log($"Floor(${tsRestantes} / (${tsMonto} * ${laCant}))= ${Floor(tsRestantes / (tsMonto * laCant))}"$)
If tsMonto > 0 Then
tsMaximas = Floor(tsRestantes / (tsMonto * laCant))
End If
@@ -359,7 +360,7 @@ Sub traeMontoBonificacion(id As String, promoId As String) As String
tsMonto = c.GetString("CAT_GP_PRECIO") ' Precio original.
End If
' Log("PRECIOB: " & c.GetInt("CAT_DP_PRECIOB"))
' Log($"Precio normal: ${c.GetString("CAT_GP_PRECIO")}, Precio desc: ${c.GetString("CAT_DP_PRECIO")}, Monto bonificacion: ${tsMonto}"$)
Log($"Precio normal: ${c.GetString("CAT_GP_PRECIO")}, Precio desc: ${c.GetString("CAT_DP_PRECIO")}, Monto bonificacion: ${tsMonto}"$)
End If
' Log("ROWCOUNT: " & c.RowCount)
Return tsMonto