Re: [sqlalchemy] Using joins+max with sql server

2023-04-14 Thread Mike Bayer
this line of code:

query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido, 
EstoqueEmpresa.DtReferencia, EstoqueEmpresa.QtEstoque)


should look like this:

query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido, 
estoqueAtual.DtReferencia, estoqueAtual.QtEstoque)




On Fri, Apr 14, 2023, at 3:21 PM, Elias Coutinho wrote:
> *I am suffering!
> 
> It showed the same message.*
> 
> 
> # Subquery para buscar o maior registro de estoqueempresa para cada produto
> estoqueAtual = session.query(
> EstoqueEmpresa.IdProduto,
> EstoqueEmpresa.QtEstoque,
> func.max(EstoqueEmpresa.DtReferencia).label('MaxDtReferencia')
> ).group_by(EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque).subquery()
> 
> #print(estoqueAtual)
> 
> # Realiza a consulta com SQLAlchemy
> ##query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
> Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, 
> ProdutoEmpresa.VlPrecoSugerido, estoqueAtual.c.QtEstoque)\
> ##   .join(ProdutoEmpresa, Produto.IdProduto == 
> ProdutoEmpresa.IdProduto)\
> ##   .join(CodigoProduto, Produto.IdProduto == 
> CodigoProduto.IdProduto)\
> ##   .join(estoqueAtual, and_(Produto.IdProduto == 
> estoqueAtual.c.IdProduto))\
> ##   .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == 
> Produto.IdProduto))\
> ##   .filter(ProdutoEmpresa.StAtivoVenda == 'S')\
> ##   .filter(ProdutoEmpresa.CdEmpresa == 4)\
> ##   .order_by(Produto.NmProduto)
> 
> query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
> Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, 
> ProdutoEmpresa.VlPrecoSugerido, EstoqueEmpresa.DtReferencia, 
> EstoqueEmpresa.QtEstoque)\
>.join(ProdutoEmpresa, Produto.IdProduto == 
> ProdutoEmpresa.IdProduto)\
>.join(CodigoProduto, Produto.IdProduto == 
> CodigoProduto.IdProduto)\
>.join(estoqueAtual, and_(Produto.IdProduto == 
> estoqueAtual.c.IdProduto, EstoqueEmpresa.DtReferencia == 
> estoqueAtual.c.MaxDtReferencia))\
>.join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == 
> Produto.IdProduto, EstoqueEmpresa.DtReferencia == 
> estoqueAtual.c.MaxDtReferencia))\
>.filter(ProdutoEmpresa.StAtivoVenda == 'S')\
>.filter(ProdutoEmpresa.CdEmpresa == 4)\
>.order_by(Produto.NmProduto)
> 
> Em sex., 14 de abr. de 2023 às 15:21, Mike Bayer 
>  escreveu:
>> __
>> the initial issue is that you want DtReferencia from the subquery on the 
>> outside:
>> 
>> session.query(..., estoqueAtual.c.DtReferencia, ...)
>> 
>> and not "EstoqueEmpresa.DtReferencia", that's not available in the FROM 
>> list, it's inside a subquery.
>> 
>> also I dont think you'd want to "group by" the same column that you are 
>> feeing into max().that would defeat the purpose of using an aggregate.
>> 
>> On Fri, Apr 14, 2023, at 1:30 PM, Elias Coutinho wrote:
>>> Good afternoon.
>>> I am having trouble transforming a SQL Server query to SQL Alchemy.
>>> 
>>> *The SQL Server query is this*
>>> **
>>> SELECT CP.CdChamada, P.NmProduto, PE.VlPrecoCusto, PE.VlPrecoSugerido, 
>>> EE.QtEstoque, EE.DtReferencia
>>> FROM Produto P
>>>  INNER JOIN Produto_Empresa PE ON  P.IdProduto = PE.IdProduto
>>>  INNER JOIN CodigoProduto CP ON  P.IdProduto = CP.IdProduto
>>>  INNER JOIN (SELECT IdProduto, CdEmpresa, MAX(DtReferencia) AS 
>>> MaxDtReferencia
>>>  FROM EstoqueEmpresa
>>>  GROUP BY IdProduto, CdEmpresa) AS EE2 ON EE2.IdProduto = 
>>> P.IdProduto AND EE2.CdEmpresa = PE.CdEmpresa
>>>  INNER JOIN EstoqueEmpresa EE ON EE.IdProduto = EE2.IdProduto AND 
>>> EE.DtReferencia = EE2.MaxDtReferencia AND EE.CdEmpresa = EE2.CdEmpresa
>>> WHERE PE.StAtivoVenda = 'S' AND
>>>   PE.CdEmpresa = 4 AND
>>>   CP.IdTipoCodigoProduto = '00A002'
>>> ORDER BY CP.CdChamada**
>>> 
>>> *My code is as follows:*
>>> *My Model*
>>> class EstoqueEmpresa(Base):
>>> __tablename__ = 'EstoqueEmpresa'
>>> 
>>> IdProduto = Column(CHAR(10, 'SQL_Latin1_General_CP850_CI_AI'), 
>>> primary_key=True, nullable=False)
>>> CdEmpresa = Column(Integer, primary_key=True, nullable=False)
>>> DtReferencia = Column(DateTime, primary_key=True, nullable=False, 
>>> index=True)
>>> VersaoRegistro = Column(TIMESTAMP, nullable=False)
>>> QtCompra = Column(Float(53))
>>> VlCompra = Column(Float(53))
>>> QtVenda = Column(Float(53))
>>> VlVenda = Column(Float(53))
>>> VlCustoMercadoriaVendida = Column(Float(53))
>>> QtEntrada = Column(Float(53))
>>> VlEntrada = Column(Float(53))
>>> QtSaida = Column(Float(53))
>>> VlSaida = Column(Float(53))
>>> VlSaidaAcerto = Column(Float(53))
>>> QtSaidaAcerto = Column(Float(53))
>>> QtEstoque = Column(Float(53))

Re: [sqlalchemy] Using joins+max with sql server

2023-04-14 Thread Elias Coutinho
*I am suffering!It showed the same message.*


# Subquery para buscar o maior registro de estoqueempresa para cada produto
estoqueAtual = session.query(
EstoqueEmpresa.IdProduto,
EstoqueEmpresa.QtEstoque,
func.max(EstoqueEmpresa.DtReferencia).label('MaxDtReferencia')
).group_by(EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque).subquery
()

#print(estoqueAtual)

# Realiza a consulta com SQLAlchemy
##query = session.query(CodigoProduto.CdChamada, Produto.IdProduto,
Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto,
ProdutoEmpresa.VlPrecoSugerido, estoqueAtual.c.QtEstoque)\
##   .join(ProdutoEmpresa, Produto.IdProduto ==
ProdutoEmpresa.IdProduto)\
##   .join(CodigoProduto, Produto.IdProduto ==
CodigoProduto.IdProduto)\
##   .join(estoqueAtual, and_(Produto.IdProduto ==
estoqueAtual.c.IdProduto))\
##   .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto ==
Produto.IdProduto))\
##   .filter(ProdutoEmpresa.StAtivoVenda == 'S')\
##   .filter(ProdutoEmpresa.CdEmpresa == 4)\
##   .order_by(Produto.NmProduto)

query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, Produto.
NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido,
EstoqueEmpresa.DtReferencia, EstoqueEmpresa.QtEstoque)\
   .join(ProdutoEmpresa, Produto.IdProduto == ProdutoEmpresa.
IdProduto)\
   .join(CodigoProduto, Produto.IdProduto == CodigoProduto.
IdProduto)\
   .join(estoqueAtual, and_(Produto.IdProduto ==
estoqueAtual.c.IdProduto,
EstoqueEmpresa.DtReferencia == estoqueAtual.c.MaxDtReferencia))\
   .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto ==
