DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da ClubeDelphi ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!


Video: Rad Studio 2007-DBX4 e Firebird 2.0-Aplicação comercial de vendas do Inicio ao Fim-Parte 37-Finalizando a Venda

Nesta vídeo, utilizaremos também as classes DBX4 para verificar se a senha informada pertence a um determinado vendedor.

Título:

Tempo: 25:13 min

 

Mini Resumo: Desde o inicio do projeto, ainda no modelo de banco de dados nós definimos que toda venda deverá pertencer a um cliente e ser realizada por um usuário com permissão para realizar venda. Até agora em nenhum momento em nossa aplicação durante a realização de uma venda nós nos preocupamos por isso. Deixamos isso para o momento de finalizar a venda onde informaremos o Cliente e o vendedor e o momento é este.

Metodologia de desenvolvimento do exemplo: Será criada uma tela exclusiva para finalização da venda onde informaremos o cliente para qual será feita a venda. Utilizaremos também as classes DBX4 para verificar se a senha informada pertence a um vendedor. Por fim criamos a rotina para gerar a venda no banco de dados.

Tecnologias utilizadas: RadStudio 2007, FireBird2.0, DBX4

Exemplos construídos: Finalização da venda.

Palavras chaves: Delphi2007, DBX4, POO, DBXCommon, EmptyDataSet.





    21 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Rodrigo Purgato Bertelle
Bom dia, Rodrigo.
 
Mais uma vez meus parabéns pela aula muito boa, mas me surgiu uma duvída.
 
minha duvída é na digitação da senha do vendedor no momento de finalização da venda.
 
se no caso estiver 2 ou mais vendedores com a mesma senha, Exemplo
 
Vendedor: 1 senha: 123
Vendedor: 2 senha: 123
Vendedor: 3 senha: 123
 
como irei saber qual deles efetuou a venda.
 
Dede de já agradeço a sua atenção.
 
Obrigado.
[há +1 ano] - Responder

 

[autor] Rodrigo Carreiro Mourão
Neste caso tem que ser feito uma trava na senha. Bem ai você pode me dizer que não rola travar senha iguais, concordo.

Uma solução seria pedir para o usuario se logar ao abria a tela de venda, ou repassar se ale abrir de dentro do programa. Na hora da venda apenas pediriamos a senha para confirmar se é quem diz que é.

Ainda assim poderá ocorrer de alguem com a mesma senha vender. Para 100% de segurança é pedir usuario e senha mesmo, ou autenticação por biometria. Ai viajei legal ne kkkkkk.

Mas acredito que seja por ai !!!

Abs !!
[há +1 ano] - Responder
 

Rodrigo Purgato Bertelle
Rodrigo.
 
Podiamos fazer assim num sei se meu pensamento está correto mas vamos lá.
 
Quando o usuário se loga no sistema, ja podemos saber se ele é Vandedor ou não. Então quando for chamdo o forme de venda já poderiamos fazer uma verificação neste momento (se form vendedor abre se não da uma mensagem) correto.
 
No caso de o usuário for um vendedor oque vc acha de passar o login dele como parametro no form de vendas.
Podiamos criar uma variavel publica dentro do form de vendas e ai criar o form de Vendas atribui o login do usuario logado a esta variavel, e assim toda vez q for efetuar uma venda, o usuario informa a senha novamente, assim se outra pessoa for tentar vender ela tem q sabe a senha do usuário logado no momento, e assim passamos como parametro da consulta o login e a senha.
 
Oque vc acha.
 
Obrigado
 
Abs..
[há +1 ano] - Responder
 

Paulo Sérgio Feix

Boa Tarde Rodrigo

Eu estou tentando fazer uma consulta, só que me retorna um erro, Remote Error: Missing Query, Table Name or Procedure Name.

Do lado Servidor tenho um SQLDataSet, Vazio e um DataSetProvider, e do lado Client ClientDataSet, e passo este comando.

Como posso resolver isto

procedure TLista_Clientes.DoSearch;
Var
  S: TStringList;
