Problema na criação dos registros

Delphi

22/04/2010

Seguinte galera, estou com uma duvida boba, auhahuhuahua, eu fiz um curso de Delphi em que era usado o MsAccess e nos cadastros eram usado Edit, mas em uma video aula que achei mostrava o uso de DBEdit, e falando com amigos meus programadores, eles me disseram que era mais facil de usar DBEdit do que Edit, mas no curso nós faziamos uma verificação se o codigo do cliente por exemplo não existia já e se existisse ele dava a opção de fazer alteração no cadastro, isso tudo era feito via programação SQL, usando um comando RECORDCOUNT, tentei usar isso no IB, mas da erro, existe algo que funcione assim no IB, por exemplo, ao clicar em novo registro ele da um setfocus no DBEdit do codigo, ao sair no DBEdit do codigo, ele faz essa verificação, se já existe ou naum o registro com aquele codigo, se existir ele preenche todos os DBEdit do cadastro com o cadastro do cliente, se naum ele apaga todo o texto de todos DBEdits para que seja acrecentado um novo registro. Tem também o seguinte se o codigo for automatico, ele pode ser digitado???? Bem acho que por enquanto essas saum as duvidas, se por acaso surgir alguma nova acrecento aqui, valeu       André Batista
Andre Batista

Andre Batista

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

22/04/2010

Para cada Field do TClientDataSet existe a propriedade OnChange, você pode utilizar ela para a sua verificação.
E explique melhor sobre a pergunta
Tem também o seguinte se o codigo for automatico, ele pode ser digitado?


Espero ter colaborado.
GOSTEI 0
Andre Batista

Andre Batista

22/04/2010

Bem é o seguinte, primeiro coloquei o nome do post errado, num eh criar e sim editar, no meu curso que fiz, tinha a tela de cadastro de cliente, todos os campos eram bloqueados, somente o codigo do cliente era habilitado e nele era mostrado sempre o ultimo codigo de cliente do banco, intaum eu podia ou digitar um codigo anterior, já existente, ou um acima do ja mostrado, e quando eu dava um TAB por exemplo, para ele ir para o outro campo do cadastro, ele pegava o codigo digitado e verificava se já existia, se já existisse ele mostrava todos os dados do cliente referente ao codigo, se naum existisse ele limpava todos os campos e deixava que fosse inserido um novo cadastro, vou colocar o codigo para que vcs entendam um pouco mais, ta ae:     //tenta encontrar o codigo digitado
  //se clicou em pesquisar, cancelar ou fechar, entrão sai desta procedure
  if (btopesquisar.Focused) or (btocancelar.Focused) or (btofechar.Focused) then
  exit;   //tenta localizar o Registro
  with qrycadastro do
    begin
      close;
      sql.Clear;
      sql.Add('select * from cliente');
      sql.add('where cli_codigo = '+edtcodigo.text);
      open;
      lencontrado:= false;
      //se encontrou o registro, então mostra os dados
      if recordcount > 0 then
        begin
          lencontrado:= true;
          edtcnpj.text := fieldbyname('cli_cnpj').AsString;
          edtnome.Text := fieldbyname('cli_nome').AsString;
          edtrazao.Text := fieldbyname('cli_razao').AsString;
          edtendereco.Text := fieldbyname('cli_endereco').AsString;
          edtbairro.Text := fieldbyname('cli_bairro').AsString;
          edtcidade.Text := fieldbyname('cli_cidade').AsString;
          edtestado.Text := fieldbyname('cli_estado').AsString;
          edttelefone.Text := fieldbyname('cli_telefone').asstring;
          edtcontato.Text := fieldbyname('cli_contato').AsString;
          edtemail.Text := fieldbyname('cli_email').AsString;
         
        end;
    end;
    btopesquisar.Enabled := false;
    btoalterar.Enabled := lencontrado;
    btoexcluir.Enabled := lencontrado;
    btosalvar.Enabled := not lencontrado;
    btocancelar.enabled := true;
    btofechar.Enabled := false;     if lencontrado then
      begin
        btoalterar.SetFocus;
        desabilitacampos;
      end;
    if edtcnpj.Enabled then
      edtcnpj.SetFocus; Em negrito eh o comando que informa se o foi ou naum encontrado o registro, acho q isso vai ajudar a entender, valeu galera se puderem me ajudar   André Batista  
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/04/2010

troque recordcount > 0 por IsEmpty.


