Files
Guna_Preventa/B4A/C_historicobat.bas

292 lines
9.4 KiB
QBasic

B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=12.8
@EndOfDesignText@
Sub Class_Globals
Private Root As B4XView 'ignore
Private xui As XUI 'ignore
Dim g As GPS
Dim clie_id As String
Dim sDate,sTime As String
Dim usuario As String
Dim c As Cursor
Dim ruta As String
Dim Regresar As Button
Dim ListView1 As ListView
Dim L_CANT As Label
Dim L_TOTAL As Label
Dim borra As Button
Dim Existe As String
Dim result As String
' Dim lat_gps, lon_gps As String
Private Titulo As Label
Private b_desc As Button
Private ListView2 As ListView
Dim tgl As Toggle
Private p_nota As Panel
Private Panel1 As Panel
Private l_productohist As Label
Private l_s1 As Label
Private l_s2 As Label
Private l_s3 As Label
Private l_s4 As Label
Private CustomListView1 As CustomListView
Private L_PROMEDIOHIST As Label
End Sub
'You can add more parameters here.
Public Sub Initialize As Object
Return Me
End Sub
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
'load the layout to Root
Root.LoadLayout("nota2")
borra.Visible = False
Titulo.Text = "Acumulado"
b_desc.Visible = False
End Sub
Sub B4XPage_Appear
' p_nota.Height = Root.Height
' p_nota.Width = Root.Width
Panel1.Visible = False
If Not(Starter.gps.GPSEnabled) Then
ToastMessageShow("Es necesario tener el GPS encendido", True)
StartActivity(Starter.gps.LocationSettingsIntent)
End If
L_CANT.Text =""
L_TOTAL.Text=""
c=B4XPages.MainPage.skmt.ExecQuery("select count(*) as EXISTE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa)")
C.Position=0
Existe = C.GetString("EXISTE")
C.Close
c=B4XPages.MainPage.skmt.ExecQuery("select HVD_CLIENTE,HVD_PRONOMBRE,HVD_CANT,HVD_COSTO_TOT, HVD_FECHA from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_FECHA asc")
ListView1.Clear
If c.RowCount>0 Then
For i=0 To c.RowCount -1
c.Position=i
Dim label1 As Label
label1 = ListView1.TwoLinesLayout.Label
label1.TextSize = 15
label1.TextColor = Colors.White
Dim label2 As Label
label2 = ListView1.TwoLinesLayout.SecondLabel
label2.TextSize = 15
label2.TextColor = Colors.White
ListView1.AddTwoLines(c.GetString("HVD_PRONOMBRE"),"Cantidad #"& c.GetString("HVD_CANT")& " SubTotal $"& c.GetString("HVD_COSTO_TOT")&" Fecha: "& c.GetString("HVD_FECHA"))
Next
End If
If Existe <> 0 Then
c=B4XPages.MainPage.skmt.ExecQuery("select SUM(HVD_CANT) AS PC_NOART, SUM(HVD_COSTO_TOT) AS PC_MONTO from HIST_VENTAS where HVD_CLIENTE in (Select CUENTA from cuentaa)")
C.Position=0
L_CANT.Text = c.GetString("PC_NOART")
L_TOTAL.Text = c.GetString("PC_MONTO")
End If
ListView1.Visible = False
' CustomListView1.AsView.Visible = True
CustomListView1.AsView.Height = Root.Height * 0.45
CustomListView1.Clear
Dim prohit As Cursor = B4XPages.MainPage.skmt.ExecQuery("select distinct HVD_PRONOMBRE from HIST_VENTAS WHERE HVD_CLIENTE IN (Select CUENTA from cuentaa) order by HVD_PRONOMBRE asc")
If prohit.RowCount > 0 Then
' --- Bucle 1: Recorrer cada producto ---
For sfdf = 0 To prohit.RowCount - 1
prohit.Position = sfdf
Dim nombreProducto As String = prohit.GetString("HVD_PRONOMBRE")
' 1. Preparamos las variables para las 4 semanas
' (Sem4 = hace 28 días, Sem1 = hace 7 días)
Dim cant_sem4 As String = "0"
Dim cant_sem3 As String = "0"
Dim cant_sem2 As String = "0"
Dim cant_sem1 As String = "0"
' --- 2. Query 2: (MODIFICADO) ---
' Este es el query de SQLite que hicimos, adaptado
' para usar la variable 'nombreProducto'
' Dim sql As String = $"
' WITH FechasObjetivo (Fecha) AS (
' SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-28 days'))
' UNION ALL
' SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-21 days'))
' UNION ALL
' SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-14 days'))
' UNION ALL
' SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-7 days'))
' )
' SELECT
' COALESCE(SUM(H.HVD_CANT), 0) AS HVD_CANT_TOTAL
' FROM
' FechasObjetivo AS F
' LEFT JOIN
' HIST_VENTAS AS H
' ON F.Fecha = H.HVD_FECHA
' AND H.HVD_CLIENTE IN (SELECT CUENTA FROM cuentaa)
' AND H.HVD_PRONOMBRE = '${nombreProducto}'
' GROUP BY
' F.Fecha
' ORDER BY
' SUBSTR(F.Fecha, 7, 4),
' SUBSTR(F.Fecha, 4, 2),
' SUBSTR(F.Fecha, 1, 2)
' "$
Dim sql As String = $"
WITH FechasObjetivo (Fecha) AS (
SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-28 days'))
UNION ALL
SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-21 days'))
UNION ALL
SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-14 days'))
UNION ALL
SELECT strftime('%d/%m/%Y', date('now', 'localtime', '-7 days'))
)
SELECT
COALESCE(SUM(H.HVD_CANT), 0) AS HVD_CANT_TOTAL,
-- Si el mes de la fecha es igual al mes actual, devuelve 1, si no 0
CASE WHEN SUBSTR(F.Fecha, 4, 2) = strftime('%m', 'now', 'localtime') THEN 1 ELSE 0 END AS EsMesActual
FROM
FechasObjetivo AS F
LEFT JOIN
HIST_VENTAS AS H
ON F.Fecha = H.HVD_FECHA
AND H.HVD_CLIENTE IN (SELECT CUENTA FROM cuentaa)
AND H.HVD_PRONOMBRE = '${nombreProducto}'
GROUP BY F.Fecha
ORDER BY SUBSTR(F.Fecha, 7, 4), SUBSTR(F.Fecha, 4, 2), SUBSTR(F.Fecha, 1, 2)
"$
' Log($"Ejecutando para: ${nombreProducto}")
' Log(sql) ' Descomenta esto si necesitas depurar el query
Dim prohit2 As Cursor = B4XPages.MainPage.skmt.ExecQuery(sql)
' --- 3. Leer los 4 resultados (YA NO NECESITAMOS BUCLE) ---
' Sabemos que el query SIEMPRE devuelve 4 filas
' en el orden correcto (hace 28, 21, 14, 7 días)
' Log(prohit2.RowCount)
' If prohit2.RowCount = 4 Then
' prohit2.Position = 0
' cant_sem4 = prohit2.GetString("HVD_CANT_TOTAL") ' Fila 1 (-28 días)
'
' prohit2.Position = 1
' cant_sem3 = prohit2.GetString("HVD_CANT_TOTAL") ' Fila 2 (-21 días)
'
' prohit2.Position = 2
' cant_sem2 = prohit2.GetString("HVD_CANT_TOTAL") ' Fila 3 (-14 días)
'
' prohit2.Position = 3
' cant_sem1 = prohit2.GetString("HVD_CANT_TOTAL") ' Fila 4 (-7 días)
' Else
' Log($"Error: El query no devolvió 4 filas para '${nombreProducto}'"$)
' End If
'
' prohit2.Close ' Cerramos el cursor interno
'
Dim promx As Double = (cant_sem4 + cant_sem3 + cant_sem2 + cant_sem1) / 4
'
'
' CustomListView1.Add(CreateListItem(nombreProducto, cant_sem4, cant_sem3, cant_sem2, cant_sem1, promx ), 1)
' Variables nuevas para el color (1 = Mes Actual, 0 = Otro)
Dim c1, c2, c3, c4 As Int
If prohit2.RowCount = 4 Then
prohit2.Position = 0
cant_sem4 = prohit2.GetString("HVD_CANT_TOTAL")
c1 = prohit2.GetInt("EsMesActual")
prohit2.Position = 1
cant_sem3 = prohit2.GetString("HVD_CANT_TOTAL")
c2 = prohit2.GetInt("EsMesActual")
prohit2.Position = 2
cant_sem2 = prohit2.GetString("HVD_CANT_TOTAL")
c3 = prohit2.GetInt("EsMesActual")
prohit2.Position = 3
cant_sem1 = prohit2.GetString("HVD_CANT_TOTAL")
c4 = prohit2.GetInt("EsMesActual")
Else
Log("Error en filas")
End If
prohit2.Close
' Pasamos los indicadores de color al método (c1, c2, c3, c4)
CustomListView1.Add(CreateListItem(nombreProducto, cant_sem4, cant_sem3, cant_sem2, cant_sem1, promx, c1, c2, c3, c4), 1)
'
Next
prohit.Close ' Cerramos el cursor externo
End If
End Sub
'Sub CreateListItem(prodhis As String, s1 As Int, s2 As Int, s3 As Int,s4 As Int, prom As Double) As Panel 'ignore
' Dim p As B4XView = xui.CreatePanel("")
' p.SetLayoutAnimated(0, 0, 0, 288dip, 170dip)
' p.LoadLayout("historicobat")
' l_productohist.Text = prodhis
' l_s1.Text = s1
' l_s2.Text = s2
' l_s3.Text = s3
' l_s4.Text = s4
' L_PROMEDIOHIST.text = "Promedio " & prom
'
' Return p
'End Sub
Sub CreateListItem(prodhis As String, s1 As Int, s2 As Int, s3 As Int, s4 As Int, prom As Double, m1 As Int, m2 As Int, m3 As Int, m4 As Int) As Panel
Dim p As B4XView = xui.CreatePanel("")
' p.SetLayoutAnimated(0, 0, 0, 100%x, 170dip) ' En B4A es mejor usar %x para el ancho
p.SetLayoutAnimated(0, 0, 0, 288dip, 170dip)
p.LoadLayout("historicobat")
l_productohist.Text = prodhis
l_s1.Text = s1
l_s2.Text = s2
l_s3.Text = s3
l_s4.Text = s4
' Cambiar color de fondo de los labels según el mes
' Si mX es 1 (mes actual) -> Azul, si no -> Amarillo
l_s1.Color = IIf(m1 = 1, xui.Color_Blue, xui.Color_Yellow)
l_s2.Color = IIf(m2 = 1, xui.Color_Blue, xui.Color_Yellow)
l_s3.Color = IIf(m3 = 1, xui.Color_Blue, xui.Color_Yellow)
l_s4.Color = IIf(m4 = 1, xui.Color_Blue, xui.Color_Yellow)
' Opcional: Cambiar el color del texto para que contraste
l_s1.TextColor = IIf(m1 = 1, xui.Color_White, xui.Color_Black)
l_s2.TextColor = IIf(m2 = 1, xui.Color_White, xui.Color_Black)
l_s3.TextColor = IIf(m3 = 1, xui.Color_White, xui.Color_Black)
l_s4.TextColor = IIf(m4 = 1, xui.Color_White, xui.Color_Black)
L_PROMEDIOHIST.Text = "Promedio " & NumberFormat(prom, 1, 2)
Return p
End Sub
' Función auxiliar por si no tienes activado el IIf de B4A (disponible en versiones recientes)
'Sub IIf(Condition As Boolean, TrueValue As Object, FalseValue As Object) As Object
' If Condition Then Return TrueValue Else Return FalseValue
'End Sub