begin
  S := TStringList.Create;
  S.Add('SELECT ID_ENTIDAD,ENTIDAD_TEXT,ENDERESO, ');
  S.Add('N_CASA,TELEFONO,RUC,TELEFONO,RUC ');
  S.Add('FROM CENTIDADES ');
  if FConsulta.vIDN_CLIENTE = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_CLIENTE = ''S''');
  if FConsulta.vIDN_PROVEEDOR = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_PROVEEDOR = ''S''');
  if FConsulta.vIDN_COMPRA_GRANOS = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_COMPRA_GRANOS = ''S''');
  if FConsulta.vIDN_TRANSPORTADORA = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_TRANSPORTADORA = ''S''');
  if FConsulta.vIDN_FUNCIONARIO = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_FUNCIONARIO = ''S''');
  if FConsulta.vIDN_JURNALEIRO = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_JURNALEIRO = ''S''');
  if FConsulta.vIDN_VENDEDOR = 'S' then //Recebe Informação do TConsulta = record
  S.Add('WHERE IDN_VENDEDOR = ''S''');
  if Combo_Campos.ItemIndex = 0 then
  S.Add('AND ENTIDAD_TEXT CONTAINING ' + QuotedStr(Texto_Procure.Text)); //Varchar - Opção do usuario
  if Combo_Campos.ItemIndex = 1 then
  S.Add('AND N_CEDULA = ' + QuotedStr(Texto_Procure.Text)); //DOUBLE PRECISION - Opção do usuario
  if Combo_Campos.ItemIndex = 2 then
  S.Add('AND RUC CONTAINING ' + QuotedStr(Texto_Procure.Text)); //Varchar
  if Combo_Campos.ItemIndex = 3 then
  S.Add('AND TELEFONO CONTAINING ' + QuotedStr(Texto_Procure.Text)); //Varchar - Opção do usuario
  if Combo_Campos.ItemIndex = 4 then
  S.Add('AND CIUDAD = ' + QuotedStr(Texto_Procure.Text)); //Integer - Opção do usuario
  if Combo_Campos.ItemIndex = 5 then
  S.Add('AND N_CASA CONTAINING ' + QuotedStr(Texto_Procure.Text) ); //Varchar - Opção do usuario

  ListaClientes.Close;
  ListaClientes.CommandText := S.Text;
  ListaClientes.Open;
  FreeAndNil(S);


[há +1 ano] - Responder

 

[autor] Rodrigo Carreiro Mourão
Olá amigo,

Para passar instrução sql via ClientDataSet você precisa alterar a propriedade poAllowCommandText do data set Provider. Ele fica dentro da propriedade Options !!

Abs !!!
[há +1 ano] - Responder
 

Paulo Sérgio Feix

Bom dia

Eu já tinha feito isto poAllowCommandText para = True, Mais mesmo assim não da certo.

Depois consegui, resolver o problema, tem que por o ListaClientes.Execute; antes do Open (DataSnap 2009)

  ListaClientes.Close;
  ListaClientes.CommandText := S.Text;
  ListaClientes.Execute;
  ListaClientes.Open;


[há +1 ano] - Responder

 

[autor] Rodrigo Carreiro Mourão
Olá Amigo,

Voce não havia citado que era no D2009. Temos muitas coisas diferentes agora. E dependendo da arquitetura que a gente montar, com ServerMethod ou não, Com proxy ou não, a coisa muda de figura.

Mas legal, o importante e resolver.

Abs!!
[há +1 ano] - Responder
 

Fernando Henrique Tozetto
Boa Noite Rodrigo.
 
Estou com duas duvidas.
1ª eu criei a tela de vendas e esta tudo funcionando normalmente então atualizei o pacote de vendas criei o novo vendas.pbl, e atualizei, a curiosidade é que quando vou finalizar a venda utilizando o pacote da um "acess violation" o que podeira ser????
 
2ª nos campos float quando atualizo a propriedade currecy para true esse campos me mostra apenas a letra "R" e quando clico em cima é que me aparece os numeros, você sabe como resolver????
 