Produto.IdProduto, EstoqueEmpresa.DtReferencia == estoqueAtual.c
.MaxDtReferencia))\
   .filter(ProdutoEmpresa.StAtivoVenda == 'S')\
   .filter(ProdutoEmpresa.CdEmpresa == 4)\
   .order_by(Produto.NmProduto)

Em sex., 14 de abr. de 2023 às 15:21, Mike Bayer <
mike_not_on_goo...@zzzcomputing.com> escreveu:

> the initial issue is that you want DtReferencia from the subquery on the
> outside:
>
> session.query(..., estoqueAtual.c.DtReferencia, ...)
>
> and not "EstoqueEmpresa.DtReferencia", that's not available in the FROM
> list, it's inside a subquery.
>
> also I dont think you'd want to "group by" the same column that you are
> feeing into max().that would defeat the purpose of using an aggregate.
>
> On Fri, Apr 14, 2023, at 1:30 PM, Elias Coutinho wrote:
>
> Good afternoon.
> I am having trouble transforming a SQL Server query to SQL Alchemy.
>
> *The SQL Server query is this*
>
> SELECT CP.CdChamada, P.NmProduto, PE.VlPrecoCusto, PE.VlPrecoSugerido,
> EE.QtEstoque, EE.DtReferencia
> FROM Produto P
>  INNER JOIN Produto_Empresa PE ON  P.IdProduto = PE.IdProduto
>  INNER JOIN CodigoProduto CP ON  P.IdProduto = CP.IdProduto
>  INNER JOIN (SELECT IdProduto, CdEmpresa, MAX(DtReferencia) AS
> MaxDtReferencia
>  FROM EstoqueEmpresa
>  GROUP BY IdProduto, CdEmpresa) AS EE2 ON EE2.IdProduto =
> P.IdProduto AND EE2.CdEmpresa = PE.CdEmpresa
>  INNER JOIN EstoqueEmpresa EE ON EE.IdProduto = EE2.IdProduto AND
> EE.DtReferencia = EE2.MaxDtReferencia AND EE.CdEmpresa = EE2.CdEmpresa
> WHERE PE.StAtivoVenda = 'S' AND
>   PE.CdEmpresa = 4 AND
>   CP.IdTipoCodigoProduto = '00A002'
> ORDER BY CP.CdChamada
>
> *My code is as follows:*
> *My Model*
> class EstoqueEmpresa(Base):
> __tablename__ = 'EstoqueEmpresa'
>
> IdProduto = Column(CHAR(10, 'SQL_Latin1_General_CP850_CI_AI'),
> primary_key=True, nullable=False)
> CdEmpresa = Column(Integer, primary_key=True, nullable=False)
> DtReferencia = Column(DateTime, primary_key=True, nullable=False,
> index=True)
> VersaoRegistro = Column(TIMESTAMP, nullable=False)
> QtCompra = Column(Float(53))
> VlCompra = Column(Float(53))
> QtVenda = Column(Float(53))
> VlVenda = Column(Float(53))
> VlCustoMercadoriaVendida = Column(Float(53))
> QtEntrada = Column(Float(53))
> VlEntrada = Column(Float(53))
> QtSaida = Column(Float(53))
> VlSaida = Column(Float(53))
> VlSaidaAcerto = Column(Float(53))
> QtSaidaAcerto = Column(Float(53))
> QtEstoque = Column(Float(53))
> VlEstoque = Column(Float(53))
> VlUltimoCustoMedio = Column(Float(53))
> DtInicialAlinhamentoEstoque = Column(DateTime)
> QtCompraNaoAtualizaCustoMedio = Column(Float(53))
> VlCompraNaoAtualizaCustoMedio = Column(Float(53))
> QtEntradaNaoAtualizaCustoMedio = Column(Float(53))
> VlEntradaNaoAtualizaCustoMedio = Column(Float(53))
>
> *My code*
> from sqlalchemy import create_engine, text, Column, update, insert, select
> from sqlalchemy.orm.exc import NoResultFound
> from sqlalchemy.orm import Session
> from sqlalchemy.orm import sessionmaker
> from sqlalchemy import func, and_
>
> import unidecode
> import pandas as pd
> from datetime import datetime
> import re
> import 

