DUVIDA SQL SERVER
SEGUINTE...
TENHO UMA TABELA PRODUTO E OUTRA INGREDIENTE.
NO CADASTRO DE PRODUTOS, EU DIGO SE O PRODUTO é COMPOSTO OU NÃO.
SE ELE FOR COMPOSTO. ENTRO NUMA TELA PARA VINCULAR OS INGREDIENTES PERTENCENTES AO PRODUTO.
O PROBLEMA é QUE NA TELA DE PEDIDOS, EU TENHO QUE VERIFICAR SE ELE TEM ESTOQUE VÃLIDO.
PARA ISSO...DEVE-SE VERIFICAR O SEGUINTE.
POR EXEMPLO...UM LANCHE é FEITO DE 20GR DE QUEIJO E 30GR DE PRESUNTO.
MSM Q TIVER 1000GR DE QUEIJO NO ESTOQUE E TIVER 90GR DE PRESUNTO. SÓ Hà 3 LANCHES DISPONIVEIS NO ESTOQUE.
COMO EU PODERIA RESOLVER ISSO?
TENHO UMA TABELA PRODUTO E OUTRA INGREDIENTE.
NO CADASTRO DE PRODUTOS, EU DIGO SE O PRODUTO é COMPOSTO OU NÃO.
SE ELE FOR COMPOSTO. ENTRO NUMA TELA PARA VINCULAR OS INGREDIENTES PERTENCENTES AO PRODUTO.
O PROBLEMA é QUE NA TELA DE PEDIDOS, EU TENHO QUE VERIFICAR SE ELE TEM ESTOQUE VÃLIDO.
PARA ISSO...DEVE-SE VERIFICAR O SEGUINTE.
POR EXEMPLO...UM LANCHE é FEITO DE 20GR DE QUEIJO E 30GR DE PRESUNTO.
MSM Q TIVER 1000GR DE QUEIJO NO ESTOQUE E TIVER 90GR DE PRESUNTO. SÓ Hà 3 LANCHES DISPONIVEIS NO ESTOQUE.
COMO EU PODERIA RESOLVER ISSO?
Vc precisa criar uma tabela intermediária [ingredientes] que contenha a chave de produto e ingredientes na mesma linha.
Opção 1 : A cada produto que entra no pedido deve-se dar saida apenas na ingredientes .... a tabela produto não teria movimentação registrada, apenas calculada.
Opção 2 : A cada movimento na tabela ingredientes um recálculo da produto inteira seria efetuado ... pode ser algo meio complicado dependendo da frequencia que ingredientes são movimentados direta (compra) ou indiretamente (venda de produtos).
Pela sua explicação seria mais interessante calcular o estoque assim que o produto entrasse na tela (opção 1)
Opção 1 : A cada produto que entra no pedido deve-se dar saida apenas na ingredientes .... a tabela produto não teria movimentação registrada, apenas calculada.
Opção 2 : A cada movimento na tabela ingredientes um recálculo da produto inteira seria efetuado ... pode ser algo meio complicado dependendo da frequencia que ingredientes são movimentados direta (compra) ou indiretamente (venda de produtos).
Pela sua explicação seria mais interessante calcular o estoque assim que o produto entrasse na tela (opção 1)
E AI CARA BLZ?
ACHO QUE VOCE NAO ENTENDEU...
OQ EU ESTOU TENDO DIFICULDADE NAO EH PRA RETIRAR A QUANTIDADE DO ESTOQUE (ISSO AI é SUSSA)
OQ EU QUERO FAZER é UM CALCULO, PERCORRENDO TODA A TABELA INGRADIENTE SELECIONANDO TD COM O CODIGO DO PRODUTO...PRA VER SE COM AQUELES INGRADIENTES, PODE-SE FAZER A QTDE ESPECIFICADA NA VENDA.
ACHO QUE VOCE NAO ENTENDEU...
OQ EU ESTOU TENDO DIFICULDADE NAO EH PRA RETIRAR A QUANTIDADE DO ESTOQUE (ISSO AI é SUSSA)
OQ EU QUERO FAZER é UM CALCULO, PERCORRENDO TODA A TABELA INGRADIENTE SELECIONANDO TD COM O CODIGO DO PRODUTO...PRA VER SE COM AQUELES INGRADIENTES, PODE-SE FAZER A QTDE ESPECIFICADA NA VENDA.
Se mandar null para a variável @id_produto vc vai ter o resultado para todos produtos x ingredientes que sejam marcados como compostos.
A conversão de estoque/formula.quantidade para inteiro'é para vc não ter um resultado do tipo 2,999.1859687 produtos em stok.
Utilize SQL server ou outro SGDB senão vai ter que traduzir para VBnês e vai ficar por sua conta.
Se eu realmente não entendi nada devido a complexidade do que precisava eu peço desculpas ... tentei bastante, pod acreditar.
valew
A conversão de estoque/formula.quantidade para inteiro'é para vc não ter um resultado do tipo 2,999.1859687 produtos em stok.
Utilize SQL server ou outro SGDB senão vai ter que traduzir para VBnês e vai ficar por sua conta.
Se eu realmente não entendi nada devido a complexidade do que precisava eu peço desculpas ... tentei bastante, pod acreditar.
valew
EU TO USANDO O SQL SERVER 2005.
é CARA...EH FODA MSM...AINDA MAIS PQ EU NAO MANJO EXPLICA MUITO BEM...HEHE...AI FIKA FODA PRA ENTENDE.
VO TENTA MAIS UMA VEZ...
QUANDO VC VAI ADICIONA UM PRODUTO NUMA VENDA...VC TEM Q VERIFICAR QUE A QUANTIDADE QUE O CLIENTE QUER COMPRAR ESTA DISPONIVEL NO ESTOQUE.
UMA PIZZA OU UM LANCHE NAO PODE SER CONTROLADO DIRETAMENTE POR [Ô]ESTOQUE[Ô]...POIS ELE DEPENDE DA DISPONIBILIDADE DE DIBVERSOS OUTROS PRODUTOS (INGREDIENTES)
ENTAO NA HORA DA VENDA EU TENHO QUE VERIFICAR SE EXISTE INGREDIENTES SUFICIENTE PARA FAZER O TOTAL DE LANCHES, PIZZAS, ETC QUE O CLIENTE PEDIU.
é CARA...EH FODA MSM...AINDA MAIS PQ EU NAO MANJO EXPLICA MUITO BEM...HEHE...AI FIKA FODA PRA ENTENDE.
VO TENTA MAIS UMA VEZ...
QUANDO VC VAI ADICIONA UM PRODUTO NUMA VENDA...VC TEM Q VERIFICAR QUE A QUANTIDADE QUE O CLIENTE QUER COMPRAR ESTA DISPONIVEL NO ESTOQUE.
UMA PIZZA OU UM LANCHE NAO PODE SER CONTROLADO DIRETAMENTE POR [Ô]ESTOQUE[Ô]...POIS ELE DEPENDE DA DISPONIBILIDADE DE DIBVERSOS OUTROS PRODUTOS (INGREDIENTES)
ENTAO NA HORA DA VENDA EU TENHO QUE VERIFICAR SE EXISTE INGREDIENTES SUFICIENTE PARA FAZER O TOTAL DE LANCHES, PIZZAS, ETC QUE O CLIENTE PEDIU.
declare @id_produto int
set @id_produto = null
-- O ingrediente NÃO OPCIONAL da fórmula que pode compor menor unidade de um produto coincide com a quantidade em estoque ...
-- A query abaixo traz inclusive o ingrediente crÃtico, é rápida mesmo com tabelas gigantescas por utilizar chave + 1 coluna bit no WHERE
-- O parametro isnull() quer dizer que se @id_produto vier null usa id_produto = id_produto, ou seja cancela o filtro pelo id
SELECT --top 1
p.ds_produto
,i.ds_ingrediente
,cast(i.estoque/f.quantidade as int) as [ô]basestok[ô]
from (
formula f
inner join
ingrediente i
on
f.id_ingrediente = i.id_ingrediente)
right join
produto p
on p.id_produto = f.id_produto
where
f.id_produto = isnull(@id_produto,f.id_produto)
and f.opcional = 0
order by
[ô]basestok[ô]
--Resultado A: top 1 ativo
--ds_produto ds_ingrediente basestok
--Nº 1 QUEIJO 50
--Resultado B: top 1 desabilitado
--ds_produto ds_ingrediente basestok
--Nº 1 QUEIJO 50
--Nº 2 CHEDDER 50
--Nº 1 ALFACE 140
--Nº 1 HAMBURGER 500
--Nº 2 HAMBURGER 1000
--Nº 2 PAO INTEGRAL 1500
--Nº 1 PAO COM GEREGELIN 1500
-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-- Para ter um relatório direto produto x stok, sem mostrar o que vai acabar simplemente retire o campo descrição do ingrediente, procure pelo ingrediente com minima capacidade e agrupe por produto ... também vai ser rápido!
SELECT
p.ds_produto
--,i.ds_ingrediente
--,cast(i.estoque/f.quantidade as int) as [ô]basestok[ô]
,min(cast(i.estoque/f.quantidade as int)) as [ô]basestok[ô]
from (
formula f
inner join
ingrediente i
on
f.id_ingrediente = i.id_ingrediente)
right join
produto p
on p.id_produto = f.id_produto
where
f.id_produto = isnull(@id_produto,f.id_produto)
and f.opcional = 0
group by
p.ds_produto
order by
[ô]basestok[ô]
Eu consigo fazer o que quer com o código acima, antes de vender eu executo a 1a query e vejo se posso fazer mais do que o cliente ta pedindo.
Resta saber se vc esta afim de talvez adequar suas tabelas ... fiz pensando em ter milhares de ingredientes no estoque e um cardápio com centenas de opções.
Resta saber se vc esta afim de talvez adequar suas tabelas ... fiz pensando em ter milhares de ingredientes no estoque e um cardápio com centenas de opções.
EH ENTAO...
O FODA EH Q EU N MANJO MTO...
O FODA EH Q EU N MANJO MTO...
Ae fode fii ... ta na sua tela a solução.
Ninguém faria por vc o que fiz, de boa vontade trabalhei de grátis para resolver seu problema ... dar aula está muito tarde, boa noite
Ps, ja era seu problema com a copnsulta ... precisa resolver o outro com SQL.
(Fui xato mas acima de tudo sincero)
Ninguém faria por vc o que fiz, de boa vontade trabalhei de grátis para resolver seu problema ... dar aula está muito tarde, boa noite
Ps, ja era seu problema com a copnsulta ... precisa resolver o outro com SQL.
(Fui xato mas acima de tudo sincero)
CLARO VEI...EU TO LIGADO...
EU JAH TO RESOLVENDO A PARADA AQUI..
VLW MSM
EU JAH TO RESOLVENDO A PARADA AQUI..
VLW MSM
O script (SQL 2008) para criação do banco ... entenda que FILENAME deve apontar para um diretório local válido em que o SQL possa criar os arquivos.
Teste antes de executar, em caso alguns erros verifique se comentar a linha do erro resolve pois incompatibilidade de instalaçao pode xiar ... mas não vai formatar seu micro não, pod confiar nos meus anos de VBM.
Teste antes de executar, em caso alguns erros verifique se comentar a linha do erro resolve pois incompatibilidade de instalaçao pode xiar ... mas não vai formatar seu micro não, pod confiar nos meus anos de VBM.
USE [master]
GO
/****** Object: Database [LanchoNET] Script Date: 08/29/2009 01:56:48 ******/
CREATE DATABASE [LanchoNET] ON PRIMARY
( NAME = N[ô]LanchoNET[ô], FILENAME = N[ô]X:\LOCALPATH...\LanchoNET.mdf[ô] , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N[ô]LanchoNET_log[ô], FILENAME = N[ô]X:\LOCALPATHLOG...\LanchoNET_log.ldf[ô] , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [LanchoNET] SET COMPATIBILITY_LEVEL = 90
GO
IF (1 = FULLTEXTSERVICEPROPERTY([ô]IsFullTextInstalled[ô]))
begin
EXEC [LanchoNET].[dbo].[sp_fulltext_database] @action = [ô]enable[ô]
end
GO
ALTER DATABASE [LanchoNET] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [LanchoNET] SET ANSI_NULLS OFF
GO
ALTER DATABASE [LanchoNET] SET ANSI_PADDING OFF
GO
ALTER DATABASE [LanchoNET] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [LanchoNET] SET ARITHABORT OFF
GO
ALTER DATABASE [LanchoNET] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [LanchoNET] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [LanchoNET] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [LanchoNET] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [LanchoNET] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [LanchoNET] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [LanchoNET] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [LanchoNET] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [LanchoNET] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [LanchoNET] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [LanchoNET] SET DISABLE_BROKER
GO
ALTER DATABASE [LanchoNET] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [LanchoNET] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [LanchoNET] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [LanchoNET] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [LanchoNET] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [LanchoNET] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [LanchoNET] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [LanchoNET] SET READ_WRITE
GO
ALTER DATABASE [LanchoNET] SET RECOVERY SIMPLE
GO
ALTER DATABASE [LanchoNET] SET MULTI_USER
GO
ALTER DATABASE [LanchoNET] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [LanchoNET] SET DB_CHAINING OFF
GO
Tópico encerrado , respostas não são mais permitidas