B4A=true Group=Default Group ModulesStructureVersion=1 Type=StaticCode Version=11 @EndOfDesignText@ 'Code module 'Subs in this code module will be accessible from all modules. Sub Process_Globals 'These global variables will be declared once when the application starts. 'These variables can be accessed from all modules. Public GZip As GZipStrings 'Usa la libreria CompressStrings Private su As StringUtils 'Usa la libreria StringUtils Dim phn As Phone Dim devModel As String Dim kmt, errorLog As SQL 'Requiere la libreria "SQL" ' Dim wifi As MLwifi Dim ssid As String 'ignore Dim rutaMaxPoints As Int = 3000 Dim rutaHrsAtras As Int = 48 ' Dim rutaInicioHoy As String = "" Private subsLogs As Boolean = False End Sub 'Pone el valor de phn.Model en la variable global "devModel" Sub getPhnId As String 'ignore 'Requiere la libreria "Phone" devModel = phn.Model If devModel.Length <= 3 Then 'Si phn.Model esta en blanco ... Dim t As String = phn.GetSettings("android_id") 'Intentamos con "android_id" devModel = t End If If devModel.Length >= 3 Then 'Si tenemos valor para phn.Model File.WriteString(File.DirInternal, "phnId.txt", devModel) 'Sobreescribimos archivo phnId.txt with deviceId ' Log("Tenemos phnId: "&devModel&" "&File.DirInternal&"/phn.txt sobreescrito") Else If devModel.Length < 3 Then ' Si no tenemos valor, lo leemos de phnId.txt Dim s As String = File.ReadString(File.DirInternal, "phnId.txt") devModel = s ' Log("Leemos id de "&File.DirInternal&"/phnId.txt") ' Log(devModel) End If Return devModel End Sub 'Comprime y regresa un texto (str) en base64 Sub compress(str As String) As String 'ignore 'Requiere la libreria "CompressStrings" Dim compressed() As Byte = GZip.compress(str) ' Log($"UncompressedBytesLength: ${str.Length}"$) ' Log($"CompressedBytesLength: ${compressed.Length}"$) Dim base64 As String = su.EncodeBase64(compressed) Log($"Comprimido: ${base64.Length}"$) ' Log($"CompressedBytes converted to base64: ${base64}"$) Return base64 End Sub 'Descomprime y regresa un texto en base64 Sub decompress(base64 As String) As String 'ignore Dim decompressedbytes() As Byte = su.DecodeBase64(base64) ' Log($"decompressedbytesLength: ${decompressedbytes.Length}"$) Dim bc As ByteConverter Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8") Log($"Descomprimido: ${uncompressed.Length}"$) ' Log($"Decompressed String = ${uncompressed}"$) Return uncompressed End Sub 'Convierte una fecha al formato yyMMddHHmmss Sub fechaKMT(fecha As String) As String 'ignore ' Log(fecha) Dim OrigFormat As String = DateTime.DateFormat 'save orig date format DateTime.DateFormat="yyMMddHHmmss" Dim nuevaFecha As String=DateTime.Date(fecha) DateTime.DateFormat=OrigFormat 'return to orig date format ' Log(nuevaFecha) Return nuevaFecha End Sub 'Genera una notificacion con importancia alta Sub notiHigh(title As String, body As String, activity As Object) 'ignore Private notif As Notification notif.Initialize2(notif.IMPORTANCE_HIGH) notif.Icon = "icon" notif.Vibrate = False notif.Sound = False notif.AutoCancel = True Log("notiHigh: "&title) notif.SetInfo(title, body, activity) ' Log("notiHigh SetInfo") notif.Notify(777) End Sub 'Regresa el objeto de una notificacion con importancia baja Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore Private notification As Notification notification.Initialize2(notification.IMPORTANCE_LOW) Log("notiLowReturn: "&title) notification.Icon = "icon" notification.Sound = False notification.Vibrate = False notification.SetInfo(title, Body, Main) notification.Notify(id) ' Log("notiLowReturn SetInfo") Return notification End Sub 'Escribimos las coordenadas y fecha a un archivo de texto Sub guardaInfoEnArchivo(coords As String) 'ignore ' Cambiamos el formato de la hora Dim OrigFormat As String=DateTime.DateFormat 'save orig date format DateTime.DateFormat="MMM-dd HH:mm:ss" Dim lastUpdate As String=DateTime.Date(DateTime.Now) DateTime.DateFormat=OrigFormat 'return to orig date format Dim ubic As String = coords&","&lastUpdate Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", True) Dim s As String = ubic & CRLF Dim t() As Byte = s.GetBytes("UTF-8") out.WriteBytes(t, 0, t.Length) out.Close End Sub 'Escribimos las coordenadas (latitud, longitud, fecha) y fecha a una BD Sub guardaInfoEnBD(coords As String) 'ignore Log("Guardamos ubicacion en BD - "&coords) Try Dim latlon() As String = Regex.Split("\|", coords) If latlon.Length < 2 Then latlon = Regex.Split(",", coords) 'Si son menos de 2, entonces estan separadas por comas y no por "|" If subsLogs Then Log("LatLon="&latlon) kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(FECHA, LAT, LON) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1))) Catch LogColor(LastException, Colors.red) End Try End Sub 'Limpiamos la tabla RUTA_GPS de la BD Sub deleteGPS_DB 'ignore kmt.ExecNonQuery("delete from RUTA_GPS") kmt.ExecNonQuery("vacuum;") ToastMessageShow("Borramos BD Coords GPS", False) End Sub 'Limpiamos la tabla errorLog de la BD Sub deleteErrorLog_DB 'ignore errorLog.ExecNonQuery("delete from errores") errorLog.ExecNonQuery("vacuum;") ToastMessageShow("BD Errores Borrada", False) End Sub 'Borramos el archio "gps.txt" Sub borramosArchivoGPS 'ignore Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", False) Dim s As String = "" Dim t() As Byte = s.GetBytes("UTF-8") out.WriteBytes(t, 0, t.Length) out.Close End Sub 'Obtiene el ssid al que esta conectado el telefono Sub getSSID 'ignore ' 'Requiere la libreria "MLWifi400" ' If wifi.isWifiConnected Then ' ssid = wifi.WifiSSID ' End If End Sub 'Convierte un texto en formato JSON a un objeto "Map" Sub JSON2Map(theJson As String) As Map 'ignore 'Requiere la libreria "JSON" Try Private json As JSONParser json.Initialize(theJson) Return json.NextObject Catch Log(LastException) log2DB("JSON2Map: "&LastException) Private m As Map = CreateMap("title":"Error generating JSON", "t":"Error", "Message":LastException, "text" : LastException) Return m End Try End Sub 'Convierte un mapa a formato JSON Sub map2JSON(m As Map) As String 'ignore 'Requiere la libreria "JSON" 'Convierte un objecto "Map" a JSON Dim jg As JSONGenerator jg.Initialize(m) Dim t As String = jg.ToString Return t End Sub 'Mandamos "coords" en un mensaje a "Sprvsr" 'Sub mandamosLoc(coords As String) 'ignore '' Log("Iniciamos mandamosLoc "&coords) '' Log("locRequest="&Tracker.locRequest) ' guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd ' Dim t As String ' If Tracker.locRequest="Activa" Then ' If PushService.au = 1 Then ' t = "au" ' es una actualizacion ' Else ' t = "u" ' es una peticion ' End If ' Dim params As Map = CreateMap("topic":"Sprvsr", "coords":coords, "t":t, "b":PushService.battery, "mt":Main.montoActual) ' CallSub2(PushService, "mandaMensaje",params) ' Tracker.locRequest="Enviada" ' CallSubDelayed(Tracker,"CreateLocationRequest") ' End If 'End Sub 'Regresa la fecha y hora de hoy a las 00:00 en el formato "yyMMddHHMMSS" Sub fechaInicioHoy As String 'ignore Dim OrigFormat As String = DateTime.DateFormat 'save orig date format DateTime.DateFormat="yyMMdd" Private h As String = DateTime.Date(DateTime.Now)&"000000" DateTime.DateFormat=OrigFormat 'return to orig date format Log("Hoy="&h) Return h End Sub 'Guardamos "texto" a la bitacora Sub log2DB(texto As String) 'ignore LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.LightGray) kmt.ExecNonQuery2("INSERT INTO bitacora(fecha, texto) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), texto)) End Sub 'Regresa verdadero si ya pasaron XX minutos de la fecha dada Sub masDeXXMins(hora As Int, mins As Int) As Boolean 'ignore If (hora + mins * DateTime.TicksPerMinute) < DateTime.Now Then Return True Else Return False End If End Sub 'Regresa verdadero si ya pasaron XX minutos de la fechaKMT dada Sub masDeXXMinsKMT(hora As String, mins As Int) As Boolean 'ignore Try ' LogColor($"Hora=${fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute)}, Mins=${mins}, Actual=${fechaKMT(DateTime.Now)}"$,Colors.red) If fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute < DateTime.Now Then ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now)) Return True Else ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " > " & fechaKMT(DateTime.Now)) Return False End If Catch Log(LastException) End Try End Sub 'Limpiamos la tabla "bitacora" de la BD Sub borraLogDB 'ignore LogColor("Borramos BD de log", Colors.Magenta) kmt.ExecNonQuery("delete from bitacora") kmt.ExecNonQuery("vacuum;") End Sub 'Monitoreamos los servicios para ver si estan activos (No pausados), y si no, los reniciamos 'Sub Monitor 'ignore ' Private monitorStatus As Boolean = True ' LogColor("Corriendo Subs.Monitor", Colors.RGB(161,150,0)) ' If IsPaused(Tracker) Then ' log2DB("Reiniciando 'Tracker Pausado' desde Subs.Monitor") ' StartService(Tracker) ' monitorStatus = False ' Else ' CallSubDelayed(Tracker, "revisaFLP") ' End If ' If IsPaused(PushService) Then ' log2DB("Reiniciando 'PushService Pausado' desde Subs.Monitor") ' StartService(PushService) ' monitorStatus = False ' Else ' revisaPushService ' End If ' If monitorStatus Then LogColor(" +++ +++ Servicios Activos", Colors.Green) 'End Sub 'Regresa la tabla "errores" en una lista de mapas convertida a JSON Sub dameErroresJSON(SQL As SQL, maxErrores As Int, comprimido As Boolean) As String 'ignore Log("dameErroresJSON") Private j As JSONGenerator Private lim As String Private cur As ResultSet Private l As List Private i As Int = 0 l.Initialize Dim m, m2 As Map m2.Initialize If maxErrores = 0 Then lim = "" Else lim = "limit "&maxErrores cur = SQL.ExecQuery("select * from errores order by fecha desc "&lim) Do While cur.NextRow m.Initialize m.Put("fecha", cur.GetString("fecha")) m.Put("error", cur.GetString("error")) m2.Put(i,m) i = i + 1 Loop cur.Close j.Initialize(m2) Log(j.ToString) If comprimido Then Return compress(j.ToString) Else Return j.ToString End If End Sub 'Convierte una fecha en formato YYMMDDHHMMSS a Ticks Sub fechaKMT2Ticks(fKMT As String) As Long 'ignore Try If fKMT.Length = 12 Then Private parteFecha As String = fKMT.SubString2(0,6) Private parteHora As String = fKMT.SubString(6) Private OrigFormat As String = DateTime.DateFormat 'save original date format DateTime.DateFormat="yymmdd" DateTime.TimeFormat="HHmmss" Private ticks As Long = DateTime.DateTimeParse(parteFecha,parteHora) DateTime.DateFormat=OrigFormat 'return to original date format Return ticks Else Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length) Return 0 End If Catch Log(LastException) LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red) Return 0 End Try End Sub Sub InstallAPK(dir As String, apk As String) 'ignore If File.Exists(dir, apk) Then Dim i As Intent i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(dir, apk)) i.SetType("application/vnd.android.package-archive") StartActivity(i) End If End Sub 'Copia la base de datos del almacenamiento interno al externo en el directorio kmts Sub copiaDB(result As Boolean) 'ignore ToastMessageShow("copiaDB", False) If result Then Dim p As String If File.ExternalWritable Then p = File.DirRootExternal ' Log("Externo") Else p = File.DirInternal ' Log("Interno") End If Dim theDir As String Try File.MakeDir(File.DirRootExternal,"kmts") theDir = "/kmts" Catch theDir = "" End Try Try File.Copy(File.DirInternal,"kmt.db",File.DirRootExternal&theDir,"cedex_kmt.db") File.Copy(File.DirInternal,"errorLog.db",File.DirRootExternal&theDir,"cedex_errorLog.db") ToastMessageShow("BD copiada!", False) Catch ToastMessageShow("No se pudo hacer la copia: "&LastException, True) End Try Log("rootExternal="&p) Log("File.DirInternal="&File.DirInternal) Log("File.DirRootExternal="&File.DirRootExternal) Else ToastMessageShow("Sin permisos", False) End If End Sub 'Hace visible y trae al frente el panel con los parametros "Top" y "Left" dados Sub panelVisible(panel As Panel, top As Int, left As Int) 'ignore panel.BringToFront panel.Visible = True panel.Top = top panel.Left = left End Sub 'Centra una etiqueta dentro de un elemento superior Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) End Sub 'Centra un panel horizontalmente dentro de un elemento superior Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) End Sub 'Centra un panel verticalmente dentro de un elemento superior Sub centraPanelV(elemento As Panel, altoElementoSuperior As Int) 'ignore elemento.Top = Round(altoElementoSuperior/2)-(elemento.Height/2) End Sub 'Centra una barra de progreso dentro de un elemento superior Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) End Sub 'Regresa el usuario de la tabla USUARIOA si es que existe, si no existe, regresa "SinUsuario". Sub buscaDBUsuario As String 'ignore Private c As Cursor Private usuario As String = "SinUsuario" c=kmt.ExecQuery("select USUARIO from usuarioa") c.Position=0 If c.RowCount > 0 Then usuario = c.GetString("USUARIO") Return usuario End Sub ''Inserta un producto en la tabla "PEDIDO" 'Sub guardaProductoX(cedis As String, costoTot As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, tipoV As String, precio2 As String, query As String) 'ignore '' LogColor("guardaProducto", Colors.Magenta) '' Log($"Guardamos producto ${prodId}"$) '' B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_TIPO, PE_PRECIO2, PE_RUTA) VALUES(?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (cedis, costoTot, costoU, cant, nombre, prodId, clienteId, fecha, usuario, tipoV, precio2, Starter.rutaV)) '' B4XPages.MainPage.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cant, prodId)) '' ToastMessageShow("guardaProd", False) 'End Sub 'Sub guardaProductoSin(cedis As String, costoTot As String, costoU As String, cant As String, nombre As String, prodId As String, clienteId As String, fecha As String, usuario As String, rutaV As String, precioSin As String, tipoV As String, precio2 As String, query As String) 'ignore '' LogColor("guardaProductoSin", Colors.Magenta) '' B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO PEDIDO (PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_RUTA, PE_COSTO_SIN, PE_TIPO, PE_PRECIO2) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?) ", Array As Object (cedis, costoTot,costoU, cant, nombre, prodId, clienteId, fecha, usuario, rutaV, precioSin, tipoV, precio2)) '' B4XPages.MainPage.skmt.ExecNonQuery2("update " & query & " set cat_gp_almacen = cat_gp_almacen - ? where cat_gp_id = ? ", Array As Object(cant, prodId)) '' DateTime.DateFormat = "MM/dd/yyyy" '' Private sDate As String =DateTime.Date(DateTime.Now) '' Private sTime As String =DateTime.Time(DateTime.Now) '' Private c As Cursor = B4XPages.MainPage.skmt.ExecQuery("select sum(pe_costo_tot) as TOTAL_CLIE, SUM(PE_CANT) AS CANT_CLIE, SUM(PE_COSTO_SIN) AS TOTAL_CLIE_SIN FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa)") '' c.Position=0 '' B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where PC_CLIENTE In (select cuenta from cuentaa)") '' B4XPages.MainPage.skmt.ExecNonQuery2("insert into pedido_cliente(PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT,PC_ALMACEN,PC_RUTA,PC_COSTO_SIN) VALUES (?,?,?,?,?,?,?,?,?,?)", Array As Object(clienteId, sDate & sTime, usuario, c.GetString("CANT_CLIE"),c.GetString("TOTAL_CLIE"), B4XPages.MainPage.lon_gps, B4XPages.MainPage.lat_gps, cedis, rutaV, c.GetString("TOTAL_CLIE_SIN"))) '' B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 2 where CAT_CL_CODIGO In (select cuenta from cuentaa)") '' c.Close ' ToastMessageShow("guardaProdSin", False) 'End Sub 'Regresa el almacen actual de la base de datos. Sub traeAlmacen As String 'ignore Private c As Cursor Private a As String c=B4XPages.MainPage.skmt.ExecQuery("select ID_ALMACEN from CAT_ALMACEN") c.Position = 0 a = C.GetString("ID_ALMACEN") c.Close Return a End Sub 'Regresa el nombre del producto desde CAT_GUNAPROD Sub traeProdNombre(id As String) As String Private h As Cursor Private n As String h=B4XPages.MainPage.skmt.ExecQuery2("select CAT_GP_NOMBRE from CAT_GUNAPROD where CAT_GP_ID = ? ", Array As String(id.Trim)) If h.RowCount > 0 Then h.Position = 0 n = h.GetString("CAT_GP_NOMBRE") ' Log(h.RowCount&"|"&id&"|"&n&"|") End If h.Close If n = Null Or n="" Then n = "N/A" ' Log(h.RowCount&"|"&id&"|"&n&"|") Return n End Sub 'Regresa la ruta actual de la base de datos. Sub traeRuta As String 'ignore Private c As Cursor Private r As String c=B4XPages.MainPage.skmt.ExecQuery("select CAT_CL_RUTA from kmt_info where CAT_CL_CODIGO In (Select cuenta from cuentaa)") r = "0" If c.RowCount > 0 Then c.Position=0 r = c.GetString("CAT_CL_RUTA") End If c.Close Return r End Sub Sub traeCliente As String 'ignore Private c As Cursor Private cl As String c=B4XPages.MainPage.skmt.ExecQuery("Select CUENTA from cuentaa") c.Position=0 cl = c.GetString("CUENTA") c.Close Return cl End Sub Sub traeFecha As String 'ignore DateTime.DateFormat = "MM/dd/yyyy" Private sDate As String =DateTime.Date(DateTime.Now) Private sTime As String =DateTime.Time(DateTime.Now) Return sDate & sTime End Sub 'Regresa un mapa con los datos del producto desde la base de datos. 'el mapa incluye: Id, nombre, tipo y subtipo del producto. Sub traeProdIdDeBD As Map 'ignore Private c As Cursor Private m As Map c=B4XPages.MainPage.skmt.ExecQuery("select CAT_GP_ID,CAT_GP_NOMBRE,CAT_GP_TIPO,CAT_GP_SUBTIPO from CAT_GUNAPROD where CAT_GP_NOMBRE In (Select PDESC from PROID)") If c.RowCount > 0 Then c.Position = 0 m = CreateMap("id":c.GetString("CAT_GP_ID"), "nombre":c.GetString("CAT_GP_NOMBRE"), "tipo":c.GetString("CAT_GP_TIPO"), "subtipo":c.GetString("CAT_GP_SUBTIPO")) Else m = CreateMap("id":"N/A", "nombre":"N/A", "tipo":"N/A", "subtipo":"N/A") End If c.Close Return m End Sub 'Guarda en la base de datos la hora inicial y final de la vista. Sub guardaClienteHoraInicio(cliente As String) B4XPages.MainPage.skmt.ExecNonQuery2("insert into PEDIDO_INICIO_FINAL(PIF_CLIENTE, PIF_HORA_INICIO, PIF_HORA_FINAL) VALUES(?,?,?) ", Array As Object (cliente, DateTime.Now, 0)) ' LogColor($"insertamos ${cliente}, hora_inicio=${DateTime.Now}, hora_final=0"$,Colors.Red) End Sub 'Regresa el total de productos y monto del pedido del cliente actual. Sub traeTotalesClienteActual As Map Private m As Map m.Initialize Private c_prodsX As Cursor=B4XPages.MainPage.skmt.ExecQuery("select ifnull(sum(PE_CANT), 0) as cantProds, ifnull(sum(PE_COSTO_TOT), 0) as costoTotal FROM PEDIDO WHERE PE_CLIENTE IN (Select CUENTA from cuentaa) order by PE_PRONOMBRE asc") c_prodsX.Position=0 ' LogColor($"Productos de la orden: ${c_prodsX.GetString("cantProds")}, Total: ${c_prodsX.GetString("costoTotal")}"$, Colors.red) m = CreateMap("productos": c_prodsX.GetString("cantProds"), "monto" : c_prodsX.GetString("costoTotal")) Return m End Sub 'Borra el pedido del cliente actual. 'Borra los registros de la tabla "pedido" y "pedido_cliente" 'Actualiza las tablas "cat_gunaprod" y "kmt_info". Sub borraPedidoClienteActual As String Private thisC As Cursor thisC=B4XPages.MainPage.skmt.ExecQuery("select PE_PROID,PE_CANT FROM PEDIDO where pe_cliente in (Select CUENTA from cuentaa) ") If thisC.RowCount>0 Then For i=0 To thisC.RowCount -1 thisC.Position=i B4XPages.MainPage.skmt.ExecNonQuery2("update cat_gunaprod set cat_gp_almacen = cat_gp_almacen + ? where cat_gp_id = ?", Array As Object(thisC.GetString("PE_CANT"),thisC.GetString("PE_PROID"))) B4XPages.MainPage.skmt.ExecNonQuery2("INSERT INTO INVENT_X_ENVIAR (ALMACEN , PROID , CANTIDAD ) VALUES(?,?,?) ", Array As Object (traeAlmacen, thisC.GetString("PE_PROID"),thisC.GetString("PE_CANT")* -1)) Next End If B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido_cliente where pc_cliente in (Select CUENTA from cuentaa)") B4XPages.MainPage.skmt.ExecNonQuery("delete from pedido where pe_cliente in (Select CUENTA from cuentaa)") B4XPages.MainPage.skmt.ExecNonQuery("UPDATE kmt_info set gestion = 0 where CAT_CL_CODIGO In (select cuenta from cuentaa)") Return 1 End Sub 'Regresa verdadero si la columna gestion en la tabla "kmt_info" tene valor 2. 'si no, entonces regresa falso. Sub pedidoGuardado As Boolean Private guardado As Boolean = False Private g As Cursor = B4XPages.MainPage.skmt.ExecQuery("select gestion from kmt_info where CAT_CL_CODIGO in (Select CUENTA from cuentaa)") If g.RowCount > 0 Then g.Position=0 If g.GetString("gestion") = "2" Then guardado = True End If Log($"Guardado=${guardado}"$) Return guardado End Sub 'Regresa verdadero si hay pedido en la tabla "PEDIDO" del cliente actual. Sub hayPedido As Boolean Private thisC As Cursor=B4XPages.MainPage.skmt.ExecQuery($"select count(PE_CLIENTE) as hayPedido from PEDIDO where PE_CLIENTE = '${traeCliente}'"$) thisC.Position=0 Private hay As Boolean = False If thisC.GetInt("hayPedido") > 0 Then hay = True ' Log($"Cliente actual=${traeCliente}, hayPedido=${hay}"$) Return hay End Sub 'Guarda el nombre y version de la app en CAT_VARIABLES. Sub guardaAppInfo(skmt As SQL) skmt.ExecNonQuery("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = 'EMPRESA' or CAT_VA_DESCRIPCION = 'APP_NAME' or CAT_VA_DESCRIPCION = 'APP_VERSION'") skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_NAME', '${Application.LabelName}')"$) skmt.ExecNonQuery($"insert into CAT_VARIABLES (CAT_VA_DESCRIPCION, CAT_VA_VALOR) values ('APP_VERSION', '${Application.VersionName}')"$) End Sub