Re: [sqlalchemy] Using joins+max with sql server

2023-04-14 Thread Mike Bayer
the initial issue is that you want DtReferencia from the subquery on the 
outside:

session.query(..., estoqueAtual.c.DtReferencia, ...)

and not "EstoqueEmpresa.DtReferencia", that's not available in the FROM list, 
it's inside a subquery.

also I dont think you'd want to "group by" the same column that you are feeing 
into max().that would defeat the purpose of using an aggregate.

On Fri, Apr 14, 2023, at 1:30 PM, Elias Coutinho wrote:
> Good afternoon.
> I am having trouble transforming a SQL Server query to SQL Alchemy.
> 
> *The SQL Server query is this*
> **
> SELECT CP.CdChamada, P.NmProduto, PE.VlPrecoCusto, PE.VlPrecoSugerido, 
> EE.QtEstoque, EE.DtReferencia
> FROM Produto P
>  INNER JOIN Produto_Empresa PE ON  P.IdProduto = PE.IdProduto
>  INNER JOIN CodigoProduto CP ON  P.IdProduto = CP.IdProduto
>  INNER JOIN (SELECT IdProduto, CdEmpresa, MAX(DtReferencia) AS MaxDtReferencia
>  FROM EstoqueEmpresa
>  GROUP BY IdProduto, CdEmpresa) AS EE2 ON EE2.IdProduto = 
> P.IdProduto AND EE2.CdEmpresa = PE.CdEmpresa
>  INNER JOIN EstoqueEmpresa EE ON EE.IdProduto = EE2.IdProduto AND 
> EE.DtReferencia = EE2.MaxDtReferencia AND EE.CdEmpresa = EE2.CdEmpresa
> WHERE PE.StAtivoVenda = 'S' AND 
>   PE.CdEmpresa = 4 AND 
>   CP.IdTipoCodigoProduto = '00A002'
> ORDER BY CP.CdChamada**
> 
> *My code is as follows:*
> *My Model*
> class EstoqueEmpresa(Base):
> __tablename__ = 'EstoqueEmpresa'
> 
> IdProduto = Column(CHAR(10, 'SQL_Latin1_General_CP850_CI_AI'), 
> primary_key=True, nullable=False)
> CdEmpresa = Column(Integer, primary_key=True, nullable=False)
> DtReferencia = Column(DateTime, primary_key=True, nullable=False, 
> index=True)
> VersaoRegistro = Column(TIMESTAMP, nullable=False)
> QtCompra = Column(Float(53))
> VlCompra = Column(Float(53))
> QtVenda = Column(Float(53))
> VlVenda = Column(Float(53))
> VlCustoMercadoriaVendida = Column(Float(53))
> QtEntrada = Column(Float(53))
> VlEntrada = Column(Float(53))
> QtSaida = Column(Float(53))
> VlSaida = Column(Float(53))
> VlSaidaAcerto = Column(Float(53))
> QtSaidaAcerto = Column(Float(53))
> QtEstoque = Column(Float(53))
> VlEstoque = Column(Float(53))
> VlUltimoCustoMedio = Column(Float(53))
> DtInicialAlinhamentoEstoque = Column(DateTime)
> QtCompraNaoAtualizaCustoMedio = Column(Float(53))
> VlCompraNaoAtualizaCustoMedio = Column(Float(53))
> QtEntradaNaoAtualizaCustoMedio = Column(Float(53))
> VlEntradaNaoAtualizaCustoMedio = Column(Float(53))
> **
> *My code*
> from sqlalchemy import create_engine, text, Column, update, insert, select
> from sqlalchemy.orm.exc import NoResultFound
> from sqlalchemy.orm import Session
> from sqlalchemy.orm import sessionmaker
> from sqlalchemy import func, and_
> 
> import unidecode
> import pandas as pd
> from datetime import datetime
> import re
> import itertools
> 
> from itertools import islice
> 
> # Importo somente as tabelas que vou usar
> from models import CodigoProduto, ProdutoEmpresa, EstoqueEmpresa, Produto
> 
> #-
> # Configuração da conexão com o banco de dados
> USER = 'sa'
> PASSWORD = 'Abc*123'
> HOST = 'SERVER-02\MSSQLSERVERB'
> DATABASE = 'ALTERDATA_TESTE'
> 
> engine = 
> create_engine(f'mssql+pyodbc://{USER}:{PASSWORD}@{HOST}/{DATABASE}?driver=ODBC+Driver+17+for+SQL+Server')
> 
> # Create a Session object
> Session = sessionmaker(bind=engine)
> session = Session()
> 
> 
> #-
> # Subquery para buscar o maior registro de estoqueempresa para cada produto
> estoqueAtual = session.query(
> EstoqueEmpresa.IdProduto,
> EstoqueEmpresa.QtEstoque,
> func.max(EstoqueEmpresa.DtReferencia).label('MaxDtReferencia')
> ).group_by(EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque, 
> EstoqueEmpresa.DtReferencia).subquery()
> 
> #print(estoqueAtual)
> 
> # Realiza a consulta com SQLAlchemy
> ##query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
> Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, 
> ProdutoEmpresa.VlPrecoSugerido, estoqueAtual.c.QtEstoque)\
> ##   .join(ProdutoEmpresa, Produto.IdProduto == 
> ProdutoEmpresa.IdProduto)\
> ##   .join(CodigoProduto, Produto.IdProduto == 
> CodigoProduto.IdProduto)\
> ##   .join(estoqueAtual, and_(Produto.IdProduto == 
> estoqueAtual.c.IdProduto))\
> ##   .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == 
> Produto.IdProduto))\
> ##   .filter(ProdutoEmpresa.StAtivoVenda == 'S')\
> ##   .filter(ProdutoEmpresa.CdEmpresa == 4)\
> ##   .order_by(Produto.NmProduto)
> 
> query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
> Produto.NmProduto, 

