Saltar al contenido

ADAPTAR SENTENCIA SQL para que funcione en Excel


Recommended Posts

publicado

Hola, tengo la siguiente tabla:

date employee motive text
01/01/2022 PETER B baja
01/01/2022 MARY R ruta
01/01/2022 ANN R ruta
02/01/2022 PETER B baja
02/01/2022 MARY R ruta
02/01/2022 ANN R ruta
03/01/2022 PETER B baja
03/01/2022 MARY R ruta
03/01/2022 ANN R ruta
04/01/2022 PETER R ruta
04/01/2022 MARY R ruta
04/01/2022 ANN R ruta
05/01/2022 PETER R ruta
05/01/2022 MARY R ruta
05/01/2022 ANN R ruta
06/01/2022 PETER B baja
06/01/2022 MARY R ruta
06/01/2022 ANN R ruta

 

Y necesito conseguir este output

employee start_date end_date
PETER 01/01/2022 03/01/2022
PETER 06/01/2022 06/01/2022

 

QUERY

select employee, min(date), max(date)
from (select t.*,
             lag(motive) over (partition by employee order by date) as prev_motive,
             lead(motive) over (partition by employee order by date) as next_motive,
             sum(case when motive = 'B' then 1 else 0 end) over (partition by employee order by date) as num_b
      from t
     ) t
where motive = 'B' and
      prev_motive <> 'B' and
      next_motive <> 'B'
group by employee, num_b;

 

Sabría alguien adaptarme esta query para que funcione en el editor de VBA. Gracias

publicado

Hola

No se entiende bien lo que requieres ya que, si lo que vas a hacer es necesitar hacer una consulta hacia SQL Server desde el VBA de Excel, pues las cadenas de consulta se pasan como un string así que solo importa que las sentencias SQL de esa cadena las reconozca el sistema gestor de base de datos, ya que, si bien SQL es casi universal, hay pequeñas diferencias entre las bases de datos. Si en realidad te refieres a que esa consulta que muestras la usabas en SQL Server y ahora los datos los tienes en otro sistema gestor de base de datos o en Excel, pues será mejor que des los detalles.

Saludos.

publicado

Los datos y la consulta están en Excel, y lo que quiero saber es si es posible lograr el OUTPUT en primer lugar y en ese caso adaptar el string con sus quotation para que funcione en VBA editor

publicado

Si bien SQL es casi universal, pues ojo con ese "casi". SQL Server, al igual que otros sistemas gestores de bases de datos, tiene sentencias/instrucciones SQL propias y que no pueden usarse en otros SGBD y hay varias de esas en esa cadena que compartes ya que no hay forma de usarlas para Excel y no hay equivalente propios SQL de Excel como por ejemplo para el caso de Lag, Leed y un par más de ahí. Con las sentencias/instrucciones SQL que permite SQL, sinceramente no encuentro forma de hacerlo tal cual requieres, así a primera mano (y dando el tiempo que doy a los foros) me parece que tendrías que optar por hacerlo solo con VBA y es para darle varias vueltas en la cabeza.

publicado

Si lo he hecho con VBA, es decir primero le paso una consulta sencilla y obtengo una tabla de valores ordenada y con los datos que busco, y a eso le paso formulas por el editor VBA ya que las bajas tienen carácter dinámico y no puedo predecir su dimensión, no se me ha ocurrido otra manera.

A: Leo de la tabla datos. Con conexión 

image.thumb.png.0385d6f773aa10b4b2b45393890933df.png

image.thumb.png.7a523fa4767475081f7fe2b1c15d86ab.png

B: Esto me arroja una tabla nueva en una hoja distinta.

image.thumb.png.47d3b46bd9c9bee6d4430cef8d2a8625.png

D.: Al estar ordenado puedo trabajar con fórmulas.  Que las paso a través del editor de VBA.

image.thumb.png.b4c708cb9419c53b5df1038a0bac83e5.png

Así me las he apañado, como he podido.

 

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.