- VERSION 5.06.25

- Se quito que el almacen de guadalajara NO tuviera geocerca.
- Se corrigio el error de que cuando se desinstala la app y se vuelve a instalar, en la priera venta se trababa la aplicacion.
- Se puso codigo de prueba para usar el "wait for" con el DBReqManager.
This commit is contained in:
2025-07-01 17:41:19 -06:00
parent e639848418
commit 32ba186a60
8 changed files with 522 additions and 46 deletions

View File

@@ -117,6 +117,7 @@ Sub Class_Globals
Dim intentUsado As Boolean = False
Private p_importarBDWA As Panel
Private cb_importarBDWA As CheckBox
' Type TResultado(Tag As String, Success As Boolean, resultado As DBResult, ErrorMessage As String)
End Sub
Public Sub Initialize
@@ -129,6 +130,7 @@ End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Log(">>>>>> CREATE - INICIAMOS MAIN PAGE <<<<<<<<<")
If Not(Starter.Logger) Then logger = False
Dim sDate, sTime As String
DateTime.DateFormat = "yyyyMMdd"
@@ -212,7 +214,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
ruta = Starter.ruta
Starter.tiempos.Initialize
kh.guardaAppInfo
Log(111)
'Revisamos si se disparo el intent de cargar la base de datos desde WhatApp.
If kh.traeUsarIntentBDWA Then kh.importaBDDesdeWhatsApp
@@ -312,6 +314,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
Msgbox("No se puede crear el archivo de foto","Aviso") 'ignore
End Try
End If
Log(222)
' Dim ph As Phone 'Get Id Device
' Dim DeviceID As String = Starter.ph.GetSettings("android_id").ToUpperCase
' If logger Then Log($"Marca: ${Starter.ph.manufacturer}, Modelo: ${Starter.ph.model}"$)
@@ -346,7 +349,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
Else
ToastMessageShow("Sin permisos para GPS", True)
End If
Log("***********************************************")
Log("33***********************************************33")
MES1.Initialize(Me, "MES1")
' Log("SDK: " & device.SdkVersion)
' Get the device SDK version
@@ -376,7 +379,7 @@ Private Sub B4XPage_Created (Root1 As B4XView)
End If
Log(MES1.IsInitialized)
Log(MES1.HasPermission)
Log("***********************************************")
Log("44***********************************************44")
MES1.Initialize(Me, "MES1")
' Log("Permisos BT: " & rp.Check("android.permission.BLUETOOTH_CONNECT"))
' Log("REVISAMOS PERMISOS DE BT")
@@ -389,7 +392,8 @@ Private Sub B4XPage_Created (Root1 As B4XView)
End Sub
Sub B4XPage_Appear
Log(">>>>>> INICIAMOS MAIN PAGE <<<<<<<<<")
Log(">>>>>> APPEAR - INICIAMOS MAIN PAGE <<<<<<<<<")
If Not(MES1.IsInitialized) Then MES1.Initialize(Me, "MES1")
Log(DateTime.GetDayOfWeek(DateTime.Now))
kh.RD_Init
kh.SetButtonTintList(cb_geocerca, Colors.LightGray, Colors.RGB(43, 154, 211))
@@ -462,10 +466,10 @@ Sub B4XPage_Appear
Log(MES1.IsInitialized)
If MES1.IsInitialized Then
LogColor("Permisos de almacenamiento: " & MES1.HasPermission, Colors.Magenta)
If MES1.HasPermission Then kh.revisaSiExisteRespaldo
' If MES1.HasPermission Then kh.revisaSiExisteRespaldo '' Se comenta causa el error de que en el primer cliente,al guardar la venta se trabe la aplicacion!!
End If
DateTime.DateFormat = "yyyy-MM-dd HH:mm:ss"
Starter.skmt.ExecNonQuery($"insert into versiones (version, fecha) values ('${Application.VersionName}', '${datetime.Date(DateTime.Now)}')"$)
Starter.skmt.ExecNonQuery($"insert into versiones (version, fecha) values ('${Application.VersionName}', '${DateTime.Date(DateTime.Now)}')"$)
End Sub
'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.
@@ -705,6 +709,52 @@ Private Sub i_engranes_LongClick
' Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean)
' Subs.copiaDB(Result)
' Dim x As Int = "a"
Dim reqManagerW As DBRequestManagerW
reqManagerW.Initialize
cmd.Initialize
cmd.Name = "select_usuario_guna_KELL"
cmd.Parameters = Array As Object(user.Text, pass.Text)
reqManagerW.ExecuteQuery(Starter.DBReqServer, cmd, Me, "elUsuario")
Wait For elUsuario_Completed (res1 As TResultado)
Log("tag: " & res1.tag & " Success: " & res1.Success)
If res1.Success Then
Subs.logJobDoneResultados(res1.resultado)
Else
Log(res1.ErrorMessage)
End If
cmd.Name = "select_version_KELL"
cmd.Parameters = Array()
reqManagerW.ExecuteQuery(Starter.DBReqServer, cmd, Me, "laVersion")
Wait For laVersion_Completed (res2 As TResultado)
Log("tag: " & res2.tag & " Success: " & res2.Success)
If res2.Success Then
Subs.logJobDoneResultados(res2.resultado)
Else
Log(res2.ErrorMessage)
End If
cmd.Name = "delete_geoPass"
cmd.Parameters = Array As Object( Subs.traeAlmacen, Subs.traeRuta)
reqManagerW.ExecuteCommand(Starter.DBReqServer, cmd, Me, "borraGeoPass")
Wait For borraGeoPass_Completed (res3 As TResultado)
Log("tag: " & res3.tag & " Success: " & res3.Success)
If res3.Success Then
Subs.logJobDoneResultados(res3.resultado)
Else
Log(res3.ErrorMessage)
End If
End Sub
Sub elUsuario_Completed (res As DBResult)
Log("abc: " & res.tag)
Log("wrapper: " & res)
End Sub
Sub laVersion_Completed (res As DBResult)
Log("def: " & res.tag)
Log("wrapper2: " & res)
End Sub
Sub B_SERVER_Click

