|
|
|
@@ -3525,16 +3525,13 @@ End Sub
|
|
|
|
' 2. Genera un ID único (Arch) para vincular exactamente cada venta con sus productos.
|
|
|
|
' 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.
|
|
|
|
' 3. Empaqueta todo en una lista de comandos (Batch) para enviarlo al servidor en una sola transacción.
|
|
|
|
Sub enviaPedidoBatch(filtro As String)
|
|
|
|
Sub enviaPedidoBatch(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
|
|
|
|
|
|
|
|
Log($"enviaPedidoBatch(${filtro})"$)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' Preparamos una variable para filtrar la consulta a la base de datos.
|
|
|
|
' 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_ENVIADO = 0).
|
|
|
|
' Si el filtro no dice "Todos", armamos la condición para traer solo los pedidos que no se han enviado (PC_ENVIADO = 0).
|
|
|
|
Private condicion As String = ""
|
|
|
|
Private condicion As String = ""
|
|
|
|
If filtro <> "Todos" Then condicion = "where PC_ENVIADO = 0"
|
|
|
|
' If filtro <> "Todos" Then condicion = "where PC_ENVIADO = 0"
|
|
|
|
|
|
|
|
If filtro <> "Todos" Then
|
|
|
|
|
|
|
|
condicion = "WHERE PC_ENVIADO = 0 OR PC_CLIENTE IN (SELECT PE_CLIENTE FROM PEDIDO WHERE PE_ENVIADO = 0)" ' Si se actualizo un producto, hay que volver a enviar todo el pedido.
|
|
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
' Ejecutamos una consulta (Query) a la base de datos local de SQLite (skmt).
|
|
|
|
' 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.
|
|
|
|
' Buscamos los ENCABEZADOS de los pedidos en la tabla PEDIDO_CLIENTE usando la condición que armamos arriba.
|
|
|
|
@@ -3544,8 +3541,8 @@ Sub enviaPedidoBatch(filtro As String)
|
|
|
|
Log("pedido_cliente: " & cx.RowCount)
|
|
|
|
Log("pedido_cliente: " & cx.RowCount)
|
|
|
|
|
|
|
|
|
|
|
|
' Reiniciamos la variable de condición para usarla ahora en el DETALLE de los pedidos.
|
|
|
|
' Reiniciamos la variable de condición para usarla ahora en el DETALLE de los pedidos.
|
|
|
|
Private condicion As String = ""
|
|
|
|
' Private condicion As String = ""
|
|
|
|
If filtro <> "Todos" Then condicion = "where PE_ENVIADO = 0"
|
|
|
|
' If filtro <> "Todos" Then condicion = "where PE_ENVIADO = 0"
|
|
|
|
|
|
|
|
|
|
|
|
' Verificamos si en la tabla de envíos históricos (HIST_ENVIOS) hay registros del tipo "ABORDO" (Ventas en ruta directa).
|
|
|
|
' 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 = Starter.skmt.ExecQuery2("SELECT COUNT(*) as CANTIDAD FROM HIST_ENVIOS WHERE HE_TIPO = ?",Array As String("ABORDO") )
|
|
|
|
@@ -3565,17 +3562,56 @@ Sub enviaPedidoBatch(filtro As String)
|
|
|
|
|
|
|
|
|
|
|
|
' Revisamos si nuestro cursor 'cx' (los encabezados de pedido) trajo algún resultado.
|
|
|
|
' Revisamos si nuestro cursor 'cx' (los encabezados de pedido) trajo algún resultado.
|
|
|
|
If cx.RowCount > 0 Then ' Si hay pedido entonces lo enviamos.
|
|
|
|
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.
|
|
|
|
' Iniciamos un bucle (For) para recorrer cada uno de los encabezados de pedido encontrados.
|
|
|
|
For j = 0 To cx.RowCount - 1
|
|
|
|
For j = 0 To cx.RowCount - 1
|
|
|
|
Log("===== ENVIAMOS PRODUCTOS DE PEDIDO =====")
|
|
|
|
' 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
|
|
|
|
|
|
|
|
Log($"enviaPedidoBatch(${filtro})"$)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Log("===== AGREGAMOS HEADER DE PEDIDO =====")
|
|
|
|
' Movemos el cursor 'cx' a la posición 'j' actual del bucle.
|
|
|
|
' Movemos el cursor 'cx' a la posición 'j' actual del bucle.
|
|
|
|
cx.Position = j
|
|
|
|
cx.Position = j
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' ===== 1. EJECUTAR DELETES PRIMERO =====
|
|
|
|
|
|
|
|
Log("===== LIMPIANDO PEDIDOS PREVIOS EN SERVER =====")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' Borrar Pedido (Detalle)
|
|
|
|
|
|
|
|
Dim cmdDelPed As DBCommand
|
|
|
|
|
|
|
|
cmdDelPed.Initialize
|
|
|
|
|
|
|
|
cmdDelPed.Name = "borraPedido_Kelloggs"
|
|
|
|
|
|
|
|
cmdDelPed.Parameters = Array As Object(ALMACEN, l_ruta.text, cx.GetString("PC_USER"), cx.GetString("PC_CLIENTE"))
|
|
|
|
|
|
|
|
BatchCommands.Add(cmdDelPed)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' Borrar Pedido Cliente (Header)
|
|
|
|
|
|
|
|
Dim cmdDelHeader As DBCommand
|
|
|
|
|
|
|
|
cmdDelHeader.Initialize
|
|
|
|
|
|
|
|
cmdDelHeader.Name = "borraPedidoCliente_Kelloggs"
|
|
|
|
|
|
|
|
cmdDelHeader.Parameters = Array As Object(ALMACEN, l_ruta.text, cx.GetString("PC_USER"), cx.GetString("PC_CLIENTE"))
|
|
|
|
|
|
|
|
BatchCommands.Add(cmdDelHeader)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' Borrar Hist_Ventas (Header)
|
|
|
|
|
|
|
|
Dim cmdDelHV As DBCommand
|
|
|
|
|
|
|
|
cmdDelHV.Initialize
|
|
|
|
|
|
|
|
cmdDelHV.Name = "borraHV_Kelloggs"
|
|
|
|
|
|
|
|
cmdDelHV.Parameters = Array As Object(ALMACEN, l_ruta.text, cx.GetString("PC_USER"), cx.GetString("PC_CLIENTE"))
|
|
|
|
|
|
|
|
BatchCommands.Add(cmdDelHV)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' Borrar Hist_Ventas_Detalle (Detalle)
|
|
|
|
|
|
|
|
Dim cmdDelHVD As DBCommand
|
|
|
|
|
|
|
|
cmdDelHVD.Initialize
|
|
|
|
|
|
|
|
cmdDelHVD.Name = "borraHVD_Kelloggs"
|
|
|
|
|
|
|
|
cmdDelHVD.Parameters = Array As Object(ALMACEN, l_ruta.text, cx.GetString("PC_USER"), cx.GetString("PC_CLIENTE"))
|
|
|
|
|
|
|
|
BatchCommands.Add(cmdDelHVD)
|
|
|
|
|
|
|
|
|
|
|
|
' Generamos un identificador único (Arch) concatenando el almacén, la ruta, el cliente y la fecha/hora actual.
|
|
|
|
' 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.
|
|
|
|
' 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
|
|
|
|
Dim Arch As String = Subs.traeAlmacen & "_" & Subs.traeRuta & "_" & cx.GetString("PC_CLIENTE") & "_" & DateTime.Now
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Starter.skmt.ExecNonQuery2($"UPDATE PEDIDO SET PE_ARCH = ? WHERE PE_CLIENTE = ?"$, Array As Object(Arch, cx.GetString("PC_CLIENTE")))
|
|
|
|
|
|
|
|
Starter.skmt.ExecNonQuery2($"UPDATE PEDIDO_CLIENTE SET PC_ARCH = ? WHERE PC_CLIENTE = ?"$, Array As Object(Arch, cx.GetString("PC_CLIENTE")))
|
|
|
|
|
|
|
|
|
|
|
|
' Preparamos un comando de base de datos (DBCommand) para mandar al servidor.
|
|
|
|
' Preparamos un comando de base de datos (DBCommand) para mandar al servidor.
|
|
|
|
Dim cmdHeader As DBCommand
|
|
|
|
Dim cmdHeader As DBCommand
|
|
|
|
cmdHeader.Initialize
|
|
|
|
cmdHeader.Initialize
|
|
|
|
@@ -3589,14 +3625,13 @@ Sub enviaPedidoBatch(filtro As String)
|
|
|
|
|
|
|
|
|
|
|
|
' Ahora hacemos una consulta para buscar el DETALLE de este pedido (los productos individuales).
|
|
|
|
' 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).
|
|
|
|
' 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 PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO, PE_TIPO, PE_ARCH FROM PEDIDO ${condicion} ${(IIf(condicion = "","where", "and"))} pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$)
|
|
|
|
Private cPed As Cursor = Starter.skmt.ExecQuery($"SELECT PE_CEDIS, PE_COSTO_TOT, PE_COSTOU, PE_CANT, PE_PRONOMBRE, PE_PROID, PE_CLIENTE, PE_FECHA, PE_USUARIO, PE_COSTO_SIN, PE_RUTA, PE_DESC, PE_FOLIO, PE_TIPO, PE_ARCH FROM PEDIDO where pe_cliente = '${cx.GetString("PC_CLIENTE")}' "$)
|
|
|
|
|
|
|
|
|
|
|
|
' Si hay detalles para este encabezado...
|
|
|
|
' Si hay detalles para este encabezado...
|
|
|
|
If cPed.RowCount > 0 Then
|
|
|
|
If cPed.RowCount > 0 Then
|
|
|
|
|
|
|
|
|
|
|
|
' Iniciamos un bucle interno para recorrer cada producto de este pedido.
|
|
|
|
' Iniciamos un bucle interno para recorrer cada producto de este pedido.
|
|
|
|
For i = 0 To cPed.RowCount - 1
|
|
|
|
For i = 0 To cPed.RowCount - 1
|
|
|
|
Log("==== ENVIAMOS PRODS ====")
|
|
|
|
Log("==== AGREGAMOS PRODS DE PEDIDO ====")
|
|
|
|
' Movemos el cursor de detalles a la posición actual.
|
|
|
|
' Movemos el cursor de detalles a la posición actual.
|
|
|
|
cPed.Position = i
|
|
|
|
cPed.Position = i
|
|
|
|
|
|
|
|
|
|
|
|
@@ -3609,8 +3644,8 @@ Sub enviaPedidoBatch(filtro As String)
|
|
|
|
Log("===== V-ESPECIAL =====")
|
|
|
|
Log("===== V-ESPECIAL =====")
|
|
|
|
' Nota: Aquí el código original tiene un detalle, usa la variable global 'cmd' en lugar de 'cmdDetail'
|
|
|
|
' Nota: Aquí el código original tiene un detalle, usa la variable global 'cmd' en lugar de 'cmdDetail'
|
|
|
|
' que acaba de inicializar, pero la copiamos tal cual. Utiliza un query distinto para ventas especiales.
|
|
|
|
' que acaba de inicializar, pero la copiamos tal cual. Utiliza un query distinto para ventas especiales.
|
|
|
|
cmd.Name = "insert_pedido_esp_KELL"
|
|
|
|
cmdDetail.Name = "insert_pedido_esp_KELL"
|
|
|
|
cmd.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("PE_TIPO"),NUMERO_PEDIDO)
|
|
|
|
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("PE_TIPO"),NUMERO_PEDIDO)
|
|
|
|
Else
|
|
|
|
Else
|
|
|
|
' Si es un vendedor normal, usa el comando estándar para insertar el detalle
|
|
|
|
' 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.
|
|
|
|
' y le pasa la misma variable 'Arch' para que en el servidor sepa de qué encabezado es.
|
|
|
|
@@ -3622,12 +3657,13 @@ Sub enviaPedidoBatch(filtro As String)
|
|
|
|
BatchCommands.Add(cmdDetail)
|
|
|
|
BatchCommands.Add(cmdDetail)
|
|
|
|
Next
|
|
|
|
Next
|
|
|
|
End If
|
|
|
|
End If
|
|
|
|
Next
|
|
|
|
cPed.Close
|
|
|
|
|
|
|
|
|
|
|
|
' Al terminar de empaquetar, enviamos toda la lista de instrucciones (BatchCommands) al servidor de un solo golpe.
|
|
|
|
' 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).
|
|
|
|
' 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).
|
|
|
|
' (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"))
|
|
|
|
reqManager.ExecuteBatch(BatchCommands, "pedido_completo_" & cx.GetString("PC_CLIENTE"))
|
|
|
|
|
|
|
|
Log("==== ENVIAMOS PEDIDO COMPLETO ====")
|
|
|
|
|
|
|
|
Next
|
|
|
|
End If
|
|
|
|
End If
|
|
|
|
|
|
|
|
|
|
|
|
' Por buena práctica y para evitar fugas de memoria (memory leaks),
|
|
|
|
' Por buena práctica y para evitar fugas de memoria (memory leaks),
|
|
|
|
|