Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marostegan

exibição de dados

Recommended Posts

olá pessoal... ainda estou com um probleminha na parte de vendas que nao consigo resolver... =//

 

tenho 2 tabelas relacionadas... um de vendas e a outra de vendas_detalhes...

 

quando vai fazer uma nova venda as informações principais ficam gravadas na vendas e todos os produtos que for relacionando aquela vendas vai pra vendas_detalhes...

 

tudo está funcionando normal, a única coisa é que durante a venda as informações que vao para a tabela do vendas_detalhes nao sao exibidas no DBGrid.. elas só sao exibidas depois de gravar a venda e abrir novamente a tela...

 

veja como fica durante a venda:

 

Imagem Postada

 

** reparem que eu jah cliquei no botao "incluir produto", ele jah foi pra tabela e ate foi feita a soma final (lá em baixo)... Porém, nao é exibido no DBGRid...

 

Agora veja só, depois de clicar para finalizar a venda e abrir novamente a tela:

 

Imagem Postada

 

** agora ela aparece certinho!

 

0o''

 

no botão "incluir produto", tenho a seguinte programação:

varsoma1: Double;beginsoma1 := 0;v_total1.Visible := true;edt_venc_garantia.text := dbe_venc_garantia.text;begindm.q_vendas_detal.Close;dm.q_vendas_detal.SQL.Clear;dm.q_vendas_detal.SQL.Add('Insert into tbl_vendas_detalhes(id_ligacao, cod_prod, produto, valor_uni, quant, valor_total, valor_final, valor_desc, venc_garantia, descont) values ('''+dbe_codigo.Text+''','''+edt_codprod.Text+''','''+edt_produtos.Text+''','''+edt_valor_uni.Text+''','''+dbe_quant.Text+''','''+dbe_valor_total.Text+''','''+dbe_valor_final.Text+''','''+dbe_valor_desc.Text+''','''+edt_venc_garantia.Text+''','''+dbe_desconto.Text+''')');dm.q_vendas_detal.ExecSQL;dm.t_vendas_detal.Requery;end;beginwith dm.q_vendas_detal dobegin  Close;  SQL.Clear;  SQL.Add('select * from tbl_vendas_detalhes where id_ligacao like'''+ dbe_codigo.text + '%''');  Open;  while not dm.q_vendas_detal.Eof dobegin  soma1 := soma1 + dm.q_vendas_detal.Fieldbyname('valor_final').Value;  dm.q_vendas_detal.Next;  v_total1.Caption := FloatToStrF(soma1,ffCurrency , 15,2);end;    end; end;end;
o que será que ta faltando pra funfa?

 

 

mais uma vez, obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega qual conexão, BD e você está usando um relacionamento Master_detail ?

 

Eu costumo usar 2 ADOQUERYS, qryvenda e o outro qryitem, aí monto o relacionamento via sql no evento AfterScroll do qryvenda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola!

 

isso, é um relacionamento Master_detail

 

estou usando os componentes:

 

ADOQuery

ADOTable

 

meu BD é ACCESS

Compartilhar este post


Link para o post
Compartilhar em outros sites

O ideal é usar 2 ADOQUERYS para conexão direta com as tabelas, o ADOTable não dá certas vantagens como usar sql para o relacionamento e também pode inserir, deletar, editar dados normalmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi... =//

 

você poderia me expicar como fazer relacionamento usando 2 querys? Imagem Postada

 

obrigado!

 

com o jeito q esta o relacionamento atual, nao tem como fazer os itens aparecerem na dbgri no momento que via cadastrando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dan é fácil:

 

tabela venda

cod_venda

 

tabela_item

cod_venda

 

Ou seja todos os itens de uma mesma venda tem o mesmo cod_venda, aí está quase pronto.

 

No evento AfterScroll qryvenda você monta o seguinte select:

 

queryitem.close;

queryitem.sql.clear;

queryitem.sql.add('select * from tabela_item')

queryitem.sql.add('where cod_venda =' + quotedstr(queryvendacodvenda.asstring));

queryitem.open;

 

Esse mesmo select você coloca no evento Oncreate do formvenda.

 

testa aí ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

caraaa!!! que facinhoo!! poxaa, fico mtooo melhro e funcionou legall!!! :clap: :clap: :clap: :clap: :clap:

 

valews mesmo!!!! :joia:

 

 

 

ahh... aproveitando... Imagem Postada a unica coisa q falta pra eu terminar essa parte é que quando realiza venda tem q dar baixa no estoque...

você poderia da uma forcinha pra mim de como é que eu posso fazer isso?

 