View File

@@ -422,7 +422,7 @@ Sub B4XPage_Appear
usarGeocerca = kh.traeUsarGeocerca
'Para el almacen 12 (GDL) no se usa la geocerca
If kh.traeAlmacen = 12 Then usarGeocerca = False
' If kh.traeAlmacen = 12 Then usarGeocerca = False
' Log(Subs.traeUltimaActividadBD)
c = Starter.skmt.ExecQuery2("select CAT_VA_VALOR from CAT_VARIABLES WHERE CAT_VA_DESCRIPCION = ?", Array As String ("MACIMP"))
@@ -1301,8 +1301,8 @@ Sub Imprime_ticket
Printer1.WriteString("Entre calle1: " & l_entre1.Text & CRLF)
Printer1.WriteString("Entre Calle2: " & l_entre2.Text & CRLF)
LogColor("Entre Calle2: " & l_entre2.Text, Colors.red)
Printer1.WriteString("Forma de pago: " & formaPago & CRLF)
LogColor("Forma de pago: " & formaPago, Colors.red)
' Printer1.WriteString("Forma de pago: " & formaPago & CRLF)
' LogColor("Forma de pago: " & formaPago, Colors.red)
Printer1.WriteString(" " & CRLF)
Printer1.WriteString("------------------------------" & CRLF)
Printer1.WriteString("PEDIDO" & CRLF)
@@ -1431,7 +1431,7 @@ Sub Imprime_ticket
End Try
Else
Try
LogColor(456, Colors.red)
' LogColor(456, Colors.red)
DateTime.DateFormat = "yyyymmdd"
sDate=DateTime.Date(DateTime.Now)
Printer1.WriteString("KELLOGG COMPANY MEXICO" & CRLF)
@@ -1450,9 +1450,9 @@ Sub Imprime_ticket
Printer1.WriteString("C.P.: " & la_cp.Text & CRLF)
Printer1.WriteString("Entre calle1: " & l_entre1.Text & CRLF)
Printer1.WriteString("Entre Calle2: " & l_entre2.Text & CRLF)
LogColor("Entre Calle2: " & l_entre2.Text, Colors.red)
' LogColor("Entre Calle2: " & l_entre2.Text, Colors.red)
Printer1.WriteString("Forma de pago: " & formaPago & CRLF)
LogColor("Forma de pago: " & formaPago, Colors.red)
' LogColor("Forma de pago: " & formaPago, Colors.red)
Printer1.WriteString(" " & CRLF)
''''''' PEDIDOS DOE
@@ -1629,8 +1629,8 @@ Sub Imprime_ticket
Printer1.WriteString(Printer1.UNREVERSE & Printer1.BOLD & "Sub Total CAMBIOS: $" & NumberFormat2(sTotal3, 1, 2, 2, False) & CRLF)
Private cantidad2 As String = "0"
If s.GetString("CANTIDAD") <> Null And IsNumber(s.GetString("CANTIDAD")) Then cantidad2 = s.GetString("CANTIDAD")
Log("|" & cantidad1 & "|")
Log("|" & s.GetString("CANTIDAD") & "|" & cantidad1 & "|")
' Log("|" & cantidad1 & "|")
' Log("|" & s.GetString("CANTIDAD") & "|" & cantidad1 & "|")
Printer1.WriteString( Printer1.UNREVERSE & Printer1.BOLD & "No. Productos: " & cantidad2 & CRLF)
Printer1.WriteString(CRLF)
s.Close

View File