[sqlalchemy] Using joins+max with sql server

2023-04-14 Thread Elias Coutinho
Good afternoon.
I am having trouble transforming a SQL Server query to SQL Alchemy.

*The SQL Server query is this*

SELECT CP.CdChamada, P.NmProduto, PE.VlPrecoCusto, PE.VlPrecoSugerido, 
EE.QtEstoque, EE.DtReferencia
FROM Produto P
 INNER JOIN Produto_Empresa PE ON  P.IdProduto = PE.IdProduto
 INNER JOIN CodigoProduto CP ON  P.IdProduto = CP.IdProduto
 INNER JOIN (SELECT IdProduto, CdEmpresa, MAX(DtReferencia) AS 
MaxDtReferencia
 FROM EstoqueEmpresa
 GROUP BY IdProduto, CdEmpresa) AS EE2 ON EE2.IdProduto = 
P.IdProduto AND EE2.CdEmpresa = PE.CdEmpresa
 INNER JOIN EstoqueEmpresa EE ON EE.IdProduto = EE2.IdProduto AND 
EE.DtReferencia = EE2.MaxDtReferencia AND EE.CdEmpresa = EE2.CdEmpresa
WHERE PE.StAtivoVenda = 'S' AND 
  PE.CdEmpresa = 4 AND 
  CP.IdTipoCodigoProduto = '00A002'
ORDER BY CP.CdChamada

*My code is as follows:*
*My Model*
class EstoqueEmpresa(Base):
__tablename__ = 'EstoqueEmpresa'