um grande abraço!!!!!
aguardo sua resposta...
[há +1 ano] - Responder

 

Fernando Henrique Tozetto
Só uma Observação
Estou utilizando o Delphi 2009!!!
[há +1 ano] - Responder
 

[autor] Rodrigo Carreiro Mourão
Olá amigo.

1º)  Acess Violation pode esta relacionado a vários processos mas que no final se resume a: O objeto não foi criado, ou já foi destruido. Agora isso tem suas variantes, por exemplo dar um open num ClientDataSet que esta num data module que e criado depois do Form. Nesse caso objeto(DM) não criado, resultado AcessVioletion.

No seu caso revise a video passo - a - passo. Pode ter passado um delatlhe como registrar a classe, etc.


2ª) Esse segundo caso e totalmente anormal kkkkkkkkkkkk, pode ser um delay de tela, problema no componente. Verifique a autalização do Delphi para saber se esta com a verão mais recente.


abs !
[há +1 ano] - Responder
 

Fernando Henrique Tozetto
Boa tarde Rodrigo!!!!!!
 
baixei seu aplicativo que vem anexo com a video aula, só então percebi que o pacote não estava na pasta certa, então refiz os procedimento, e me aparece o seguinte (required Package 'DbxReadOnlyMetaData' not found) e realmente não existe esse arquivo.bpl nem .dcp em minha maquina, como faço para resolver o problema????, estranho é que a tela está funcionando normalmente, só da o erro quando compilo o pacote!!!!!!
 
Grande abraço
[há +1 ano] - Responder
 

[autor] Rodrigo Carreiro Mourão
Remova ele da secao required do pacote !!!

Abs!!
[há +1 ano] - Responder
 

Equipe Devmedia

Grande Rodrigo!!

Otimo Curso - Parabéns - vamos em frente!!.
Uma duvida!! Aula 34..Carregamento dinamico do pacote.
Recursos Utilizados ; (D2007 e WinVista) ou (D2009 e WinXP). Dá o mesmo erro.
 
Ou testando seu sistema enviado na aula  ou executando meu proprio excutavel Comercial.exe no mesmo diretorio de vendas.bpl dá o ERRO -> 'Erro ao carregar classe'.
 
Alguma Dica??
Abraços.
Paulo.
----------
A Rotina de Carga do Pacote é :
 
procedure TFrmPrincipal.ac_Vendas_PDVExecute(Sender: TObject);
var
H:HMODULE;
PForm : TFormClass;
Form : TForm;
begin
if FileExists('Vendas.bpl') then
   begin
    H := LoadPackage('Vendas.bpl');
    if H > 0 then
    begin
      PForm := TFormClass(GetClass('TFrmVendas'));
      if Assigned(PForm) = true then
      begin
        Form := PForm.Create(nil);
        Form.ShowModal;
        FreeAndNil(Form);
        UnloadPackage(H);
      end
      else
        ShowMessage('Erro ao carregar classe');
    end
    else
      ShowMessage('Erro ao carregar pacote');
   end
  else
   begin
     MessageDlg('Recurso Nâo disponivel nesta versão',mtWarning,[mbOK],0);
   end;
 
[há +1 ano] - Responder

 

Alessandre Luis Niza
Estou com o mesmo problema, tentei no windows XP e no Windows vista e ocorreu o mesmo problema.
[há +1 ano] - Responder
 

[autor] Rodrigo Carreiro Mourão
Olá Amigo,

Este erro ocorre quando o metodo GetClass('TFrmVendas') nao retorna o ponteiro da classe. Isso pode ser duas coisas principais, mas nao somente elas:

1) Verificar se no Form  TfrmVendas tem o codigo no initialization  RegisterClass(TFrmVendas);  Atentem para o nome das suas classes pois o getclass passamos um string. Observe 
GetClass('TFrmVendas')  Se eu registrar TVendas nao posso dar um GetClass('TFrmVendas') tenho que fazer GetClass('TVendas').

