Ir para conteúdo
Fórum Script Brasil

pestana.

Membros
  • Total de itens

    32
  • Registro em

  • Última visita

Sobre pestana.

  • Data de Nascimento 06/05/1981

Perfil

  • Gender
    Male
  • Location
    Araras/SP

Contatos

  • Yahoo
    rogerio_pestana@yahoo.com.br

pestana.'s Achievements

0

Reputação

  1. Jhonas foi melhor desmembrar o select que eu havia montado (como o Imex sugeriu). A finalidade (inclusão na tabela) é a mesma mas teria que ser desmembrado em 2 selects para que eu pudesse incluir a linha retornada de cada iteração na tabela saldo_estoque, caso contrario, ocorreria erro de violação de chave por tentativa de incluir o mesmo registro que foi incluído anteriormente. Muito obrigado pela ajuda!
  2. Meu amigo valeu pelas dicas e o empenho em querer me ajudar! Eu consegui resolver refazendo o select em vez de um único select declarado no loop "For Select". Agora eu não consegui entender o porque do erro que estava acontecendo? de uma olhada neste fórum no qual um amigo me ajudou http://www.activedelphi.com.br/forum/viewtopic.php?t=92982 Obrigado!
  3. Pessoal desconsidere os códigos acima e verifique esta Trigger. Fazendo os testes eu descobri que ao incluir registros na tabela "saldo_estoque" dentro do For Select Do ocorre este erro. Parece que o loop For Select tenta incluir duas vezes o mesmo registro na tabela saldo_estoque, deem uma olhada na declaração select ... SET TERM ^ ; CREATE OR ALTER TRIGGER ADICIONAR_ESTOQUE FOR PEDIDO_ENTRADA ACTIVE AFTER UPDATE POSITION 0 as declare variable idMovimento integer; declare variable idProduto integer; declare variable idEmbalagem integer; declare variable valorCusto numeric(13,2); declare variable margem numeric(7,2); declare variable valorVenda numeric(13,2); declare variable percDesc numeric(5,2); declare variable qtdeItem numeric(10,3); declare variable qtdeEstq numeric(13,3); declare variable valorTotal numeric(18,2); begin /* se o status do pedido estiver como finalizado */ if ((old.status = 'P') and (new.status = 'F')) then begin /* inclui registro na tabela movimento_estoque */ execute procedure add_movimento_estoque (old.id_pedido,NULL,2,NULL,'N') returning_values :idMovimento; /* retorna o último saldo de estoque em que o código do produro e embalagem seja igual ao do item do pedido */ for select s.id_produto, s.id_embalagem, i.valorUnitario, s.percentual, s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade, s.valorTotal from item_entrada i inner join saldo_estoque s on(i.id_produto = s.id_produto and i.id_embalagem = s.id_embalagem) where (i.id_pedido = old.id_pedido) and (s.id_movimento = (select max(id_movimento) from saldo_estoque where (id_produto = s.id_produto) and (id_embalagem = s.id_embalagem))) into :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, :qtdeEstq, :qtdeItem, :valorTotal do begin insert into saldo_estoque (id_movimento, id_produto, id_embalagem, valorCusto, percentual, valorVenda, percentDesc, qtdeMov, valorMov, qtdeAtual, valorTotal) values (:idMovimento, :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, 0, 0, :qtdeEstq, :valorTotal); end end end ^ SET TERM ; ^ Agora estou tentando encontrar uma solução para este problema, quem puder me ajudar eu agradeço! Obrigado!
  4. Quando eu retirei a chave primaria composta pk_saldoEstoque aconteceu algo estranho... agora parece que entra num loop infinito e não consigo sair senão fazendo a finalização forçada. Quando eu fui ver o gerador (generator) do campo campo id_movimento estava com 2559, de 62 foi pra este número. Eu estou perdendo vários dias pra tentar encontrar aonde esta o erro mas tá difícil. Meu amigo o que eu tenho que fazer agora? Obrigado pela a sua paciência!
  5. Bom dia meu amigo! Se eu executar o select no banco o resultado é: id_produto = 1 | id_embalagem = 1 | valorUnitario = 25 | percentual = 0 | valorVenda = 0 | percentDesc = 0 | qtdeAtual = 14 | quantidade = 2 | valorTotal = 325 id_produto = 2 | id_embalagem = 1 | valorUnitario = 75 | percentual = 0 | valorVenda = 0 | percentDesc = 0 | qtdeAtual = 3 | quantidade = 3 | valorTotal = 225 Repare que dentro do For Select ... não se repete, porque a chave no primeiro laço ficaria com: id_movimento = 62, id_produto = 1, id_embalagem = 1 depois na próximo iteração do loop seria: id_movimento = 62, id_produto = 2, id_embalagem = 1 Eu não consigo entender o porque desta mensagem! Obrigado por esta me ajudando!
  6. Boa tarde! Alguma coisa tem de errado neste código eu suspeito que seja esta trigger no bloco For Select ... Into Do, se eu retirar este bloco funciona mas logicamente somente se houver um item por pedido, quando eu adiciono este bloco For Select ... Into Do o erro acontece... Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values. violation of PRIMARY or UNIQUE KEY constraint "PK_SALDOESTOQUE" on table "SALDO_ESTOQUE". Problematic key value is ("ID_MOVIMENTO" = 62, "ID_PRODUTO" = 1, "ID_EMBALAGEM" = 1). At procedure 'ADD_SALDO_ESTOQUE' line: 15, col: 4 At procedure 'REAJUSTAR_SALDOESTQ' line: 41, col: 8 At trigger 'ADICIONAR_ESTOQUE' line: 34, col: 11. alguém poderia me dar um Help? Explicação do código: Existe as tabelas de pedido_entrada, item_entrada, movimento_estoque e saldo_estoque. pedido_entrada e item_entrada: armazena os pedidos de compra. movimento_estoque e saldo_estoque: armazena as movimentações e seu saldo de estoque, respectivamente. Esta Trigger é disparado depois de atualizar a tabela pedido_entrada (pedido de compra) aonde o campo status for alterado de (P)endente para (F)inalizado. A inteção é adicionar todos os itens do pedido de compra na tabela saldo de estoque (não esquecendo que a estrutura é um mestre-detalhe movimento_estoque 1-N saldo_estoque). set term ^ ; create trigger adicionar_estoque for pedido_entrada active after update position 0 as declare variable idMovimento integer; declare variable idProduto integer; declare variable idEmbalagem integer; declare variable valorCusto numeric(13,2); declare variable margem numeric(7,2); declare variable valorVenda numeric(13,2); declare variable percDesc numeric(5,2); declare variable qtdeItem numeric(10,3); declare variable qtdeEstq numeric(13,3); declare variable valorTotal numeric(18,2); begin /* se o status do pedido estiver como finalizado */ if ((old.status = 'P') and (new.status = 'F')) then begin /* inclui registro na tabela movimento_estoque */ execute procedure add_movimento_estoque(old.id_pedido,NULL,2,NULL,'N') returning_values :idMovimento; /* retorna o último saldo de estoque em que o código do produro e embalagem seja igual ao do item do pedido */ for select s.id_produto, s.id_embalagem, i.valorUnitario, s.percentual, s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade, s.valorTotal from item_entrada i inner join saldo_estoque s on(i.id_produto = s.id_produto and i.id_embalagem = s.id_embalagem) where (i.id_pedido = old.id_pedido) and (s.id_movimento = (select max(id_movimento) from saldo_estoque where (id_produto = s.id_produto) and (id_embalagem = s.id_embalagem))) into :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, :qtdeEstq, :qtdeItem, :valorTotal do begin execute procedure reajustar_saldoEstq('E',2,:idMovimento,:idProduto,:idEmbalagem, :qtdeItem,:qtdeEstq,:valorCusto,:margem, :valorVenda,:percDesc,:valorTotal); end end end ^ set term ; ^ set term ^ ; create procedure reajustar_saldoEstq( operacao char(1) character set win1252, idTipo integer, idMovimento integer, idProduto integer, idEmbalagem integer, qtde numeric(10,3), qtdeEstq numeric(13,3), valorCusto numeric(13,2), margem numeric(7,2), valorVenda numeric(13,2), percDesc numeric(5,2), valorTotal numeric(18,2)) as declare variable custoMedio numeric(13,2); declare variable valorMov numeric(15,2); begin /* reajusta a quantidade em estoque e o valor total de custo. */ if (operacao in ('E','S','I')) then begin if (operacao = 'E') then /* entrada. */ begin qtdeEstq = (:qtdeEstq + :qtde); valorMov = (:valorCusto * :qtde); valorTotal = (:valorTotal + :valorMov); end else if (operacao = 'S') then /* saída. */ begin qtdeEstq = (:qtdeEstq - :qtde); valorMov = (:valorCusto * :qtde); valorTotal = (:valorTotal - :valorMov); end else if (operacao = 'I') then /* inicializa. */ begin qtdeEstq = :qtde; valorMov = (:valorCusto * :qtde); valorTotal = :valorMov; end /* inclui registro na tabela saldo_estoque. */ execute procedure add_saldo_estoque (:idMovimento,:idProduto,:idEmbalagem, :valorCusto,:margem,:valorVenda,:percDesc, :qtde,:valorMov,:qtdeEstq,:valorTotal); /* idTipo 2: entrada por compra, 4: devolução de venda, 5: devolução de compra */ /* devolução de ... para casos em que o valor de custo da "devolução" seja diferente do valor de custo atual. */ if ((operacao in ('E','S')) and (idTipo in (2,4,5))) then begin /* se o custo médio for alterado, recalcula o custo e inclui um novo movimento. */ custoMedio = (:valorTotal / :qtdeEstq); if (:valorCusto <> :custoMedio) then begin execute procedure add_movimento_estoque (NULL,NULL,1,NULL,'N') returning_values :idMovimento; execute procedure add_saldo_estoque (:idMovimento,:idProduto,:idEmbalagem, :custoMedio,:margem,:valorVenda,:percDesc, 0,0,:qtdeEstq,:valorTotal); end end end end ^ set term ; ^ Obrigado!
  7. Alexsandro qual é o banco de dados? SELECT codigo_produto, nome_produto, valor_produto, data_ult_mov FROM estoque WHERE (data_ult_mov IS NULL) OR (data_ult_mov NOT BETWEEN :dataInicial AND :dataFinal)
  8. Eu já enviei por e-mail ... qualquer coisa volte a postar Boa sorte!
  9. Qual é o tipo do campo FIN_NFE? se for do tipo inteiro, você pode utilizar o case ou IF: com Case case ClientDataSet_view_nfe.FieldByName('FIN_NFE').AsInteger of 1 : ComboBox_Fin.ItemIndex := 0; 2 : ComboBox_Fin.ItemIndex := 1; 3 : ComboBox_Fin.ItemIndex := 2; 4 : ComboBox_Fin.ItemIndex := 3; end; com IF if ClientDataSet_view_nfe.FieldByName('FIN_NFE').AsInteger in [1,2,3,4] then ComboBox_Fin.ItemIndex := ClientDataSet_view_nfe.FieldByName('FIN_NFE').AsInteger-1; // ou ainda, caso o valor não esteja dentro da faixa, não seleciona nenhum item: var valor : integer; begin valor := ClientDataSet_view_nfe.FieldByName('FIN_NFE').AsInteger; ComboBox_Fin.ItemIndex := IfThen((valor in [1,2,3,4]),valor-1,-1); end; Qualquer coisa volte a postar
  10. depois do public tem que ser end com o (;) e não (.) e no final tem um end a mais (end;) qualquer coisa volte a postar.
  11. Tendo uma tabela de produto e outra de categoria em que ambos estão relacionados, faça o seguinte: No IBTable1 você configura para exibir os registros de produto. No IBTable2 você congigura para que amostre todas as categorias. No DBLookupComboBox você configura ListSource, ListField e KeyField. No botão de pesquisa você faz isso: IBTable1.Filter := 'codigoCategoria = IBTable2.FieldByName('codigoCategoria').AsString); IBTable1.Filtered := true; IBTable1.Open; Eu fiz um exemplo utilizando o banco employee do firebird, como eu posso enviar pra você?
  12. ValSistemasDelphi, você pode ter duas IBTable. IBTable1 contem os dados da pesquisa, p.ex: os dados que estão na tela (a imagem que você postou). IBTable2 contem somente as categorias exibido no DBLookupComboBox. Porque eu acho que você esta usando uma IBTable para todos (amostrar os dados da pesquisa na tela e no DBLookupComboBox) por isso que não funciona, tem que separar os registros que foram filtrados através da pesquisa (se utiliza IBTable1) e os dados da categoria exibido no (DBLookupComboBox) se utiliza o IBTable2, com isso um não interfere no outro. Depois que você escolheu uma categoria no DBLookupComboBox você faz a pesquisa, com isso vai retornar todos os registros aonde a categoria seja igual a categoria selecionado no DBLookupComboBox e no DBLookupComboBox continua aparecendo todas as categorias. Não sei se ficou confuso, qualquer coisa eu explico novamente! Um outro ponto seria você criar uma tabela de categoria e relacionar com a tabela produto e fazer o relacionamento de um para muitos no sentido de categoria para produtos. Categoria {id_categoria, descricao, ...} 1 - N Produto {id_produto, descricao, id_categoria ...} id_categoria da tabela produto referência o campo id_categoria da tabela categoria. id_categoria da tabela produto - chave estrangeira. Boa Sorte!
  13. Se você não quer filtrar por categoria retire o filtro: IBTable1.Filter ... e o deixe como falso a propriedade Filtered. é isso que você quer?
  14. Aquele só foi um exemplo de como preencher o combobox como os dados do Field do IBTable. Você tem que incluir este código aonde houver a sua necessidade, por exemplo depois de pesquisar ou incluir um registro na tabela do banco. Mas tente fazer como o Jhonas citou que é mais fácil. Qualquer coisa volte a postar, boa sorte!
  15. Supondo que você tem este campo de categoria na sua tabela de produto, para preencher o combobox com as categorias é só você fazer isso: combobox.items.add(IBtable.FieldByName('campoCategoria').asString); Depois você filtra os dados: IBTable.Filter := 'campoCategoria CONTAINING '+QuotedStr(ComboBox.Items.Strings[ComboBox.ItemIndex]); IBTable.Filtered := true; IBTable.Open; Eu acho que é isso, mas qualquer coisa volte a postar, Boa sorte!
×
×
  • Criar Novo...