IdProduto = Column(CHAR(10, 'SQL_Latin1_General_CP850_CI_AI'), 
primary_key=True, nullable=False)
CdEmpresa = Column(Integer, primary_key=True, nullable=False)
DtReferencia = Column(DateTime, primary_key=True, nullable=False, index=
True)
VersaoRegistro = Column(TIMESTAMP, nullable=False)
QtCompra = Column(Float(53))
VlCompra = Column(Float(53))
QtVenda = Column(Float(53))
VlVenda = Column(Float(53))
VlCustoMercadoriaVendida = Column(Float(53))
QtEntrada = Column(Float(53))
VlEntrada = Column(Float(53))
QtSaida = Column(Float(53))
VlSaida = Column(Float(53))
VlSaidaAcerto = Column(Float(53))
QtSaidaAcerto = Column(Float(53))
QtEstoque = Column(Float(53))
VlEstoque = Column(Float(53))
VlUltimoCustoMedio = Column(Float(53))
DtInicialAlinhamentoEstoque = Column(DateTime)
QtCompraNaoAtualizaCustoMedio = Column(Float(53))
VlCompraNaoAtualizaCustoMedio = Column(Float(53))
QtEntradaNaoAtualizaCustoMedio = Column(Float(53))
VlEntradaNaoAtualizaCustoMedio = Column(Float(53))

*My code*
from sqlalchemy import create_engine, text, Column, update, insert, select
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm import Session
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func, and_

import unidecode
import pandas as pd
from datetime import datetime
import re
import itertools

from itertools import islice

# Importo somente as tabelas que vou usar
from models import CodigoProduto, ProdutoEmpresa, EstoqueEmpresa, Produto

#-
# Configuração da conexão com o banco de dados
USER = 'sa'
PASSWORD = 'Abc*123'
HOST = 'SERVER-02\MSSQLSERVERB'
DATABASE = 'ALTERDATA_TESTE'

engine = create_engine(f'mssql+pyodbc://{USER}:{PASSWORD}@{HOST}/{DATABASE}
?driver=ODBC+Driver+17+for+SQL+Server')

# Create a Session object
Session = sessionmaker(bind=engine)
session = Session()


#-
# Subquery para buscar o maior registro de estoqueempresa para cada produto
estoqueAtual = session.query(
EstoqueEmpresa.IdProduto,
EstoqueEmpresa.QtEstoque,
func.max(EstoqueEmpresa.DtReferencia).label('MaxDtReferencia')
).group_by(EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque, 
EstoqueEmpresa.DtReferencia).subquery()

#print(estoqueAtual)

# Realiza a consulta com SQLAlchemy
##query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, 
Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, 
ProdutoEmpresa.VlPrecoSugerido, estoqueAtual.c.QtEstoque)\
##   .join(ProdutoEmpresa, Produto.IdProduto == 
ProdutoEmpresa.IdProduto)\
##   .join(CodigoProduto, Produto.IdProduto == 
CodigoProduto.IdProduto)\
##   .join(estoqueAtual, and_(Produto.IdProduto == 
estoqueAtual.c.IdProduto))\
##   .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == 
Produto.IdProduto))\
##   .filter(ProdutoEmpresa.StAtivoVenda == 'S')\
##   .filter(ProdutoEmpresa.CdEmpresa == 4)\
##   .order_by(Produto.NmProduto)

query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, Produto.
NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido, 
EstoqueEmpresa.DtReferencia, estoqueAtual.c.QtEstoque)\
   .join(ProdutoEmpresa, Produto.IdProduto == ProdutoEmpresa.
IdProduto)\
   .join(CodigoProduto, Produto.IdProduto == CodigoProduto.
IdProduto)\
   .join(estoqueAtual, and_(Produto.IdProduto == 
estoqueAtual.c.IdProduto, 
EstoqueEmpresa.DtReferencia == estoqueAtual.c.MaxDtReferencia))\
   .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == 
Produto.IdProduto, EstoqueEmpresa.DtReferencia == estoqueAtual.c
.MaxDtReferencia))\
   .filter(ProdutoEmpresa.StAtivoVenda == 'S')\