@@ -9,6 +9,7 @@ Sub Class_Globals
Private Root As B4XView 'ignore
Private xui As XUI 'ignore
Dim reqManager As DBRequestManager
Dim reqManagerW As DBRequestManagerW
Dim device As Phone
Dim kh As kms_helperSubs
Dim rp As RuntimePermissions
@@ -214,6 +215,8 @@ Sub Class_Globals
Private r_7 As RadioButton
Private r_razonNoVisita As String
Private l_descripcion As Label
Type TCuantos (query As String, esperados As Int, guardados As Int)
Dim validaCuantos As TCuantos
End Sub
'You can add more parameters here.
@@ -225,6 +228,7 @@ End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
If Not(Starter.Logger) Then logger = False
validaCuantos.Initialize
Root = Root1
'load the layout to Root
Root.LoadLayout("principal")
@@ -332,6 +336,7 @@ Sub B4XPage_Appear
If Subs.traeUltimaActividadBD <> "principal" Then Subs.iniciaActividad(Subs.traeUltimaActividadBD)
borraClientesNuevosSinVenta
reqManager.Initialize(Me, Starter.DBReqServer)
reqManagerW.Initialize
Log($"DBREQSERVER = ${Starter.DBReqServer}"$)
Dim cmd As DBCommand
@@ -821,10 +826,83 @@ Sub cargar_Click
cmd.Parameters = Array As Object(ALMACEN)
reqManager.ExecuteQuery(cmd , 0, "detallepaq")
cmd.Name = "selectCuantosClientes_Kell"
cmd.Parameters = Array As Object(e_ruta.text, ALMACEN)
reqManagerW.ExecuteQuery(Starter.DBReqServer, cmd, Me, "kmt_cuantos")
Wait For kmt_cuantos_Completed (r As TResultado)
If r.Success Then
validaCuantos.query = "kmt_datos"
For Each records() As Object In r.resultado.Rows
Dim CUANTOS_CLIENTES As Int = records(r.resultado.Columns.Get("CUANTOS_CLIENTES"))
Next
validaCuantos.esperados = CUANTOS_CLIENTES
Subs.logJobDoneResultados(r.resultado)
Else
Log(r.ErrorMessage)
End If
cmd.Initialize
cmd.Name = "select_cat_clientes_guna_KELL2"
cmd.Parameters = Array As Object(e_ruta.text, ALMACEN)
reqManager.ExecuteQuery(cmd , 0, "kmt_datos")
' reqManager.ExecuteQuery(cmd , 0, "kmt_datos")
reqManagerW.ExecuteQuery(Starter.DBReqServer, cmd, Me, "kmt_datos")
Wait For kmt_datos_Completed (r As TResultado)
Log("tag: " & r.tag & " Success: " & r.Success)
If r.Success Then
' Subs.logJobDoneResultados(res2.resultado)
Private result As DBResult = r.resultado
cargar.Enabled = True
Log("TIEMPO kmt_datos : " & ((DateTime.Now-inicioContador)/1000))
S_CC.TEXT = "CARGANDO"
Starter.skmt.BeginTransaction
For Each records() As Object In result.Rows
Dim CAT_CL_CODIGO As String = records(result.Columns.Get("CAT_CL_CODIGO"))
Dim CAT_CL_RUTA As String = records(result.Columns.Get("CAT_CL_RUTA"))
Dim CAT_CL_NOMBRE As String = records(result.Columns.Get("CAT_CL_NOMBRE"))
Dim CAT_CL_ATIENDE1 As String = records(result.Columns.Get("CAT_CL_ATIENDE1"))
Dim CAT_CL_ATIENTE2 As String = records(result.Columns.Get("CAT_CL_ATIENTE2"))
Dim CAT_CL_TELEFONO As String = records(result.Columns.Get("CAT_CL_TELEFONO"))
Dim CAT_CL_EMAIL As String = records(result.Columns.Get("CAT_CL_EMAIL"))
Dim CAT_CL_CALLE As String = records(result.Columns.Get("CAT_CL_CALLE"))
Dim CAT_CL_NOEXT As String = records(result.Columns.Get("CAT_CL_NOEXT"))
Dim CAT_CL_NOINT As String = records(result.Columns.Get("CAT_CL_NOINT"))
Dim CAT_CL_CALLE1 As String = records(result.Columns.Get("CAT_CL_CALLE1"))
Dim CAT_CL_CALLE2 As String = records(result.Columns.Get("CAT_CL_CALLE2"))
Dim CAT_CL_COLONIA As String = records(result.Columns.Get("CAT_CL_COLONIA"))
Dim CAT_CL_MUNI As String = records(result.Columns.Get("CAT_CL_MUNI"))
Dim CAT_CL_EDO As String = records(result.Columns.Get("CAT_CL_EDO"))
Dim CAT_CL_CP As String = records(result.Columns.Get("CAT_CL_CP"))
Dim CAT_CL_LONG As String = records(result.Columns.Get("CAT_CL_LONG"))
Dim CAT_CL_LAT As String = records(result.Columns.Get("CAT_CL_LAT"))
Dim CAT_CL_MTOCOMPRA As String = records(result.Columns.Get("CAT_CL_MTOCOMPRA"))
Dim CAT_CL_NUM_SERIEFISICO As String = records(result.Columns.Get("CAT_CL_NUM_SERIEFISICO"))
Dim CAT_CL_BFACTURA As String = records(result.Columns.Get("CAT_CL_BFACTURA"))
Dim CAT_CL_BCREDITO As String = records(result.Columns.Get("CAT_CL_BBLOQUEOCRED"))
Dim CAT_CL_DIAS_VISITA As String = records(result.Columns.Get("CAT_CL_DIAS_VISITA"))
Dim CAT_CL_TIPO_RUTA As String = records(result.Columns.Get("CAT_CL_TIPO_RUTA"))
Dim CAT_CL_CATEGORIA As String = records(result.Columns.Get("CAT_CL_CATEGORIA"))
Dim CAT_CL_SEGMENTO As String = records(result.Columns.Get("CAT_CL_SEGMENTO"))
Dim CAT_CL_LIMITECREDITO As String = records(result.Columns.Get("CAT_CL_LIMITECREDITO"))
Dim CREDITO As String = records(result.Columns.Get("CAT_CL_BCREDITO"))
' LogColor("CAT_CL_LIMITECREDITO:" & CAT_CL_LIMITECREDITO & " -- ID: " & CAT_CL_CODIGO, Colors.red)
Starter.skmt.ExecNonQuery2("INSERT INTO kmt_info(CAT_CL_CODIGO,CAT_CL_RUTA,CAT_CL_NOMBRE,CAT_CL_ATIENDE1,CAT_CL_ATIENTE2,CAT_CL_TELEFONO,CAT_CL_EMAIL,CAT_CL_CALLE,CAT_CL_NOEXT,CAT_CL_NOINT,CAT_CL_CALLE1,CAT_CL_CALLE2,CAT_CL_COLONIA,CAT_CL_MUNI,CAT_CL_EDO,CAT_CL_CP,CAT_CL_LONG,CAT_CL_LAT,CAT_CL_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO,CAT_CL_BFACTURA,CAT_CL_BCREDITO,CAT_CL_DIAS_VISITA,CAT_CL_TIPO_RUTA, gestion, IMPRESION, CAT_CL_CATEGORIA, CAT_CL_SEGMENTO,CAT_CL_LIMITECREDITO, CREDITO) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,0,?,?,?,?)", Array As Object (CAT_CL_CODIGO,CAT_CL_RUTA,CAT_CL_NOMBRE,CAT_CL_ATIENDE1,CAT_CL_ATIENTE2,CAT_CL_TELEFONO,CAT_CL_EMAIL,CAT_CL_CALLE,CAT_CL_NOEXT,CAT_CL_NOINT,CAT_CL_CALLE1,CAT_CL_CALLE2,CAT_CL_COLONIA,CAT_CL_MUNI,CAT_CL_EDO,CAT_CL_CP,CAT_CL_LAT,CAT_CL_LONG,CAT_CL_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO,CAT_CL_BFACTURA,CAT_CL_BCREDITO,CAT_CL_DIAS_VISITA,CAT_CL_TIPO_RUTA,CAT_CL_CATEGORIA, CAT_CL_SEGMENTO,CAT_CL_LIMITECREDITO,CREDITO))
Next
Starter.skmt.ExecNonQuery2("INSERT INTO kmt_info(CAT_CL_CODIGO,CAT_CL_RUTA,CAT_CL_NOMBRE,CAT_CL_ATIENDE1,CAT_CL_ATIENTE2,CAT_CL_TELEFONO,CAT_CL_EMAIL,CAT_CL_CALLE,CAT_CL_NOEXT,CAT_CL_NOINT,CAT_CL_CALLE1,CAT_CL_CALLE2,CAT_CL_COLONIA,CAT_CL_MUNI,CAT_CL_EDO,CAT_CL_CP,CAT_CL_LONG,CAT_CL_LAT,CAT_CL_BFACTURA,CAT_CL_BCREDITO,CAT_CL_MTOCOMPRA,CAT_CL_NUM_SERIEFISICO,CAT_CL_DIAS_VISITA, gestion, IMPRESION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,0,0,?,0,0) ",Array As Object ("0",e_ruta.TEXT, "VENTA ABORDO","null","null","null","null","null","null","null","null","null","null","null","0","null","null","null","10000000","null"))
Starter.skmt.TransactionSuccessful 'Si no se pone TransactionSuccessful no se escribe NADA!!
Starter.skmt.EndTransaction
LogColor("##################################################################3", Colors.red)
Listo1 = 1
S_CC.Text = "LISTO"
' ToastMessageShow("Catalogo Clientes Actualizados." , True)
If Listo1 = 1 And Listo2 = 1 And Listo3 = 1 And Listo4 = 1 Then
B4XPage_Appear
img2.Visible=False
EJECUTANDO = 0
End If
Else
Log(r.ErrorMessage)
End If
cmd.Initialize
cmd.Name = "select_hist_datos_KELL"
@@ -872,7 +950,7 @@ Sub cargar_Click
cmd.Initialize
cmd.Name = "select_cat_clientes_guna_KELL2"
cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN)
reqManager.ExecuteQuery(cmd , 0, "kmt_datos")
' reqManager.ExecuteQuery(cmd , 0, "kmt_datos")
cmd.Initialize
cmd.Name = "select_hist_datos_KELL"
@@ -1047,7 +1125,7 @@ Sub JobDone(Job As HttpJob)
If logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211110
If Job.JobName = "DBRequest" Then
Dim RESULT As DBResult = reqManager.HandleJob(Job)
If RESULT.Tag = "kmt_datos" Then 'query tag
If RESULT.Tag = "kmt_datos_xxx" Then 'query tag
cargar.Enabled = True
If logger Then Log("TIEMPO kmt_datos : " & ((DateTime.Now-inicioContador)/1000))
S_CC.TEXT = "CARGANDO"
@@ -1090,12 +1168,16 @@ Sub JobDone(Job As HttpJob)
Listo1 = 1
S_CC.Text = "LISTO"
' ToastMessageShow("Catalogo Clientes Actualizados." , True)
If Listo1 =1 And Listo2 =1 And Listo3 = 1 And Listo4 = 1 Then
If Listo1 = 1 And Listo2 = 1 And Listo3 = 1 And Listo4 = 1 Then
B4XPage_Appear
img2.Visible=False
EJECUTANDO = 0
End If
End If
' S_CC.Text = "LISTO"
' Listo1 = 1
bcarga1 = 20
If RESULT.Tag = "hist_promos" Then 'query tag