2) Abra o projeto comercial va em project options e verifique se o projeto esta marcado para trabalhar com pacotes.

Qualquer coisa estamos as ordens !!

Abs !!
[há +1 ano] - Responder
 

Alessandre Luis Niza
Olá Rodrigo. Estou retornando para informar que consegui, com sua ajuda, superar o entrave. O problema era nas options do projeto que estava marcado para trabalhar estaticamente. Aproveito para agradecer sua atenção e presteza em solucionar o problema, inclusive respondendo meus emails. Como muitos já enalteceram, esse curso está me ensinando muita coisa e por isso lhe sou grato.
Abraço.

Alessandre.
[há +1 ano] - Responder
 

Interativa Sistemas De Informação
Olá, sei que o curso é um pouco antigo, mas comecei a assisti-lo a pouco tempo, e tenho um erro onde não consigo resolver.
Quando eu finalizo a venda no formulário de finalização de vendas, ocorre um erro bem na hora que eu tento acessar o frmVendas, geralmente antes de percorrer o CDS itens da venda no formulário das Vendas. Nesta linha:

frmVendas.cdsItensVenda.First;
while not frmVendas.cdsItensVenda.Eof do
...

Tanto em uma quanto na outra ocorre um erro de acesso de violação.

Então fui debugando, e quando cheguei nestas linhas, o frmVendas estava com o valor nil, dai percebi que o formulário de vendas é criado lá no frmPrincipal lembra ?
Então quando agente tenta acessar lá de dentro do pacote o frmVendas (Apesar de estarem no mesmo pacote) o frmVendas ta como nil porque foi criado la no principal.

Não sei como resolver isso, fiquei tentando criar uma rotina pra armazenar o objeto criado la no principal do formulario de vendas pra dai passar pro frmVendas e ai pegar do frmFinalizaVenda, mas nao to conseguindo, e nem sei se isso vai resolver, alguém pode me ajudar ?

Olhá o código do botão finalizar Venda no formulário frmFinalizaVenda:

var
DBConn: TDBXConnection;
DBCommand: TDBXCommand;
Reader: TDBXReader;
login: string;
vendedor: AnsiString;
usuario: integer;
begin
if (edtSenhaVendedor.Text = EmptyStr) or (edtLoginUsuario.Text = EmptyStr) then
begin
Application.MessageBox('Verifique os campos login e senha do usuário', 'Campo vazio', MB_OK + MB_ICONINFORMATION);
Exit;
end;

DBConn := TDBXConnectionFactory.GetConnectionFactory.GetConnection('FBCONNECTION1', 'SYSDBA', 'masterkey');
DBCommand := DBConn.CreateCommand;
DBCommand.Text := 'SELECT vendedor, login, usuarioid FROM usuarios WHERE senha = ' + QuotedStr(edtSenhaVendedor.Text) +
' AND login = ' + QuotedStr(edtLoginUsuario.Text);
Reader := DBCommand.ExecuteQuery;
if Reader.Next then
begin
login := Reader.Value[Reader.GetOrdinal('login')].GetAnsiString;
vendedor := Reader.Value[Reader.GetOrdinal('vendedor')].GetAnsiString;
usuario := Reader.Value[Reader.GetOrdinal('usuarioid')].GetInt32;

if not (vendedor = 'S') and (login = edtLoginUsuario.Text) then
begin
Application.MessageBox('O usuário foi encontrado, porém, não é um vendedor e não poderá realizar a venda',
'Venda não realizada', MB_OK + MB_ICONINFORMATION);
edtLoginUsuario.SelectAll;
edtLoginUsuario.SetFocus;
Exit;
end
else if cdsClienteItem.IsEmpty then
begin
Application.MessageBox('Selecione algum cliente para realizar a venda.' + #13 +
'Para selecionar algum cliente, basta entrar na caixa de texto acima ' + '''' + 'Digite o nome de um cliente' + '''' +
' e digitar o nome de um cliente.', 'Cliente não encontrado', MB_OK + MB_ICONINFORMATION);
edtCliente.SelectAll;
edtCliente.SetFocus;
Exit;
end
else if (vendedor = 'S') and (login = edtLoginUsuario.Text) and not (cdsClienteItem.IsEmpty) then
begin
with DMComercial do
begin
try
cdsVendas.Open;
cdsVendas.Append;
cdsVendasCLIENTEID.Value := cdsClienteItemCLIENTEID.Value;
cdsVendasUSUARIOID.Value := usuario;
cdsVendasDATA.Value := Date;