exemplo:
  //tenta encontrar o codigo digitado
  //se clicou em pesquisar, cancelar ou fechar, entrão sai desta procedure
  if (btopesquisar.Focused) or (btocancelar.Focused) or (btofechar.Focused) then
  exit;

  //tenta localizar o Registro
  with qrycadastro do
  begin
    close;
    sql.Clear;
    sql.Add('select * from cliente');
    sql.add('where cli_codigo = '+edtcodigo.text);
    open;
    lencontrado := not IsEmpty;
    //se encontrou o registro, então mostra os dados
    if lencontrado then
    begin
      lencontrado:= true;
      edtcnpj.text := fieldbyname('cli_cnpj').AsString;
      edtnome.Text := fieldbyname('cli_nome').AsString;
      edtrazao.Text := fieldbyname('cli_razao').AsString;
      edtendereco.Text := fieldbyname('cli_endereco').AsString;
      edtbairro.Text := fieldbyname('cli_bairro').AsString;
      edtcidade.Text := fieldbyname('cli_cidade').AsString;
      edtestado.Text := fieldbyname('cli_estado').AsString;
      edttelefone.Text := fieldbyname('cli_telefone').asstring;
      edtcontato.Text := fieldbyname('cli_contato').AsString;
      edtemail.Text := fieldbyname('cli_email').AsString;

      btoalterar.SetFocus;
      desabilitacampos;
    end;
  end;
  btopesquisar.Enabled := false;
  btoalterar.Enabled := lencontrado;
  btoexcluir.Enabled := lencontrado;
  btosalvar.Enabled := not lencontrado;
  btocancelar.enabled := true;
  btofechar.Enabled := false;

  if edtcnpj.Enabled then
    edtcnpj.SetFocus;
GOSTEI 0
Andre Batista

Andre Batista

22/04/2010

Bem tentei as duas formas que vc passou: trocando recordcount por isempty e tmb trocando a variavel lencontrado por not empty e depois colocando a variavel, mas nessa segunda opçao naum funcionou pq a variavel é boolean e da erro, na primeira opçao da erro no isempty: [Error] FormcadCliente.pas(112): Undeclared identifier: 'IsEmpty';     bem ainda estu sem conseguir, sera que alguem ja fez isso e pode ajudar     Mesmo Assim valeu     André Batista
GOSTEI 0
Andre Batista

Andre Batista

22/04/2010

Bem galera é o seguinte, me surgiu agora uma duvida cruel, assim, quando eu entro em cadastro de cliente ou produto, eu acho, que deveria aparecer o ultimo codigo +1 para que eu sabia o ultimo codigo, para poder adicionar um novo registro, mas assim, eu num sei o q fazer, assim, os DBEdit, na hora que abre o form, eles carregam o primeiro codigo, e como vou fazer para aparecer o ultimo registro, estou pensando em trocar os DBEdits por Edits, e assim fazer toda essa configuracao, mas sera que tem como fazer isso sem trocar os DBEdit, e tmb, tem a questaum de digitar um codigo ja existente e aparecer o cadastro em todos os DBEdits, mas acho que resolvendo 1 o outro fica +o- igual, intaum galera é isso, saum 2 coisas em uma, pq assim eu acho que fica mais facil fazer essa configuraçao via codigo do que no BD, mas assim, eu sou um mero novato, eu estou aqui para que vcs superpoderosos, me ensinem como fazer, e nem peço que me ensinem da forma mais facil, mas que me deem uma luz, valeu galera acho que é isso Valeu André Batista
GOSTEI 0
Adeilson Assis

Adeilson Assis

22/04/2010

Tenta o seguinte.

Quando clicar em novo registro, o DBEdit recebe o SetFocus (vide abaixo)

procedure SeuPrograma.btnNovoOnClick()
begin
 
  DBEditCOD_CLIENTE.SetFocus;

end;


Quando tirar o cursor do DBEdit, o programa verifica se o numero que consta já existe e exibe os dados, se não existe limpa os campos para uma nova inclusão. Essa verificação deve constar no evento OnExit do DBEdit. (vide abaixo)

procedure SeuPrograma.DBEditCOD_CLIENTEOnExit()
begin
 
  with SuaQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM PRODUTOS WHERE COD_PRODUTO = '+      IntToStr(DBEditCODCLIENTE.Value));
    Open;
  end;

  if SuaQuery.RecordCount = 0 then //se não achou o código que está no DBEdit   
    SuaQuery.Insert // coloca a query em modo de inclusão (ou a sua tabela)
  else
  SuaQuery.Edit; // caso exista, coloca a query em modo de edição
 
end; 

Espero ter ajudado.
GOSTEI 0
Andre Batista

Andre Batista

22/04/2010

Acredito que assim deve funcionar, mas me apareceu o seguinte erro, eu criei uma query (ibcadcliente) somente para verificar se o codigo existia, mas para a gravaçao no banco eu criei no form dados apenas um IBTable e um DataSource e ligo os DBedit nele, mas como fazer essa verificaçao sem IBQuery?????   Valeu     André Batista
GOSTEI 0
Carlos Mazzi

Carlos Mazzi

22/04/2010

Deu certo amigo?
GOSTEI 0
Andre Batista

Andre Batista

22/04/2010

Intaum, deu naum, como que vou fazer isso sem a query, pq eu criei a query somente para verificar se existe o registro com aquele codigo, fazendo do jeito q vc disse da um erro falando que a query eh somente leitura e naum aceita gravaçao, como eu disse antes, os DbEdits estaum ligados a dm_dados>dscliente>IBTableCliente,  e assim que ele faz a gravaçaum, eu naum uso a IBQuery para fazer a gravaçaum dos registros, e para mudar isso eu teria que mudar todo o codigo, certo???   Mas assim valeu mesmo, mas sera que tem como fazer isso sem mudar todo o codigo e sem a necessidade da IBQuery????       Valeu     André Batista
GOSTEI 0
POSTAR