168
B4A/DBRequestManagerW.bas Normal file
View File

@@ -0,0 +1,168 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=12.8
@EndOfDesignText@
'Class module: jRDC1Wrapper
'Version 1.3 - Thread-Safe with ExecuteCommand support
Public Sub Class_Globals
' Public properties to be accessed after the wait for completes
Type TResultado(Tag As String, Success As Boolean, resultado As DBResult, ErrorMessage As String)
' Type TCommandResult(Tag As String, Success As Boolean, RowsAffected As Int, ErrorMessage As String)
'C <<< Definimos un tipo para almacenar la información de cada job
Type TJobInfo (Target As Object, EventName As String, IsQuery As Boolean)
'C <<< Un mapa para mantener un registro de los jobs activos
Private activeJobs As Map
'C <<< Un contador para generar tags únicos para cada job
Private jobCounter As Int
Public reqManager As DBRequestManager
Public cmd As DBCommand
Public resultado As TResultado
' Public commandResult As TCommandResult
Private logger As Boolean = False
End Sub
'Initializes the object.
Public Sub Initialize
'C <<< Inicializamos el mapa y el contador
activeJobs.Initialize
jobCounter = 0
End Sub
'Executes the query using the old jRDC1 mechanism.
'Parameters:
' - rdcLink: The link for the reqManager initialization.
' - Command: The DBCommand to execute.
' - Target: The module (like 'Me') where the completed event should be raised.
' - Event: The name of the event to raise when the query completes (e.g., "WrapperEvent").
Public Sub ExecuteQuery(rdcLink As String, Command As DBCommand, Target As Object, Event As String)
'<<< Incrementamos el contador para obtener un ID único
jobCounter = jobCounter + 1
Dim currentJobTag As String = "reqManagerWJob_" & jobCounter
currentJobTag = Event
If logger Then Log($"ExecuteQuery (Tag: ${currentJobTag}): Command=${Command.Name}, Event=${Event}"$)
'<<< Creamos una instancia de TJobInfo para guardar el target y el evento
Dim jobInfo As TJobInfo
jobInfo.Initialize
jobInfo.Target = Target
jobInfo.EventName = Event
jobInfo.IsQuery = True ' Mark as query job
'<<< Guardamos la información del job en el mapa, usando el tag único como llave
activeJobs.Put(currentJobTag, jobInfo)
reqManager.Initialize(Me, rdcLink)
cmd = Command
'<<< Ejecutamos la consulta pasando nuestro TAG ÚNICO
reqManager.ExecuteQuery(cmd, 0, currentJobTag)
End Sub
'Executes a command (INSERT, UPDATE, DELETE) using the old jRDC1 mechanism.
'Parameters:
' - rdcLink: The link for the reqManager initialization.
' - Command: The DBCommand to execute.
' - Target: The module (like 'Me') where the completed event should be raised.
' - Event: The name of the event to raise when the command completes (e.g., "WrapperEvent").
Public Sub ExecuteCommand(rdcLink As String, Command As DBCommand, Target As Object, Event As String)
'<<< Incrementamos el contador para obtener un ID único
jobCounter = jobCounter + 1
Dim currentJobTag As String = "reqManagerWJob_" & jobCounter
currentJobTag = Event
If logger Then Log($"ExecuteCommand (Tag: ${currentJobTag}): Command=${Command.Name}, Event=${Event}"$)
'<<< Creamos una instancia de TJobInfo para guardar el target y el evento
Dim jobInfo As TJobInfo
jobInfo.Initialize
jobInfo.Target = Target
jobInfo.EventName = Event
jobInfo.IsQuery = False ' Mark as command job
'<<< Guardamos la información del job en el mapa, usando el tag único como llave
activeJobs.Put(currentJobTag, jobInfo)
reqManager.Initialize(Me, rdcLink)
cmd = Command
'<<< Ejecutamos el comando pasando nuestro TAG ÚNICO
reqManager.ExecuteCommand(cmd, currentJobTag)
End Sub
'This sub will be called by the DBRequestManager when the job is done
Public Sub JobDone(job As HttpJob)
'<<< Obtenemos el Tag único que asignamos al job
Dim currentJobTag As String = job.Tag
'C <<< Verificamos si este job fue iniciado por nuestro wrapper
If activeJobs.ContainsKey(currentJobTag) = False Then
If logger Then Log($"JobDone: Se recibió un job con un tag desconocido: ${currentJobTag}"$)
job.Release
Return
End If
'<<< Recuperamos la información específica de este job desde el mapa
Dim jobInfo As TJobInfo = activeJobs.Get(currentJobTag)
Try
If jobInfo.IsQuery Then
' Handle query result
resultado.Initialize
resultado.Tag = jobInfo.EventName ' Usamos el nombre del evento original como Tag del resultado
If job.Success Then
Dim dbResult As DBResult = reqManager.HandleJob(job)
resultado.Success = True
resultado.Resultado = dbResult
resultado.ErrorMessage = ""
Else
resultado.Success = False
resultado.Resultado = Null
resultado.ErrorMessage = job.ErrorMessage
End If
job.Release
'<<< Usamos la información recuperada del mapa para llamar al Sub correcto
if logger then LogColor($"EVENTO: ${jobInfo.EventName}_Completed"$, Colors.Magenta)
CallSubDelayed2(jobInfo.Target, jobInfo.EventName & "_Completed", resultado)
Else
' Handle command result
resultado.Initialize
resultado.Tag = jobInfo.EventName
If job.Success Then
Dim dbResult As DBResult = reqManager.HandleJob(job)
' Dim rowsAffected As Int = reqManager.HandleCommandResult(job)
' For Each records() As Object In dbResult.Rows
' Dim rowsAffected As Int = records(dbResult.Columns.Get("AffectedRows"))
' Next
resultado.Success = True
resultado.resultado = dbResult
resultado.ErrorMessage = ""
Else
resultado.Success = False
resultado.resultado = Null
resultado.ErrorMessage = job.ErrorMessage
End If
job.Release
'<<< Usamos la información recuperada del mapa para llamar al Sub correcto
If logger Then LogColor($"EVENTO: ${jobInfo.EventName}_Completed"$, Colors.Magenta)
CallSubDelayed2(jobInfo.Target, jobInfo.EventName & "_Completed", resultado)
End If
'C <<< Se remueve el job del mapa en caso de ÉXITO
activeJobs.Remove(currentJobTag)
Catch
if logger then LogColor("Error en jRDC1Wrapper.JobDone: " & LastException, Colors.Red)
'<<< MUY IMPORTANTE: Remover el job del mapa para no tener fugas de memoria
activeJobs.Remove(currentJobTag)
End Try
End Sub