frmVendas := TfrmVendas.Create(nil);
frmVendas.cdsItens.First;
while not frmVendas.cdsItens.Eof do //Cds do frmVenda
begin
cdsVendaItem.Append; // cds do DataModule
cdsVendaItemPRODUTOID.Value := frmVendas.cdsItensCodigo.Value;
cdsVendaItemQTD.Value := frmVendas.cdsItensquantidade.AsBCD;
cdsVendaItemPRECO.Value := frmVendas.cdsItenspreco.AsBCD;
cdsVendaItem.Post;
end;
cdsVendas.ApplyUpdates(0);
Application.MessageBox('Venda realizada com sucesso', 'Sucesso', MB_OK + MB_ICONINFORMATION);
cdsVendas.Close;
frmVendas.cdsItens.EmptyDataSet;
frmVendas.cdsItens.Close;
ModalResult := mrOk;
except
On Ex : Exception do
MessageDlg('Ocorreu um erro durante a transação da venda ao banco' + #13#13 +
'Descrição do erro: ' + Ex.Message + #13#13 +
'Contate o fabricante do sistema para verificar o erro', mtError, [mbOk], 0);
end;
end;
end;
end
else
begin
Application.MessageBox('O login do usuário não foi encontrado, verifique o campo login do usuário.' + #13 +
'Verifique se o login do usuário tem a primeira maíuscula ou se foi digitado alguma coisa incorretamente.' + #13 +
'Por exemplo: João é diferente de joão.', 'Usuário não encontrado', MB_OK + MB_ICONINFORMATION);
edtLoginUsuario.SelectAll;
edtLoginUsuario.SetFocus;
end;
end;
[há +1 mês] - Responder

 

Luis Carlos Godinho
Olá!

Analizando o código que postou, vi que esta recriando o frmvendas neste ponto:

frmVendas := TfrmVendas.Create(nil);

Observe no desenrolar do vídeo, que não tem esta instrução. Acredito que este seja o problema. Teste aí pra ver.

Abs.!
[há +1 mês] - Responder
 

Interativa Sistemas De Informação
Olá, não tem mesmo, mas eu tinha ponhado de propósito pra ver se o frmVendas ganhava uma instancia, pois ele tava como nil, mas continua com nil :/
mas se eu remover essa linha, não adianta nada
[há +1 mês] - Responder
 

Luis Carlos Godinho
Olá!

Testei nos códigos aqui e não apresentou problema algum, e o erro que você relatou num comentário anterior (erro de violação) esta relacionado ao fato de estar criando um objeto já criado. O formvenda é quem chama o de fechamento sendo assim se criar o mesmo dentro do fechamento da o erro informado. Peque o código que esta disponibilizado junto com o vídeo e faça um teste sem nenhuma alteração pra ver.

Abs.!
[há +1 mês] - Responder
 

[autor] Rodrigo Carreiro Mourão
Senhores muito cuidado na questão das variáveis. É provavél que estejam instanciando uma variável e invocando o método de outra.

Grande Abraço!

Rodrigo Mourão
[há +1 mês] - Responder

 



Publicidade
Curso Online
Autor
Rodrigo Carreiro Mourão

Consultor de TI especializado em Orientação e Objetos, Design Patterns e Gestão de Projetos. Instrutor certificado pela Borland e Delphi Product Certified. É sócio da RM Factory Soluções em TI e da Szeryng Traduções e Informática. Atua como Supervisor de TI do Grupo Editorial Nacional e é instrutor ...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
4   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03