mirror of
https://github.com/KeymonSoft/Intmex_Multiventa.git
synced 2026-04-17 21:06:08 +00:00
VERSION 6.03.16
- Cambios en validador para enviar el pedido enun solo paquete y no produto producto.
This commit is contained in:
@@ -315,6 +315,8 @@ Private Sub B4XPage_Created (Root1 As B4XView)
|
||||
p_muestraPendientes.Left = Root.Width - p_muestraPendientes.Width - 5dip
|
||||
' p_conexion.Top = 1 : p_conexion.left = Root.width - p_conexion.width
|
||||
l_conexion.Top = 0 : l_conexion.left = Root.width - l_conexion.width -2
|
||||
p_prod.Left = 0 : p_prod.Top = 0
|
||||
p_mandaInfo.Top = 0 : p_mandaInfo.left = 0
|
||||
End Sub
|
||||
|
||||
Sub chkIfTableExists(db As SQL, table As String) As Boolean 'ignore
|
||||
@@ -996,7 +998,7 @@ Sub cargar_Click
|
||||
reqManager.ExecuteQuery(cmd , 0, "kmt_datos_todos")
|
||||
|
||||
cmd.Initialize
|
||||
cmd.Name = "select_hist_datos_INTMEX_2"
|
||||
cmd.Name = "select_hist_datos_INTMEX_3"
|
||||
cmd.Parameters = Array As Object(e_ruta.text, ALMACEN)
|
||||
Log($"===> ${e_ruta.text}, ${ALMACEN}"$)
|
||||
reqManager.ExecuteQuery(cmd , 0, "hist_datos")
|
||||
@@ -1055,7 +1057,7 @@ Sub cargar_Click
|
||||
reqManager.ExecuteQuery(cmd , 0, "kmt_datos_todos")
|
||||
|
||||
cmd.Initialize
|
||||
cmd.Name = "select_hist_datos_INTMEX"
|
||||
cmd.Name = "select_hist_datos_INTMEX_3"
|
||||
cmd.Parameters = Array As Object(E_RUTA2.text, ALMACEN)
|
||||
reqManager.ExecuteQuery(cmd , 0, "hist_datos")
|
||||
|
||||
@@ -1150,7 +1152,6 @@ Sub JobDone(Job As HttpJob)
|
||||
LogColor("###### JobError: " & Job.Tag & CRLF & Job.ErrorMessage, Colors.red)
|
||||
LogColor("############################################", Colors.red)
|
||||
Else 'If Job Success then ...
|
||||
Log(3)
|
||||
LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.RGB(0,160,0)) 'Mod por CHV - 211027
|
||||
'Verificamos que el usuario guardado en BD sea VALIDO.
|
||||
If Job.JobName = "DBRequest" Then
|
||||
@@ -1450,7 +1451,7 @@ Sub JobDone(Job As HttpJob)
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
|
||||
|
||||
If Job.JobName = "DBRequest" Then
|
||||
Dim RESULT As DBResult = reqManager.HandleJob(Job)
|
||||
If RESULT.Tag = "hist_cliente_promos" Then 'query tag
|
||||
@@ -1464,6 +1465,26 @@ Sub JobDone(Job As HttpJob)
|
||||
End If
|
||||
End If
|
||||
|
||||
' If Job.JobName = "DBRequest" Then
|
||||
' Dim RESULT As DBResult = reqManager.HandleJob(Job)
|
||||
' If RESULT.Tag.As(String).Contains("pedido_completo") Then 'query tag
|
||||
' Subs.logJobDoneResultados(RESULT)
|
||||
' For Each records() As Object In resultado.Rows
|
||||
' If records(resultado.Columns.Get("AffectedRows")).As(Int) > 0 Then
|
||||
' Private pars() As String = Regex.Split("_", RESULT.tag)
|
||||
' B4XPages.MainPage.skmt.ExecNonQuery($"update PEDIDO set PE_ENVIO_OK = 1, PE_GUARDADO = 1 where PE_CLIENTE = '${pars(2)}'"$)
|
||||
' Log($"update PEDIDO set PE_ENVIO_OK = 1, PE_GUARDADO = 1 where PE_CLIENTE = '${pars(2)}'"$)
|
||||
' B4XPages.MainPage.skmt.ExecNonQuery($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 1, PC_GUARDADO = 1 where PC_CLIENTE = '${pars(2)}'"$)
|
||||
' Log($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 1, PC_GUARDADO = 1 where PC_CLIENTE = '${pars(2)}'"$)
|
||||
'
|
||||
' ($"update PEDIDO_CLIENTE set PC_ENVIO_OK = 1 where PC_CLIENTE = '${pars(3)}'"$)
|
||||
'
|
||||
' End If
|
||||
' Next
|
||||
'' validador.iniciaValidacion
|
||||
' End If
|
||||
' End If
|
||||
|
||||
If Job.JobName = "DBRequest" Then
|
||||
Dim RESULT As DBResult = reqManager.HandleJob(Job)
|
||||
If RESULT.Tag = "HIST_MARCAS_CUOTAS" Then 'query tag
|
||||
@@ -3002,4 +3023,127 @@ Private Sub B_PROM_Click
|
||||
lv_prod_Prin.AddSingleLine("No hay datos disponibles.")
|
||||
End If
|
||||
c.Close
|
||||
End Sub
|
||||
End Sub
|
||||
|
||||
Private Sub l_conexion_LongClick
|
||||
' enviaPedidoBatch_PRUEBA("todos")
|
||||
End Sub
|
||||
|
||||
' 1. Recopila encabezados y detalles de pedidos locales (todos o solo los pendientes).
|
||||
' 2. Genera un ID único (Arch) para vincular exactamente cada venta con sus productos.
|
||||
' 3. Empaqueta todo en una lista de comandos (Batch) para enviarlo al servidor en una sola transacción.
|
||||
Sub enviaPedidoBatch_PRUEBA(filtro As String)
|
||||
' Creamos una lista llamada BatchCommands. Aquí vamos a guardar todas las instrucciones
|
||||
' de base de datos que queremos mandar al servidor de un solo golpe (en lote o "batch").
|
||||
Dim BatchCommands As List
|
||||
BatchCommands.Initialize
|
||||
LogColor("##############################################", Colors.Red)
|
||||
LogColor($"### enviaPedidoBatch(${filtro})"$, Colors.red)
|
||||
LogColor("##############################################", Colors.Red)
|
||||
|
||||
DateTime.TimeFormat = "HHmmss"
|
||||
Private elFolio As String = DateTime.Time(DateTime.Now)
|
||||
|
||||
' Preparamos una variable para filtrar la consulta a la base de datos.
|
||||
' Si el filtro no dice "Todos", armamos la condición para traer solo los pedidos que no se han enviado (PC_ENVIO_OK = 0).
|
||||
Private condicion As String = ""
|
||||
If filtro.ToUpperCase <> "TODOS" Then condicion = "where PC_ENVIO_OK = 0"
|
||||
|
||||
' Ejecutamos una consulta (Query) a la base de datos local de SQLite (skmt).
|
||||
' Buscamos los ENCABEZADOS de los pedidos en la tabla PEDIDO_CLIENTE usando la condición que armamos arriba.
|
||||
' El resultado se guarda en un Cursor llamado 'cx', que es como una tabla en memoria por la que podemos navegar.
|
||||
Private cx As Cursor = Starter.skmt.ExecQuery($"SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_FACTURA, PC_ENVIO_OK FROM PEDIDO_CLIENTE ${condicion}"$)
|
||||
Log($"SELECT PC_CLIENTE, PC_FECHA, PC_USER, PC_NOART, PC_MONTO,PC_LON, PC_LAT, PC_COSTO_SIN, PC_RUTA, PC_ALMACEN, PC_ENVIO_OK FROM PEDIDO_CLIENTE ${condicion}"$)
|
||||
Log("pedido_cliente: " & cx.RowCount)
|
||||
|
||||
' Reiniciamos la variable de condición para usarla ahora en el DETALLE de los pedidos.
|
||||
Private condicion As String = ""
|
||||
If filtro.ToUpperCase <> "TODOS" Then condicion = "where PE_ENVIO_OK = 0"
|
||||
|
||||
' ' Verificamos si en la tabla de envíos históricos (HIST_ENVIOS) hay registros del tipo "ABORDO" (Ventas en ruta directa).
|
||||
' c = Starter.skmt.ExecQuery2("SELECT COUNT(*) as CANTIDAD FROM HIST_ENVIOS WHERE HE_TIPO = ?",Array As String("ABORDO") )
|
||||
' c.Position = 0
|
||||
'
|
||||
' ' Si encontramos que sí hay ventas a bordo...
|
||||
' If c.GetString("CANTIDAD") > 0 Then
|
||||
' Log($"pe_cedis_0"$)
|
||||
' ' Actualizamos la tabla PEDIDO para que los artículos del cliente "0" (que suele ser el inventario a bordo)
|
||||
' ' y que no tengan un número de folio, se marquen con el almacén/cedis "RECARGA".
|
||||
' Starter.skmt.ExecNonQuery2("update PEDIDO set PE_CEDIS = ? where PE_CLIENTE =? AND PE_FOLIO IS NULL ", Array As Object("RECARGA", "0"))
|
||||
' End If
|
||||
|
||||
' Hacemos una actualización rápida a los registros de PEDIDO que no tengan folio (folio 0 o 1).
|
||||
' Les asignamos temporalmente el 'rowid' (el número de fila interno de SQLite) como folio para identificarlos.
|
||||
Starter.skmt.ExecNonQuery("UPDATE PEDIDO SET PE_FOLIO = rowid where PE_FOLIO = 0 or PE_FOLIO = 1")
|
||||
|
||||
' Revisamos si nuestro cursor 'cx' (los encabezados de pedido) trajo algún resultado.
|
||||
If cx.RowCount > 0 Then ' Si hay pedido entonces lo enviamos.
|
||||
|
||||
' Iniciamos un bucle (For) para recorrer cada uno de los encabezados de pedido encontrados.
|
||||
For j = 0 To cx.RowCount - 1
|
||||
Log("===== ENVIAMOS PRODUCTOS DE PEDIDO =====")
|
||||
' Movemos el cursor 'cx' a la posición 'j' actual del bucle.
|
||||
cx.Position = j
|
||||
|
||||
' Generamos un identificador único (Arch) concatenando el almacén, la ruta, el cliente y la fecha/hora actual.
|
||||
' Esto sirve para agrupar en el servidor el encabezado con sus respectivos detalles.
|
||||
Dim Arch As String = Subs.traeAlmacen & "_" & Subs.traeRuta & "_" & cx.GetString("PC_CLIENTE") & "_" & DateTime.Now
|
||||
|
||||
' Preparamos un comando de base de datos (DBCommand) para mandar al servidor.
|
||||
Dim cmdHeader As DBCommand
|
||||
cmdHeader.Initialize
|
||||
' Asignamos el nombre del procedimiento almacenado o query que está en el servidor (jRDC2).
|
||||
cmdHeader.Name = "insert_pedidos_INTMEX_arch"
|
||||
' Pasamos los parámetros leyendo los datos del cursor 'cx' (encabezado) y le pasamos el ID único 'Arch'.
|
||||
cmdHeader.Parameters = Array As Object(cx.GetString("PC_CLIENTE"),cx.GetString("PC_FECHA"),cx.GetString("PC_USER"),cx.GetString("PC_NOART"),cx.GetString("PC_MONTO"),cx.GetString("PC_LON"),cx.GetString("PC_LAT"),ALMACEN,l_ruta.text,cx.GetString("PC_COSTO_SIN"), cx.GetString("PC_FACTURA"), $"${Application.VersionName}|${elFolio}"$, Arch)
|
||||
Log($"${cx.GetString("PC_CLIENTE")},${cx.GetString("PC_FECHA")},${cx.GetString("PC_USER")},${cx.GetString("PC_NOART")},${cx.GetString("PC_MONTO")},${cx.GetString("PC_LON")},${cx.GetString("PC_LAT")},${ALMACEN},${l_ruta.text},${cx.GetString("PC_COSTO_SIN")}, ${cx.GetString("PC_FACTURA")}, ${Application.VersionName}|${elFolio}, ${Arch}"$)
|
||||
' cmd.Name = "insert_pedidos5_INTMEX"
|
||||
' cmd.Parameters = Array As Object(c.GetString("PC_CLIENTE"), c.GetString("PC_FECHA"), c.GetString("PC_USER"), c.GetString("PC_NOART"), c.GetString("PC_MONTO"), c.GetString("PC_LON"), c.GetString("PC_LAT"), ALMACEN, l_ruta.text, c.GetString("PC_COSTO_SIN"), c.GetString("PC_FACTURA"), $"${Application.VersionName}|${elFolio}"$)
|
||||
|
||||
' Añadimos este comando a nuestra lista del lote (Batch).
|
||||
BatchCommands.Add(cmdHeader)
|
||||
|
||||
' Ahora hacemos una consulta para buscar el DETALLE de este pedido (los productos individuales).
|
||||
' Filtramos por la condición (si se envió o no) y lo amarramos al cliente actual del bucle (PC_CLIENTE).
|
||||
Private cPed As Cursor = Starter.skmt.ExecQuery($"SELECT (Select PC_NOART from pedido_cliente where pe_cliente = pc_cliente) As PCNoArts, (Select PC_MONTO from pedido_cliente where pe_cliente = pc_cliente) As PCMonto, * FROM PEDIDO ${condicion} ${(IIf(condicion = "","where", "and"))} pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$)
|
||||
Log($"SELECT (Select PC_NOART from pedido_cliente where pe_cliente = pc_cliente) As PCNoArts, (Select PC_MONTO from pedido_cliente where pe_cliente = pc_cliente) As PCMonto, * FROM PEDIDO ${condicion} ${(IIf(condicion = "","where", "and"))} pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$)
|
||||
Log("Productos sin enviar: " & cPed.RowCount)
|
||||
' Si hay detalles para este encabezado...
|
||||
If cPed.RowCount > 0 Then
|
||||
|
||||
' Iniciamos un bucle interno para recorrer cada producto de este pedido.
|
||||
For i = 0 To cPed.RowCount - 1
|
||||
Log("==== ENVIAMOS PRODS ====")
|
||||
' Movemos el cursor de detalles a la posición actual.
|
||||
cPed.Position = i
|
||||
|
||||
' Preparamos el comando para enviar este producto al servidor.
|
||||
Dim cmdDetail As DBCommand
|
||||
cmdDetail.Initialize
|
||||
|
||||
' Si es un vendedor normal, usa el comando estándar para insertar el detalle
|
||||
' y le pasa la misma variable 'Arch' para que en el servidor sepa de qué encabezado es.
|
||||
cmdDetail.Name = "insert_pedido_INTMEX_arch"
|
||||
cmdDetail.Parameters = Array As Object(cPed.GetString("PE_CEDIS"),ALMACEN,cPed.GetString("PE_COSTO_TOT"),cPed.GetString("PE_COSTOU"),cPed.GetString("PE_CANT"),cPed.GetString("PE_PRONOMBRE"),cPed.GetString("PE_PROID"),cPed.GetString("PE_CLIENTE"),cPed.GetString("PE_FECHA"),cPed.GetString("PE_USUARIO"),cPed.GetString("PE_RUTA"), cPed.GetString("PE_COSTO_SIN"),cPed.GetString("PE_DESC"),cPed.GetString("PE_FOLIO"), cPed.GetString("PCNoArts"), cPed.GetString("PCMonto"), cPed.GetString("PE_TICKET"), elFolio, Arch)
|
||||
Log($"ProdsPedido ==> (${cPed.GetString("PE_CEDIS")}, ${ALMACEN}, ${cPed.GetString("PE_COSTO_TOT")}, ${cPed.GetString("PE_COSTOU")}, $cPed.GetString("PE_CANT")}, ${cPed.GetString("PE_PRONOMBRE")}, ${cPed.GetString("PE_PROID")}, ${cPed.GetString("PE_CLIENTE")}, ${cPed.GetString("PE_FECHA")}, ${cPed.GetString("PE_USUARIO")}, ${cPed.GetString("PE_RUTA")}, ${cPed.GetString("PE_COSTO_SIN")}, ${cPed.GetString("PE_DESC")}, ${cPed.GetString("PE_FOLIO")}, ${cPed.GetString("PCNoArts")}, ${cPed.GetString("PCMonto")}, ${cPed.GetString("PE_TICKET")}, ${elFolio}, ${Arch}"$)
|
||||
|
||||
' cmd.Name = "insert_pedido5_INTMEX" 'CON TOTALES INCLUIDOS
|
||||
' cmd.Parameters = Array As Object(C.GetString("PE_CEDIS"),ALMACEN,C.GetString("PE_COSTO_TOT"),C.GetString("PE_COSTOU"),C.GetString("PE_CANT"),C.GetString("PE_PRONOMBRE"),C.GetString("PE_PROID"),C.GetString("PE_CLIENTE"),C.GetString("PE_FECHA"),C.GetString("PE_USUARIO"),C.GetString("PE_RUTA"), C.GetString("PE_COSTO_SIN"),C.GetString("PE_DESC"),c.GetString("PE_FOLIO"), c.GetString("PCNoArts"), c.GetString("PCMonto"), c.GetString("PE_TICKET"), elFolio)
|
||||
|
||||
' Añadimos la instrucción del producto al lote de envío.
|
||||
BatchCommands.Add(cmdDetail)
|
||||
Next
|
||||
End If
|
||||
Next
|
||||
|
||||
' Al terminar de empaquetar, enviamos toda la lista de instrucciones (BatchCommands) al servidor de un solo golpe.
|
||||
' Se le asigna un nombre de etiqueta (Tag) para saber qué responderá el JobDone ("pedido_completo_" + id de cliente).
|
||||
' (Ojo visual para el programador: Esta línea está dentro del 'If' general, pero también después de armar los batches en el bucle 'For'. Al procesar el último item del bucle cx, tomará el ID del último cliente para el Tag).
|
||||
reqManager.ExecuteBatch(BatchCommands, "pedido_completo_" & cx.GetString("PC_CLIENTE"))
|
||||
End If
|
||||
|
||||
' Por buena práctica y para evitar fugas de memoria (memory leaks),
|
||||
' cerramos siempre los cursores que abrimos hacia la base de datos local.
|
||||
c.Close
|
||||
cx.Close
|
||||
End Sub
|
||||
|
||||
Reference in New Issue
Block a user