mais uma vez, mto obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Supondo q você tenha uma tabela_produto com o campo cod_produto e qtde, e na tabela_item tenha os mesmo campo cod_produto e qtde, é só debitar o estoque.

 

No evento AfterPost da qryitem:

 

while not tabela_produto.eof do

begin

if tabela_itemcod_produto = tabelaprodutocod_produto then

begin

tabela_produto.edit;

tabela_produtoqtde := tabela_produtoqtde - tabela_itemqtde;

tabela_produto.post;

end;

tabela_produto.next;

end;

 

Obs.: Cuidado pq ao excluir um item da venda a qtde desse item já foi debitada do estoque então é necessário devolver esse qtde para estoque.

Esse código funciona quando você salva um item por vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

poxa, não to conseguindo fazer nao... =///

 

olha o que eu tenho (sao 2 BD diferentes)

 

bd_dados -> tbl_produtos -> qtd_estoque -> q_produtos (BD - tabela - campo - ADOQuery)

 

bd_vendas -> tbl_vendas_detalhes -> quant -> q_vendas_detal (BD - tabela - campo - ADOQuery)

 

 

o que eu fiz foi ir no evento AfterPost do q_vendas_detal

 

e coloquei o seguinte:

 

begin
while not q_produtos.eof do
begin
if q_vendas_detalquant = q_produtosqtd_estoque then
begin
q_produtos.edit;
q_produtosqtd_estoque := q_produtosqtd_estoque - q_vendas_detalquant;
q_produtos.post;
end;
q_produtos.next;
end;
end;

mas nao deu certo, aparece o erro: undeclared identifer: 'q_vendas_detalquant'

 

o que está errado?

 

=//

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o seguinte Dan, não precisa criar 2 BDs, no Access você cria 1 Bd e dentro dele você cria várias tabelas, se não vai dar erro mesmo pq a query não vai achar a tabela do outro BD.

 

Exemplo bd_loja:

 

tabela_cliente

tabela_produto

tabela_estoque

tabela_venda

tabela_item

tabela_pagamento

 

e por aí vai .....

 

Do jeito q você está montando a sua estrutura de dados não vai funcionar mesmo, dentro de 1 BD você cria todas as tabelas q você vai precisar.

 

E claro o correta é:

q_produtosqtd_estoque.value := q_produtosqtd_estoque.value - q_vendas_detalquant.value;

 

indique o valor do campo ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

vixi... rrsss..

 

vo arruma isso aqui entao! e dai dps eu testo dinovo... dai posto aqui o resultado! hehe....

 

valeww! xD

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá amigo!

agora unifiquei os BDs

 

ai fiz assim:

 

begin
  while not dm.q_produtos.Eof do
begin
if dm.q_vendas_detalquant.value = dm.q_produtosqtd_estoque.value then
begin
dm.q_produtos.edit;
dm.q_produtosqtd_estoque.value := dm.q_produtosqtd_estoque.Value - dm.q_vendas_detalquant.value;
dm.q_produtos.post;
end;
dm.q_produtos.next;
end;

não da mais erro... mas tb nao funciona... =//

Compartilhar este post


Link para o post
Compartilhar em outros sites

if dm.q_vendas_detalquant.value = dm.q_produtosqtd_estoque.value then

você tem que fazer esse if com o código do produto e não com as quantidades.

 

se o produto da tabela de itens for = ao produto da tabela de estoque, aí que vai atualizar a quantidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola pessoal...

 

poxa... nada de fucionar...

 

begin
  while not q_produtos.Eof do
begin
if q_produtosqtd_estoque.value = q_vendas_detalquant.value then
begin
q_produtos.edit;
q_produtosqtd_estoque.value := q_produtosqtd_estoque.Value - q_vendas_detalquant.value;
q_produtos.post;
end;
q_produtos.next;
end;

o que pode estar dando errado?

 

no meu botão incluir produto, tem a seguinte programação:

 

var
soma1: Double;
begin
soma1 := 0;
v_total1.Visible := true;
edt_venc_garantia.text := dbe_venc_garantia.text;
begin
dm.q_vendas_detal.Close;
dm.q_vendas_detal.SQL.Clear;
dm.q_vendas_detal.SQL.Add('Insert into tbl_vendas_detalhes(id_ligacao, cod_prod, produto, valor_uni, quant, valor_total, valor_final, valor_desc, venc_garantia, descont) values ('''+dbe_codigo.Text+''','''+edt_codprod.Text+''','''+edt_produtos.Text+''','''+edt_valor_uni.Text+''','''+dbe_quant.Text+''','''+dbe_valor_total.Text+''','''+dbe_valor_final.Text+''','''+dbe_valor_desc.Text+''','''+edt_venc_garantia.Text+''','''+dbe_desconto.Text+''')');
dm.q_vendas_detal.ExecSQL;
end;
begin
with dm.q_vendas_detal do
begin
  Close;
  SQL.Clear;
  SQL.Add('select * from tbl_vendas_detalhes where id_ligacao like'''+ dbe_codigo.text + '%''');
  Open;

  while not dm.q_vendas_detal.Eof do