View File

@@ -881,21 +881,22 @@ Module15=|relative|..\C_TrendSpending
Module16=C_updateAvailable
Module17=CameraExClass
Module18=DBRequestManager
Module19=DownloadService
Module19=DBRequestManagerW
Module2=C_CheckList
Module20=errorManager
Module21=EscPosPrinter
Module22=FileHandler
Module23=foto
Module24=kms_helperSubs
Module25=ManageExternalStorage
Module26=MAPA_RUTAS
Module27=Promociones
Module28=SD_Spinner
Module29=Starter
Module20=DownloadService
Module21=errorManager
Module22=EscPosPrinter
Module23=FileHandler
Module24=foto
Module25=kms_helperSubs
Module26=ManageExternalStorage
Module27=MAPA_RUTAS
Module28=Promociones
Module29=SD_Spinner
Module3=C_Cliente
Module30=Subs
Module31=Tracker
Module30=Starter
Module31=Subs
Module32=Tracker
Module4=C_Clientes
Module5=C_Historico
Module6=C_Mapas
@@ -904,13 +905,13 @@ Module8=C_NoVenta
Module9=C_NuevoCliente
NumberOfFiles=421
NumberOfLibraries=28
NumberOfModules=31
NumberOfModules=32
Version=12.8
@EndOfDesignText@
#Region Project Attributes
#ApplicationLabel: Kelloggs Venta
#VersionCode: 3000
#VersionName: 5.04.28
#VersionName: 5.06.25
#SupportedOrientations: portrait
#CanInstallToExternalStorage: False
#BridgeLogger:true
@@ -945,7 +946,7 @@ End Sub
Sub Activity_Create(FirstTime As Boolean)
Dim pm As B4XPagesManager
pm.Initialize(Activity)
Log("***********************************************")
Log("11***********************************************11")
MES1.Initialize(Me, "MES1")
Log("SDK: " & device.SdkVersion)
' Get the device SDK version
@@ -975,7 +976,7 @@ Sub Activity_Create(FirstTime As Boolean)
End If
Log(MES1.IsInitialized)
Log(MES1.HasPermission)
Log("***********************************************")
Log("22***********************************************22")
End Sub
'Template version: B4A-1.01

