DUVIDA SQL SERVER

GUSTAVOCANALLI 28/08/2009 18:17:32
#321282
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?
EMERSONTADEU 28/08/2009 22:13:26
#321300
Resposta escolhida
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)
GUSTAVOCANALLI 28/08/2009 22:31:49
#321301
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.
EMERSONTADEU 29/08/2009 00:27:41
#321305
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
GUSTAVOCANALLI 29/08/2009 01:19:52
#321307
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.
EMERSONTADEU 29/08/2009 01:28:06
#321308


  
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[ô]
EMERSONTADEU 29/08/2009 01:40:51
#321309
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.
GUSTAVOCANALLI 29/08/2009 01:41:55
#321310
EH ENTAO...

O FODA EH Q EU N MANJO MTO...
EMERSONTADEU 29/08/2009 01:48:56
#321311
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)
GUSTAVOCANALLI 29/08/2009 01:50:18
#321312
CLARO VEI...EU TO LIGADO...

EU JAH TO RESOLVENDO A PARADA AQUI..

VLW MSM
EMERSONTADEU 29/08/2009 02:00:12
#321313
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.

  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

Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas