Problema na criação dos registros
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
Curtidas 0
Respostas
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
Espero ter colaborado.
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
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
//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
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;
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
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
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
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.
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
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
22/04/2010
Deu certo amigo?
GOSTEI 0
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