View File

@@ -24,6 +24,7 @@ ModuleBookmarks29=
ModuleBookmarks3=
ModuleBookmarks30=
ModuleBookmarks31=
ModuleBookmarks32=
ModuleBookmarks4=
ModuleBookmarks5=
ModuleBookmarks6=
@@ -56,6 +57,7 @@ ModuleBreakpoints29=
ModuleBreakpoints3=
ModuleBreakpoints30=
ModuleBreakpoints31=
ModuleBreakpoints32=
ModuleBreakpoints4=
ModuleBreakpoints5=
ModuleBreakpoints6=
@@ -63,9 +65,9 @@ ModuleBreakpoints7=
ModuleBreakpoints8=
ModuleBreakpoints9=
ModuleClosedNodes0=
ModuleClosedNodes1=
ModuleClosedNodes1=6,7,8,9,10,11,12,14,15,16
ModuleClosedNodes10=
ModuleClosedNodes11=
ModuleClosedNodes11=3,5,6
ModuleClosedNodes12=3,7,8,9,10,11,12
ModuleClosedNodes13=6,7,8,9,10,11,12,13,14,16,17
ModuleClosedNodes14=
@@ -79,21 +81,22 @@ ModuleClosedNodes20=
ModuleClosedNodes21=
ModuleClosedNodes22=
ModuleClosedNodes23=
ModuleClosedNodes24=4,24,25,26,27,31,32,33,35
ModuleClosedNodes25=
ModuleClosedNodes26=4
ModuleClosedNodes27=
ModuleClosedNodes24=
ModuleClosedNodes25=24,25,26,27,31,32,33,35
ModuleClosedNodes26=
ModuleClosedNodes27=4
ModuleClosedNodes28=
ModuleClosedNodes29=
ModuleClosedNodes3=5,6,7
ModuleClosedNodes30=115
ModuleClosedNodes31=
ModuleClosedNodes3=5,6
ModuleClosedNodes30=
ModuleClosedNodes31=115
ModuleClosedNodes32=
ModuleClosedNodes4=
ModuleClosedNodes5=
ModuleClosedNodes6=
ModuleClosedNodes7=
ModuleClosedNodes8=
ModuleClosedNodes9=
NavigationStack=C_Clientes,Class_Globals,23,0,C_Clientes,B_IMP_Click,236,0,C_Cliente,B4XPage_Created,316,0,B4XMainPage,B4XPage_Created,155,1,C_Principal,JobDone,1064,0,Diseñador Visual,cliente.bal,-100,3,C_Cliente,B_IMP_Click,1138,0,Subs,ponImpreso,658,0,C_Cliente,Imprime_ticket,1210,6,kms_helperSubs,RD_respalda_kmt_info,362,0,kms_helperSubs,RD_Init,94,4
NavigationStack=kms_helperSubs,RD_Init,69,0,C_Cliente,Imprime_ticket,1573,0,C_Cliente,Guardar_Click,1018,0,kms_helperSubs,RD_respaldoBatch,545,0,kms_helperSubs,RD_respalda_cat_gunaprod2,256,0,kms_helperSubs,RD_restaura_cat_gunaprod2,307,0,kms_helperSubs,RD_respalda_cat_detalle_paq,323,6,kms_helperSubs,TraeVentaSinImprimir,910,0,kms_helperSubs,RD_respalda_cat_rmi,503,0,kms_helperSubs,revisaSiExisteRespaldo,105,0,B4XMainPage,B4XPage_Appear,462,6
SelectedBuild=0
VisibleModules=1,29,11,3,30,13,12,7,27,26,24,4
VisibleModules=1,30,19,11,3,31,12,28,16,18,25

166
B4A/jRDCWrapper.bas Normal file
View File

@@ -0,0 +1,166 @@
B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=12.8
@EndOfDesignText@
'Class module: jRDC1Wrapper
'Version 1.3 - Thread-Safe with ExecuteCommand support
Public Sub Class_Globals
' Public properties to be accessed after the wait for completes
Type TResultado(Tag As String, Success As Boolean, resultado As DBResult, ErrorMessage As String)
' Type TCommandResult(Tag As String, Success As Boolean, RowsAffected As Int, ErrorMessage As String)
'C <<< Definimos un tipo para almacenar la información de cada job
Type TJobInfo (Target As Object, EventName As String, IsQuery As Boolean)
'C <<< Un mapa para mantener un registro de los jobs activos
Private activeJobs As Map
'C <<< Un contador para generar tags únicos para cada job
Private jobCounter As Int
Public reqManager As DBRequestManager
Public cmd As DBCommand
Public resultado As TResultado
' Public commandResult As TCommandResult
Private logger As Boolean = False
End Sub
'Initializes the object.
Public Sub Initialize
'C <<< Inicializamos el mapa y el contador
activeJobs.Initialize
jobCounter = 0
End Sub
'Executes the query using the old jRDC1 mechanism.
'Parameters:
' - rdcLink: The link for the reqManager initialization.
' - Command: The DBCommand to execute.
' - Target: The module (like 'Me') where the completed event should be raised.
' - Event: The name of the event to raise when the query completes (e.g., "WrapperEvent").
Public Sub ExecuteQuery(rdcLink As String, Command As DBCommand, Target As Object, Event As String)
'<<< Incrementamos el contador para obtener un ID único
jobCounter = jobCounter + 1
Dim currentJobTag As String = "jRDCWrapJob_" & jobCounter
If logger Then Log($"ExecuteQuery (Tag: ${currentJobTag}): Command=${Command.Name}, Event=${Event}"$)
'<<< Creamos una instancia de TJobInfo para guardar el target y el evento
Dim jobInfo As TJobInfo
jobInfo.Initialize
jobInfo.Target = Target
jobInfo.EventName = Event
jobInfo.IsQuery = True ' Mark as query job
'<<< Guardamos la información del job en el mapa, usando el tag único como llave
activeJobs.Put(currentJobTag, jobInfo)
reqManager.Initialize(Me, rdcLink)
cmd = Command
'<<< Ejecutamos la consulta pasando nuestro TAG ÚNICO
reqManager.ExecuteQuery(cmd, 0, currentJobTag)
End Sub
'Executes a command (INSERT, UPDATE, DELETE) using the old jRDC1 mechanism.
'Parameters:
' - rdcLink: The link for the reqManager initialization.
' - Command: The DBCommand to execute.
' - Target: The module (like 'Me') where the completed event should be raised.
' - Event: The name of the event to raise when the command completes (e.g., "WrapperEvent").
Public Sub ExecuteCommand(rdcLink As String, Command As DBCommand, Target As Object, Event As String)
'<<< Incrementamos el contador para obtener un ID único
jobCounter = jobCounter + 1
Dim currentJobTag As String = "jRDCWrapJob_" & jobCounter
if logger then Log($"ExecuteCommand (Tag: ${currentJobTag}): Command=${Command.Name}, Event=${Event}"$)
'<<< Creamos una instancia de TJobInfo para guardar el target y el evento
Dim jobInfo As TJobInfo
jobInfo.Initialize
jobInfo.Target = Target
jobInfo.EventName = Event
jobInfo.IsQuery = False ' Mark as command job
'<<< Guardamos la información del job en el mapa, usando el tag único como llave
activeJobs.Put(currentJobTag, jobInfo)
reqManager.Initialize(Me, rdcLink)
cmd = Command
'<<< Ejecutamos el comando pasando nuestro TAG ÚNICO
reqManager.ExecuteCommand(cmd, currentJobTag)
End Sub
'This sub will be called by the DBRequestManager when the job is done
Public Sub JobDone(job As HttpJob)
'<<< Obtenemos el Tag único que asignamos al job
Dim currentJobTag As String = job.Tag
'C <<< Verificamos si este job fue iniciado por nuestro wrapper
If activeJobs.ContainsKey(currentJobTag) = False Then
If logger Then Log($"JobDone: Se recibió un job con un tag desconocido: ${currentJobTag}"$)
job.Release
Return
End If
'<<< Recuperamos la información específica de este job desde el mapa
Dim jobInfo As TJobInfo = activeJobs.Get(currentJobTag)
Try
If jobInfo.IsQuery Then
' Handle query result
resultado.Initialize
resultado.Tag = jobInfo.EventName ' Usamos el nombre del evento original como Tag del resultado
If job.Success Then
Dim dbResult As DBResult = reqManager.HandleJob(job)
resultado.Success = True
resultado.Resultado = dbResult
resultado.ErrorMessage = ""
Else
resultado.Success = False
resultado.Resultado = Null
resultado.ErrorMessage = job.ErrorMessage
End If
job.Release
'<<< Usamos la información recuperada del mapa para llamar al Sub correcto
if logger then LogColor($"EVENTO: ${jobInfo.EventName}_Completed"$, Colors.Magenta)
CallSubDelayed2(jobInfo.Target, jobInfo.EventName & "_Completed", resultado)
Else
' Handle command result
resultado.Initialize
resultado.Tag = jobInfo.EventName
If job.Success Then
Dim dbResult As DBResult = reqManager.HandleJob(job)
' Dim rowsAffected As Int = reqManager.HandleCommandResult(job)
' For Each records() As Object In dbResult.Rows
' Dim rowsAffected As Int = records(dbResult.Columns.Get("AffectedRows"))
' Next
resultado.Success = True
resultado.resultado = dbResult
resultado.ErrorMessage = ""
Else
resultado.Success = False
resultado.resultado = Null
resultado.ErrorMessage = job.ErrorMessage
End If
job.Release
'<<< Usamos la información recuperada del mapa para llamar al Sub correcto
If logger Then LogColor($"EVENTO: ${jobInfo.EventName}_Completed"$, Colors.Magenta)
CallSubDelayed2(jobInfo.Target, jobInfo.EventName & "_Completed", resultado)
End If
'C <<< Se remueve el job del mapa en caso de ÉXITO
activeJobs.Remove(currentJobTag)
Catch
if logger then LogColor("Error en jRDC1Wrapper.JobDone: " & LastException, Colors.Red)
'<<< MUY IMPORTANTE: Remover el job del mapa para no tener fugas de memoria
activeJobs.Remove(currentJobTag)
End Try
End Sub