begin
  soma1 := soma1 + dm.q_vendas_detal.Fieldbyname('valor_final').Value;
  dm.q_vendas_detal.Next;

  v_total1.Caption := FloatToStrF(soma1,ffCurrency , 15,2);
dbe_quant.text := '0';
dbe_desconto.text := '0';
dbe_venc_garantia.clear;
end;
    end; end;
end;

será que nao tem algum jeito de fazer esse esquema ai junto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o colega Eutocomproblema já havia postado o correto é:

 

while not q_produtos.Eof do

begin

if q_produtoscodigo.value = q_vendas_detalcodigo.value then

begin

q_produtos.edit;

q_produtosqtd_estoque.value := q_produtosqtd_estoque.Value - q_vendas_detalquant.value;

q_produtos.post;

end;

q_produtos.next;

end;

 

OBS.: Compare os códigos e não as qtdes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ops.. desculpa, eu nao tinha entendido...

 

agora estava dando esse erro:

Incompatible types: 'WideString' adn 'Integer'

 

 

na tabela de produtos, o campo "codigo" é NumeraçãoAutomatica (para gerar o código do produto)

 

e na tabela de vendas, o campo q armazena esse código é "cod_prod" e está como número

 

dai eu colokei os 2 campos sendo "numero"... o erro sumiu, mas nao está dando baixa ainda...

 

=//

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dan vamos entender uma coisa, quando falamos em COD_PRODUTO você gera ou cadastra a partir de um código já existente, serve para identificar o seu produto (exc.:0891236), a ID o próprio BD gera, serve para identificar o registro na tabela para garantir q ele não seja duplicado (ex.: 1, 2, 3.

 

Ou seja COD_PRODUTO é uma coisa e ID é outra coisa.

 

Por esse motivo o sistema não acha um código igual ao outro pq dificilmente a ID (AutoNumeração) da tabela_item vai ser igual a ID da tabela_produto. E outra coisa geralmente os campo COD_PRODUTO são do tipo String.

 

Qualquer dúvida posta aí ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá amigo, conforme você citou acima.. eu fiz as alterações aqui no sistema...

 

mas, msm assim não funciona a parte de baixa...

 

=//

 

o que pode estar dando errando?

 

pessoa... preciso msm muito disso... por favor, me ajudem! =//

 

eu tenho no botao "incluir produtos" a seguinte programação:

 

var
soma1: Double;
begin
soma1 := 0;
v_total1.Visible := true;
edt_venc_garantia.text := dbe_venc_garantia.text;
begin
dm.q_vendas_detal.Close;
dm.q_vendas_detal.SQL.Clear;
dm.q_vendas_detal.SQL.Add('Insert into tbl_vendas_detalhes(id_ligacao, cod_prod, produto, valor_uni, quant, valor_total, valor_final, valor_desc, venc_garantia, descont) values ('''+dbe_codigo.Text+''','''+edt_codprod.Text+''','''+edt_produtos.Text+''','''+edt_valor_uni.Text+''','''+dbe_quant.Text+''','''+dbe_valor_total.Text+''','''+dbe_valor_final.Text+''','''+dbe_valor_desc.Text+''','''+edt_venc_garantia.Text+''','''+dbe_desconto.Text+''')');
dm.q_vendas_detal.ExecSQL;
end;
begin
with dm.q_vendas_detal do
begin
  Close;
  SQL.Clear;
  SQL.Add('select * from tbl_vendas_detalhes where id_ligacao like'''+ dbe_codigo.text + '%''');
  Open;

  while not dm.q_vendas_detal.Eof do

begin
  soma1 := soma1 + dm.q_vendas_detal.Fieldbyname('valor_final').Value;
  dm.q_vendas_detal.Next;

  v_total1.Caption := FloatToStrF(soma1,ffCurrency , 15,2);
dbe_quant.text := '0';
dbe_desconto.text := '0';
dbe_venc_garantia.clear;
end;
    end; end;

tem como fazer a função de dar baixa ai junto??

 

pq lá no ADOQuery não funciona de jeito nenhum! =//

 

obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.