diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas index a38cc1d..29206b5 100644 --- a/B4A/B4XMainPage.bas +++ b/B4A/B4XMainPage.bas @@ -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 diff --git a/B4A/C_Cliente.bas b/B4A/C_Cliente.bas index daecc10..71a46fc 100644 --- a/B4A/C_Cliente.bas +++ b/B4A/C_Cliente.bas @@ -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 diff --git a/B4A/C_Principal.bas b/B4A/C_Principal.bas index 8d2d93a..7909a08 100644 --- a/B4A/C_Principal.bas +++ b/B4A/C_Principal.bas @@ -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 diff --git a/B4A/DBRequestManagerW.bas b/B4A/DBRequestManagerW.bas new file mode 100644 index 0000000..2a1aa3f --- /dev/null +++ b/B4A/DBRequestManagerW.bas @@ -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 \ No newline at end of file diff --git a/B4A/KelloggsV4.b4a b/B4A/KelloggsV4.b4a index 88130d4..428bf70 100644 --- a/B4A/KelloggsV4.b4a +++ b/B4A/KelloggsV4.b4a @@ -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 diff --git a/B4A/KelloggsV4.b4a.meta b/B4A/KelloggsV4.b4a.meta index f090162..4f78d0d 100644 --- a/B4A/KelloggsV4.b4a.meta +++ b/B4A/KelloggsV4.b4a.meta @@ -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 diff --git a/B4A/jRDCWrapper.bas b/B4A/jRDCWrapper.bas new file mode 100644 index 0000000..9a2f578 --- /dev/null +++ b/B4A/jRDCWrapper.bas @@ -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 \ No newline at end of file diff --git a/B4A/kms_helperSubs.bas b/B4A/kms_helperSubs.bas index d06b2e8..b337d97 100644 --- a/B4A/kms_helperSubs.bas +++ b/B4A/kms_helperSubs.bas @@ -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