View File

@@ -73,6 +73,7 @@ Sub RD_Init
limpiarBD = True
Log("NO EXISTE BD")
End If
LogColor("#################################################" & CRLF & " safePath: " & safePath, Colors.red)
rkmt.Initialize(safePath, $"${name(0)}.rkmt.km"$, True)
If limpiarBD Then
LogColor("----->> LIMPIAMOS BD RECUPERACION PRIMERA VEZ <<-------", Colors.red)
@@ -117,6 +118,9 @@ Sub revisaSiExisteRespaldo
If File.size(File.DirInternal&"/kmts", $"${name(0)}.rkmt.km"$) < 43000 And File.Exists(File.DirRootExternal & extDir, $"${name(0)}.rkmt.km"$) Then
LogColor("Copiamos el respaldo desde la tarjeta!!", Colors.red)
File.Copy(File.DirRootExternal & extDir, $"${name(0)}.rkmt.km"$, File.DirInternal&"/kmts", $"${name(0)}.rkmt.km"$)
RD_Init
Else
LogColor("No hay respaldo en tarjeta externa!", Colors.red)
End If
@@ -327,7 +331,9 @@ Sub RD_respalda_cat_detalle_paq
End If
Catch
Log(LastException)
rkmt.Close
End Try
Log(2.5)
x.Close
End Sub